ea 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +3 -0
- data/TODO.complete/01-t-xref-parsing.md +91 -0
- data/TODO.complete/02-per-label-geometry.md +50 -0
- data/TODO.complete/03-object-properties-constraints.md +57 -0
- data/TODO.complete/04-operation-params.md +37 -0
- data/TODO.complete/05-pdata-flag-matrix.md +52 -0
- data/TODO.complete/06-emf-image-rendering.md +34 -0
- data/TODO.complete/07-auxiliary-tables.md +47 -0
- data/TODO.complete/10-mdg-stereotype-registry.md +40 -0
- data/TODO.complete/11-gml-xsd-generation.md +42 -0
- data/TODO.complete/13-shapescript-interpreter.md +28 -0
- data/TODO.complete/20-cli-diff.md +46 -0
- data/TODO.complete/21-cli-render.md +26 -0
- data/TODO.complete/22-cli-export.md +29 -0
- data/TODO.complete/23-cli-mdg.md +23 -0
- data/TODO.complete/30-headerlines-ocp-refactor.md +72 -0
- data/TODO.complete/31-public-send-cleanup.md +61 -0
- data/TODO.complete/32-spec-coverage.md +33 -0
- data/TODO.complete/33-blocked-parity-gaps.md +41 -0
- data/TODO.complete/36-stereotype-icon-wiring.md +32 -0
- data/TODO.complete/37-cli-lint.md +32 -0
- data/TODO.complete/38-cli-query.md +26 -0
- data/TODO.complete/39-cli-info.md +23 -0
- data/TODO.complete/40-ocl-evaluator.md +31 -0
- data/TODO.complete/41-round-trip-spec.md +18 -0
- data/TODO.complete/42-html-diff-report.md +18 -0
- data/TODO.complete/43-json-schema-export.md +20 -0
- data/TODO.complete/44-remaining-qea-tables.md +40 -0
- data/TODO.complete/45-shapescript-extensions.md +25 -0
- data/TODO.complete/46-xsd-consolidation.md +20 -0
- data/TODO.complete/47-headerlines-legacy-removal.md +20 -0
- data/TODO.complete/STATUS.md +109 -0
- data/TODO.diagrams/01-svg-measurement-harness.md +31 -0
- data/TODO.diagrams/02-polygon-over-rendering.md +29 -0
- data/TODO.diagrams/03-text-over-rendering.md +30 -0
- data/TODO.diagrams/04-rect-under-rendering.md +33 -0
- data/TODO.diagrams/05-canvas-dimension-parity.md +51 -0
- data/TODO.diagrams/06-group-layering-parity.md +39 -0
- data/TODO.diagrams/07-text-content-fidelity.md +65 -0
- data/TODO.diagrams/08-qea-direct-pipeline.md +46 -0
- data/TODO.diagrams/12-connector-labels.md +40 -0
- data/TODO.diagrams/12-per-entity-svg-layer-ordering.md +24 -0
- data/TODO.diagrams/13-marker-polygon-vs-path-dispatch.md +20 -0
- data/TODO.diagrams/13-per-text-type-font-sizes.md +33 -0
- data/TODO.diagrams/14-center-header-text.md +33 -0
- data/TODO.diagrams/14-filter-diagram-frame-elements.md +18 -0
- data/TODO.diagrams/15-deep-dead-code-audit.md +47 -0
- data/TODO.diagrams/15-per-element-font-from-style.md +24 -0
- data/TODO.diagrams/16-canvas-marker-extent.md +30 -0
- data/TODO.diagrams/16-document-remaining-parity-gaps.md +91 -0
- data/TODO.diagrams/17-italic-abstract-classes.md +28 -0
- data/TODO.diagrams/17-remaining-parity-gaps.md +90 -0
- data/TODO.diagrams/18-canvas-from-image-bounds.md +20 -0
- data/TODO.diagrams/18-property-lookup-index.md +42 -0
- data/TODO.diagrams/19-connector-sx-sy-routing.md +27 -0
- data/TODO.diagrams/19-replace-respond-to-with-is-a.md +31 -0
- data/TODO.diagrams/20-split-labels-emitter.md +56 -0
- data/TODO.diagrams/20-visibility-glyph-font-encoding.md +27 -0
- data/TODO.diagrams/21-aggregation-navigability-arrow.md +21 -0
- data/TODO.diagrams/21-auto-generated-legend-block.md +65 -0
- data/TODO.diagrams/22-ghost-element-discriminator.md +57 -0
- data/TODO.diagrams/22-style-based-path-grouping.md +28 -0
- data/TODO.diagrams/23-marker-polygon-deduplication.md +47 -0
- data/TODO.diagrams/23-multiplicity-label-positioning.md +29 -0
- data/TODO.diagrams/24-marker-anchor-structural.md +35 -0
- data/TODO.diagrams/24-track-marker-anchors-structurally.md +66 -0
- data/TODO.diagrams/24-truncate-properties-to-fit-box.md +24 -0
- data/TODO.diagrams/26-phantom-general-parent-rendering.md +59 -0
- data/TODO.diagrams/27-path-grouping-mode-detection.md +43 -0
- data/TODO.diagrams/28-architecture-cleanup-batch.md +47 -0
- data/TODO.diagrams/30-decompose-elements-groups-for.md +52 -0
- data/TODO.diagrams/32-examples-coverage-batch.md +78 -0
- data/TODO.diagrams/36-instance-specification-model.md +42 -0
- data/TODO.diagrams/37-element-icon-decorations.md +41 -0
- data/TODO.diagrams/38-html-note-and-receptions.md +32 -0
- data/TODO.diagrams/39-property-stereotype-discriminator.md +40 -0
- data/TODO.diagrams/40-standalone-1-discriminator.md +38 -0
- data/TODO.diagrams/41-xmi-to-svg-pipeline.md +113 -0
- data/TODO.diagrams/42-close-all-parity-deltas.md +69 -0
- data/TODO.diagrams/43-marker-deduplication-strategy.md +54 -0
- data/TODO.diagrams/44-element-icon-decorations.md +34 -0
- data/TODO.diagrams/45-phantom-parent-class-boxes.md +40 -0
- data/TODO.diagrams/46-user-drawn-legend-swatches.md +44 -0
- data/TODO.diagrams/47-attribute-line-fidelity.md +72 -0
- data/TODO.diagrams/48-spec-coverage-critical-emitter-components.md +45 -0
- data/TODO.diagrams/49-spec-coverage-orchestrators.md +25 -0
- data/TODO.diagrams/50-examples-parity.md +85 -0
- data/TODO.diagrams/51-property-oy-gap-and-remaining-gaps.md +48 -0
- data/TODO.diagrams/52-marker-registration-architecture.md +89 -0
- data/TODO.diagrams/53-remaining-example-gaps.md +86 -0
- data/TODO.diagrams/54-display-name-nested-classes.md +40 -0
- data/TODO.diagrams/55-visibility-icon-discriminator.md +58 -0
- data/TODO.diagrams/56-package-contents-rendering.md +148 -0
- data/TODO.diagrams/57-instance-specification-model.md +100 -0
- data/TODO.diagrams/58-domain-model-note-text.md +67 -0
- data/TODO.diagrams/59-classes-arrow-discriminator.md +57 -0
- data/TODO.diagrams/60-testschema-association-marker.md +40 -0
- data/TODO.diagrams/61-legend-block-rendering.md +55 -0
- data/TODO.diagrams/61-plateau-parity-gaps.md +59 -0
- data/TODO.diagrams/62-ghost-element-rendering.md +56 -0
- data/TODO.diagrams/63-qualified-name-wrap.md +36 -0
- data/TODO.diagrams/64-property-stereotype-labels.md +22 -0
- data/TODO.diagrams/65-path-coordinate-frame.md +62 -0
- data/TODO.diagrams/67-path-coordinate-frame.md +62 -0
- data/TODO.diagrams/68-inherited-attributes.md +65 -0
- data/TODO.diagrams/69-package-anchor-conditional.md +29 -0
- data/TODO.diagrams/70-mdg-technology-support.md +68 -0
- data/TODO.diagrams/71-off-canvas-parent-ghost.md +45 -0
- data/TODO.diagrams/72-basic-attr-divider-paths.md +39 -0
- data/TODO.diagrams/73-plateau-polygon-gap.md +69 -0
- data/TODO.diagrams/74-plateau-rect-gap.md +22 -0
- data/TODO.diagrams/75-plateau-text-gap.md +39 -0
- data/TODO.diagrams/76-basic-poly-path-gaps.md +41 -0
- data/TODO.diagrams/77-basic-text-overrender.md +40 -0
- data/TODO.diagrams/78-headerlines-ocp-refactor.md +65 -0
- data/TODO.diagrams/79-architecture-backlog.md +65 -0
- data/TODO.diagrams/80-basic-triangle-polygons.md +51 -0
- data/TODO.diagrams/81-plateau-path-overrender.md +53 -0
- data/TODO.diagrams/82-appearance-canvas-offset.md +54 -0
- data/TODO.diagrams/83-3d-diagram-subtitle.md +58 -0
- data/TODO.diagrams/84-canvas-offset-mismatches.md +61 -0
- data/TODO.diagrams/85-phantom-property-overrender.md +95 -0
- data/TODO.diagrams/86-foreign-package-rule.md +62 -0
- data/TODO.diagrams/87-internal-tech-encryption.md +80 -0
- data/TODO.diagrams/EXAMPLES_STATUS.md +88 -0
- data/TODO.diagrams/README.md +69 -0
- data/TODO.diagrams/STATUS.md +73 -0
- data/TODO.fixup/01-default-grouped-paths.md +34 -0
- data/TODO.fixup/02-marker-consolidation-per-connector.md +20 -0
- data/TODO.fixup/03-diagram-font-inference.md +28 -0
- data/TODO.fixup/04-extract-bounds-calculator.md +25 -0
- data/TODO.fixup/05-marker-registry-ocp.md +32 -0
- data/TODO.fixup/06-connector-path-bend-routing.md +28 -0
- data/TODO.fixup/07-edge-attachment-formula.md +22 -0
- data/TODO.fixup/08-visual-diff-harness.md +28 -0
- data/TODO.fixup/09-extract-element-compartments.md +34 -0
- data/TODO.fixup/10-canvas-width-overshoot-fix.md +20 -0
- data/TODO.fixup/11-layer-sequencer-extraction.md +18 -0
- data/TODO.fixup/12-path-style-harmony.md +23 -0
- data/TODO.fixup/13-datatype-stereotype-fallback.md +28 -0
- data/TODO.fixup/14-ea-exe-reverse-engineering-notes.md +56 -0
- data/TODO.fixup/15-enumeration-literal-rendering.md +30 -0
- data/TODO.fixup/16-operation-compartment-rendering.md +42 -0
- data/TODO.fixup/17-path-count-calibration.md +27 -0
- data/TODO.fixup/18-polygon-count-calibration.md +32 -0
- data/TODO.fixup/19-rect-count-undershoot-investigation.md +40 -0
- data/TODO.fixup/20-stereotype-color-from-classifier.md +18 -0
- data/TODO.fixup/21-visibility-filter-for-properties.md +24 -0
- data/TODO.fixup/22-multiplicity-display-rule-calibration.md +25 -0
- data/TODO.fixup/23-diagram-frame-title-element.md +31 -0
- data/TODO.fixup/24-note-element-rendering.md +23 -0
- data/TODO.fixup/25-ea-exe-disassembly-findings.md +177 -0
- data/TODO.fixup/26-svg-renderer-architecture.md +78 -0
- data/TODO.fixup/27-svg-element-emitters-disassembly.md +135 -0
- data/TODO.fixup/28-geometry-parser-identification.md +57 -0
- data/TODO.fixup/29-qea-svg-xmi-triple-comparison.md +185 -0
- data/TODO.fixup/30-theme-system-stub.md +46 -0
- data/TODO.fixup/31-theme-value-object-registry.md +17 -0
- data/TODO.fixup/32-styleex-on-diagram-model.md +22 -0
- data/TODO.fixup/33-text-encoding-decimals-rotation.md +29 -0
- data/TODO.fixup/34-per-type-fill-via-theme.md +18 -0
- data/TODO.fixup/35-stroke-width-per-theme.md +7 -0
- data/TODO.fixup/36-qea-rect-coord-normalization.md +24 -0
- data/TODO.fixup/37-package-shape-rendering.md +22 -0
- data/TODO.fixup/38-note-element-rendering.md +15 -0
- data/TODO.fixup/39-styleex-flag-honoring.md +25 -0
- data/TODO.fixup/40-connector-dashed-lines.md +15 -0
- data/TODO.fixup/41-diagram-frame-showborder-detection.md +23 -0
- data/TODO.fixup/42-textrenderer-centralization.md +10 -0
- data/TODO.fixup/43-colorresolver-unification.md +24 -0
- data/TODO.fixup/44-theme-aware-textrenderer.md +17 -0
- data/TODO.fixup/45-theme-aware-fontresolver.md +22 -0
- data/TODO.fixup/46-style-parameterized-by-theme.md +21 -0
- data/TODO.fixup/47-canvas-frame-inset.md +19 -0
- data/TODO.fixup/48-background-rect-format.md +15 -0
- data/TODO.fixup/49-all-samples-integration-test.md +17 -0
- data/TODO.fixup/50-svg-emitter-architecture-docs.md +33 -0
- data/TODO.fixup/51-promote-theme-to-ea-namespace.md +28 -0
- data/TODO.fixup/52-theme-definition-integrated-fills.md +26 -0
- data/TODO.fixup/53-theme-registry-yaml-loading.md +50 -0
- data/TODO.fixup/54-diagram-theme-api.md +50 -0
- data/TODO.fixup/55-update-eaemitter-to-ea-theme.md +23 -0
- data/TODO.fixup/56-theme-yaml-files.md +65 -0
- data/TODO.fixup/57-theme-specs-and-integration.md +27 -0
- data/TODO.fixup/58-ea-entry-point-theme-autoload.md +20 -0
- data/TODO.fixup/59-thread-theme-through-all-renderers.md +29 -0
- data/TODO.fixup/60-cli-theme-option.md +22 -0
- data/TODO.fixup/61-theme-validation.md +28 -0
- data/TODO.fixup/62-theme-builder-dsl.md +31 -0
- data/TODO.fixup/63-theme-integration-rendering-spec.md +24 -0
- data/TODO.fixup/64-theme-writeback-styleex.md +21 -0
- data/TODO.fixup/65-remove-dead-eaemitter-theme-files.md +30 -0
- data/TODO.fixup/66-styleex-writeback.md +22 -0
- data/TODO.fixup/67-delete-dead-code.md +28 -0
- data/TODO.fixup/68-figure-parity-status.md +82 -0
- data/TODO.fixup/69-package-polygon-rendering.md +54 -0
- data/TODO.fixup/70-tagged-values-compartment.md +39 -0
- data/TODO.fixup/71-auto-detect-theme-from-xmi.md +37 -0
- data/TODO.fixup/72-sample-exports-as-regression-specs.md +37 -0
- data/TODO.fixup/73-delete-dead-transformations.md +14 -0
- data/TODO.fixup/74-delete-dead-diagram-renderers.md +18 -0
- data/TODO.fixup/75-visibility-legend-icons.md +23 -0
- data/TODO.fixup/76-plateau-text-undershoot.md +27 -0
- data/TODO.fixup/77-canvas-frame-margins.md +28 -0
- data/TODO.fixup/78-note-element-rendering.md +30 -0
- data/TODO.fixup/79-operation-compartment-rendering.md +27 -0
- data/TODO.fixup/80-tagged-value-stereotype-visibility.md +37 -0
- data/TODO.fixup/81-figure-parity-current-state.md +63 -0
- data/config/qea_schema.yml +356 -0
- data/config/themes/119.yml +98 -0
- data/config/themes/default.yml +14 -0
- data/examples/exports/20251010_current_plateau_v5/UML_EA.DTD +6856 -0
- data/examples/exports/20251010_current_plateau_v5/model.xml +96709 -0
- data/examples/exports/ArcGISWorkspace_template/UML_EA.DTD +6856 -0
- data/examples/exports/ArcGISWorkspace_template/model.xml +1427 -0
- data/examples/exports/UmlModel_template/UML_EA.DTD +6856 -0
- data/examples/exports/UmlModel_template/model.xml +23 -0
- data/examples/exports/basic/UML_EA.DTD +6856 -0
- data/examples/exports/basic/model.xml +8039 -0
- data/examples/exports/simple/UML_EA.DTD +6856 -0
- data/examples/exports/simple/model.xml +585 -0
- data/examples/exports/simple_example/UML_EA.DTD +6856 -0
- data/examples/exports/simple_example/model.xml +23 -0
- data/examples/exports/test/UML_EA.DTD +6856 -0
- data/examples/exports/test/model.xml +1638 -0
- data/examples/qea/basic.qea +0 -0
- data/frontend/README.md +51 -0
- data/frontend/dist/app.iife.js +24 -0
- data/frontend/dist/style.css +1 -0
- data/frontend/index.html +26 -0
- data/frontend/package-lock.json +2359 -0
- data/frontend/package.json +26 -0
- data/frontend/src/App.vue +59 -0
- data/frontend/src/app.ts +8 -0
- data/frontend/src/components/AppHeader.vue +127 -0
- data/frontend/src/components/AppSidebar.vue +119 -0
- data/frontend/src/components/ClassDetails.vue +247 -0
- data/frontend/src/components/DiagramView.vue +79 -0
- data/frontend/src/components/PackageDetails.vue +92 -0
- data/frontend/src/components/PackageTreeNode.vue +64 -0
- data/frontend/src/components/SearchResults.vue +48 -0
- data/frontend/src/components/WelcomeView.vue +87 -0
- data/frontend/src/shims-vue.d.ts +5 -0
- data/frontend/src/stores/dataStore.ts +79 -0
- data/frontend/src/stores/uiStore.ts +167 -0
- data/frontend/src/styles/main.css +1566 -0
- data/frontend/src/types.ts +221 -0
- data/frontend/tests/e2e/__screenshots__/new-dark-mode.png +0 -0
- data/frontend/tests/e2e/__screenshots__/new-package-details.png +0 -0
- data/frontend/tests/e2e/__screenshots__/new-search-modal.png +0 -0
- data/frontend/tests/e2e/__screenshots__/new-sidebar-collapsed.png +0 -0
- data/frontend/tests/e2e/__screenshots__/new-welcome.png +0 -0
- data/frontend/tests/e2e/render.spec.ts +188 -0
- data/frontend/tsconfig.json +20 -0
- data/frontend/vite.config.ts +26 -0
- data/frontend/vitest.config.ts +8 -0
- data/lib/ea/cli/app.rb +57 -2
- data/lib/ea/cli/command/diagrams.rb +37 -28
- data/lib/ea/cli/command/diff.rb +46 -0
- data/lib/ea/cli/command/export.rb +80 -0
- data/lib/ea/cli/command/info.rb +75 -0
- data/lib/ea/cli/command/lint.rb +48 -0
- data/lib/ea/cli/command/mdg.rb +98 -0
- data/lib/ea/cli/command/query.rb +34 -0
- data/lib/ea/cli/command/render.rb +135 -0
- data/lib/ea/cli/command/svg.rb +8 -15
- data/lib/ea/cli/command.rb +7 -0
- data/lib/ea/diagram/display_config.rb +184 -0
- data/lib/ea/diagram.rb +4 -41
- data/lib/ea/diff/change.rb +30 -0
- data/lib/ea/diff/comparator.rb +82 -0
- data/lib/ea/diff/html_reporter.rb +91 -0
- data/lib/ea/diff.rb +15 -0
- data/lib/ea/export/json/generator.rb +42 -0
- data/lib/ea/export/json.rb +12 -0
- data/lib/ea/export/json_schema/generator.rb +77 -0
- data/lib/ea/export/json_schema.rb +12 -0
- data/lib/ea/export/plantuml/generator.rb +73 -0
- data/lib/ea/export/plantuml.rb +12 -0
- data/lib/ea/export/xmi/generator.rb +77 -0
- data/lib/ea/export/xmi.rb +11 -0
- data/lib/ea/export/xsd/class_mapping.rb +65 -0
- data/lib/ea/export/xsd/generator.rb +142 -0
- data/lib/ea/export/xsd/namespace_registry.rb +82 -0
- data/lib/ea/export/xsd.rb +19 -0
- data/lib/ea/export.rb +14 -0
- data/lib/ea/image/emf_renderer.rb +42 -0
- data/lib/ea/image.rb +12 -0
- data/lib/ea/lint/engine.rb +30 -0
- data/lib/ea/lint/lint_rule.rb +38 -0
- data/lib/ea/lint/offense.rb +18 -0
- data/lib/ea/lint/rules/cyclic_generalization.rb +62 -0
- data/lib/ea/lint/rules/duplicate_name.rb +28 -0
- data/lib/ea/lint/rules/missing_stereotype.rb +35 -0
- data/lib/ea/lint/rules/naming_convention.rb +44 -0
- data/lib/ea/lint/rules/orphan_element.rb +28 -0
- data/lib/ea/lint/rules.rb +14 -0
- data/lib/ea/lint.rb +13 -0
- data/lib/ea/mdg/document.rb +120 -0
- data/lib/ea/mdg/loader.rb +118 -0
- data/lib/ea/mdg/registry.rb +98 -0
- data/lib/ea/mdg/stereotype_alias_registry.rb +77 -0
- data/lib/ea/mdg/xml/applies_to.rb +18 -0
- data/lib/ea/mdg/xml/apply.rb +18 -0
- data/lib/ea/mdg/xml/content.rb +18 -0
- data/lib/ea/mdg/xml/documentation.rb +24 -0
- data/lib/ea/mdg/xml/stereotype.rb +28 -0
- data/lib/ea/mdg/xml/stereotypes.rb +18 -0
- data/lib/ea/mdg/xml/tag.rb +28 -0
- data/lib/ea/mdg/xml/tagged_values.rb +18 -0
- data/lib/ea/mdg/xml/technology.rb +28 -0
- data/lib/ea/mdg/xml/uml_profile.rb +22 -0
- data/lib/ea/mdg/xml/uml_profiles.rb +18 -0
- data/lib/ea/mdg/xml.rb +24 -0
- data/lib/ea/mdg.rb +25 -0
- data/lib/ea/model/classifier.rb +4 -0
- data/lib/ea/model/constraint.rb +24 -0
- data/lib/ea/model/diagram.rb +85 -0
- data/lib/ea/model/diagram_connector.rb +34 -0
- data/lib/ea/model/diagram_element.rb +16 -0
- data/lib/ea/model/document.rb +47 -2
- data/lib/ea/model/ghost_label.rb +32 -0
- data/lib/ea/model/instance_specification.rb +34 -0
- data/lib/ea/model/legend.rb +43 -0
- data/lib/ea/model/legend_item.rb +26 -0
- data/lib/ea/model/note.rb +28 -0
- data/lib/ea/model/operation.rb +2 -0
- data/lib/ea/model/property.rb +2 -0
- data/lib/ea/model/relationship.rb +2 -0
- data/lib/ea/model/signal.rb +14 -0
- data/lib/ea/model/slot.rb +19 -0
- data/lib/ea/model.rb +8 -0
- data/lib/ea/ocl/evaluator.rb +94 -0
- data/lib/ea/ocl/nodes.rb +30 -0
- data/lib/ea/ocl/parser.rb +133 -0
- data/lib/ea/ocl/unsupported_error.rb +7 -0
- data/lib/ea/ocl.rb +13 -0
- data/lib/ea/qea/factory/document_builder.rb +24 -10
- data/lib/ea/qea/factory/generalization_builder.rb +9 -11
- data/lib/ea/qea/infrastructure/table_reader.rb +9 -0
- data/lib/ea/qea/models/ea_author.rb +35 -0
- data/lib/ea/qea/models/ea_glossary.rb +34 -0
- data/lib/ea/qea/models/ea_image.rb +53 -0
- data/lib/ea/qea/models/ea_implement.rb +32 -0
- data/lib/ea/qea/models/ea_list.rb +42 -0
- data/lib/ea/qea/models/ea_object_effort.rb +34 -0
- data/lib/ea/qea/models/ea_object_problem.rb +37 -0
- data/lib/ea/qea/models/ea_object_require.rb +34 -0
- data/lib/ea/qea/models/ea_object_resource.rb +34 -0
- data/lib/ea/qea/models/ea_object_risk.rb +34 -0
- data/lib/ea/qea/models/ea_object_scenario.rb +34 -0
- data/lib/ea/qea/models/ea_object_test.rb +35 -0
- data/lib/ea/qea/models/ea_object_trx.rb +34 -0
- data/lib/ea/qea/models/ea_operation.rb +7 -0
- data/lib/ea/qea/models/ea_palette.rb +30 -0
- data/lib/ea/qea/models/ea_palette_item.rb +36 -0
- data/lib/ea/qea/models/ea_phase.rb +40 -0
- data/lib/ea/qea/models/ea_role_constraint.rb +32 -0
- data/lib/ea/qea/models/ea_secrypt.rb +34 -0
- data/lib/ea/qea/models/ea_version.rb +39 -0
- data/lib/ea/qea/models/ea_xref.rb +11 -1
- data/lib/ea/qea/models.rb +19 -0
- data/lib/ea/qea/services/database_loader.rb +22 -1
- data/lib/ea/query/builder.rb +108 -0
- data/lib/ea/query.rb +9 -0
- data/lib/ea/render/image_converter.rb +101 -0
- data/lib/ea/render.rb +10 -0
- data/lib/ea/shapescript/parser.rb +208 -0
- data/lib/ea/shapescript/renderer.rb +74 -0
- data/lib/ea/shapescript/shape.rb +34 -0
- data/lib/ea/shapescript.rb +24 -0
- data/lib/ea/sources/qea/adapter.rb +22 -5
- data/lib/ea/sources/qea/classifier_builder.rb +184 -7
- data/lib/ea/sources/qea/diagram_builder.rb +352 -24
- data/lib/ea/sources/qea/id_normalizer.rb +16 -1
- data/lib/ea/sources/qea/instance_builder.rb +113 -0
- data/lib/ea/sources/qea/legend_builder.rb +137 -0
- data/lib/ea/sources/qea/note_builder.rb +58 -0
- data/lib/ea/sources/qea/object_classifier_map.rb +6 -1
- data/lib/ea/sources/qea/operation_builder.rb +1 -0
- data/lib/ea/sources/qea/package_builder.rb +16 -0
- data/lib/ea/sources/qea/relationship_builder.rb +21 -5
- data/lib/ea/sources/qea/tagged_value_builder.rb +28 -9
- data/lib/ea/sources/qea/xref/legend_definition.rb +35 -0
- data/lib/ea/sources/qea/xref/parser.rb +150 -0
- data/lib/ea/sources/qea/xref/property_definition.rb +29 -0
- data/lib/ea/sources/qea/xref/record.rb +41 -0
- data/lib/ea/sources/qea/xref/stereotype_application.rb +37 -0
- data/lib/ea/sources/qea/xref.rb +27 -0
- data/lib/ea/sources/qea.rb +4 -0
- data/lib/ea/sources/xmi/adapter.rb +80 -2
- data/lib/ea/sources/xmi/classifier_builder.rb +10 -1
- data/lib/ea/sources/xmi/diagram_builder.rb +95 -18
- data/lib/ea/sources/xmi/extension_geometry_parser.rb +19 -2
- data/lib/ea/sources/xmi/extension_style_parser.rb +15 -2
- data/lib/ea/sources/xmi/note_builder.rb +46 -0
- data/lib/ea/sources/xmi/property_builder.rb +9 -0
- data/lib/ea/sources/xmi/stereotype_builder.rb +54 -0
- data/lib/ea/sources/xmi/tag_builder.rb +45 -0
- data/lib/ea/sources/xmi/umldi_keyword_extractor.rb +87 -0
- data/lib/ea/sources/xmi.rb +4 -0
- data/lib/ea/spa/output/sharded_multi_file_strategy.rb +18 -3
- data/lib/ea/spa/output/single_file_strategy.rb +8 -2
- data/lib/ea/spa/output/strategy.rb +34 -0
- data/lib/ea/svg/connector_router.rb +134 -0
- data/lib/ea/svg/ea_emitter/background.rb +2 -3
- data/lib/ea/svg/ea_emitter/bounds_calculator.rb +142 -0
- data/lib/ea/svg/ea_emitter/canvas.rb +56 -33
- data/lib/ea/svg/ea_emitter/color_resolver.rb +56 -0
- data/lib/ea/svg/ea_emitter/compartment/attributes.rb +28 -0
- data/lib/ea/svg/ea_emitter/compartment/constraints.rb +30 -0
- data/lib/ea/svg/ea_emitter/compartment/enum_literals.rb +86 -0
- data/lib/ea/svg/ea_emitter/compartment/header.rb +32 -0
- data/lib/ea/svg/ea_emitter/compartment/header_divider.rb +57 -0
- data/lib/ea/svg/ea_emitter/compartment/instance_slots.rb +96 -0
- data/lib/ea/svg/ea_emitter/compartment/instance_underline.rb +67 -0
- data/lib/ea/svg/ea_emitter/compartment/note_body.rb +52 -0
- data/lib/ea/svg/ea_emitter/compartment/note_text.rb +102 -0
- data/lib/ea/svg/ea_emitter/compartment/operations.rb +38 -0
- data/lib/ea/svg/ea_emitter/compartment/package_contents.rb +72 -0
- data/lib/ea/svg/ea_emitter/compartment/package_from_parent.rb +136 -0
- data/lib/ea/svg/ea_emitter/compartment/shape.rb +82 -0
- data/lib/ea/svg/ea_emitter/compartment/tagged_values.rb +30 -0
- data/lib/ea/svg/ea_emitter/compartment.rb +58 -0
- data/lib/ea/svg/ea_emitter/connectors.rb +46 -12
- data/lib/ea/svg/ea_emitter/diagram_frame.rb +143 -0
- data/lib/ea/svg/ea_emitter/document.rb +15 -24
- data/lib/ea/svg/ea_emitter/element/attribute_line_builder.rb +117 -0
- data/lib/ea/svg/ea_emitter/element/attribute_renderer.rb +119 -0
- data/lib/ea/svg/ea_emitter/element/bcol_decoder.rb +29 -0
- data/lib/ea/svg/ea_emitter/element/compartment_geometry.rb +113 -0
- data/lib/ea/svg/ea_emitter/element/constraint_renderer.rb +53 -0
- data/lib/ea/svg/ea_emitter/element/divider_renderer.rb +17 -0
- data/lib/ea/svg/ea_emitter/element/enumeration_literal_renderer.rb +34 -0
- data/lib/ea/svg/ea_emitter/element/filter.rb +44 -0
- data/lib/ea/svg/ea_emitter/element/hand_draw_shape_renderer.rb +77 -0
- data/lib/ea/svg/ea_emitter/element/header_line_pipeline.rb +43 -0
- data/lib/ea/svg/ea_emitter/element/header_line_provider/instance_spec.rb +27 -0
- data/lib/ea/svg/ea_emitter/element/header_line_provider/name.rb +76 -0
- data/lib/ea/svg/ea_emitter/element/header_line_provider/parent_ghost.rb +25 -0
- data/lib/ea/svg/ea_emitter/element/header_line_provider/stereotype_label.rb +68 -0
- data/lib/ea/svg/ea_emitter/element/header_line_provider.rb +19 -0
- data/lib/ea/svg/ea_emitter/element/header_lines.rb +27 -0
- data/lib/ea/svg/ea_emitter/element/header_renderer.rb +48 -0
- data/lib/ea/svg/ea_emitter/element/icon_renderer.rb +109 -0
- data/lib/ea/svg/ea_emitter/element/legend_renderer.rb +177 -0
- data/lib/ea/svg/ea_emitter/element/note_shape_renderer.rb +112 -0
- data/lib/ea/svg/ea_emitter/element/operation_renderer.rb +100 -0
- data/lib/ea/svg/ea_emitter/element/package_shape_renderer.rb +181 -0
- data/lib/ea/svg/ea_emitter/element/row_icon_renderer.rb +156 -0
- data/lib/ea/svg/ea_emitter/element/shape_renderer.rb +17 -0
- data/lib/ea/svg/ea_emitter/element/stereotype_icon_renderer.rb +82 -0
- data/lib/ea/svg/ea_emitter/element/tagged_value_renderer.rb +50 -0
- data/lib/ea/svg/ea_emitter/element/text_escape.rb +20 -0
- data/lib/ea/svg/ea_emitter/element.rb +37 -0
- data/lib/ea/svg/ea_emitter/elements.rb +283 -95
- data/lib/ea/svg/ea_emitter/font_resolver.rb +111 -0
- data/lib/ea/svg/ea_emitter/ghost_labels.rb +66 -0
- data/lib/ea/svg/ea_emitter/label/end_label.rb +266 -0
- data/lib/ea/svg/ea_emitter/label/midpoint_label.rb +101 -0
- data/lib/ea/svg/ea_emitter/label/registry.rb +50 -0
- data/lib/ea/svg/ea_emitter/label.rb +23 -0
- data/lib/ea/svg/ea_emitter/labels.rb +93 -27
- data/lib/ea/svg/ea_emitter/layer.rb +20 -0
- data/lib/ea/svg/ea_emitter/layer_sequencer.rb +93 -0
- data/lib/ea/svg/ea_emitter/marker/arrow_path.rb +52 -0
- data/lib/ea/svg/ea_emitter/marker/diamond.rb +57 -0
- data/lib/ea/svg/ea_emitter/marker/kind.rb +35 -0
- data/lib/ea/svg/ea_emitter/marker/open_triangle.rb +27 -0
- data/lib/ea/svg/ea_emitter/marker/package_import.rb +39 -0
- data/lib/ea/svg/ea_emitter/marker/plus.rb +40 -0
- data/lib/ea/svg/ea_emitter/marker/registry.rb +42 -0
- data/lib/ea/svg/ea_emitter/marker.rb +37 -0
- data/lib/ea/svg/ea_emitter/markers.rb +351 -64
- data/lib/ea/svg/ea_emitter/render_context.rb +52 -0
- data/lib/ea/svg/ea_emitter/style.rb +15 -0
- data/lib/ea/svg/ea_emitter/text_renderer.rb +92 -0
- data/lib/ea/svg/ea_emitter.rb +33 -11
- data/lib/ea/svg/parity/checker.rb +105 -0
- data/lib/ea/svg/parity/source.rb +59 -0
- data/lib/ea/svg/parity/suite.rb +113 -0
- data/lib/ea/svg/parity.rb +14 -0
- data/lib/ea/svg.rb +2 -15
- data/lib/ea/theme/definition.rb +176 -0
- data/lib/ea/theme/loader.rb +125 -0
- data/lib/ea/theme/registry.rb +96 -0
- data/lib/ea/theme.rb +37 -0
- data/lib/ea/transformations.rb +5 -88
- data/lib/ea/version.rb +4 -1
- data/lib/ea.rb +14 -4
- data/lib/tasks/svg_bench.rake +87 -0
- data/lutaml-uml-0.5.1.gem +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-1-themes-list.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-1-themes.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-2-gradients.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-3-colors.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-4-appearance-fonts.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-4-appearance.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-5-behavior.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram-6-sequence.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-1-diagram.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-2-objects.png +0 -0
- data/reference-docs/enterprise-architect-appearance-dialogs/appearance-3-links.png +0 -0
- metadata +449 -26
- data/lib/ea/diagram/configuration.rb +0 -379
- data/lib/ea/diagram/element_renderers/base_renderer.rb +0 -77
- data/lib/ea/diagram/element_renderers/class_renderer.rb +0 -323
- data/lib/ea/diagram/element_renderers/connector_renderer.rb +0 -41
- data/lib/ea/diagram/element_renderers/package_renderer.rb +0 -61
- data/lib/ea/diagram/element_renderers.rb +0 -43
- data/lib/ea/diagram/extractor.rb +0 -566
- data/lib/ea/diagram/layout_engine.rb +0 -170
- data/lib/ea/diagram/path_builder.rb +0 -202
- data/lib/ea/diagram/style_parser.rb +0 -42
- data/lib/ea/diagram/style_resolver.rb +0 -291
- data/lib/ea/diagram/svg_renderer.rb +0 -274
- data/lib/ea/diagram/util.rb +0 -73
- data/lib/ea/svg/bounds_calculator.rb +0 -74
- data/lib/ea/svg/connector_path.rb +0 -138
- data/lib/ea/svg/element_box.rb +0 -256
- data/lib/ea/svg/renderer.rb +0 -77
- data/lib/ea/svg/style_resolver.rb +0 -72
- data/lib/ea/transformations/configuration.rb +0 -333
- data/lib/ea/transformations/format_registry.rb +0 -366
- data/lib/ea/transformations/parsers/base_parser.rb +0 -482
- data/lib/ea/transformations/parsers/qea_parser.rb +0 -401
- data/lib/ea/transformations/parsers/xmi_parser.rb +0 -243
- data/lib/ea/transformations/transformation_engine.rb +0 -390
|
@@ -1,390 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Ea
|
|
4
|
-
module Transformations
|
|
5
|
-
# Transformation Engine orchestrates the entire model transformation
|
|
6
|
-
# process.
|
|
7
|
-
#
|
|
8
|
-
# This class implements the Facade pattern to provide a simple interface
|
|
9
|
-
# for complex model transformation operations. It coordinates between
|
|
10
|
-
# configuration, format detection, parser selection, and transformation.
|
|
11
|
-
#
|
|
12
|
-
# The engine follows the Dependency Inversion Principle by depending on
|
|
13
|
-
# abstractions (BaseParser interface) rather than concrete implementations.
|
|
14
|
-
#
|
|
15
|
-
# @example Basic usage
|
|
16
|
-
# engine = TransformationEngine.new
|
|
17
|
-
# document = engine.parse("model.xmi")
|
|
18
|
-
#
|
|
19
|
-
# @example With custom configuration
|
|
20
|
-
# config = Configuration.load("my_config.yml")
|
|
21
|
-
# engine = TransformationEngine.new(config)
|
|
22
|
-
# document = engine.parse("model.qea")
|
|
23
|
-
class TransformationEngine
|
|
24
|
-
# @return [Configuration] Current configuration
|
|
25
|
-
attr_reader :configuration
|
|
26
|
-
|
|
27
|
-
# @return [FormatRegistry] Format registry
|
|
28
|
-
attr_reader :format_registry
|
|
29
|
-
|
|
30
|
-
# @return [Array<Hash>] Transformation history
|
|
31
|
-
attr_reader :transformation_history
|
|
32
|
-
|
|
33
|
-
# @return [Parser] Parser instance
|
|
34
|
-
attr_reader :current_parser
|
|
35
|
-
|
|
36
|
-
# Initialize transformation engine
|
|
37
|
-
#
|
|
38
|
-
# @param configuration [Configuration, nil] Configuration to use
|
|
39
|
-
# (defaults to auto-loaded configuration)
|
|
40
|
-
def initialize(configuration = nil)
|
|
41
|
-
@configuration = configuration || Configuration.load
|
|
42
|
-
@format_registry = FormatRegistry.new
|
|
43
|
-
@transformation_history = []
|
|
44
|
-
@parser_cache = {}
|
|
45
|
-
|
|
46
|
-
# Load parsers from configuration
|
|
47
|
-
setup_parsers
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# Parse a model file into a UML document
|
|
51
|
-
#
|
|
52
|
-
# This is the main entry point for model transformation. It auto-detects
|
|
53
|
-
# the file format and uses the appropriate parser.
|
|
54
|
-
#
|
|
55
|
-
# @param file_path [String] Path to the model file
|
|
56
|
-
# @param options [Hash] Parsing options (merged with configuration)
|
|
57
|
-
# @return [Lutaml::Uml::Document] Parsed UML document
|
|
58
|
-
# @raise [UnsupportedFormatError] if file format is not supported
|
|
59
|
-
# @raise [ParseError] if parsing fails
|
|
60
|
-
def parse(file_path, options = {}) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
61
|
-
validate_file_path!(file_path)
|
|
62
|
-
|
|
63
|
-
# Detect format and get parser
|
|
64
|
-
parser_class = detect_parser(file_path)
|
|
65
|
-
raise UnsupportedFormatError.new(file_path) unless parser_class
|
|
66
|
-
|
|
67
|
-
# Create parser instance with merged options
|
|
68
|
-
merged_options = merge_options(options)
|
|
69
|
-
@current_parser = get_parser_instance(parser_class, merged_options)
|
|
70
|
-
|
|
71
|
-
# Record transformation start
|
|
72
|
-
transformation_start = Time.now
|
|
73
|
-
|
|
74
|
-
begin
|
|
75
|
-
# Perform parsing
|
|
76
|
-
document = @current_parser.parse(file_path)
|
|
77
|
-
|
|
78
|
-
# Record successful transformation
|
|
79
|
-
record_transformation(
|
|
80
|
-
file_path: file_path,
|
|
81
|
-
parser: @current_parser,
|
|
82
|
-
duration: Time.now - transformation_start,
|
|
83
|
-
success: true,
|
|
84
|
-
document: document,
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
document
|
|
88
|
-
rescue StandardError => e
|
|
89
|
-
# Record failed transformation
|
|
90
|
-
record_transformation(
|
|
91
|
-
file_path: file_path,
|
|
92
|
-
parser: @current_parser,
|
|
93
|
-
duration: Time.now - transformation_start,
|
|
94
|
-
success: false,
|
|
95
|
-
error: e,
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
# Re-raise the error
|
|
99
|
-
raise
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
# Auto-detect file format and return appropriate parser class
|
|
104
|
-
#
|
|
105
|
-
# Uses multiple detection strategies:
|
|
106
|
-
# 1. File extension
|
|
107
|
-
# 2. Content detection (magic bytes)
|
|
108
|
-
# 3. Fallback parser from configuration
|
|
109
|
-
#
|
|
110
|
-
# @param file_path [String] Path to the model file
|
|
111
|
-
# @return [Class, nil] Parser class, or nil if format cannot be detected
|
|
112
|
-
def detect_parser(file_path) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength
|
|
113
|
-
# Strategy 1: File extension detection
|
|
114
|
-
if @configuration.file_extension_detection_enabled?
|
|
115
|
-
parser_class = @format_registry.parser_for_file(file_path)
|
|
116
|
-
return parser_class if parser_class
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# Strategy 2: Content detection
|
|
120
|
-
if @configuration.content_sniffing_enabled?
|
|
121
|
-
parser_class = @format_registry.detect_by_content(file_path)
|
|
122
|
-
return parser_class if parser_class
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
# Strategy 3: Fallback parser
|
|
126
|
-
fallback_parser_name = @configuration.fallback_parser
|
|
127
|
-
if fallback_parser_name
|
|
128
|
-
return Transformations.constantize(fallback_parser_name)
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
nil
|
|
132
|
-
rescue StandardError
|
|
133
|
-
nil
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
# Get list of supported file extensions
|
|
137
|
-
#
|
|
138
|
-
# @return [Array<String>] List of supported extensions
|
|
139
|
-
def supported_extensions
|
|
140
|
-
@format_registry.supported_extensions
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
# Check if a file format is supported
|
|
144
|
-
#
|
|
145
|
-
# @param file_path [String] Path to check
|
|
146
|
-
# @return [Boolean] true if format is supported
|
|
147
|
-
def supports_file?(file_path)
|
|
148
|
-
detect_parser(file_path) != nil
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
# Register a custom parser for a file extension
|
|
152
|
-
#
|
|
153
|
-
# @param extension [String] File extension (e.g., ".custom")
|
|
154
|
-
# @param parser_class [Class] Parser class implementing BaseParser
|
|
155
|
-
# interface
|
|
156
|
-
# @return [void]
|
|
157
|
-
def register_parser(extension, parser_class)
|
|
158
|
-
@format_registry.register(extension, parser_class)
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
# Unregister a parser for a file extension
|
|
162
|
-
#
|
|
163
|
-
# @param extension [String] File extension to unregister
|
|
164
|
-
# @return [Class, nil] The unregistered parser class
|
|
165
|
-
def unregister_parser(extension)
|
|
166
|
-
@format_registry.unregister(extension)
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
# Set configuration and reload parsers
|
|
170
|
-
#
|
|
171
|
-
# @param config [Configuration] New configuration
|
|
172
|
-
# @return [void]
|
|
173
|
-
def configuration=(config)
|
|
174
|
-
@configuration = config
|
|
175
|
-
@parser_cache.clear
|
|
176
|
-
setup_parsers
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
# Get comprehensive transformation statistics
|
|
180
|
-
#
|
|
181
|
-
# @return [Hash] Statistics about transformations
|
|
182
|
-
def statistics # rubocop:disable Metrics/MethodLength
|
|
183
|
-
successful_transformations = @transformation_history.count do |t|
|
|
184
|
-
t[:success]
|
|
185
|
-
end
|
|
186
|
-
failed_transformations = @transformation_history.count do |t|
|
|
187
|
-
!t[:success]
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
{
|
|
191
|
-
total_transformations: @transformation_history.size,
|
|
192
|
-
successful_transformations: successful_transformations,
|
|
193
|
-
failed_transformations: failed_transformations,
|
|
194
|
-
success_rate: calculate_success_rate,
|
|
195
|
-
average_duration: calculate_average_duration,
|
|
196
|
-
supported_extensions: supported_extensions,
|
|
197
|
-
registered_parsers: @format_registry.all_parsers.keys,
|
|
198
|
-
configuration_version: @configuration.version,
|
|
199
|
-
}
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
# Clear transformation history
|
|
203
|
-
#
|
|
204
|
-
# @return [void]
|
|
205
|
-
def clear_history
|
|
206
|
-
@transformation_history.clear
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
# Get transformation history for a specific file
|
|
210
|
-
#
|
|
211
|
-
# @param file_path [String] Path to the file
|
|
212
|
-
# @return [Array<Hash>] Transformation history entries for the file
|
|
213
|
-
def history_for_file(file_path)
|
|
214
|
-
@transformation_history.select do |entry|
|
|
215
|
-
entry[:file_path] == file_path
|
|
216
|
-
end
|
|
217
|
-
end
|
|
218
|
-
|
|
219
|
-
# Get recent transformation failures
|
|
220
|
-
#
|
|
221
|
-
# @param limit [Integer] Maximum number of failures to return
|
|
222
|
-
# @return [Array<Hash>] Recent failure entries
|
|
223
|
-
def recent_failures(limit = 10)
|
|
224
|
-
@transformation_history
|
|
225
|
-
.reject { |entry| entry[:success] }
|
|
226
|
-
.last(limit)
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
# Validate configuration and parsers
|
|
230
|
-
#
|
|
231
|
-
# @return [Hash] Validation results
|
|
232
|
-
def validate_setup # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
233
|
-
results = {
|
|
234
|
-
configuration_valid: false,
|
|
235
|
-
parsers_loaded: 0,
|
|
236
|
-
parser_errors: [],
|
|
237
|
-
warnings: [],
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
# Validate configuration
|
|
241
|
-
begin
|
|
242
|
-
if @configuration&.enabled_parsers&.any?
|
|
243
|
-
results[:configuration_valid] = true
|
|
244
|
-
else
|
|
245
|
-
results[:warnings] << "No enabled parsers in configuration"
|
|
246
|
-
end
|
|
247
|
-
rescue StandardError => e
|
|
248
|
-
results[:parser_errors] << "Configuration error: #{e.message}"
|
|
249
|
-
end
|
|
250
|
-
|
|
251
|
-
# Validate each parser
|
|
252
|
-
@format_registry.all_parsers.each_value do |parser_class|
|
|
253
|
-
# Try to create instance to validate
|
|
254
|
-
parser = parser_class.new(configuration: @configuration)
|
|
255
|
-
if parser.is_a?(Parsers::BaseParser)
|
|
256
|
-
results[:parsers_loaded] += 1
|
|
257
|
-
else
|
|
258
|
-
results[:parser_errors] << "Parser #{parser_class} does not " \
|
|
259
|
-
"implement parse method"
|
|
260
|
-
end
|
|
261
|
-
rescue StandardError => e
|
|
262
|
-
results[:parser_errors] << "Failed to instantiate #{parser_class}: " \
|
|
263
|
-
"#{e.message}"
|
|
264
|
-
end
|
|
265
|
-
|
|
266
|
-
results
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
private
|
|
270
|
-
|
|
271
|
-
# Setup parsers from configuration
|
|
272
|
-
#
|
|
273
|
-
# @return [void]
|
|
274
|
-
def setup_parsers
|
|
275
|
-
# Clear existing parsers
|
|
276
|
-
@format_registry.clear
|
|
277
|
-
|
|
278
|
-
# Load parsers from configuration
|
|
279
|
-
@format_registry.load_from_configuration(@configuration)
|
|
280
|
-
|
|
281
|
-
# Load default parsers if none configured
|
|
282
|
-
if @format_registry.supported_extensions.empty?
|
|
283
|
-
@format_registry.load_default_parsers
|
|
284
|
-
end
|
|
285
|
-
end
|
|
286
|
-
|
|
287
|
-
# Get parser instance (with caching)
|
|
288
|
-
#
|
|
289
|
-
# @param parser_class [Class] Parser class
|
|
290
|
-
# @param options [Hash] Parser options
|
|
291
|
-
# @return [BaseParser] Parser instance
|
|
292
|
-
def get_parser_instance(parser_class, options)
|
|
293
|
-
cache_key = [parser_class, options.hash]
|
|
294
|
-
|
|
295
|
-
@parser_cache[cache_key] ||= parser_class.new(
|
|
296
|
-
configuration: @configuration,
|
|
297
|
-
options: options,
|
|
298
|
-
)
|
|
299
|
-
end
|
|
300
|
-
|
|
301
|
-
# Merge options with configuration defaults
|
|
302
|
-
#
|
|
303
|
-
# @param options [Hash] User-provided options
|
|
304
|
-
# @return [Hash] Merged options
|
|
305
|
-
def merge_options(options) # rubocop:disable Metrics/MethodLength
|
|
306
|
-
default_options = {}
|
|
307
|
-
|
|
308
|
-
if @configuration.transformation_options
|
|
309
|
-
default_options = {
|
|
310
|
-
validate_output: @configuration
|
|
311
|
-
.transformation_options.validate_output,
|
|
312
|
-
include_diagrams: @configuration
|
|
313
|
-
.transformation_options.include_diagrams,
|
|
314
|
-
preserve_ids: @configuration.transformation_options.preserve_ids,
|
|
315
|
-
resolve_references: @configuration
|
|
316
|
-
.transformation_options.resolve_references,
|
|
317
|
-
strict_mode: @configuration.transformation_options.strict_mode,
|
|
318
|
-
}
|
|
319
|
-
end
|
|
320
|
-
|
|
321
|
-
default_options.merge(options)
|
|
322
|
-
end
|
|
323
|
-
|
|
324
|
-
# Record transformation in history
|
|
325
|
-
#
|
|
326
|
-
# @param entry [Hash] Transformation entry
|
|
327
|
-
# @return [void]
|
|
328
|
-
def record_transformation(entry)
|
|
329
|
-
# Add timestamp and additional metadata
|
|
330
|
-
full_entry = entry.merge(
|
|
331
|
-
timestamp: Time.now,
|
|
332
|
-
engine_version: self.class.name,
|
|
333
|
-
configuration_version: @configuration.version,
|
|
334
|
-
)
|
|
335
|
-
|
|
336
|
-
@transformation_history.push(full_entry)
|
|
337
|
-
@transformation_history.shift if @transformation_history.size > 1000
|
|
338
|
-
end
|
|
339
|
-
|
|
340
|
-
# Calculate success rate
|
|
341
|
-
#
|
|
342
|
-
# @return [Float] Success rate as percentage
|
|
343
|
-
def calculate_success_rate
|
|
344
|
-
return 0.0 if @transformation_history.empty?
|
|
345
|
-
|
|
346
|
-
successful = @transformation_history.count { |t| t[:success] }
|
|
347
|
-
(successful.to_f / @transformation_history.size * 100).round(2)
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
# Calculate average transformation duration
|
|
351
|
-
#
|
|
352
|
-
# @return [Float] Average duration in seconds
|
|
353
|
-
def calculate_average_duration
|
|
354
|
-
return 0.0 if @transformation_history.empty?
|
|
355
|
-
|
|
356
|
-
total_duration = @transformation_history.sum { |t| t[:duration] || 0 }
|
|
357
|
-
(total_duration / @transformation_history.size).round(3)
|
|
358
|
-
end
|
|
359
|
-
|
|
360
|
-
# Validate file path
|
|
361
|
-
#
|
|
362
|
-
# @param file_path [String] File path to validate
|
|
363
|
-
# @raise [ArgumentError] if path is invalid
|
|
364
|
-
def validate_file_path!(file_path)
|
|
365
|
-
raise ArgumentError, "File path cannot be nil" if file_path.nil?
|
|
366
|
-
raise ArgumentError, "File path cannot be empty" if file_path.empty?
|
|
367
|
-
|
|
368
|
-
unless File.exist?(file_path)
|
|
369
|
-
raise ArgumentError,
|
|
370
|
-
"File does not exist: #{file_path}"
|
|
371
|
-
end
|
|
372
|
-
end
|
|
373
|
-
end
|
|
374
|
-
|
|
375
|
-
# Error class for unsupported file formats
|
|
376
|
-
class UnsupportedFormatError < Ea::Error
|
|
377
|
-
# @return [String] Path to the unsupported file
|
|
378
|
-
attr_reader :file_path
|
|
379
|
-
|
|
380
|
-
# Initialize error
|
|
381
|
-
#
|
|
382
|
-
# @param file_path [String] Path to unsupported file
|
|
383
|
-
def initialize(file_path)
|
|
384
|
-
@file_path = file_path
|
|
385
|
-
extension = File.extname(file_path)
|
|
386
|
-
super("Unsupported file format: #{extension} (file: #{file_path})")
|
|
387
|
-
end
|
|
388
|
-
end
|
|
389
|
-
end
|
|
390
|
-
end
|