expressir 1.2.10-aarch64-linux → 2.4.29-aarch64-linux

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 (467) hide show
  1. checksums.yaml +4 -4
  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 +10 -296
  9. data/.github/workflows/release.yml +26 -114
  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 +33 -1
  15. data/.rubocop.yml +11 -11
  16. data/.rubocop_todo.yml +297 -0
  17. data/CHANGELOG.md +159 -0
  18. data/Gemfile +15 -1
  19. data/README.adoc +2675 -47
  20. data/Rakefile +34 -10
  21. data/TODO.bugs/01-stale-transformer-autoload.md +39 -0
  22. data/TODO.bugs/02-parser-class-instance-vars.md +36 -0
  23. data/TODO.bugs/03-builder-mutable-state.md +43 -0
  24. data/TODO.bugs/04-formatter-public-send-dispatch.md +53 -0
  25. data/TODO.bugs/05-anonymous-formatter-subclass.md +45 -0
  26. data/TODO.bugs/06-collection-registry-single-source.md +53 -0
  27. data/TODO.bugs/07-require-relative-cleanup.md +42 -0
  28. data/TODO.bugs/08-require-expressir-in-commands.md +34 -0
  29. data/TODO.bugs/09-parser-split.md +53 -0
  30. data/TODO.bugs/10-to-s-override.md +42 -0
  31. data/TODO.bugs/11-parser-class-variables.md +39 -0
  32. data/TODO.bugs/12-marker-modules-vs-registry.md +64 -0
  33. data/TODO.bugs/13-string-literal-scanner-limitation.md +52 -0
  34. data/TODO.bugs/14-model-formatting-leak.md +30 -0
  35. data/TODO.bugs/15-expression-children-macro.md +27 -0
  36. data/TODO.bugs/16-pretty-formatter-duplication.md +28 -0
  37. data/TODO.bugs/17-snake-case-cache-mutable-constant.md +28 -0
  38. data/TODO.bugs/18-const-get-private-constants.md +30 -0
  39. data/TODO.bugs/19-format-methods-public.md +22 -0
  40. data/TODO.bugs/20-coverage-nested-entities-dedup.md +20 -0
  41. data/TODO.bugs/21-operator-tokens-secondary-dispatch.md +21 -0
  42. data/TODO.bugs/22-builder-fast-path-wrappers.md +32 -0
  43. data/TODO.bugs/23-coverage-inverse-maps.md +21 -0
  44. data/TODO.bugs/24-streaming-builder-complexity.md +19 -0
  45. data/TODO.bugs/25-debug-puts-in-production.md +21 -0
  46. data/TODO.bugs/26-generic-entity-children-misplaced.md +21 -0
  47. data/TODO.bugs/27-package-build-god-method.md +19 -0
  48. data/TODO.bugs/28-package-god-class.md +30 -0
  49. data/TODO.bugs/29-validate-ascii-god-class.md +24 -0
  50. data/TODO.bugs/30-unicode-map-extraction.md +19 -0
  51. data/TODO.bugs/README.md +43 -0
  52. data/TODO.max-perf/01-restore-ci-green.md +36 -0
  53. data/TODO.max-perf/02-streaming-parse-path.md +31 -0
  54. data/TODO.max-perf/03-cli-parallel-opt-in.md +27 -0
  55. data/TODO.max-perf/04-benchmark-harness.md +28 -0
  56. data/TODO.max-perf/05-parallel-fidelity-specs.md +22 -0
  57. data/TODO.max-perf/06-builder-cpu-audit.md +41 -0
  58. data/TODO.max-perf/07-upstream-parsanol-roadmap.md +27 -0
  59. data/TODO.max-perf/08-builder-build-perf.md +45 -0
  60. data/TODO.max-perf/09-grammar-cold-start.md +25 -0
  61. data/TODO.max-perf/10-parser-facade-hygiene.md +23 -0
  62. data/TODO.max-perf/11-ci-green-closeout.md +25 -0
  63. data/TODO.max-perf/12-require-boot-profile.md +25 -0
  64. data/TODO.max-perf/13-key-conversion-specs.md +26 -0
  65. data/TODO.max-perf/14-builder-call-handler-audit.md +28 -0
  66. data/TODO.parity-ee/00-overview.md +76 -0
  67. data/TODO.parity-ee/01-annex-g-rule-extraction.md +41 -0
  68. data/TODO.parity-ee/02-eeng-algorithm-inventory.md +8 -0
  69. data/TODO.parity-ee/03-eeng-oracle-harness.md +33 -0
  70. data/TODO.parity-ee/04-shtolo-concatenate.md +44 -0
  71. data/TODO.parity-ee/05-shtolo-longform-flatten.md +53 -0
  72. data/TODO.parity-ee/06-interface-scheduling-parity.md +47 -0
  73. data/TODO.parity-ee/07-semantic-checks-port.md +35 -0
  74. data/TODO.parity-ee/08-pretty-roundtrip-gate.md +27 -0
  75. data/TODO.parity-ee/09-smrl-index-and-listing.md +22 -0
  76. data/TODO.parity-ee/10-interface-dot-graph.md +21 -0
  77. data/TODO.parity-ee/11-import-eeng-tests.md +79 -0
  78. data/TODO.parity-ee/12-full-check-catalog.md +67 -0
  79. data/TODO.parity-ee/13-population-p21.md +54 -0
  80. data/TODO.parity-ee/14-shtolo-completion.md +44 -0
  81. data/TODO.parity-ee/15-part28-xml.md +51 -0
  82. data/TODO.parity-ee/16-compare-patch.md +48 -0
  83. data/TODO.parity-ee/17-official-tests.md +42 -0
  84. data/TODO.parity-ee/18-mim-mapping.md +47 -0
  85. data/TODO.parity-ee/19-architecture.md +97 -0
  86. data/TODO.parity-ee/parity-matrix.md +108 -0
  87. data/TODO.refpath-v2/00-overview.md +64 -0
  88. data/TODO.suma-improvements/00-overview.md +23 -0
  89. data/TODO.suma-improvements/01-prebuilt-platform-gems.md +33 -0
  90. data/TODO.suma-improvements/02-suma-e2e.md +39 -0
  91. data/TODO.suma-improvements/03-item-graph.md +22 -0
  92. data/TODO.suma-improvements/04-compiled-set-default.md +16 -0
  93. data/TODO.suma-improvements/05-validation-in-docs.md +17 -0
  94. data/TODO.suma-improvements/06-memory-remeasure.md +36 -0
  95. data/TODO.suma-improvements/07-part28-xml.md +15 -0
  96. data/TODO.suma-improvements/08-windows-gnu-toolchain.md +15 -0
  97. data/TODO.suma-improvements/09-checker-tranche3.md +13 -0
  98. data/TODO.suma-improvements/10-expressdoc.md +8 -0
  99. data/benchmark/srl_benchmark.rb +458 -0
  100. data/benchmark/srl_native_benchmark.rb +146 -0
  101. data/benchmark/srl_ruby_benchmark.rb +132 -0
  102. data/bin/rspec +2 -1
  103. data/docs/Gemfile +12 -0
  104. data/docs/_config.yml +141 -0
  105. data/docs/_guides/changes/changes-format.adoc +778 -0
  106. data/docs/_guides/changes/importing-eengine.adoc +898 -0
  107. data/docs/_guides/changes/index.adoc +396 -0
  108. data/docs/_guides/changes/programmatic-usage.adoc +1038 -0
  109. data/docs/_guides/changes/validating-changes.adoc +681 -0
  110. data/docs/_guides/cli/benchmark-performance.adoc +834 -0
  111. data/docs/_guides/cli/coverage-analysis.adoc +921 -0
  112. data/docs/_guides/cli/format-schemas.adoc +547 -0
  113. data/docs/_guides/cli/index.adoc +8 -0
  114. data/docs/_guides/cli/managing-changes.adoc +927 -0
  115. data/docs/_guides/cli/validate-ascii.adoc +645 -0
  116. data/docs/_guides/cli/validate-schemas.adoc +534 -0
  117. data/docs/_guides/formatter/formatter-architecture.adoc +401 -0
  118. data/docs/_guides/index.adoc +165 -0
  119. data/docs/_guides/ler/creating-packages.adoc +664 -0
  120. data/docs/_guides/ler/index.adoc +305 -0
  121. data/docs/_guides/ler/loading-packages.adoc +707 -0
  122. data/docs/_guides/ler/package-formats.adoc +748 -0
  123. data/docs/_guides/ler/querying-packages.adoc +826 -0
  124. data/docs/_guides/ler/step-packages.adoc +385 -0
  125. data/docs/_guides/ler/validating-packages.adoc +750 -0
  126. data/docs/_guides/liquid/basic-templates.adoc +813 -0
  127. data/docs/_guides/liquid/documentation-generation.adoc +1042 -0
  128. data/docs/_guides/liquid/drops-reference.adoc +829 -0
  129. data/docs/_guides/liquid/filters-and-tags.adoc +912 -0
  130. data/docs/_guides/liquid/index.adoc +468 -0
  131. data/docs/_guides/manifests/creating-manifests.adoc +483 -0
  132. data/docs/_guides/manifests/index.adoc +307 -0
  133. data/docs/_guides/manifests/resolving-manifests.adoc +557 -0
  134. data/docs/_guides/manifests/validating-manifests.adoc +713 -0
  135. data/docs/_guides/ruby-api/formatting-schemas.adoc +605 -0
  136. data/docs/_guides/ruby-api/index.adoc +257 -0
  137. data/docs/_guides/ruby-api/parsing-files.adoc +421 -0
  138. data/docs/_guides/ruby-api/search-engine.adoc +609 -0
  139. data/docs/_guides/ruby-api/working-with-repository.adoc +577 -0
  140. data/docs/_pages/data-model.adoc +665 -0
  141. data/docs/_pages/express-language.adoc +506 -0
  142. data/docs/_pages/getting-started.adoc +414 -0
  143. data/docs/_pages/index.adoc +116 -0
  144. data/docs/_pages/introduction.adoc +256 -0
  145. data/docs/_pages/ler-packages.adoc +837 -0
  146. data/docs/_pages/parsers.adoc +709 -0
  147. data/docs/_pages/schema-manifests.adoc +431 -0
  148. data/docs/_references/index.adoc +228 -0
  149. data/docs/_tutorials/creating-ler-package.adoc +735 -0
  150. data/docs/_tutorials/documentation-coverage.adoc +795 -0
  151. data/docs/_tutorials/formatting-schemas.adoc +89 -0
  152. data/docs/_tutorials/index.adoc +231 -0
  153. data/docs/_tutorials/liquid-templates.adoc +806 -0
  154. data/docs/_tutorials/parsing-your-first-schema.adoc +522 -0
  155. data/docs/_tutorials/querying-schemas.adoc +751 -0
  156. data/docs/_tutorials/working-with-multiple-schemas.adoc +676 -0
  157. data/docs/index.adoc +242 -0
  158. data/docs/lychee.toml +90 -0
  159. data/examples/demo_ler_usage.sh +86 -0
  160. data/examples/ler/README.md +111 -0
  161. data/examples/ler/simple_example.ler +0 -0
  162. data/examples/ler/simple_schema.exp +33 -0
  163. data/examples/ler_build.rb +75 -0
  164. data/examples/ler_cli.rb +79 -0
  165. data/examples/ler_demo_complete.rb +276 -0
  166. data/examples/ler_query.rb +91 -0
  167. data/examples/ler_query_examples.rb +305 -0
  168. data/examples/ler_stats.rb +81 -0
  169. data/examples/phase3_demo.rb +159 -0
  170. data/examples/query_demo_simple.rb +131 -0
  171. data/exe/expressir +6 -17
  172. data/exe/expressir-format +14 -0
  173. data/exe/{format-test → expressir-format-test} +8 -7
  174. data/expressir.gemspec +50 -37
  175. data/lib/expressir/3.2/expressir_core.so +0 -0
  176. data/lib/expressir/3.3/expressir_core.so +0 -0
  177. data/lib/expressir/3.4/expressir_core.so +0 -0
  178. data/lib/expressir/4.0/expressir_core.so +0 -0
  179. data/lib/expressir/benchmark.rb +310 -0
  180. data/lib/expressir/changes/item_change.rb +20 -0
  181. data/lib/expressir/changes/mapping_change.rb +16 -0
  182. data/lib/expressir/changes/schema_change.rb +85 -0
  183. data/lib/expressir/changes/version_change.rb +26 -0
  184. data/lib/expressir/changes.rb +9 -0
  185. data/lib/expressir/cli.rb +138 -11
  186. data/lib/expressir/commands/base.rb +25 -0
  187. data/lib/expressir/commands/benchmark.rb +59 -0
  188. data/lib/expressir/commands/benchmark_cache.rb +80 -0
  189. data/lib/expressir/commands/changes.rb +34 -0
  190. data/lib/expressir/commands/changes_import_eengine.rb +146 -0
  191. data/lib/expressir/commands/changes_validate.rb +63 -0
  192. data/lib/expressir/commands/check.rb +56 -0
  193. data/lib/expressir/commands/clean.rb +20 -0
  194. data/lib/expressir/commands/coverage.rb +458 -0
  195. data/lib/expressir/commands/expand.rb +26 -0
  196. data/lib/expressir/commands/file_violations.rb +70 -0
  197. data/lib/expressir/commands/fix.rb +33 -0
  198. data/lib/expressir/commands/flatten.rb +29 -0
  199. data/lib/expressir/commands/format.rb +43 -0
  200. data/lib/expressir/commands/manifest.rb +420 -0
  201. data/lib/expressir/commands/mapping_validate.rb +68 -0
  202. data/lib/expressir/commands/non_ascii_character.rb +49 -0
  203. data/lib/expressir/commands/non_ascii_violation_collection.rb +301 -0
  204. data/lib/expressir/commands/package.rb +1222 -0
  205. data/lib/expressir/commands/parity_inputs.rb +160 -0
  206. data/lib/expressir/commands/validate.rb +106 -0
  207. data/lib/expressir/commands/validate_ascii.rb +94 -0
  208. data/lib/expressir/commands/validate_load.rb +91 -0
  209. data/lib/expressir/commands/version.rb +9 -0
  210. data/lib/expressir/commands/xsd.rb +23 -0
  211. data/lib/expressir/commands.rb +30 -0
  212. data/lib/expressir/config.rb +40 -3
  213. data/lib/expressir/coverage.rb +510 -0
  214. data/lib/expressir/eengine/arm_compare_report.rb +23 -0
  215. data/lib/expressir/eengine/changes_section.rb +16 -0
  216. data/lib/expressir/eengine/compare_report.rb +69 -0
  217. data/lib/expressir/eengine/mim_compare_report.rb +23 -0
  218. data/lib/expressir/eengine/modified_object.rb +21 -0
  219. data/lib/expressir/eengine.rb +9 -0
  220. data/lib/expressir/errors.rb +113 -0
  221. data/lib/expressir/express/adoc_hyperlink_formatter.rb +30 -0
  222. data/lib/expressir/express/adoc_source_formatter.rb +12 -0
  223. data/lib/expressir/express/ast_key_converter.rb +114 -0
  224. data/lib/expressir/express/builder.rb +277 -0
  225. data/lib/expressir/express/builder_context.rb +22 -0
  226. data/lib/expressir/express/builder_registry.rb +397 -0
  227. data/lib/expressir/express/builders/attribute_decl_builder.rb +32 -0
  228. data/lib/expressir/express/builders/built_in_builder.rb +75 -0
  229. data/lib/expressir/express/builders/constant_builder.rb +108 -0
  230. data/lib/expressir/express/builders/declaration_builder.rb +20 -0
  231. data/lib/expressir/express/builders/derive_clause_builder.rb +14 -0
  232. data/lib/expressir/express/builders/derived_attr_builder.rb +28 -0
  233. data/lib/expressir/express/builders/domain_rule_builder.rb +21 -0
  234. data/lib/expressir/express/builders/entity_decl_builder.rb +116 -0
  235. data/lib/expressir/express/builders/explicit_attr_builder.rb +49 -0
  236. data/lib/expressir/express/builders/expression_builder.rb +416 -0
  237. data/lib/expressir/express/builders/function_decl_builder.rb +86 -0
  238. data/lib/expressir/express/builders/helpers.rb +148 -0
  239. data/lib/expressir/express/builders/interface_builder.rb +151 -0
  240. data/lib/expressir/express/builders/inverse_attr_builder.rb +43 -0
  241. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +30 -0
  242. data/lib/expressir/express/builders/inverse_clause_builder.rb +14 -0
  243. data/lib/expressir/express/builders/literal_builder.rb +93 -0
  244. data/lib/expressir/express/builders/procedure_decl_builder.rb +82 -0
  245. data/lib/expressir/express/builders/qualifier_builder.rb +102 -0
  246. data/lib/expressir/express/builders/reference_builder.rb +18 -0
  247. data/lib/expressir/express/builders/rule_decl_builder.rb +97 -0
  248. data/lib/expressir/express/builders/schema_body_decl_builder.rb +18 -0
  249. data/lib/expressir/express/builders/schema_decl_builder.rb +56 -0
  250. data/lib/expressir/express/builders/schema_version_builder.rb +34 -0
  251. data/lib/expressir/express/builders/simple_id_builder.rb +17 -0
  252. data/lib/expressir/express/builders/statement_builder.rb +243 -0
  253. data/lib/expressir/express/builders/subtype_constraint_builder.rb +166 -0
  254. data/lib/expressir/express/builders/syntax_builder.rb +30 -0
  255. data/lib/expressir/express/builders/type_builder.rb +238 -0
  256. data/lib/expressir/express/builders/type_decl_builder.rb +26 -0
  257. data/lib/expressir/express/builders/unique_clause_builder.rb +20 -0
  258. data/lib/expressir/express/builders/unique_rule_builder.rb +41 -0
  259. data/lib/expressir/express/builders/where_clause_builder.rb +20 -0
  260. data/lib/expressir/express/builders.rb +55 -0
  261. data/lib/expressir/express/cache.rb +43 -18
  262. data/lib/expressir/express/checker.rb +812 -0
  263. data/lib/expressir/express/concatenator.rb +79 -0
  264. data/lib/expressir/express/core.rb +95 -0
  265. data/lib/expressir/express/error.rb +124 -0
  266. data/lib/expressir/express/formatter.rb +89 -1548
  267. data/lib/expressir/express/formatters/data_types_formatter.rb +362 -0
  268. data/lib/expressir/express/formatters/declarations_formatter.rb +753 -0
  269. data/lib/expressir/express/formatters/expressions_formatter.rb +180 -0
  270. data/lib/expressir/express/formatters/literals_formatter.rb +55 -0
  271. data/lib/expressir/express/formatters/references_formatter.rb +53 -0
  272. data/lib/expressir/express/formatters/remark_formatter.rb +270 -0
  273. data/lib/expressir/express/formatters/remark_item_formatter.rb +28 -0
  274. data/lib/expressir/express/formatters/statements_formatter.rb +272 -0
  275. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +54 -0
  276. data/lib/expressir/express/formatters.rb +22 -0
  277. data/lib/expressir/express/grammar/parser.rb +712 -0
  278. data/lib/expressir/express/grammar.rb +11 -0
  279. data/lib/expressir/express/hyperlink_formatter.rb +4 -5
  280. data/lib/expressir/express/interface_dot.rb +105 -0
  281. data/lib/expressir/express/lazy_repository.rb +211 -0
  282. data/lib/expressir/express/line_map.rb +48 -0
  283. data/lib/expressir/express/listing.rb +174 -0
  284. data/lib/expressir/express/model_traversal.rb +42 -0
  285. data/lib/expressir/express/model_visitor.rb +11 -10
  286. data/lib/expressir/express/node_position_index.rb +342 -0
  287. data/lib/expressir/express/parallel_files.rb +229 -0
  288. data/lib/expressir/express/parser.rb +501 -62
  289. data/lib/expressir/express/pretty_formatter.rb +586 -0
  290. data/lib/expressir/express/pretty_gate.rb +61 -0
  291. data/lib/expressir/express/refs_overlay.rb +47 -0
  292. data/lib/expressir/express/remark_attacher.rb +1098 -0
  293. data/lib/expressir/express/remark_overlay.rb +86 -0
  294. data/lib/expressir/express/remark_scanner.rb +245 -0
  295. data/lib/expressir/express/resolve_references_model_visitor.rb +7 -9
  296. data/lib/expressir/express/schema_block_scanner.rb +137 -0
  297. data/lib/expressir/express/schema_head_formatter.rb +4 -5
  298. data/lib/expressir/express/schema_plain_source_formatter.rb +11 -0
  299. data/lib/expressir/express/schema_source_formatter.rb +15 -0
  300. data/lib/expressir/express/scope_resolver.rb +223 -0
  301. data/lib/expressir/express/self_schema_reference.rb +126 -0
  302. data/lib/expressir/express/shtolo.rb +679 -0
  303. data/lib/expressir/express/smrl_xml.rb +125 -0
  304. data/lib/expressir/express/source_formatter.rb +15 -0
  305. data/lib/expressir/express/streaming_builder.rb +435 -0
  306. data/lib/expressir/express/xsd.rb +259 -0
  307. data/lib/expressir/express.rb +53 -0
  308. data/lib/expressir/liquid.rb +1 -0
  309. data/lib/expressir/manifest/resolver.rb +210 -0
  310. data/lib/expressir/manifest/validator.rb +192 -0
  311. data/lib/expressir/manifest.rb +6 -0
  312. data/lib/expressir/mapping/refpath.rb +857 -0
  313. data/lib/expressir/mapping.rb +253 -0
  314. data/lib/expressir/model/cache.rb +10 -9
  315. data/lib/expressir/model/concerns.rb +42 -0
  316. data/lib/expressir/model/data_types/aggregate.rb +8 -13
  317. data/lib/expressir/model/data_types/array.rb +15 -21
  318. data/lib/expressir/model/data_types/bag.rb +11 -15
  319. data/lib/expressir/model/data_types/binary.rb +9 -12
  320. data/lib/expressir/model/data_types/boolean.rb +7 -2
  321. data/lib/expressir/model/data_types/enumeration.rb +11 -15
  322. data/lib/expressir/model/data_types/enumeration_item.rb +5 -7
  323. data/lib/expressir/model/data_types/generic.rb +6 -8
  324. data/lib/expressir/model/data_types/generic_entity.rb +11 -13
  325. data/lib/expressir/model/data_types/integer.rb +7 -2
  326. data/lib/expressir/model/data_types/list.rb +13 -18
  327. data/lib/expressir/model/data_types/logical.rb +7 -2
  328. data/lib/expressir/model/data_types/number.rb +7 -2
  329. data/lib/expressir/model/data_types/real.rb +7 -9
  330. data/lib/expressir/model/data_types/select.rb +13 -18
  331. data/lib/expressir/model/data_types/set.rb +11 -15
  332. data/lib/expressir/model/data_types/string.rb +9 -12
  333. data/lib/expressir/model/data_types.rb +25 -0
  334. data/lib/expressir/model/declarations/attribute.rb +19 -28
  335. data/lib/expressir/model/declarations/constant.rb +10 -16
  336. data/lib/expressir/model/declarations/derived_attribute.rb +25 -0
  337. data/lib/expressir/model/declarations/entity.rb +39 -30
  338. data/lib/expressir/model/declarations/function.rb +32 -40
  339. data/lib/expressir/model/declarations/informal_proposition_rule.rb +25 -0
  340. data/lib/expressir/model/declarations/interface.rb +25 -16
  341. data/lib/expressir/model/declarations/interface_item.rb +9 -11
  342. data/lib/expressir/model/declarations/interfaced_item.rb +15 -19
  343. data/lib/expressir/model/declarations/inverse_attribute.rb +25 -0
  344. data/lib/expressir/model/declarations/parameter.rb +10 -16
  345. data/lib/expressir/model/declarations/procedure.rb +30 -37
  346. data/lib/expressir/model/declarations/remark_item.rb +11 -11
  347. data/lib/expressir/model/declarations/rule.rb +38 -43
  348. data/lib/expressir/model/declarations/schema.rb +162 -64
  349. data/lib/expressir/model/declarations/schema_version.rb +8 -11
  350. data/lib/expressir/model/declarations/schema_version_item.rb +8 -11
  351. data/lib/expressir/model/declarations/subtype_constraint.rb +14 -22
  352. data/lib/expressir/model/declarations/type.rb +18 -18
  353. data/lib/expressir/model/declarations/unique_rule.rb +8 -13
  354. data/lib/expressir/model/declarations/variable.rb +10 -16
  355. data/lib/expressir/model/declarations/where_rule.rb +8 -13
  356. data/lib/expressir/model/declarations.rb +31 -0
  357. data/lib/expressir/model/dependency_resolver.rb +268 -0
  358. data/lib/expressir/model/exp_file.rb +42 -0
  359. data/lib/expressir/model/expressions/aggregate_initializer.rb +8 -9
  360. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +10 -12
  361. data/lib/expressir/model/expressions/binary_expression.rb +42 -36
  362. data/lib/expressir/model/expressions/entity_constructor.rb +10 -12
  363. data/lib/expressir/model/expressions/function_call.rb +10 -12
  364. data/lib/expressir/model/expressions/interval.rb +18 -23
  365. data/lib/expressir/model/expressions/query_expression.rb +11 -15
  366. data/lib/expressir/model/expressions/unary_expression.rb +13 -15
  367. data/lib/expressir/model/expressions.rb +18 -0
  368. data/lib/expressir/model/identifier.rb +18 -26
  369. data/lib/expressir/model/indexes/entity_index.rb +103 -0
  370. data/lib/expressir/model/indexes/item_graph.rb +185 -0
  371. data/lib/expressir/model/indexes/reference_index.rb +148 -0
  372. data/lib/expressir/model/indexes/type_index.rb +149 -0
  373. data/lib/expressir/model/indexes.rb +12 -0
  374. data/lib/expressir/model/interface_validator.rb +384 -0
  375. data/lib/expressir/model/literals/binary.rb +7 -9
  376. data/lib/expressir/model/literals/integer.rb +7 -9
  377. data/lib/expressir/model/literals/logical.rb +10 -12
  378. data/lib/expressir/model/literals/real.rb +7 -9
  379. data/lib/expressir/model/literals/string.rb +10 -12
  380. data/lib/expressir/model/literals.rb +13 -0
  381. data/lib/expressir/model/model_element.rb +286 -117
  382. data/lib/expressir/model/references/attribute_reference.rb +9 -12
  383. data/lib/expressir/model/references/group_reference.rb +9 -12
  384. data/lib/expressir/model/references/index_reference.rb +11 -15
  385. data/lib/expressir/model/references/simple_reference.rb +11 -14
  386. data/lib/expressir/model/references.rb +12 -0
  387. data/lib/expressir/model/remark_format.rb +17 -0
  388. data/lib/expressir/model/remark_info.rb +92 -0
  389. data/lib/expressir/model/remark_placement.rb +42 -0
  390. data/lib/expressir/model/repository.rb +472 -12
  391. data/lib/expressir/model/repository_validator.rb +293 -0
  392. data/lib/expressir/model/search_engine.rb +551 -0
  393. data/lib/expressir/model/statements/alias.rb +12 -16
  394. data/lib/expressir/model/statements/assignment.rb +12 -11
  395. data/lib/expressir/model/statements/case.rb +31 -14
  396. data/lib/expressir/model/statements/case_action.rb +9 -11
  397. data/lib/expressir/model/statements/compound.rb +10 -8
  398. data/lib/expressir/model/statements/escape.rb +10 -2
  399. data/lib/expressir/model/statements/if.rb +15 -14
  400. data/lib/expressir/model/statements/null.rb +10 -2
  401. data/lib/expressir/model/statements/procedure_call.rb +11 -11
  402. data/lib/expressir/model/statements/repeat.rb +21 -28
  403. data/lib/expressir/model/statements/return.rb +9 -8
  404. data/lib/expressir/model/statements/skip.rb +10 -2
  405. data/lib/expressir/model/statements.rb +20 -0
  406. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +13 -17
  407. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +7 -9
  408. data/lib/expressir/model/supertype_expressions.rb +12 -0
  409. data/lib/expressir/model.rb +38 -78
  410. data/lib/expressir/package/builder.rb +231 -0
  411. data/lib/expressir/package/metadata.rb +79 -0
  412. data/lib/expressir/package/reader.rb +149 -0
  413. data/lib/expressir/package.rb +8 -0
  414. data/lib/expressir/schema_manifest.rb +159 -0
  415. data/lib/expressir/schema_manifest_entry.rb +15 -0
  416. data/lib/expressir/version.rb +6 -1
  417. data/lib/expressir.rb +79 -9
  418. data/lib/tasks/verify_remarks.rake +16 -0
  419. data/rakelib/native.rake +24 -0
  420. data/rakelib/oracle.rake +52 -0
  421. data/rakelib/verify_remarks.rake +16 -0
  422. metadata +431 -129
  423. data/.cross_rubies +0 -20
  424. data/.gitmodules +0 -6
  425. data/.yardopts +0 -11
  426. data/docs/development.md +0 -90
  427. data/exe/format +0 -18
  428. data/exe/generate-parser +0 -51
  429. data/lib/expressir/cli/ui.rb +0 -36
  430. data/lib/expressir/express/2.7/express_parser.so +0 -0
  431. data/lib/expressir/express/3.0/express_parser.so +0 -0
  432. data/lib/expressir/express/3.1/express_parser.so +0 -0
  433. data/lib/expressir/express/3.2/express_parser.so +0 -0
  434. data/lib/expressir/express/visitor.rb +0 -2588
  435. data/lib/expressir/model/data_type.rb +0 -9
  436. data/lib/expressir/model/declaration.rb +0 -9
  437. data/lib/expressir/model/expression.rb +0 -9
  438. data/lib/expressir/model/literal.rb +0 -9
  439. data/lib/expressir/model/reference.rb +0 -9
  440. data/lib/expressir/model/statement.rb +0 -9
  441. data/lib/expressir/model/supertype_expression.rb +0 -9
  442. data/rakelib/antlr4-native.rake +0 -161
  443. data/rakelib/cross-ruby.rake +0 -368
  444. data/spec/acceptance/version_spec.rb +0 -27
  445. data/spec/expressir/express/cache_spec.rb +0 -89
  446. data/spec/expressir/express/formatter_spec.rb +0 -173
  447. data/spec/expressir/express/parser_spec.rb +0 -141
  448. data/spec/expressir/model/model_element_spec.rb +0 -318
  449. data/spec/spec_helper.rb +0 -24
  450. data/spec/support/console_helper.rb +0 -29
  451. data/spec/syntax/multiple.exp +0 -23
  452. data/spec/syntax/multiple.yaml +0 -198
  453. data/spec/syntax/multiple_formatted.exp +0 -71
  454. data/spec/syntax/multiple_hyperlink_formatted.exp +0 -71
  455. data/spec/syntax/multiple_schema_head_hyperlink_formatted.exp +0 -13
  456. data/spec/syntax/remark.exp +0 -193
  457. data/spec/syntax/remark.yaml +0 -471
  458. data/spec/syntax/remark_formatted.exp +0 -228
  459. data/spec/syntax/single.exp +0 -4
  460. data/spec/syntax/single.yaml +0 -18
  461. data/spec/syntax/single_formatted.exp +0 -10
  462. data/spec/syntax/single_formatted.yaml +0 -36
  463. data/spec/syntax/syntax.exp +0 -333
  464. data/spec/syntax/syntax.yaml +0 -3509
  465. data/spec/syntax/syntax_formatted.exp +0 -902
  466. data/spec/syntax/syntax_hyperlink_formatted.exp +0 -902
  467. data/spec/syntax/syntax_schema_head_formatted.exp +0 -18
