ea 0.1.0 → 0.1.4
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/CLAUDE.md +125 -0
- data/Rakefile +12 -4
- data/TODO.next/00-publish-blocking-bugs.md +74 -0
- data/TODO.next/01-standalone-ea-gem-identity.md +76 -0
- data/TODO.next/02-optional-lutaml-uml-dependency.md +47 -0
- data/TODO.next/03-slim-lutaml-uml.md +79 -0
- data/TODO.next/04-loader-registry-for-uml-repository.md +49 -0
- data/TODO.next/05-extract-shared-transformer-methods.md +14 -0
- data/TODO.next/06-deduplicate-stereotype-loading.md +17 -0
- data/TODO.next/07-transformer-registry-in-factory.md +20 -0
- data/TODO.next/08-connector-type-registry.md +27 -0
- data/TODO.next/09-element-renderer-registry.md +29 -0
- data/TODO.next/10-connector-renderer-lsp.md +18 -0
- data/TODO.next/11-consolidate-style-knowledge.md +33 -0
- data/TODO.next/12-data-driven-from-db-row.md +24 -0
- data/TODO.next/13-extract-duplicated-methods.md +17 -0
- data/TODO.next/14-remove-dead-code.md +10 -0
- data/TODO.next/15-narrow-exception-handling.md +39 -0
- data/TODO.next/16-repository-indexes.md +28 -0
- data/TODO.next/17-fix-spec-quality-and-coverage.md +32 -0
- data/TODO.next/18-xmi-tool-specific-parser-architecture.md +172 -0
- data/TODO.next/19-fix-ea-gemspec-dependency-declarations.md +56 -0
- data/TODO.next/20-ci-requires-unreleased-lutaml-uml.md +63 -0
- data/TODO.next/21-qeatoxmi-via-xmi-gem.md +340 -0
- data/TODO.next/22-strip-respond-to-from-qeatoxmi-specs.md +32 -0
- data/TODO.next/23-cleanup-idallocator.md +41 -0
- data/TODO.next/24-tighten-parity-specs.md +42 -0
- data/TODO.next/25-sparx-eaid-format-for-synthesized-ids.md +62 -0
- data/TODO.next/26-fix-uppervalue-lowervalue-count-gap.md +51 -0
- data/TODO.next/27-extract-cardinality-module.md +68 -0
- data/TODO.next/28-extract-xml-sanitizer.md +51 -0
- data/TODO.next/29-ocp-registry-for-classifier-builders.md +58 -0
- data/TODO.next/30-struct-return-for-association-end.md +37 -0
- data/TODO.next/31-idallocator-specs.md +27 -0
- data/TODO.next/32-phase2-gap-sentinel-specs.md +53 -0
- data/TODO.next/33-normalize-lower-cleanup.md +30 -0
- data/TODO.next/34-document-member-end-order-rt-prefix.md +29 -0
- data/TODO.next/35-walk-runstate-for-instance-slots.md +76 -0
- data/TODO.next/36-wire-interface-realization.md +50 -0
- data/TODO.next/37-visibility-returns-real-booleans.md +36 -0
- data/config/diagram_styles.yml +200 -0
- data/config/model_transformations.yml +266 -0
- data/config/qea_schema.yml +1024 -0
- data/docs/ea_to_uml_type_mapping.md +89 -0
- data/docs/xmi_qea_conversion_capabilities.md +99 -0
- data/examples/lur/20251010_current_plateau_v5.1.lur +0 -0
- data/examples/lur/basic.lur +0 -0
- data/examples/lur/test-output.lur +0 -0
- data/examples/lur/test.lur +0 -0
- data/examples/lur_basic_usage.rb +221 -0
- data/examples/lur_cli_workflow.rb +263 -0
- data/examples/lur_statistics.rb +326 -0
- data/examples/qea/20251010_current_plateau_v5.1.qea +0 -0
- data/examples/qea/ArcGISWorkspace_template.qea +0 -0
- data/examples/qea/README_qea_parser.adoc +230 -0
- data/examples/qea/UmlModel_template.qea +0 -0
- data/examples/qea/basic.qea +0 -0
- data/examples/qea/simple.qea +0 -0
- data/examples/qea/simple_example.qea +0 -0
- data/examples/qea/test.qea +0 -0
- data/examples/qea_standalone_query.rb +73 -0
- data/examples/qea_to_repository.rb +51 -0
- data/examples/smoke_test_real_qea.rb +81 -0
- data/exe/ea +7 -0
- data/lib/ea/cli/app.rb +72 -0
- data/lib/ea/cli/command/base.rb +80 -0
- data/lib/ea/cli/command/convert.rb +62 -0
- data/lib/ea/cli/command/diagrams.rb +81 -0
- data/lib/ea/cli/command/list.rb +61 -0
- data/lib/ea/cli/command/parse.rb +29 -0
- data/lib/ea/cli/command/stats.rb +20 -0
- data/lib/ea/cli/command/validate.rb +41 -0
- data/lib/ea/cli/command.rb +15 -0
- data/lib/ea/cli/error.rb +34 -0
- data/lib/ea/cli/output/formatter.rb +34 -0
- data/lib/ea/cli/output/json_formatter.rb +20 -0
- data/lib/ea/cli/output/table_formatter.rb +42 -0
- data/lib/ea/cli/output/yaml_formatter.rb +20 -0
- data/lib/ea/cli/output.rb +56 -0
- data/lib/ea/cli.rb +17 -0
- data/lib/ea/diagram/configuration.rb +379 -0
- data/lib/ea/diagram/element_renderers/base_renderer.rb +77 -0
- data/lib/ea/diagram/element_renderers/class_renderer.rb +323 -0
- data/lib/ea/diagram/element_renderers/connector_renderer.rb +41 -0
- data/lib/ea/diagram/element_renderers/package_renderer.rb +61 -0
- data/lib/ea/diagram/element_renderers.rb +43 -0
- data/lib/ea/diagram/extractor.rb +560 -0
- data/lib/ea/diagram/layout_engine.rb +170 -0
- data/lib/ea/diagram/path_builder.rb +202 -0
- data/lib/ea/diagram/style_parser.rb +42 -0
- data/lib/ea/diagram/style_resolver.rb +276 -0
- data/lib/ea/diagram/svg_renderer.rb +274 -0
- data/lib/ea/diagram/util.rb +73 -0
- data/lib/ea/diagram.rb +47 -0
- data/lib/ea/qea/benchmark.rb +210 -0
- data/lib/ea/qea/database.rb +308 -0
- data/lib/ea/qea/factory/association_builder.rb +203 -0
- data/lib/ea/qea/factory/association_transformer.rb +91 -0
- data/lib/ea/qea/factory/attribute_tag_transformer.rb +57 -0
- data/lib/ea/qea/factory/attribute_transformer.rb +93 -0
- data/lib/ea/qea/factory/base_transformer.rb +177 -0
- data/lib/ea/qea/factory/class_transformer.rb +116 -0
- data/lib/ea/qea/factory/constraint_transformer.rb +75 -0
- data/lib/ea/qea/factory/data_type_transformer.rb +77 -0
- data/lib/ea/qea/factory/diagram_transformer.rb +157 -0
- data/lib/ea/qea/factory/document_builder.rb +283 -0
- data/lib/ea/qea/factory/ea_to_uml_factory.rb +229 -0
- data/lib/ea/qea/factory/enum_transformer.rb +74 -0
- data/lib/ea/qea/factory/generalization_builder.rb +227 -0
- data/lib/ea/qea/factory/generalization_transformer.rb +98 -0
- data/lib/ea/qea/factory/instance_transformer.rb +68 -0
- data/lib/ea/qea/factory/object_property_transformer.rb +58 -0
- data/lib/ea/qea/factory/operation_transformer.rb +66 -0
- data/lib/ea/qea/factory/package_transformer.rb +145 -0
- data/lib/ea/qea/factory/reference_resolver.rb +99 -0
- data/lib/ea/qea/factory/stereotype_loader.rb +39 -0
- data/lib/ea/qea/factory/tagged_value_transformer.rb +38 -0
- data/lib/ea/qea/factory/transformer_registry.rb +80 -0
- data/lib/ea/qea/factory.rb +37 -0
- data/lib/ea/qea/file_detector.rb +178 -0
- data/lib/ea/qea/infrastructure/database_connection.rb +100 -0
- data/lib/ea/qea/infrastructure/schema_reader.rb +136 -0
- data/lib/ea/qea/infrastructure/table_reader.rb +224 -0
- data/lib/ea/qea/infrastructure.rb +12 -0
- data/lib/ea/qea/models/base_model.rb +59 -0
- data/lib/ea/qea/models/ea_attribute.rb +109 -0
- data/lib/ea/qea/models/ea_attribute_tag.rb +100 -0
- data/lib/ea/qea/models/ea_complexity_type.rb +79 -0
- data/lib/ea/qea/models/ea_connector.rb +160 -0
- data/lib/ea/qea/models/ea_connector_type.rb +60 -0
- data/lib/ea/qea/models/ea_constraint_type.rb +63 -0
- data/lib/ea/qea/models/ea_datatype.rb +104 -0
- data/lib/ea/qea/models/ea_diagram.rb +115 -0
- data/lib/ea/qea/models/ea_diagram_link.rb +78 -0
- data/lib/ea/qea/models/ea_diagram_object.rb +73 -0
- data/lib/ea/qea/models/ea_diagram_type.rb +56 -0
- data/lib/ea/qea/models/ea_document.rb +63 -0
- data/lib/ea/qea/models/ea_object.rb +223 -0
- data/lib/ea/qea/models/ea_object_constraint.rb +53 -0
- data/lib/ea/qea/models/ea_object_property.rb +87 -0
- data/lib/ea/qea/models/ea_object_type.rb +73 -0
- data/lib/ea/qea/models/ea_operation.rb +127 -0
- data/lib/ea/qea/models/ea_operation_param.rb +76 -0
- data/lib/ea/qea/models/ea_package.rb +78 -0
- data/lib/ea/qea/models/ea_script.rb +62 -0
- data/lib/ea/qea/models/ea_status_type.rb +66 -0
- data/lib/ea/qea/models/ea_stereotype.rb +57 -0
- data/lib/ea/qea/models/ea_tagged_value.rb +99 -0
- data/lib/ea/qea/models/ea_xref.rb +165 -0
- data/lib/ea/qea/models.rb +35 -0
- data/lib/ea/qea/repositories/base_repository.rb +225 -0
- data/lib/ea/qea/repositories/object_repository.rb +219 -0
- data/lib/ea/qea/repositories.rb +10 -0
- data/lib/ea/qea/services/configuration.rb +211 -0
- data/lib/ea/qea/services/database_loader.rb +191 -0
- data/lib/ea/qea/services.rb +10 -0
- data/lib/ea/qea/validation/association_validator.rb +73 -0
- data/lib/ea/qea/validation/attribute_validator.rb +91 -0
- data/lib/ea/qea/validation/base_validator.rb +331 -0
- data/lib/ea/qea/validation/class_validator.rb +121 -0
- data/lib/ea/qea/validation/database/circular_reference_validator.rb +109 -0
- data/lib/ea/qea/validation/database/orphan_validator.rb +153 -0
- data/lib/ea/qea/validation/database/referential_integrity_validator.rb +128 -0
- data/lib/ea/qea/validation/database.rb +16 -0
- data/lib/ea/qea/validation/diagram_validator.rb +112 -0
- data/lib/ea/qea/validation/formatters/json_formatter.rb +137 -0
- data/lib/ea/qea/validation/formatters/text_formatter.rb +235 -0
- data/lib/ea/qea/validation/formatters.rb +12 -0
- data/lib/ea/qea/validation/operation_validator.rb +71 -0
- data/lib/ea/qea/validation/package_validator.rb +111 -0
- data/lib/ea/qea/validation/validation_engine.rb +387 -0
- data/lib/ea/qea/validation/validation_message.rb +144 -0
- data/lib/ea/qea/validation/validation_result.rb +210 -0
- data/lib/ea/qea/validation/validator_registry.rb +134 -0
- data/lib/ea/qea/validation.rb +28 -0
- data/lib/ea/qea/verification/comparison_result.rb +264 -0
- data/lib/ea/qea/verification/document_normalizer.rb +169 -0
- data/lib/ea/qea/verification/document_verifier.rb +322 -0
- data/lib/ea/qea/verification/element_comparator.rb +277 -0
- data/lib/ea/qea/verification/structure_matcher.rb +287 -0
- data/lib/ea/qea/verification.rb +14 -0
- data/lib/ea/qea.rb +185 -0
- data/lib/ea/transformations/configuration.rb +333 -0
- data/lib/ea/transformations/format_registry.rb +366 -0
- data/lib/ea/transformations/parsers/base_parser.rb +482 -0
- data/lib/ea/transformations/parsers/qea_parser.rb +401 -0
- data/lib/ea/transformations/parsers/xmi_parser.rb +243 -0
- data/lib/ea/transformations/transformation_engine.rb +390 -0
- data/lib/ea/transformations.rb +85 -0
- data/lib/ea/transformers/qea_to_xmi/association_end.rb +19 -0
- data/lib/ea/transformers/qea_to_xmi/cardinality.rb +96 -0
- data/lib/ea/transformers/qea_to_xmi/context.rb +106 -0
- data/lib/ea/transformers/qea_to_xmi/guid_format.rb +56 -0
- data/lib/ea/transformers/qea_to_xmi/id_allocator.rb +92 -0
- data/lib/ea/transformers/qea_to_xmi/run_state.rb +107 -0
- data/lib/ea/transformers/qea_to_xmi/transformer.rb +607 -0
- data/lib/ea/transformers/qea_to_xmi/visibility.rb +73 -0
- data/lib/ea/transformers/qea_to_xmi.rb +29 -0
- data/lib/ea/transformers/uml_to_xmi/id_generator.rb +54 -0
- data/lib/ea/transformers/uml_to_xmi/transformer.rb +152 -0
- data/lib/ea/transformers/uml_to_xmi/writer.rb +96 -0
- data/lib/ea/transformers/uml_to_xmi.rb +16 -0
- data/lib/ea/transformers.rb +34 -0
- data/lib/ea/version.rb +1 -1
- data/lib/ea/xmi/liquid_drops/association_drop.rb +56 -0
- data/lib/ea/xmi/liquid_drops/attribute_drop.rb +72 -0
- data/lib/ea/xmi/liquid_drops/cardinality_drop.rb +35 -0
- data/lib/ea/xmi/liquid_drops/connector_drop.rb +54 -0
- data/lib/ea/xmi/liquid_drops/constraint_drop.rb +29 -0
- data/lib/ea/xmi/liquid_drops/data_type_drop.rb +63 -0
- data/lib/ea/xmi/liquid_drops/dependency_drop.rb +36 -0
- data/lib/ea/xmi/liquid_drops/diagram_drop.rb +34 -0
- data/lib/ea/xmi/liquid_drops/enum_drop.rb +49 -0
- data/lib/ea/xmi/liquid_drops/enum_owned_literal_drop.rb +25 -0
- data/lib/ea/xmi/liquid_drops/generalization_attribute_drop.rb +87 -0
- data/lib/ea/xmi/liquid_drops/generalization_drop.rb +127 -0
- data/lib/ea/xmi/liquid_drops/klass_drop.rb +191 -0
- data/lib/ea/xmi/liquid_drops/operation_drop.rb +29 -0
- data/lib/ea/xmi/liquid_drops/package_drop.rb +108 -0
- data/lib/ea/xmi/liquid_drops/root_drop.rb +34 -0
- data/lib/ea/xmi/liquid_drops/source_target_drop.rb +43 -0
- data/lib/ea/xmi/lookup_service.rb +89 -0
- data/lib/ea/xmi/parser.rb +919 -0
- data/lib/ea/xmi.rb +35 -0
- data/lib/ea.rb +10 -1
- metadata +382 -9
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ea
|
|
4
|
+
module Qea
|
|
5
|
+
module Models
|
|
6
|
+
# Represents an operation from the t_operation table in EA database
|
|
7
|
+
# This represents class methods/operations
|
|
8
|
+
class EaOperation < BaseModel
|
|
9
|
+
attribute :operationid, Lutaml::Model::Type::Integer
|
|
10
|
+
attribute :ea_object_id, Lutaml::Model::Type::Integer
|
|
11
|
+
attribute :name, Lutaml::Model::Type::String
|
|
12
|
+
attribute :scope, Lutaml::Model::Type::String
|
|
13
|
+
attribute :type, Lutaml::Model::Type::String
|
|
14
|
+
attribute :returnarray, Lutaml::Model::Type::String
|
|
15
|
+
attribute :stereotype, Lutaml::Model::Type::String
|
|
16
|
+
attribute :isstatic, Lutaml::Model::Type::String
|
|
17
|
+
attribute :concurrency, Lutaml::Model::Type::String
|
|
18
|
+
attribute :notes, Lutaml::Model::Type::String
|
|
19
|
+
attribute :behaviour, Lutaml::Model::Type::String
|
|
20
|
+
attribute :abstract, Lutaml::Model::Type::String
|
|
21
|
+
attribute :genoption, Lutaml::Model::Type::String
|
|
22
|
+
attribute :synchronized, Lutaml::Model::Type::String
|
|
23
|
+
attribute :pos, Lutaml::Model::Type::Integer
|
|
24
|
+
attribute :const, Lutaml::Model::Type::Integer
|
|
25
|
+
attribute :style, Lutaml::Model::Type::String
|
|
26
|
+
attribute :pure, Lutaml::Model::Type::Integer
|
|
27
|
+
attribute :throws, Lutaml::Model::Type::String
|
|
28
|
+
attribute :classifier, Lutaml::Model::Type::String
|
|
29
|
+
attribute :code, Lutaml::Model::Type::String
|
|
30
|
+
attribute :isroot, Lutaml::Model::Type::Integer
|
|
31
|
+
attribute :isleaf, Lutaml::Model::Type::Integer
|
|
32
|
+
attribute :isquery, Lutaml::Model::Type::Integer
|
|
33
|
+
attribute :stateflags, Lutaml::Model::Type::String
|
|
34
|
+
attribute :ea_guid, Lutaml::Model::Type::String
|
|
35
|
+
attribute :styleex, Lutaml::Model::Type::String
|
|
36
|
+
|
|
37
|
+
def self.primary_key_column
|
|
38
|
+
:operationid
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.table_name
|
|
42
|
+
"t_operation"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
COLUMN_MAP = {
|
|
47
|
+
"Object_ID" => :ea_object_id,
|
|
48
|
+
}.freeze
|
|
49
|
+
|
|
50
|
+
def self.column_map
|
|
51
|
+
COLUMN_MAP
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Check if operation is static
|
|
55
|
+
# @return [Boolean]
|
|
56
|
+
def static?
|
|
57
|
+
isstatic == "1"
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Check if operation is abstract
|
|
61
|
+
# @return [Boolean]
|
|
62
|
+
def abstract?
|
|
63
|
+
abstract == "1"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Check if operation is synchronized
|
|
67
|
+
# @return [Boolean]
|
|
68
|
+
def synchronized?
|
|
69
|
+
synchronized == "1"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Check if operation is pure virtual
|
|
73
|
+
# @return [Boolean]
|
|
74
|
+
def pure?
|
|
75
|
+
pure == 1
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Check if operation is a query
|
|
79
|
+
# @return [Boolean]
|
|
80
|
+
def query?
|
|
81
|
+
isquery == 1
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Check if operation is root
|
|
85
|
+
# @return [Boolean]
|
|
86
|
+
def root?
|
|
87
|
+
isroot == 1
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Check if operation is leaf
|
|
91
|
+
# @return [Boolean]
|
|
92
|
+
def leaf?
|
|
93
|
+
isleaf == 1
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Check if operation is constant
|
|
97
|
+
# @return [Boolean]
|
|
98
|
+
def constant?
|
|
99
|
+
const == 1
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Check if operation is public
|
|
103
|
+
# @return [Boolean]
|
|
104
|
+
def public?
|
|
105
|
+
scope&.downcase == "public"
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Check if operation is private
|
|
109
|
+
# @return [Boolean]
|
|
110
|
+
def private?
|
|
111
|
+
scope&.downcase == "private"
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Check if operation is protected
|
|
115
|
+
# @return [Boolean]
|
|
116
|
+
def protected?
|
|
117
|
+
scope&.downcase == "protected"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# @return [Integer] pos for operation ordering within parent
|
|
121
|
+
def sort_position
|
|
122
|
+
pos || 0
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ea
|
|
4
|
+
module Qea
|
|
5
|
+
module Models
|
|
6
|
+
# Represents an operation parameter from the t_operationparams table
|
|
7
|
+
# This represents method/operation parameters
|
|
8
|
+
# Note: Has composite primary key (OperationID + Name)
|
|
9
|
+
class EaOperationParam < BaseModel
|
|
10
|
+
attribute :operationid, Lutaml::Model::Type::Integer
|
|
11
|
+
attribute :name, Lutaml::Model::Type::String
|
|
12
|
+
attribute :type, Lutaml::Model::Type::String
|
|
13
|
+
attribute :default, Lutaml::Model::Type::String
|
|
14
|
+
attribute :notes, Lutaml::Model::Type::String
|
|
15
|
+
attribute :pos, Lutaml::Model::Type::Integer
|
|
16
|
+
attribute :const, Lutaml::Model::Type::Integer
|
|
17
|
+
attribute :style, Lutaml::Model::Type::String
|
|
18
|
+
attribute :kind, Lutaml::Model::Type::String
|
|
19
|
+
attribute :classifier, Lutaml::Model::Type::String
|
|
20
|
+
attribute :ea_guid, Lutaml::Model::Type::String
|
|
21
|
+
attribute :styleex, Lutaml::Model::Type::String
|
|
22
|
+
|
|
23
|
+
def self.primary_key_column
|
|
24
|
+
# Composite key: [:operationid, :name]
|
|
25
|
+
# Return first component for compatibility
|
|
26
|
+
:operationid
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.table_name
|
|
30
|
+
"t_operationparams"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Returns composite primary key as array
|
|
34
|
+
# @return [Array] [operationid, name]
|
|
35
|
+
def composite_key
|
|
36
|
+
[operationid, name]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Check if parameter is constant
|
|
40
|
+
# @return [Boolean]
|
|
41
|
+
def constant?
|
|
42
|
+
const == 1
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Check if parameter is input parameter
|
|
46
|
+
# @return [Boolean]
|
|
47
|
+
def input?
|
|
48
|
+
kind&.downcase == "in"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Check if parameter is output parameter
|
|
52
|
+
# @return [Boolean]
|
|
53
|
+
def output?
|
|
54
|
+
kind&.downcase == "out"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Check if parameter is input/output parameter
|
|
58
|
+
# @return [Boolean]
|
|
59
|
+
def inout?
|
|
60
|
+
kind&.downcase == "inout"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Check if parameter is return parameter
|
|
64
|
+
# @return [Boolean]
|
|
65
|
+
def return?
|
|
66
|
+
kind&.downcase == "return"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# @return [Integer] pos for parameter ordering within operation
|
|
70
|
+
def sort_position
|
|
71
|
+
pos || 0
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ea
|
|
4
|
+
module Qea
|
|
5
|
+
module Models
|
|
6
|
+
# Represents a package from the t_package table in EA database
|
|
7
|
+
# This represents packages/namespaces in the model
|
|
8
|
+
class EaPackage < BaseModel
|
|
9
|
+
attribute :package_id, Lutaml::Model::Type::Integer
|
|
10
|
+
attribute :name, Lutaml::Model::Type::String
|
|
11
|
+
attribute :parent_id, Lutaml::Model::Type::Integer
|
|
12
|
+
attribute :createddate, Lutaml::Model::Type::String
|
|
13
|
+
attribute :modifieddate, Lutaml::Model::Type::String
|
|
14
|
+
attribute :notes, Lutaml::Model::Type::String
|
|
15
|
+
attribute :ea_guid, Lutaml::Model::Type::String
|
|
16
|
+
attribute :xmlpath, Lutaml::Model::Type::String
|
|
17
|
+
attribute :iscontrolled, Lutaml::Model::Type::Integer
|
|
18
|
+
attribute :lastloaddate, Lutaml::Model::Type::String
|
|
19
|
+
attribute :lastsavedate, Lutaml::Model::Type::String
|
|
20
|
+
attribute :version, Lutaml::Model::Type::String
|
|
21
|
+
attribute :protected, Lutaml::Model::Type::Integer
|
|
22
|
+
attribute :pkgowner, Lutaml::Model::Type::String
|
|
23
|
+
attribute :umlversion, Lutaml::Model::Type::String
|
|
24
|
+
attribute :usedtd, Lutaml::Model::Type::Integer
|
|
25
|
+
attribute :logxml, Lutaml::Model::Type::Integer
|
|
26
|
+
attribute :codepath, Lutaml::Model::Type::String
|
|
27
|
+
attribute :namespace, Lutaml::Model::Type::String
|
|
28
|
+
attribute :tpos, Lutaml::Model::Type::Integer
|
|
29
|
+
attribute :packageflags, Lutaml::Model::Type::String
|
|
30
|
+
attribute :batchsave, Lutaml::Model::Type::Integer
|
|
31
|
+
attribute :batchload, Lutaml::Model::Type::Integer
|
|
32
|
+
|
|
33
|
+
def self.primary_key_column
|
|
34
|
+
:package_id
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.table_name
|
|
38
|
+
"t_package"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Check if package is controlled
|
|
42
|
+
# @return [Boolean]
|
|
43
|
+
def controlled?
|
|
44
|
+
iscontrolled == 1
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Check if package is protected
|
|
48
|
+
# @return [Boolean]
|
|
49
|
+
def protected?
|
|
50
|
+
protected == 1
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Check if package uses DTD
|
|
54
|
+
# @return [Boolean]
|
|
55
|
+
def use_dtd?
|
|
56
|
+
usedtd == 1
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Check if package logs XML
|
|
60
|
+
# @return [Boolean]
|
|
61
|
+
def log_xml?
|
|
62
|
+
logxml == 1
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Check if package is root (has no parent)
|
|
66
|
+
# @return [Boolean]
|
|
67
|
+
def root?
|
|
68
|
+
parent_id.nil? || parent_id.zero?
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# @return [Integer] tpos for tree-position ordering
|
|
72
|
+
def sort_position
|
|
73
|
+
tpos || 0
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ea
|
|
4
|
+
module Qea
|
|
5
|
+
module Models
|
|
6
|
+
# Represents a script from the t_script table in EA database
|
|
7
|
+
# Stores behavioral scripts and debugging configurations
|
|
8
|
+
class EaScript < BaseModel
|
|
9
|
+
attribute :script_id, Lutaml::Model::Type::Integer
|
|
10
|
+
attribute :script_category, Lutaml::Model::Type::String
|
|
11
|
+
attribute :script_name, Lutaml::Model::Type::String
|
|
12
|
+
attribute :script_author, Lutaml::Model::Type::String
|
|
13
|
+
attribute :notes, Lutaml::Model::Type::String
|
|
14
|
+
attribute :script, Lutaml::Model::Type::String
|
|
15
|
+
|
|
16
|
+
def self.primary_key_column
|
|
17
|
+
:script_id
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.table_name
|
|
21
|
+
"t_script"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
COLUMN_MAP = {
|
|
26
|
+
"ScriptID" => :script_id,
|
|
27
|
+
"ScriptCategory" => :script_category,
|
|
28
|
+
"ScriptName" => :script_name,
|
|
29
|
+
"ScriptAuthor" => :script_author,
|
|
30
|
+
}.freeze
|
|
31
|
+
|
|
32
|
+
def self.column_map
|
|
33
|
+
COLUMN_MAP
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Convenience aliases
|
|
37
|
+
alias_method :id, :script_id
|
|
38
|
+
alias_method :name, :script_name
|
|
39
|
+
alias_method :category, :script_category
|
|
40
|
+
alias_method :author, :script_author
|
|
41
|
+
|
|
42
|
+
# Check if this is a debugging script
|
|
43
|
+
# @return [Boolean]
|
|
44
|
+
def debugging_script?
|
|
45
|
+
script_category == "ScriptDebugging"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Check if script has content
|
|
49
|
+
# @return [Boolean]
|
|
50
|
+
def has_content?
|
|
51
|
+
!script.nil? && !script.empty?
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Check if script has notes
|
|
55
|
+
# @return [Boolean]
|
|
56
|
+
def has_notes?
|
|
57
|
+
!notes.nil? && !notes.empty?
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ea
|
|
4
|
+
module Qea
|
|
5
|
+
module Models
|
|
6
|
+
# Represents a status type definition from t_statustypes table
|
|
7
|
+
#
|
|
8
|
+
# This table provides reference data for status values that can be
|
|
9
|
+
# assigned to UML elements (Approved, Implemented, Mandatory, etc.).
|
|
10
|
+
#
|
|
11
|
+
# @example
|
|
12
|
+
# status_type = EaStatusType.new
|
|
13
|
+
# status_type.status #=> "Approved"
|
|
14
|
+
# status_type.description #=> "Item is approved"
|
|
15
|
+
class EaStatusType < BaseModel
|
|
16
|
+
attribute :status, Lutaml::Model::Type::String
|
|
17
|
+
attribute :description, Lutaml::Model::Type::String
|
|
18
|
+
|
|
19
|
+
def self.table_name
|
|
20
|
+
"t_statustypes"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Primary key is Status (text)
|
|
24
|
+
def self.primary_key_column
|
|
25
|
+
"Status"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Friendly name for status
|
|
29
|
+
# @return [String]
|
|
30
|
+
def name
|
|
31
|
+
status
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Check if this is the Approved status
|
|
35
|
+
# @return [Boolean]
|
|
36
|
+
def approved?
|
|
37
|
+
status == "Approved"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Check if this is the Implemented status
|
|
41
|
+
# @return [Boolean]
|
|
42
|
+
def implemented?
|
|
43
|
+
status == "Implemented"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Check if this is the Mandatory status
|
|
47
|
+
# @return [Boolean]
|
|
48
|
+
def mandatory?
|
|
49
|
+
status == "Mandatory"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Check if this is the Proposed status
|
|
53
|
+
# @return [Boolean]
|
|
54
|
+
def proposed?
|
|
55
|
+
status == "Proposed"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Check if this is the Validated status
|
|
59
|
+
# @return [Boolean]
|
|
60
|
+
def validated?
|
|
61
|
+
status == "Validated"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ea
|
|
4
|
+
module Qea
|
|
5
|
+
module Models
|
|
6
|
+
# Represents a stereotype definition from t_stereotypes table
|
|
7
|
+
#
|
|
8
|
+
# Stereotypes are UML profile extensions that classify elements.
|
|
9
|
+
# This table stores stereotype DEFINITIONS (not instances).
|
|
10
|
+
# Individual elements reference these stereotypes by name.
|
|
11
|
+
#
|
|
12
|
+
# @example
|
|
13
|
+
# stereotype = EaStereotype.new
|
|
14
|
+
# stereotype.stereotype #=> "CodeList"
|
|
15
|
+
# stereotype.applies_to #=> "Class"
|
|
16
|
+
# stereotype.description #=> "A list of codes"
|
|
17
|
+
class EaStereotype < BaseModel
|
|
18
|
+
attribute :stereotype, Lutaml::Model::Type::String
|
|
19
|
+
attribute :appliesto, Lutaml::Model::Type::String
|
|
20
|
+
attribute :description, Lutaml::Model::Type::String
|
|
21
|
+
attribute :mfenabled, Lutaml::Model::Type::Integer
|
|
22
|
+
attribute :mfpath, Lutaml::Model::Type::String
|
|
23
|
+
attribute :metafile, Lutaml::Model::Type::String
|
|
24
|
+
attribute :style, Lutaml::Model::Type::String
|
|
25
|
+
attribute :ea_guid, Lutaml::Model::Type::String
|
|
26
|
+
attribute :visualtype, Lutaml::Model::Type::String
|
|
27
|
+
|
|
28
|
+
def self.table_name
|
|
29
|
+
"t_stereotypes"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# No primary key - this is a lookup/reference table
|
|
33
|
+
def self.primary_key_column
|
|
34
|
+
nil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Check if stereotype is enabled for metafile
|
|
38
|
+
# @return [Boolean]
|
|
39
|
+
def metafile_enabled?
|
|
40
|
+
mfenabled == 1
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Get friendly name for applies_to
|
|
44
|
+
# @return [String]
|
|
45
|
+
def element_type
|
|
46
|
+
appliesto
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Alias for readability
|
|
50
|
+
alias applies_to appliesto
|
|
51
|
+
alias mf_enabled mfenabled
|
|
52
|
+
alias mf_path mfpath
|
|
53
|
+
alias visual_type visualtype
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ea
|
|
4
|
+
module Qea
|
|
5
|
+
module Models
|
|
6
|
+
# EA Tagged Value model
|
|
7
|
+
#
|
|
8
|
+
# Represents tagged values (custom metadata) attached to UML elements
|
|
9
|
+
# in the t_taggedvalue table.
|
|
10
|
+
#
|
|
11
|
+
# @example Create from database row
|
|
12
|
+
# row = {
|
|
13
|
+
# "PropertyID" => "{GUID}",
|
|
14
|
+
# "ElementID" => "{ELEMENT-GUID}",
|
|
15
|
+
# "BaseClass" => "ASSOCIATION_SOURCE",
|
|
16
|
+
# "TagValue" => "sequenceNumber|15$ea_notes=Unique integer...",
|
|
17
|
+
# "Notes" => nil
|
|
18
|
+
# }
|
|
19
|
+
# tagged_value = EaTaggedValue.from_db_row(row)
|
|
20
|
+
class EaTaggedValue < BaseModel
|
|
21
|
+
attribute :property_id, :string
|
|
22
|
+
attribute :element_id, :string
|
|
23
|
+
attribute :base_class, :string
|
|
24
|
+
attribute :tag_value, :string
|
|
25
|
+
attribute :notes, :string
|
|
26
|
+
|
|
27
|
+
# @return [Symbol] Primary key column name
|
|
28
|
+
def self.primary_key_column
|
|
29
|
+
:property_id
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @return [String] Database table name
|
|
33
|
+
def self.table_name
|
|
34
|
+
"t_taggedvalue"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
COLUMN_MAP = {
|
|
39
|
+
"PropertyID" => :property_id,
|
|
40
|
+
"ElementID" => :element_id,
|
|
41
|
+
"BaseClass" => :base_class,
|
|
42
|
+
"TagValue" => :tag_value,
|
|
43
|
+
}.freeze
|
|
44
|
+
|
|
45
|
+
def self.column_map
|
|
46
|
+
COLUMN_MAP
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Parse tag name from TagValue field
|
|
50
|
+
#
|
|
51
|
+
# TagValue format: "tagName|value$ea_notes=description"
|
|
52
|
+
# or "tagName$ea_notes=description"
|
|
53
|
+
#
|
|
54
|
+
# @return [String, nil] Tag name
|
|
55
|
+
def tag_name
|
|
56
|
+
return nil unless tag_value
|
|
57
|
+
|
|
58
|
+
# Split on | or $ to get the tag name
|
|
59
|
+
parts = tag_value.split(/[|$]/, 2)
|
|
60
|
+
parts[0]&.strip
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Parse tag value from TagValue field
|
|
64
|
+
#
|
|
65
|
+
# TagValue format: "tagName|value$ea_notes=description"
|
|
66
|
+
#
|
|
67
|
+
# @return [String, nil] Tag value
|
|
68
|
+
def parsed_value
|
|
69
|
+
return nil unless tag_value
|
|
70
|
+
|
|
71
|
+
# Check if there's a pipe separator
|
|
72
|
+
return nil unless tag_value.include?("|")
|
|
73
|
+
|
|
74
|
+
# Split on pipe first
|
|
75
|
+
parts = tag_value.split("|", 2)
|
|
76
|
+
return nil if parts.length < 2
|
|
77
|
+
|
|
78
|
+
# Get the value part (before $)
|
|
79
|
+
value_part = parts[1].split("$", 2)[0]
|
|
80
|
+
value_part&.strip
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Parse notes from TagValue field
|
|
84
|
+
#
|
|
85
|
+
# Extract ea_notes if present in TagValue
|
|
86
|
+
#
|
|
87
|
+
# @return [String, nil] Extracted notes
|
|
88
|
+
def parsed_notes # rubocop:disable Metrics/CyclomaticComplexity
|
|
89
|
+
return notes if notes && !notes.empty?
|
|
90
|
+
return nil unless tag_value&.include?("$ea_notes=")
|
|
91
|
+
|
|
92
|
+
# Extract ea_notes value
|
|
93
|
+
parts = tag_value.split("$ea_notes=", 2)
|
|
94
|
+
parts[1]&.strip if parts.length > 1
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|