Expressir: EXPRESS in Ruby
Purpose
Expressir (“EXPRESS in Ruby”) is a Ruby parser for EXPRESS and a set of Ruby tools for accessing ISO EXPRESS data models.
Architecture
Expressir consists of 3 parts:
-
Parsers. A parser allows Expressir to read EXPRESS files, including:
-
EXPRESS data modelling language (ISO 10303-11:2007)
-
EXPRESS data modelling language in XML (STEPmod)
-
EXPRESS XML (ISO 10303-28:2007) “Industrial automation systems and integration — Product data representation and exchange — Part 28: Implementation methods: XML representations of EXPRESS schemas and data, using XML schemas”
-
-
Data model. The data model (
lib/expressir/express
) is the Ruby data model that fully represents an EXPRESS data model. -
Converters. A converter transforms the EXPRESS Ruby data model into an interoperable export format, including:
-
EXPRESS data modelling language (ISO 10303-11:2007)
-
Usage
This gem ships with a CLI tool. To check what’s available you can simply run
expressir
, by default it will display some usage instructions.
$ expressir
Commands:
expressir format PATH # pretty print EXPRESS schema located at PATH
expressir help [COMMAND] # Describe available commands or one specific command
expressir version # The Expressir Version
Pretty print
expressir format schemas/resources/action_schema/action_schema.exp
Development
We are following Sandi Metz’s Rules for this gem, you can read the description of the rules here All new code should follow these rules. If you make changes in a pre-existing file that violates these rules you should fix the violations as part of your contribution.
Setup
Clone the repository.
git clone https://github.com/metanorma/expressir
Setup your environment.
bin/setup
git submodule update --init
bundle exec rake generate
bundle exec rake compile
Run the test suite
bundle exec rake
Installation
Add this line to your application’s Gemfile
:
gem "expressir"
And then execute:
$ bundle install
Or install it yourself as:
$ gem install expressir
Usage
Filtering out schemas
Use the select_proc
argument of to_hash
.
Example:
schema_yaml = YAML.load_file('documents/iso-10303-41/schemas.yaml')
schema_paths = schema_yaml['schemas'].map {|x,y| y['path'].gsub("../../", "")}
repo = Expressir::Express::Parser.from_files(schema_paths)
filtered_schemas = ["action_schema", "date_time_schema"]
select_proc = Proc.new do |value|
if value.is_a?(Expressir::Model::Declarations::Schema)
filtered_schemas.include?(value.id)
else
true
end
end
repo_hash = repo.to_hash(select_proc: select_proc)
schemas = repo_hash['schemas']
schemas.map {|s| s["id"] }
Convert models to liquid
Use to_liquid
method to convert the models of Expressir::Model::*
to liquid
drop models (Expressir::Liquid::*
).
Example:
repo = Expressir::Express::Parser.from_file("path/to/file.exp")
repo_drop = repo.to_liquid
where repo
is an instance of Expressir::Model::Repository
and
repo_drop
is an instance of Expressir::Liquid::RepositoryDrop
.
The liquid drop models of Expressir::Liquid::*
have the same attributes
(model_attr
) as the models of Expressir::Model::*
.
For example, Expressir::Model::Repository
has the following attributes:
-
schemas
and each Expressir::Model::Declarations::Schema
has the following attributes:
-
file
-
version
-
interfaces
-
constants
-
entities
-
subtype_constraints
-
functions
-
rules
-
procedures
Thus, Expressir::Liquid::Repository
has the same attribute schemas
and Expressir::Liquid::Declarations::SchemaDrop
has same attribute file
.
repo = Expressir::Express::Parser.from_file("path/to/file.exp")
repo_drop = repo.to_liquid
schema = repo_drop.schemas.first
schema.file = "path/to/file.exp"
Contributing
First, thank you for contributing! We love pull requests from everyone. By participating in this project, you hereby grant Ribose Inc. the right to grant or transfer an unlimited number of non exclusive licenses or sub-licenses to third parties, under the copyright covering the contribution to use the contribution by all means.
Here are a few technical guidelines to follow:
-
Open an issues to discuss a new feature.
-
Write tests to support your new feature.
-
Make sure the entire test suite passes locally and on CI.
-
Open a Pull Request.
-
Squash your commits after receiving feedback.
-
Party!
License
Expressir is distributed under the BSD 2-clause license.
Expressir originally contained some code from the NIST Reeper project but has been completely rewritten.
The NIST Reeper license is reproduced below:
This software was funded by NIST and developed by EuroSTEP. Pursuant to title 17 Section 105 of the United States Code this software is not subject to copyright protection and is in the public domain.
We would appreciate acknowledgment if the software is used. Links to non-Federal Government Web sites do not imply NIST endorsement of any particular product, service, organization, company, information provider, or content.
Credits
Copyright Ribose Inc.