@@ -0,0 +1,268 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Model
5
+ # Resolves dependencies between EXPRESS schemas
6
+ # Handles USE FROM and REFERENCE FROM interfaces
7
+ # Detects circular dependencies
8
+ class DependencyResolver
9
+ # Exception for circular dependencies
10
+ class CircularDependencyError < StandardError
11
+ attr_reader :dependency_chain
12
+
13
+ def initialize(message, chain)
14
+ super(message)
15
+ @dependency_chain = chain
16
+ end
17
+ end
18
+
19
+ attr_reader :base_dirs, :schema_registry, :verbose, :unresolved
20
+
21
+ # Initialize resolver
22
+ # @param base_dirs [String, Array<String>] Base directories to search
23
+ # @param schema_registry [Hash] Manual schema name => path mappings
24
+ # @param verbose [Boolean] Enable verbose logging
25
+ def initialize(base_dirs: Dir.pwd, schema_registry: {}, verbose: false)
26
+ @base_dirs = Array(base_dirs).map { |d| File.expand_path(d) }
27
+ @schema_registry = schema_registry || {}
28
+ @verbose = verbose
29
+ @resolved_schemas = Set.new
30
+ @resolution_stack = []
31
+ @unresolved = []
32
+ @last_found_base_index = nil
33
+ @last_found_base_dir = nil
34
+ @multiple_matches = []
35
+ end
36
+
37
+ # Resolve all dependencies starting from root schema
38
+ # @param root_schema_path [String] Path to root schema file
39
+ # @return [Array<String>] Ordered list of schema file paths
40
+ def resolve_dependencies(root_schema_path)
41
+ @resolved_schemas.clear
42
+ @resolution_stack.clear
43
+ @unresolved.clear
44
+
45
+ resolve_recursive(File.expand_path(root_schema_path))
46
+ @resolved_schemas.to_a
47
+ end
48
+
49
+ # Extract interfaces from schema file using proper parsing
50
+ # @param schema_path [String] Path to schema file
51
+ # @return [Array<Hash>] List of interfaces with :kind, :schema_name
52
+ def extract_interfaces(schema_path)
53
+ interfaces = []
54
+
55
+ # Parse the schema file properly
56
+ repo = Expressir::Express::Parser.from_file(schema_path)
57
+
58
+ # Extract interfaces from first schema (file should contain one schema)
59
+ schema = repo.schemas.first
60
+ return interfaces unless schema&.interfaces
61
+
62
+ schema.interfaces.each do |interface|
63
+ kind = case interface.kind
64
+ when Expressir::Model::Declarations::Interface::USE
65
+ "USE"
66
+ when Expressir::Model::Declarations::Interface::REFERENCE
67
+ "REFERENCE"
68
+ else
69
+ interface.kind.first
70
+ end
71
+
72
+ interfaces << {
73
+ kind: kind,
74
+ schema_name: interface.schema.id,
75
+ }
76
+ end
77
+
78
+ interfaces
79
+ end
80
+
81
+ # Resolve schema location
82
+ # @param schema_name [String] Schema name to find
83
+ # @param kind [String] Interface kind ("USE" or "REFERENCE")
84
+ # @param current_path [String] Path of schema requesting the reference
85
+ # @return [String, nil] Path to schema file, or nil if not found
86
+ def resolve_schema_location(schema_name, _kind, _current_path)
87
+ # Check schema_registry first
88
+ if @schema_registry[schema_name]
89
+ registry_path = File.expand_path(@schema_registry[schema_name])
90
+ return registry_path if File.exist?(registry_path)
91
+ end
92
+
93
+ # Search ONLY in base_dirs recursively and collect ALL matches
94
+ all_matches = []
95
+ @base_dirs.each_with_index do |base_dir, index|
96
+ candidate = find_schema_in_directory(schema_name, base_dir)
97
+ if candidate
98
+ all_matches << { path: candidate, base_dir: base_dir, index: index }
99
+ end
100
+ end
101
+
102
+ # If no matches found, return nil
103
+ return nil if all_matches.empty?
104
+
105
+ # If multiple matches found, record for warning
106
+ if all_matches.size > 1
107
+ @multiple_matches << {
108
+ schema_name: schema_name,
109
+ matches: all_matches,
110
+ }
111
+ end
112
+
113
+ # Use the first match
114
+ first_match = all_matches.first
115
+ @last_found_base_index = first_match[:index]
116
+ @last_found_base_dir = first_match[:base_dir]
117
+
118
+ first_match[:path]
119
+ end
120
+
121
+ # Get resolution statistics
122
+ # @return [Hash] Statistics about resolved schemas
123
+ def statistics
124
+ {
125
+ total_schemas: @resolved_schemas.size,
126
+ schemas: @resolved_schemas.to_a,
127
+ base_dirs: @base_dirs,
128
+ multiple_matches: @multiple_matches,
129
+ }
130
+ end
131
+
132
+ private
133
+
134
+ # Resolve schema and its dependencies recursively
135
+ # @param schema_path [String] Path to schema file
136
+ # @return [void]
137
+ def resolve_recursive(schema_path)
138
+ return if @resolved_schemas.include?(schema_path)
139
+
140
+ # Check for circular dependency - schema-level circular references are valid in EXPRESS
141
+ if @resolution_stack.include?(schema_path)
142
+ # Schema is already being processed - this is a back-reference
143
+ # Skip re-processing; the schema will be added to resolved_schemas when its original pass completes
144
+ return
145
+ end
146
+
147
+ @resolution_stack.push(schema_path)
148
+
149
+ # Extract and resolve interfaces
150
+ interfaces = extract_interfaces(schema_path)
151
+ interfaces.each do |interface|
152
+ if @verbose
153
+ schema_name = File.basename(schema_path, ".*")
154
+ print " #{interface[:kind]} FROM #{interface[:schema_name]} (in #{schema_name}): "
155
+ end
156
+
157
+ dep_path = resolve_schema_location(
158
+ interface[:schema_name],
159
+ interface[:kind],
160
+ schema_path,
161
+ )
162
+
163
+ if dep_path
164
+ if @verbose
165
+ # Show which source and relative path
166
+ if @last_found_base_dir && @last_found_base_index
167
+ relative_path = dep_path.sub("#{@last_found_base_dir}/", "")
168
+ source_label = "[source #{@last_found_base_index + 1}]"
169
+ puts "\e[32m✓\e[0m #{source_label} #{relative_path}"
170
+ else
171
+ relative_path = File.basename(dep_path)
172
+ puts "\e[32m✓\e[0m #{relative_path}"
173
+ end
174
+ end
175
+ resolve_recursive(dep_path)
176
+ else
177
+ # Track unresolved reference
178
+ @unresolved << {
179
+ from: schema_path,
180
+ kind: interface[:kind],
181
+ schema_name: interface[:schema_name],
182
+ }
183
+
184
+ if @verbose
185
+ puts "\e[31m✗ not found\e[0m"
186
+ end
187
+ end
188
+ end
189
+
190
+ @resolution_stack.pop
191
+ @resolved_schemas.add(schema_path)
192
+ end
193
+
194
+ # Find schema file in directory
195
+ # @param schema_name [String] Schema name to find
196
+ # @param directory [String] Directory to search
197
+ # @param recursive [Boolean] Whether to search subdirectories
198
+ # @return [String, nil] Path to schema file or nil
199
+ def find_schema_in_directory(schema_name, directory)
200
+ return nil unless File.directory?(directory)
201
+
202
+ # Try direct match first (resource pattern: schema_name.exp)
203
+ candidate = File.join(directory, "#{schema_name}.exp")
204
+ return File.expand_path(candidate) if File.exist?(candidate)
205
+
206
+ # Try module pattern: {lower-case-prefix-without-_schema}/{arm|mim}.exp
207
+ # Examples:
208
+ # Activity_method_mim -> activity_method/mim.exp
209
+ # Activity_method_arm -> activity_method/arm.exp
210
+ module_path = try_module_pattern(schema_name, directory)
211
+ return module_path if module_path
212
+
213
+ # Search recursively in subdirectories
214
+ # Only in base_dirs to avoid permission errors in system directories
215
+ begin
216
+ # First try direct name match
217
+ Dir.glob(File.join(directory, "**",
218
+ "#{schema_name}.exp")).each do |file|
219
+ return File.expand_path(file)
220
+ end
221
+
222
+ # Also try module pattern recursively for _arm/_mim schemas
223
+ if schema_name =~ /^(.+)_(arm|mim)$/i
224
+ prefix = Regexp.last_match(1)
225
+ suffix = Regexp.last_match(2).downcase
226
+ prefix = prefix.sub(/_schema$/i, "")
227
+ module_dir = prefix.downcase
228
+
229
+ # Search for **/module_dir/suffix.exp pattern
230
+ Dir.glob(File.join(directory, "**", module_dir,
231
+ "#{suffix}.exp")).each do |file|
232
+ return File.expand_path(file)
233
+ end
234
+ end
235
+ rescue Errno::EACCES, Errno::EPERM
236
+ # Ignore permission errors when searching directories
237
+ nil
238
+ end
239
+
240
+ nil
241
+ end
242
+
243
+ # Try module naming pattern
244
+ # @param schema_name [String] Schema name (e.g., "Activity_method_mim")
245
+ # @param directory [String] Base directory
246
+ # @return [String, nil] Path if found, nil otherwise
247
+ def try_module_pattern(schema_name, directory)
248
+ # Check if schema name ends with _arm or _mim
249
+ if schema_name =~ /^(.+)_(arm|mim)$/i
250
+ prefix = Regexp.last_match(1)
251
+ suffix = Regexp.last_match(2).downcase
252
+
253
+ # Remove trailing _schema if present
254
+ prefix = prefix.sub(/_schema$/i, "")
255
+
256
+ # Convert to lowercase and replace underscores
257
+ module_dir = prefix.downcase
258
+
259
+ # Try: directory/module_dir/suffix.exp
260
+ candidate = File.join(directory, module_dir, "#{suffix}.exp")
261
+ return File.expand_path(candidate) if File.exist?(candidate)
262
+ end
263
+
264
+ nil
265
+ end
266
+ end
267
+ end
268
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Model
5
+ # Represents a single EXPRESS file containing schemas and preamble remarks.
6
+ # This class preserves file-level information including:
7
+ # - File path for reference
8
+ # - Preamble remarks (comments at the top of the file before any schema)
9
+ # - Schemas defined in this file
10
+ #
11
+ # A Repository contains multiple ExpFile instances when parsing multiple files,
12
+ # or a single ExpFile when parsing a single file.
13
+ class ExpFile < ModelElement
14
+ include HasId
15
+ include ScopeContainer
16
+
17
+ collection_attributes :schemas
18
+
19
+ attribute :path, :string
20
+ attribute :schemas, Declarations::Schema, collection: true,
21
+ initialize_empty: true
22
+ attribute :_class, :string, default: -> { self.class.name }
23
+
24
+ key_value do
25
+ map "_class", to: :_class, render_default: true
26
+ map "path", to: :path
27
+ map "schemas", to: :schemas
28
+ end
29
+
30
+ # Returns the file path as the identifier
31
+ # @return [String, nil] The file path or nil
32
+ def id
33
+ path
34
+ end
35
+
36
+ # @return [Array<Declaration>]
37
+ def children
38
+ schemas
39
+ end
40
+ end
41
+ end
42
+ end
@@ -3,17 +3,16 @@ module Expressir
3
3
  module Expressions
