Skip to content

Commit c078c84

Browse files
committed
added command line interface "pyecoregen"
1 parent c2ead6d commit c078c84

File tree

4 files changed

+69
-1
lines changed

4 files changed

+69
-1
lines changed

.coveragerc

+1
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ source = pyecoregen
55
[report]
66
exclude_lines =
77
raise NotImplementedError
8+
\# nocover

pyecoregen/cli.py

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
"""Command line interface for generation of static Python classes from Ecore model."""
2+
import argparse
3+
4+
import sys
5+
6+
import pyecore.resources
7+
from pyecoregen.ecore import EcoreGenerator
8+
9+
10+
def main():
11+
generate_from_cli(sys.argv[1:]) # nocover
12+
13+
14+
def generate_from_cli(args):
15+
"""CLI entry point."""
16+
parser = argparse.ArgumentParser(description="Generate Python classes from an Ecore model.")
17+
parser.add_argument(
18+
'--ecore-model',
19+
'-e',
20+
help="Path to Ecore XMI file.",
21+
required=True
22+
)
23+
parser.add_argument(
24+
'--out-folder',
25+
'-o',
26+
help="Path to directory, where output files are generated.",
27+
required=True
28+
)
29+
30+
parsed_args = parser.parse_args(args)
31+
model = load_model(parsed_args.ecore_model)
32+
EcoreGenerator().generate(model, parsed_args.out_folder)
33+
34+
35+
def load_model(ecore_model_path):
36+
"""Load a single Ecore model and return the root package."""
37+
rset = pyecore.resources.ResourceSet()
38+
resource = rset.get_resource(pyecore.resources.URI(ecore_model_path))
39+
model = resource.contents[0]
40+
rset.metamodel_registry[model.nsURI] = model
41+
return model
42+
43+
44+
if __name__ == '__main__': # nocover
45+
main()

setup.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def run_tests(self):
2929

3030
setup(
3131
name="pyecoregen",
32-
version='0.0.2',
32+
version='0.1.0',
3333
description="Model to text framework for PyEcore, including the Ecore to Python generator",
3434
long_description=open('README.rst').read(),
3535
keywords="model metamodel EMF Ecore code generator",
@@ -43,6 +43,7 @@ def run_tests(self):
4343
install_requires=['pyecore', 'pymultigen', 'jinja2', 'autopep8'],
4444
tests_require=['pytest'],
4545
cmdclass={'test': PyTest},
46+
entry_points={'console_scripts': ['pyecoregen = pyecoregen.cli:main']},
4647

4748
license='BSD 3-Clause',
4849
classifiers=[

tests/test_cli.py

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from unittest import mock
2+
3+
import pyecore.ecore
4+
from pyecoregen.cli import generate_from_cli
5+
6+
7+
@mock.patch('pyecoregen.cli.EcoreGenerator')
8+
def test__generate_from_cli(generator_mock, cwd_module_dir):
9+
mock_generator = generator_mock()
10+
mock_generator.generate = mock.MagicMock()
11+
12+
generate_from_cli(['-e', 'input/library.ecore', '-o', 'some/folder'])
13+
14+
# look at arguments of generate call:
15+
mock_generate = generator_mock().generate
16+
model = mock_generator.generate.call_args[0][0]
17+
path = mock_generator.generate.call_args[0][1]
18+
19+
assert isinstance(model, pyecore.ecore.EPackage)
20+
assert model.name == 'library'
21+
assert path == 'some/folder'

0 commit comments

Comments
 (0)