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.
- checksums.yaml +4 -4
- data/.github/workflows/docs.yml +98 -0
- data/.github/workflows/links.yml +100 -0
- data/.github/workflows/rake.yml +4 -0
- data/.github/workflows/release.yml +5 -0
- data/.github/workflows/validate_schemas.yml +1 -1
- data/.gitignore +3 -0
- data/.rubocop.yml +1 -1
- data/.rubocop_todo.yml +209 -55
- data/Gemfile +2 -1
- data/README.adoc +650 -83
- data/docs/Gemfile +12 -0
- data/docs/_config.yml +141 -0
- data/docs/_guides/changes/changes-format.adoc +778 -0
- data/docs/_guides/changes/importing-eengine.adoc +898 -0
- data/docs/_guides/changes/index.adoc +396 -0
- data/docs/_guides/changes/programmatic-usage.adoc +1038 -0
- data/docs/_guides/changes/validating-changes.adoc +681 -0
- data/docs/_guides/cli/benchmark-performance.adoc +834 -0
- data/docs/_guides/cli/coverage-analysis.adoc +921 -0
- data/docs/_guides/cli/format-schemas.adoc +547 -0
- data/docs/_guides/cli/index.adoc +8 -0
- data/docs/_guides/cli/managing-changes.adoc +927 -0
- data/docs/_guides/cli/validate-ascii.adoc +645 -0
- data/docs/_guides/cli/validate-schemas.adoc +534 -0
- data/docs/_guides/index.adoc +165 -0
- data/docs/_guides/ler/creating-packages.adoc +664 -0
- data/docs/_guides/ler/index.adoc +305 -0
- data/docs/_guides/ler/loading-packages.adoc +707 -0
- data/docs/_guides/ler/package-formats.adoc +748 -0
- data/docs/_guides/ler/querying-packages.adoc +826 -0
- data/docs/_guides/ler/validating-packages.adoc +750 -0
- data/docs/_guides/liquid/basic-templates.adoc +813 -0
- data/docs/_guides/liquid/documentation-generation.adoc +1042 -0
- data/docs/_guides/liquid/drops-reference.adoc +829 -0
- data/docs/_guides/liquid/filters-and-tags.adoc +912 -0
- data/docs/_guides/liquid/index.adoc +468 -0
- data/docs/_guides/manifests/creating-manifests.adoc +483 -0
- data/docs/_guides/manifests/index.adoc +307 -0
- data/docs/_guides/manifests/resolving-manifests.adoc +557 -0
- data/docs/_guides/manifests/validating-manifests.adoc +713 -0
- data/docs/_guides/ruby-api/formatting-schemas.adoc +605 -0
- data/docs/_guides/ruby-api/index.adoc +257 -0
- data/docs/_guides/ruby-api/parsing-files.adoc +421 -0
- data/docs/_guides/ruby-api/search-engine.adoc +609 -0
- data/docs/_guides/ruby-api/working-with-repository.adoc +577 -0
- data/docs/_pages/data-model.adoc +665 -0
- data/docs/_pages/express-language.adoc +506 -0
- data/docs/_pages/getting-started.adoc +414 -0
- data/docs/_pages/index.adoc +116 -0
- data/docs/_pages/introduction.adoc +256 -0
- data/docs/_pages/ler-packages.adoc +837 -0
- data/docs/_pages/parsers.adoc +683 -0
- data/docs/_pages/schema-manifests.adoc +431 -0
- data/docs/_references/index.adoc +228 -0
- data/docs/_tutorials/creating-ler-package.adoc +735 -0
- data/docs/_tutorials/documentation-coverage.adoc +795 -0
- data/docs/_tutorials/index.adoc +221 -0
- data/docs/_tutorials/liquid-templates.adoc +806 -0
- data/docs/_tutorials/parsing-your-first-schema.adoc +522 -0
- data/docs/_tutorials/querying-schemas.adoc +751 -0
- data/docs/_tutorials/working-with-multiple-schemas.adoc +676 -0
- data/docs/index.adoc +242 -0
- data/docs/lychee.toml +84 -0
- data/examples/demo_ler_usage.sh +86 -0
- data/examples/ler/README.md +111 -0
- data/examples/ler/simple_example.ler +0 -0
- data/examples/ler/simple_schema.exp +33 -0
- data/examples/ler_build.rb +75 -0
- data/examples/ler_cli.rb +79 -0
- data/examples/ler_demo_complete.rb +276 -0
- data/examples/ler_query.rb +91 -0
- data/examples/ler_query_examples.rb +305 -0
- data/examples/ler_stats.rb +81 -0
- data/examples/phase3_demo.rb +159 -0
- data/examples/query_demo_simple.rb +131 -0
- data/expressir.gemspec +2 -0
- data/lib/expressir/changes/schema_change.rb +32 -22
- data/lib/expressir/changes/{edition_change.rb → version_change.rb} +3 -3
- data/lib/expressir/cli.rb +12 -4
- data/lib/expressir/commands/changes_import_eengine.rb +2 -2
- data/lib/expressir/commands/changes_validate.rb +1 -1
- data/lib/expressir/commands/manifest.rb +427 -0
- data/lib/expressir/commands/package.rb +1274 -0
- data/lib/expressir/commands/validate.rb +70 -37
- data/lib/expressir/commands/validate_ascii.rb +607 -0
- data/lib/expressir/commands/validate_load.rb +88 -0
- data/lib/expressir/express/formatter.rb +5 -1
- data/lib/expressir/express/formatters/remark_item_formatter.rb +25 -0
- data/lib/expressir/express/parser.rb +33 -0
- data/lib/expressir/manifest/resolver.rb +213 -0
- data/lib/expressir/manifest/validator.rb +195 -0
- data/lib/expressir/model/declarations/entity.rb +6 -0
- data/lib/expressir/model/dependency_resolver.rb +270 -0
- data/lib/expressir/model/indexes/entity_index.rb +103 -0
- data/lib/expressir/model/indexes/reference_index.rb +148 -0
- data/lib/expressir/model/indexes/type_index.rb +149 -0
- data/lib/expressir/model/interface_validator.rb +384 -0
- data/lib/expressir/model/repository.rb +400 -5
- data/lib/expressir/model/repository_validator.rb +295 -0
- data/lib/expressir/model/search_engine.rb +525 -0
- data/lib/expressir/model.rb +4 -94
- data/lib/expressir/package/builder.rb +200 -0
- data/lib/expressir/package/metadata.rb +81 -0
- data/lib/expressir/package/reader.rb +165 -0
- data/lib/expressir/schema_manifest.rb +11 -1
- data/lib/expressir/version.rb +1 -1
- data/lib/expressir.rb +16 -3
- metadata +115 -5
- data/docs/benchmarking.adoc +0 -107
- data/docs/liquid_drops.adoc +0 -1547
|
@@ -0,0 +1,664 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Creating Packages
|
|
3
|
+
parent: LER Packages
|
|
4
|
+
grand_parent: Guides
|
|
5
|
+
nav_order: 1
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
= Creating Packages
|
|
9
|
+
|
|
10
|
+
== Purpose
|
|
11
|
+
|
|
12
|
+
This guide explains how to create LER (Lutaml EXPRESS Repository) packages from
|
|
13
|
+
EXPRESS schemas using both the Ruby API and CLI commands. LER packages provide
|
|
14
|
+
a fast, compact way to distribute and deploy EXPRESS schemas.
|
|
15
|
+
|
|
16
|
+
== References
|
|
17
|
+
|
|
18
|
+
* link:index.html[LER Packages Overview]
|
|
19
|
+
* link:loading-packages.html[Loading Packages]
|
|
20
|
+
* link:package-formats.html[Package Formats]
|
|
21
|
+
* link:../ruby-api/working-with-repository.html[Working with Repository]
|
|
22
|
+
|
|
23
|
+
== Concepts
|
|
24
|
+
|
|
25
|
+
LER package:: A ZIP archive containing serialized EXPRESS schemas, pre-built
|
|
26
|
+
indexes, and metadata for fast loading and querying.
|
|
27
|
+
|
|
28
|
+
Package builder:: The [`Expressir::Package::Builder`](../../lib/expressir/package/builder.rb) class
|
|
29
|
+
responsible for creating LER packages from repository instances.
|
|
30
|
+
|
|
31
|
+
Resolution mode:: Controls whether schemas are serialized with resolved
|
|
32
|
+
references (`resolved`) or kept separate (`bare`).
|
|
33
|
+
|
|
34
|
+
Express mode:: Controls whether original EXPRESS files are included in the
|
|
35
|
+
package (`include_all`) or external files are allowed (`allow_external`).
|
|
36
|
+
|
|
37
|
+
Serialization format:: The format used to store schemas: `marshal` (binary),
|
|
38
|
+
`yaml` (human-readable), or `json` (portable).
|
|
39
|
+
|
|
40
|
+
== Building packages from Ruby API
|
|
41
|
+
|
|
42
|
+
=== Basic package creation
|
|
43
|
+
|
|
44
|
+
Create a LER package from a repository using the
|
|
45
|
+
[`export_to_package`](../../lib/expressir/model/repository.rb:270) method:
|
|
46
|
+
|
|
47
|
+
[source,ruby]
|
|
48
|
+
----
|
|
49
|
+
require "expressir"
|
|
50
|
+
|
|
51
|
+
# Parse schemas
|
|
52
|
+
repo = Expressir::Model::Repository.from_files([
|
|
53
|
+
"schemas/action_schema.exp",
|
|
54
|
+
"schemas/approval_schema.exp"
|
|
55
|
+
])
|
|
56
|
+
|
|
57
|
+
# Export to LER package
|
|
58
|
+
repo.export_to_package("output.ler")
|
|
59
|
+
----
|
|
60
|
+
|
|
61
|
+
This creates a package with default options:
|
|
62
|
+
|
|
63
|
+
* `name`: "Unnamed Package"
|
|
64
|
+
* `version`: "1.0.0"
|
|
65
|
+
* `express_mode`: "include_all"
|
|
66
|
+
* `resolution_mode`: "resolved"
|
|
67
|
+
* `serialization_format`: "marshal"
|
|
68
|
+
|
|
69
|
+
=== Package with custom options
|
|
70
|
+
|
|
71
|
+
Specify package metadata and configuration:
|
|
72
|
+
|
|
73
|
+
[source,ruby]
|
|
74
|
+
----
|
|
75
|
+
repo.export_to_package(
|
|
76
|
+
"production.ler",
|
|
77
|
+
name: "Production Schemas",
|
|
78
|
+
version: "2.1.0",
|
|
79
|
+
description: "Schema set for production deployment",
|
|
80
|
+
express_mode: "include_all",
|
|
81
|
+
resolution_mode: "resolved",
|
|
82
|
+
serialization_format: "marshal"
|
|
83
|
+
)
|
|
84
|
+
----
|
|
85
|
+
|
|
86
|
+
=== Using Package::Builder directly
|
|
87
|
+
|
|
88
|
+
For more control, use the [`Package::Builder`](../../lib/expressir/package/builder.rb:11) class directly:
|
|
89
|
+
|
|
90
|
+
[source,ruby]
|
|
91
|
+
----
|
|
92
|
+
require "expressir/package/builder"
|
|
93
|
+
|
|
94
|
+
# Create builder
|
|
95
|
+
builder = Expressir::Package::Builder.new
|
|
96
|
+
|
|
97
|
+
# Build package with options
|
|
98
|
+
builder.build(
|
|
99
|
+
repo,
|
|
100
|
+
"custom.ler",
|
|
101
|
+
name: "Custom Package",
|
|
102
|
+
version: "1.0.0",
|
|
103
|
+
description: "Custom configuration",
|
|
104
|
+
express_mode: "include_all",
|
|
105
|
+
resolution_mode: "resolved",
|
|
106
|
+
serialization_format: "yaml"
|
|
107
|
+
)
|
|
108
|
+
----
|
|
109
|
+
|
|
110
|
+
== Building packages from CLI
|
|
111
|
+
|
|
112
|
+
=== Basic CLI command
|
|
113
|
+
|
|
114
|
+
The [`expressir package build`](../../lib/expressir/commands/package.rb:31) command creates
|
|
115
|
+
packages from command line:
|
|
116
|
+
|
|
117
|
+
[source,bash]
|
|
118
|
+
----
|
|
119
|
+
# Build from a single schema file
|
|
120
|
+
expressir package build schemas/action_schema.exp output.ler
|
|
121
|
+
|
|
122
|
+
# With package metadata
|
|
123
|
+
expressir package build schemas/action_schema.exp output.ler \
|
|
124
|
+
--name "Action Schema Package" \
|
|
125
|
+
--version "1.0.0" \
|
|
126
|
+
--description "Action schema and dependencies"
|
|
127
|
+
----
|
|
128
|
+
|
|
129
|
+
=== Automatic dependency resolution
|
|
130
|
+
|
|
131
|
+
The build command automatically resolves and includes all dependencies:
|
|
132
|
+
|
|
133
|
+
[source,bash]
|
|
134
|
+
----
|
|
135
|
+
# Build from root schema - dependencies auto-resolved
|
|
136
|
+
expressir package build schemas/activity/mim.exp activity.ler \
|
|
137
|
+
--name "Activity Module" \
|
|
138
|
+
--version "4.3" \
|
|
139
|
+
--description "ISO 10303-41 Activity Module"
|
|
140
|
+
----
|
|
141
|
+
|
|
142
|
+
Dependencies are found by following `USE FROM` and `REFERENCE FROM` statements.
|
|
143
|
+
|
|
144
|
+
=== CLI build options
|
|
145
|
+
|
|
146
|
+
==== Package identification
|
|
147
|
+
|
|
148
|
+
[source,bash]
|
|
149
|
+
----
|
|
150
|
+
expressir package build input.exp output.ler \
|
|
151
|
+
--name "Package Name" \
|
|
152
|
+
--version "2.0.0" \
|
|
153
|
+
--description "Detailed description"
|
|
154
|
+
----
|
|
155
|
+
|
|
156
|
+
==== Express bundling mode
|
|
157
|
+
|
|
158
|
+
[source,bash]
|
|
159
|
+
----
|
|
160
|
+
# Include original EXPRESS files (default)
|
|
161
|
+
expressir package build input.exp output.ler \
|
|
162
|
+
--express-mode include_all
|
|
163
|
+
|
|
164
|
+
# Allow external EXPRESS files
|
|
165
|
+
expressir package build input.exp output.ler \
|
|
166
|
+
--express-mode allow_external
|
|
167
|
+
----
|
|
168
|
+
|
|
169
|
+
==== Resolution mode
|
|
170
|
+
|
|
171
|
+
[source,bash]
|
|
172
|
+
----
|
|
173
|
+
# Pre-resolve all references (default, recommended)
|
|
174
|
+
expressir package build input.exp output.ler \
|
|
175
|
+
--resolution-mode resolved
|
|
176
|
+
|
|
177
|
+
# Keep schemas separate (rarely used)
|
|
178
|
+
expressir package build input.exp output.ler \
|
|
179
|
+
--resolution-mode bare
|
|
180
|
+
----
|
|
181
|
+
|
|
182
|
+
==== Serialization format
|
|
183
|
+
|
|
184
|
+
[source,bash]
|
|
185
|
+
----
|
|
186
|
+
# Binary format for speed (default)
|
|
187
|
+
expressir package build input.exp output.ler \
|
|
188
|
+
--serialization-format marshal
|
|
189
|
+
|
|
190
|
+
# Human-readable YAML
|
|
191
|
+
expressir package build input.exp output.ler \
|
|
192
|
+
--serialization-format yaml
|
|
193
|
+
|
|
194
|
+
# JSON for portability
|
|
195
|
+
expressir package build input.exp output.ler \
|
|
196
|
+
--serialization-format json
|
|
197
|
+
----
|
|
198
|
+
|
|
199
|
+
==== Validation
|
|
200
|
+
|
|
201
|
+
[source,bash]
|
|
202
|
+
----
|
|
203
|
+
# Validate before packaging (default)
|
|
204
|
+
expressir package build input.exp output.ler --validate
|
|
205
|
+
|
|
206
|
+
# Skip validation (faster but risky)
|
|
207
|
+
expressir package build input.exp output.ler --no-validate
|
|
208
|
+
----
|
|
209
|
+
|
|
210
|
+
==== Verbose output
|
|
211
|
+
|
|
212
|
+
[source,bash]
|
|
213
|
+
----
|
|
214
|
+
# Show detailed build progress
|
|
215
|
+
expressir package build input.exp output.ler --verbose
|
|
216
|
+
----
|
|
217
|
+
|
|
218
|
+
== Package configuration options
|
|
219
|
+
|
|
220
|
+
=== Express mode options
|
|
221
|
+
|
|
222
|
+
`include_all` (default):: Includes original EXPRESS files in the package.
|
|
223
|
+
Recommended for most use cases.
|
|
224
|
+
+
|
|
225
|
+
.Benefits
|
|
226
|
+
[example]
|
|
227
|
+
====
|
|
228
|
+
* Self-contained package
|
|
229
|
+
* Original source available for reference
|
|
230
|
+
* Debugging capability
|
|
231
|
+
* Documentation included
|
|
232
|
+
====
|
|
233
|
+
|
|
234
|
+
`allow_external`:: Allows schemas to reference external EXPRESS files not
|
|
235
|
+
included in the package.
|
|
236
|
+
+
|
|
237
|
+
.Use when
|
|
238
|
+
[example]
|
|
239
|
+
====
|
|
240
|
+
* Sharing only derived/generated schemas
|
|
241
|
+
* External dependencies managed separately
|
|
242
|
+
* Reducing package size for large schema sets
|
|
243
|
+
====
|
|
244
|
+
|
|
245
|
+
=== Resolution mode options
|
|
246
|
+
|
|
247
|
+
`resolved` (default):: All schema references are resolved and stored in the
|
|
248
|
+
package.
|
|
249
|
+
+
|
|
250
|
+
.Benefits
|
|
251
|
+
[example]
|
|
252
|
+
====
|
|
253
|
+
* Fastest loading time
|
|
254
|
+
* No runtime resolution needed
|
|
255
|
+
* All dependencies included
|
|
256
|
+
* Self-contained
|
|
257
|
+
====
|
|
258
|
+
|
|
259
|
+
`bare`:: Schemas stored without reference resolution.
|
|
260
|
+
+
|
|
261
|
+
.Benefits
|
|
262
|
+
[example]
|
|
263
|
+
====
|
|
264
|
+
* Smaller package size
|
|
265
|
+
* Flexibility in resolution
|
|
266
|
+
* Useful for schema development
|
|
267
|
+
====
|
|
268
|
+
|
|
269
|
+
=== Serialization format options
|
|
270
|
+
|
|
271
|
+
`marshal` (default):: Ruby's native binary serialization.
|
|
272
|
+
+
|
|
273
|
+
.Characteristics
|
|
274
|
+
[example]
|
|
275
|
+
====
|
|
276
|
+
* Fastest loading (5-10x faster than YAML)
|
|
277
|
+
* Most compact (40-60% of YAML size)
|
|
278
|
+
* Ruby-specific (not portable)
|
|
279
|
+
* Not human-readable
|
|
280
|
+
====
|
|
281
|
+
|
|
282
|
+
`yaml`:: Human-readable YAML format.
|
|
283
|
+
+
|
|
284
|
+
.Characteristics
|
|
285
|
+
[example]
|
|
286
|
+
====
|
|
287
|
+
* Slower loading than Marshal
|
|
288
|
+
* Larger file size
|
|
289
|
+
* Text-based and portable
|
|
290
|
+
* Debuggable and inspectable
|
|
291
|
+
====
|
|
292
|
+
|
|
293
|
+
`json`:: JSON format for maximum portability.
|
|
294
|
+
+
|
|
295
|
+
.Characteristics
|
|
296
|
+
[example]
|
|
297
|
+
====
|
|
298
|
+
* Similar performance to YAML
|
|
299
|
+
* Wide tool support
|
|
300
|
+
* Language-independent
|
|
301
|
+
* Debuggable and inspectable
|
|
302
|
+
====
|
|
303
|
+
|
|
304
|
+
== Dependency resolution
|
|
305
|
+
|
|
306
|
+
=== Automatic resolution
|
|
307
|
+
|
|
308
|
+
The CLI build command uses
|
|
309
|
+
[`DependencyResolver`](../../lib/expressir/model/dependency_resolver.rb) to
|
|
310
|
+
find all required schemas:
|
|
311
|
+
|
|
312
|
+
[source,ruby]
|
|
313
|
+
----
|
|
314
|
+
require "expressir/model/dependency_resolver"
|
|
315
|
+
|
|
316
|
+
# Resolve dependencies
|
|
317
|
+
resolver = Expressir::Model::DependencyResolver.new
|
|
318
|
+
schema_files = resolver.resolve_dependencies("schemas/activity/mim.exp")
|
|
319
|
+
|
|
320
|
+
puts "Found #{schema_files.size} schema files"
|
|
321
|
+
schema_files.each { |f| puts " - #{f}" }
|
|
322
|
+
----
|
|
323
|
+
|
|
324
|
+
=== Resolution behavior
|
|
325
|
+
|
|
326
|
+
The resolver:
|
|
327
|
+
|
|
328
|
+
1. Parses the root schema
|
|
329
|
+
2. Extracts `USE FROM` and `REFERENCE FROM` statements
|
|
330
|
+
3. Locates referenced schema files
|
|
331
|
+
4. Recursively processes dependencies
|
|
332
|
+
5. Returns complete file list
|
|
333
|
+
|
|
334
|
+
=== Base directories
|
|
335
|
+
|
|
336
|
+
Specify base directories for schema resolution:
|
|
337
|
+
|
|
338
|
+
[source,bash]
|
|
339
|
+
----
|
|
340
|
+
# Single base directory
|
|
341
|
+
expressir package build mim.exp output.ler \
|
|
342
|
+
--base-dirs "/path/to/schemas"
|
|
343
|
+
|
|
344
|
+
# Multiple base directories
|
|
345
|
+
expressir package build mim.exp output.ler \
|
|
346
|
+
--base-dirs "/path/to/schemas,/another/path"
|
|
347
|
+
----
|
|
348
|
+
|
|
349
|
+
== Optimization strategies
|
|
350
|
+
|
|
351
|
+
=== Choose the right serialization format
|
|
352
|
+
|
|
353
|
+
For production deployments:
|
|
354
|
+
|
|
355
|
+
[source,bash]
|
|
356
|
+
----
|
|
357
|
+
# Fastest loading with Marshal
|
|
358
|
+
expressir package build input.exp production.ler \
|
|
359
|
+
--serialization-format marshal
|
|
360
|
+
----
|
|
361
|
+
|
|
362
|
+
For development and debugging:
|
|
363
|
+
|
|
364
|
+
[source,bash]
|
|
365
|
+
----
|
|
366
|
+
# Human-readable with YAML
|
|
367
|
+
expressir package build input.exp debug.ler \
|
|
368
|
+
--serialization-format yaml
|
|
369
|
+
----
|
|
370
|
+
|
|
371
|
+
=== Include pre-built indexes
|
|
372
|
+
|
|
373
|
+
Indexes are automatically built and included:
|
|
374
|
+
|
|
375
|
+
* Entity index: Fast entity lookups by qualified name
|
|
376
|
+
* Type index: Fast type lookups with category filtering
|
|
377
|
+
* Reference index: Tracks inter-schema dependencies
|
|
378
|
+
|
|
379
|
+
No additional configuration needed - indexes are always included.
|
|
380
|
+
|
|
381
|
+
=== Minimize package size
|
|
382
|
+
|
|
383
|
+
If size is critical:
|
|
384
|
+
|
|
385
|
+
[source,bash]
|
|
386
|
+
----
|
|
387
|
+
# Use Marshal format and exclude EXPRESS files
|
|
388
|
+
expressir package build input.exp minimal.ler \
|
|
389
|
+
--serialization-format marshal \
|
|
390
|
+
--express-mode allow_external
|
|
391
|
+
----
|
|
392
|
+
|
|
393
|
+
.Size comparison example
|
|
394
|
+
[example]
|
|
395
|
+
====
|
|
396
|
+
[source]
|
|
397
|
+
----
|
|
398
|
+
Package configuration | Size
|
|
399
|
+
------------------------------|------
|
|
400
|
+
marshal + include_all | 1.2 MB (baseline)
|
|
401
|
+
marshal + allow_external | 0.8 MB (33% smaller)
|
|
402
|
+
yaml + include_all | 2.1 MB (75% larger)
|
|
403
|
+
json + include_all | 2.3 MB (92% larger)
|
|
404
|
+
----
|
|
405
|
+
====
|
|
406
|
+
|
|
407
|
+
== Automation in CI/CD
|
|
408
|
+
|
|
409
|
+
=== GitHub Actions example
|
|
410
|
+
|
|
411
|
+
[source,yaml]
|
|
412
|
+
----
|
|
413
|
+
name: Build LER Package
|
|
414
|
+
|
|
415
|
+
on:
|
|
416
|
+
push:
|
|
417
|
+
branches: [main]
|
|
418
|
+
|
|
419
|
+
jobs:
|
|
420
|
+
build-package:
|
|
421
|
+
runs-on: ubuntu-latest
|
|
422
|
+
steps:
|
|
423
|
+
- uses: actions/checkout@v2
|
|
424
|
+
|
|
425
|
+
- name: Set up Ruby
|
|
426
|
+
uses: ruby/setup-ruby@v1
|
|
427
|
+
with:
|
|
428
|
+
ruby-version: 3.0
|
|
429
|
+
|
|
430
|
+
- name: Install Expressir
|
|
431
|
+
run: gem install expressir
|
|
432
|
+
|
|
433
|
+
- name: Build LER package
|
|
434
|
+
run: |
|
|
435
|
+
expressir package build \
|
|
436
|
+
schemas/main.exp \
|
|
437
|
+
output/schemas.ler \
|
|
438
|
+
--name "Schema Package" \
|
|
439
|
+
--version "${{ github.sha }}" \
|
|
440
|
+
--validate \
|
|
441
|
+
--verbose
|
|
442
|
+
|
|
443
|
+
- name: Upload artifact
|
|
444
|
+
uses: actions/upload-artifact@v2
|
|
445
|
+
with:
|
|
446
|
+
name: ler-package
|
|
447
|
+
path: output/schemas.ler
|
|
448
|
+
----
|
|
449
|
+
|
|
450
|
+
=== Rake task example
|
|
451
|
+
|
|
452
|
+
Create a Rake task for building packages:
|
|
453
|
+
|
|
454
|
+
[source,ruby]
|
|
455
|
+
----
|
|
456
|
+
# Rakefile
|
|
457
|
+
require "expressir"
|
|
458
|
+
|
|
459
|
+
desc "Build LER package for production"
|
|
460
|
+
task :build_package do
|
|
461
|
+
puts "Building LER package..."
|
|
462
|
+
|
|
463
|
+
repo = Expressir::Model::Repository.from_files(
|
|
464
|
+
Dir.glob("schemas/**/*.exp")
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
repo.export_to_package(
|
|
468
|
+
"dist/production.ler",
|
|
469
|
+
name: "Production Schemas",
|
|
470
|
+
version: ENV["VERSION"] || "dev",
|
|
471
|
+
description: "Production schema package",
|
|
472
|
+
express_mode: "include_all",
|
|
473
|
+
serialization_format: "marshal"
|
|
474
|
+
)
|
|
475
|
+
|
|
476
|
+
puts "Package created: dist/production.ler"
|
|
477
|
+
puts "Size: #{File.size("dist/production.ler")} bytes"
|
|
478
|
+
end
|
|
479
|
+
----
|
|
480
|
+
|
|
481
|
+
Run with:
|
|
482
|
+
|
|
483
|
+
[source,bash]
|
|
484
|
+
----
|
|
485
|
+
VERSION=1.2.0 rake build_package
|
|
486
|
+
----
|
|
487
|
+
|
|
488
|
+
=== Build script example
|
|
489
|
+
|
|
490
|
+
Create a reusable build script:
|
|
491
|
+
|
|
492
|
+
[source,ruby]
|
|
493
|
+
----
|
|
494
|
+
#!/usr/bin/env ruby
|
|
495
|
+
# build_package.rb
|
|
496
|
+
|
|
497
|
+
require "expressir"
|
|
498
|
+
require "optparse"
|
|
499
|
+
|
|
500
|
+
options = {
|
|
501
|
+
name: "Schema Package",
|
|
502
|
+
version: "1.0.0",
|
|
503
|
+
format: "marshal"
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
OptionParser.new do |opts|
|
|
507
|
+
opts.banner = "Usage: build_package.rb INPUT OUTPUT [options]"
|
|
508
|
+
|
|
509
|
+
opts.on("--name NAME", "Package name") do |v|
|
|
510
|
+
options[:name] = v
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
opts.on("--version VERSION", "Package version") do |v|
|
|
514
|
+
options[:version] = v
|
|
515
|
+
end
|
|
516
|
+
|
|
517
|
+
opts.on("--format FORMAT", "Serialization format") do |v|
|
|
518
|
+
options[:format] = v
|
|
519
|
+
end
|
|
520
|
+
end.parse!
|
|
521
|
+
|
|
522
|
+
input = ARGV[0] || abort("INPUT file required")
|
|
523
|
+
output = ARGV[1] || abort("OUTPUT file required")
|
|
524
|
+
|
|
525
|
+
puts "Building package: #{output}"
|
|
526
|
+
repo = Expressir::Express::Parser.from_file(input)
|
|
527
|
+
|
|
528
|
+
repo.export_to_package(
|
|
529
|
+
output,
|
|
530
|
+
name: options[:name],
|
|
531
|
+
version: options[:version],
|
|
532
|
+
serialization_format: options[:format]
|
|
533
|
+
)
|
|
534
|
+
|
|
535
|
+
puts "✓ Package created successfully"
|
|
536
|
+
----
|
|
537
|
+
|
|
538
|
+
== Troubleshooting build errors
|
|
539
|
+
|
|
540
|
+
=== Common errors and solutions
|
|
541
|
+
|
|
542
|
+
==== Schema parse failure
|
|
543
|
+
|
|
544
|
+
.Error
|
|
545
|
+
[example]
|
|
546
|
+
====
|
|
547
|
+
[source]
|
|
548
|
+
----
|
|
549
|
+
Error building package: Failed to parse schema: unexpected token
|
|
550
|
+
----
|
|
551
|
+
====
|
|
552
|
+
|
|
553
|
+
.Solution
|
|
554
|
+
[example]
|
|
555
|
+
====
|
|
556
|
+
1. Validate EXPRESS syntax manually
|
|
557
|
+
2. Check for missing semicolons or keywords
|
|
558
|
+
3. Use `expressir validate` command first
|
|
559
|
+
====
|
|
560
|
+
|
|
561
|
+
==== Missing dependencies
|
|
562
|
+
|
|
563
|
+
.Error
|
|
564
|
+
[example]
|
|
565
|
+
====
|
|
566
|
+
[source]
|
|
567
|
+
----
|
|
568
|
+
Error: Referenced schema not found: geometric_model_schema
|
|
569
|
+
----
|
|
570
|
+
====
|
|
571
|
+
|
|
572
|
+
.Solution
|
|
573
|
+
[example]
|
|
574
|
+
====
|
|
575
|
+
1. Check `--base-dirs` parameter
|
|
576
|
+
2. Ensure all referenced schemas are accessible
|
|
577
|
+
3. Verify schema file names match schema IDs
|
|
578
|
+
====
|
|
579
|
+
|
|
580
|
+
==== Invalid metadata
|
|
581
|
+
|
|
582
|
+
.Error
|
|
583
|
+
[example]
|
|
584
|
+
====
|
|
585
|
+
[source]
|
|
586
|
+
----
|
|
587
|
+
Invalid metadata: serialization_format must be 'marshal', 'json', or 'yaml'
|
|
588
|
+
----
|
|
589
|
+
====
|
|
590
|
+
|
|
591
|
+
.Solution
|
|
592
|
+
[example]
|
|
593
|
+
====
|
|
594
|
+
Check that all options have valid values:
|
|
595
|
+
* `express_mode`: "include_all" or "allow_external"
|
|
596
|
+
* `resolution_mode`: "resolved" or "bare"
|
|
597
|
+
* `serialization_format`: "marshal", "json", or "yaml"
|
|
598
|
+
====
|
|
599
|
+
|
|
600
|
+
==== Out of memory
|
|
601
|
+
|
|
602
|
+
.Error
|
|
603
|
+
[example]
|
|
604
|
+
====
|
|
605
|
+
[source]
|
|
606
|
+
----
|
|
607
|
+
Error: Cannot allocate memory
|
|
608
|
+
----
|
|
609
|
+
====
|
|
610
|
+
|
|
611
|
+
.Solution
|
|
612
|
+
[example]
|
|
613
|
+
====
|
|
614
|
+
1. Use `marshal` format (most compact)
|
|
615
|
+
2. Build smaller packages
|
|
616
|
+
3. Increase available memory
|
|
617
|
+
4. Use `--no-validate` to skip validation step
|
|
618
|
+
====
|
|
619
|
+
|
|
620
|
+
=== Debugging build process
|
|
621
|
+
|
|
622
|
+
Enable verbose output to see detailed progress:
|
|
623
|
+
|
|
624
|
+
[source,bash]
|
|
625
|
+
----
|
|
626
|
+
expressir package build input.exp output.ler --verbose
|
|
627
|
+
----
|
|
628
|
+
|
|
629
|
+
Output shows:
|
|
630
|
+
|
|
631
|
+
* Dependency resolution progress
|
|
632
|
+
* Number of schemas found
|
|
633
|
+
* Validation results
|
|
634
|
+
* Package creation status
|
|
635
|
+
|
|
636
|
+
== Next steps
|
|
637
|
+
|
|
638
|
+
* link:loading-packages.html[Loading Packages] - Learn how to load and use LER
|
|
639
|
+
packages
|
|
640
|
+
* link:querying-packages.html[Querying Packages] - Search package contents
|
|
641
|
+
* link:validating-packages.html[Validating Packages] - Verify package integrity
|
|
642
|
+
* link:package-formats.html[Package Formats] - Compare serialization formats
|
|
643
|
+
|
|
644
|
+
== Summary
|
|
645
|
+
|
|
646
|
+
Key takeaways for creating LER packages:
|
|
647
|
+
|
|
648
|
+
* Use `repo.export_to_package()` for Ruby API
|
|
649
|
+
* Use `expressir package build` for CLI
|
|
650
|
+
* Dependencies are automatically resolved
|
|
651
|
+
* Choose `marshal` format for production (fastest)
|
|
652
|
+
* Choose `yaml` or `json` for debugging (readable)
|
|
653
|
+
* Include validation in CI/CD pipelines
|
|
654
|
+
* Use `include_all` mode for self-contained packages
|
|
655
|
+
* Pre-built indexes are automatically included
|
|
656
|
+
|
|
657
|
+
Best practices:
|
|
658
|
+
|
|
659
|
+
* Validate schemas before packaging
|
|
660
|
+
* Use semantic versioning
|
|
661
|
+
* Document package contents in description
|
|
662
|
+
* Automate builds in CI/CD
|
|
663
|
+
* Test packages after creation
|
|
664
|
+
* Keep original EXPRESS files in version control
|