4
4
  # Specified in ISO 10303-11:2004
5
5
  # - section 12.9 Aggregate initializer
6
- class AggregateInitializer < Expression
7
- model_attr_accessor :items, 'Array<AggregateInitializerItem>'
6
+ class AggregateInitializer < ModelElement
7
+ child_attributes :items
8
+ attribute :items, ModelElement, collection: true
9
+ attribute :_class, :string, default: -> { self.class.name }
8
10
 
9
- # @param [Hash] options
10
- # @option options [Array<AggregateInitializerItem>] :items
11
- def initialize(options = {})
12
- @items = options[:items] || []
13
-
14
- super
11
+ key_value do
12
+ map "_class", to: :_class, render_default: true
13
+ map "items", to: :items
15
14
  end
16
15
  end
17
16
  end
18
17
  end
19
- end
18
+ end
@@ -3,20 +3,18 @@ module Expressir
3
3
  module Expressions
4
4
  # Specified in ISO 10303-11:2004
5
5
  # - section 12.9 Aggregate initializer
6
- class AggregateInitializerItem < Expression
7
- model_attr_accessor :expression, 'Expression'
8
- model_attr_accessor :repetition, 'Expression'
6
+ class AggregateInitializerItem < ModelElement
7
+ child_attributes :expression, :repetition
8
+ attribute :expression, ModelElement
9
+ attribute :repetition, ModelElement
10
+ attribute :_class, :string, default: -> { self.class.name }
9
11
 
