archimate 1.1.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 +7 -0
- data/.gitignore +22 -0
- data/.projectile +18 -0
- data/.rubocop.yml +13 -0
- data/.travis.yml +4 -0
- data/.yardocs +15 -0
- data/Gemfile +5 -0
- data/Guardfile +27 -0
- data/LICENSE +201 -0
- data/README.md +94 -0
- data/Rakefile +29 -0
- data/TODOs.org +286 -0
- data/archimate.gemspec +51 -0
- data/bin/archimate +17 -0
- data/bin/console +13 -0
- data/bin/setup +8 -0
- data/exe/archidiff +7 -0
- data/exe/archidiff-summary +7 -0
- data/exe/archimate +7 -0
- data/exe/archimerge +7 -0
- data/exe/fmtxml +7 -0
- data/lib/archimate/cli/archi.rb +189 -0
- data/lib/archimate/cli/cleanup.rb +54 -0
- data/lib/archimate/cli/conflict_resolver.rb +39 -0
- data/lib/archimate/cli/convert.rb +39 -0
- data/lib/archimate/cli/diff.rb +31 -0
- data/lib/archimate/cli/diff_summary.rb +101 -0
- data/lib/archimate/cli/duper.rb +85 -0
- data/lib/archimate/cli/lint.rb +16 -0
- data/lib/archimate/cli/mapper.rb +82 -0
- data/lib/archimate/cli/merge.rb +49 -0
- data/lib/archimate/cli/merger.rb +109 -0
- data/lib/archimate/cli/stats.rb +42 -0
- data/lib/archimate/cli/svger.rb +40 -0
- data/lib/archimate/color.rb +53 -0
- data/lib/archimate/config.rb +35 -0
- data/lib/archimate/data_model/any_attribute.rb +13 -0
- data/lib/archimate/data_model/any_element.rb +15 -0
- data/lib/archimate/data_model/archimate_node.rb +181 -0
- data/lib/archimate/data_model/bounds.rb +72 -0
- data/lib/archimate/data_model/color.rb +47 -0
- data/lib/archimate/data_model/concept.rb +14 -0
- data/lib/archimate/data_model/concern.rb +17 -0
- data/lib/archimate/data_model/connection.rb +107 -0
- data/lib/archimate/data_model/constants.rb +82 -0
- data/lib/archimate/data_model/container.rb +17 -0
- data/lib/archimate/data_model/diagram.rb +40 -0
- data/lib/archimate/data_model/diffable_array.rb +213 -0
- data/lib/archimate/data_model/diffable_primitive.rb +83 -0
- data/lib/archimate/data_model/documentation.rb +14 -0
- data/lib/archimate/data_model/element.rb +87 -0
- data/lib/archimate/data_model/font.rb +54 -0
- data/lib/archimate/data_model/label.rb +19 -0
- data/lib/archimate/data_model/lang_string.rb +41 -0
- data/lib/archimate/data_model/location.rb +31 -0
- data/lib/archimate/data_model/metadata.rb +14 -0
- data/lib/archimate/data_model/model.rb +217 -0
- data/lib/archimate/data_model/modeling_note.rb +13 -0
- data/lib/archimate/data_model/named_referenceable.rb +14 -0
- data/lib/archimate/data_model/organization.rb +40 -0
- data/lib/archimate/data_model/property.rb +25 -0
- data/lib/archimate/data_model/property_definition.rb +16 -0
- data/lib/archimate/data_model/referenceable.rb +29 -0
- data/lib/archimate/data_model/relationship.rb +85 -0
- data/lib/archimate/data_model/schema_info.rb +18 -0
- data/lib/archimate/data_model/style.rb +32 -0
- data/lib/archimate/data_model/view.rb +12 -0
- data/lib/archimate/data_model/view_concept.rb +18 -0
- data/lib/archimate/data_model/view_node.rb +114 -0
- data/lib/archimate/data_model/viewpoint.rb +87 -0
- data/lib/archimate/data_model.rb +54 -0
- data/lib/archimate/diff/archimate_array_reference.rb +113 -0
- data/lib/archimate/diff/archimate_identified_node_reference.rb +41 -0
- data/lib/archimate/diff/archimate_node_attribute_reference.rb +70 -0
- data/lib/archimate/diff/archimate_node_reference.rb +80 -0
- data/lib/archimate/diff/change.rb +49 -0
- data/lib/archimate/diff/conflict.rb +31 -0
- data/lib/archimate/diff/conflicts/base_conflict.rb +53 -0
- data/lib/archimate/diff/conflicts/deleted_items_child_updated_conflict.rb +30 -0
- data/lib/archimate/diff/conflicts/deleted_items_referenced_conflict.rb +63 -0
- data/lib/archimate/diff/conflicts/path_conflict.rb +51 -0
- data/lib/archimate/diff/conflicts.rb +89 -0
- data/lib/archimate/diff/delete.rb +41 -0
- data/lib/archimate/diff/difference.rb +113 -0
- data/lib/archimate/diff/insert.rb +43 -0
- data/lib/archimate/diff/merge.rb +70 -0
- data/lib/archimate/diff/move.rb +51 -0
- data/lib/archimate/diff.rb +17 -0
- data/lib/archimate/export/csv_export.rb +32 -0
- data/lib/archimate/export/cypher.rb +171 -0
- data/lib/archimate/export/graph_ml.rb +131 -0
- data/lib/archimate/export/n_quads.rb +142 -0
- data/lib/archimate/file_format.rb +30 -0
- data/lib/archimate/file_formats/archi_file_format.rb +151 -0
- data/lib/archimate/file_formats/archi_file_reader.rb +252 -0
- data/lib/archimate/file_formats/archi_file_writer.rb +230 -0
- data/lib/archimate/file_formats/archimate_v2.rb +461 -0
- data/lib/archimate/file_formats/model_exchange_file/xml_lang_string.rb +35 -0
- data/lib/archimate/file_formats/model_exchange_file/xml_metadata.rb +115 -0
- data/lib/archimate/file_formats/model_exchange_file/xml_property_definitions.rb +28 -0
- data/lib/archimate/file_formats/model_exchange_file/xml_property_defs.rb +27 -0
- data/lib/archimate/file_formats/model_exchange_file_reader.rb +237 -0
- data/lib/archimate/file_formats/model_exchange_file_reader_21.rb +73 -0
- data/lib/archimate/file_formats/model_exchange_file_reader_30.rb +134 -0
- data/lib/archimate/file_formats/model_exchange_file_writer.rb +157 -0
- data/lib/archimate/file_formats/model_exchange_file_writer_21.rb +143 -0
- data/lib/archimate/file_formats/model_exchange_file_writer_30.rb +153 -0
- data/lib/archimate/file_formats/writer.rb +56 -0
- data/lib/archimate/lint/duplicate_entities.rb +121 -0
- data/lib/archimate/lint/linter.rb +146 -0
- data/lib/archimate/logging.rb +55 -0
- data/lib/archimate/maybe_io.rb +34 -0
- data/lib/archimate/progress_indicator.rb +29 -0
- data/lib/archimate/svg/archimate.css +232 -0
- data/lib/archimate/svg/child.rb +29 -0
- data/lib/archimate/svg/connection.rb +184 -0
- data/lib/archimate/svg/css_style.rb +31 -0
- data/lib/archimate/svg/diagram.rb +87 -0
- data/lib/archimate/svg/entity/and_junction.rb +14 -0
- data/lib/archimate/svg/entity/application_collaboration.rb +14 -0
- data/lib/archimate/svg/entity/application_component.rb +41 -0
- data/lib/archimate/svg/entity/application_event.rb +13 -0
- data/lib/archimate/svg/entity/application_function.rb +13 -0
- data/lib/archimate/svg/entity/application_interaction.rb +13 -0
- data/lib/archimate/svg/entity/application_interface.rb +13 -0
- data/lib/archimate/svg/entity/application_process.rb +13 -0
- data/lib/archimate/svg/entity/application_service.rb +13 -0
- data/lib/archimate/svg/entity/artifact.rb +39 -0
- data/lib/archimate/svg/entity/assessment.rb +14 -0
- data/lib/archimate/svg/entity/base_entity.rb +128 -0
- data/lib/archimate/svg/entity/business_actor.rb +14 -0
- data/lib/archimate/svg/entity/business_collaboration.rb +14 -0
- data/lib/archimate/svg/entity/business_event.rb +10 -0
- data/lib/archimate/svg/entity/business_function.rb +13 -0
- data/lib/archimate/svg/entity/business_interaction.rb +13 -0
- data/lib/archimate/svg/entity/business_interface.rb +13 -0
- data/lib/archimate/svg/entity/business_object.rb +13 -0
- data/lib/archimate/svg/entity/business_process.rb +13 -0
- data/lib/archimate/svg/entity/business_role.rb +14 -0
- data/lib/archimate/svg/entity/business_service.rb +13 -0
- data/lib/archimate/svg/entity/capability.rb +14 -0
- data/lib/archimate/svg/entity/communication_network.rb +14 -0
- data/lib/archimate/svg/entity/communication_path.rb +14 -0
- data/lib/archimate/svg/entity/constraint.rb +15 -0
- data/lib/archimate/svg/entity/contract.rb +13 -0
- data/lib/archimate/svg/entity/course_of_action.rb +14 -0
- data/lib/archimate/svg/entity/data_entity.rb +29 -0
- data/lib/archimate/svg/entity/data_object.rb +13 -0
- data/lib/archimate/svg/entity/deliverable.rb +13 -0
- data/lib/archimate/svg/entity/device.rb +48 -0
- data/lib/archimate/svg/entity/diagram_model_reference.rb +22 -0
- data/lib/archimate/svg/entity/diagram_object.rb +30 -0
- data/lib/archimate/svg/entity/distribution_network.rb +14 -0
- data/lib/archimate/svg/entity/driver.rb +14 -0
- data/lib/archimate/svg/entity/equipment.rb +16 -0
- data/lib/archimate/svg/entity/event_entity.rb +36 -0
- data/lib/archimate/svg/entity/facility.rb +16 -0
- data/lib/archimate/svg/entity/function_entity.rb +14 -0
- data/lib/archimate/svg/entity/gap.rb +21 -0
- data/lib/archimate/svg/entity/goal.rb +14 -0
- data/lib/archimate/svg/entity/group.rb +24 -0
- data/lib/archimate/svg/entity/implementation_event.rb +13 -0
- data/lib/archimate/svg/entity/infrastructure_function.rb +13 -0
- data/lib/archimate/svg/entity/infrastructure_interface.rb +13 -0
- data/lib/archimate/svg/entity/infrastructure_service.rb +13 -0
- data/lib/archimate/svg/entity/interaction_entity.rb +14 -0
- data/lib/archimate/svg/entity/interface_entity.rb +35 -0
- data/lib/archimate/svg/entity/junction.rb +19 -0
- data/lib/archimate/svg/entity/location.rb +14 -0
- data/lib/archimate/svg/entity/material.rb +14 -0
- data/lib/archimate/svg/entity/meaning.rb +40 -0
- data/lib/archimate/svg/entity/motivation_entity.rb +40 -0
- data/lib/archimate/svg/entity/network.rb +14 -0
- data/lib/archimate/svg/entity/node.rb +33 -0
- data/lib/archimate/svg/entity/node_shape.rb +64 -0
- data/lib/archimate/svg/entity/note.rb +30 -0
- data/lib/archimate/svg/entity/or_junction.rb +14 -0
- data/lib/archimate/svg/entity/outcome.rb +15 -0
- data/lib/archimate/svg/entity/path.rb +14 -0
- data/lib/archimate/svg/entity/plateau.rb +15 -0
- data/lib/archimate/svg/entity/principle.rb +15 -0
- data/lib/archimate/svg/entity/process_entity.rb +63 -0
- data/lib/archimate/svg/entity/product.rb +20 -0
- data/lib/archimate/svg/entity/rect.rb +13 -0
- data/lib/archimate/svg/entity/rect_entity.rb +25 -0
- data/lib/archimate/svg/entity/representation.rb +31 -0
- data/lib/archimate/svg/entity/requirement.rb +15 -0
- data/lib/archimate/svg/entity/resource.rb +14 -0
- data/lib/archimate/svg/entity/rounded_rect_entity.rb +23 -0
- data/lib/archimate/svg/entity/service_entity.rb +51 -0
- data/lib/archimate/svg/entity/sketch_model_sticky.rb +14 -0
- data/lib/archimate/svg/entity/stakeholder.rb +15 -0
- data/lib/archimate/svg/entity/system_software.rb +14 -0
- data/lib/archimate/svg/entity/technology_collaboration.rb +14 -0
- data/lib/archimate/svg/entity/technology_event.rb +13 -0
- data/lib/archimate/svg/entity/technology_function.rb +13 -0
- data/lib/archimate/svg/entity/technology_interaction.rb +13 -0
- data/lib/archimate/svg/entity/technology_interface.rb +13 -0
- data/lib/archimate/svg/entity/technology_process.rb +13 -0
- data/lib/archimate/svg/entity/technology_service.rb +13 -0
- data/lib/archimate/svg/entity/value.rb +27 -0
- data/lib/archimate/svg/entity/work_package.rb +14 -0
- data/lib/archimate/svg/entity.rb +93 -0
- data/lib/archimate/svg/entity_factory.rb +17 -0
- data/lib/archimate/svg/extents.rb +27 -0
- data/lib/archimate/svg/point.rb +7 -0
- data/lib/archimate/svg/svg_template.rb +27 -0
- data/lib/archimate/svg/svg_template.svg.erb +169 -0
- data/lib/archimate/version.rb +4 -0
- data/lib/archimate.rb +114 -0
- metadata +623 -0
data/TODOs.org
ADDED
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
* ArchiMate Tools TODO
|
|
2
|
+
|
|
3
|
+
** SVG Rendering
|
|
4
|
+
|
|
5
|
+
*** DONE skip bendpoints inside source or target
|
|
6
|
+
CLOSED: [2017-02-01 Wed 12:41]
|
|
7
|
+
*** DONE badges for device, node, service (cosmetic)
|
|
8
|
+
CLOSED: [2017-02-01 Wed 12:41]
|
|
9
|
+
*** DONE trim space around diagram names (cosmetic)
|
|
10
|
+
CLOSED: [2017-02-01 Wed 12:42]
|
|
11
|
+
*** DONE badge position updates (cosmetic, legibility)
|
|
12
|
+
CLOSED: [2017-02-01 Wed 12:42]
|
|
13
|
+
*** DONE badge updates (cosmetic)
|
|
14
|
+
CLOSED: [2017-02-01 Wed 12:42]
|
|
15
|
+
*** DONE verify junctions
|
|
16
|
+
CLOSED: [2017-02-01 Wed 12:42]
|
|
17
|
+
*** DONE alternate figures (curved vs box & badge) selected by type="1" on Child (legibility)
|
|
18
|
+
CLOSED: [2017-02-01 Wed 12:42]
|
|
19
|
+
*** DONE text bounds in entities (cosmetic, legibility)
|
|
20
|
+
CLOSED: [2017-02-01 Wed 12:42]
|
|
21
|
+
*** DONE badge spacer settings (cosmetic, legibility) - artifact needs work.
|
|
22
|
+
CLOSED: [2017-02-01 Wed 12:42]
|
|
23
|
+
*** TODO text on lines (cosmetic, legibility)
|
|
24
|
+
*** TODO bendpoint curves (cosmetic)
|
|
25
|
+
*** TODO line crossing hops (cosmetic)
|
|
26
|
+
*** DONE refactor
|
|
27
|
+
CLOSED: [2017-02-01 Wed 12:42]
|
|
28
|
+
|
|
29
|
+
** Performance
|
|
30
|
+
|
|
31
|
+
*** TODO Look into using Celluloid and/or jruby to improve performance
|
|
32
|
+
Thinking about concurrency for performance improvements
|
|
33
|
+
|
|
34
|
+
read base
|
|
35
|
+
read local
|
|
36
|
+
read remote
|
|
37
|
+
|
|
38
|
+
base + local -> diff l
|
|
39
|
+
base + remote -> diff b
|
|
40
|
+
|
|
41
|
+
diff l + diff b -> conflict detection
|
|
42
|
+
|
|
43
|
+
cd -> each conflict type
|
|
44
|
+
|
|
45
|
+
conflicts -> conflict resolution
|
|
46
|
+
|
|
47
|
+
cr (user response)
|
|
48
|
+
|
|
49
|
+
serialize result (single)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
** Diff/Merge
|
|
53
|
+
|
|
54
|
+
*** Conflicts can happen on the same diff 2x. How to handle this?
|
|
55
|
+
*** DONE In `Change.to_s` - deref args that point to other elements (like archimate_element)
|
|
56
|
+
CLOSED: [2017-02-01 Wed 12:48]
|
|
57
|
+
*** In Diagram children diffs - make to_s reference the parent diagram
|
|
58
|
+
*** DONE Array diffs on non-id'd diffable elements should detect changes rather than delete/insert
|
|
59
|
+
CLOSED: [2017-02-01 Wed 12:48]
|
|
60
|
+
*** Archi file could have ids that conflict (i.e. 2 relationships with same id - this is bad!!! Was it a bad merge or something worse)
|
|
61
|
+
*** Implement check for de-duplicated merges
|
|
62
|
+
*** DONE Add a summary diff - elements added/changed/deleted, diagrams
|
|
63
|
+
CLOSED: [2017-02-01 Wed 12:48]
|
|
64
|
+
|
|
65
|
+
** Lint
|
|
66
|
+
|
|
67
|
+
*** DONE Basic Lint features (matching Archi)
|
|
68
|
+
CLOSED: [2017-02-01 Wed 12:49]
|
|
69
|
+
*** TODO Scorecard lint
|
|
70
|
+
|
|
71
|
+
** File Formats & Exports
|
|
72
|
+
|
|
73
|
+
*** TODO Convert support for
|
|
74
|
+
**** TODO Rdf
|
|
75
|
+
**** TODO Gremlin
|
|
76
|
+
**** DONE Neo4j CSV
|
|
77
|
+
CLOSED: [2017-02-01 Wed 13:04]
|
|
78
|
+
**** DONE Cypher
|
|
79
|
+
CLOSED: [2017-02-01 Wed 13:04]
|
|
80
|
+
**** DONE N-Quad
|
|
81
|
+
CLOSED: [2017-02-01 Wed 13:04]
|
|
82
|
+
**** DONE GraphML
|
|
83
|
+
CLOSED: [2017-02-01 Wed 13:04]
|
|
84
|
+
|
|
85
|
+
** DSL
|
|
86
|
+
|
|
87
|
+
*** TODO CLI DSL
|
|
88
|
+
*** TODO DSL for relationships
|
|
89
|
+
# type from to
|
|
90
|
+
"AssociationRelationship", "associated_with", "associated_with"
|
|
91
|
+
"AccessRelationship", "accesses", "accessed_by"
|
|
92
|
+
"UsedByRelationship", "used_by", "uses"
|
|
93
|
+
"RealisationRelationship", "realizes", "realized_by"
|
|
94
|
+
"AssignmentRelationship", ""
|
|
95
|
+
"AggregationRelationship"
|
|
96
|
+
"CompositionRelationship"
|
|
97
|
+
"FlowRelationship"
|
|
98
|
+
"TriggeringRelationship"
|
|
99
|
+
"GroupingRelationship"
|
|
100
|
+
"SpecialisationRelationship"
|
|
101
|
+
"InfluenceRelationship"
|
|
102
|
+
|
|
103
|
+
# attributes that are references to other nodes in the model
|
|
104
|
+
|
|
105
|
+
For any of these inserted or changed...
|
|
106
|
+
|
|
107
|
+
* Property.key (only after PropertyDefs is introduced)
|
|
108
|
+
- Property referenced deleted key
|
|
109
|
+
* Child.target_connections -> Array of Connection ids
|
|
110
|
+
- Connection.id deleted
|
|
111
|
+
* Child.archimate_element -> Element.id
|
|
112
|
+
- Element.id deleted
|
|
113
|
+
* Folder.items -> Array of IdentifiedNode
|
|
114
|
+
- *.id deleted
|
|
115
|
+
* Relationship.source -> Element.id
|
|
116
|
+
- Element.id deleted
|
|
117
|
+
* Relationship.target -> Element.id
|
|
118
|
+
- Element.id deleted
|
|
119
|
+
* Connection.source -> Child.id
|
|
120
|
+
- Child.id deleted
|
|
121
|
+
* Connection.target -> Child.id
|
|
122
|
+
- Child.id deleted
|
|
123
|
+
* Connection.relationship -> Relationship.id
|
|
124
|
+
- Relationship.id deleted
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
** Additional Features
|
|
128
|
+
|
|
129
|
+
*** TODO Add Split file feature (extract say a diagram or set of elements)
|
|
130
|
+
*** TODO Merge unrelated files (this is the intent of Merger)
|
|
131
|
+
*** TODO Add a super strict mode to note when reader finds unexpected content
|
|
132
|
+
*** DONE Stats (elements, relationships, diagrams)
|
|
133
|
+
CLOSED: [2017-02-01 Wed 12:45]
|
|
134
|
+
*** TODO Tool to query for dependencies
|
|
135
|
+
*** TODO Tool to assign/validate/enforce metadata
|
|
136
|
+
|
|
137
|
+
** Code Quality/Refactoring
|
|
138
|
+
|
|
139
|
+
*** TODO Consider breaking this into a number of gems (for example: base lib, diff/merge, other cmdline tools)
|
|
140
|
+
*** TODO Consider making classes for each element and relationship type?
|
|
141
|
+
*** DONE Figure out how to make rmagick optional and/or remove rmagick dependency
|
|
142
|
+
CLOSED: [2017-02-01 Wed 12:45]
|
|
143
|
+
*** TODO Data model items that reference something else by id should have the actual object available - not just the id
|
|
144
|
+
*** DONE Convert all CLIs to use AIO - merge with OutputIO and MaybeIO (maybe)
|
|
145
|
+
CLOSED: [2017-02-01 Wed 12:45]
|
|
146
|
+
*** DONE figure out a better parent mechanism - it's really not fully cooked
|
|
147
|
+
CLOSED: [2017-02-01 Wed 12:45]
|
|
148
|
+
*** DONE remove parent_id from dry::struct objects - then can use class schema instead of comparison attributes
|
|
149
|
+
CLOSED: [2017-02-01 Wed 12:45]
|
|
150
|
+
*** TODO Not handling sketch diagram model in archi
|
|
151
|
+
*** DONE Use one color method - currently using HighLine and Colorize
|
|
152
|
+
CLOSED: [2017-02-01 Wed 12:45]
|
|
153
|
+
*** TODO Refactor merge to pull conflict detection out
|
|
154
|
+
*** DONE Clean up the way that the describe is done on data model
|
|
155
|
+
CLOSED: [2017-02-01 Wed 12:45]
|
|
156
|
+
*** DONE Permit model items to link back to their parent
|
|
157
|
+
CLOSED: [2017-02-01 Wed 12:45]
|
|
158
|
+
*** DONE Should be a master hash index of id to object in Model
|
|
159
|
+
CLOSED: [2017-02-01 Wed 12:45]
|
|
160
|
+
*** DONE Improve description of diffs for conflict display
|
|
161
|
+
CLOSED: [2017-02-01 Wed 12:45]
|
|
162
|
+
*** DONE Eliminate use of Document in favor of Model
|
|
163
|
+
CLOSED: [2017-02-01 Wed 12:45]
|
|
164
|
+
- [X] cli/archi.rb
|
|
165
|
+
- [X] cli/cleanup.rb
|
|
166
|
+
- [X] cli/convert.rb
|
|
167
|
+
- [X] cli/svger.rb
|
|
168
|
+
*** TODO Experiment with Ox, Oga, Sax-Machine for better performance on convert
|
|
169
|
+
*** TODO Map conversion between archi and archimate diagram formats
|
|
170
|
+
*** DONE Write a common clone for dry-struct classes
|
|
171
|
+
CLOSED: [2017-02-01 Wed 12:45]
|
|
172
|
+
*** DONE Make a format agnostic file reader (which delegates to appropriate file type readers)
|
|
173
|
+
CLOSED: [2017-02-01 Wed 12:45]
|
|
174
|
+
*** DONE Decide between ox and nokogiri and eliminate the alternate
|
|
175
|
+
CLOSED: [2017-02-01 Wed 12:45]
|
|
176
|
+
*** DONE See what can be done about performance
|
|
177
|
+
CLOSED: [2017-02-01 Wed 12:46]
|
|
178
|
+
- Reading file 11-12 secs
|
|
179
|
+
- deleted relationships referenced in diagrams is slow
|
|
180
|
+
*** DONE Refactor to better OO design where necessary (see all about names below)
|
|
181
|
+
CLOSED: [2017-02-01 Wed 12:46]
|
|
182
|
+
*** DONE Refactor merge to pull apply diffs out
|
|
183
|
+
CLOSED: [2017-02-01 Wed 12:46]
|
|
184
|
+
*** TODO Refactor Bendpoint to use a point (rather than Archi start/end points).
|
|
185
|
+
*** TODO Refactor DataModel classes to use enumeration classes for appropriate values
|
|
186
|
+
*** TODO Add a test to produce SVG output for the "everything.archimate" file
|
|
187
|
+
*** TODO Add a test to produce a badges diagram
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
* Refactor of data model for diff/merge purposes
|
|
191
|
+
|
|
192
|
+
** Validation
|
|
193
|
+
*** Identifiable objects exist one place in model
|
|
194
|
+
***
|
|
195
|
+
** Join:
|
|
196
|
+
- Organizable Id (An Organizable is an Identifiable that can be contained in a Folder
|
|
197
|
+
- Folder
|
|
198
|
+
- Position in Folder - index isn't good here ... should that position really be a linked list?
|
|
199
|
+
* Introduce the idea of archimate modules
|
|
200
|
+
- Allow creation of a focused model by including archimate modules - which are self-contained packages of elements and relationships
|
|
201
|
+
- Allow inheritance of a module to permit showing changes to an existing model.
|
|
202
|
+
** How to implement?
|
|
203
|
+
- Break things down automatically?
|
|
204
|
+
- By Layer?
|
|
205
|
+
- How to Deal with relationships across module boundaries?
|
|
206
|
+
* Need to have model merge capability
|
|
207
|
+
* TODO Refactor to use a Decorator approach using SimpleDelegator
|
|
208
|
+
* TODO Remove Dry-Types dependency
|
|
209
|
+
* TODO Scan git history and inject metadata for concepts created by git author
|
|
210
|
+
* Changes for v3 have borked the model
|
|
211
|
+
** TODO Push through fixes focusing on the issues from factories to see if that works
|
|
212
|
+
** TODO Refactor model to eliminate a lot of cruft by removing things like in_model= and populating model with objects instead of ID refs
|
|
213
|
+
** TODO Refactor model to improve the diffing of arrays and by writing explicit diff decorators rather than domain model magic
|
|
214
|
+
Both of the last two options risk breaking diffing/merging by making and becoming a long slog
|
|
215
|
+
|
|
216
|
+
* TODO In mergetool - show diagrams that reference elements and relationships in diff conflicts
|
|
217
|
+
|
|
218
|
+
* Notes
|
|
219
|
+
|
|
220
|
+
Generic type - not used directly
|
|
221
|
+
ReferenceType <xs:attribute name="ref" type="xs:IDREF
|
|
222
|
+
|
|
223
|
+
ElementRefGroup <xs:attribute name="elementRef" type="xs:IDREF
|
|
224
|
+
RelationshipRefGroup <xs:attribute name="relationshipRef" type="xs:IDREF
|
|
225
|
+
ConceptRefGroup <xs:attribute name="ConceptRef" type="xs:IDREF
|
|
226
|
+
PropertyDefinitionRefGroup <xs:attribute name="propertyDefinitionRef" type="xs:IDREF
|
|
227
|
+
StereotypeRefGroup <xs:attribute name="stereotypeRef" type="xs:IDREF
|
|
228
|
+
PropertyDefinitionRefAttributeGroup <xs:attribute name="propertyDefinitionRef" type="xs:IDREF
|
|
229
|
+
|
|
230
|
+
RelationshipType <xs:attribute name="source" type="xs:IDREF
|
|
231
|
+
RelationshipType <xs:attribute name="target" type="xs:IDREF
|
|
232
|
+
|
|
233
|
+
OrganizationType <xs:attribute name="identifierRef" type="xs:IDREF
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
RelationshipType.source -> ConceptType?
|
|
237
|
+
RelationshipType.target -> ConceptType?
|
|
238
|
+
ViewType.viewpointRef -> Viewpoint
|
|
239
|
+
|
|
240
|
+
Label.conceptRef -> ConceptType
|
|
241
|
+
Element (Diagram).elementRef -> ElementType
|
|
242
|
+
ConnectionType.source -> ConceptType
|
|
243
|
+
ConnectionType.target -> ConceptType
|
|
244
|
+
Relationship (Diagram).relationshipRef -> RelationshipType
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
ModelType
|
|
248
|
+
PropertyDefinitionType
|
|
249
|
+
ConceptType > [RelationshipType > Access, Influence], ElementType > RealElementType, RelationshipConnectorType, CompositeType
|
|
250
|
+
ViewType > Diagram
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
ViewConceptType > [ViewNodeType > Label, Container], [ConnectionType > Line, SourcedConnectionType > Relationship > NestingRelationship]
|
|
254
|
+
Child is a ViewNodeType
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
ViewpointType
|
|
259
|
+
|
|
260
|
+
* More Notes
|
|
261
|
+
|
|
262
|
+
background_class -> used by entity_shape
|
|
263
|
+
badge -> entity_badge -> to_svg
|
|
264
|
+
entity_shape
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
text_bounds (I think this is only set in entity_shape)
|
|
268
|
+
DiagramModelReference assigns the entity from the child.model_element
|
|
269
|
+
badge_bounds in Gap, MotivationEntity, RectEntity, RoundedRectEntity
|
|
270
|
+
text_align in Note
|
|
271
|
+
|
|
272
|
+
some shapes are dependent on child.child_type
|
|
273
|
+
|
|
274
|
+
badge should be controlled by the entity_shape method
|
|
275
|
+
check that badge_bounds is set by shape (I think it is)
|
|
276
|
+
|
|
277
|
+
text_bounds is controlled by entity_shape
|
|
278
|
+
|
|
279
|
+
background_class : string (default: layer_background_class)
|
|
280
|
+
badge : string option
|
|
281
|
+
entity_shape : (child -> element_name_type -> bounds -> Svg.elt wrap)
|
|
282
|
+
effective_entity : (child -> element_name_type)
|
|
283
|
+
|
|
284
|
+
get effective entity
|
|
285
|
+
|
|
286
|
+
that's used to match the rest:
|
data/archimate.gemspec
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
|
+
require 'archimate/version'
|
|
6
|
+
|
|
7
|
+
Gem::Specification.new do |spec|
|
|
8
|
+
spec.name = "archimate"
|
|
9
|
+
spec.version = Archimate::VERSION
|
|
10
|
+
spec.authors = ["Mark Morga"]
|
|
11
|
+
spec.email = ["markmorga@gmail.com", "mmorga@rackspace.com"]
|
|
12
|
+
|
|
13
|
+
spec.summary = "Archi Tools"
|
|
14
|
+
spec.description = "A collection of tools for working with ArchiMate files from Archi"
|
|
15
|
+
spec.homepage = "http://markmorga.com/archi-tools-rb"
|
|
16
|
+
|
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
18
|
+
spec.bindir = "exe"
|
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
20
|
+
spec.require_paths = ["lib"]
|
|
21
|
+
spec.metadata["yard.run"] = "yri" # use "yard" to build full HTML docs.
|
|
22
|
+
spec.required_ruby_version = '>= 2.3.0'
|
|
23
|
+
|
|
24
|
+
spec.add_runtime_dependency "dry-struct", "~> 0.3.0"
|
|
25
|
+
spec.add_runtime_dependency "nokogiri", "~> 1.6"
|
|
26
|
+
spec.add_runtime_dependency "thor", "~> 0.19"
|
|
27
|
+
spec.add_runtime_dependency "highline", "~> 1.7"
|
|
28
|
+
spec.add_runtime_dependency "ruby-progressbar", "~>1.8.1"
|
|
29
|
+
spec.add_runtime_dependency "parallel", "~> 1.11"
|
|
30
|
+
|
|
31
|
+
spec.add_development_dependency "bundler"
|
|
32
|
+
spec.add_development_dependency "rake"
|
|
33
|
+
spec.add_development_dependency "minitest"
|
|
34
|
+
spec.add_development_dependency "minitest-matchers"
|
|
35
|
+
spec.add_development_dependency "minitest-color"
|
|
36
|
+
spec.add_development_dependency "minitest-profile"
|
|
37
|
+
spec.add_development_dependency "pry"
|
|
38
|
+
spec.add_development_dependency "pry-byebug"
|
|
39
|
+
spec.add_development_dependency "guard"
|
|
40
|
+
spec.add_development_dependency "guard-minitest"
|
|
41
|
+
spec.add_development_dependency "guard-bundler"
|
|
42
|
+
spec.add_development_dependency "ruby-prof"
|
|
43
|
+
spec.add_development_dependency "simplecov"
|
|
44
|
+
spec.add_development_dependency "simplecov-json"
|
|
45
|
+
spec.add_development_dependency "kramdown"
|
|
46
|
+
spec.add_development_dependency "yard"
|
|
47
|
+
spec.add_development_dependency "guard-ctags-bundler"
|
|
48
|
+
spec.add_development_dependency "faker"
|
|
49
|
+
spec.add_development_dependency "rsense"
|
|
50
|
+
spec.add_development_dependency "awesome_print"
|
|
51
|
+
end
|
data/bin/archimate
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
#
|
|
4
|
+
# This file was generated by Bundler.
|
|
5
|
+
#
|
|
6
|
+
# The application 'archimate' is installed as part of a gem, and
|
|
7
|
+
# this file is here to facilitate running it.
|
|
8
|
+
#
|
|
9
|
+
|
|
10
|
+
require "pathname"
|
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
|
12
|
+
Pathname.new(__FILE__).realpath)
|
|
13
|
+
|
|
14
|
+
require "rubygems"
|
|
15
|
+
require "bundler/setup"
|
|
16
|
+
|
|
17
|
+
load Gem.bin_path("archimate", "archimate")
|
data/bin/console
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "bundler/setup"
|
|
5
|
+
require "nokogiri"
|
|
6
|
+
require "archimate"
|
|
7
|
+
require "faker"
|
|
8
|
+
require "awesome_print"
|
|
9
|
+
require_relative "../test/examples/factories"
|
|
10
|
+
include Archimate::Examples::Factories
|
|
11
|
+
|
|
12
|
+
require "pry"
|
|
13
|
+
Pry.start
|
data/bin/setup
ADDED
data/exe/archidiff
ADDED
data/exe/archimate
ADDED
data/exe/archimerge
ADDED
data/exe/fmtxml
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Archimate
|
|
4
|
+
module Cli
|
|
5
|
+
require "thor"
|
|
6
|
+
|
|
7
|
+
def self.output_io(output_io, force)
|
|
8
|
+
if output_io.is_a?(String)
|
|
9
|
+
if !force && File.exist?(output_io)
|
|
10
|
+
# TODO: This needs to be handled with more grace
|
|
11
|
+
return nil unless @hl.agree("File #{output_io} exists. Overwrite?")
|
|
12
|
+
end
|
|
13
|
+
output_io = File.open(output_io, "w")
|
|
14
|
+
end
|
|
15
|
+
output_io
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class Archi < Thor
|
|
19
|
+
desc "stats ARCHIFILE", "Show some statistics about the model"
|
|
20
|
+
option :noninteractive,
|
|
21
|
+
aliases: :n,
|
|
22
|
+
type: :boolean,
|
|
23
|
+
default: false,
|
|
24
|
+
desc: "Don't provide interactive feedback"
|
|
25
|
+
def stats(archifile)
|
|
26
|
+
Config.instance.interactive = !options.fetch("noninteractive", false)
|
|
27
|
+
Archimate::Cli::Stats.new(
|
|
28
|
+
Archimate.read(archifile),
|
|
29
|
+
$stdout
|
|
30
|
+
).statistics
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
desc "map ARCHIFILE", "Produce a map of diagram links to a diagram"
|
|
34
|
+
option :output,
|
|
35
|
+
aliases: :o,
|
|
36
|
+
desc: "Write output to FILE instead of stdout."
|
|
37
|
+
option :noninteractive,
|
|
38
|
+
aliases: :n,
|
|
39
|
+
type: :boolean,
|
|
40
|
+
default: false,
|
|
41
|
+
desc: "Don't provide interactive feedback"
|
|
42
|
+
def map(archifile)
|
|
43
|
+
Config.instance.interactive = !options.fetch("noninteractive", false)
|
|
44
|
+
Archimate::Cli::Mapper.new(
|
|
45
|
+
Archimate.read(archifile),
|
|
46
|
+
Cli.output_io(options.fetch("output", $stdout), false)
|
|
47
|
+
).map
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
desc "merge ARCHIFILE1 ARCHIFILE2", "EXPERIMENTAL: Merge two archimate files"
|
|
51
|
+
option :output,
|
|
52
|
+
aliases: :o,
|
|
53
|
+
desc: "Write output to FILE instead of stdout."
|
|
54
|
+
def merge(archifile1, archifile2)
|
|
55
|
+
Archimate::Cli::Merger.new.merge_files(archifile1, archifile2)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
desc "svg -o OUTPUTDIR ARCHIFILE", "IN DEVELOPMENT: Produce semantically meaningful SVG files from an Archi file"
|
|
59
|
+
option :output,
|
|
60
|
+
aliases: :o,
|
|
61
|
+
required: true,
|
|
62
|
+
desc: "Write output to OUTPUTDIR"
|
|
63
|
+
option :noninteractive,
|
|
64
|
+
aliases: :n,
|
|
65
|
+
type: :boolean,
|
|
66
|
+
default: false,
|
|
67
|
+
desc: "Don't provide interactive feedback"
|
|
68
|
+
def svg(archifile)
|
|
69
|
+
Config.instance.interactive = !options.fetch("noninteractive", false)
|
|
70
|
+
Archimate::Cli::Svger.export_svgs(
|
|
71
|
+
archifile,
|
|
72
|
+
options.fetch("output", Dir.pwd)
|
|
73
|
+
)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
desc "clean ARCHIFILE", "Clean up unreferenced elements and relations"
|
|
77
|
+
option :output,
|
|
78
|
+
aliases: :o,
|
|
79
|
+
desc: "Write output to FILE instead of replacing ARCHIFILE"
|
|
80
|
+
option :saveremoved,
|
|
81
|
+
aliases: :r,
|
|
82
|
+
desc: "Write removed elements into FILE"
|
|
83
|
+
option :noninteractive,
|
|
84
|
+
aliases: :n,
|
|
85
|
+
type: :boolean,
|
|
86
|
+
default: false,
|
|
87
|
+
desc: "Don't provide interactive feedback"
|
|
88
|
+
def clean(archifile)
|
|
89
|
+
Config.instance.interactive = !options.fetch("noninteractive", false)
|
|
90
|
+
outfile = options.key?(:output) ? options[:output] : archifile
|
|
91
|
+
Archimate::MaybeIO.new(options.fetch(:saveremoved, nil)) do |removed_element_io|
|
|
92
|
+
Archimate::Cli::Cleanup.new(Archimate.read(archifile), outfile, removed_element_io)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
desc "dupes ARCHIFILE", "List (potential) duplicate elements in Archi file"
|
|
97
|
+
def dupes(archifile)
|
|
98
|
+
Archimate::Cli::Duper.new(
|
|
99
|
+
archimate.read(archifile),
|
|
100
|
+
STDOUT
|
|
101
|
+
).list
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
desc "dedupe ARCHIFILE", "de-duplicate elements in Archi file"
|
|
105
|
+
option :mergeall,
|
|
106
|
+
aliases: :m,
|
|
107
|
+
type: :boolean,
|
|
108
|
+
default: false,
|
|
109
|
+
desc: "Merges all duplicates without asking"
|
|
110
|
+
option :output,
|
|
111
|
+
aliases: :o,
|
|
112
|
+
desc: "Write output to FILE instead of replacing ARCHIFILE"
|
|
113
|
+
option :force,
|
|
114
|
+
aliases: :f,
|
|
115
|
+
type: :boolean,
|
|
116
|
+
default: false,
|
|
117
|
+
desc: "Force overwriting of existing output file"
|
|
118
|
+
option :noninteractive,
|
|
119
|
+
aliases: :n,
|
|
120
|
+
type: :boolean,
|
|
121
|
+
default: false,
|
|
122
|
+
desc: "Don't provide interactive feedback"
|
|
123
|
+
def dedupe(archifile)
|
|
124
|
+
Config.instance.interactive = !options.fetch("noninteractive", false)
|
|
125
|
+
Archimate::Cli::Duper.new(
|
|
126
|
+
Archimate.read(archifile),
|
|
127
|
+
Cli.output_io(
|
|
128
|
+
options.fetch("output", archifile),
|
|
129
|
+
options[:force]
|
|
130
|
+
),
|
|
131
|
+
options[:mergeall]
|
|
132
|
+
).merge
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
desc "convert ARCHIFILE", "Convert the incoming file to the desired type"
|
|
136
|
+
option :to,
|
|
137
|
+
aliases: :t,
|
|
138
|
+
default: Archimate::Cli::Convert::SUPPORTED_FORMATS.first,
|
|
139
|
+
desc: "File type to convert to. Options are: " \
|
|
140
|
+
"'meff2.1' for Open Group Model Exchange File Format for ArchiMate 2.1 " \
|
|
141
|
+
"'archi' for Archi http://archimatetool.com/ file format " \
|
|
142
|
+
"'nquads' for RDF 1.1 N-Quads format https://www.w3.org/TR/n-quads/" \
|
|
143
|
+
"'graphml' for GraphML" \
|
|
144
|
+
"'csv' for CSV files (one file per element/relationship type",
|
|
145
|
+
enum: Archimate::Cli::Convert::SUPPORTED_FORMATS
|
|
146
|
+
option :output,
|
|
147
|
+
aliases: :o,
|
|
148
|
+
desc: "Write output to FILE instead of stdout."
|
|
149
|
+
option :outputdir,
|
|
150
|
+
aliases: :d,
|
|
151
|
+
desc: "Write output to DIRECTORY."
|
|
152
|
+
option :force,
|
|
153
|
+
aliases: :f,
|
|
154
|
+
type: :boolean,
|
|
155
|
+
desc: "Force overwriting of existing output file"
|
|
156
|
+
option :noninteractive,
|
|
157
|
+
aliases: :n,
|
|
158
|
+
type: :boolean,
|
|
159
|
+
default: false,
|
|
160
|
+
desc: "Don't provide interactive feedback"
|
|
161
|
+
def convert(archifile)
|
|
162
|
+
output_dir = options.fetch("outputdir", Dir.pwd)
|
|
163
|
+
output_io = Cli.output_io(
|
|
164
|
+
options.fetch("output", $stdout),
|
|
165
|
+
options.fetch("force", false)
|
|
166
|
+
)
|
|
167
|
+
Config.instance.interactive = !options.fetch("noninteractive", false)
|
|
168
|
+
Archimate::Cli::Convert.new(
|
|
169
|
+
Archimate.read(archifile)
|
|
170
|
+
).convert(options[:to], output_io, output_dir)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
desc "lint ARCHIFILE", "Examine the ArchiMate file for potential problems"
|
|
174
|
+
option :output,
|
|
175
|
+
aliases: :o,
|
|
176
|
+
desc: "Write output to FILE instead of STDOUT"
|
|
177
|
+
def lint(archifile)
|
|
178
|
+
output_io = Cli.output_io(
|
|
179
|
+
options.fetch("output", $stdout),
|
|
180
|
+
options.fetch("force", false)
|
|
181
|
+
)
|
|
182
|
+
Archimate::Cli::Lint.new(
|
|
183
|
+
Archimate.read(archifile),
|
|
184
|
+
output_io
|
|
185
|
+
).lint
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# The point of this script is to identify elements that aren't a part of any
|
|
4
|
+
# relationship and not referenced on any diagrams.
|
|
5
|
+
|
|
6
|
+
module Archimate
|
|
7
|
+
module Cli
|
|
8
|
+
class Cleanup
|
|
9
|
+
attr_reader :model
|
|
10
|
+
|
|
11
|
+
def self.cleanup(input, output, options)
|
|
12
|
+
cleaner = new(Archimate.read(input), output, options)
|
|
13
|
+
cleaner.clean
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def initialize(model, output, options)
|
|
17
|
+
@model = model
|
|
18
|
+
@output = output
|
|
19
|
+
@options = options
|
|
20
|
+
@trash = Nokogiri::XML::Document.new("<deleted></deleted>")
|
|
21
|
+
@model_set = nil
|
|
22
|
+
@progressbar = ProgressIndicator.new(total: model.unreferenced_nodes.size, title: "Elements")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def remove_unreferenced_nodes
|
|
26
|
+
model.unreferenced_nodes.each do |id|
|
|
27
|
+
ns = model.lookup(id)
|
|
28
|
+
puts "Found duplicate ids: #{ns}" if ns.size > 1
|
|
29
|
+
unreferenced_node = ns[0]
|
|
30
|
+
trash.root.add_child unreferenced_node.dup
|
|
31
|
+
prev_sib = unreferenced_node.previous_sibling
|
|
32
|
+
if prev_sib.instance_of?(Nokogiri::XML::Text) && prev_sib.content.strip.empty?
|
|
33
|
+
ns << prev_sib
|
|
34
|
+
end
|
|
35
|
+
ns.remove
|
|
36
|
+
@progressbar.increment
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def write_trash
|
|
41
|
+
options[:saveremoved].write(trash)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def clean
|
|
45
|
+
return unless model
|
|
46
|
+
|
|
47
|
+
remove_unreferenced_nodes
|
|
48
|
+
puts "Found #{unref_set.size} model items unreferenced by diagram or relationships"
|
|
49
|
+
Archimate::ArchiFileWriter.write(model, output)
|
|
50
|
+
write_trash
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|