SEBA-282 xosgenx filtering by app or model;
provide a default argument class for XOSProcessor;
remove tabs;
rename unit tests missed by nose2

Change-Id: I07b782982b6733f8828b8a5a72807326f430b1a5
diff --git a/lib/xos-genx/xosgenx/generator.py b/lib/xos-genx/xosgenx/generator.py
index dc1ff9e..3355fb5 100644
--- a/lib/xos-genx/xosgenx/generator.py
+++ b/lib/xos-genx/xosgenx/generator.py
@@ -26,6 +26,43 @@
 loader = jinja2.PackageLoader(__name__, 'templates')
 env = jinja2.Environment(loader=loader)
 
+class XOSProcessorArgs:
+    """ Helper class for use cases that want to call XOSProcessor directly, rather than executing xosgenx from the
+        command line.
+    """
+
+    default_rev = False
+    default_output = None
+    default_attic = None
+    default_kvpairs = None
+    default_write_to_file = None
+    default_dest_file = None
+    default_dest_extension = None
+    default_target = None
+    default_checkers = None
+    default_verbosity = 0         # Higher numbers = more verbosity, lower numbers = less verbosity
+    default_include_models = []   # If neither include_models nor include_apps is specified, then all models will
+    default_include_apps = []     # be included.
+
+    def __init__(self, **kwargs):
+        # set defaults
+        self.rev = XOSProcessorArgs.default_rev
+        self.output = XOSProcessorArgs.default_output
+        self.attic = XOSProcessorArgs.default_attic
+        self.kvpairs = XOSProcessorArgs.default_kvpairs
+        self.verbosity = XOSProcessorArgs.default_verbosity
+        self.write_to_file = XOSProcessorArgs.default_write_to_file
+        self.default_dest_file = XOSProcessorArgs.default_dest_file
+        self.default_dest_extension = XOSProcessorArgs.default_dest_extension
+        self.default_target = XOSProcessorArgs.default_target
+        self.default_checkers = XOSProcessorArgs.default_target
+        self.include_models = XOSProcessorArgs.default_include_models
+        self.include_apps = XOSProcessorArgs.default_include_apps
+
+        # override defaults with kwargs
+        for (k,v) in kwargs.items():
+            setattr(self, k, v)
+
 class XOSProcessor:
 
     @staticmethod
@@ -225,7 +262,7 @@
             if start == 0:
                 beginning = ''
             else:
-                beginning = inputs[ptr:start-1] 
+                beginning = inputs[ptr:start-1]
 
             line_end_char = inputs[start+end:].find('\n')
             line_end = inputs[line_end_char]
@@ -242,6 +279,19 @@
 
         v = XOSProcessor._attach_parser(ast, args)
 
+        if args.include_models or args.include_apps:
+            for message in v.messages:
+                message["is_included"] = False
+                if message["name"] in args.include_models:
+                    message["is_included"] = True
+                else:
+                    app_label = message.get("options", {}).get("app_label").strip('"')
+                    if app_label in args.include_apps:
+                        message["is_included"] = True
+        else:
+            for message in v.messages:
+                message["is_included"] = True
+
         if args.output is not None and args.write_to_file == "model":
             rendered = {}
             for i, model in enumerate(v.models):
@@ -255,7 +305,7 @@
                             'message_table': models,
                             'messages': messages,
                             'policies': v.policies,
-                            'message_names': [m['name'] for m in messages]
+                            'message_names': [m['name'] for m in v.messages]
                         },
                         "context": context,
                         "options": v.options