10
- # @param [Hash] options
11
- # @option options [Expression] :expression
12
- # @option options [Expression] :repetition
13
- def initialize(options = {})
14
- @expression = options[:expression]
15
- @repetition = options[:repetition]
16
-
17
- super
12
+ key_value do
13
+ map "_class", to: :_class, render_default: true
14
+ map "expression", to: :expression
15
+ map "repetition", to: :repetition
18
16
  end
19
17
  end
20
18
  end
21
19
  end
22
- end
20
+ end
@@ -9,45 +9,51 @@ module Expressir
9
9
  # - section 12.5 String operators
10
10
  # - section 12.6 Aggregate operators
11
11
  # - section 12.10 Complex entity instance construction operator
12
- class BinaryExpression < Expression
13
- ADDITION = :ADDITION
14
- AND = :AND
15
- COMBINE = :COMBINE
16
- EQUAL = :EQUAL
17
- EXPONENTIATION = :EXPONENTIATION
18
- GREATER_THAN = :GREATER_THAN
19
- GREATER_THAN_OR_EQUAL = :GREATER_THAN_OR_EQUAL
20
- IN = :IN
21
- INSTANCE_EQUAL = :INSTANCE_EQUAL
22
- INSTANCE_NOT_EQUAL = :INSTANCE_NOT_EQUAL
23
- INTEGER_DIVISION = :INTEGER_DIVISION
24
- LESS_THAN = :LESS_THAN
25
- LESS_THAN_OR_EQUAL = :LESS_THAN_OR_EQUAL
26
- LIKE = :LIKE
27
- MODULO = :MODULO
28
- MULTIPLICATION = :MULTIPLICATION
29
- NOT_EQUAL = :NOT_EQUAL
30
- OR = :OR
31
- REAL_DIVISION = :REAL_DIVISION
32
- SUBTRACTION = :SUBTRACTION
33
- XOR = :XOR
12
+ class BinaryExpression < ModelElement
13
+ child_attributes :operand1, :operand2
14
+ ADDITION = "ADDITION".freeze
15
+ AND = "AND".freeze
16
+ COMBINE = "COMBINE".freeze
17
+ EQUAL = "EQUAL".freeze
18
+ EXPONENTIATION = "EXPONENTIATION".freeze
19
+ GREATER_THAN = "GREATER_THAN".freeze
20
+ GREATER_THAN_OR_EQUAL = "GREATER_THAN_OR_EQUAL".freeze
21
+ IN = "IN".freeze
22
+ INSTANCE_EQUAL = "INSTANCE_EQUAL".freeze
23
+ INSTANCE_NOT_EQUAL = "INSTANCE_NOT_EQUAL".freeze
24
+ INTEGER_DIVISION = "INTEGER_DIVISION".freeze
25
+ LESS_THAN = "LESS_THAN".freeze
26
+ LESS_THAN_OR_EQUAL = "LESS_THAN_OR_EQUAL".freeze
27
+ LIKE = "LIKE".freeze
28
+ MODULO = "MODULO".freeze
29
+ MULTIPLICATION = "MULTIPLICATION".freeze
30
+ NOT_EQUAL = "NOT_EQUAL".freeze
31
+ OR = "OR".freeze
32
+ REAL_DIVISION = "REAL_DIVISION".freeze
33
+ SUBTRACTION = "SUBTRACTION".freeze
34
+ XOR = "XOR".freeze
34
35
 
