lutaml-uml 0.4.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yml +22 -0
  3. data/Gemfile +1 -5
  4. data/README.adoc +4 -42
  5. data/Rakefile +0 -5
  6. data/lutaml-uml.gemspec +23 -38
  7. metadata +20 -292
  8. data/.github/workflows/macos.yml +0 -38
  9. data/.github/workflows/ubuntu.yml +0 -40
  10. data/.github/workflows/windows.yml +0 -51
  11. data/.gitignore +0 -12
  12. data/.rspec +0 -3
  13. data/.travis.yml +0 -6
  14. data/CODE_OF_CONDUCT.md +0 -74
  15. data/LUTAML.adoc +0 -344
  16. data/bin/console +0 -15
  17. data/bin/folder_yaml2lutaml.sh +0 -6
  18. data/bin/plantuml2lutaml +0 -59
  19. data/bin/setup +0 -8
  20. data/bin/yaml2lutaml +0 -144
  21. data/exe/lutaml-wsd2uml +0 -59
  22. data/exe/lutaml-yaml2uml +0 -144
  23. data/lib/lutaml/layout/engine.rb +0 -15
  24. data/lib/lutaml/layout/graph_viz_engine.rb +0 -19
  25. data/lib/lutaml/uml/abstraction.rb +0 -11
  26. data/lib/lutaml/uml/activity.rb +0 -11
  27. data/lib/lutaml/uml/actor.rb +0 -19
  28. data/lib/lutaml/uml/association.rb +0 -41
  29. data/lib/lutaml/uml/behavior.rb +0 -11
  30. data/lib/lutaml/uml/class.rb +0 -83
  31. data/lib/lutaml/uml/classifier.rb +0 -11
  32. data/lib/lutaml/uml/connector.rb +0 -21
  33. data/lib/lutaml/uml/constraint.rb +0 -12
  34. data/lib/lutaml/uml/constructor_end.rb +0 -16
  35. data/lib/lutaml/uml/data_type.rb +0 -75
  36. data/lib/lutaml/uml/dependency.rb +0 -21
  37. data/lib/lutaml/uml/diagram.rb +0 -8
  38. data/lib/lutaml/uml/document.rb +0 -81
  39. data/lib/lutaml/uml/enum.rb +0 -45
  40. data/lib/lutaml/uml/event.rb +0 -12
  41. data/lib/lutaml/uml/final_state.rb +0 -11
  42. data/lib/lutaml/uml/formatter/base.rb +0 -67
  43. data/lib/lutaml/uml/formatter/graphviz.rb +0 -334
  44. data/lib/lutaml/uml/formatter.rb +0 -21
  45. data/lib/lutaml/uml/has_attributes.rb +0 -14
  46. data/lib/lutaml/uml/has_members.rb +0 -30
  47. data/lib/lutaml/uml/instance.rb +0 -17
  48. data/lib/lutaml/uml/model.rb +0 -13
  49. data/lib/lutaml/uml/node/base.rb +0 -21
  50. data/lib/lutaml/uml/node/class_node.rb +0 -57
  51. data/lib/lutaml/uml/node/class_relationship.rb +0 -14
  52. data/lib/lutaml/uml/node/document.rb +0 -18
  53. data/lib/lutaml/uml/node/field.rb +0 -34
  54. data/lib/lutaml/uml/node/has_name.rb +0 -15
  55. data/lib/lutaml/uml/node/has_type.rb +0 -15
  56. data/lib/lutaml/uml/node/method.rb +0 -29
  57. data/lib/lutaml/uml/node/method_argument.rb +0 -16
  58. data/lib/lutaml/uml/node/relationship.rb +0 -28
  59. data/lib/lutaml/uml/opaque_behavior.rb +0 -11
  60. data/lib/lutaml/uml/operation.rb +0 -31
  61. data/lib/lutaml/uml/package.rb +0 -53
  62. data/lib/lutaml/uml/parsers/attribute.rb +0 -70
  63. data/lib/lutaml/uml/parsers/dsl.rb +0 -413
  64. data/lib/lutaml/uml/parsers/dsl_preprocessor.rb +0 -59
  65. data/lib/lutaml/uml/parsers/dsl_transform.rb +0 -27
  66. data/lib/lutaml/uml/parsers/yaml.rb +0 -46
  67. data/lib/lutaml/uml/port.rb +0 -8
  68. data/lib/lutaml/uml/primitive_type.rb +0 -14
  69. data/lib/lutaml/uml/property.rb +0 -27
  70. data/lib/lutaml/uml/pseudostate.rb +0 -11
  71. data/lib/lutaml/uml/realization.rb +0 -11
  72. data/lib/lutaml/uml/region.rb +0 -12
  73. data/lib/lutaml/uml/serializers/association.rb +0 -58
  74. data/lib/lutaml/uml/serializers/base.rb +0 -16
  75. data/lib/lutaml/uml/serializers/class.rb +0 -29
  76. data/lib/lutaml/uml/serializers/top_element_attribute.rb +0 -14
  77. data/lib/lutaml/uml/serializers/yaml_view.rb +0 -18
  78. data/lib/lutaml/uml/state.rb +0 -12
  79. data/lib/lutaml/uml/state_machine.rb +0 -12
  80. data/lib/lutaml/uml/top_element.rb +0 -58
  81. data/lib/lutaml/uml/top_element_attribute.rb +0 -37
  82. data/lib/lutaml/uml/transition.rb +0 -12
  83. data/lib/lutaml/uml/trigger.rb +0 -12
  84. data/lib/lutaml/uml/value.rb +0 -30
  85. data/lib/lutaml/uml/version.rb +0 -7
  86. data/lib/lutaml/uml/vertex.rb +0 -11
  87. data/lib/lutaml/uml.rb +0 -13
  88. data/spec/fixtures/datamodel/models/AddressClassProfile.yml +0 -90
  89. data/spec/fixtures/datamodel/models/AddressComponentProfile.yml +0 -63
  90. data/spec/fixtures/datamodel/models/AddressComponentSpecification.yml +0 -15
  91. data/spec/fixtures/datamodel/models/AddressProfile.yml +0 -36
  92. data/spec/fixtures/datamodel/models/AttributeProfile.yml +0 -32
  93. data/spec/fixtures/datamodel/models/InterchangeAddressClassProfile.yml +0 -79
  94. data/spec/fixtures/datamodel/models/Localization copy.yml +0 -23
  95. data/spec/fixtures/datamodel/models/Localization.yml +0 -23
  96. data/spec/fixtures/datamodel/models/ProfileCompliantAddress.yml +0 -36
  97. data/spec/fixtures/datamodel/models/ProfileCompliantAddressComponent.yml +0 -15
  98. data/spec/fixtures/datamodel/models/Signature.yml +0 -20
  99. data/spec/fixtures/datamodel/models/SignatureBlankDefinition.yml +0 -20
  100. data/spec/fixtures/datamodel/models/TextDirectionCode copy.yml +0 -16
  101. data/spec/fixtures/datamodel/models/TextDirectionCode.yml +0 -16
  102. data/spec/fixtures/datamodel/models/Validity.yml +0 -14
  103. data/spec/fixtures/datamodel/models/iso19160-1/Address.yml +0 -22
  104. data/spec/fixtures/datamodel/models/iso19160-1/AddressComponent.yml +0 -2
  105. data/spec/fixtures/datamodel/style.uml.inc +0 -37
  106. data/spec/fixtures/datamodel/views/AddressClassProfile.yml +0 -12
  107. data/spec/fixtures/datamodel/views/AddressProfile.yml +0 -3
  108. data/spec/fixtures/datamodel/views/CommonModels.yml +0 -9
  109. data/spec/fixtures/datamodel/views/TopDown.yml +0 -62
  110. data/spec/fixtures/dsl/broken_diagram.lutaml +0 -34
  111. data/spec/fixtures/dsl/diagram.lutaml +0 -3
  112. data/spec/fixtures/dsl/diagram_attributes.lutaml +0 -5
  113. data/spec/fixtures/dsl/diagram_blank_definion.lutaml +0 -6
  114. data/spec/fixtures/dsl/diagram_blank_entities.lutaml +0 -8
  115. data/spec/fixtures/dsl/diagram_class_assocation.lutaml +0 -29
  116. data/spec/fixtures/dsl/diagram_class_fields.lutaml +0 -25
  117. data/spec/fixtures/dsl/diagram_commented_includes.lutaml +0 -5
  118. data/spec/fixtures/dsl/diagram_comments.lutaml +0 -28
  119. data/spec/fixtures/dsl/diagram_concept_model.lutaml +0 -132
  120. data/spec/fixtures/dsl/diagram_data_types.lutaml +0 -44
  121. data/spec/fixtures/dsl/diagram_definitions.lutaml +0 -25
  122. data/spec/fixtures/dsl/diagram_includes.lutaml +0 -6
  123. data/spec/fixtures/dsl/diagram_multiply_classes.lutaml +0 -7
  124. data/spec/fixtures/dsl/diagram_non_existing_include.lutaml +0 -6
  125. data/spec/fixtures/dsl/shared.lutaml +0 -3
  126. data/spec/fixtures/dsl/shared1.lutaml +0 -4
  127. data/spec/fixtures/generated_dot/AddressClassProfile.dot +0 -170
  128. data/spec/fixtures/generated_dot/AddressProfile.dot +0 -34
  129. data/spec/lutaml/layout/graph_viz_engine_spec.rb +0 -31
  130. data/spec/lutaml/uml/formatter/graphviz_spec.rb +0 -41
  131. data/spec/lutaml/uml/parsers/dsl_spec.rb +0 -343
  132. data/spec/lutaml/uml/parsers/yaml_spec.rb +0 -18
  133. data/spec/lutaml/uml/serializers/yaml_view_spec.rb +0 -20
  134. data/spec/lutaml/uml_spec.rb +0 -7
  135. data/spec/spec_helper.rb +0 -25
