From f68f59beea684f00f310b049d38db847bc129b8b Mon Sep 17 00:00:00 2001 From: Levi Starrett Date: Tue, 30 Jul 2019 23:35:14 -0400 Subject: [PATCH 1/4] support loading ooaofooa from zip archives --- bridgepoint/ooaofooa.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/bridgepoint/ooaofooa.py b/bridgepoint/ooaofooa.py index a39b4ec..4a73168 100644 --- a/bridgepoint/ooaofooa.py +++ b/bridgepoint/ooaofooa.py @@ -20,6 +20,7 @@ import functools import os import logging +import zipfile import keyword import xtuml @@ -509,12 +510,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, f) else: xtuml.ModelLoader.filename_input(self, path_or_filename) From 58923a39ea1a492747246b2f96bc9184cd46ee2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20T=C3=B6rnblom?= Date: Thu, 1 Aug 2019 12:01:03 +0200 Subject: [PATCH 2/4] add test cases for loading a model from a folder --- tests/test_bridgepoint/test_ooaofooa.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/test_bridgepoint/test_ooaofooa.py b/tests/test_bridgepoint/test_ooaofooa.py index 5afed37..ad0694e 100644 --- a/tests/test_bridgepoint/test_ooaofooa.py +++ b/tests/test_bridgepoint/test_ooaofooa.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU Lesser General Public # License along with pyxtuml. If not, see . +import os import unittest import xtuml from bridgepoint import ooaofooa @@ -35,7 +36,11 @@ 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) + self.assertTrue(metamodel.select_any('S_DT', xtuml.where_eq(Name='integer')) is not None) if __name__ == "__main__": import logging From eb85becd28aad5e0b0ce6b5ea5f9c4c5c1a002e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20T=C3=B6rnblom?= Date: Thu, 1 Aug 2019 12:01:40 +0200 Subject: [PATCH 3/4] add test case for loading a model from a zipfile --- tests/test_bridgepoint/test_ooaofooa.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/test_bridgepoint/test_ooaofooa.py b/tests/test_bridgepoint/test_ooaofooa.py index ad0694e..cc5f84c 100644 --- a/tests/test_bridgepoint/test_ooaofooa.py +++ b/tests/test_bridgepoint/test_ooaofooa.py @@ -15,7 +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 @@ -40,7 +42,16 @@ 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 From da0431f3f4be1d599c7168d2e23085612be4128a Mon Sep 17 00:00:00 2001 From: Levi Starrett Date: Thu, 1 Aug 2019 08:25:47 -0400 Subject: [PATCH 4/4] resolve compatibility differences between python2 and python3 --- bridgepoint/ooaofooa.py | 3 ++- xtuml/meta.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/bridgepoint/ooaofooa.py b/bridgepoint/ooaofooa.py index 4a73168..5e3a51c 100644 --- a/bridgepoint/ooaofooa.py +++ b/bridgepoint/ooaofooa.py @@ -23,6 +23,7 @@ import zipfile import keyword import xtuml +import io from xtuml import navigate_one as one from xtuml import navigate_many as many @@ -524,7 +525,7 @@ def filename_input(self, path_or_filename): for zipinfo in zipinput.filelist: if zipinfo.filename.endswith('.xtuml'): with zipinput.open(zipinfo) as f: - xtuml.ModelLoader.file_input(self, f) + xtuml.ModelLoader.file_input(self, io.TextIOWrapper(f, encoding='UTF-8')) else: xtuml.ModelLoader.filename_input(self, path_or_filename) 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): '''