35
- model_attr_accessor :operator, ':ADDITION, :AND, :COMBINE, :EQUAL, :EXPONENTIATION, :GREATER_THAN, :GREATER_THAN_OR_EQUAL, :IN, :INSTANCE_EQUAL, :INSTANCE_NOT_EQUAL, :INTEGER_DIVISION, :LESS_THAN, :LESS_THAN_OR_EQUAL, :LIKE, :MODULO, :MULTIPLICATION, :NOT_EQUAL, :OR, :REAL_DIVISION, :SUBTRACTION, :XOR'
36
- model_attr_accessor :operand1, 'Expression'
37
- model_attr_accessor :operand2, 'Expression'
36
+ attribute :operator, :string,
37
+ values: %w[
38
+ ADDITION AND COMBINE EQUAL EXPONENTIATION
39
+ GREATER_THAN
40
+ GREATER_THAN_OR_EQUAL IN INSTANCE_EQUAL
41
+ INSTANCE_NOT_EQUAL
42
+ INTEGER_DIVISION LESS_THAN LESS_THAN_OR_EQUAL LIKE
43
+ MODULO MULTIPLICATION NOT_EQUAL OR REAL_DIVISION
44
+ SUBTRACTION XOR
45
+ ]
46
+ attribute :operand1, ModelElement
47
+ attribute :operand2, ModelElement
48
+ attribute :_class, :string, default: -> { self.class.name }
38
49
 
