reqif 0.1.0 → 0.2.1

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 (118) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yml +7 -4
  3. data/.rubocop.yml +17 -6
  4. data/.rubocop_todo.yml +63 -0
  5. data/CLAUDE.md +73 -0
  6. data/Gemfile +6 -2
  7. data/README.adoc +61 -1
  8. data/lib/reqif/alternative_id.rb +2 -2
  9. data/lib/reqif/attribute_definition_boolean.rb +5 -4
  10. data/lib/reqif/attribute_definition_date.rb +5 -4
  11. data/lib/reqif/attribute_definition_enumeration.rb +5 -4
  12. data/lib/reqif/attribute_definition_integer.rb +5 -4
  13. data/lib/reqif/attribute_definition_real.rb +5 -4
  14. data/lib/reqif/attribute_definition_string.rb +5 -4
  15. data/lib/reqif/attribute_definition_xhtml.rb +5 -4
  16. data/lib/reqif/attribute_value_boolean.rb +3 -2
  17. data/lib/reqif/attribute_value_date.rb +4 -3
  18. data/lib/reqif/attribute_value_enumeration.rb +3 -2
  19. data/lib/reqif/attribute_value_integer.rb +4 -3
  20. data/lib/reqif/attribute_value_real.rb +4 -3
  21. data/lib/reqif/attribute_value_string.rb +3 -2
  22. data/lib/reqif/attribute_value_xhtml.rb +3 -2
  23. data/lib/reqif/children.rb +3 -2
  24. data/lib/reqif/core_content.rb +3 -2
  25. data/lib/reqif/datatype_definition_boolean.rb +5 -4
  26. data/lib/reqif/datatype_definition_date.rb +5 -4
  27. data/lib/reqif/datatype_definition_enumeration.rb +5 -4
  28. data/lib/reqif/datatype_definition_integer.rb +7 -6
  29. data/lib/reqif/datatype_definition_real.rb +7 -6
  30. data/lib/reqif/datatype_definition_string.rb +5 -4
  31. data/lib/reqif/datatype_definition_xhtml.rb +5 -4
  32. data/lib/reqif/datatypes.rb +23 -12
  33. data/lib/reqif/default_value.rb +4 -3
  34. data/lib/reqif/definition.rb +24 -16
  35. data/lib/reqif/doors/identifier.rb +15 -0
  36. data/lib/reqif/doors/module_definition.rb +23 -0
  37. data/lib/reqif/doors/namespace.rb +10 -0
  38. data/lib/reqif/doors/readonly_attributes.rb +48 -0
  39. data/lib/reqif/doors/rif_definition.rb +26 -0
  40. data/lib/reqif/doors/string_type.rb +12 -0
  41. data/lib/reqif/doors.rb +12 -0
  42. data/lib/reqif/editable_atts.rb +24 -16
  43. data/lib/reqif/embedded_value.rb +4 -3
  44. data/lib/reqif/enum_value.rb +4 -4
  45. data/lib/reqif/high_precision_date_time.rb +52 -0
  46. data/lib/reqif/namespace.rb +16 -0
  47. data/lib/reqif/object.rb +3 -3
  48. data/lib/reqif/properties.rb +2 -2
  49. data/lib/reqif/relation_group.rb +5 -4
  50. data/lib/reqif/relation_group_type.rb +5 -4
  51. data/lib/reqif/req_if.rb +7 -2
  52. data/lib/reqif/req_if_content.rb +3 -2
  53. data/lib/reqif/req_if_header.rb +4 -5
  54. data/lib/reqif/req_if_tool_extension.rb +48 -2
  55. data/lib/reqif/reqif_float.rb +98 -0
  56. data/lib/reqif/reqif_integer.rb +36 -0
  57. data/lib/reqif/source.rb +3 -3
  58. data/lib/reqif/source_specification.rb +3 -3
  59. data/lib/reqif/spec_attributes.rb +25 -13
  60. data/lib/reqif/spec_hierarchy.rb +5 -4
  61. data/lib/reqif/spec_object.rb +5 -4
  62. data/lib/reqif/spec_object_type.rb +5 -4
  63. data/lib/reqif/spec_objects.rb +3 -2
  64. data/lib/reqif/spec_relation.rb +5 -4
  65. data/lib/reqif/spec_relation_groups.rb +2 -2
  66. data/lib/reqif/spec_relation_type.rb +5 -4
  67. data/lib/reqif/spec_relations.rb +3 -3
  68. data/lib/reqif/spec_types.rb +3 -2
  69. data/lib/reqif/specification.rb +5 -4
  70. data/lib/reqif/specification_type.rb +5 -4
  71. data/lib/reqif/specifications.rb +3 -2
  72. data/lib/reqif/specified_values.rb +2 -2
  73. data/lib/reqif/string_type.rb +7 -0
  74. data/lib/reqif/target.rb +3 -3
  75. data/lib/reqif/target_specification.rb +3 -3
  76. data/lib/reqif/the_header.rb +3 -2
  77. data/lib/reqif/tool_extensions.rb +2 -2
  78. data/lib/reqif/type.rb +28 -20
  79. data/lib/reqif/values.rb +8 -5
  80. data/lib/reqif/version.rb +1 -1
  81. data/lib/reqif/xhtml/div.rb +18 -0
  82. data/lib/reqif/xhtml/namespace.rb +10 -0
  83. data/lib/reqif/xhtml/p.rb +18 -0
  84. data/lib/reqif/xhtml/span.rb +18 -0
  85. data/lib/reqif/xhtml.rb +12 -0
  86. data/lib/reqif/xhtml_content.rb +181 -2
  87. data/lib/reqif.rb +70 -14
  88. data/references/driver.xsd +270 -270
  89. data/references/reqif.xsd +892 -892
  90. data/reqif.gemspec +4 -3
  91. data/spec/fixtures/antcc_MAG8000-LTE-FeatureSpecReqBL4.reqif +4299 -0
  92. data/spec/fixtures/ea_example.reqif.xml +236 -0
  93. data/spec/fixtures/eclipse_capella_Sample.xml +177 -0
  94. data/spec/fixtures/eclipse_capella_Sample1.xml +239 -0
  95. data/spec/fixtures/eclipse_capella_Sample2.xml +239 -0
  96. data/spec/fixtures/eclipse_capella_Sample3.xml +304 -0
  97. data/spec/fixtures/eclipse_capella_model1.xml +4080 -0
  98. data/spec/fixtures/eclipse_rmf_sample.reqif +96 -0
  99. data/spec/fixtures/eclipse_rmf_specRelationTest.reqif +110 -0
  100. data/spec/fixtures/polarion_export.xml +70 -0
  101. data/spec/fixtures/strictdoc_01_minimal_reqif_sample.reqif +4 -0
  102. data/spec/fixtures/strictdoc_02_read_reqif_input.reqif +3996 -0
  103. data/spec/fixtures/strictdoc_04_convert_reqif_to_json_sample1_polarion.reqif +197 -0
  104. data/spec/fixtures/strictdoc_04_convert_reqif_to_json_sample2_sdoc.reqif +451 -0
  105. data/spec/fixtures/strictdoc_04_convert_reqif_to_json_sample3_eclipse_rmf.reqif +334 -0
  106. data/spec/fixtures/strictdoc_04_convert_reqif_to_json_sample_polarion_reqifz.reqifz +0 -0
  107. data/spec/reqif/data_types_spec.rb +29 -0
  108. data/spec/reqif/polarion_export_spec.rb +22 -0
  109. data/spec/reqif/req_if_header_spec.rb +31 -0
  110. data/spec/reqif/req_if_spec.rb +43 -0
  111. data/spec/reqif/spec_objects_spec.rb +35 -0
  112. data/spec/reqif/spec_relations_spec.rb +33 -0
  113. data/spec/reqif/spec_types_spec.rb +40 -0
  114. data/spec/reqif/specifications_spec.rb +35 -0
  115. data/spec/reqif/tool_extension_spec.rb +27 -0
  116. data/spec/reqif_spec.rb +56 -0
  117. data/spec/spec_helper.rb +70 -0
  118. metadata +58 -11
