expressir 2.1.29 → 2.1.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/docs.yml +98 -0
  3. data/.github/workflows/links.yml +100 -0
  4. data/.github/workflows/rake.yml +4 -0
  5. data/.github/workflows/release.yml +5 -0
  6. data/.github/workflows/validate_schemas.yml +1 -1
  7. data/.gitignore +3 -0
  8. data/.rubocop.yml +1 -1
  9. data/.rubocop_todo.yml +209 -55
  10. data/Gemfile +2 -1
  11. data/README.adoc +650 -83
  12. data/docs/Gemfile +12 -0
  13. data/docs/_config.yml +141 -0
  14. data/docs/_guides/changes/changes-format.adoc +778 -0
  15. data/docs/_guides/changes/importing-eengine.adoc +898 -0
  16. data/docs/_guides/changes/index.adoc +396 -0
  17. data/docs/_guides/changes/programmatic-usage.adoc +1038 -0
  18. data/docs/_guides/changes/validating-changes.adoc +681 -0
  19. data/docs/_guides/cli/benchmark-performance.adoc +834 -0
  20. data/docs/_guides/cli/coverage-analysis.adoc +921 -0
  21. data/docs/_guides/cli/format-schemas.adoc +547 -0
  22. data/docs/_guides/cli/index.adoc +8 -0
  23. data/docs/_guides/cli/managing-changes.adoc +927 -0
  24. data/docs/_guides/cli/validate-ascii.adoc +645 -0
  25. data/docs/_guides/cli/validate-schemas.adoc +534 -0
  26. data/docs/_guides/index.adoc +165 -0
  27. data/docs/_guides/ler/creating-packages.adoc +664 -0
  28. data/docs/_guides/ler/index.adoc +305 -0
  29. data/docs/_guides/ler/loading-packages.adoc +707 -0
  30. data/docs/_guides/ler/package-formats.adoc +748 -0
  31. data/docs/_guides/ler/querying-packages.adoc +826 -0
  32. data/docs/_guides/ler/validating-packages.adoc +750 -0
  33. data/docs/_guides/liquid/basic-templates.adoc +813 -0
  34. data/docs/_guides/liquid/documentation-generation.adoc +1042 -0
  35. data/docs/_guides/liquid/drops-reference.adoc +829 -0
  36. data/docs/_guides/liquid/filters-and-tags.adoc +912 -0
  37. data/docs/_guides/liquid/index.adoc +468 -0
  38. data/docs/_guides/manifests/creating-manifests.adoc +483 -0
  39. data/docs/_guides/manifests/index.adoc +307 -0
  40. data/docs/_guides/manifests/resolving-manifests.adoc +557 -0
  41. data/docs/_guides/manifests/validating-manifests.adoc +713 -0
  42. data/docs/_guides/ruby-api/formatting-schemas.adoc +605 -0
  43. data/docs/_guides/ruby-api/index.adoc +257 -0
  44. data/docs/_guides/ruby-api/parsing-files.adoc +421 -0
  45. data/docs/_guides/ruby-api/search-engine.adoc +609 -0
  46. data/docs/_guides/ruby-api/working-with-repository.adoc +577 -0
  47. data/docs/_pages/data-model.adoc +665 -0
  48. data/docs/_pages/express-language.adoc +506 -0
  49. data/docs/_pages/getting-started.adoc +414 -0
  50. data/docs/_pages/index.adoc +116 -0
  51. data/docs/_pages/introduction.adoc +256 -0
  52. data/docs/_pages/ler-packages.adoc +837 -0
  53. data/docs/_pages/parsers.adoc +683 -0
  54. data/docs/_pages/schema-manifests.adoc +431 -0
  55. data/docs/_references/index.adoc +228 -0
  56. data/docs/_tutorials/creating-ler-package.adoc +735 -0
  57. data/docs/_tutorials/documentation-coverage.adoc +795 -0
  58. data/docs/_tutorials/index.adoc +221 -0
  59. data/docs/_tutorials/liquid-templates.adoc +806 -0
  60. data/docs/_tutorials/parsing-your-first-schema.adoc +522 -0
  61. data/docs/_tutorials/querying-schemas.adoc +751 -0
  62. data/docs/_tutorials/working-with-multiple-schemas.adoc +676 -0
  63. data/docs/index.adoc +242 -0
  64. data/docs/lychee.toml +84 -0
  65. data/examples/demo_ler_usage.sh +86 -0
  66. data/examples/ler/README.md +111 -0
  67. data/examples/ler/simple_example.ler +0 -0
  68. data/examples/ler/simple_schema.exp +33 -0
  69. data/examples/ler_build.rb +75 -0
  70. data/examples/ler_cli.rb +79 -0
  71. data/examples/ler_demo_complete.rb +276 -0
  72. data/examples/ler_query.rb +91 -0
  73. data/examples/ler_query_examples.rb +305 -0
  74. data/examples/ler_stats.rb +81 -0
  75. data/examples/phase3_demo.rb +159 -0
  76. data/examples/query_demo_simple.rb +131 -0
  77. data/expressir.gemspec +2 -0
  78. data/lib/expressir/changes/schema_change.rb +32 -22
  79. data/lib/expressir/changes/{edition_change.rb → version_change.rb} +3 -3
  80. data/lib/expressir/cli.rb +12 -4
  81. data/lib/expressir/commands/changes_import_eengine.rb +2 -2
  82. data/lib/expressir/commands/changes_validate.rb +1 -1
  83. data/lib/expressir/commands/manifest.rb +427 -0
  84. data/lib/expressir/commands/package.rb +1274 -0
  85. data/lib/expressir/commands/validate.rb +70 -37
  86. data/lib/expressir/commands/validate_ascii.rb +607 -0
  87. data/lib/expressir/commands/validate_load.rb +88 -0
  88. data/lib/expressir/express/formatter.rb +5 -1
  89. data/lib/expressir/express/formatters/remark_item_formatter.rb +25 -0
  90. data/lib/expressir/express/parser.rb +33 -0
  91. data/lib/expressir/manifest/resolver.rb +213 -0
  92. data/lib/expressir/manifest/validator.rb +195 -0
  93. data/lib/expressir/model/declarations/entity.rb +6 -0
  94. data/lib/expressir/model/dependency_resolver.rb +270 -0
  95. data/lib/expressir/model/indexes/entity_index.rb +103 -0
  96. data/lib/expressir/model/indexes/reference_index.rb +148 -0
  97. data/lib/expressir/model/indexes/type_index.rb +149 -0
  98. data/lib/expressir/model/interface_validator.rb +384 -0
  99. data/lib/expressir/model/repository.rb +400 -5
  100. data/lib/expressir/model/repository_validator.rb +295 -0
  101. data/lib/expressir/model/search_engine.rb +525 -0
  102. data/lib/expressir/model.rb +4 -94
  103. data/lib/expressir/package/builder.rb +200 -0
  104. data/lib/expressir/package/metadata.rb +81 -0
  105. data/lib/expressir/package/reader.rb +165 -0
  106. data/lib/expressir/schema_manifest.rb +11 -1
  107. data/lib/expressir/version.rb +1 -1
  108. data/lib/expressir.rb +16 -3
  109. metadata +115 -5
  110. data/docs/benchmarking.adoc +0 -107
  111. data/docs/liquid_drops.adoc +0 -1547
