Metadata-Version: 2.4
Name: make-xuml-repo
Version: 1.0.1
Summary: Generates a database from a set of *.xcm (executable class model) files
Author-email: Leon Starr <leon_starr@modelint.com>
License: MIT License
        
        Copyright (c) 2019-2023 Leon Starr
        
        Permission is hereby granted, free of charge, to any person obtaining a copy
        of this software and associated documentation files (the "Software"), to deal
        in the Software without restriction, including without limitation the rights
        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        copies of the Software, and to permit persons to whom the Software is
        furnished to do so, subject to the following conditions:
        
        The above copyright notice and this permission notice shall be included in all
        copies or substantial portions of the Software.
        
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        SOFTWARE.
        
Project-URL: repository, https://github.com/modelint/make-xuml-repo
Project-URL: documentation, https://github.com/modelint/make-xuml-repo/wiki
Keywords: action language,executable uml,mbse,xuml,xtuml,platform independent,sysml
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Requires-Python: <3.14,>=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: PyYAML
Requires-Dist: xcm-parser
Requires-Dist: mi-pyral
Provides-Extra: build
Requires-Dist: build; extra == "build"
Requires-Dist: twine; extra == "build"
Provides-Extra: dev
Requires-Dist: bump2version; extra == "dev"
Requires-Dist: pytest; extra == "dev"
Dynamic: license-file

# Make a Shlaer-Mellor Executable UML Model Repository

This is the first step in the model execution tool chain.

The `make-xuml-repo` command generates an empty metamodel database that can be populated with the modeled
components of your system.

We say 'metamodel' because the generated database schema defines the 
[Shlaer-Mellor Executable UML modeling language](https://github.com/modelint/shlaer-mellor-metamodel/wiki). It defines
all structures necessary to describe platform independent domains, class models, state models, as well as the complete 
computational activities driven by each state transition and method call.

#### Output

The output consists of these three files:

- `mmdb.ral` -- The database
- `mmdb.txt` -- Human readable text that displays all of the database tables (relvars / relational variables)
- `mmclass_nt.py` -- A set of python named tuples, one per metamodel class, used for model population. Each metamodel class corresponds to a similarly named relvar (table).

#### Input

The input to `make-xuml-repo` is a set of *.xcm (Executable Class Model) files. The files are parsed using
the [xcm-parser](https://github.com/modelint/xcm-parser). You can view these files [here](https://github.com/modelint/make-xuml-repo/tree/main/src/make_xuml_repo) in the metamodel folder. The sibling layout folder has a set of diagrams generated by [flatland](https://github.com/modelint/flatland) you can view.

This file set defines a subset of the full modeling language though the bulk of the language is, in fact, supported.
But work continues and, as the `.xcm` files upgrade, it will be necessary to refresh your metamodel database
by re-running make-xuml-repo.

Go to the [Shlaer-Mellor Metamodel Wiki](https://github.com/modelint/shlaer-mellor-metamodel/wiki) for the complete (and not yet fully implemented) model set and model documentation.  What is actually implemented, though, is maintained here in the `make-xuml-repo` repository.

#### Database

Rather than a traditional SQL database, we use Andrew Mangogna's open source TclRAL (Tcl Relational Algebra Library).

It is an implementation of relational algebra as defined by [C.J. Date and Hugh Darwen](https://github.com/modelint/shlaer-mellor-metamodel/wiki/Resources#ttm-databases-types-and-the-relational-model-the-third-manifesto-cj-date-hugh-darwen----links-to-the-actual-book-as-a-downloadable-pdf). So we can use nested relational algebra 
without any of that SQL mess. It is implemented in C and Tcl, but we provide a python front end 
called [PyRAL](https://github.com/modelint/PyRAL) to keep everything pythonic.


### Installation

Create or activate a Python 3.11–3.13 environment, then install from PyPI:

    % pip install make-xuml-repo

> **Note:** Python 3.14 is not yet supported. Its bundled Tcl/Tk 9.0 is incompatible with the
> TclRAL engine that PyRAL relies on, so use Python 3.13 or earlier.

It's a good idea to upgrade `pip` first if you haven't in a while:

    % pip install --upgrade pip

Once installed, you can invoke the repository generator with the `makexumlrepo` command.

### Usage

Run the command in the directory where you want the output files created:

    % makexumlrepo

This generates three files in the current directory:

- `mmdb.ral` — The database. Although it is a text file, it can be opened by TclRAL (via PyRAL) to
  establish an empty relvar (table) per metamodel class, ready to be populated with instances of your
  modeled domains.
- `mmdb.txt` — A human readable listing of every relvar in the database.
- `mmclass_nt.py` — A set of Python named tuples, one per metamodel class, with a field for each of that
  class's attributes. PyRAL uses these to insert one or more tuples into the corresponding relvar.

You can load these with the metamodel populator (coming soon) or your own tooling. In my own workflow I
generate the files and copy them into my metamodel populator package.

### Command line options

| Option | Long form | Description |
| ------ | --------- | ----------- |
| `-h` | `--help` | Show a summary of all options and exit. |
| `-V` | `--version` | Print the installed version and exit. |
| `-M` | `--models` | Copy the packaged `metamodel` and `layout` directories into the current directory, then exit. Existing directories are left untouched (a warning is issued). No database is built. |
| `-v` | `--verbose` | Show warnings on the console. By default warnings are suppressed on the console (but still recorded in the log file when `-L` is used). |
| `-L` | `--log` | Keep the diagnostic `make_xuml_repo.log` file. Without this flag the log is removed on exit. |
| `-D` | `--debug` | Run in debug mode. |

#### Inspecting or customizing the metamodel

If you want to look at the `.xcm` metamodel files or the layout sheets that ship with the package, copy
them into your working directory with:

    % makexumlrepo -M

This creates a `metamodel` directory (the `.xcm` files and `mm_types.yaml`) and a `layout` directory in
the current directory. No database is generated when `-M` is supplied.
