diff --git a/bridgepoint/ooaofooa.py b/bridgepoint/ooaofooa.py index a39b4ec..5e3a51c 100644 --- a/bridgepoint/ooaofooa.py +++ b/bridgepoint/ooaofooa.py @@ -20,8 +20,10 @@ import functools import os import logging +import zipfile import keyword import xtuml +import io from xtuml import navigate_one as one from xtuml import navigate_many as many @@ -509,12 +511,21 @@ def filename_input(self, path_or_filename): If the filename is a directory, files that ends with .xtuml located somewhere in the directory or sub directories will be loaded as well. + + If the filename is a zip archive, files that ends with .xtuml located + somewhere in the archive will be loaded as well. ''' if os.path.isdir(path_or_filename): for path, _, files in os.walk(path_or_filename): for name in files: if name.endswith('.xtuml'): xtuml.ModelLoader.filename_input(self, os.path.join(path, name)) + elif zipfile.is_zipfile(path_or_filename): + with zipfile.ZipFile(path_or_filename) as zipinput: + for zipinfo in zipinput.filelist: + if zipinfo.filename.endswith('.xtuml'): + with zipinput.open(zipinfo) as f: + xtuml.ModelLoader.file_input(self, io.TextIOWrapper(f, encoding='UTF-8')) else: xtuml.ModelLoader.filename_input(self, path_or_filename) diff --git a/tests/test_bridgepoint/test_ooaofooa.py b/tests/test_bridgepoint/test_ooaofooa.py index 5afed37..cc5f84c 100644 --- a/tests/test_bridgepoint/test_ooaofooa.py +++ b/tests/test_bridgepoint/test_ooaofooa.py @@ -15,6 +15,9 @@ # # You should have received a copy of the GNU Lesser General Public # License along with pyxtuml. If not, see . +import atexit +import os +import shutil import unittest import xtuml from bridgepoint import ooaofooa @@ -35,7 +38,20 @@ def test_remove_globals(self): s = xtuml.serialize_instances(m) self.assertFalse(s) - + def test_folder_input(self): + dirname = os.path.dirname(__file__) + os.sep + '..' + os.sep + 'resources' + metamodel = ooaofooa.load_metamodel(dirname, load_globals=False) + self.assertTrue(metamodel.select_any('S_DT', xtuml.where_eq(Name='integer')) is not None) + + def test_zipfile_input(self): + dirname = os.path.dirname(__file__) + os.sep + '..' + os.sep + 'resources' + zipfile = shutil.make_archive(dirname, 'zip', dirname) + atexit.register(os.remove, zipfile) + + metamodel = ooaofooa.load_metamodel(zipfile, load_globals=False) + self.assertTrue(metamodel.select_any('S_DT', xtuml.where_eq(Name='integer')) is not None) + + if __name__ == "__main__": import logging diff --git a/xtuml/meta.py b/xtuml/meta.py index d7ecf86..8527ea8 100644 --- a/xtuml/meta.py +++ b/xtuml/meta.py @@ -491,7 +491,7 @@ def __init__(self, kind, metamodel=None): self.indices = dict() self.links = dict() self.storage = list() - self.clazz = type(kind, (Class,), dict(__metaclass__=self)) + self.clazz = type(str(kind), (Class,), dict(__metaclass__=self)) def __call__(self, *args, **kwargs): '''