From f7a6c58d920cc4310132d4e0cb06838202de407b Mon Sep 17 00:00:00 2001 From: Yuriy Taraday Date: Sun, 11 Mar 2012 19:04:26 +0400 Subject: [PATCH] HACKING fixes, sqlalchemy fix. Add exceptions to hacking.py make sqlalchemy stuff legal and prevent clutter. Change-Id: I44b100b4c0c4dfcec81beea7aba2d8598d5a08d0 --- HACKING.rst | 10 ++++++++-- tools/hacking.py | 17 +++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/HACKING.rst b/HACKING.rst index e1fc99fd98b2..467248e0e970 100644 --- a/HACKING.rst +++ b/HACKING.rst @@ -28,12 +28,18 @@ General Imports ------- -- Do not import objects, only modules -- Do not import more than one module per line +- Do not import objects, only modules (*) +- Do not import more than one module per line (*) - Do not make relative imports - Order your imports by the full module path - Organize your imports according to the following template +(*) exceptions are: + +- imports from ``migrate`` package +- imports from ``sqlalchemy`` package +- imports from ``nova.db.sqlalchemy.session`` module + Example:: # vim: tabstop=4 shiftwidth=4 softtabstop=4 diff --git a/tools/hacking.py b/tools/hacking.py index 7aa756bb5b3c..c3c1d7156dfe 100755 --- a/tools/hacking.py +++ b/tools/hacking.py @@ -36,6 +36,13 @@ import pep8 #N5xx dictionaries/lists #N6xx Calling methods +IMPORT_EXCEPTIONS = ['sqlalchemy', 'migrate', 'nova.db.sqlalchemy.session'] + + +def is_import_exception(mod): + return mod in IMPORT_EXCEPTIONS or \ + any(mod.startswith(m + '.') for m in IMPORT_EXCEPTIONS) + def nova_todo_format(physical_line): """ @@ -77,13 +84,13 @@ def nova_one_import_per_line(logical_line): Examples: BAD: from nova.rpc.common import RemoteError, LOG - BAD: from sqlalchemy import MetaData, Table N301 """ pos = logical_line.find(',') - if (pos > -1 and (logical_line.startswith("import ") or - (logical_line.startswith("from ") and - logical_line.split()[2] == "import"))): + parts = logical_line.split() + if pos > -1 and (parts[0] == "import" or + parts[0] == "from" and parts[2] == "import") and \ + not is_import_exception(parts[1]): return pos, "NOVA N301: one import per line" @@ -104,6 +111,8 @@ def nova_import_module_only(logical_line): try: valid = True if parent: + if is_import_exception(parent): + return parent_mod = __import__(parent, globals(), locals(), [mod], -1) valid = inspect.ismodule(getattr(parent_mod, mod)) else: