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
This commit is contained in:
David Ripton 2012-10-10 13:06:10 -04:00
parent 3ec3c7aed1
commit fa98220aac
1 changed files with 52 additions and 0 deletions

View File

@ -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
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 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 = fil.read()
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))