expressir 2.4.29-aarch64-mingw-ucrt

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 (424) hide show
  1. checksums.yaml +7 -0
  2. data/.cargo/config.toml +3 -0
  3. data/.github/scripts/test_installed_gem.rb +34 -0
  4. data/.github/workflows/codeql.yml +35 -0
  5. data/.github/workflows/docs.yml +99 -0
  6. data/.github/workflows/links.yml +100 -0
  7. data/.github/workflows/native-gems.yml +201 -0
  8. data/.github/workflows/rake.yml +19 -0
  9. data/.github/workflows/release.yml +37 -0
  10. data/.github/workflows/rust-ext.yml +41 -0
  11. data/.github/workflows/stress.yml +36 -0
  12. data/.github/workflows/validate_schemas.yml +48 -0
  13. data/.github/workflows/verify_remarks.yml +33 -0
  14. data/.gitignore +55 -0
  15. data/.hound.yml +3 -0
  16. data/.rspec +2 -0
  17. data/.rubocop.yml +18 -0
  18. data/.rubocop_todo.yml +297 -0
  19. data/CHANGELOG.md +159 -0
  20. data/Gemfile +18 -0
  21. data/README.adoc +2783 -0
  22. data/Rakefile +41 -0
  23. data/TODO.bugs/01-stale-transformer-autoload.md +39 -0
  24. data/TODO.bugs/02-parser-class-instance-vars.md +36 -0
  25. data/TODO.bugs/03-builder-mutable-state.md +43 -0
  26. data/TODO.bugs/04-formatter-public-send-dispatch.md +53 -0
  27. data/TODO.bugs/05-anonymous-formatter-subclass.md +45 -0
  28. data/TODO.bugs/06-collection-registry-single-source.md +53 -0
  29. data/TODO.bugs/07-require-relative-cleanup.md +42 -0
  30. data/TODO.bugs/08-require-expressir-in-commands.md +34 -0
  31. data/TODO.bugs/09-parser-split.md +53 -0
  32. data/TODO.bugs/10-to-s-override.md +42 -0
  33. data/TODO.bugs/11-parser-class-variables.md +39 -0
  34. data/TODO.bugs/12-marker-modules-vs-registry.md +64 -0
  35. data/TODO.bugs/13-string-literal-scanner-limitation.md +52 -0
  36. data/TODO.bugs/14-model-formatting-leak.md +30 -0
  37. data/TODO.bugs/15-expression-children-macro.md +27 -0
  38. data/TODO.bugs/16-pretty-formatter-duplication.md +28 -0
  39. data/TODO.bugs/17-snake-case-cache-mutable-constant.md +28 -0
  40. data/TODO.bugs/18-const-get-private-constants.md +30 -0
  41. data/TODO.bugs/19-format-methods-public.md +22 -0
  42. data/TODO.bugs/20-coverage-nested-entities-dedup.md +20 -0
  43. data/TODO.bugs/21-operator-tokens-secondary-dispatch.md +21 -0
  44. data/TODO.bugs/22-builder-fast-path-wrappers.md +32 -0
  45. data/TODO.bugs/23-coverage-inverse-maps.md +21 -0
  46. data/TODO.bugs/24-streaming-builder-complexity.md +19 -0
  47. data/TODO.bugs/25-debug-puts-in-production.md +21 -0
  48. data/TODO.bugs/26-generic-entity-children-misplaced.md +21 -0
  49. data/TODO.bugs/27-package-build-god-method.md +19 -0
  50. data/TODO.bugs/28-package-god-class.md +30 -0
  51. data/TODO.bugs/29-validate-ascii-god-class.md +24 -0
  52. data/TODO.bugs/30-unicode-map-extraction.md +19 -0
  53. data/TODO.bugs/README.md +43 -0
  54. data/TODO.max-perf/01-restore-ci-green.md +36 -0
  55. data/TODO.max-perf/02-streaming-parse-path.md +31 -0
  56. data/TODO.max-perf/03-cli-parallel-opt-in.md +27 -0
  57. data/TODO.max-perf/04-benchmark-harness.md +28 -0
  58. data/TODO.max-perf/05-parallel-fidelity-specs.md +22 -0
  59. data/TODO.max-perf/06-builder-cpu-audit.md +41 -0
  60. data/TODO.max-perf/07-upstream-parsanol-roadmap.md +27 -0
  61. data/TODO.max-perf/08-builder-build-perf.md +45 -0
  62. data/TODO.max-perf/09-grammar-cold-start.md +25 -0
  63. data/TODO.max-perf/10-parser-facade-hygiene.md +23 -0
  64. data/TODO.max-perf/11-ci-green-closeout.md +25 -0
  65. data/TODO.max-perf/12-require-boot-profile.md +25 -0
  66. data/TODO.max-perf/13-key-conversion-specs.md +26 -0
  67. data/TODO.max-perf/14-builder-call-handler-audit.md +28 -0
  68. data/TODO.parity-ee/00-overview.md +76 -0
  69. data/TODO.parity-ee/01-annex-g-rule-extraction.md +41 -0
  70. data/TODO.parity-ee/02-eeng-algorithm-inventory.md +8 -0
  71. data/TODO.parity-ee/03-eeng-oracle-harness.md +33 -0
  72. data/TODO.parity-ee/04-shtolo-concatenate.md +44 -0
  73. data/TODO.parity-ee/05-shtolo-longform-flatten.md +53 -0
  74. data/TODO.parity-ee/06-interface-scheduling-parity.md +47 -0
  75. data/TODO.parity-ee/07-semantic-checks-port.md +35 -0
  76. data/TODO.parity-ee/08-pretty-roundtrip-gate.md +27 -0
  77. data/TODO.parity-ee/09-smrl-index-and-listing.md +22 -0
  78. data/TODO.parity-ee/10-interface-dot-graph.md +21 -0
  79. data/TODO.parity-ee/11-import-eeng-tests.md +79 -0
  80. data/TODO.parity-ee/12-full-check-catalog.md +67 -0
  81. data/TODO.parity-ee/13-population-p21.md +54 -0
  82. data/TODO.parity-ee/14-shtolo-completion.md +44 -0
  83. data/TODO.parity-ee/15-part28-xml.md +51 -0
  84. data/TODO.parity-ee/16-compare-patch.md +48 -0
  85. data/TODO.parity-ee/17-official-tests.md +42 -0
  86. data/TODO.parity-ee/18-mim-mapping.md +47 -0
  87. data/TODO.parity-ee/19-architecture.md +97 -0
  88. data/TODO.parity-ee/parity-matrix.md +108 -0
  89. data/TODO.refpath-v2/00-overview.md +64 -0
  90. data/TODO.suma-improvements/00-overview.md +23 -0
  91. data/TODO.suma-improvements/01-prebuilt-platform-gems.md +33 -0
  92. data/TODO.suma-improvements/02-suma-e2e.md +39 -0
  93. data/TODO.suma-improvements/03-item-graph.md +22 -0
  94. data/TODO.suma-improvements/04-compiled-set-default.md +16 -0
  95. data/TODO.suma-improvements/05-validation-in-docs.md +17 -0
  96. data/TODO.suma-improvements/06-memory-remeasure.md +36 -0
  97. data/TODO.suma-improvements/07-part28-xml.md +15 -0
  98. data/TODO.suma-improvements/08-windows-gnu-toolchain.md +15 -0
  99. data/TODO.suma-improvements/09-checker-tranche3.md +13 -0
  100. data/TODO.suma-improvements/10-expressdoc.md +8 -0
  101. data/benchmark/srl_benchmark.rb +458 -0
  102. data/benchmark/srl_native_benchmark.rb +146 -0
  103. data/benchmark/srl_ruby_benchmark.rb +132 -0
  104. data/bin/console +11 -0
  105. data/bin/rspec +30 -0
  106. data/bin/setup +8 -0
  107. data/docs/Gemfile +12 -0
  108. data/docs/_config.yml +141 -0
  109. data/docs/_guides/changes/changes-format.adoc +778 -0
  110. data/docs/_guides/changes/importing-eengine.adoc +898 -0
  111. data/docs/_guides/changes/index.adoc +396 -0
  112. data/docs/_guides/changes/programmatic-usage.adoc +1038 -0
  113. data/docs/_guides/changes/validating-changes.adoc +681 -0
  114. data/docs/_guides/cli/benchmark-performance.adoc +834 -0
  115. data/docs/_guides/cli/coverage-analysis.adoc +921 -0
  116. data/docs/_guides/cli/format-schemas.adoc +547 -0
  117. data/docs/_guides/cli/index.adoc +8 -0
  118. data/docs/_guides/cli/managing-changes.adoc +927 -0
  119. data/docs/_guides/cli/validate-ascii.adoc +645 -0
  120. data/docs/_guides/cli/validate-schemas.adoc +534 -0
  121. data/docs/_guides/formatter/formatter-architecture.adoc +401 -0
  122. data/docs/_guides/index.adoc +165 -0
  123. data/docs/_guides/ler/creating-packages.adoc +664 -0
  124. data/docs/_guides/ler/index.adoc +305 -0
  125. data/docs/_guides/ler/loading-packages.adoc +707 -0
  126. data/docs/_guides/ler/package-formats.adoc +748 -0
  127. data/docs/_guides/ler/querying-packages.adoc +826 -0
  128. data/docs/_guides/ler/step-packages.adoc +385 -0
  129. data/docs/_guides/ler/validating-packages.adoc +750 -0
  130. data/docs/_guides/liquid/basic-templates.adoc +813 -0
  131. data/docs/_guides/liquid/documentation-generation.adoc +1042 -0
  132. data/docs/_guides/liquid/drops-reference.adoc +829 -0
  133. data/docs/_guides/liquid/filters-and-tags.adoc +912 -0
  134. data/docs/_guides/liquid/index.adoc +468 -0
  135. data/docs/_guides/manifests/creating-manifests.adoc +483 -0
  136. data/docs/_guides/manifests/index.adoc +307 -0
  137. data/docs/_guides/manifests/resolving-manifests.adoc +557 -0
  138. data/docs/_guides/manifests/validating-manifests.adoc +713 -0
  139. data/docs/_guides/ruby-api/formatting-schemas.adoc +605 -0
  140. data/docs/_guides/ruby-api/index.adoc +257 -0
  141. data/docs/_guides/ruby-api/parsing-files.adoc +421 -0
  142. data/docs/_guides/ruby-api/search-engine.adoc +609 -0
  143. data/docs/_guides/ruby-api/working-with-repository.adoc +577 -0
  144. data/docs/_pages/data-model.adoc +665 -0
  145. data/docs/_pages/express-language.adoc +506 -0
  146. data/docs/_pages/getting-started.adoc +414 -0
  147. data/docs/_pages/index.adoc +116 -0
  148. data/docs/_pages/introduction.adoc +256 -0
  149. data/docs/_pages/ler-packages.adoc +837 -0
  150. data/docs/_pages/parsers.adoc +709 -0
  151. data/docs/_pages/schema-manifests.adoc +431 -0
  152. data/docs/_references/index.adoc +228 -0
  153. data/docs/_tutorials/creating-ler-package.adoc +735 -0
  154. data/docs/_tutorials/documentation-coverage.adoc +795 -0
  155. data/docs/_tutorials/formatting-schemas.adoc +89 -0
  156. data/docs/_tutorials/index.adoc +231 -0
  157. data/docs/_tutorials/liquid-templates.adoc +806 -0
  158. data/docs/_tutorials/parsing-your-first-schema.adoc +522 -0
  159. data/docs/_tutorials/querying-schemas.adoc +751 -0
  160. data/docs/_tutorials/working-with-multiple-schemas.adoc +676 -0
  161. data/docs/index.adoc +242 -0
  162. data/docs/lychee.toml +90 -0
  163. data/examples/demo_ler_usage.sh +86 -0
  164. data/examples/ler/README.md +111 -0
  165. data/examples/ler/simple_example.ler +0 -0
  166. data/examples/ler/simple_schema.exp +33 -0
  167. data/examples/ler_build.rb +75 -0
  168. data/examples/ler_cli.rb +79 -0
  169. data/examples/ler_demo_complete.rb +276 -0
  170. data/examples/ler_query.rb +91 -0
  171. data/examples/ler_query_examples.rb +305 -0
  172. data/examples/ler_stats.rb +81 -0
  173. data/examples/phase3_demo.rb +159 -0
  174. data/examples/query_demo_simple.rb +131 -0
  175. data/exe/expressir +11 -0
  176. data/exe/expressir-format +14 -0
  177. data/exe/expressir-format-test +82 -0
  178. data/expressir.gemspec +61 -0
  179. data/lib/expressir/3.4/expressir_core.so +0 -0
  180. data/lib/expressir/4.0/expressir_core.so +0 -0
  181. data/lib/expressir/benchmark.rb +310 -0
  182. data/lib/expressir/changes/item_change.rb +20 -0
  183. data/lib/expressir/changes/mapping_change.rb +16 -0
  184. data/lib/expressir/changes/schema_change.rb +85 -0
  185. data/lib/expressir/changes/version_change.rb +26 -0
  186. data/lib/expressir/changes.rb +9 -0
  187. data/lib/expressir/cli.rb +148 -0
  188. data/lib/expressir/commands/base.rb +25 -0
  189. data/lib/expressir/commands/benchmark.rb +59 -0
  190. data/lib/expressir/commands/benchmark_cache.rb +80 -0
  191. data/lib/expressir/commands/changes.rb +34 -0
  192. data/lib/expressir/commands/changes_import_eengine.rb +146 -0
  193. data/lib/expressir/commands/changes_validate.rb +63 -0
  194. data/lib/expressir/commands/check.rb +56 -0
  195. data/lib/expressir/commands/clean.rb +20 -0
  196. data/lib/expressir/commands/coverage.rb +458 -0
  197. data/lib/expressir/commands/expand.rb +26 -0
  198. data/lib/expressir/commands/file_violations.rb +70 -0
  199. data/lib/expressir/commands/fix.rb +33 -0
  200. data/lib/expressir/commands/flatten.rb +29 -0
  201. data/lib/expressir/commands/format.rb +43 -0
  202. data/lib/expressir/commands/manifest.rb +420 -0
  203. data/lib/expressir/commands/mapping_validate.rb +68 -0
  204. data/lib/expressir/commands/non_ascii_character.rb +49 -0
  205. data/lib/expressir/commands/non_ascii_violation_collection.rb +301 -0
  206. data/lib/expressir/commands/package.rb +1222 -0
  207. data/lib/expressir/commands/parity_inputs.rb +160 -0
  208. data/lib/expressir/commands/validate.rb +106 -0
  209. data/lib/expressir/commands/validate_ascii.rb +94 -0
  210. data/lib/expressir/commands/validate_load.rb +91 -0
  211. data/lib/expressir/commands/version.rb +9 -0
  212. data/lib/expressir/commands/xsd.rb +23 -0
  213. data/lib/expressir/commands.rb +30 -0
  214. data/lib/expressir/config.rb +60 -0
  215. data/lib/expressir/coverage.rb +510 -0
  216. data/lib/expressir/eengine/arm_compare_report.rb +23 -0
  217. data/lib/expressir/eengine/changes_section.rb +16 -0
  218. data/lib/expressir/eengine/compare_report.rb +69 -0
  219. data/lib/expressir/eengine/mim_compare_report.rb +23 -0
  220. data/lib/expressir/eengine/modified_object.rb +21 -0
  221. data/lib/expressir/eengine.rb +9 -0
  222. data/lib/expressir/errors.rb +113 -0
  223. data/lib/expressir/express/adoc_hyperlink_formatter.rb +30 -0
  224. data/lib/expressir/express/adoc_source_formatter.rb +12 -0
  225. data/lib/expressir/express/ast_key_converter.rb +114 -0
  226. data/lib/expressir/express/builder.rb +277 -0
  227. data/lib/expressir/express/builder_context.rb +22 -0
  228. data/lib/expressir/express/builder_registry.rb +397 -0
  229. data/lib/expressir/express/builders/attribute_decl_builder.rb +32 -0
  230. data/lib/expressir/express/builders/built_in_builder.rb +75 -0
  231. data/lib/expressir/express/builders/constant_builder.rb +108 -0
  232. data/lib/expressir/express/builders/declaration_builder.rb +20 -0
  233. data/lib/expressir/express/builders/derive_clause_builder.rb +14 -0
  234. data/lib/expressir/express/builders/derived_attr_builder.rb +28 -0
  235. data/lib/expressir/express/builders/domain_rule_builder.rb +21 -0
  236. data/lib/expressir/express/builders/entity_decl_builder.rb +116 -0
  237. data/lib/expressir/express/builders/explicit_attr_builder.rb +49 -0
  238. data/lib/expressir/express/builders/expression_builder.rb +416 -0
  239. data/lib/expressir/express/builders/function_decl_builder.rb +86 -0
  240. data/lib/expressir/express/builders/helpers.rb +148 -0
  241. data/lib/expressir/express/builders/interface_builder.rb +151 -0
  242. data/lib/expressir/express/builders/inverse_attr_builder.rb +43 -0
  243. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +30 -0
  244. data/lib/expressir/express/builders/inverse_clause_builder.rb +14 -0
  245. data/lib/expressir/express/builders/literal_builder.rb +93 -0
  246. data/lib/expressir/express/builders/procedure_decl_builder.rb +82 -0
  247. data/lib/expressir/express/builders/qualifier_builder.rb +102 -0
  248. data/lib/expressir/express/builders/reference_builder.rb +18 -0
  249. data/lib/expressir/express/builders/rule_decl_builder.rb +97 -0
  250. data/lib/expressir/express/builders/schema_body_decl_builder.rb +18 -0
  251. data/lib/expressir/express/builders/schema_decl_builder.rb +56 -0
  252. data/lib/expressir/express/builders/schema_version_builder.rb +34 -0
  253. data/lib/expressir/express/builders/simple_id_builder.rb +17 -0
  254. data/lib/expressir/express/builders/statement_builder.rb +243 -0
  255. data/lib/expressir/express/builders/subtype_constraint_builder.rb +166 -0
  256. data/lib/expressir/express/builders/syntax_builder.rb +30 -0
  257. data/lib/expressir/express/builders/type_builder.rb +238 -0
  258. data/lib/expressir/express/builders/type_decl_builder.rb +26 -0
  259. data/lib/expressir/express/builders/unique_clause_builder.rb +20 -0
  260. data/lib/expressir/express/builders/unique_rule_builder.rb +41 -0
  261. data/lib/expressir/express/builders/where_clause_builder.rb +20 -0
  262. data/lib/expressir/express/builders.rb +55 -0
  263. data/lib/expressir/express/cache.rb +76 -0
  264. data/lib/expressir/express/checker.rb +812 -0
  265. data/lib/expressir/express/concatenator.rb +79 -0
  266. data/lib/expressir/express/core.rb +95 -0
  267. data/lib/expressir/express/error.rb +124 -0
  268. data/lib/expressir/express/formatter.rb +149 -0
  269. data/lib/expressir/express/formatters/data_types_formatter.rb +362 -0
  270. data/lib/expressir/express/formatters/declarations_formatter.rb +753 -0
  271. data/lib/expressir/express/formatters/expressions_formatter.rb +180 -0
  272. data/lib/expressir/express/formatters/literals_formatter.rb +55 -0
  273. data/lib/expressir/express/formatters/references_formatter.rb +53 -0
  274. data/lib/expressir/express/formatters/remark_formatter.rb +270 -0
  275. data/lib/expressir/express/formatters/remark_item_formatter.rb +28 -0
  276. data/lib/expressir/express/formatters/statements_formatter.rb +272 -0
  277. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +54 -0
  278. data/lib/expressir/express/formatters.rb +22 -0
  279. data/lib/expressir/express/grammar/parser.rb +712 -0
  280. data/lib/expressir/express/grammar.rb +11 -0
  281. data/lib/expressir/express/hyperlink_formatter.rb +35 -0
  282. data/lib/expressir/express/interface_dot.rb +105 -0
  283. data/lib/expressir/express/lazy_repository.rb +211 -0
  284. data/lib/expressir/express/line_map.rb +48 -0
  285. data/lib/expressir/express/listing.rb +174 -0
  286. data/lib/expressir/express/model_traversal.rb +42 -0
  287. data/lib/expressir/express/model_visitor.rb +25 -0
  288. data/lib/expressir/express/node_position_index.rb +342 -0
  289. data/lib/expressir/express/parallel_files.rb +229 -0
  290. data/lib/expressir/express/parser.rb +523 -0
  291. data/lib/expressir/express/pretty_formatter.rb +586 -0
  292. data/lib/expressir/express/pretty_gate.rb +61 -0
  293. data/lib/expressir/express/refs_overlay.rb +47 -0
  294. data/lib/expressir/express/remark_attacher.rb +1098 -0
  295. data/lib/expressir/express/remark_overlay.rb +86 -0
  296. data/lib/expressir/express/remark_scanner.rb +245 -0
  297. data/lib/expressir/express/resolve_references_model_visitor.rb +29 -0
  298. data/lib/expressir/express/schema_block_scanner.rb +137 -0
  299. data/lib/expressir/express/schema_head_formatter.rb +22 -0
  300. data/lib/expressir/express/schema_plain_source_formatter.rb +11 -0
  301. data/lib/expressir/express/schema_source_formatter.rb +15 -0
  302. data/lib/expressir/express/scope_resolver.rb +223 -0
  303. data/lib/expressir/express/self_schema_reference.rb +126 -0
  304. data/lib/expressir/express/shtolo.rb +679 -0
  305. data/lib/expressir/express/smrl_xml.rb +125 -0
  306. data/lib/expressir/express/source_formatter.rb +15 -0
  307. data/lib/expressir/express/streaming_builder.rb +435 -0
  308. data/lib/expressir/express/xsd.rb +259 -0
  309. data/lib/expressir/express.rb +53 -0
  310. data/lib/expressir/liquid.rb +1 -0
  311. data/lib/expressir/manifest/resolver.rb +210 -0
  312. data/lib/expressir/manifest/validator.rb +192 -0
  313. data/lib/expressir/manifest.rb +6 -0
  314. data/lib/expressir/mapping/refpath.rb +857 -0
  315. data/lib/expressir/mapping.rb +253 -0
  316. data/lib/expressir/model/cache.rb +18 -0
  317. data/lib/expressir/model/concerns.rb +42 -0
  318. data/lib/expressir/model/data_types/aggregate.rb +26 -0
  319. data/lib/expressir/model/data_types/array.rb +25 -0
  320. data/lib/expressir/model/data_types/bag.rb +21 -0
  321. data/lib/expressir/model/data_types/binary.rb +19 -0
  322. data/lib/expressir/model/data_types/boolean.rb +15 -0
  323. data/lib/expressir/model/data_types/enumeration.rb +21 -0
  324. data/lib/expressir/model/data_types/enumeration_item.rb +24 -0
  325. data/lib/expressir/model/data_types/generic.rb +24 -0
  326. data/lib/expressir/model/data_types/generic_entity.rb +24 -0
  327. data/lib/expressir/model/data_types/integer.rb +15 -0
  328. data/lib/expressir/model/data_types/list.rb +23 -0
  329. data/lib/expressir/model/data_types/logical.rb +15 -0
  330. data/lib/expressir/model/data_types/number.rb +15 -0
  331. data/lib/expressir/model/data_types/real.rb +17 -0
  332. data/lib/expressir/model/data_types/select.rb +23 -0
  333. data/lib/expressir/model/data_types/set.rb +21 -0
  334. data/lib/expressir/model/data_types/string.rb +19 -0
  335. data/lib/expressir/model/data_types.rb +25 -0
  336. data/lib/expressir/model/declarations/attribute.rb +38 -0
  337. data/lib/expressir/model/declarations/constant.rb +28 -0
  338. data/lib/expressir/model/declarations/derived_attribute.rb +25 -0
  339. data/lib/expressir/model/declarations/entity.rb +62 -0
  340. data/lib/expressir/model/declarations/function.rb +59 -0
  341. data/lib/expressir/model/declarations/informal_proposition_rule.rb +25 -0
  342. data/lib/expressir/model/declarations/interface.rb +37 -0
  343. data/lib/expressir/model/declarations/interface_item.rb +21 -0
  344. data/lib/expressir/model/declarations/interfaced_item.rb +33 -0
  345. data/lib/expressir/model/declarations/inverse_attribute.rb +25 -0
  346. data/lib/expressir/model/declarations/parameter.rb +28 -0
  347. data/lib/expressir/model/declarations/procedure.rb +57 -0
  348. data/lib/expressir/model/declarations/remark_item.rb +21 -0
  349. data/lib/expressir/model/declarations/rule.rb +66 -0
  350. data/lib/expressir/model/declarations/schema.rb +215 -0
  351. data/lib/expressir/model/declarations/schema_version.rb +19 -0
  352. data/lib/expressir/model/declarations/schema_version_item.rb +19 -0
  353. data/lib/expressir/model/declarations/subtype_constraint.rb +32 -0
  354. data/lib/expressir/model/declarations/type.rb +45 -0
  355. data/lib/expressir/model/declarations/unique_rule.rb +26 -0
  356. data/lib/expressir/model/declarations/variable.rb +28 -0
  357. data/lib/expressir/model/declarations/where_rule.rb +26 -0
  358. data/lib/expressir/model/declarations.rb +31 -0
  359. data/lib/expressir/model/dependency_resolver.rb +268 -0
  360. data/lib/expressir/model/exp_file.rb +42 -0
  361. data/lib/expressir/model/expressions/aggregate_initializer.rb +18 -0
  362. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +20 -0
  363. data/lib/expressir/model/expressions/binary_expression.rb +59 -0
  364. data/lib/expressir/model/expressions/entity_constructor.rb +20 -0
  365. data/lib/expressir/model/expressions/function_call.rb +20 -0
  366. data/lib/expressir/model/expressions/interval.rb +29 -0
  367. data/lib/expressir/model/expressions/query_expression.rb +31 -0
  368. data/lib/expressir/model/expressions/unary_expression.rb +25 -0
  369. data/lib/expressir/model/expressions.rb +18 -0
  370. data/lib/expressir/model/identifier.rb +26 -0
  371. data/lib/expressir/model/indexes/entity_index.rb +103 -0
  372. data/lib/expressir/model/indexes/item_graph.rb +185 -0
  373. data/lib/expressir/model/indexes/reference_index.rb +148 -0
  374. data/lib/expressir/model/indexes/type_index.rb +149 -0
  375. data/lib/expressir/model/indexes.rb +12 -0
  376. data/lib/expressir/model/interface_validator.rb +384 -0
  377. data/lib/expressir/model/literals/binary.rb +17 -0
  378. data/lib/expressir/model/literals/integer.rb +17 -0
  379. data/lib/expressir/model/literals/logical.rb +21 -0
  380. data/lib/expressir/model/literals/real.rb +17 -0
  381. data/lib/expressir/model/literals/string.rb +20 -0
  382. data/lib/expressir/model/literals.rb +13 -0
  383. data/lib/expressir/model/model_element.rb +377 -0
  384. data/lib/expressir/model/references/attribute_reference.rb +19 -0
  385. data/lib/expressir/model/references/group_reference.rb +19 -0
  386. data/lib/expressir/model/references/index_reference.rb +23 -0
  387. data/lib/expressir/model/references/simple_reference.rb +21 -0
  388. data/lib/expressir/model/references.rb +12 -0
  389. data/lib/expressir/model/remark_format.rb +17 -0
  390. data/lib/expressir/model/remark_info.rb +92 -0
  391. data/lib/expressir/model/remark_placement.rb +42 -0
  392. data/lib/expressir/model/repository.rb +483 -0
  393. data/lib/expressir/model/repository_validator.rb +293 -0
  394. data/lib/expressir/model/search_engine.rb +551 -0
  395. data/lib/expressir/model/statements/alias.rb +31 -0
  396. data/lib/expressir/model/statements/assignment.rb +23 -0
  397. data/lib/expressir/model/statements/case.rb +42 -0
  398. data/lib/expressir/model/statements/case_action.rb +20 -0
  399. data/lib/expressir/model/statements/compound.rb +21 -0
  400. data/lib/expressir/model/statements/escape.rb +18 -0
  401. data/lib/expressir/model/statements/if.rb +26 -0
  402. data/lib/expressir/model/statements/null.rb +18 -0
  403. data/lib/expressir/model/statements/procedure_call.rb +22 -0
  404. data/lib/expressir/model/statements/repeat.rb +40 -0
  405. data/lib/expressir/model/statements/return.rb +20 -0
  406. data/lib/expressir/model/statements/skip.rb +18 -0
  407. data/lib/expressir/model/statements.rb +20 -0
  408. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +25 -0
  409. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +17 -0
  410. data/lib/expressir/model/supertype_expressions.rb +12 -0
  411. data/lib/expressir/model.rb +39 -0
  412. data/lib/expressir/package/builder.rb +231 -0
  413. data/lib/expressir/package/metadata.rb +79 -0
  414. data/lib/expressir/package/reader.rb +149 -0
  415. data/lib/expressir/package.rb +8 -0
  416. data/lib/expressir/schema_manifest.rb +159 -0
  417. data/lib/expressir/schema_manifest_entry.rb +15 -0
  418. data/lib/expressir/version.rb +8 -0
  419. data/lib/expressir.rb +94 -0
  420. data/lib/tasks/verify_remarks.rake +16 -0
  421. data/rakelib/native.rake +24 -0
  422. data/rakelib/oracle.rake +52 -0
  423. data/rakelib/verify_remarks.rake +16 -0
  424. metadata +690 -0
