archimate 2.0.1 → 2.0.2
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/archimate.gemspec +2 -1
- data/lib/archimate/color.rb +2 -2
- data/lib/archimate/data_model/any_attribute.rb +4 -10
- data/lib/archimate/data_model/any_element.rb +9 -17
- data/lib/archimate/data_model/bounds.rb +6 -6
- data/lib/archimate/data_model/color.rb +6 -6
- data/lib/archimate/data_model/comparison.rb +101 -5
- data/lib/archimate/data_model/concern.rb +5 -13
- data/lib/archimate/data_model/connection.rb +39 -48
- data/lib/archimate/data_model/connector_type.rb +1 -0
- data/lib/archimate/data_model/diagram.rb +27 -42
- data/lib/archimate/data_model/diagram_type.rb +1 -0
- data/lib/archimate/data_model/element.rb +14 -35
- data/lib/archimate/data_model/elements.rb +681 -0
- data/lib/archimate/data_model/font.rb +8 -8
- data/lib/archimate/data_model/lang_string.rb +10 -36
- data/lib/archimate/data_model/layer.rb +4 -5
- data/lib/archimate/data_model/layers.rb +45 -49
- data/lib/archimate/data_model/location.rb +6 -6
- data/lib/archimate/data_model/metadata.rb +2 -6
- data/lib/archimate/data_model/model.rb +50 -62
- data/lib/archimate/data_model/modeling_note.rb +3 -8
- data/lib/archimate/data_model/organization.rb +18 -27
- data/lib/archimate/data_model/property.rb +9 -8
- data/lib/archimate/data_model/property_definition.rb +15 -21
- data/lib/archimate/data_model/referenceable.rb +14 -9
- data/lib/archimate/data_model/referenceable_list.rb +82 -0
- data/lib/archimate/data_model/relationship.rb +41 -152
- data/lib/archimate/data_model/relationship_references.rb +29 -0
- data/lib/archimate/data_model/relationships.rb +214 -0
- data/lib/archimate/data_model/schema_info.rb +6 -12
- data/lib/archimate/data_model/style.rb +14 -25
- data/lib/archimate/data_model/view_node.rb +38 -66
- data/lib/archimate/data_model/viewpoint.rb +23 -38
- data/lib/archimate/data_model/viewpoint_type.rb +347 -387
- data/lib/archimate/data_model.rb +7 -6
- data/lib/archimate/derived_relations.rb +106 -31
- data/lib/archimate/export/cypher.rb +0 -18
- data/lib/archimate/export/jsonl.rb +16 -45
- data/lib/archimate/export/n_quads.rb +1 -24
- data/lib/archimate/file_formats/archi_file_reader.rb +2 -1
- data/lib/archimate/file_formats/model_exchange_file_writer_21.rb +9 -1
- data/lib/archimate/file_formats/sax/archi/archi_handler_factory.rb +2 -2
- data/lib/archimate/file_formats/sax/archi/connection.rb +2 -1
- data/lib/archimate/file_formats/sax/archi/element.rb +7 -5
- data/lib/archimate/file_formats/sax/archi/relationship.rb +1 -1
- data/lib/archimate/file_formats/sax/model_exchange_file/connection.rb +2 -1
- data/lib/archimate/file_formats/sax/model_exchange_file/element.rb +1 -1
- data/lib/archimate/file_formats/sax/model_exchange_file/relationship.rb +1 -1
- data/lib/archimate/file_formats/sax/model_exchange_file/view_node.rb +0 -1
- data/lib/archimate/file_formats/serializer/archi/relationship.rb +1 -1
- data/lib/archimate/lint/duplicate_entities.rb +46 -42
- data/lib/archimate/svg/archimate.css +12 -2
- data/lib/archimate/svg/entity/base_entity.rb +6 -29
- data/lib/archimate/svg/entity/location.rb +1 -0
- data/lib/archimate/svg/entity_factory.rb +3 -3
- data/lib/archimate/svg/point.rb +3 -3
- data/lib/archimate/svg/svg_template.svg.erb +5 -5
- data/lib/archimate/version.rb +2 -1
- metadata +20 -6
- data/TODOs.org +0 -505
- data/lib/archimate/data_model/differentiable.rb +0 -142
- data/lib/archimate/data_model/element_type.rb +0 -89
- data/lib/archimate/data_model/relationship_type.rb +0 -45
data/lib/archimate/data_model.rb
CHANGED
@@ -4,16 +4,13 @@ module Archimate
|
|
4
4
|
module DataModel
|
5
5
|
# Enumeration of Influence Strength types. These are suggestions.
|
6
6
|
# InfluenceStrengthEnum = String # Strict::String.enum(%w[+ ++ - -- 0 1 2 3 4 5 6 7 8 9 10])
|
7
|
-
|
7
|
+
require 'archimate/data_model/referenceable'
|
8
|
+
require 'archimate/data_model/referenceable_list'
|
8
9
|
require 'archimate/data_model/connector_type'
|
9
10
|
require 'archimate/data_model/diagram_type'
|
10
|
-
require 'archimate/data_model/element_type'
|
11
|
-
require 'archimate/data_model/relationship_type'
|
12
11
|
require 'archimate/data_model/comparison'
|
13
|
-
require 'archimate/data_model/differentiable'
|
14
12
|
require 'archimate/data_model/layer'
|
15
13
|
require 'archimate/data_model/layers'
|
16
|
-
require 'archimate/data_model/viewpoint_type'
|
17
14
|
require 'archimate/data_model/any_attribute'
|
18
15
|
require 'archimate/data_model/any_element'
|
19
16
|
require 'archimate/data_model/lang_string'
|
@@ -28,8 +25,12 @@ module Archimate
|
|
28
25
|
require 'archimate/data_model/property_definition'
|
29
26
|
require 'archimate/data_model/property'
|
30
27
|
require 'archimate/data_model/organization'
|
31
|
-
require 'archimate/data_model/element'
|
32
28
|
require 'archimate/data_model/relationship'
|
29
|
+
require 'archimate/data_model/relationships'
|
30
|
+
require 'archimate/data_model/relationship_references'
|
31
|
+
require 'archimate/data_model/element'
|
32
|
+
require 'archimate/data_model/elements'
|
33
|
+
require 'archimate/data_model/viewpoint_type'
|
33
34
|
require 'archimate/data_model/concern'
|
34
35
|
require 'archimate/data_model/viewpoint'
|
35
36
|
require 'archimate/data_model/location'
|
@@ -1,7 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Archimate
|
4
|
+
# 5.6.1 Derivation Rule for Structural and Dependency Relationships
|
5
|
+
#
|
6
|
+
# The structural and dependency relationships can be ordered by 'strength'.
|
7
|
+
# Structural relationships are 'stronger' than dependency relationships, and
|
8
|
+
# the relationships within these categories can also be ordered by strength:
|
9
|
+
#
|
10
|
+
# * Influence (weakest)
|
11
|
+
# * Access
|
12
|
+
# * Serving
|
13
|
+
# * Realization
|
14
|
+
# * Assignment
|
15
|
+
# * Aggregation
|
16
|
+
# * Composition (strongest)
|
17
|
+
#
|
18
|
+
# Part of the language definition is an abstraction rule that states that two
|
19
|
+
# relationships that join at an intermediate element can be combined and
|
20
|
+
# replaced by the weaker of the two.
|
21
|
+
#
|
22
|
+
# 5.6.2 Derivation Rules for Dynamic Relationships
|
23
|
+
#
|
24
|
+
# For the two dynamic relationships, the following rules apply:
|
25
|
+
#
|
26
|
+
# * If there is a flow relationship r from element a to element b, and a
|
27
|
+
# structural relationship from element c to element a, a flow relationship
|
28
|
+
# r can be derived from element c to element b.
|
29
|
+
# * If there is a flow relationship r from element a to element b, and a
|
30
|
+
# structural relationship from element d to element b, a flow relationship
|
31
|
+
# r can be derived from element a to element d.
|
32
|
+
#
|
33
|
+
# These rules can be applied repeatedly. Informally, this means that the
|
34
|
+
# begin and/or endpoint of a flow relationship can be transferred 'backward'
|
35
|
+
# in a chain of elements connected by structural relationships. Example 16
|
36
|
+
# shows two of the possible flow relationships that can be derived with these
|
37
|
+
# rules, given a flow relationship between the two services.
|
38
|
+
#
|
39
|
+
# This rule also applies for a triggering relationship, but only in
|
40
|
+
# combination with an assignment relationship (not with other structural
|
41
|
+
# relationships):
|
42
|
+
#
|
43
|
+
# * If there is a triggering relationship r from element a to element b, and
|
44
|
+
# an assignment relationship from element c to element a, a triggering
|
45
|
+
# relationship r can be derived from element c to element b.
|
46
|
+
# * If there is a triggering relationship r from element a to element b, and
|
47
|
+
# an assignment relationship from element d to element b, a triggering
|
48
|
+
# relationship r can be derived from element a to element d.
|
49
|
+
#
|
50
|
+
# Moreover, triggering relationships are transitive:
|
51
|
+
#
|
52
|
+
# * If there is a triggering relationship from element a to element b, and a
|
53
|
+
# triggering relationship from element b to element c, a triggering
|
54
|
+
# relationship can be derived from element a to element c.
|
2
55
|
class DerivedRelations
|
3
|
-
PASS_ALL =
|
4
|
-
FAIL_ALL =
|
56
|
+
PASS_ALL = ->(_item) { true }
|
57
|
+
FAIL_ALL = ->(_item) { false }
|
5
58
|
|
6
59
|
def initialize(model)
|
7
60
|
@model = model
|
@@ -30,26 +83,16 @@ module Archimate
|
|
30
83
|
# below this element are not followed
|
31
84
|
def derived_relations(start_elements, relationship_filter, target_filter, stop_filter = FAIL_ALL)
|
32
85
|
traverse(start_elements, relationship_filter, stop_filter)
|
33
|
-
.reject
|
34
|
-
.select
|
35
|
-
.map
|
36
|
-
DataModel::Relationship.new(
|
37
|
-
id: @model.make_unique_id,
|
38
|
-
type: derived_relationship_type(path),
|
39
|
-
source: path.first.source,
|
40
|
-
target: path.last.target,
|
41
|
-
derived: true
|
42
|
-
)
|
43
|
-
}
|
86
|
+
.reject(&single_relation_paths) # See #2 above
|
87
|
+
.select(&target_relations(target_filter))
|
88
|
+
.map(&create_relationship_for_path)
|
44
89
|
.uniq { |rel| [rel.type, rel.source, rel.target] }
|
45
90
|
end
|
46
91
|
|
47
92
|
def derived_relationship_type(path)
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
.min
|
52
|
-
).first
|
93
|
+
path
|
94
|
+
.min_by(&:weight)
|
95
|
+
.class
|
53
96
|
end
|
54
97
|
|
55
98
|
# traverse returns an Array of paths (Array<Relationship>)
|
@@ -65,19 +108,11 @@ module Archimate
|
|
65
108
|
# returns true for.
|
66
109
|
def traverse(start_elements, relation_filter, stop_filter, from_path = [])
|
67
110
|
return [] if from_path.size > 100
|
68
|
-
start_elements.each_with_object([]) do |el,
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
result.concat(immediate_rels)
|
74
|
-
result.concat(
|
75
|
-
*immediate_rels
|
76
|
-
.reject { |rel| rel.target.nil? || (stop_filter && stop_filter.call(rel)) }
|
77
|
-
.map { |rel|
|
78
|
-
traverse([rel.target], relation_filter, stop_filter, from_path + [rel])
|
79
|
-
.map { |path| Array(path).unshift(rel) }
|
80
|
-
}
|
111
|
+
start_elements.each_with_object([]) do |el, relations|
|
112
|
+
concrete_rels = concrete_relationships(el, relation_filter, from_path)
|
113
|
+
relations.concat(
|
114
|
+
concrete_rels,
|
115
|
+
*derived_relationship_paths(concrete_rels, relation_filter, stop_filter, from_path)
|
81
116
|
)
|
82
117
|
end
|
83
118
|
end
|
@@ -91,5 +126,45 @@ module Archimate
|
|
91
126
|
.relationships
|
92
127
|
.select { |rel| rel.source.id == el.id }
|
93
128
|
end
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
def concrete_relationships(el, relation_filter, from_path)
|
133
|
+
element_relationships(el)
|
134
|
+
.select(&relation_filter)
|
135
|
+
.reject { |rel| from_path.include?(rel) }
|
136
|
+
end
|
137
|
+
|
138
|
+
def derived_relationship_paths(concrete_rels, relation_filter, stop_filter, from_path)
|
139
|
+
concrete_rels
|
140
|
+
.reject { |rel| rel.target.nil? || (stop_filter&.call(rel)) }
|
141
|
+
.map do |rel|
|
142
|
+
traverse([rel.target], relation_filter, stop_filter, from_path + [rel])
|
143
|
+
.map { |path| Array(path).unshift(rel) }
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def single_relation_paths
|
148
|
+
->(path) { Array(path).size <= 1 }
|
149
|
+
end
|
150
|
+
|
151
|
+
def target_relations(target_filter)
|
152
|
+
->(path) { target_filter.call(path.last.target) }
|
153
|
+
end
|
154
|
+
|
155
|
+
def create_relationship_for_path
|
156
|
+
lambda do |path|
|
157
|
+
derived_relationship_type(path).new(
|
158
|
+
id: @model.make_unique_id,
|
159
|
+
source: path.first.source,
|
160
|
+
target: path.last.target,
|
161
|
+
derived: true
|
162
|
+
)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def by_relation_uniq_attributes
|
167
|
+
->(rel) { [rel.type, rel.source, rel.target] }
|
168
|
+
end
|
94
169
|
end
|
95
170
|
end
|
@@ -22,24 +22,6 @@
|
|
22
22
|
# accessType: Relationship.access_type
|
23
23
|
# Labels:
|
24
24
|
# Relationship.type
|
25
|
-
#
|
26
|
-
# | Weight | Name |
|
27
|
-
# |--------+----------------|
|
28
|
-
# | 1 | Association |
|
29
|
-
# | 2 | Access |
|
30
|
-
# | 3 | Used by |
|
31
|
-
# | 4 | Realization |
|
32
|
-
# | 5 | Assignment |
|
33
|
-
# | 6 | Aggregation |
|
34
|
-
# | 7 | Composition |
|
35
|
-
# | 8 | Flow |
|
36
|
-
# | 9 | Triggering |
|
37
|
-
# | 10 | Grouping |
|
38
|
-
# | 11 | Junction |
|
39
|
-
# | 12 | Specialization |
|
40
|
-
# Structural stronger than Dependency Relationships
|
41
|
-
# ServingRelationship == UsedByRelationship
|
42
|
-
|
43
25
|
|
44
26
|
module Archimate
|
45
27
|
module Export
|
@@ -45,7 +45,7 @@ require "json"
|
|
45
45
|
module Archimate
|
46
46
|
module Export
|
47
47
|
def self.clean_json(hash)
|
48
|
-
JSON.generate(hash.delete_if { |_k,v| v.nil? || (v.is_a?(String) && v.empty?) })
|
48
|
+
JSON.generate(hash.delete_if { |_k, v| v.nil? || (v.is_a?(String) && v.empty?) })
|
49
49
|
end
|
50
50
|
|
51
51
|
class PropertiesHash
|
@@ -75,35 +75,17 @@ module Archimate
|
|
75
75
|
# `nodeId`: "d8e75068-df75-4c21-a2af-fab5c195687a"
|
76
76
|
def to_jsonl
|
77
77
|
Export.clean_json(
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
properties: PropertiesHash.new(element.properties).to_h
|
85
|
-
}
|
78
|
+
_key: element.id,
|
79
|
+
name: element.name&.to_s,
|
80
|
+
layer: element.layer&.name&.to_s&.delete(" "),
|
81
|
+
type: element.type,
|
82
|
+
documentation: element.documentation&.to_s,
|
83
|
+
properties: PropertiesHash.new(element.properties).to_h
|
86
84
|
)
|
87
85
|
end
|
88
86
|
end
|
89
87
|
|
90
88
|
class JsonlEdge
|
91
|
-
WEIGHTS = {
|
92
|
-
'GroupingRelationship' => 0,
|
93
|
-
'JunctionRelationship' => 0,
|
94
|
-
'AssociationRelationship' => 0,
|
95
|
-
'SpecialisationRelationship' => 1,
|
96
|
-
'FlowRelationship' => 2,
|
97
|
-
'TriggeringRelationship' => 3,
|
98
|
-
'InfluenceRelationship' => 4,
|
99
|
-
'AccessRelationship' => 5,
|
100
|
-
'UsedByRelationship' => 6,
|
101
|
-
'RealisationRelationship' => 7,
|
102
|
-
'AssignmentRelationship' => 8,
|
103
|
-
'AggregationRelationship' => 9,
|
104
|
-
'CompositionRelationship' => 10
|
105
|
-
}
|
106
|
-
|
107
89
|
attr_reader :relationship
|
108
90
|
|
109
91
|
def initialize(relationship)
|
@@ -112,28 +94,17 @@ module Archimate
|
|
112
94
|
|
113
95
|
def to_jsonl
|
114
96
|
Export.clean_json(
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
weight: weight
|
125
|
-
}
|
97
|
+
_key: relationship.id,
|
98
|
+
_from: relationship.source,
|
99
|
+
_to: relationship.target,
|
100
|
+
name: relationship.name&.to_s,
|
101
|
+
type: relationship.type,
|
102
|
+
accessType: relationship.access_type,
|
103
|
+
documentation: relationship.documentation&.to_s,
|
104
|
+
properties: PropertiesHash.new(relationship.properties).to_h,
|
105
|
+
weight: relationship.weight
|
126
106
|
)
|
127
107
|
end
|
128
|
-
|
129
|
-
private
|
130
|
-
def weight
|
131
|
-
unless WEIGHTS.include?(relationship.type)
|
132
|
-
raise "Relationship type not found: \"#{relationship.type}\""
|
133
|
-
return 0
|
134
|
-
end
|
135
|
-
WEIGHTS[relationship.type]
|
136
|
-
end
|
137
108
|
end
|
138
109
|
|
139
110
|
class Jsonl
|
@@ -103,35 +103,12 @@ module Archimate
|
|
103
103
|
|
104
104
|
def relationships(el)
|
105
105
|
[
|
106
|
-
make_quad(el.source.id,
|
106
|
+
make_quad(el.source.id, el.class::VERB, el.target.id),
|
107
107
|
make_quad(el.id, "sources", el.source.id),
|
108
108
|
make_quad(el.id, "target", el.target.id)
|
109
109
|
]
|
110
110
|
end
|
111
111
|
|
112
|
-
PREDICATES = {
|
113
|
-
"AssociationRelationship" => %w(associated_with associated_with),
|
114
|
-
"AccessRelationship" => %w(accesses accessed_by),
|
115
|
-
"UsedByRelationship" => %w(used_by uses),
|
116
|
-
"ServingRelationship" => %w(serving served_by),
|
117
|
-
"RealisationRelationship" => %w(realizes realized_by),
|
118
|
-
"RealizationRelationship" => %w(realizes realized_by),
|
119
|
-
"AssignmentRelationship" => %w(assigned_to assigned_from),
|
120
|
-
"AggregationRelationship" => %w(aggregates aggregated_by),
|
121
|
-
"CompositionRelationship" => %w(composes composed_by),
|
122
|
-
"FlowRelationship" => %w(flows_to flows_from),
|
123
|
-
"TriggeringRelationship" => %w(triggers triggered_by),
|
124
|
-
"GroupingRelationship" => %w(groups grouped_by),
|
125
|
-
"SpecialisationRelationship" => %w(specializes specialized_by),
|
126
|
-
"SpecializationRelationship" => %w(specializes specialized_by),
|
127
|
-
"InfluenceRelationship" => %w(influences influenced)
|
128
|
-
}.freeze
|
129
|
-
|
130
|
-
def predicate(t)
|
131
|
-
raise "Unexpected relationship name: '#{t}'" unless PREDICATES.include?(t)
|
132
|
-
PREDICATES[t][0]
|
133
|
-
end
|
134
|
-
|
135
112
|
def make_quad(subject, predicate, object)
|
136
113
|
if subject.nil? || predicate.nil? || object.nil?
|
137
114
|
raise(
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "nokogiri"
|
3
4
|
|
4
5
|
module Archimate
|
@@ -8,7 +9,7 @@ module Archimate
|
|
8
9
|
@string_or_io = doc
|
9
10
|
end
|
10
11
|
|
11
|
-
def parse
|
12
|
+
def parse
|
12
13
|
handler_factory = Sax::Archi::ArchiHandlerFactory.new
|
13
14
|
parser = Nokogiri::XML::SAX::Parser.new(Sax::Document.new(handler_factory))
|
14
15
|
parser.parse(@string_or_io)
|
@@ -1,8 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "nokogiri"
|
3
4
|
|
4
5
|
module Archimate
|
5
6
|
module FileFormats
|
7
|
+
REL_NAME_MAPPING = {
|
8
|
+
DataModel::Relationships::Realization => "Realisation",
|
9
|
+
DataModel::Relationships::Serving => "UsedBy",
|
10
|
+
DataModel::Relationships::Specialization => "Specialisation"
|
11
|
+
}.freeze
|
12
|
+
|
6
13
|
# Archimate version 2.1 Model Exchange Format Writer
|
7
14
|
class ModelExchangeFileWriter21 < Serializer::ModelExchangeFile::ModelExchangeFileWriter
|
8
15
|
include Serializer::ModelExchangeFile::V21::Connection
|
@@ -25,11 +32,12 @@ module Archimate
|
|
25
32
|
end
|
26
33
|
|
27
34
|
def relationship_attributes(relationship)
|
35
|
+
rel_name = REL_NAME_MAPPING.fetch(relationship.class, relationship.type)
|
28
36
|
{
|
29
37
|
identifier: identifier(relationship.id),
|
30
38
|
source: identifier(relationship.source.id),
|
31
39
|
target: identifier(relationship.target.id),
|
32
|
-
"xsi:type" =>
|
40
|
+
"xsi:type" => "#{rel_name}Relationship"
|
33
41
|
}
|
34
42
|
end
|
35
43
|
|
@@ -14,11 +14,11 @@ module Archimate
|
|
14
14
|
when "element"
|
15
15
|
element_type = Hash[attrs]["xsi:type"].sub(/archimate:/, '')
|
16
16
|
case element_type
|
17
|
-
when DataModel::
|
17
|
+
when DataModel::Elements
|
18
18
|
Element
|
19
19
|
when DataModel::DiagramType
|
20
20
|
Diagram
|
21
|
-
when DataModel::
|
21
|
+
when DataModel::Relationships
|
22
22
|
Relationship
|
23
23
|
else
|
24
24
|
raise "Unexpected element_type #{element_type}"
|
@@ -23,11 +23,13 @@ module Archimate
|
|
23
23
|
private
|
24
24
|
|
25
25
|
def element
|
26
|
-
@element ||= DataModel::
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
26
|
+
@element ||= DataModel::Elements.create(
|
27
|
+
id: @attrs["id"],
|
28
|
+
name: DataModel::LangString.string(process_text(@attrs["name"])),
|
29
|
+
type: element_type,
|
30
|
+
documentation: documentation,
|
31
|
+
properties: properties
|
32
|
+
)
|
31
33
|
end
|
32
34
|
end
|
33
35
|
end
|
@@ -1,42 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Archimate
|
2
4
|
module Lint
|
3
|
-
STOP_WORDS = %w
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
5
|
+
STOP_WORDS = %w[
|
6
|
+
a able about above according accordingly across actually after afterwards again against all allow allows
|
7
|
+
almost alone along already also although always am among amongst amoungst amount an and another any anybody
|
8
|
+
anyhow anyone anything anyway anyways anywhere apart appear appreciate appropriate are around as aside ask
|
9
|
+
asking associated at available away awfully back be became because become becomes becoming been before
|
10
|
+
beforehand behind being believe below beside besides best better between beyond bill both bottom brief but
|
11
|
+
by call came can can't cannot cant cause causes certain certainly changes clearly co com come comes computer
|
12
|
+
con concerning consequently consider considering contain containing contains corresponding could couldn't
|
13
|
+
couldnt course cry currently de dear definitely describe described despite detail did didn't different do
|
14
|
+
does doesn't doing don't done down downwards due during each edu eg eight either eleven else elsewhere empty
|
15
|
+
enough entirely especially et etc even ever every everybody everyone everything everywhere ex exactly example
|
16
|
+
except far few fifteen fifth fify fill find fire first five followed following follows for former formerly
|
17
|
+
forth forty found four from front full further furthermore get gets getting give given gives go goes going
|
18
|
+
gone got gotten greetings had hadn't happens hardly has hasn't hasnt have haven't having he he's hello help
|
19
|
+
hence her here here's hereafter hereby herein hereupon hers herself hi him himself his hither hopefully how
|
20
|
+
howbeit however hundred i i'd i'll i'm i've ie if ignored immediate in inasmuch inc indeed indicate indicated
|
21
|
+
indicates inner insofar instead interest into inward is isn't it it'd it'll it's its itself just keep keeps
|
22
|
+
kept know known knows last lately later latter latterly least less lest let let's like liked likely little
|
23
|
+
look looking looks ltd made mainly many may maybe me mean meanwhile merely might mill mine more moreover most
|
24
|
+
mostly move much must my myself name namely nd near nearly necessary need needs neither never nevertheless
|
25
|
+
new next nine no nobody non none noone nor normally not nothing novel now nowhere obviously of off often oh
|
26
|
+
ok okay old on once one ones only onto or other others otherwise ought our ours ourselves out outside over
|
27
|
+
overall own part particular particularly per perhaps placed please plus possible presumably probably provides
|
28
|
+
put que quite qv rather rd re really reasonably regarding regardless regards relatively respectively right
|
29
|
+
said same saw say saying says second secondly see seeing seem seemed seeming seems seen self selves sensible
|
30
|
+
sent serious seriously seven several shall she should shouldn't show side since sincere six sixty so some
|
31
|
+
somebody somehow someone something sometime sometimes somewhat somewhere soon sorry specified specify
|
32
|
+
specifying still sub such sup sure system take taken tell ten tends th than thank thanks thanx that that's
|
33
|
+
thats the their theirs them themselves then thence there there's thereafter thereby therefore therein theres
|
34
|
+
thereupon these they they'd they'll they're they've thick thin think third this thorough thoroughly those
|
35
|
+
though three through throughout thru thus tis to together too took top toward towards tried tries truly try
|
36
|
+
trying twas twelve twenty twice two un under unfortunately unless unlikely until unto up upon us use used
|
37
|
+
useful uses using usually value various very via viz vs want wants was wasn't way we we'd we'll we're we've
|
38
|
+
welcome well went were weren't what what's whatever when whence whenever where where's whereafter whereas
|
39
|
+
whereby wherein whereupon wherever whether which while whither who who's whoever whole whom whose why will
|
40
|
+
willing wish with within without won't wonder would wouldn't yes yet you you'd you'll you're you've your
|
41
|
+
yours yourself yourselves zero
|
42
|
+
].freeze
|
40
43
|
|
41
44
|
class DuplicateEntities
|
42
45
|
attr_reader :word_count
|
@@ -47,7 +50,7 @@ module Archimate
|
|
47
50
|
@dupes = nil
|
48
51
|
@count = nil
|
49
52
|
@word_count = {}
|
50
|
-
@ignored_entity_types = %w
|
53
|
+
@ignored_entity_types = %w[Junction AndJunction OrJunction]
|
51
54
|
dupe_list
|
52
55
|
end
|
53
56
|
|
@@ -59,15 +62,16 @@ module Archimate
|
|
59
62
|
count.zero?
|
60
63
|
end
|
61
64
|
|
62
|
-
def each
|
65
|
+
def each
|
63
66
|
@dupes.keys.sort.each do |name|
|
64
67
|
ary = @dupes[name]
|
65
68
|
element_type = ary.first.type
|
66
|
-
|
69
|
+
yield(element_type, name, ary)
|
67
70
|
end
|
68
71
|
end
|
69
72
|
|
70
73
|
protected
|
74
|
+
|
71
75
|
def candidate_entities
|
72
76
|
@model.entities.select do |entity|
|
73
77
|
(entity.is_a?(DataModel::Element) || entity.is_a?(DataModel::Relationship)) &&
|
@@ -86,7 +90,7 @@ module Archimate
|
|
86
90
|
end
|
87
91
|
|
88
92
|
def entity_hash_name(entity)
|
89
|
-
layer =
|
93
|
+
layer = entity.layer
|
90
94
|
layer_sort_order = layer ? DataModel::Layers.find_index(layer) : 9
|
91
95
|
[
|
92
96
|
entity.class.name, # Taking advantage of Element being before Relationship
|
@@ -105,7 +109,7 @@ module Archimate
|
|
105
109
|
# 5. names differ only by stop-words (list of words such as "the", "api", etc.)
|
106
110
|
def simplify(entity)
|
107
111
|
name = entity.name&.dup.to_s || ""
|
108
|
-
name.sub
|
112
|
+
name = name.sub("(copy)", "") # (copy) is a special case inserted by the Archi tool
|
109
113
|
name.downcase!
|
110
114
|
name.gsub!(/[[:punct:]]/, "") unless entity.is_a?(DataModel::Relationship)
|
111
115
|
name.strip!
|