Home of the Geeppetto Python API. The API allows to create a Geppetto Model from Python.
Until pygeppetto is still in development, it is highly recommended to use a virtualenv in order to deploy it. Once you have a dedicated virtualenv, you can simply install pygeppetto:
$ python setup.py install
Pygeppetto API Basic Usage
First, import the pygeppetto API:
This will load the pygeppetto API and name it
pygeppetto. Then, you can create
instances and handle them:
# We create a new lib flib = pygeppetto.GeppettoLibrary(name='mylib') # We create a GeppettoModel instance and we set a name a assign a lib root = pygeppetto.GeppettoModel(name='MyGeppettoModel', libraries=[flib])
The pygeppetto API also allows you to set all attributes in a "classical" fashion:
root = pygeppetto.GeppettoModel() # We create a GeppettoModel instance root.name = 'MyGeppettoModel' # We set a name flib = pygeppetto.GeppettoLibrary() # We create a new lib flib.name = 'mylib' root.libraries.append(flib) # We add the new lib to the created root
If you wan to open an existing XMI, you need to use a
required, but prefered).
# We import the class that will be used to read the XMI from PyEcore from pyecore.resources import ResourceSet, URI # We create a new resource set (not required, but better) rset = ResourceSet()
ResourceSet, we are able to read the Geppetto XMI:
model_url = URI('tests/xmi-data/MediumNet.net.nml.xmi') # The model URI resource = rset.get_resource(model_url) # We load the model geppettomodel = resource.contents # We get the root
At the end of this script,
geppettomodel contains the model root.
In order to serialize a new version of the modified model, there is two options. The first one is to serialize onto the existing resource (i.e: in the same file), or to serialize in a new one:
# Using the first option resource.save() # Using the second option resource.save(output=URI('my_new_file.xmi'))
- Python >= 3.5
geppettoModel.ecore evolves, the static metamodel must be regenerated.
The process of adding a new version is the following:
- Copy the of the new
ecore/(in order to keep a version from which the static metamodel is generated).
- Generate the new version of the static metamodel.
- Manually merge modifications between the current and the new version (if there is manual modifications in the current version).
- Run the tests
How to Generate a New Version
The pygeppetto API is generated from the
using the PyEcore Acceleo generator
.ecore is a copy of the
Generate the code with pyecoregen (suggested)
pip install pyecoregen
Run the following script:
from pyecore.resources import ResourceSet from pyecoregen.ecore import EcoreGenerator import pyecore.type # We register the XML types (generated by pyecoregen) # We open the metamodel rset = ResourceSet() mm_root = rset.get_resource('pygeppetto/ecore/geppettoModel.ecore').contents # We generate the code using the EcoreGenerator EcoreGenerator(auto_register_package=True).generate(mm_root, outfolder='pygeppetto')
Then do the following fix replacements:
Generate the code with Eclipse
ecore2pyecore.mtl script can be directly used in Eclipse as a
- Install the Acceleo plugin into eclipse
- Create a new Acceleo project
- Add the file
ecore2pyecore.mtlto the project main package
ecore2pyecore.mtlas an acceleo project. The run configuration will popup: specify the
geppettoModel.ecorefile to use and the generation path. Generate the code in a path different from pygeppetto and merge the code
Patches and Overrides
The model generated from the ecore file contains some code stubs that are implemented manually on Python.
The place to make those implementations is not the files themselves though but the
Writing the overrides there keeps the regeneration process easier as the written code does not actually
need to be merged.
Manual modifications may have been introduced in the version of the static Geppetto metamodel (e.g: implementation of some methods or technical method additions). The generated version must be manually merged with the new generated one (e.g: using meld or other tool).
An easy way to do that is by using git.
1 - Generate the code in a in a directory reproducing the pygeppetto structure, say
2 - Initialize a new git local repo inside our new pygeppetto
cd pygeppetto_new git init
3 - Add the remote for pygeppetto
git remote add origin https://github.com/openworm/pygeppetto.git
4 - Merge with actual geppetto branch
git merge --allow-unrelated-histories origin/development
5 - Resolve conflicts: use incoming changes for clear overrides and implemented methods
Run the Tests
Tests are written using
pytest and are run using
tox. To launch all the
tests the following command is enough:
Or, if you want to avoid using
tox, you can just:
$ python -m pytest tests/