@@ -0,0 +1,414 @@
1
+ ---
2
+ title: Getting Started
3
+ nav_order: 3
4
+ ---
5
+
6
+ == Getting Started with Expressir
7
+
8
+ === Purpose
9
+
10
+ This guide will help you install Expressir and take your first steps with both the command-line interface (CLI) and Ruby API. Within minutes, you'll be parsing EXPRESS schemas and exploring the results.
11
+
12
+ === References
13
+
14
+ * link:introduction.html[Introduction] - What is Expressir?
15
+ * link:../tutorials/parsing-your-first-schema.html[Tutorial: Parsing Your First Schema] - Hands-on tutorial
16
+ * link:../guides/cli/[CLI Guides] - Detailed CLI documentation
17
+ * link:../guides/ruby-api/[Ruby API Guides] - Advanced Ruby usage
18
+
19
+ === Concepts
20
+
21
+ Gem:: A Ruby library package that can be installed and managed with RubyGems
22
+ Bundle:: Ruby's dependency manager (Bundler) for managing gem versions
23
+ CLI:: Command-Line Interface - programs run from the terminal
24
+ Repository:: Expressir's container for parsed schemas
25
+ Schema:: An EXPRESS data model containing entities, types, and functions
26
+
27
+ === Prerequisites
28
+
29
+ Before installing Expressir, ensure you have:
30
+
31
+ **Ruby 2.7 or later**::
32
+ Check your Ruby version:
33
+ +
34
+ [source,sh]
35
+ ----
36
+ ruby --version
37
+ ----
38
+ +
39
+ If you need to install Ruby, visit https://www.ruby-lang.org/en/documentation/installation/[ruby-lang.org/en/documentation/installation]
40
+
41
+ **RubyGems**::
42
+ Comes with Ruby by default. Verify with:
43
+ +
44
+ [source,sh]
45
+ ----
46
+ gem --version
47
+ ----
48
+
49
+ **Bundler (recommended)**::
50
+ For managing dependencies in your projects:
51
+ +
52
+ [source,sh]
53
+ ----
54
+ gem install bundler
55
+ ----
56
+
57
+ === Installation
58
+
59
+ There are two ways to install Expressir:
60
+
61
+ ==== Option 1: System-wide Installation
62
+
63
+ Install Expressir globally on your system:
64
+
65
+ [source,sh]
66
+ ----
67
+ gem install expressir
68
+ ----
69
+
70
+ This makes the `expressir` command available system-wide.
71
+
72
+ ==== Option 2: Project-specific Installation (Recommended)
73
+
74
+ For use in a specific project, add Expressir to your `Gemfile`:
75
+
76
+ [source,ruby]
77
+ ----
78
+ # Gemfile
79
+ source 'https://rubygems.org'
80
+
81
+ gem 'expressir'
82
+ ----
83
+
84
+ Then install:
85
+
86
+ [source,sh]
87
+ ----
88
+ bundle install
89
+ ----
90
+
91
+ This approach is recommended because it:
92
+
93
+ * Locks specific versions for reproducibility
94
+ * Isolates dependencies per project
95
+ * Works well with CI/CD systems
96
+
97
+ === Verify Installation
98
+
99
+ Confirm Expressir is installed correctly:
100
+
101
+ [source,sh]
102
+ ----
103
+ # Check version
104
+ expressir version
105
+
106
+ # View available commands
107
+ expressir help
108
+ ----
109
+
110
+ You should see output listing Expressir's version and available commands.
111
+
112
+ === First Steps with CLI
113
+
114
+ Let's parse your first EXPRESS schema using the command line.
115
+
116
+ ==== Create a Sample Schema
117
+
118
+ Create a simple EXPRESS file named `example.exp`:
119
+
120
+ [source,express]
121
+ ----
122
+ SCHEMA example_schema;
123
+
124
+ ENTITY person;
125
+ name : STRING;
126
+ age : INTEGER;
127
+ END_ENTITY;
128
+
129
+ ENTITY organization;
130
+ org_name : STRING;
131
+ employees : SET [0:?] OF person;
132
+ END_ENTITY;
133
+
134
+ END_SCHEMA;
135
+ ----
136
+
137
+ ==== Parse and Format the Schema
138
+
139
+ Use the `format` command to parse and pretty-print the schema:
140
+
141
+ [source,sh]
142
+ ----
143
+ expressir format example.exp
144
+ ----
145
+
146
+ This will output the formatted schema to your terminal, confirming that:
147
+
148
+ 1. The schema parses correctly
149
+ 2. Expressir understands the structure
150
+ 3. The formatting engine works
151
+
152
+ ==== Validate the Schema
153
+
154
+ Check if the schema is valid:
155
+
156
+ [source,sh]
157
+ ----
158
+ expressir validate example.exp
159
+ ----
160
+
161
+ A valid schema should display: "Validation passed for all EXPRESS schemas."
162
+
163
+ ==== Explore Other Commands
164
+
165
+ Try these commands to explore Expressir's capabilities:
166
+
167
+ [source,sh]
168
+ ----
169
+ # View all available commands
170
+ expressir help
171
+
172
+ # Get help for a specific command
173
+ expressir help format
174
+
175
+ # Check version
176
+ expressir version
177
+ ----
178
+
179
+ === First Steps with Ruby API
180
+
181
+ Now let's use Expressir programmatically from Ruby.
182
+
183
+ ==== Basic Parsing Example
184
+
185
+ Create a Ruby script named `parse_example.rb`:
186
+
187
+ [source,ruby]
188
+ ----
189
+ require 'expressir'
190
+
191
+ # Parse an EXPRESS file
192
+ repository = Expressir::Express::Parser.from_file('example.exp')
193
+
194
+ # Access the parsed schema
195
+ schema = repository.schemas.first
196
+ puts "Schema name: #{schema.id}"
197
+ puts "Number of entities: #{schema.entities.length}"
198
+
199
+ # List all entities
200
+ schema.entities.each do |entity|
201
+ puts " Entity: #{entity.id}"
202
+ entity.attributes.each do |attr|
203
+ puts " - #{attr.id}: #{attr.type}"
204
+ end
205
+ end
206
+ ----
207
+
208
+ Run it:
209
+
210
+ [source,sh]
211
+ ----
212
+ ruby parse_example.rb
213
+ ----
214
+
215
+ Expected output:
216
+
217
+ [source]
218
+ ----
219
+ Schema name: example_schema
220
+ Number of entities: 2
221
+ Entity: person
222
+ - name: STRING
223
+ - age: INTEGER
224
+ Entity: organization
225
+ - org_name: STRING
226
+ - employees: SET [0:?] OF person
227
+ ----
228
+
229
+ ==== Interactive Exploration with IRB
230
+
231
+ You can also explore Expressir interactively:
232
+
233
+ [source,sh]
234
+ ----
235
+ irb
236
+ ----
237
+
238
+ Then in the IRB session:
239
+
240
+ [source,ruby]
241
+ ----
242
+ require 'expressir'
243
+
244
+ # Parse a file
245
+ repo = Expressir::Express::Parser.from_file('example.exp')
246
+
247
+ # Explore the structure
248
+ repo.schemas.first.entities.first
249
+ # => Returns the first entity
250
+
251
+ # Access attributes
252
+ repo.schemas.first.entities.first.attributes
253
+ # => Returns array of attributes
254
+ ----
255
+
256
+ ==== Error Handling Example
257
+
258
+ Expressir provides clear error messages when parsing fails:
259
+
260
+ [source,ruby]
261
+ ----
262
+ require 'expressir'
263
+
264
+ begin
265
+ repository = Expressir::Express::Parser.from_file('invalid.exp')
266
+ rescue Expressir::Express::Error::SchemaParseFailure => e
267
+ puts "Parse error in #{e.filename}:"
268
+ puts e.message
269
+ puts e.parse_failure_cause.ascii_tree
270
+ end
271
+ ----
272
+
273
+ === Testing Your Installation
274
+
275
+ Run Expressir's test suite to ensure everything works:
276
+
277
+ [source,sh]
278
+ ----
279
+ # Clone the repository (if you want to contribute)
280
+ git clone https://github.com/lutaml/expressir.git
281
+ cd expressir
282
+
283
+ # Install dependencies
284
+ bundle install
285
+
286
+ # Run tests
287
+ bundle exec rake
288
+ ----
289
+
290
+ All tests should pass, confirming your installation is working correctly.
291
+
292
+ === Common Issues and Solutions
293
+
294
+ ==== "Command not found: expressir"
295
+
296
+ **Problem**: The expressir command isn't in your PATH.
297
+
298
+ **Solutions**:
299
+
300
+ 1. If installed with bundler, use: `bundle exec expressir`
301
+ 2. Ensure RubyGems bin directory is in PATH:
302
+ +
303
+ [source,sh]
304
+ ----
305
+ echo 'export PATH="$HOME/.gem/ruby/X.X.0/bin:$PATH"' >> ~/.bashrc
306
+ source ~/.bashrc
307
+ ----
308
+ +
309
+ Replace `X.X` with your Ruby version
310
+
311
+ ==== "cannot load such file -- expressir"
312
+
313
+ **Problem**: Expressir gem not found by Ruby.
314
+
315
+ **Solutions**:
316
+
317
+ 1. Install the gem: `gem install expressir`
318
+ 2. If using Bundler: `bundle install`
319
+ 3. Check your Ruby environment: `gem env`
320
+
321
+ ==== Parser Errors
322
+
323
+ **Problem**: Schema fails to parse.
324
+
325
+ **Solutions**:
326
+
327
+ 1. Verify EXPRESS syntax is valid
328
+ 2. Check for special characters or encoding issues
329
+ 3. Use `--verbose` flag for detailed error messages
330
+ 4. Consult the EXPRESS language specification
331
+
332
+ === Next Steps
333
+
334
+ Now that you have Expressir installed and working, you can:
335
+
336
+ **Learn by doing**::
337
+ Try the link:../tutorials/parsing-your-first-schema.html[Parsing Your First Schema] tutorial for a comprehensive introduction
338
+
339
+ **Explore CLI commands**::
340
+ Read the link:../guides/cli/[CLI guides] to master command-line usage
341
+
342
+ **Dive into Ruby API**::
343
+ Study the link:../guides/ruby-api/[Ruby API guides] for programmatic control
344
+
345
+ **Understand the model**::
346
+ Learn about link:data-model.html[Expressir's data model] to work with schemas effectively
347
+
348
+ **Work with LER packages**::
349
+ Explore link:ler-packages.html[LER packages] for high-performance schema distribution
350
+
351
+ === Quick Reference
352
+
353
+ ==== Most Used CLI Commands
354
+
355
+ [source,sh]
356
+ ----
357
+ # Format (pretty-print) a schema
358
+ expressir format schema.exp
359
+
360
+ # Validate schema
361
+ expressir validate schema.exp
362
+
363
+ # Check documentation coverage
364
+ expressir coverage schema.exp
365
+
366
+ # Show version
367
+ expressir version
368
+
369
+ # Get help
370
+ expressir help [COMMAND]
371
+ ----
372
+
373
+ ==== Most Used Ruby Methods
374
+
375
+ [source,ruby]
376
+ ----
377
+ # Parse a single file
378
+ repo = Expressir::Express::Parser.from_file('schema.exp')
379
+
380
+ # Parse multiple files
381
+ repo = Expressir::Express::Parser.from_files(['schema1.exp', 'schema2.exp'])
382
+
383
+ # Access schemas
384
+ repo.schemas.each { |schema| puts schema.id }
385
+
386
+ # Find entities
387
+ schema.entities.find { |e| e.id == 'person' }
388
+
389
+ # Convert to Liquid drops
390
+ repo_drop = repo.to_liquid
391
+ ----
392
+
393
+ === Getting Help
394
+
395
+ If you encounter issues:
396
+
397
+ **Documentation**::
398
+ Browse the complete link:../[documentation site]
399
+
400
+ **GitHub Issues**::
401
+ https://github.com/lutaml/expressir/issues[Report bugs or request features]
402
+
403
+ **Community**::
404
+ Join discussions and ask questions in GitHub Discussions
405
+
406
+ **Source Code**::
407
+ https://github.com/lutaml/expressir[Explore the code on GitHub]
408
+
409
+ === Bibliography
410
+
411
+ * https://www.ruby-lang.org/en/documentation/installation/[Ruby Installation Guide] - Installing Ruby on various platforms
412
+ * https://bundler.io/[Bundler Documentation] - Ruby dependency management
413
+ * https://guides.rubygems.org/[RubyGems Guides] - Working with Ruby gems
414
+ * https://github.com/lutaml/expressir[Expressir on GitHub] - Source code and issue tracker
@@ -0,0 +1,116 @@
1
+ ---
2
+ title: Core Topics
3
+ nav_order: 2
4
+ has_children: true
5
+ ---
6
+
7
+ = Core Topics
8
+
9
+ This section covers the fundamental concepts and essential information you need to understand and work with Expressir.
10
+
11
+ == What You'll Learn
12
+
13
+ The Core Topics section provides comprehensive coverage of:
14
+
15
+ * *Expressir Fundamentals* - What Expressir is, its architecture, and when to use it
16
+ * *EXPRESS Language* - Understanding the EXPRESS data modeling language
17
+ * *Data Model* - How Expressir represents EXPRESS schemas in Ruby
18
+ * *Parsers* - How Expressir parses different EXPRESS formats
19
+ * *LER Packages* - High-performance schema packaging and distribution
20
+
21
+ == Topics
22
+
23
+ === link:../introduction.html[Introduction]
24
+
25
+ Learn what Expressir is, its key features, and how it fits into the EXPRESS ecosystem.
26
+
27
+ *Key concepts:*
28
+
29
+ * Purpose and goals
30
+ * Architecture overview
31
+ * When to use Expressir
32
+ * Comparison with other tools
33
+
34
+ === link:../getting-started.html[Getting Started]
35
+
36
+ Get up and running with Expressir quickly with installation instructions and first steps.
37
+
38
+ *You'll learn:*
39
+
40
+ * How to install Expressir
41
+ * Basic CLI usage
42
+ * Simple Ruby API examples
43
+ * Next steps for learning
44
+
45
+ === link:../express-language.html[EXPRESS Language]
46
+
47
+ Understand the EXPRESS data modeling language that Expressir parses and processes.
48
+
49
+ *Topics covered:*
50
+
51
+ * EXPRESS language overview
52
+ * ISO 10303-11 background
53
+ * Key concepts (schemas, entities, types)
54
+ * EXPRESS syntax basics
55
+
56
+ === link:../data-model.html[Data Model]
57
+
58
+ Explore Expressir's Ruby data model that represents EXPRESS schemas.
59
+
60
+ *Learn about:*
61
+
62
+ * Model hierarchy and structure
63
+ * Key classes and their relationships
64
+ * Working with the model programmatically
65
+ * Model traversal patterns
66
+
67
+ === link:../parsers.html[Parsers]
68
+
69
+ Discover how Expressir parses multiple EXPRESS formats.
70
+
71
+ *Understand:*
72
+
73
+ * Parser architecture
74
+ * Supported formats (EXPRESS, STEPmod, EXPRESS XML)
75
+ * Parsing strategies
76
+ * Error handling and recovery
77
+
78
+ === link:../ler-packages.html[LER Packages]
79
+
80
+ Learn about LutaML EXPRESS Repository (LER) packages for efficient schema distribution.
81
+
82
+ *Explore:*
83
+
84
+ * What are LER packages?
85
+ * Benefits and use cases
86
+ * Package structure and format
87
+ * Performance advantages
88
+
89
+ == Next Steps
90
+
91
+ After reading the Core Topics:
92
+
93
+ * Try the link:../../tutorials/[Tutorials] for hands-on learning
94
+ * Consult the link:../../guides/[Guides] for specific tasks
95
+ * Reference the link:../../references/[References] for detailed specifications
96
+
97
+ == Prerequisites
98
+
99
+ To get the most from these topics, you should have:
100
+
101
+ * Basic Ruby knowledge
102
+ * Familiarity with command-line tools
103
+ * Some understanding of data modeling concepts (helpful but not required)
104
+
105
+ == Reading Guide
106
+
107
+ We recommend reading the Core Topics in order if you're new to Expressir:
108
+
109
+ . Start with link:../introduction.html[Introduction] to understand what Expressir is
110
+ . Follow link:../getting-started.html[Getting Started] to install and try it
111
+ . Read link:../express-language.html[EXPRESS Language] to understand the domain
112
+ . Study link:../data-model.html[Data Model] to work with schemas programmatically
113
+ . Review link:../parsers.html[Parsers] to understand how parsing works
114
+ . Explore link:../ler-packages.html[LER Packages] for advanced deployment scenarios
115
+
116
+ If you're already familiar with EXPRESS, you can skip directly to link:../data-model.html[Data Model] to understand how Expressir represents schemas in Ruby.