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.
Files changed (227) hide show
  1. checksums.yaml +4 -4
  2. data/CLAUDE.md +125 -0
  3. data/Rakefile +12 -4
  4. data/TODO.next/00-publish-blocking-bugs.md +74 -0
  5. data/TODO.next/01-standalone-ea-gem-identity.md +76 -0
  6. data/TODO.next/02-optional-lutaml-uml-dependency.md +47 -0
  7. data/TODO.next/03-slim-lutaml-uml.md +79 -0
  8. data/TODO.next/04-loader-registry-for-uml-repository.md +49 -0
  9. data/TODO.next/05-extract-shared-transformer-methods.md +14 -0
  10. data/TODO.next/06-deduplicate-stereotype-loading.md +17 -0
  11. data/TODO.next/07-transformer-registry-in-factory.md +20 -0
  12. data/TODO.next/08-connector-type-registry.md +27 -0
  13. data/TODO.next/09-element-renderer-registry.md +29 -0
  14. data/TODO.next/10-connector-renderer-lsp.md +18 -0
  15. data/TODO.next/11-consolidate-style-knowledge.md +33 -0
  16. data/TODO.next/12-data-driven-from-db-row.md +24 -0
  17. data/TODO.next/13-extract-duplicated-methods.md +17 -0
  18. data/TODO.next/14-remove-dead-code.md +10 -0
  19. data/TODO.next/15-narrow-exception-handling.md +39 -0
  20. data/TODO.next/16-repository-indexes.md +28 -0
  21. data/TODO.next/17-fix-spec-quality-and-coverage.md +32 -0
  22. data/TODO.next/18-xmi-tool-specific-parser-architecture.md +172 -0
  23. data/TODO.next/19-fix-ea-gemspec-dependency-declarations.md +56 -0
  24. data/TODO.next/20-ci-requires-unreleased-lutaml-uml.md +63 -0
  25. data/TODO.next/21-qeatoxmi-via-xmi-gem.md +340 -0
  26. data/TODO.next/22-strip-respond-to-from-qeatoxmi-specs.md +32 -0
  27. data/TODO.next/23-cleanup-idallocator.md +41 -0
  28. data/TODO.next/24-tighten-parity-specs.md +42 -0
  29. data/TODO.next/25-sparx-eaid-format-for-synthesized-ids.md +62 -0
  30. data/TODO.next/26-fix-uppervalue-lowervalue-count-gap.md +51 -0
  31. data/TODO.next/27-extract-cardinality-module.md +68 -0
  32. data/TODO.next/28-extract-xml-sanitizer.md +51 -0
  33. data/TODO.next/29-ocp-registry-for-classifier-builders.md +58 -0
  34. data/TODO.next/30-struct-return-for-association-end.md +37 -0
  35. data/TODO.next/31-idallocator-specs.md +27 -0
  36. data/TODO.next/32-phase2-gap-sentinel-specs.md +53 -0
  37. data/TODO.next/33-normalize-lower-cleanup.md +30 -0
  38. data/TODO.next/34-document-member-end-order-rt-prefix.md +29 -0
  39. data/TODO.next/35-walk-runstate-for-instance-slots.md +76 -0
  40. data/TODO.next/36-wire-interface-realization.md +50 -0
  41. data/TODO.next/37-visibility-returns-real-booleans.md +36 -0
  42. data/config/diagram_styles.yml +200 -0
  43. data/config/model_transformations.yml +266 -0
  44. data/config/qea_schema.yml +1024 -0
  45. data/docs/ea_to_uml_type_mapping.md +89 -0
  46. data/docs/xmi_qea_conversion_capabilities.md +99 -0
  47. data/examples/lur/20251010_current_plateau_v5.1.lur +0 -0
  48. data/examples/lur/basic.lur +0 -0
  49. data/examples/lur/test-output.lur +0 -0
  50. data/examples/lur/test.lur +0 -0
  51. data/examples/lur_basic_usage.rb +221 -0
  52. data/examples/lur_cli_workflow.rb +263 -0
  53. data/examples/lur_statistics.rb +326 -0
  54. data/examples/qea/20251010_current_plateau_v5.1.qea +0 -0
  55. data/examples/qea/ArcGISWorkspace_template.qea +0 -0
  56. data/examples/qea/README_qea_parser.adoc +230 -0
  57. data/examples/qea/UmlModel_template.qea +0 -0
  58. data/examples/qea/basic.qea +0 -0
  59. data/examples/qea/simple.qea +0 -0
  60. data/examples/qea/simple_example.qea +0 -0
  61. data/examples/qea/test.qea +0 -0
  62. data/examples/qea_standalone_query.rb +73 -0
  63. data/examples/qea_to_repository.rb +51 -0
  64. data/examples/smoke_test_real_qea.rb +81 -0
  65. data/exe/ea +7 -0
  66. data/lib/ea/cli/app.rb +72 -0
  67. data/lib/ea/cli/command/base.rb +80 -0
  68. data/lib/ea/cli/command/convert.rb +62 -0
  69. data/lib/ea/cli/command/diagrams.rb +81 -0
  70. data/lib/ea/cli/command/list.rb +61 -0
  71. data/lib/ea/cli/command/parse.rb +29 -0
  72. data/lib/ea/cli/command/stats.rb +20 -0
  73. data/lib/ea/cli/command/validate.rb +41 -0
  74. data/lib/ea/cli/command.rb +15 -0
  75. data/lib/ea/cli/error.rb +34 -0
  76. data/lib/ea/cli/output/formatter.rb +34 -0
  77. data/lib/ea/cli/output/json_formatter.rb +20 -0
  78. data/lib/ea/cli/output/table_formatter.rb +42 -0
  79. data/lib/ea/cli/output/yaml_formatter.rb +20 -0
  80. data/lib/ea/cli/output.rb +56 -0
  81. data/lib/ea/cli.rb +17 -0
  82. data/lib/ea/diagram/configuration.rb +379 -0
  83. data/lib/ea/diagram/element_renderers/base_renderer.rb +77 -0
  84. data/lib/ea/diagram/element_renderers/class_renderer.rb +323 -0
  85. data/lib/ea/diagram/element_renderers/connector_renderer.rb +41 -0
  86. data/lib/ea/diagram/element_renderers/package_renderer.rb +61 -0
  87. data/lib/ea/diagram/element_renderers.rb +43 -0
  88. data/lib/ea/diagram/extractor.rb +560 -0
  89. data/lib/ea/diagram/layout_engine.rb +170 -0
  90. data/lib/ea/diagram/path_builder.rb +202 -0
  91. data/lib/ea/diagram/style_parser.rb +42 -0
  92. data/lib/ea/diagram/style_resolver.rb +276 -0
  93. data/lib/ea/diagram/svg_renderer.rb +274 -0
  94. data/lib/ea/diagram/util.rb +73 -0
  95. data/lib/ea/diagram.rb +47 -0
  96. data/lib/ea/qea/benchmark.rb +210 -0
  97. data/lib/ea/qea/database.rb +308 -0
  98. data/lib/ea/qea/factory/association_builder.rb +203 -0
  99. data/lib/ea/qea/factory/association_transformer.rb +91 -0
  100. data/lib/ea/qea/factory/attribute_tag_transformer.rb +57 -0
  101. data/lib/ea/qea/factory/attribute_transformer.rb +93 -0
  102. data/lib/ea/qea/factory/base_transformer.rb +177 -0
  103. data/lib/ea/qea/factory/class_transformer.rb +116 -0
  104. data/lib/ea/qea/factory/constraint_transformer.rb +75 -0
  105. data/lib/ea/qea/factory/data_type_transformer.rb +77 -0
  106. data/lib/ea/qea/factory/diagram_transformer.rb +157 -0
  107. data/lib/ea/qea/factory/document_builder.rb +283 -0
  108. data/lib/ea/qea/factory/ea_to_uml_factory.rb +229 -0
  109. data/lib/ea/qea/factory/enum_transformer.rb +74 -0
  110. data/lib/ea/qea/factory/generalization_builder.rb +227 -0
  111. data/lib/ea/qea/factory/generalization_transformer.rb +98 -0
  112. data/lib/ea/qea/factory/instance_transformer.rb +68 -0
  113. data/lib/ea/qea/factory/object_property_transformer.rb +58 -0
  114. data/lib/ea/qea/factory/operation_transformer.rb +66 -0
  115. data/lib/ea/qea/factory/package_transformer.rb +145 -0
  116. data/lib/ea/qea/factory/reference_resolver.rb +99 -0
  117. data/lib/ea/qea/factory/stereotype_loader.rb +39 -0
  118. data/lib/ea/qea/factory/tagged_value_transformer.rb +38 -0
  119. data/lib/ea/qea/factory/transformer_registry.rb +80 -0
  120. data/lib/ea/qea/factory.rb +37 -0
  121. data/lib/ea/qea/file_detector.rb +178 -0
  122. data/lib/ea/qea/infrastructure/database_connection.rb +100 -0
  123. data/lib/ea/qea/infrastructure/schema_reader.rb +136 -0
  124. data/lib/ea/qea/infrastructure/table_reader.rb +224 -0
  125. data/lib/ea/qea/infrastructure.rb +12 -0
  126. data/lib/ea/qea/models/base_model.rb +59 -0
  127. data/lib/ea/qea/models/ea_attribute.rb +109 -0
  128. data/lib/ea/qea/models/ea_attribute_tag.rb +100 -0
  129. data/lib/ea/qea/models/ea_complexity_type.rb +79 -0
  130. data/lib/ea/qea/models/ea_connector.rb +160 -0
  131. data/lib/ea/qea/models/ea_connector_type.rb +60 -0
  132. data/lib/ea/qea/models/ea_constraint_type.rb +63 -0
  133. data/lib/ea/qea/models/ea_datatype.rb +104 -0
  134. data/lib/ea/qea/models/ea_diagram.rb +115 -0
  135. data/lib/ea/qea/models/ea_diagram_link.rb +78 -0
  136. data/lib/ea/qea/models/ea_diagram_object.rb +73 -0
  137. data/lib/ea/qea/models/ea_diagram_type.rb +56 -0
  138. data/lib/ea/qea/models/ea_document.rb +63 -0
  139. data/lib/ea/qea/models/ea_object.rb +223 -0
  140. data/lib/ea/qea/models/ea_object_constraint.rb +53 -0
  141. data/lib/ea/qea/models/ea_object_property.rb +87 -0
  142. data/lib/ea/qea/models/ea_object_type.rb +73 -0
  143. data/lib/ea/qea/models/ea_operation.rb +127 -0
  144. data/lib/ea/qea/models/ea_operation_param.rb +76 -0
  145. data/lib/ea/qea/models/ea_package.rb +78 -0
  146. data/lib/ea/qea/models/ea_script.rb +62 -0
  147. data/lib/ea/qea/models/ea_status_type.rb +66 -0
  148. data/lib/ea/qea/models/ea_stereotype.rb +57 -0
  149. data/lib/ea/qea/models/ea_tagged_value.rb +99 -0
  150. data/lib/ea/qea/models/ea_xref.rb +165 -0
  151. data/lib/ea/qea/models.rb +35 -0
  152. data/lib/ea/qea/repositories/base_repository.rb +225 -0
  153. data/lib/ea/qea/repositories/object_repository.rb +219 -0
  154. data/lib/ea/qea/repositories.rb +10 -0
  155. data/lib/ea/qea/services/configuration.rb +211 -0
  156. data/lib/ea/qea/services/database_loader.rb +191 -0
  157. data/lib/ea/qea/services.rb +10 -0
  158. data/lib/ea/qea/validation/association_validator.rb +73 -0
  159. data/lib/ea/qea/validation/attribute_validator.rb +91 -0
  160. data/lib/ea/qea/validation/base_validator.rb +331 -0
  161. data/lib/ea/qea/validation/class_validator.rb +121 -0
  162. data/lib/ea/qea/validation/database/circular_reference_validator.rb +109 -0
  163. data/lib/ea/qea/validation/database/orphan_validator.rb +153 -0
  164. data/lib/ea/qea/validation/database/referential_integrity_validator.rb +128 -0
  165. data/lib/ea/qea/validation/database.rb +16 -0
  166. data/lib/ea/qea/validation/diagram_validator.rb +112 -0
  167. data/lib/ea/qea/validation/formatters/json_formatter.rb +137 -0
  168. data/lib/ea/qea/validation/formatters/text_formatter.rb +235 -0
  169. data/lib/ea/qea/validation/formatters.rb +12 -0
  170. data/lib/ea/qea/validation/operation_validator.rb +71 -0
  171. data/lib/ea/qea/validation/package_validator.rb +111 -0
  172. data/lib/ea/qea/validation/validation_engine.rb +387 -0
  173. data/lib/ea/qea/validation/validation_message.rb +144 -0
  174. data/lib/ea/qea/validation/validation_result.rb +210 -0
  175. data/lib/ea/qea/validation/validator_registry.rb +134 -0
  176. data/lib/ea/qea/validation.rb +28 -0
  177. data/lib/ea/qea/verification/comparison_result.rb +264 -0
  178. data/lib/ea/qea/verification/document_normalizer.rb +169 -0
  179. data/lib/ea/qea/verification/document_verifier.rb +322 -0
  180. data/lib/ea/qea/verification/element_comparator.rb +277 -0
  181. data/lib/ea/qea/verification/structure_matcher.rb +287 -0
  182. data/lib/ea/qea/verification.rb +14 -0
  183. data/lib/ea/qea.rb +185 -0
  184. data/lib/ea/transformations/configuration.rb +333 -0
  185. data/lib/ea/transformations/format_registry.rb +366 -0
  186. data/lib/ea/transformations/parsers/base_parser.rb +482 -0
  187. data/lib/ea/transformations/parsers/qea_parser.rb +401 -0
  188. data/lib/ea/transformations/parsers/xmi_parser.rb +243 -0
  189. data/lib/ea/transformations/transformation_engine.rb +390 -0
  190. data/lib/ea/transformations.rb +85 -0
  191. data/lib/ea/transformers/qea_to_xmi/association_end.rb +19 -0
  192. data/lib/ea/transformers/qea_to_xmi/cardinality.rb +96 -0
  193. data/lib/ea/transformers/qea_to_xmi/context.rb +106 -0
  194. data/lib/ea/transformers/qea_to_xmi/guid_format.rb +56 -0
  195. data/lib/ea/transformers/qea_to_xmi/id_allocator.rb +92 -0
  196. data/lib/ea/transformers/qea_to_xmi/run_state.rb +107 -0
  197. data/lib/ea/transformers/qea_to_xmi/transformer.rb +607 -0
  198. data/lib/ea/transformers/qea_to_xmi/visibility.rb +73 -0
  199. data/lib/ea/transformers/qea_to_xmi.rb +29 -0
  200. data/lib/ea/transformers/uml_to_xmi/id_generator.rb +54 -0
  201. data/lib/ea/transformers/uml_to_xmi/transformer.rb +152 -0
  202. data/lib/ea/transformers/uml_to_xmi/writer.rb +96 -0
  203. data/lib/ea/transformers/uml_to_xmi.rb +16 -0
  204. data/lib/ea/transformers.rb +34 -0
  205. data/lib/ea/version.rb +1 -1
  206. data/lib/ea/xmi/liquid_drops/association_drop.rb +56 -0
  207. data/lib/ea/xmi/liquid_drops/attribute_drop.rb +72 -0
  208. data/lib/ea/xmi/liquid_drops/cardinality_drop.rb +35 -0
  209. data/lib/ea/xmi/liquid_drops/connector_drop.rb +54 -0
  210. data/lib/ea/xmi/liquid_drops/constraint_drop.rb +29 -0
  211. data/lib/ea/xmi/liquid_drops/data_type_drop.rb +63 -0
  212. data/lib/ea/xmi/liquid_drops/dependency_drop.rb +36 -0
  213. data/lib/ea/xmi/liquid_drops/diagram_drop.rb +34 -0
  214. data/lib/ea/xmi/liquid_drops/enum_drop.rb +49 -0
  215. data/lib/ea/xmi/liquid_drops/enum_owned_literal_drop.rb +25 -0
  216. data/lib/ea/xmi/liquid_drops/generalization_attribute_drop.rb +87 -0
  217. data/lib/ea/xmi/liquid_drops/generalization_drop.rb +127 -0
  218. data/lib/ea/xmi/liquid_drops/klass_drop.rb +191 -0
  219. data/lib/ea/xmi/liquid_drops/operation_drop.rb +29 -0
  220. data/lib/ea/xmi/liquid_drops/package_drop.rb +108 -0
  221. data/lib/ea/xmi/liquid_drops/root_drop.rb +34 -0
  222. data/lib/ea/xmi/liquid_drops/source_target_drop.rb +43 -0
  223. data/lib/ea/xmi/lookup_service.rb +89 -0
  224. data/lib/ea/xmi/parser.rb +919 -0
  225. data/lib/ea/xmi.rb +35 -0
  226. data/lib/ea.rb +10 -1
  227. 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