39
- # @param [Hash] options
40
- # @option options [:ADDITION, :AND, :COMBINE, :EQUAL, :EXPONENTIATION, :GREATER_THAN, :GREATER_THAN_OR_EQUAL, :IN, :INSTANCE_EQUAL, :INSTANCE_NOT_EQUAL, :INTEGER_DIVISION, :LESS_THAN, :LESS_THAN_OR_EQUAL, :LIKE, :MODULO, :MULTIPLICATION, :NOT_EQUAL, :OR, :REAL_DIVISION, :SUBTRACTION, :XOR] :operator
41
- # @option options [Expression] :operand1
42
- # @option options [Expression] :operand2
43
- def initialize(options = {})
44
- @operator = options[:operator]
45
- @operand1 = options[:operand1]
46
- @operand2 = options[:operand2]
47
-
48
- super
50
+ key_value do
51
+ map "_class", to: :_class, render_default: true
52
+ map "operator", to: :operator
53
+ map "operand1", to: :operand1
54
+ map "operand2", to: :operand2
49
55
  end
50
56
  end
51
57
  end
52
58
  end
53
- end
59
+ end
@@ -3,20 +3,18 @@ module Expressir
3
3
  module Expressions
4
4
  # Specified in ISO 10303-11:2004
5
5
  # - section 9.2.6 Implicit declarations
