expressir 2.4.29-arm-linux-musl

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 (426) 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.2/expressir_core.so +0 -0
  180. data/lib/expressir/3.3/expressir_core.so +0 -0
  181. data/lib/expressir/3.4/expressir_core.so +0 -0
  182. data/lib/expressir/4.0/expressir_core.so +0 -0
  183. data/lib/expressir/benchmark.rb +310 -0
  184. data/lib/expressir/changes/item_change.rb +20 -0
  185. data/lib/expressir/changes/mapping_change.rb +16 -0
  186. data/lib/expressir/changes/schema_change.rb +85 -0
  187. data/lib/expressir/changes/version_change.rb +26 -0
  188. data/lib/expressir/changes.rb +9 -0
  189. data/lib/expressir/cli.rb +148 -0
  190. data/lib/expressir/commands/base.rb +25 -0
  191. data/lib/expressir/commands/benchmark.rb +59 -0
  192. data/lib/expressir/commands/benchmark_cache.rb +80 -0
  193. data/lib/expressir/commands/changes.rb +34 -0
  194. data/lib/expressir/commands/changes_import_eengine.rb +146 -0
  195. data/lib/expressir/commands/changes_validate.rb +63 -0
  196. data/lib/expressir/commands/check.rb +56 -0
  197. data/lib/expressir/commands/clean.rb +20 -0
  198. data/lib/expressir/commands/coverage.rb +458 -0
  199. data/lib/expressir/commands/expand.rb +26 -0
  200. data/lib/expressir/commands/file_violations.rb +70 -0
  201. data/lib/expressir/commands/fix.rb +33 -0
  202. data/lib/expressir/commands/flatten.rb +29 -0
  203. data/lib/expressir/commands/format.rb +43 -0
  204. data/lib/expressir/commands/manifest.rb +420 -0
  205. data/lib/expressir/commands/mapping_validate.rb +68 -0
  206. data/lib/expressir/commands/non_ascii_character.rb +49 -0
  207. data/lib/expressir/commands/non_ascii_violation_collection.rb +301 -0
  208. data/lib/expressir/commands/package.rb +1222 -0
  209. data/lib/expressir/commands/parity_inputs.rb +160 -0
  210. data/lib/expressir/commands/validate.rb +106 -0
  211. data/lib/expressir/commands/validate_ascii.rb +94 -0
  212. data/lib/expressir/commands/validate_load.rb +91 -0
  213. data/lib/expressir/commands/version.rb +9 -0
  214. data/lib/expressir/commands/xsd.rb +23 -0
  215. data/lib/expressir/commands.rb +30 -0
  216. data/lib/expressir/config.rb +60 -0
  217. data/lib/expressir/coverage.rb +510 -0
  218. data/lib/expressir/eengine/arm_compare_report.rb +23 -0
  219. data/lib/expressir/eengine/changes_section.rb +16 -0
  220. data/lib/expressir/eengine/compare_report.rb +69 -0
  221. data/lib/expressir/eengine/mim_compare_report.rb +23 -0
  222. data/lib/expressir/eengine/modified_object.rb +21 -0
  223. data/lib/expressir/eengine.rb +9 -0
  224. data/lib/expressir/errors.rb +113 -0
  225. data/lib/expressir/express/adoc_hyperlink_formatter.rb +30 -0
  226. data/lib/expressir/express/adoc_source_formatter.rb +12 -0
  227. data/lib/expressir/express/ast_key_converter.rb +114 -0
  228. data/lib/expressir/express/builder.rb +277 -0
  229. data/lib/expressir/express/builder_context.rb +22 -0
  230. data/lib/expressir/express/builder_registry.rb +397 -0
  231. data/lib/expressir/express/builders/attribute_decl_builder.rb +32 -0
  232. data/lib/expressir/express/builders/built_in_builder.rb +75 -0
  233. data/lib/expressir/express/builders/constant_builder.rb +108 -0
  234. data/lib/expressir/express/builders/declaration_builder.rb +20 -0
  235. data/lib/expressir/express/builders/derive_clause_builder.rb +14 -0
  236. data/lib/expressir/express/builders/derived_attr_builder.rb +28 -0
  237. data/lib/expressir/express/builders/domain_rule_builder.rb +21 -0
  238. data/lib/expressir/express/builders/entity_decl_builder.rb +116 -0
  239. data/lib/expressir/express/builders/explicit_attr_builder.rb +49 -0
  240. data/lib/expressir/express/builders/expression_builder.rb +416 -0
  241. data/lib/expressir/express/builders/function_decl_builder.rb +86 -0
  242. data/lib/expressir/express/builders/helpers.rb +148 -0
  243. data/lib/expressir/express/builders/interface_builder.rb +151 -0
  244. data/lib/expressir/express/builders/inverse_attr_builder.rb +43 -0
  245. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +30 -0
  246. data/lib/expressir/express/builders/inverse_clause_builder.rb +14 -0
  247. data/lib/expressir/express/builders/literal_builder.rb +93 -0
  248. data/lib/expressir/express/builders/procedure_decl_builder.rb +82 -0
  249. data/lib/expressir/express/builders/qualifier_builder.rb +102 -0
  250. data/lib/expressir/express/builders/reference_builder.rb +18 -0
  251. data/lib/expressir/express/builders/rule_decl_builder.rb +97 -0
  252. data/lib/expressir/express/builders/schema_body_decl_builder.rb +18 -0
  253. data/lib/expressir/express/builders/schema_decl_builder.rb +56 -0
  254. data/lib/expressir/express/builders/schema_version_builder.rb +34 -0
  255. data/lib/expressir/express/builders/simple_id_builder.rb +17 -0
  256. data/lib/expressir/express/builders/statement_builder.rb +243 -0
  257. data/lib/expressir/express/builders/subtype_constraint_builder.rb +166 -0
  258. data/lib/expressir/express/builders/syntax_builder.rb +30 -0
  259. data/lib/expressir/express/builders/type_builder.rb +238 -0
  260. data/lib/expressir/express/builders/type_decl_builder.rb +26 -0
  261. data/lib/expressir/express/builders/unique_clause_builder.rb +20 -0
  262. data/lib/expressir/express/builders/unique_rule_builder.rb +41 -0
  263. data/lib/expressir/express/builders/where_clause_builder.rb +20 -0
  264. data/lib/expressir/express/builders.rb +55 -0
  265. data/lib/expressir/express/cache.rb +76 -0
  266. data/lib/expressir/express/checker.rb +812 -0
  267. data/lib/expressir/express/concatenator.rb +79 -0
  268. data/lib/expressir/express/core.rb +95 -0
  269. data/lib/expressir/express/error.rb +124 -0
  270. data/lib/expressir/express/formatter.rb +149 -0
  271. data/lib/expressir/express/formatters/data_types_formatter.rb +362 -0
  272. data/lib/expressir/express/formatters/declarations_formatter.rb +753 -0
  273. data/lib/expressir/express/formatters/expressions_formatter.rb +180 -0
  274. data/lib/expressir/express/formatters/literals_formatter.rb +55 -0
  275. data/lib/expressir/express/formatters/references_formatter.rb +53 -0
  276. data/lib/expressir/express/formatters/remark_formatter.rb +270 -0
  277. data/lib/expressir/express/formatters/remark_item_formatter.rb +28 -0
  278. data/lib/expressir/express/formatters/statements_formatter.rb +272 -0
  279. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +54 -0
  280. data/lib/expressir/express/formatters.rb +22 -0
  281. data/lib/expressir/express/grammar/parser.rb +712 -0
  282. data/lib/expressir/express/grammar.rb +11 -0
  283. data/lib/expressir/express/hyperlink_formatter.rb +35 -0
  284. data/lib/expressir/express/interface_dot.rb +105 -0
  285. data/lib/expressir/express/lazy_repository.rb +211 -0
  286. data/lib/expressir/express/line_map.rb +48 -0
  287. data/lib/expressir/express/listing.rb +174 -0
  288. data/lib/expressir/express/model_traversal.rb +42 -0
  289. data/lib/expressir/express/model_visitor.rb +25 -0
  290. data/lib/expressir/express/node_position_index.rb +342 -0
  291. data/lib/expressir/express/parallel_files.rb +229 -0
  292. data/lib/expressir/express/parser.rb +523 -0
  293. data/lib/expressir/express/pretty_formatter.rb +586 -0
  294. data/lib/expressir/express/pretty_gate.rb +61 -0
  295. data/lib/expressir/express/refs_overlay.rb +47 -0
  296. data/lib/expressir/express/remark_attacher.rb +1098 -0
  297. data/lib/expressir/express/remark_overlay.rb +86 -0
  298. data/lib/expressir/express/remark_scanner.rb +245 -0
  299. data/lib/expressir/express/resolve_references_model_visitor.rb +29 -0
  300. data/lib/expressir/express/schema_block_scanner.rb +137 -0
  301. data/lib/expressir/express/schema_head_formatter.rb +22 -0
  302. data/lib/expressir/express/schema_plain_source_formatter.rb +11 -0
  303. data/lib/expressir/express/schema_source_formatter.rb +15 -0
  304. data/lib/expressir/express/scope_resolver.rb +223 -0
  305. data/lib/expressir/express/self_schema_reference.rb +126 -0
  306. data/lib/expressir/express/shtolo.rb +679 -0
  307. data/lib/expressir/express/smrl_xml.rb +125 -0
  308. data/lib/expressir/express/source_formatter.rb +15 -0
  309. data/lib/expressir/express/streaming_builder.rb +435 -0
  310. data/lib/expressir/express/xsd.rb +259 -0
  311. data/lib/expressir/express.rb +53 -0
  312. data/lib/expressir/liquid.rb +1 -0
  313. data/lib/expressir/manifest/resolver.rb +210 -0
  314. data/lib/expressir/manifest/validator.rb +192 -0
  315. data/lib/expressir/manifest.rb +6 -0
  316. data/lib/expressir/mapping/refpath.rb +857 -0
  317. data/lib/expressir/mapping.rb +253 -0
  318. data/lib/expressir/model/cache.rb +18 -0
  319. data/lib/expressir/model/concerns.rb +42 -0
  320. data/lib/expressir/model/data_types/aggregate.rb +26 -0
  321. data/lib/expressir/model/data_types/array.rb +25 -0
  322. data/lib/expressir/model/data_types/bag.rb +21 -0
  323. data/lib/expressir/model/data_types/binary.rb +19 -0
  324. data/lib/expressir/model/data_types/boolean.rb +15 -0
  325. data/lib/expressir/model/data_types/enumeration.rb +21 -0
  326. data/lib/expressir/model/data_types/enumeration_item.rb +24 -0
  327. data/lib/expressir/model/data_types/generic.rb +24 -0
  328. data/lib/expressir/model/data_types/generic_entity.rb +24 -0
  329. data/lib/expressir/model/data_types/integer.rb +15 -0
  330. data/lib/expressir/model/data_types/list.rb +23 -0
  331. data/lib/expressir/model/data_types/logical.rb +15 -0
  332. data/lib/expressir/model/data_types/number.rb +15 -0
  333. data/lib/expressir/model/data_types/real.rb +17 -0
  334. data/lib/expressir/model/data_types/select.rb +23 -0
  335. data/lib/expressir/model/data_types/set.rb +21 -0
  336. data/lib/expressir/model/data_types/string.rb +19 -0
  337. data/lib/expressir/model/data_types.rb +25 -0
  338. data/lib/expressir/model/declarations/attribute.rb +38 -0
  339. data/lib/expressir/model/declarations/constant.rb +28 -0
  340. data/lib/expressir/model/declarations/derived_attribute.rb +25 -0
  341. data/lib/expressir/model/declarations/entity.rb +62 -0
  342. data/lib/expressir/model/declarations/function.rb +59 -0
  343. data/lib/expressir/model/declarations/informal_proposition_rule.rb +25 -0
  344. data/lib/expressir/model/declarations/interface.rb +37 -0
  345. data/lib/expressir/model/declarations/interface_item.rb +21 -0
  346. data/lib/expressir/model/declarations/interfaced_item.rb +33 -0
  347. data/lib/expressir/model/declarations/inverse_attribute.rb +25 -0
  348. data/lib/expressir/model/declarations/parameter.rb +28 -0
  349. data/lib/expressir/model/declarations/procedure.rb +57 -0
  350. data/lib/expressir/model/declarations/remark_item.rb +21 -0
  351. data/lib/expressir/model/declarations/rule.rb +66 -0
  352. data/lib/expressir/model/declarations/schema.rb +215 -0
  353. data/lib/expressir/model/declarations/schema_version.rb +19 -0
  354. data/lib/expressir/model/declarations/schema_version_item.rb +19 -0
  355. data/lib/expressir/model/declarations/subtype_constraint.rb +32 -0
  356. data/lib/expressir/model/declarations/type.rb +45 -0
  357. data/lib/expressir/model/declarations/unique_rule.rb +26 -0
  358. data/lib/expressir/model/declarations/variable.rb +28 -0
  359. data/lib/expressir/model/declarations/where_rule.rb +26 -0
  360. data/lib/expressir/model/declarations.rb +31 -0
  361. data/lib/expressir/model/dependency_resolver.rb +268 -0
  362. data/lib/expressir/model/exp_file.rb +42 -0
  363. data/lib/expressir/model/expressions/aggregate_initializer.rb +18 -0
  364. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +20 -0
  365. data/lib/expressir/model/expressions/binary_expression.rb +59 -0
  366. data/lib/expressir/model/expressions/entity_constructor.rb +20 -0
  367. data/lib/expressir/model/expressions/function_call.rb +20 -0
  368. data/lib/expressir/model/expressions/interval.rb +29 -0
  369. data/lib/expressir/model/expressions/query_expression.rb +31 -0
  370. data/lib/expressir/model/expressions/unary_expression.rb +25 -0
  371. data/lib/expressir/model/expressions.rb +18 -0
  372. data/lib/expressir/model/identifier.rb +26 -0
  373. data/lib/expressir/model/indexes/entity_index.rb +103 -0
  374. data/lib/expressir/model/indexes/item_graph.rb +185 -0
  375. data/lib/expressir/model/indexes/reference_index.rb +148 -0
  376. data/lib/expressir/model/indexes/type_index.rb +149 -0
  377. data/lib/expressir/model/indexes.rb +12 -0
  378. data/lib/expressir/model/interface_validator.rb +384 -0
  379. data/lib/expressir/model/literals/binary.rb +17 -0
  380. data/lib/expressir/model/literals/integer.rb +17 -0
  381. data/lib/expressir/model/literals/logical.rb +21 -0
  382. data/lib/expressir/model/literals/real.rb +17 -0
  383. data/lib/expressir/model/literals/string.rb +20 -0
  384. data/lib/expressir/model/literals.rb +13 -0
  385. data/lib/expressir/model/model_element.rb +377 -0
  386. data/lib/expressir/model/references/attribute_reference.rb +19 -0
  387. data/lib/expressir/model/references/group_reference.rb +19 -0
  388. data/lib/expressir/model/references/index_reference.rb +23 -0
  389. data/lib/expressir/model/references/simple_reference.rb +21 -0
  390. data/lib/expressir/model/references.rb +12 -0
  391. data/lib/expressir/model/remark_format.rb +17 -0
  392. data/lib/expressir/model/remark_info.rb +92 -0
  393. data/lib/expressir/model/remark_placement.rb +42 -0
  394. data/lib/expressir/model/repository.rb +483 -0
  395. data/lib/expressir/model/repository_validator.rb +293 -0
  396. data/lib/expressir/model/search_engine.rb +551 -0
  397. data/lib/expressir/model/statements/alias.rb +31 -0
  398. data/lib/expressir/model/statements/assignment.rb +23 -0
  399. data/lib/expressir/model/statements/case.rb +42 -0
  400. data/lib/expressir/model/statements/case_action.rb +20 -0
  401. data/lib/expressir/model/statements/compound.rb +21 -0
  402. data/lib/expressir/model/statements/escape.rb +18 -0
  403. data/lib/expressir/model/statements/if.rb +26 -0
  404. data/lib/expressir/model/statements/null.rb +18 -0
  405. data/lib/expressir/model/statements/procedure_call.rb +22 -0
  406. data/lib/expressir/model/statements/repeat.rb +40 -0
  407. data/lib/expressir/model/statements/return.rb +20 -0
  408. data/lib/expressir/model/statements/skip.rb +18 -0
  409. data/lib/expressir/model/statements.rb +20 -0
  410. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +25 -0
  411. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +17 -0
  412. data/lib/expressir/model/supertype_expressions.rb +12 -0
  413. data/lib/expressir/model.rb +39 -0
  414. data/lib/expressir/package/builder.rb +231 -0
  415. data/lib/expressir/package/metadata.rb +79 -0
  416. data/lib/expressir/package/reader.rb +149 -0
  417. data/lib/expressir/package.rb +8 -0
  418. data/lib/expressir/schema_manifest.rb +159 -0
  419. data/lib/expressir/schema_manifest_entry.rb +15 -0
  420. data/lib/expressir/version.rb +8 -0
  421. data/lib/expressir.rb +94 -0
  422. data/lib/tasks/verify_remarks.rake +16 -0
  423. data/rakelib/native.rake +24 -0
  424. data/rakelib/oracle.rake +52 -0
  425. data/rakelib/verify_remarks.rake +16 -0
  426. metadata +692 -0
