Browse files

Raise if we see incorrect keyword args "condition" or "methods"

Fixes bug 927879

We crawl the AST of the set of modules that make routing calls, looking
for keyword arguments called "condition" (should be "conditions") or
"methods" (should be "method"), and raise if we see any.

Change-Id: I32aa140967b80d83a10db898df28e41189675d77
  • Loading branch information...
1 parent 3ec3c7a commit fa98220aac1876468f595f4842edf4f682a6db1a David Ripton committed Oct 10, 2012
Showing with 52 additions and 0 deletions.
  1. +52 −0 tests/
@@ -0,0 +1,52 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+# Copyright 2012 Red Hat, Inc.
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+import ast
+from keystone.contrib.admin_crud import core as admin_crud_core
+from keystone.contrib.ec2 import core as ec2_core
+from keystone.contrib.s3 import core as s3_core
+from keystone.contrib.stats import core as stats_core
+from keystone.contrib.user_crud import core as user_crud_core
+from keystone.identity import core as identity_core
+from keystone import service
+class TestSingularPlural(object):
+ def test_keyword_arg_condition_or_methods(self):
+ """Raise if we see a keyword arg called 'condition' or 'methods'"""
+ modules = [admin_crud_core, ec2_core, s3_core, stats_core,
+ user_crud_core, identity_core, service]
+ for module in modules:
+ filename = module.__file__
+ if filename.endswith(".pyc"):
+ # In Python 2, the .py and .pyc files are in the same dir.
+ filename = filename[:-1]
+ with open(filename) as fil:
+ source =
+ module = ast.parse(source, filename)
+ last_stmt_or_expr = None
+ for node in ast.walk(module):
+ if isinstance(node, ast.stmt) or isinstance(node, ast.expr):
+ # keyword nodes don't have line numbers, so we need to
+ # get that information from the parent stmt or expr.
+ last_stmt_or_expr = node
+ elif isinstance(node, ast.keyword):
+ for bad_word in ["condition", "methods"]:
+ if node.arg == bad_word:
+ raise AssertionError(
+ "Suspicious name '%s' at %s line %s" %
+ (bad_word, filename, last_stmt_or_expr.lineno))

0 comments on commit fa98220

Please sign in to comment.