6
- class EntityConstructor < Expression
7
- model_attr_accessor :entity, 'Reference'
8
- model_attr_accessor :parameters, 'Array<Expression>'
6
+ class EntityConstructor < ModelElement
7
+ child_attributes :parameters
8
+ attribute :entity, ModelElement
9
+ attribute :parameters, ModelElement, collection: true
10
+ attribute :_class, :string, default: -> { self.class.name }
9
11
 
10
- # @param [Hash] options
11
- # @option options [Reference] :entity
12
- # @option options [Array<Expression>] :parameters
13
- def initialize(options = {})
14
- @entity = options[:entity]
15
- @parameters = options[:parameters] || []
16
-
17
- super
12
+ key_value do
13
+ map "_class", to: :_class, render_default: true
14
+ map "entity", to: :entity
15
+ map "parameters", to: :parameters
18
16
  end
19
17
  end
20
18
  end
21
19
  end
22
- end
20
+ end
@@ -3,20 +3,18 @@ module Expressir
3
3
  module Expressions
4
4
  # Specified in ISO 10303-11:2004
5
5
  # - section 12.8 Function call
6
- class FunctionCall < Expression
7
- model_attr_accessor :function, 'Reference'
8
- model_attr_accessor :parameters, 'Array<Expression>'
6
+ class FunctionCall < ModelElement
7
+ child_attributes :parameters
8
+ attribute :function, ModelElement
9
+ attribute :parameters, ModelElement, collection: true
10
+ attribute :_class, :string, default: -> { self.class.name }
9
11
 
