Ticket #14087: zip_egg_fixed.diff
File zip_egg_fixed.diff, 22.7 KB (added by , 13 years ago) |
---|
-
django/core/management/__init__.py
diff --git a/django/core/management/__init__.py b/django/core/management/__init__.py index bb03082..bb5d148 100644
a b import os 2 2 import sys 3 3 from optparse import OptionParser, NO_DEFAULT 4 4 import imp 5 import pkgutil 5 6 import warnings 6 7 7 8 from django.core.management.base import BaseCommand, CommandError, handle_default_options 8 from django.utils.importlib import import_module 9 from django.utils.importlib import import_module, find_importers, find_package_importers 9 10 10 11 # For backwards compatibility: get_version() used to be in this module. 11 12 from django import get_version … … from django import get_version 14 15 # doesn't have to reload every time it's called. 15 16 _commands = None 16 17 17 def find_commands( management_dir):18 def find_commands(commands_importers): 18 19 """ 19 20 Given a path to a management directory, returns a list of all the command 20 21 names that are available. 21 22 22 23 Returns an empty list if no commands are defined. 23 24 """ 24 command_dir = os.path.join(management_dir, 'commands') 25 try: 26 return [f[:-3] for f in os.listdir(command_dir) 27 if not f.startswith('_') and f.endswith('.py')] 28 except OSError: 29 return [] 25 for importer in commands_importers: 26 for name, ispkg in pkgutil.iter_importer_modules(importer): 27 if not name.startswith('_'): 28 yield name 29 30 30 31 def find_ management_module(app_name):31 def find_commands_importers(app_name): 32 32 """ 33 33 Determines the path to the management module for the given app_name, 34 34 without actually importing the application or the management module. … … def find_management_module(app_name): 36 36 Raises ImportError if the management module cannot be found for any reason. 37 37 """ 38 38 parts = app_name.split('.') 39 parts.append('management') 40 parts.reverse() 41 part = parts.pop() 42 path = None 43 44 # When using manage.py, the project module is added to the path, 45 # loaded, then removed from the path. This means that 46 # testproject.testapp.models can be loaded in future, even if 47 # testproject isn't in the path. When looking for the management 48 # module, we need look for the case where the project name is part 49 # of the app_name but the project directory itself isn't on the path. 50 try: 51 f, path, descr = imp.find_module(part,path) 52 except ImportError,e: 53 if os.path.basename(os.getcwd()) != part: 54 raise e 39 40 for i in range(len(parts), 0, -1): 41 try: 42 path = sys.modules['.'.join(parts[:i])].__path__ 43 except KeyError: 44 continue 45 46 parts = parts[i:] + ['management', 'commands'] 47 parts.reverse() 48 importers = find_importers(path) 49 break 50 else: 51 parts += ['management', 'commands'] 52 parts.reverse() 53 part = parts.pop() 54 importers = find_importers() 55 56 # When using manage.py, the project module is added to the path, 57 # loaded, then removed from the path. This means that 58 # testproject.testapp.models can be loaded in future, even if 59 # testproject isn't in the path. When looking for the management 60 # module, we need look for the case where the project name is part 61 # of the app_name but the project directory itself isn't on the path. 62 try: 63 importers = find_package_importers(part, importers) 64 except ImportError,e: 65 if os.path.basename(os.getcwd()) != part: 66 raise e 55 67 56 68 while parts: 57 69 part = parts.pop() 58 f, path, descr = imp.find_module(part, path and [path] or None)59 return path70 importers = find_package_importers(part, importers) 71 return importers 60 72 61 73 def load_command_class(app_name, name): 62 74 """ … … def get_commands(): 91 103 """ 92 104 global _commands 93 105 if _commands is None: 94 _commands = dict([(name, 'django.core') for name in find_commands(__path__[0])]) 106 _commands = dict( 107 [ (name, 'django.core') 108 for name in find_commands( 109 find_importers( 110 [ os.path.join(p, 'commands') for p in __path__ ]))]) 95 111 96 112 # Find the installed apps 97 113 try: … … def get_commands(): 103 119 # Find and load the management module for each installed app. 104 120 for app_name in apps: 105 121 try: 106 path = find_management_module(app_name)122 importers = find_commands_importers(app_name) 107 123 _commands.update(dict([(name, app_name) 108 for name in find_commands( path)]))124 for name in find_commands(importers)])) 109 125 except ImportError: 110 126 pass # No management module - ignore this app 111 127 -
django/utils/importlib.py
diff --git a/django/utils/importlib.py b/django/utils/importlib.py index ef4d0e4..db6e642 100644
a b 1 1 # Taken from Python 2.7 with permission from/by the original author. 2 2 import sys 3 import imp 4 import pkgutil 5 import os 6 7 try: 8 import zipimport 9 10 class ZipImporter(zipimport.zipimporter): 11 12 # taken from pkgutil.iter_zipimport_modules 13 def get_filename(self, fullname): 14 dirlist = zipimport._zip_directory_cache[self.archive].keys() 15 dirlist.sort() 16 _prefix = self.prefix 17 plen = len(_prefix) 18 import inspect 19 for filename in dirlist: 20 if not filename.startswith(_prefix): 21 continue 22 23 fn = filename[plen:].split(os.sep) 24 25 if len(fn)==2 and (fn[0] == fullname) and fn[1].startswith('__init__.py'): 26 return os.path.join(self.archive, filename) 27 28 if len(fn)!=1: 29 continue 30 31 modname = inspect.getmodulename(fn[0]) 32 if modname=='__init__': 33 continue 34 35 if modname and '.' not in modname and (modname==fullname): 36 return fullname 37 38 if hasattr(zipimport.zipimporter, 'get_filename'): 39 zipimport = None 40 41 except ImportError: 42 zipimport = None 43 3 44 4 45 def _resolve_name(name, package, level): 5 46 """Return the absolute name of the module to be imported.""" … … def import_module(name, package=None): 34 75 name = _resolve_name(name[level:], package, level) 35 76 __import__(name) 36 77 return sys.modules[name] 78 79 80 81 def find_importers(path=None): 82 importers = [] 83 84 if path is None: 85 path = sys.path 86 importers += sys.meta_path 87 88 for path_item in path: 89 importer = pkgutil.get_importer(path_item) 90 91 if zipimport and isinstance(importer, zipimport.zipimporter): 92 if importer.prefix: 93 archivepath = os.path.join(importer.archive, importer.prefix) 94 else: 95 archivepath = importer.archive 96 97 importer = ZipImporter(os.path.join(archivepath)) 98 99 importers.append(importer) 100 101 return importers 102 103 104 105 def find_package_importers(name, importers): 106 new_importers = [] 107 108 for importer in importers: 109 try: 110 loader = importer.find_module(name) 111 112 if loader is not None and loader.is_package(name): 113 filename = os.path.dirname(loader.get_filename(name)) 114 new_importers.append(importer.__class__(filename)) 115 except ImportError: 116 pass 117 118 return new_importers 119 120 -
new file tests/regressiontests/admin_scripts/lib1/nons_app/management/commands/nons_app_command1.py
diff --git a/tests/regressiontests/admin_scripts/lib1/nons_app/__init__.py b/tests/regressiontests/admin_scripts/lib1/nons_app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib1/nons_app/management/__init__.py b/tests/regressiontests/admin_scripts/lib1/nons_app/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib1/nons_app/management/commands/__init__.py b/tests/regressiontests/admin_scripts/lib1/nons_app/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib1/nons_app/management/commands/nons_app_command1.py b/tests/regressiontests/admin_scripts/lib1/nons_app/management/commands/nons_app_command1.py new file mode 100644 index 0000000..a393663
- + 1 from django.core.management.base import BaseCommand 2 3 class Command(BaseCommand): 4 help = 'Test managment commands in non-namespaced app' 5 requires_model_validation = False 6 args = '' 7 8 def handle(self, *labels, **options): 9 print 'EXECUTE:nons_app_command1' -
new file tests/regressiontests/admin_scripts/lib1/nsapps/__init__.py
diff --git a/tests/regressiontests/admin_scripts/lib1/nons_app/models.py b/tests/regressiontests/admin_scripts/lib1/nons_app/models.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib1/nsapps/__init__.py b/tests/regressiontests/admin_scripts/lib1/nsapps/__init__.py new file mode 100644 index 0000000..32f26d8
- + 1 # http://packages.python.org/distribute/setuptools.html#namespace-packages 2 try: 3 __import__('pkg_resources').declare_namespace(__name__) 4 except ImportError: 5 from pkgutil import extend_path 6 __path__ = extend_path(__path__, __name__) -
new file tests/regressiontests/admin_scripts/lib1/nsapps/contrib/__init__.py
diff --git a/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/__init__.py b/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/__init__.py new file mode 100644 index 0000000..32f26d8
- + 1 # http://packages.python.org/distribute/setuptools.html#namespace-packages 2 try: 3 __import__('pkg_resources').declare_namespace(__name__) 4 except ImportError: 5 from pkgutil import extend_path 6 __path__ = extend_path(__path__, __name__) -
new file tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/management/commands/app1_command1.py
diff --git a/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/__init__.py b/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/management/__init__.py b/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/management/commands/__init__.py b/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/management/commands/app1_command1.py b/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/management/commands/app1_command1.py new file mode 100644 index 0000000..2f479bb
- + 1 from django.core.management.base import BaseCommand 2 3 class Command(BaseCommand): 4 help = 'Test managment commands in namespaced apps' 5 requires_model_validation = False 6 args = '' 7 8 def handle(self, *labels, **options): 9 print 'EXECUTE:app1_command1' -
new file tests/regressiontests/admin_scripts/lib2/nsapps/__init__.py
diff --git a/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/models.py b/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/models.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib2/nsapps/__init__.py b/tests/regressiontests/admin_scripts/lib2/nsapps/__init__.py new file mode 100644 index 0000000..32f26d8
- + 1 # http://packages.python.org/distribute/setuptools.html#namespace-packages 2 try: 3 __import__('pkg_resources').declare_namespace(__name__) 4 except ImportError: 5 from pkgutil import extend_path 6 __path__ = extend_path(__path__, __name__) -
new file tests/regressiontests/admin_scripts/lib2/nsapps/contrib/__init__.py
diff --git a/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/__init__.py b/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/__init__.py new file mode 100644 index 0000000..32f26d8
- + 1 # http://packages.python.org/distribute/setuptools.html#namespace-packages 2 try: 3 __import__('pkg_resources').declare_namespace(__name__) 4 except ImportError: 5 from pkgutil import extend_path 6 __path__ = extend_path(__path__, __name__) -
new file tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/management/commands/app2_command1.py
diff --git a/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/__init__.py b/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/management/__init__.py b/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/management/commands/__init__.py b/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/management/commands/app2_command1.py b/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/management/commands/app2_command1.py new file mode 100644 index 0000000..b9e20a7
- + 1 from django.core.management.base import BaseCommand 2 3 class Command(BaseCommand): 4 help = 'Test managment commands in namespaced apps' 5 requires_model_validation = False 6 args = '' 7 8 def handle(self, *labels, **options): 9 print 'EXECUTE:app2_command1' -
new file tests/regressiontests/admin_scripts/lib3/_addsitedir.py
diff --git a/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/models.py b/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/models.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib3/_addsitedir.py b/tests/regressiontests/admin_scripts/lib3/_addsitedir.py new file mode 100644 index 0000000..9e264d2
- + 1 import os.path, site; site.addsitedir(os.path.dirname(__file__)) -
new file tests/regressiontests/admin_scripts/lib3/egg_module.pth
diff --git a/tests/regressiontests/admin_scripts/lib3/egg_module.pth b/tests/regressiontests/admin_scripts/lib3/egg_module.pth new file mode 100644 index 0000000..9367ab5
- + 1 test_egg.egg -
new file tests/regressiontests/admin_scripts/lib3/exapps-nspkg.pth
diff --git a/tests/regressiontests/admin_scripts/lib3/exapps-nspkg.pth b/tests/regressiontests/admin_scripts/lib3/exapps-nspkg.pth new file mode 100644 index 0000000..1f31155
- + 1 import sys,new,os; p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('exapps',)); ie = os.path.exists(os.path.join(p,'__init__.py')); m = not ie and sys.modules.setdefault('exapps',new.module('exapps')); mp = (m or []) and m.__dict__.setdefault('__path__',[]); (p not in mp) and mp.append(p) -
new file tests/regressiontests/admin_scripts/lib3/exapps/app3/management/commands/app3_command1.py
diff --git a/tests/regressiontests/admin_scripts/lib3/exapps/app3/__init__.py b/tests/regressiontests/admin_scripts/lib3/exapps/app3/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib3/exapps/app3/management/__init__.py b/tests/regressiontests/admin_scripts/lib3/exapps/app3/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib3/exapps/app3/management/commands/__init__.py b/tests/regressiontests/admin_scripts/lib3/exapps/app3/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib3/exapps/app3/management/commands/app3_command1.py b/tests/regressiontests/admin_scripts/lib3/exapps/app3/management/commands/app3_command1.py new file mode 100644 index 0000000..97f5d33
- + 1 from django.core.management.base import BaseCommand 2 3 class Command(BaseCommand): 4 help = 'Test managment commands in namespaced apps' 5 requires_model_validation = False 6 args = '' 7 8 def handle(self, *labels, **options): 9 print 'EXECUTE:app3_command1' -
new file tests/regressiontests/admin_scripts/lib3/exapps/app3/models.py
diff --git a/tests/regressiontests/admin_scripts/lib3/exapps/app3/models.py b/tests/regressiontests/admin_scripts/lib3/exapps/app3/models.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib3/test_egg.egg b/tests/regressiontests/admin_scripts/lib3/test_egg.egg new file mode 100644 index 0000000000000000000000000000000000000000..d9e57de006a3d602515293f8e980bf3a16fb42c0 GIT binary patch literal 2210 zcmWIWW@Zs#W&na+g#z{<8U{Fl3|Dt|T~9wZfBgWcG7g3{KxHDAuKle5O78$-K~!ZB z^|5C+avd@dV0&QeKT+IcWwzNt$AHBOuWGiW^E|0~S|nLhZ9Ow6Z`b?h&-X7l#KHBh zGf2q)-n(7*SQNg9C6^pYKAZ6`^S*BSyQv&cUcXhIbLgw+nTectc?6~3uC9yNw%@sF z%ItZU8-gRR@<p(DZr01@&6oUg*2%XH)tT;p3*R&VooCL-z#xL`%wYe}AZOQLy^@NO zseK1QE_HeT&--$}fT-Y_2pj#SlFkL2Ia9R1z3&YW$hEDwHMjD;fuxnn<YS_977M&R zu%dHMh3c<Wrx~B0zcgk0r=s4kFE_0Ic06}8$L(iDarse;`D34maV9DL^?37iT78$4 zu;IH0CoB42FDd2_n0t1<bS;nS%|HFW4h3s`69&1M3mpESfSt^C-3aJd1`w7-c5zB- zL26z~YF=_>d`@Owb}`85T&Q|ip0Nz)2I>J}F=V|Z`33Pgsb#4-AWf<1>G8SwDWy57 zXxfpjMv2p^%mUrw#59O{NK!eBmQ+AiA`Av67Koo#6`-amkh_o+#>Z#oWtPOp>lIYO zVvd0U-EcHLxrup+>8ZJ?c_m2p+{#0>M-kN?Bt1k~DUVZoa(*t*u#{pvc54yVjKvWg z3_F2gHQm(j`*xsy9$*5{C2S5TD4{L_2BB}CcONJzf46gee`Y}-UxUeP$C<(gLc3RV zY9Cwi_n@qWz2AwZxYCuY=4Gw2oV2^}(@yDPS8>aY?k=--b8BlHne^Ic|6BWKH)7Jy zXsq#?eWx}ep56KFx(QD9DgGB`hCMj6_@itPSErDB#zVor9U@z^*FXBlA!>Exjl$u{ zsuuH{{dm6}Ulb7>vsbSqJM5*w#jS~~)~!DGw}|g^*kb!TX4*Er&D*q1x2SHj|9<>` zaDBt~!)B*vi6f<AwA2F1vq-50m~2yXiot1xkx7IZcc}%`1_S~P2OL2(QW*x*hP@O6 zDP~|$XxP%I4y2K^LCUlMZ&dB*r3+X$So=9-?MP(}#01>A9brNPF#h2Vz?S#XjY7}- z2&48O8--F7pqqhS0wB!zjcf+2JV1m8W}XEV2oL~@1#Kpjcto}rTLA&l2#SXgRE;Rv z1{N8ZmV*im2mo2$focX)QGo0YYy}9!43Ina;536sCxHqS2mm?hH%{Y_iWiXoAV~$? zZJ+`M0zhuF09GEznFLWh!VSafNbCg;!rTVJ=Asrq$icY=OHM`@-Nb_GWJJDZWdo_= P1Hv0X>$d>aF)#oC`tnrE
-
tests/regressiontests/admin_scripts/tests.py
literal 0 HcmV?d00001 diff --git a/tests/regressiontests/admin_scripts/tests.py b/tests/regressiontests/admin_scripts/tests.py index 17a2ccb..1cd7708 100644
a b class AdminScriptTestCase(unittest.TestCase): 90 90 def run_test(self, script, args, settings_file=None, apps=None): 91 91 project_dir = os.path.dirname(test_dir) 92 92 base_dir = os.path.dirname(project_dir) 93 lib1_dir = os.path.join(os.path.dirname(__file__), 'lib1') 94 lib2_dir = os.path.join(os.path.dirname(__file__), 'lib2') 95 lib3_dir = os.path.join(os.path.dirname(__file__), 'lib3') 96 eggs_dir = os.path.join(os.path.dirname(__file__), 'eggs') 93 97 ext_backend_base_dirs = self._ext_backend_paths() 94 98 95 99 # Remember the old environment … … class AdminScriptTestCase(unittest.TestCase): 107 111 os.environ['DJANGO_SETTINGS_MODULE'] = settings_file 108 112 elif 'DJANGO_SETTINGS_MODULE' in os.environ: 109 113 del os.environ['DJANGO_SETTINGS_MODULE'] 110 python_path = [ project_dir, base_dir]114 python_path = [test_dir, base_dir, lib1_dir, lib2_dir, lib3_dir] 111 115 python_path.extend(ext_backend_base_dirs) 112 116 os.environ[python_path_var_name] = os.pathsep.join(python_path) 113 117 … … class StartProject(LiveServerTestCase, AdminScriptTestCase): 1489 1493 self.assertNoOutput(err) 1490 1494 self.assertTrue(os.path.isdir(testproject_dir)) 1491 1495 self.assertTrue(os.path.exists(os.path.join(testproject_dir, 'run.py'))) 1496 1497 class NamespacePackagedApps(AdminScriptTestCase): 1498 def setUp(self): 1499 self.write_settings('settings.py', apps=['nons_app', 'nsapps.contrib.app1','nsapps.contrib.app2','exapps.app3', 'egg_module']) 1500 test_dir = os.path.dirname(os.path.dirname(__file__)) 1501 settings_file = open(os.path.join(test_dir, 'settings.py'), 'a') 1502 settings_file.write('import _addsitedir') 1503 settings_file.close() 1504 1505 def tearDown(self): 1506 self.remove_settings('settings.py') 1507 1508 def test_help(self): 1509 out, err = self.run_manage(['help']) 1510 self.assertNoOutput(err) 1511 self.assertOutput(out, "nons_app_command1") 1512 self.assertOutput(out, "app1_command1") 1513 self.assertOutput(out, "app2_command1") 1514 self.assertOutput(out, "app3_command1") 1515 self.assertOutput(out, "egg_command") 1516 1517 def test_nons_app(self): 1518 args = ['nons_app_command1'] 1519 out, err = self.run_manage(args) 1520 self.assertNoOutput(err) 1521 self.assertOutput(out, "EXECUTE:nons_app_command1") 1522 1523 def test_nsapps(self): 1524 args = ['app1_command1'] 1525 out, err = self.run_manage(args) 1526 self.assertNoOutput(err) 1527 self.assertOutput(out, "EXECUTE:app1_command1") 1528 1529 args = ['app2_command1'] 1530 out, err = self.run_manage(args) 1531 self.assertNoOutput(err) 1532 self.assertOutput(out, "EXECUTE:app2_command1") 1533 1534 def test_exapps(self): 1535 args = ['app3_command1'] 1536 out, err = self.run_manage(args) 1537 self.assertNoOutput(err) 1538 self.assertOutput(out, "EXECUTE:app3_command1") 1539 1540 def test_exapps(self): 1541 args = ['egg_command'] 1542 out, err = self.run_manage(args) 1543 self.assertNoOutput(err) 1544 self.assertOutput(out, "EXECUTE:egg_command") 1545 1546 1547 class PreloadedNamespacePackagedApps(AdminScriptTestCase): 1548 def setUp(self): 1549 self.write_settings('settings.py', apps=['nsapps.contrib.app1','nsapps.contrib.app2']) 1550 test_dir = os.path.dirname(os.path.dirname(__file__)) 1551 settings_file = open(os.path.join(test_dir, 'settings.py'), 'a') 1552 settings_file.write('import nsapps') 1553 settings_file.close() 1554 1555 def tearDown(self): 1556 self.remove_settings('settings.py') 1557 1558 def test_help(self): 1559 out, err = self.run_manage(['help']) 1560 self.assertNoOutput(err) 1561 self.assertOutput(out, "app1_command1") 1562 self.assertOutput(out, "app2_command1") 1563 1564 1565 def test_nsapps(self): 1566 args = ['app1_command1'] 1567 out, err = self.run_manage(args) 1568 self.assertNoOutput(err) 1569 self.assertOutput(out, "EXECUTE:app1_command1") 1570 1571 args = ['app2_command1'] 1572 out, err = self.run_manage(args) 1573 self.assertNoOutput(err) 1574 self.assertOutput(out, "EXECUTE:app2_command1") 1575 1576 1577 1578