@@ -1,343 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe Lutaml::Uml::Parsers::Dsl do
6
- describe ".parse" do
7
- subject(:parse) { described_class.parse(content) }
8
- subject(:format_parsed_document) do
9
- Lutaml::Uml::Formatter::Graphviz.new.format_document(parse)
10
- end
11
-
12
- shared_examples "the correct graphviz formatting" do
13
- it "does not raise error on graphviz formatting" do
14
- expect { format_parsed_document }.to_not raise_error
15
- end
16
- end
17
-
18
- context "when simple diagram without attributes" do
19
- let(:content) do
20
- File.new(fixtures_path("dsl/diagram.lutaml"))
21
- end
22
-
23
- it "creates Lutaml::Uml::Document object from supplied dsl" do
24
- expect(parse).to be_instance_of(Lutaml::Uml::Document)
25
- end
26
-
27
- it_behaves_like "the correct graphviz formatting"
28
- end
29
-
30
- context "when diagram with attributes" do
31
- let(:content) do
32
- File.new(fixtures_path("dsl/diagram_attributes.lutaml"))
33
- end
34
-
35
- it "creates Lutaml::Uml::Document object and sets its attributes" do
36
- expect(parse).to be_instance_of(Lutaml::Uml::Document)
37
- expect(parse.title).to eq("my diagram")
38
- expect(parse.fontname).to eq("Arial")
39
- end
40
-
41
- it_behaves_like "the correct graphviz formatting"
42
- end
43
-
44
- context "when multiply classes entries" do
45
- let(:content) do
46
- File.new(fixtures_path("dsl/diagram_multiply_classes.lutaml"))
47
- end
48
-
49
- it "creates Lutaml::Uml::Document object and creates dependent classes" do
50
- classes = parse.classes
51
- expect(parse).to be_instance_of(Lutaml::Uml::Document)
52
- expect(parse.classes.length).to eq(4)
53
- expect(by_name(classes, "NamespacedClass").keyword).to eq("MyNamespace")
54
- end
55
-
56
- it_behaves_like "the correct graphviz formatting"
57
- end
58
-
59
- context "when class with fields" do
60
- let(:content) do
61
- File.new(fixtures_path("dsl/diagram_class_fields.lutaml"))
62
- end
63
-
64
- it "creates the correct classes and sets the \
65
- correct number of attributes" do
66
- classes = parse.classes
67
- expect(by_name(classes, "Component").attributes).to be_nil
68
- expect(by_name(classes, "AddressClassProfile")
69
- .attributes.length).to eq(1)
70
- expect(by_name(classes, "AttributeProfile")
71
- .attributes.length).to eq(13)
72
- expect(by_name(classes, "AttributeProfile")
73
- .attributes.map(&:name))
74
- .to(eq(["imlicistAttributeProfile",
75
- "attributeProfile",
76
- "attributeProfile1",
77
- "privateAttributeProfile",
78
- "friendlyAttributeProfile",
79
- "friendlyAttributeProfile1",
80
- "protectedAttributeProfile",
81
- "type/text",
82
- "slashType",
83
- "application/docbook+xml",
84
- "application/tei+xml",
85
- "text/x-asciidoc",
86
- "application/x-isodoc+xml"]))
87
- end
88
-
89
- it "creates the correct attributes with the correct visibility" do
90
- attributes = by_name(parse.classes, "AttributeProfile").attributes
91
- expect(by_name(attributes, "imlicistAttributeProfile").visibility)
92
- .to be_nil
93
- expect(by_name(attributes, "imlicistAttributeProfile").keyword)
94
- .to be_nil
95
- expect(by_name(attributes, "attributeProfile").visibility)
96
- .to eq("public")
97
- expect(by_name(attributes, "attributeProfile").keyword)
98
- .to eq("BasicDocument")
99
- expect(by_name(attributes, "attributeProfile1").visibility)
100
- .to eq("public")
101
- expect(by_name(attributes, "attributeProfile1").keyword)
102
- .to eq("BasicDocument")
103
- expect(by_name(attributes, "privateAttributeProfile").visibility)
104
- .to eq("private")
105
- expect(by_name(attributes, "friendlyAttributeProfile").visibility)
106
- .to eq("friendly")
107
- expect(by_name(attributes, "friendlyAttributeProfile").keyword)
108
- .to eq("Type")
109
- expect(by_name(attributes, "protectedAttributeProfile").visibility)
110
- .to eq("protected")
111
- end
112
-
113
- it_behaves_like "the correct graphviz formatting"
114
- end
115
-
116
- context "when association blocks exists" do
117
- let(:content) do
118
- File.new(fixtures_path("dsl/diagram_class_assocation.lutaml"))
119
- end
120
-
121
- it "creates the correct number of associations" do
122
- expect(parse.associations.length).to eq(3)
123
- end
124
-
125
- context "when bidirectional asscoiation syntax " do
126
- subject(:association) do
127
- by_name(parse.associations, "BidirectionalAsscoiation")
128
- end
129
-
130
- it "creates associations with the correct attributes" do
131
- expect(association.owner_end_type).to(eq("aggregation"))
132
- expect(association.member_end_type).to(eq("direct"))
133
- expect(association.owner_end).to(eq("AddressClassProfile"))
134
- expect(association.owner_end_attribute_name)
135
- .to(eq("addressClassProfile"))
136
- expect(association.member_end).to(eq("AttributeProfile"))
137
- expect(association.member_end_attribute_name)
138
- .to(eq("attributeProfile"))
139
- expect(association.member_end_cardinality).to(eq("min" => "0", "max" => "*"))
140
- end
141
- end
142
-
143
- context "when direct asscoiation syntax " do
144
- subject(:association) do
145
- by_name(parse.associations, "DirectAsscoiation")
146
- end
147
-
148
- it "creates associations with the correct attributes" do
149
- expect(association.owner_end_type).to(be_nil)
150
- expect(association.member_end_type).to(eq("direct"))
151
- expect(association.owner_end).to(eq("AddressClassProfile"))
152
- expect(association.owner_end_attribute_name).to(be_nil)
153
- expect(association.member_end).to(eq("AttributeProfile"))
154
- expect(association.member_end_attribute_name)
155
- .to(eq("attributeProfile"))
156
- expect(association.member_end_cardinality).to(be_nil)
157
- end
158
- end
159
-
160
- context "when reverse asscoiation syntax " do
161
- subject(:association) do
162
- by_name(parse.associations, "ReverseAsscoiation")
163
- end
164
-
165
- it "creates associations with the correct attributes" do
166
- expect(association.owner_end_type).to(eq("aggregation"))
167
- expect(association.member_end_type).to(be_nil)
168
- expect(association.owner_end).to(eq("AddressClassProfile"))
169
- expect(association.owner_end_attribute_name)
170
- .to(eq("addressClassProfile"))
171
- expect(association.member_end).to(eq("AttributeProfile"))
172
- expect(association.member_end_attribute_name).to(be_nil)
173
- expect(association.member_end_cardinality).to(be_nil)
174
- end
175
- end
176
- end
177
-
178
- context "when data_types entries" do
179
- let(:content) do
180
- File.new(fixtures_path("dsl/diagram_data_types.lutaml"))
181
- end
182
-
183
- it "Generates the correct nodes for enums" do
184
- enums = parse.enums
185
- expect(by_name(enums, "MyEnum").attributes).to be_nil
186
- expect(by_name(enums, "AddressClassProfile")
187
- .attributes.length).to eq(1)
188
- expect(by_name(enums, "Profile")
189
- .attributes.length).to eq(5)
190
- end
191
-
192
- it "Generates the correct nodes for data_types" do
193
- data_types = parse.data_types
194
- expect(by_name(data_types, "Banking Information")
195
- .attributes.map(&:name))
196
- .to(eq(["art code", "CCT Number"]))
197
- end
198
-
199
- it "Generates the correct nodes for primitives" do
200
- data_types = parse.primitives
201
- expect(by_name(data_types, "Integer")).to_not be_nil
202
- end
203
-
204
- it_behaves_like "the correct graphviz formatting"
205
- end
206
-
207
- context "when concept model generated lutaml file" do
208
- let(:content) do
209
- File.new(fixtures_path("dsl/diagram_concept_model.lutaml"))
210
- end
211
-
212
- it "Generates the correct class/enums/associations list" do
213
- document = parse
214
- expect(document.classes.length).to(eq(9))
215
- expect(document.enums.length).to(eq(3))
216
- expect(document.associations.length).to(eq(16))
217
- end
218
-
219
- it "Generates the correct attributes list" do
220
- attributes = by_name(parse.classes, "ExpressionDesignation").attributes
221
- expect(attributes.length).to(eq(5))
222
- expect(attributes.map(&:name))
223
- .to(eq(%w[text language script pronunciation grammarInfo]))
224
- expect(attributes.map(&:type))
225
- .to(eq(["GlossaristTextElementType",
226
- "Iso639ThreeCharCode",
227
- "Iso15924Code",
228
- "LocalizedString",
229
- "GrammarInfo"]))
230
- end
231
-
232
- it_behaves_like "the correct graphviz formatting"
233
- end
234
-
235
- context "when include directives is used" do
236
- let(:content) do
237
- File.new(fixtures_path("dsl/diagram_includes.lutaml"))
238
- end
239
-
240
- it "includes supplied files into the document" do
241
- expect(parse.classes.map(&:name))
242
- .to(eq(%w[Foo Doo Koo AttributeProfile]))
243
- expect(by_name(parse.classes, "AttributeProfile")
244
- .attributes.map(&:name))
245
- .to eq(["imlicistAttributeProfile", "attributeProfile"])
246
- end
247
-
248
- it_behaves_like "the correct graphviz formatting"
249
- end
250
-
251
- context "when include directives is used" do
252
- let(:content) do
253
- File.new(fixtures_path("dsl/diagram_comments.lutaml"))
254
- end
255
-
256
- it "create comments for document and classes" do
257
- expect(parse.comments).to(eq(["My comment",
258
- "this is multiline\n comment with {} special\n chars/\n\n +-|/"]))
259
- expect(parse.classes.last.comments)
260
- .to(eq(["this is attribute comment",
261
- "this is another comment line\n with multiply lines"]))
262
- end
263
-
264
- it_behaves_like "the correct graphviz formatting"
265
- end
266
-
267
- context "when defninition directives included" do
268
- let(:content) do
269
- File.new(fixtures_path("dsl/diagram_definitions.lutaml"))
270
- end
271
- let(:class_definition) do
272
- "this is multiline with `ascidoc`\ncomments\nand list\n{foo} {name}"
273
- end
274
- let(:attribute_definition) do
275
- "this is attribute definition\nwith multiply lines\n{foo} {name}\nend definition"
276
- end
277
-
278
- it "create comments for document and classes" do
279
- expect(by_name(parse.classes, "AddressClassProfile").definition)
280
- .to(eq(class_definition))
281
- expect(by_name(parse.classes, "AttributeProfile")
282
- .attributes
283
- .first
284
- .definition)
285
- .to(eq(attribute_definition))
286
- end
287
-
288
- it_behaves_like "the correct graphviz formatting"
289
- end
290
-
291
- context "when defninition is blank" do
292
- let(:content) do
293
- File.new(fixtures_path("dsl/diagram_blank_definion.lutaml"))
294
- end
295
-
296
- it "successfully renders" do
297
- expect { parse }.to_not(raise_error)
298
- end
299
- end
300
-
301
- context "when there are blank definitions" do
302
- let(:content) do
303
- File.new(fixtures_path("dsl/diagram_blank_entities.lutaml"))
304
- end
305
-
306
- it "successfully renders" do
307
- expect { parse }.to_not(raise_error)
308
- end
309
- end
310
-
311
- context "when its a non existing include file" do
312
- let(:content) do
313
- File.new(fixtures_path("dsl/diagram_non_existing_include.lutaml"))
314
- end
315
-
316
- it "successfully renders" do
317
- expect { parse }.to_not(raise_error)
318
- end
319
- end
320
-
321
- context "when there are commented preprocessor lines" do
322
- let(:content) do
323
- File.new(fixtures_path("dsl/diagram_commented_includes.lutaml"))
324
- end
325
-
326
- it "successfully renders" do
327
- expect { parse }.to_not(raise_error)
328
- end
329
- end
330
-
331
- context "when broken lutaml file passed" do
332
- let(:content) do
333
- File.new(fixtures_path("dsl/broken_diagram.lutaml"))
334
- end
335
-
336
- it "returns error object and prints line number" do
337
- expect { described_class.parse(content, {}) }
338
- .to(raise_error(Lutaml::Uml::Parsers::ParsingError,
339
- /but got ":" at line 25 char 32/))
340
- end
341
- end
342
- end
343
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe Lutaml::Uml::Parsers::Yaml do
6
- describe ".parse" do
7
- subject(:parse) { described_class.parse(yaml_conent) }
8
-
9
- let(:yaml_conent) do
10
- fixtures_path("datamodel/views/TopDown.yml")
11
- end
12
-
13
- it "creates Lutaml::Uml::Document object from yaml" do
14
- expect(parse).to be_instance_of(Lutaml::Uml::Document)
15
- expect(parse.classes.first).to be_instance_of(Lutaml::Uml::Class)
16
- end
17
- end
18
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
- require "lutaml/uml/serializers/yaml_view"
5
-
6
- RSpec.describe Lutaml::Uml::Serializers::YamlView do
7
- describe "#new" do
8
- subject(:serialize) { described_class.new(yaml_content) }
9
-
10
- let(:yaml_content) do
11
- YAML.safe_load(File.read(fixtures_path("datamodel/views/TopDown.yml")))
12
- end
13
-
14
- it "Correctly parses passed yaml file" do
15
- expect(serialize.name).to eq(yaml_content["name"])
16
- expect(serialize.title).to eq(yaml_content["title"])
17
- expect(serialize.caption).to eq(yaml_content["caption"])
18
- end
19
- end
20
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Lutaml::Uml do
4
- it "has a version number" do
5
- expect(Lutaml::Uml::VERSION).not_to be nil
6
- end
7
- end
data/spec/spec_helper.rb DELETED
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "bundler/setup"
4
- require "lutaml/uml"
5
- require "byebug"
6
-
7
- RSpec.configure do |config|
8
- # Enable flags like --only-failures and --next-failure
9
- config.example_status_persistence_file_path = ".rspec_status"
10
-
11
- # Disable RSpec exposing methods globally on `Module` and `main`
12
- config.disable_monkey_patching!
13
-
14
- config.expect_with :rspec do |c|
15
- c.syntax = :expect
16
- end
17
- end
18
-
19
- def fixtures_path(path)
20
- File.join(File.expand_path("./fixtures", __dir__), path)
21
- end
22
-
23
- def by_name(entries, name)
24
- entries.detect { |n| n.name == name }
25
- end