10
- # @param [Hash] options
11
- # @option options [Reference] :function
12
- # @option options [Array<Expression>] :parameters
13
- def initialize(options = {})
14
- @function = options[:function]
15
- @parameters = options[:parameters] || []
16
-
17
- super
12
+ key_value do
13
+ map "_class", to: :_class, render_default: true
14
+ map "function", to: :function
15
+ map "parameters", to: :parameters
18
16
  end
19
17
  end
20
18
  end
21
19
  end
22
- end
20
+ end
@@ -3,32 +3,27 @@ module Expressir
3
3
  module Expressions
4
4
  # Specified in ISO 10303-11:2004
5
5
  # - section 12.2.4 Interval expressions
6
- class Interval < Expression
7
- LESS_THAN = :LESS_THAN
8
- LESS_THAN_OR_EQUAL = :LESS_THAN_OR_EQUAL
6
+ class Interval < ModelElement
7
+ child_attributes :low, :item, :high
8
+ LESS_THAN = "LESS_THAN".freeze
9
+ LESS_THAN_OR_EQUAL = "LESS_THAN_OR_EQUAL".freeze
9
10
 
10
- model_attr_accessor :low, 'Expression'
11
- model_attr_accessor :operator1, ':LESS_THAN, :LESS_THAN_OR_EQUAL'
12
- model_attr_accessor :item, 'Reference'
13
- model_attr_accessor :operator2, ':LESS_THAN, :LESS_THAN_OR_EQUAL'
14
- model_attr_accessor :high, 'Expression'
11
+ attribute :low, ModelElement
12
+ attribute :operator1, :string, values: %w[LESS_THAN LESS_THAN_OR_EQUAL]
13
+ attribute :item, ModelElement
14
+ attribute :operator2, :string, values: %w[LESS_THAN LESS_THAN_OR_EQUAL]
15
+ attribute :high, ModelElement
16
+ attribute :_class, :string, default: -> { self.class.name }
15
17
 
16
- # @param [Hash] options
17
- # @option options [Expression] :low
18
- # @option options [:LESS_THAN, :LESS_THAN_OR_EQUAL] :operator1
19
- # @option options [Reference] :item
20
- # @option options [:LESS_THAN, :LESS_THAN_OR_EQUAL] :operator2
21
- # @option options [Expression] :high
22
- def initialize(options = {})
23
- @low = options[:low]
24
- @operator1 = options[:operator1]
25
- @item = options[:item]
26
- @operator2 = options[:operator2]
27
- @high = options[:high]
28
-
29
- super
18
+ key_value do
19
+ map "_class", to: :_class, render_default: true
20
+ map "low", to: :low
21
+ map "operator1", to: :operator1
22
+ map "item", to: :item
23
+ map "operator2", to: :operator2
24
+ map "high", to: :high
30
25
  end
31
26
  end
32
27
  end
33
28
  end
34
- end
29
+ end
@@ -3,33 +3,29 @@ module Expressir
3
3
  module Expressions
4
4
  # Specified in ISO 10303-11:2004
5
5
  # - section 12.6.7 Query expression
6
- class QueryExpression < Expression
6
+ class QueryExpression < ModelElement
7
7
  include Identifier
8
8
 
9
- model_attr_accessor :aggregate_source, 'Reference'
10
- model_attr_accessor :expression, 'Expression'
9
+ child_attributes :expression, :aggregate_source
11
10
 
12
- # @param [Hash] options
13
- # @option (see Identifier#initialize_identifier)
14
- # @option options [Reference] :aggregace_source
15
- # @option options [Expression] :expression
16
- def initialize(options = {})
17
- initialize_identifier(options)
11
+ attribute :aggregate_source, ModelElement
12
+ attribute :expression, ModelElement
13
+ attribute :_class, :string, default: -> { self.class.name }
18
14
 
19
- @aggregate_source = options[:aggregate_source]
20
- @expression = options[:expression]
21
-
22
- super
15
+ key_value do
16
+ map "_class", to: :_class, render_default: true
17
+ map "aggregate_source", to: :aggregate_source
18
+ map "expression", to: :expression
23
19
  end
24
20
 
25
21
  # @return [Array<Declaration>]
26
22
  def children
27
23
  [
28
24
  self,
29
- *remark_items
25
+ *remark_items,
30
26
  ]
31
27
  end
32
28
  end
33
29
  end
34
30
  end
35
- end
31
+ end
@@ -4,24 +4,22 @@ module Expressir
4
4
  # Specified in ISO 10303-11:2004
5
5
  # - section 12.1 Arithmetic operators
6
6
  # - section 12.4.1 NOT operator
7
- class UnaryExpression < Expression
8
- MINUS = :MINUS
9
- NOT = :NOT
10
- PLUS = :PLUS
7
+ class UnaryExpression < ModelElement
8
+ child_attributes :operand
9
+ MINUS = "MINUS".freeze
10
+ NOT = "NOT".freeze
11
+ PLUS = "PLUS".freeze
11
12
 
12
- model_attr_accessor :operator, ':MINUS, :NOT, :PLUS'
13
- model_attr_accessor :operand, 'Expression'
13
+ attribute :operator, :string, values: %w[MINUS NOT PLUS]
14
+ attribute :operand, ModelElement
15
+ attribute :_class, :string, default: -> { self.class.name }
14
16
 
15
- # @param [Hash] options
16
- # @option options [:MINUS, :NOT, :PLUS] :operator
17
- # @option options [Expression] :operand
18
- def initialize(options = {})
19
- @operator = options[:operator]
20
- @operand = options[:operand]
21
-
22
- super
17
+ key_value do
18
+ map "_class", to: :_class, render_default: true
19
+ map "operator", to: :operator
20
+ map "operand", to: :operand
23
21
  end
24
22
  end
25
23
  end
26
24
  end
27
- end
25
+ end