data/.gitignore ADDED
@@ -0,0 +1,55 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ /Gemfile.lock
10
+ /.idea
11
+ /.vscode
12
+ /lib/expressir/express/express_parser.bundle
13
+ /lib/expressir/express/express_parser.so
14
+ /lib/expressir/express/*/express_parser.bundle
15
+ /lib/expressir/express/*/express_parser.so
16
+ /spec/syntax/*-pretty.exp
17
+ /ext/express_parser/rice-embed
18
+
19
+ # rspec failure tracking
20
+ .rspec_status
21
+
22
+ # rubocop guide
23
+ .rubocop-https---*
24
+ _site/
25
+
26
+ Gemfile.lock
27
+
28
+ # Claude Code
29
+ .claude/
30
+
31
+ # Development / transient files
32
+ *.ler
33
+ *.pax
34
+ TODO.*.md
35
+ TODO.refactor/
36
+ debug_*.rb
37
+ measure_mem.rb
38
+ tmp_*.rb
39
+ mise.toml
40
+ Gemfile.local
41
+ Gemfile.local.lock
42
+ Gemfile.original
43
+ benchmark/
44
+ CLAUDE.md
45
+
46
+ # Rust workspace
47
+ /target/
48
+ Cargo.lock
49
+ /ext/expressir_core/target/
50
+ /ext/expressir_core/*.bundle
51
+
52
+ # prebuilt binding staged by rake-compiler for platform gems
53
+ /lib/expressir/expressir_core.bundle
54
+ /lib/expressir/expressir_core.so
55
+ /lib/expressir/expressir_core.dll
data/.hound.yml ADDED
@@ -0,0 +1,3 @@
1
+ ruby:
2
+ enabled: true
3
+ config_file: .rubocop.yml
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,18 @@
1
+ inherit_from:
2
+ - https://raw.githubusercontent.com/riboseinc/oss-guides/main/ci/rubocop.yml
3
+ - .rubocop_todo.yml
4
+
5
+ plugins:
6
+ - rubocop-performance
7
+ - rubocop-rake
8
+ - rubocop-rspec
9
+
10
+ AllCops:
11
+ TargetRubyVersion: 3.2
12
+ NewCops: enable
13
+ Exclude:
14
+ - 'vendor/**/*'
15
+ - 'metanorma-mirror-*/**/*'
16
+
17
+ Lint/UnusedMethodArgument:
18
+ AllowUnusedKeywordArguments: true
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,297 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2026-06-05 10:03:10 UTC using RuboCop version 1.86.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1072
10
+ # This cop supports safe autocorrection (--autocorrect).
11
+ # Configuration parameters: Max, AllowHeredoc, AllowURI, AllowQualifiedName, URISchemes, AllowRBSInlineAnnotation, AllowCopDirectives, AllowedPatterns, SplitStrings.
12
+ # URISchemes: http, https
13
+ Layout/LineLength:
14
+ Enabled: false
15
+
16
+ # Offense count: 9
17
+ # Configuration parameters: IgnoreLiteralBranches, IgnoreConstantBranches, IgnoreDuplicateElseBranch.
18
+ Lint/DuplicateBranch:
19
+ Exclude:
20
+ - 'lib/expressir/commands/package.rb'
21
+ - 'lib/expressir/coverage.rb'
22
+ - 'lib/expressir/express/builder.rb'
23
+ - 'lib/expressir/express/formatters/declarations_formatter.rb'
24
+ - 'lib/expressir/express/remark_attacher.rb'
25
+ - 'lib/expressir/model/search_engine.rb'
26
+
27
+ # Offense count: 1
28
+ Lint/DuplicateCaseCondition:
29
+ Exclude:
30
+ - 'lib/expressir/commands/package.rb'
31
+
32
+ # Offense count: 1
33
+ Lint/DuplicateMethods:
34
+ Exclude:
35
+ - 'lib/expressir/commands/validate_ascii.rb'
36
+
37
+ # Offense count: 2
38
+ # Configuration parameters: AllowedPatterns.
39
+ # AllowedPatterns: (?-mix:(exactly|at_least|at_most)\(\d+\)\.times)
40
+ Lint/UnreachableLoop:
41
+ Exclude:
42
+ - 'lib/expressir/model/dependency_resolver.rb'
43
+
44
+ # Offense count: 3
45
+ # This cop supports safe autocorrection (--autocorrect).
46
+ # Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods, IgnoreNotImplementedMethods, NotImplementedExceptions.
47
+ # NotImplementedExceptions: NotImplementedError
48
+ Lint/UnusedMethodArgument:
49
+ Exclude:
50
+ - 'lib/expressir/express/cache.rb'
51
+ - 'lib/expressir/express/parser.rb'
52
+
53
+ # Offense count: 2
54
+ Lint/UselessConstantScoping:
55
+ Exclude:
56
+ - 'lib/expressir/express/remark_attacher.rb'
57
+
58
+ # Offense count: 240
59
+ # Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes, Max.
60
+ Metrics/AbcSize:
61
+ Enabled: false
62
+
63
+ # Offense count: 10
64
+ # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns, inherit_mode.
65
+ # AllowedMethods: refine
66
+ Metrics/BlockLength:
67
+ Max: 106
68
+
69
+ # Offense count: 14
70
+ # Configuration parameters: CountBlocks, CountModifierForms.
71
+ Metrics/BlockNesting:
72
+ Max: 6
73
+
74
+ # Offense count: 190
75
+ # Configuration parameters: AllowedMethods, AllowedPatterns, Max.
76
+ Metrics/CyclomaticComplexity:
77
+ Enabled: false
78
+
79
+ # Offense count: 290
80
+ # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
81
+ Metrics/MethodLength:
82
+ Max: 167
83
+
84
+ # Offense count: 6
85
+ # Configuration parameters: CountKeywordArgs, MaxOptionalParameters.
86
+ Metrics/ParameterLists:
87
+ Max: 8
88
+
89
+ # Offense count: 162
90
+ # Configuration parameters: AllowedMethods, AllowedPatterns, Max.
91
+ Metrics/PerceivedComplexity:
92
+ Enabled: false
93
+
94
+ # Offense count: 4
95
+ # Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames.
96
+ # AllowedNames: as, at, by, cc, db, id, if, in, io, ip, of, on, os, pp, to
97
+ Naming/MethodParameterName:
98
+ Exclude:
99
+ - 'lib/expressir/model/repository_validator.rb'
100
+
101
+ # Offense count: 3
102
+ # Configuration parameters: Mode, AllowedMethods, AllowedPatterns, AllowBangMethods, WaywardPredicates.
103
+ # AllowedMethods: call
104
+ # WaywardPredicates: infinite?, nonzero?
105
+ Naming/PredicateMethod:
106
+ Exclude:
107
+ - 'lib/expressir/model/indexes/reference_index.rb'
108
+ - 'lib/expressir/model/search_engine.rb'
109
+
110
+ # Offense count: 11
111
+ # Configuration parameters: EnforcedStyle, CheckMethodNames, CheckSymbols, AllowedIdentifiers, AllowedPatterns.
112
+ # SupportedStyles: snake_case, normalcase, non_integer
113
+ # AllowedIdentifiers: TLS1_1, TLS1_2, capture3, iso8601, rfc1123_date, rfc822, rfc2822, rfc3339, x86_64
114
+ Naming/VariableNumber:
115
+ Exclude:
116
+ - 'lib/expressir/commands/validate_ascii.rb'
117
+ - 'spec/expressir/commands/validate_ascii_spec.rb'
118
+ - 'spec/expressir/express/pretty_formatter_spec.rb'
119
+
120
+ # Offense count: 6
121
+ # Configuration parameters: MinSize.
122
+ Performance/CollectionLiteralInLoop:
123
+ Exclude:
124
+ - 'benchmark/memory_profiler.rb'
125
+ - 'lib/expressir/express/parser.rb'
126
+ - 'lib/expressir/express/remark_attacher.rb'
127
+ - 'lib/expressir/express/streaming_builder.rb'
128
+
129
+ # Offense count: 8
130
+ Performance/FixedSize:
131
+ Exclude:
132
+ - 'lib/expressir/express/formatters/data_types_formatter.rb'
133
+ - 'lib/expressir/express/formatters/declarations_formatter.rb'
134
+ - 'lib/expressir/express/parser.rb'
135
+
136
+ # Offense count: 6
137
+ Performance/MapMethodChain:
138
+ Exclude:
139
+ - 'lib/expressir/commands/coverage.rb'
140
+ - 'spec/expressir/commands/coverage_ignore_files_spec.rb'
141
+ - 'spec/expressir/coverage_spec.rb'
142
+
143
+ # Offense count: 1
144
+ RSpec/AnyInstance:
145
+ Exclude:
146
+ - 'spec/expressir/commands/package_edge_cases_spec.rb'
147
+ - 'spec/expressir/express/remark_attacher_performance_spec.rb'
148
+
149
+ # Offense count: 11
150
+ # Configuration parameters: Prefixes, AllowedPatterns.
151
+ # Prefixes: when, with, without
152
+ RSpec/ContextWording:
153
+ Exclude:
154
+ - 'spec/expressir/commands/manifest_spec.rb'
155
+ - 'spec/expressir/commands/package_nil_guards_spec.rb'
156
+ - 'spec/expressir/commands/validate_ascii_spec.rb'
157
+ - 'spec/expressir/model/repository_spec.rb'
158
+
159
+ # Offense count: 2
160
+ # Configuration parameters: IgnoredMetadata.
161
+ RSpec/DescribeClass:
162
+ Exclude:
163
+ - '**/spec/features/**/*'
164
+ - '**/spec/requests/**/*'
165
+ - '**/spec/routing/**/*'
166
+ - '**/spec/system/**/*'
167
+ - '**/spec/views/**/*'
168
+ - 'spec/expressir/express/formatter_architecture_spec.rb'
169
+ - 'spec/expressir/integration/package_roundtrip_spec.rb'
170
+
171
+ # Offense count: 6
172
+ RSpec/DescribeMethod:
173
+ Exclude:
174
+ - 'spec/expressir/commands/package_edge_cases_spec.rb'
175
+ - 'spec/expressir/commands/package_fixtures_spec.rb'
176
+ - 'spec/expressir/commands/package_nil_guards_spec.rb'
177
+ - 'spec/expressir/commands/package_nil_scenarios_spec.rb'
178
+ - 'spec/expressir/model/repository_statistics_spec.rb'
179
+ - 'spec/expressir/model/search_engine_advanced_spec.rb'
180
+
181
+ # Offense count: 480
182
+ # Configuration parameters: CountAsOne.
183
+ RSpec/ExampleLength:
184
+ Max: 122
185
+
186
+ # Offense count: 44
187
+ # Configuration parameters: Max, AllowedIdentifiers, AllowedPatterns.
188
+ RSpec/IndexedLet:
189
+ Exclude:
190
+ - 'spec/expressir/model/data_types/array_spec.rb'
191
+ - 'spec/expressir/model/data_types/bag_spec.rb'
192
+ - 'spec/expressir/model/data_types/binary_spec.rb'
193
+ - 'spec/expressir/model/data_types/real_spec.rb'
194
+ - 'spec/expressir/model/data_types/set_spec.rb'
195
+ - 'spec/expressir/model/data_types/string_spec.rb'
196
+ - 'spec/expressir/model/indexes/entity_index_spec.rb'
197
+ - 'spec/expressir/model/indexes/reference_index_spec.rb'
198
+ - 'spec/expressir/model/indexes/type_index_spec.rb'
199
+ - 'spec/expressir/model/repository_spec.rb'
200
+ - 'spec/expressir/model/repository_statistics_spec.rb'
201
+ - 'spec/expressir/model/repository_validator_spec.rb'
202
+ - 'spec/expressir/model/search_engine_advanced_spec.rb'
203
+
204
+ # Offense count: 1
205
+ # Configuration parameters: AssignmentOnly.
206
+ RSpec/InstanceVariable:
207
+ Exclude:
208
+ - 'spec/expressir/model/interface_validator_spec.rb'
209
+
210
+ # Offense count: 1
211
+ # This cop supports safe autocorrection (--autocorrect).
212
+ RSpec/IteratedExpectation:
213
+ Exclude:
214
+ - 'spec/expressir/model/search_engine_advanced_spec.rb'
215
+
216
+ # Offense count: 1
217
+ # Configuration parameters: .
218
+ # SupportedStyles: have_received, receive
219
+ RSpec/MessageSpies:
220
+ EnforcedStyle: receive
221
+
222
+ # Offense count: 596
223
+ RSpec/MultipleExpectations:
224
+ Max: 114
225
+
226
+ # Offense count: 111
227
+ # Configuration parameters: AllowSubject.
228
+ RSpec/MultipleMemoizedHelpers:
229
+ Max: 18
230
+
231
+ # Offense count: 5
232
+ # Configuration parameters: AllowedGroups.
233
+ RSpec/NestedGroups:
234
+ Max: 4
235
+
236
+ # Offense count: 1
237
+ RSpec/RemoveConst:
238
+ Exclude:
239
+ - 'spec/expressir/commands/package_nil_scenarios_spec.rb'
240
+
241
+ # Offense count: 12
242
+ RSpec/RepeatedExample:
243
+ Exclude:
244
+ - 'spec/expressir/commands/package_fixtures_spec.rb'
245
+ - 'spec/expressir/model/data_types/logical_spec.rb'
246
+ - 'spec/expressir/model/interface_validator_spec.rb'
247
+
248
+ # Offense count: 7
249
+ # Configuration parameters: CustomTransform, IgnoreMethods, IgnoreMetadata, InflectorPath, EnforcedInflector.
250
+ # SupportedInflectors: default, active_support
251
+ RSpec/SpecFilePathFormat:
252
+ Exclude:
253
+ - '**/spec/routing/**/*'
254
+ - 'spec/expressir/commands/package_edge_cases_spec.rb'
255
+ - 'spec/expressir/commands/package_fixtures_spec.rb'
256
+ - 'spec/expressir/commands/package_nil_guards_spec.rb'
257
+ - 'spec/expressir/commands/package_nil_scenarios_spec.rb'
258
+ - 'spec/expressir/express/visitor/remark_attacher_spec.rb'
259
+ - 'spec/expressir/model/repository_statistics_spec.rb'
260
+ - 'spec/expressir/model/search_engine_advanced_spec.rb'
261
+
262
+ # Offense count: 2
263
+ Security/MarshalLoad:
264
+ Exclude:
265
+ - 'lib/expressir/package/reader.rb'
266
+
267
+ # Offense count: 1
268
+ # This cop supports safe autocorrection (--autocorrect).
269
+ # Configuration parameters: EnforcedStyle, AllowComments.
270
+ # SupportedStyles: empty, nil, both
271
+ Style/EmptyElse:
272
+ Exclude:
273
+ - 'lib/expressir/commands/changes_validate.rb'
274
+
275
+ # Offense count: 40
276
+ # This cop supports safe autocorrection (--autocorrect).
277
+ # Configuration parameters: MaxUnannotatedPlaceholdersAllowed, Mode, AllowedMethods, AllowedPatterns.
278
+ # SupportedStyles: annotated, template, unannotated
279
+ Style/FormatStringToken:
280
+ EnforcedStyle: unannotated
281
+
282
+ # Offense count: 1
283
+ # Configuration parameters: MinBranchesCount.
284
+ Style/HashLikeCase:
285
+ Exclude:
286
+ - 'lib/expressir/express/remark_attacher.rb'
287
+
288
+ # Offense count: 1
289
+ Style/MixinUsage:
290
+ Exclude:
291
+ - 'benchmark/srl_benchmark.rb'
292
+
293
+ # Offense count: 3
294
+ # Configuration parameters: AllowedClasses.
295
+ Style/OneClassPerFile:
296
+ Exclude:
297
+ - 'benchmark/srl_benchmark.rb'
data/CHANGELOG.md ADDED
@@ -0,0 +1,159 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Breaking Changes
11
+
12
+ #### Repository Structure Change
13
+
14
+ The `Repository` class now uses a `files` attribute containing `ExpFile` objects instead of a direct `schemas` attribute.
15
+
16
+ **Old structure:**
17
+ ```ruby
18
+ repository = Expressir::Model::Repository.new
19
+ repository.schemas << schema1
20
+ repository.schemas << schema2
21
+ ```
22
+
23
+ **New structure:**
24
+ ```ruby
25
+ repository = Expressir::Model::Repository.new
26
+ repository.add_schema(schema1)
27
+ repository.add_schema(schema2)
28
+
29
+ # Or with files:
30
+ exp_file = Expressir::Express::Parser.from_file("schema.exp")
31
+ repository.files << exp_file
32
+ ```
33
+
34
+ #### ExpFile Model Introduced
35
+
36
+ A new `ExpFile` class represents a single EXPRESS file with its own preamble remarks and schemas:
37
+
38
+ ```ruby
39
+ # ExpFile has:
40
+ # - path: the file path
41
+ # - schemas: array of schemas in the file
42
+ # - untagged_remarks: file-level preamble remarks
43
+
44
+ exp_file = Expressir::Model::ExpFile.new(path: "my_schema.exp")
45
+ exp_file.schemas = [schema]
46
+ exp_file.untagged_remarks = [remark_info]
47
+ ```
48
+
49
+ #### Parser Return Type Changed
50
+
51
+ `Expressir::Express::Parser.from_file` now returns an `ExpFile` instead of a `Repository`:
52
+
53
+ ```ruby
54
+ # Old: returned Repository
55
+ # New: returns ExpFile
56
+ exp_file = Expressir::Express::Parser.from_file("schema.exp")
57
+ exp_file.path # => "schema.exp"
58
+ exp_file.schemas # => [#<Expressir::Model::Declarations::Schema...>]
59
+ ```
60
+
61
+ #### Error Class Changes
62
+
63
+ - `InvalidSchemaManifestError` → Use `ManifestValidationError` instead
64
+ - `Expressir::Express::CacheVersionMismatchError` → Use `Expressir::Express::Error::CacheVersionMismatchError`
65
+
66
+ #### RemarkInfo Required
67
+
68
+ Remark formatters now require `RemarkInfo` objects instead of strings:
69
+
70
+ ```ruby
71
+ # Old:
72
+ formatter.format_preamble_remark("This is a remark")
73
+
74
+ # New:
75
+ remark = Expressir::Model::RemarkInfo.new(text: "This is a remark")
76
+ formatter.format_preamble_remark(remark)
77
+ ```
78
+
79
+ ### Added
80
+
81
+ - `Expressir::Model::ExpFile` class for representing EXPRESS files
82
+ - `Expressir::Model::Concerns` module with marker modules for O(1) type checking:
83
+ - `HasRemarkItems` - types that can have remark_items children
84
+ - `ScopeContainer` - types that can contain declarations
85
+ - `HasInformalPropositions` - types supporting informal propositions
86
+ - `HasWhereRules` - types supporting where rules
87
+ - `Repository#add_schema(schema)` method for adding schemas
88
+ - `Repository#files` attribute for storing ExpFile objects
89
+ - `Package::Builder#normalize_repository` ensures proper serialization format
90
+
91
+ ### Changed
92
+
93
+ - `Repository#schemas` now returns schemas from both `files` and internal storage
94
+ - `Parser.from_file` returns `ExpFile` instead of `Repository`
95
+ - `Parser.from_files` creates `Repository` with `ExpFile` objects
96
+ - `Parser.from_exp` returns `ExpFile` instead of `Repository`
97
+ - `format_repository` in formatters handles both file-based and direct schemas
98
+ - Preamble remarks now attach to `ExpFile` instead of first `Schema`
99
+
100
+ ### Removed
101
+
102
+ - All backward compatibility code for legacy serialized data
103
+ - `Repository#schemas=` writer (use `add_schema` instead)
104
+ - Legacy string handling in remark formatters
105
+ - `InvalidSchemaManifestError` alias (use `ManifestValidationError`)
106
+ - Legacy `@schemas` attribute migration in Repository
107
+ - Array-based type checking in `remark_attacher.rb` (replaced with module markers)
108
+
109
+ ### Migration Guide
110
+
111
+ #### Updating Code That Uses Repository
112
+
113
+ ```ruby
114
+ # Before:
115
+ repo = Expressir::Model::Repository.new
116
+ repo.schemas << schema
117
+
118
+ # After:
119
+ repo = Expressir::Model::Repository.new
120
+ repo.add_schema(schema)
121
+ ```
122
+
123
+ #### Updating Code That Parses Files
124
+
125
+ ```ruby
126
+ # Before:
127
+ repo = Expressir::Express::Parser.from_file("schema.exp")
128
+ schema = repo.schemas.first
129
+
130
+ # After:
131
+ exp_file = Expressir::Express::Parser.from_file("schema.exp")
132
+ schema = exp_file.schemas.first
133
+
134
+ # Or wrap in repository:
135
+ repo = Expressir::Model::Repository.new
136
+ repo.files << Expressir::Express::Parser.from_file("schema.exp")
137
+ ```
138
+
139
+ #### Updating Serialized Packages
140
+
141
+ Old `.ler` packages need to be regenerated with the new format:
142
+
143
+ ```ruby
144
+ # Load old package (will fail with new code)
145
+ # repo = Expressir::Model::Repository.from_package("old.ler")
146
+
147
+ # Regenerate by parsing original EXPRESS files
148
+ exp_file = Expressir::Express::Parser.from_file("schema.exp")
149
+ repo = Expressir::Model::Repository.new
150
+ repo.files << exp_file
151
+ repo.export_to_package("new.ler", name: "My Package", version: "1.0.0")
152
+ ```
153
+
154
+ ## [2.2.1] - 2024-03-14
155
+
156
+ ### Changed
157
+
158
+ - Refactored `require` to `autoload` pattern for better load performance
159
+ - Updated error handling to use error classes instead of `abort`
data/Gemfile ADDED
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gemspec
6
+
7
+ gem "canon"
8
+ gem "irb"
9
+ gem "lutaml-model", "0.8.76"
10
+ gem "openssl", "~> 3.0"
11
+ gem "rake"
12
+ gem "rake-compiler"
13
+ gem "rspec"
14
+ gem "rubocop"
15
+ gem "rubocop-performance"
16
+ gem "rubocop-rake"
17
+ gem "rubocop-rspec"
18
+ gem "yard"