@@ -0,0 +1,185 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Model
5
+ module Indexes
6
+ # Item-level graph over a resolved repository: nodes are schema
7
+ # items (canonical "schema.item" paths), edges are inheritance,
8
+ # interface imports, and attribute-type references.
9
+ #
10
+ # {Model::ModelElement#path} is file-qualified and empty for
11
+ # id-less nodes, so node identity is the last two path segments —
12
+ # unique because schema names are unique within a repository.
13
+ class ItemGraph
14
+ attr_reader :nodes, :subtype_of, :dependencies
15
+
16
+ # @param repository [Repository] a resolved repository
17
+ def initialize(repository)
18
+ @nodes = {}
19
+ @subtype_of = Hash.new { |h, k| h[k] = [] }
20
+ @dependencies = Hash.new { |h, k| h[k] = [] }
21
+ build(repository)
22
+ end
23
+
24
+ # Plain tables for artifact persistence — node keys only, no
25
+ # model references. `ItemGraph.from_tables` is the zero-model
26
+ # counterpart used on warm loads.
27
+ def tables
28
+ {
29
+ "nodes" => @nodes.keys,
30
+ "subtype_of" => @subtype_of.reject { |_, parents| parents.empty? },
31
+ "dependencies" => @dependencies.reject { |_, deps| deps.empty? },
32
+ }
33
+ end
34
+
35
+ def self.from_tables(tables)
36
+ graph = allocate
37
+ graph.instance_variable_set(:@nodes, tables["nodes"].to_h { |k| [k, nil] })
38
+ graph.instance_variable_set(
39
+ :@subtype_of,
40
+ Hash.new { |h, k| h[k] = [] }.update(tables["subtype_of"] || {}),
41
+ )
42
+ graph.instance_variable_set(
43
+ :@dependencies,
44
+ Hash.new { |h, k| h[k] = [] }.update(tables["dependencies"] || {}),
45
+ )
46
+ graph
47
+ end
48
+
49
+ def include?(path)
50
+ @nodes.key?(canonical(path))
51
+ end
52
+
53
+ # Transitive supertype closure of an entity, breadth-first.
54
+ def supertypes(path)
55
+ key = canonical(path)
56
+ return [] unless @nodes.key?(key)
57
+
58
+ seen = {}
59
+ result = []
60
+ queue = @subtype_of[key].dup
61
+ until queue.empty?
62
+ current = queue.shift
63
+ next if seen[current]
64
+
65
+ seen[current] = true
66
+ result << current
67
+ queue.concat(@subtype_of[current])
68
+ end
69
+ result
70
+ end
71
+
72
+ # Schemas whose items `schema` imports (USE FROM / REFERENCE
73
+ # FROM), direct only. Accepts a schema object or its id.
74
+ def dependencies_of(schema)
75
+ schema_id = schema.respond_to?(:id) ? schema.id : schema.to_s
76
+ @dependencies[schema_id.safe_downcase].dup
77
+ end
78
+
79
+ def subtype_edges
80
+ @subtype_of.flat_map { |child, parents| parents.map { |p| [child, p] } }
81
+ end
82
+
83
+ # Direct subtypes of an entity (the inverse of subtype_of).
84
+ def subtypes(path)
85
+ key = canonical(path)
86
+ return [] unless @nodes.key?(key)
87
+
88
+ @subtype_of.select { |_child, parents| parents.include?(key) }.keys
89
+ end
90
+
91
+ # Transitive subtype closure of an entity (everything below it
92
+ # in the hierarchy), breadth-first and cycle-safe.
93
+ def transitive_subtypes(path)
94
+ key = canonical(path)
95
+ return [] unless @nodes.key?(key)
96
+
97
+ seen = {}
98
+ queue = subtypes(key)
99
+ until queue.empty?
100
+ current = queue.shift
101
+ next if seen[current]
102
+
103
+ seen[current] = true
104
+ queue.concat(subtypes(current))
105
+ end
106
+ seen.keys
107
+ end
108
+
109
+ # Transitive interface closure of a schema — every schema it
110
+ # depends on, directly or through intermediates. Cycle-safe.
111
+ def dependency_closure(schema)
112
+ schema_id = schema.respond_to?(:id) ? schema.id : schema.to_s
113
+ seen = {}
114
+ queue = dependencies_of(schema_id).dup
115
+ until queue.empty?
116
+ current = queue.shift
117
+ next if seen[current]
118
+
119
+ seen[current] = true
120
+ queue.concat(@dependencies[current] || [])
121
+ end
122
+ seen.keys
123
+ end
124
+
125
+ # Schemas that import `schema` (USE FROM / REFERENCE FROM it),
126
+ # direct only — the "used by" direction for doc generation.
127
+ def dependents_of(schema)
128
+ schema_id = schema.respond_to?(:id) ? schema.id : schema.to_s
129
+ key = schema_id.safe_downcase
130
+ @dependencies.select { |_from, deps| deps.include?(key) }.keys
131
+ end
132
+
133
+ def cross_schema_subtype_edges
134
+ subtype_edges.count { |child, parent| child.split(".")[0] != parent.split(".")[0] }
135
+ end
136
+
137
+ private
138
+
139
+ def canonical(path)
140
+ return nil unless path
141
+
142
+ parts = path.to_s.split(".")
143
+ return nil if parts.size < 2
144
+
145
+ parts[-2, 2].join(".").safe_downcase
146
+ end
147
+
148
+ def build(repository)
149
+ # Nodes register before their subtype edges: subtype references
150
+ # may be unresolved (the declaring schema is not in the
151
+ # repository), and an edge to a node that does not exist would
152
+ # surface as a phantom path in supertype closures.
153
+ edges = []
154
+ repository.schemas.each do |schema|
155
+ schema_id = schema.id.safe_downcase
156
+ schema.entities.to_a.each do |entity|
157
+ key = node_key(schema_id, entity)
158
+ @nodes[key] = entity
159
+ edges << [key, schema_id, entity]
160
+ end
161
+ schema.types.to_a.each do |type|
162
+ @nodes[node_key(schema_id, type)] = type
163
+ end
164
+ schema.interfaces.to_a.each do |interface|
165
+ target = interface.schema.is_a?(String) ? interface.schema : interface.schema&.id
166
+ next unless target
167
+
168
+ @dependencies[schema_id] << target.safe_downcase
169
+ end
170
+ end
171
+ edges.each do |key, schema_id, entity|
172
+ entity.subtype_of.to_a.each do |ref|
173
+ parent = ref.base_path ? canonical(ref.base_path) : "#{schema_id}.#{ref.id.safe_downcase}"
174
+ @subtype_of[key] << parent if parent && @nodes.key?(parent)
175
+ end
176
+ end
177
+ end
178
+
179
+ def node_key(schema_id, element)
180
+ canonical(element.path) || "#{schema_id}.#{element.id.safe_downcase}"
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Model
5
+ module Indexes
6
+ # Index for cross-schema reference tracking
7
+ # Maintains USE FROM, REFERENCE FROM relationships and dependency graphs
8
+ class ReferenceIndex
9
+ attr_reader :use_from, :reference_from, :dependencies
10
+
11
+ # Initialize a new reference index
12
+ # @param schemas [Array<Declarations::Schema>] Schemas to index
13
+ def initialize(schemas = [])
14
+ @use_from = {}
15
+ @reference_from = {}
16
+ @dependencies = {}
17
+ build(schemas) unless schemas.empty?
18
+ end
19
+
20
+ # Build indexes from schemas
21
+ # @param schemas [Array<Declarations::Schema>] Schemas to index
22
+ # @return [void]
23
+ def build(schemas)
24
+ @use_from = {}
25
+ @reference_from = {}
26
+ @dependencies = {}
27
+
28
+ schemas.each do |schema|
29
+ schema_id = schema.id.safe_downcase
30
+
31
+ # Initialize schema entries even if there are no interfaces
32
+ @use_from[schema_id] = []
33
+ @reference_from[schema_id] = []
34
+
35
+ next unless schema.interfaces
36
+
37
+ schema.interfaces.each do |interface|
38
+ referenced_schema = interface.schema.id.safe_downcase
39
+ items = interface.items.map { |item| item.ref.id }
40
+
41
+ if interface.kind == Declarations::Interface::USE
42
+ @use_from[schema_id] << {
43
+ schema: referenced_schema,
44
+ items: items,
45
+ }
46
+ elsif interface.kind == Declarations::Interface::REFERENCE
47
+ @reference_from[schema_id] << {
48
+ schema: referenced_schema,
49
+ items: items,
50
+ }
51
+ end
52
+
53
+ @dependencies[schema_id] ||= Set.new
54
+ @dependencies[schema_id] << referenced_schema
55
+ end
56
+ end
57
+ end
58
+
59
+ # Get USE FROM references for a schema
60
+ # @param schema [String] Schema name
61
+ # @return [Array<Hash>] List of USE FROM references
62
+ def use_references(schema)
63
+ @use_from[schema.safe_downcase] || []
64
+ end
65
+
66
+ # Get REFERENCE FROM references for a schema
67
+ # @param schema [String] Schema name
68
+ # @return [Array<Hash>] List of REFERENCE FROM references
69
+ def reference_references(schema)
70
+ @reference_from[schema.safe_downcase] || []
71
+ end
72
+
73
+ # Get all dependencies for a schema
74
+ # @param schema [String] Schema name
75
+ # @return [Set<String>] Set of dependent schema names
76
+ def schema_dependencies(schema)
77
+ @dependencies[schema.safe_downcase] || Set.new
78
+ end
79
+
80
+ # Detect circular dependencies in schema references
81
+ # @return [Array<Array<String>>] List of circular dependency cycles
82
+ def detect_circular_dependencies
83
+ cycles = []
84
+ visited = Set.new
85
+ rec_stack = Set.new
86
+
87
+ @dependencies.each_key do |schema_id|
88
+ next if visited.include?(schema_id)
89
+
90
+ path = []
91
+ detect_cycle(schema_id, visited, rec_stack, path, cycles)
92
+ end
93
+
94
+ cycles
95
+ end
96
+
97
+ # Check if index is empty
98
+ # @return [Boolean] True if no references indexed
99
+ def empty?
100
+ @dependencies.empty?
101
+ end
102
+
103
+ # Count total USE FROM references
104
+ # @return [Integer] Total USE FROM references
105
+ def use_from_count
106
+ @use_from.values.sum(&:size)
107
+ end
108
+
109
+ # Count total REFERENCE FROM references
110
+ # @return [Integer] Total REFERENCE FROM references
111
+ def reference_from_count
112
+ @reference_from.values.sum(&:size)
113
+ end
114
+
115
+ private
116
+
117
+ # Helper method for cycle detection using DFS
118
+ # @param node [String] Current schema node
119
+ # @param visited [Set] Set of visited nodes
120
+ # @param rec_stack [Set] Recursion stack for current path
121
+ # @param path [Array] Current path
122
+ # @param cycles [Array] Accumulated cycles
123
+ # @return [Boolean] True if cycle detected
124
+ def detect_cycle(node, visited, rec_stack, path, cycles)
125
+ visited << node
126
+ rec_stack << node
127
+ path << node
128
+
129
+ deps = @dependencies[node] || Set.new
130
+ deps.each do |dep|
131
+ if !visited.include?(dep)
132
+ return true if detect_cycle(dep, visited, rec_stack, path, cycles)
133
+ elsif rec_stack.include?(dep)
134
+ # Found a cycle
135
+ cycle_start = path.index(dep)
136
+ cycles << (path[cycle_start..] + [dep])
137
+ return true
138
+ end
139
+ end
140
+
141
+ path.pop
142
+ rec_stack.delete(node)
143
+ false
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Model
5
+ module Indexes
6
+ # Index for fast type lookup across schemas
7
+ # Maintains indexes by qualified name, by schema, and by category
8
+ class TypeIndex
9
+ attr_reader :by_schema, :by_qualified_name, :by_category
10
+
11
+ # Initialize a new type index
12
+ # @param schemas [Array<Declarations::Schema>] Schemas to index
13
+ def initialize(schemas = [])
14
+ @by_schema = {}
15
+ @by_qualified_name = {}
16
+ @by_category = {}
17
+ build(schemas) unless schemas.empty?
18
+ end
19
+
20
+ # Build indexes from schemas
21
+ # @param schemas [Array<Declarations::Schema>] Schemas to index
22
+ # @return [void]
23
+ def build(schemas)
24
+ @by_schema = {}
25
+ @by_qualified_name = {}
26
+ @by_category = {}
27
+
28
+ schemas.each do |schema|
29
+ schema_id = schema.id.safe_downcase
30
+ @by_schema[schema_id] = {}
31
+
32
+ next unless schema.types
33
+
34
+ schema.types.each do |type|
35
+ type_id = type.id.safe_downcase
36
+ qualified_name = "#{schema_id}.#{type_id}"
37
+ category = categorize(type)
38
+
39
+ @by_schema[schema_id][type_id] = type
40
+ @by_qualified_name[qualified_name] = type
41
+ @by_category[category] ||= []
42
+ @by_category[category] << type
43
+ end
44
+ end
45
+ end
46
+
47
+ # Find type by qualified name
48
+ # @param qualified_name [String] Type qualified name (e.g., "schema.type")
49
+ # @return [Declarations::Type, nil] Found type or nil
50
+ def find(qualified_name)
51
+ return nil if qualified_name.nil? || qualified_name.empty?
52
+
53
+ normalized_name = qualified_name.safe_downcase
54
+
55
+ # Try qualified name first
56
+ type = @by_qualified_name[normalized_name]
57
+ return type if type
58
+
59
+ # Try as simple name across all schemas
60
+ schema_name, type_name = normalized_name.split(".", 2)
61
+ if type_name.nil?
62
+ # Search all schemas for simple name
63
+ @by_schema.each_value do |types|
64
+ type = types[schema_name]
65
+ return type if type
66
+ end
67
+ else
68
+ # Look in specific schema
69
+ schema_types = @by_schema[schema_name]
70
+ return schema_types[type_name] if schema_types
71
+ end
72
+
73
+ nil
74
+ end
75
+
76
+ # List all types
77
+ # @param schema [String, nil] Filter by schema name
78
+ # @param category [String, nil] Filter by category
79
+ # @return [Array<Declarations::Type>] List of types
80
+ def list(schema: nil, category: nil)
81
+ types = if schema
82
+ @by_schema[schema.safe_downcase]&.values || []
83
+ else
84
+ @by_qualified_name.values
85
+ end
86
+
87
+ types = filter_by_category(types, category) if category
88
+
89
+ types
90
+ end
91
+
92
+ # Check if index is empty
93
+ # @return [Boolean] True if no types indexed
94
+ def empty?
95
+ @by_qualified_name.empty?
96
+ end
97
+
98
+ # Count total types
99
+ # @return [Integer] Total number of types
100
+ def count
101
+ @by_qualified_name.size
102
+ end
103
+
104
+ # Get types for a specific schema
105
+ # @param schema [String] Schema name
106
+ # @return [Hash<String, Declarations::Type>] Types in schema
107
+ def schema_types(schema)
108
+ @by_schema[schema.safe_downcase] || {}
109
+ end
110
+
111
+ # Get types for a specific category
112
+ # @param category [String] Category name
113
+ # @return [Array<Declarations::Type>] Types in category
114
+ def category_types(category)
115
+ @by_category[category] || []
116
+ end
117
+
118
+ # Categorize type by its underlying type
119
+ # @param type [Declarations::Type] Type to categorize
120
+ # @return [String] Type category
121
+ def categorize(type)
122
+ return "defined" unless type.underlying_type
123
+
124
+ underlying = type.underlying_type
125
+
126
+ # Use explicit is_a? checks for test double compatibility
127
+ return "select" if underlying.is_a?(DataTypes::Select)
128
+ return "enumeration" if underlying.is_a?(DataTypes::Enumeration)
129
+ return "aggregate" if underlying.is_a?(DataTypes::Array) ||
130
+ underlying.is_a?(DataTypes::Bag) ||
131
+ underlying.is_a?(DataTypes::List) ||
132
+ underlying.is_a?(DataTypes::Set)
133
+
134
+ "defined"
135
+ end
136
+
137
+ private
138
+
139
+ # Filter types by category
140
+ # @param types [Array<Declarations::Type>] List of types
141
+ # @param category [String] Category to filter by
142
+ # @return [Array<Declarations::Type>] Filtered types
143
+ def filter_by_category(types, category)
144
+ types.select { |type| categorize(type) == category }
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Model
5
+ module Indexes
6
+ autoload :EntityIndex, "#{__dir__}/indexes/entity_index"
7
+ autoload :TypeIndex, "#{__dir__}/indexes/type_index"
8
+ autoload :ReferenceIndex, "#{__dir__}/indexes/reference_index"
9
+ autoload :ItemGraph, "#{__dir__}/indexes/item_graph"
10
+ end
11
+ end
12
+ end