@@ -0,0 +1,334 @@
1
+ <!-- https://github.com/strictdoc-project/reqif/blob/main/tests/integration/examples/04_convert_reqif_to_json/sample3_eclipse_rmf.reqif -->
2
+ <?xml version="1.0" encoding="UTF-8"?>
3
+ <REQ-IF xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd" xmlns:xhtml="http://www.w3.org/1999/xhtml">
4
+ <THE-HEADER>
5
+ <REQ-IF-HEADER IDENTIFIER="_RB77YVyxEeumRtWSJE-orw">
6
+ <CREATION-TIME>2021-01-22T12:56:38.677Z</CREATION-TIME>
7
+ <REQ-IF-TOOL-ID>RMF - Requirements Modeling Framework (http://www.eclipse.org/rmf)</REQ-IF-TOOL-ID>
8
+ <REQ-IF-VERSION>1.0</REQ-IF-VERSION>
9
+ <SOURCE-TOOL-ID>RMF - Requirements Modeling Framework (http://www.eclipse.org/rmf)</SOURCE-TOOL-ID>
10
+ <TITLE>TC 1800 'HIS Exchange Process OEM -> SUP (initial)'</TITLE>
11
+ </REQ-IF-HEADER>
12
+ </THE-HEADER>
13
+ <CORE-CONTENT>
14
+ <REQ-IF-CONTENT>
15
+ <DATATYPES>
16
+ <DATATYPE-DEFINITION-STRING IDENTIFIER="_RB77Y1yxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00" LONG-NAME="TC18xx DatatypeDefinitionString" MAX-LENGTH="255"/>
17
+ <DATATYPE-DEFINITION-XHTML IDENTIFIER="_RB77ZFyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00" LONG-NAME="TC18xx DatatypeDefinitionXhtml"/>
18
+ <DATATYPE-DEFINITION-ENUMERATION IDENTIFIER="_RB77ZVyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00" LONG-NAME="TC18xx DatatypeDefinitionEnumeration">
19
+ <SPECIFIED-VALUES>
20
+ <ENUM-VALUE IDENTIFIER="_RB77ZlyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00" LONG-NAME="one">
21
+ <PROPERTIES>
22
+ <EMBEDDED-VALUE KEY="1" OTHER-CONTENT="one"/>
23
+ </PROPERTIES>
24
+ </ENUM-VALUE>
25
+ <ENUM-VALUE IDENTIFIER="_RB77aFyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00" LONG-NAME="two">
26
+ <PROPERTIES>
27
+ <EMBEDDED-VALUE KEY="2" OTHER-CONTENT="two"/>
28
+ </PROPERTIES>
29
+ </ENUM-VALUE>
30
+ </SPECIFIED-VALUES>
31
+ </DATATYPE-DEFINITION-ENUMERATION>
32
+ </DATATYPES>
33
+ <SPEC-TYPES>
34
+ <SPEC-OBJECT-TYPE IDENTIFIER="_RB77alyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00" LONG-NAME="TC18xx SpecObjectType">
35
+ <SPEC-ATTRIBUTES>
36
+ <ATTRIBUTE-DEFINITION-XHTML IDENTIFIER="_RB77a1yxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00" LONG-NAME="ReqIF.Name">
37
+ <TYPE>
38
+ <DATATYPE-DEFINITION-XHTML-REF>_RB77ZFyxEeumRtWSJE-orw</DATATYPE-DEFINITION-XHTML-REF>
39
+ </TYPE>
40
+ </ATTRIBUTE-DEFINITION-XHTML>
41
+ <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_RB77bFyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00" LONG-NAME="A1">
42
+ <TYPE>
43
+ <DATATYPE-DEFINITION-STRING-REF>_RB77Y1yxEeumRtWSJE-orw</DATATYPE-DEFINITION-STRING-REF>
44
+ </TYPE>
45
+ </ATTRIBUTE-DEFINITION-STRING>
46
+ <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_RB77bVyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00" LONG-NAME="A2">
47
+ <TYPE>
48
+ <DATATYPE-DEFINITION-STRING-REF>_RB77Y1yxEeumRtWSJE-orw</DATATYPE-DEFINITION-STRING-REF>
49
+ </TYPE>
50
+ </ATTRIBUTE-DEFINITION-STRING>
51
+ <ATTRIBUTE-DEFINITION-ENUMERATION IDENTIFIER="_RB77blyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00" LONG-NAME="E1" MULTI-VALUED="false">
52
+ <TYPE>
53
+ <DATATYPE-DEFINITION-ENUMERATION-REF>_RB77ZVyxEeumRtWSJE-orw</DATATYPE-DEFINITION-ENUMERATION-REF>
54
+ </TYPE>
55
+ </ATTRIBUTE-DEFINITION-ENUMERATION>
56
+ </SPEC-ATTRIBUTES>
57
+ </SPEC-OBJECT-TYPE>
58
+ <SPECIFICATION-TYPE IDENTIFIER="_RB77b1yxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00" LONG-NAME="TC18xx SpecificationType">
59
+ <SPEC-ATTRIBUTES>
60
+ <ATTRIBUTE-DEFINITION-XHTML IDENTIFIER="_RB77cFyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00" LONG-NAME="ReqIF.Name">
61
+ <TYPE>
62
+ <DATATYPE-DEFINITION-XHTML-REF>_RB77ZFyxEeumRtWSJE-orw</DATATYPE-DEFINITION-XHTML-REF>
63
+ </TYPE>
64
+ </ATTRIBUTE-DEFINITION-XHTML>
65
+ </SPEC-ATTRIBUTES>
66
+ </SPECIFICATION-TYPE>
67
+ </SPEC-TYPES>
68
+ <SPEC-OBJECTS>
69
+ <SPEC-OBJECT IDENTIFIER="_RB77cVyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00">
70
+ <VALUES>
71
+ <ATTRIBUTE-VALUE-XHTML>
72
+ <DEFINITION>
73
+ <ATTRIBUTE-DEFINITION-XHTML-REF>_RB77a1yxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-XHTML-REF>
74
+ </DEFINITION>
75
+ <THE-VALUE>
76
+ <xhtml:p>Obj-01</xhtml:p>
77
+ </THE-VALUE>
78
+ </ATTRIBUTE-VALUE-XHTML>
79
+ <ATTRIBUTE-VALUE-STRING THE-VALUE="no change">
80
+ <DEFINITION>
81
+ <ATTRIBUTE-DEFINITION-STRING-REF>_RB77bFyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-STRING-REF>
82
+ </DEFINITION>
83
+ </ATTRIBUTE-VALUE-STRING>
84
+ <ATTRIBUTE-VALUE-STRING THE-VALUE="no change">
85
+ <DEFINITION>
86
+ <ATTRIBUTE-DEFINITION-STRING-REF>_RB77bVyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-STRING-REF>
87
+ </DEFINITION>
88
+ </ATTRIBUTE-VALUE-STRING>
89
+ <ATTRIBUTE-VALUE-ENUMERATION>
90
+ <VALUES>
91
+ <ENUM-VALUE-REF>_RB77ZlyxEeumRtWSJE-orw</ENUM-VALUE-REF>
92
+ </VALUES>
93
+ <DEFINITION>
94
+ <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_RB77blyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
95
+ </DEFINITION>
96
+ </ATTRIBUTE-VALUE-ENUMERATION>
97
+ </VALUES>
98
+ <TYPE>
99
+ <SPEC-OBJECT-TYPE-REF>_RB77alyxEeumRtWSJE-orw</SPEC-OBJECT-TYPE-REF>
100
+ </TYPE>
101
+ </SPEC-OBJECT>
102
+ <SPEC-OBJECT IDENTIFIER="_RB77eFyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00">
103
+ <VALUES>
104
+ <ATTRIBUTE-VALUE-XHTML>
105
+ <DEFINITION>
106
+ <ATTRIBUTE-DEFINITION-XHTML-REF>_RB77a1yxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-XHTML-REF>
107
+ </DEFINITION>
108
+ <THE-VALUE>
109
+ <xhtml:p>Obj-03</xhtml:p>
110
+ </THE-VALUE>
111
+ </ATTRIBUTE-VALUE-XHTML>
112
+ <ATTRIBUTE-VALUE-STRING THE-VALUE="O3.A1 initial">
113
+ <DEFINITION>
114
+ <ATTRIBUTE-DEFINITION-STRING-REF>_RB77bFyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-STRING-REF>
115
+ </DEFINITION>
116
+ </ATTRIBUTE-VALUE-STRING>
117
+ <ATTRIBUTE-VALUE-STRING THE-VALUE="O3.A2 initial">
118
+ <DEFINITION>
119
+ <ATTRIBUTE-DEFINITION-STRING-REF>_RB77bVyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-STRING-REF>
120
+ </DEFINITION>
121
+ </ATTRIBUTE-VALUE-STRING>
122
+ <ATTRIBUTE-VALUE-ENUMERATION>
123
+ <VALUES>
124
+ <ENUM-VALUE-REF>_RB77ZlyxEeumRtWSJE-orw</ENUM-VALUE-REF>
125
+ </VALUES>
126
+ <DEFINITION>
127
+ <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_RB77blyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
128
+ </DEFINITION>
129
+ </ATTRIBUTE-VALUE-ENUMERATION>
130
+ </VALUES>
131
+ <TYPE>
132
+ <SPEC-OBJECT-TYPE-REF>_RB77alyxEeumRtWSJE-orw</SPEC-OBJECT-TYPE-REF>
133
+ </TYPE>
134
+ </SPEC-OBJECT>
135
+ <SPEC-OBJECT IDENTIFIER="_RB77f1yxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00">
136
+ <VALUES>
137
+ <ATTRIBUTE-VALUE-XHTML>
138
+ <DEFINITION>
139
+ <ATTRIBUTE-DEFINITION-XHTML-REF>_RB77a1yxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-XHTML-REF>
140
+ </DEFINITION>
141
+ <THE-VALUE>
142
+ <xhtml:p>Obj-06</xhtml:p>
143
+ </THE-VALUE>
144
+ </ATTRIBUTE-VALUE-XHTML>
145
+ <ATTRIBUTE-VALUE-STRING THE-VALUE="no change">
146
+ <DEFINITION>
147
+ <ATTRIBUTE-DEFINITION-STRING-REF>_RB77bFyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-STRING-REF>
148
+ </DEFINITION>
149
+ </ATTRIBUTE-VALUE-STRING>
150
+ <ATTRIBUTE-VALUE-STRING THE-VALUE="no change">
151
+ <DEFINITION>
152
+ <ATTRIBUTE-DEFINITION-STRING-REF>_RB77bVyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-STRING-REF>
153
+ </DEFINITION>
154
+ </ATTRIBUTE-VALUE-STRING>
155
+ <ATTRIBUTE-VALUE-ENUMERATION>
156
+ <VALUES>
157
+ <ENUM-VALUE-REF>_RB77ZlyxEeumRtWSJE-orw</ENUM-VALUE-REF>
158
+ </VALUES>
159
+ <DEFINITION>
160
+ <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_RB77blyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
161
+ </DEFINITION>
162
+ </ATTRIBUTE-VALUE-ENUMERATION>
163
+ </VALUES>
164
+ <TYPE>
165
+ <SPEC-OBJECT-TYPE-REF>_RB77alyxEeumRtWSJE-orw</SPEC-OBJECT-TYPE-REF>
166
+ </TYPE>
167
+ </SPEC-OBJECT>
168
+ <SPEC-OBJECT IDENTIFIER="_RB77hlyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00">
169
+ <VALUES>
170
+ <ATTRIBUTE-VALUE-XHTML>
171
+ <DEFINITION>
172
+ <ATTRIBUTE-DEFINITION-XHTML-REF>_RB77a1yxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-XHTML-REF>
173
+ </DEFINITION>
174
+ <THE-VALUE>
175
+ <xhtml:p>Obj-07</xhtml:p>
176
+ </THE-VALUE>
177
+ </ATTRIBUTE-VALUE-XHTML>
178
+ <ATTRIBUTE-VALUE-STRING THE-VALUE="no change">
179
+ <DEFINITION>
180
+ <ATTRIBUTE-DEFINITION-STRING-REF>_RB77bFyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-STRING-REF>
181
+ </DEFINITION>
182
+ </ATTRIBUTE-VALUE-STRING>
183
+ <ATTRIBUTE-VALUE-STRING THE-VALUE="no change">
184
+ <DEFINITION>
185
+ <ATTRIBUTE-DEFINITION-STRING-REF>_RB77bVyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-STRING-REF>
186
+ </DEFINITION>
187
+ </ATTRIBUTE-VALUE-STRING>
188
+ <ATTRIBUTE-VALUE-ENUMERATION>
189
+ <VALUES>
190
+ <ENUM-VALUE-REF>_RB77ZlyxEeumRtWSJE-orw</ENUM-VALUE-REF>
191
+ </VALUES>
192
+ <DEFINITION>
193
+ <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_RB77blyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
194
+ </DEFINITION>
195
+ </ATTRIBUTE-VALUE-ENUMERATION>
196
+ </VALUES>
197
+ <TYPE>
198
+ <SPEC-OBJECT-TYPE-REF>_RB77alyxEeumRtWSJE-orw</SPEC-OBJECT-TYPE-REF>
199
+ </TYPE>
200
+ </SPEC-OBJECT>
201
+ <SPEC-OBJECT IDENTIFIER="_RB77jVyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00">
202
+ <VALUES>
203
+ <ATTRIBUTE-VALUE-XHTML>
204
+ <DEFINITION>
205
+ <ATTRIBUTE-DEFINITION-XHTML-REF>_RB77a1yxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-XHTML-REF>
206
+ </DEFINITION>
207
+ <THE-VALUE>
208
+ <xhtml:p>Obj-08</xhtml:p>
209
+ </THE-VALUE>
210
+ </ATTRIBUTE-VALUE-XHTML>
211
+ <ATTRIBUTE-VALUE-STRING THE-VALUE="no change">
212
+ <DEFINITION>
213
+ <ATTRIBUTE-DEFINITION-STRING-REF>_RB77bFyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-STRING-REF>
214
+ </DEFINITION>
215
+ </ATTRIBUTE-VALUE-STRING>
216
+ <ATTRIBUTE-VALUE-STRING THE-VALUE="no change">
217
+ <DEFINITION>
218
+ <ATTRIBUTE-DEFINITION-STRING-REF>_RB77bVyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-STRING-REF>
219
+ </DEFINITION>
220
+ </ATTRIBUTE-VALUE-STRING>
221
+ <ATTRIBUTE-VALUE-ENUMERATION>
222
+ <VALUES>
223
+ <ENUM-VALUE-REF>_RB77ZlyxEeumRtWSJE-orw</ENUM-VALUE-REF>
224
+ </VALUES>
225
+ <DEFINITION>
226
+ <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_RB77blyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
227
+ </DEFINITION>
228
+ </ATTRIBUTE-VALUE-ENUMERATION>
229
+ </VALUES>
230
+ <TYPE>
231
+ <SPEC-OBJECT-TYPE-REF>_RB77alyxEeumRtWSJE-orw</SPEC-OBJECT-TYPE-REF>
232
+ </TYPE>
233
+ </SPEC-OBJECT>
234
+ <SPEC-OBJECT IDENTIFIER="_RB77lFyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00">
235
+ <VALUES>
236
+ <ATTRIBUTE-VALUE-XHTML>
237
+ <DEFINITION>
238
+ <ATTRIBUTE-DEFINITION-XHTML-REF>_RB77a1yxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-XHTML-REF>
239
+ </DEFINITION>
240
+ <THE-VALUE>
241
+ <xhtml:p>Obj-09</xhtml:p>
242
+ </THE-VALUE>
243
+ </ATTRIBUTE-VALUE-XHTML>
244
+ <ATTRIBUTE-VALUE-STRING THE-VALUE="no change">
245
+ <DEFINITION>
246
+ <ATTRIBUTE-DEFINITION-STRING-REF>_RB77bFyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-STRING-REF>
247
+ </DEFINITION>
248
+ </ATTRIBUTE-VALUE-STRING>
249
+ <ATTRIBUTE-VALUE-STRING THE-VALUE="no change">
250
+ <DEFINITION>
251
+ <ATTRIBUTE-DEFINITION-STRING-REF>_RB77bVyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-STRING-REF>
252
+ </DEFINITION>
253
+ </ATTRIBUTE-VALUE-STRING>
254
+ <ATTRIBUTE-VALUE-ENUMERATION>
255
+ <VALUES>
256
+ <ENUM-VALUE-REF>_RB77ZlyxEeumRtWSJE-orw</ENUM-VALUE-REF>
257
+ </VALUES>
258
+ <DEFINITION>
259
+ <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_RB77blyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
260
+ </DEFINITION>
261
+ </ATTRIBUTE-VALUE-ENUMERATION>
262
+ </VALUES>
263
+ <TYPE>
264
+ <SPEC-OBJECT-TYPE-REF>_RB77alyxEeumRtWSJE-orw</SPEC-OBJECT-TYPE-REF>
265
+ </TYPE>
266
+ </SPEC-OBJECT>
267
+ </SPEC-OBJECTS>
268
+ <SPECIFICATIONS>
269
+ <SPECIFICATION IDENTIFIER="_RB77m1yxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00">
270
+ <VALUES>
271
+ <ATTRIBUTE-VALUE-XHTML>
272
+ <DEFINITION>
273
+ <ATTRIBUTE-DEFINITION-XHTML-REF>_RB77cFyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-XHTML-REF>
274
+ </DEFINITION>
275
+ <THE-VALUE>
276
+ <xhtml:p>Spec1</xhtml:p>
277
+ </THE-VALUE>
278
+ </ATTRIBUTE-VALUE-XHTML>
279
+ </VALUES>
280
+ <TYPE>
281
+ <SPECIFICATION-TYPE-REF>_RB77b1yxEeumRtWSJE-orw</SPECIFICATION-TYPE-REF>
282
+ </TYPE>
283
+ <CHILDREN>
284
+ <SPEC-HIERARCHY IDENTIFIER="_RB77n1yxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00">
285
+ <OBJECT>
286
+ <SPEC-OBJECT-REF>_RB77cVyxEeumRtWSJE-orw</SPEC-OBJECT-REF>
287
+ </OBJECT>
288
+ </SPEC-HIERARCHY>
289
+ <SPEC-HIERARCHY IDENTIFIER="_RB77oFyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00">
290
+ <OBJECT>
291
+ <SPEC-OBJECT-REF>_RB77eFyxEeumRtWSJE-orw</SPEC-OBJECT-REF>
292
+ </OBJECT>
293
+ </SPEC-HIERARCHY>
294
+ <SPEC-HIERARCHY IDENTIFIER="_RB77oVyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00">
295
+ <OBJECT>
296
+ <SPEC-OBJECT-REF>_RB77f1yxEeumRtWSJE-orw</SPEC-OBJECT-REF>
297
+ </OBJECT>
298
+ </SPEC-HIERARCHY>
299
+ <SPEC-HIERARCHY IDENTIFIER="_RB77olyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00">
300
+ <OBJECT>
301
+ <SPEC-OBJECT-REF>_RB77hlyxEeumRtWSJE-orw</SPEC-OBJECT-REF>
302
+ </OBJECT>
303
+ </SPEC-HIERARCHY>
304
+ <SPEC-HIERARCHY IDENTIFIER="_RB77o1yxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00">
305
+ <OBJECT>
306
+ <SPEC-OBJECT-REF>_RB77jVyxEeumRtWSJE-orw</SPEC-OBJECT-REF>
307
+ </OBJECT>
308
+ </SPEC-HIERARCHY>
309
+ <SPEC-HIERARCHY IDENTIFIER="_RB77pFyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00">
310
+ <OBJECT>
311
+ <SPEC-OBJECT-REF>_RB77lFyxEeumRtWSJE-orw</SPEC-OBJECT-REF>
312
+ </OBJECT>
313
+ </SPEC-HIERARCHY>
314
+ </CHILDREN>
315
+ </SPECIFICATION>
316
+ <SPECIFICATION IDENTIFIER="_RB77pVyxEeumRtWSJE-orw" LAST-CHANGE="2012-04-07T01:51:37.112+02:00">
317
+ <VALUES>
318
+ <ATTRIBUTE-VALUE-XHTML>
319
+ <DEFINITION>
320
+ <ATTRIBUTE-DEFINITION-XHTML-REF>_RB77cFyxEeumRtWSJE-orw</ATTRIBUTE-DEFINITION-XHTML-REF>
321
+ </DEFINITION>
322
+ <THE-VALUE>
323
+ <xhtml:p>Spec2</xhtml:p>
324
+ </THE-VALUE>
325
+ </ATTRIBUTE-VALUE-XHTML>
326
+ </VALUES>
327
+ <TYPE>
328
+ <SPECIFICATION-TYPE-REF>_RB77b1yxEeumRtWSJE-orw</SPECIFICATION-TYPE-REF>
329
+ </TYPE>
330
+ </SPECIFICATION>
331
+ </SPECIFICATIONS>
332
+ </REQ-IF-CONTENT>
333
+ </CORE-CONTENT>
334
+ </REQ-IF>
@@ -0,0 +1,29 @@
1
+ RSpec.describe Reqif::Datatypes do
2
+ let(:datatypes_xml) do
3
+ <<~XML
4
+ <DATATYPES xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd">
5
+ <DATATYPE-DEFINITION-STRING IDENTIFIER="dt1" LAST-CHANGE="2023-10-26T12:00:00Z" LONG-NAME="String Type" MAX-LENGTH="255"/>
6
+ <DATATYPE-DEFINITION-INTEGER IDENTIFIER="dt2" LAST-CHANGE="2023-10-26T12:00:00Z" LONG-NAME="Integer Type" MAX="100" MIN="0"/>
7
+ </DATATYPES>
8
+ XML
9
+ end
10
+
11
+ let(:datatypes) { described_class.from_xml(datatypes_xml) }
12
+
13
+ describe "data type definitions" do
14
+ it "parses string data type" do
15
+ string_type = datatypes.datatype_definition_string.first
16
+ expect(string_type.identifier).to eq("dt1")
17
+ expect(string_type.long_name).to eq("String Type")
18
+ expect(string_type.max_length).to eq(255)
19
+ end
20
+
21
+ it "parses integer data type" do
22
+ integer_type = datatypes.datatype_definition_integer.first
23
+ expect(integer_type.identifier).to eq("dt2")
24
+ expect(integer_type.long_name).to eq("Integer Type")
25
+ expect(integer_type.max).to eq(100)
26
+ expect(integer_type.min).to eq(0)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe "Polarion Export" do
4
+ let(:xml_file) { File.read("spec/fixtures/polarion_export.xml") }
5
+ let(:reqif) { Reqif::ReqIf.from_xml(xml_file) }
6
+
7
+ it "parses Polarion export correctly" do
8
+ expect(reqif.the_header.req_if_header.req_if_tool_id).to eq("Polarion")
9
+
10
+ enum_type = reqif.core_content.req_if_content.datatypes.datatype_definition_enumeration.find do |d|
11
+ d.long_name == "Status"
12
+ end
13
+ expect(enum_type).not_to be_nil
14
+ expect(enum_type.specified_values.enum_value.map(&:long_name)).to contain_exactly(
15
+ "Draft", "Approved"
16
+ )
17
+
18
+ spec_object = reqif.core_content.req_if_content.spec_objects.spec_object.first
19
+ xhtml_val = spec_object.values.attribute_value_xhtml.first
20
+ expect(xhtml_val.the_value).to be_a(Reqif::XhtmlContent)
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Reqif::ReqIfHeader do
4
+ let(:header_xml) do
5
+ <<~XML
6
+ <REQ-IF-HEADER xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd" IDENTIFIER="_1234567890">
7
+ <COMMENT>Example ReqIF file</COMMENT>
8
+ <CREATION-TIME>2023-10-26T12:00:00Z</CREATION-TIME>
9
+ <REQ-IF-TOOL-ID>reqif-tool</REQ-IF-TOOL-ID>
10
+ <REQ-IF-VERSION>1.0</REQ-IF-VERSION>
11
+ <SOURCE-TOOL-ID>source-tool</SOURCE-TOOL-ID>
12
+ <TITLE>Requirements Document</TITLE>
13
+ </REQ-IF-HEADER>
14
+ XML
15
+ end
16
+
17
+ let(:header) { described_class.from_xml(header_xml) }
18
+
19
+ describe "attributes" do
20
+ it "parses all header attributes" do
21
+ expect(header.comment).to eq("Example ReqIF file")
22
+ expect(header.creation_time).to be_a(Reqif::HighPrecisionDateTime)
23
+ expect(header.creation_time.iso8601).to eq("2023-10-26T12:00:00+00:00")
24
+ expect(header.identifier).to eq("_1234567890")
25
+ expect(header.req_if_tool_id).to eq("reqif-tool")
26
+ expect(header.req_if_version).to eq("1.0")
27
+ expect(header.source_tool_id).to eq("source-tool")
28
+ expect(header.title).to eq("Requirements Document")
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe Reqif::ReqIf do
6
+ let(:xml_string) { File.read("spec/fixtures/eclipse_rmf_sample.reqif") }
7
+ let(:parsed) { described_class.from_xml(xml_string) }
8
+
9
+ describe ".from_xml" do
10
+ it "parses ReqIF XML correctly" do
11
+ expect(parsed).to be_a(described_class)
12
+ expect(parsed.the_header.req_if_header).to be_a(Reqif::ReqIfHeader)
13
+ expect(parsed.core_content.req_if_content).to be_a(Reqif::ReqIfContent)
14
+ end
15
+
16
+ it "maintains XML namespaces" do
17
+ generated = parsed.to_xml
18
+ # Eclipse RMF fixtures use 20101201 namespace which should be preserved
19
+ expect(generated).to include('xmlns="http://www.omg.org/spec/ReqIF/20101201"')
20
+ end
21
+ end
22
+
23
+ describe "#to_xml" do
24
+ it "generates valid ReqIF XML" do
25
+ generated = parsed.to_xml(
26
+ pretty: true,
27
+ declaration: true,
28
+ encoding: "utf-8",
29
+ )
30
+
31
+ # cleaned_xml_string = xml_string
32
+ # .gsub(/^<\?xml-model.*\n/, '')
33
+ # .gsub(/^<\?xml-stylesheet.*\n/, '')
34
+
35
+ # puts "original---------"
36
+ # puts cleaned_xml_string
37
+ # puts "------"
38
+ # puts generated
39
+
40
+ expect(generated).to be_xml_equivalent_to(xml_string)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Reqif::SpecObject do
4
+ let(:spec_object_xml) do
5
+ <<~XML
6
+ <SPEC-OBJECT xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd" IDENTIFIER="so1" LAST-CHANGE="2023-10-26T12:00:00Z" LONG-NAME="Login Requirement">
7
+ <TYPE>
8
+ <SPEC-OBJECT-TYPE-REF>st1</SPEC-OBJECT-TYPE-REF>
9
+ </TYPE>
10
+ <VALUES>
11
+ <ATTRIBUTE-VALUE-STRING THE-VALUE="System shall provide login functionality">
12
+ <DEFINITION>
13
+ <ATTRIBUTE-DEFINITION-STRING-REF>ad1</ATTRIBUTE-DEFINITION-STRING-REF>
14
+ </DEFINITION>
15
+ </ATTRIBUTE-VALUE-STRING>
16
+ </VALUES>
17
+ </SPEC-OBJECT>
18
+ XML
19
+ end
20
+
21
+ let(:spec_object) { described_class.from_xml(spec_object_xml) }
22
+
23
+ describe "spec object attributes" do
24
+ it "parses basic attributes" do
25
+ expect(spec_object.identifier).to eq("so1")
26
+ expect(spec_object.long_name).to eq("Login Requirement")
27
+ expect(spec_object.type.spec_object_type_ref).to eq("st1")
28
+ end
29
+
30
+ it "parses values" do
31
+ value = spec_object.values.attribute_value_string.first
32
+ expect(value.the_value).to eq("System shall provide login functionality")
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Reqif::SpecRelations do
4
+ let(:spec_relations_xml) do
5
+ <<~XML
6
+ <SPEC-RELATIONS xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd">
7
+ <SPEC-RELATION IDENTIFIER="rel1" LAST-CHANGE="2023-10-26T12:00:00Z">
8
+ <SOURCE>
9
+ <SPEC-OBJECT-REF>so1</SPEC-OBJECT-REF>
10
+ </SOURCE>
11
+ <TARGET>
12
+ <SPEC-OBJECT-REF>so2</SPEC-OBJECT-REF>
13
+ </TARGET>
14
+ <TYPE>
15
+ <SPEC-RELATION-TYPE-REF>rt1</SPEC-RELATION-TYPE-REF>
16
+ </TYPE>
17
+ </SPEC-RELATION>
18
+ </SPEC-RELATIONS>
19
+ XML
20
+ end
21
+
22
+ let(:spec_relations) { described_class.from_xml(spec_relations_xml) }
23
+
24
+ describe "spec relations" do
25
+ it "parses relation attributes" do
26
+ relation = spec_relations.spec_relation.first
27
+ expect(relation.identifier).to eq("rel1")
28
+ expect(relation.source.spec_object_ref).to eq("so1")
29
+ expect(relation.target.spec_object_ref).to eq("so2")
30
+ expect(relation.type.spec_relation_type_ref).to eq("rt1")
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Reqif::SpecTypes do
4
+ let(:spec_types_xml) do
5
+ <<~XML
6
+ <SPEC-TYPES xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd">
7
+ <SPEC-OBJECT-TYPE IDENTIFIER="st1" LAST-CHANGE="2023-10-26T12:00:00Z" LONG-NAME="Requirement Type">
8
+ <SPEC-ATTRIBUTES>
9
+ <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="ad1" LAST-CHANGE="2023-10-26T12:00:00Z" LONG-NAME="Description">
10
+ <TYPE>
11
+ <DATATYPE-DEFINITION-STRING-REF>dt1</DATATYPE-DEFINITION-STRING-REF>
12
+ </TYPE>
13
+ <DEFAULT-VALUE>
14
+ <ATTRIBUTE-VALUE-STRING THE-VALUE="No description provided"/>
15
+ </DEFAULT-VALUE>
16
+ </ATTRIBUTE-DEFINITION-STRING>
17
+ </SPEC-ATTRIBUTES>
18
+ </SPEC-OBJECT-TYPE>
19
+ </SPEC-TYPES>
20
+ XML
21
+ end
22
+
23
+ let(:spec_types) { described_class.from_xml(spec_types_xml) }
24
+
25
+ describe "specification types" do
26
+ it "parses spec object type" do
27
+ spec_object_type = spec_types.spec_object_type.first
28
+ expect(spec_object_type.identifier).to eq("st1")
29
+ expect(spec_object_type.long_name).to eq("Requirement Type")
30
+ end
31
+
32
+ it "parses attribute definitions" do
33
+ attr_def = spec_types.spec_object_type.first.spec_attributes.attribute_definition_string.first
34
+ expect(attr_def.identifier).to eq("ad1")
35
+ expect(attr_def.long_name).to eq("Description")
36
+ expect(attr_def.type.datatype_definition_string_ref).to eq("dt1")
37
+ expect(attr_def.default_value.attribute_value_string.the_value).to eq("No description provided")
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Reqif::Specifications do
4
+ let(:specifications_xml) do
5
+ <<~XML
6
+ <SPECIFICATIONS xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd">
7
+ <SPECIFICATION IDENTIFIER="spec1" LAST-CHANGE="2023-10-26T12:00:00Z" LONG-NAME="System Requirements">
8
+ <CHILDREN>
9
+ <SPEC-HIERARCHY IDENTIFIER="sh1" LAST-CHANGE="2023-10-26T12:00:00Z">
10
+ <OBJECT>
11
+ <SPEC-OBJECT-REF>so1</SPEC-OBJECT-REF>
12
+ </OBJECT>
13
+ </SPEC-HIERARCHY>
14
+ </CHILDREN>
15
+ </SPECIFICATION>
16
+ </SPECIFICATIONS>
17
+ XML
18
+ end
19
+
20
+ let(:specifications) { described_class.from_xml(specifications_xml) }
21
+
22
+ describe "specifications" do
23
+ it "parses specification" do
24
+ spec = specifications.specification.first
25
+ expect(spec.identifier).to eq("spec1")
26
+ expect(spec.long_name).to eq("System Requirements")
27
+ end
28
+
29
+ it "parses spec hierarchy" do
30
+ hierarchy = specifications.specification.first.children.spec_hierarchy.first
31
+ expect(hierarchy.identifier).to eq("sh1")
32
+ expect(hierarchy.object.spec_object_ref).to eq("so1")
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Reqif::ToolExtensions do
4
+ let(:tool_extensions_xml) do
5
+ <<~XML
6
+ <TOOL-EXTENSIONS xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd">
7
+ <REQ-IF-TOOL-EXTENSION xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd">
8
+ <DOORS-RIF-DEFINITION xmlns="http://www.ibm.com/rdm/doors/REQIF/xmlns/1.0">
9
+ <IDENTIFIER>_test-id</IDENTIFIER>
10
+ <MODULE-DEFINITION>
11
+ <DDC-MODE>DDC_FULL_MODULE</DDC-MODE>
12
+ </MODULE-DEFINITION>
13
+ </DOORS-RIF-DEFINITION>
14
+ </REQ-IF-TOOL-EXTENSION>
15
+ </TOOL-EXTENSIONS>
16
+ XML
17
+ end
18
+
19
+ let(:tool_extensions) { described_class.from_xml(tool_extensions_xml) }
20
+
21
+ describe "tool extensions" do
22
+ it "parses tool extension data" do
23
+ ext = tool_extensions.req_if_tool_extension.first
24
+ expect(ext.doors_rif_definition.identifier.content).to eq("_test-id")
25
+ end
26
+ end
27
+ end