xsd-reader 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 710c9e3e4de93c6dacc984039a5edd9ee6b3ecfd
4
- data.tar.gz: a5ec41749313855ecc1ae5ee7f5a1e2857d2b0a0
3
+ metadata.gz: 400a3673c38ae983e49e7d63dfd1dc80daaa027e
4
+ data.tar.gz: 0e2be864321537a953e21a63bd33f520f5b0d679
5
5
  SHA512:
6
- metadata.gz: 815a9a1fbd373319aaed9052f04776974f55b1ce2420848818d1a4cd8a77b79a20e03b71bbc6f876da57ee20ce1bf1145d29ebf7a283cc9e165bb5b0fe57c167
7
- data.tar.gz: 0e5fc4939b74f755cb3e165133f90435d570cfbac5cf76e3c6bd73ca95be9cf9205d36d01f077076f1f03bf6bbc867009f945dfd62e25ca8e24228ba5142cd64
6
+ metadata.gz: cd2dcc16a9996af3ee4898e6f4d039245d52946bf2429fcf2952400c305acf94947afd324ecd81a70458ea357bdac7305310a459dd442cfc79bda12558771a89
7
+ data.tar.gz: 0998edb3ce6a52e8202c277db093e71b997d2cc7c921c6dc95428bec33caaed1be925d5b8e8dbf9c45a235a13c08bfde70902184e74fc06d2a9c869705c7fa7f
@@ -3,10 +3,6 @@ module XsdReader
3
3
  class ComplexType
4
4
  include Shared
5
5
 
6
- def name
7
- node.attributes['name'] ? node.attributes['name'].value : nil
8
- end
9
-
10
6
  def attributes
11
7
  super + (simple_content ? simple_content.attributes : [])
12
8
  end
@@ -49,11 +49,29 @@ module XsdReader
49
49
  # attribute properties
50
50
  #
51
51
  def name
52
- node.attributes['name'].value
52
+ name_local || name_referenced
53
53
  end
54
54
 
55
+ def name_local
56
+ node.attributes['name'] ? node.attributes['name'].value : nil
57
+ end
58
+
59
+ def name_referenced
60
+ referenced_element ? referenced_element.name : nil
61
+ end
62
+
63
+ def ref
64
+ node.attributes['ref'] ? node.attributes['ref'].value : nil
65
+ end
66
+
67
+ def referenced_element
68
+ ref && schema ? schema.elements.find{|el| el.name == ref} : nil
69
+ end
70
+
71
+
55
72
  def type
56
- node.attributes['type'] ? node.attributes['type'].value : nil
73
+ type = node.attributes['type'] ? node.attributes['type'].value : nil
74
+ type || (referenced_element ? referenced_element.type : nil)
57
75
  end
58
76
 
59
77
  def type_name
@@ -64,6 +82,7 @@ module XsdReader
64
82
  type ? type.split(':').first : nil
65
83
  end
66
84
 
85
+
67
86
  # base stuff belongs to extension type objects only, but let's be flexible
68
87
  def base
69
88
  node.attributes['base'] ? node.attributes['base'].value : nil
@@ -77,6 +96,7 @@ module XsdReader
77
96
  base ? base.split(':').first : nil
78
97
  end
79
98
 
99
+
80
100
  #
81
101
  # Node to class mapping
82
102
  #
@@ -135,7 +155,9 @@ module XsdReader
135
155
  end
136
156
 
137
157
  def all_elements
138
- @all_elements ||= ordered_elements + (linked_complex_type ? linked_complex_type.ordered_elements : [])
158
+ @all_elements ||= ordered_elements +
159
+ (linked_complex_type ? linked_complex_type.all_elements : []) +
160
+ (referenced_element ? referenced_element.all_elements : [])
139
161
  end
140
162
 
141
163
  def child_elements?
@@ -143,7 +165,8 @@ module XsdReader
143
165
  end
144
166
 
145
167
  def attributes
146
- @attributes ||= map_children('xs:attribute')
168
+ @attributes ||= map_children('xs:attribute') #+
169
+ #(referenced_element ? referenced_element.attributes : [])
147
170
  end
148
171
 
149
172
  def sequences
@@ -159,7 +182,7 @@ module XsdReader
159
182
  end
160
183
 
161
184
  def complex_type
162
- complex_types.first || linked_complex_type
185
+ complex_types.first || linked_complex_type || (referenced_element ? referenced_element.complex_type : nil)
163
186
  end
164
187
 
165
188
  def linked_complex_type
@@ -10,80 +10,57 @@ describe XsdReader::Element do
10
10
  reader.elements[0]
11
11
  }
12
12
 
13
- it "gives the element's name" do
14
- expect(element.name).to eq 'NewReleaseMessage'
15
- end
13
+ let(:referencing_reader){
14
+ XsdReader::XML.new(:xsd_file => File.expand_path('examples/referencing.xsd', File.dirname(__FILE__)))
15
+ }
16
16
 
17
- it "gives a complex type reader" do
18
- expect(element.complex_type.class).to eq XsdReader::ComplexType
19
- end
17
+ describe '#[]' do
18
+ it "gives an element's child" do
19
+ expect(reader['NewReleaseMessage']).to eq reader.elements[0]
20
+ end
20
21
 
21
- it "gives child elements defined within a complex type" do
22
- # byebug
23
- expect(element.elements.map(&:name)).to eq [
24
- "MessageHeader",
25
- "UpdateIndicator",
26
- "IsBackfill",
27
- "CatalogTransfer",
28
- "WorkList",
29
- "CueSheetList",
30
- "ResourceList",
31
- "CollectionList",
32
- "ReleaseList",
33
- "DealList"]
22
+ it "gives an element's child through reference element" do
23
+ expect(referencing_reader['Album', 'Tracks', 'Track', 'ISRC'].type).to eq 'xs:NCName'
24
+ end
34
25
  end
35
26
 
36
- describe "External type definition" do
37
- let(:header){
38
- element.elements.first
39
- }
40
-
41
- it "gives the type name" do
42
- expect(header.type_name).to eq 'MessageHeader'
27
+ describe '#name' do
28
+ it "gives the element's name" do
29
+ expect(element.name).to eq 'NewReleaseMessage'
43
30
  end
44
31
 
45
- it "gives the type namespace" do
46
- expect(header.type_namespace).to eq 'ern'
32
+ it "gives the element's name obtained through reference" do
33
+ expect(referencing_reader.elements[0].elements[0].name).to eq 'Source'
47
34
  end
35
+ end
48
36
 
49
- it "gives the type string" do
50
- expect(header.type).to eq 'ern:MessageHeader'
37
+ describe '#ref' do
38
+ it "gives an element's ref attribute value" do
39
+ expect(referencing_reader['Album']['Source'].ref).to eq 'Source'
51
40
  end
52
41
 
53
- it "gives the remote complex_type, linked by type" do
54
- expect(header.complex_type.name).to eq 'MessageHeader'
42
+ it "returns nil when attribute available" do
43
+ expect(element.ref).to eq nil
55
44
  end
45
+ end
56
46
 
57
- it "includes child elements defined in external the complex type type definitions" do
58
- expected = [
59
- "MessageThreadId",
60
- "MessageId",
61
- "MessageFileName",
62
- "MessageSender",
63
- "SentOnBehalfOf",
64
- "MessageRecipient",
65
- "MessageCreatedDateTime",
66
- "MessageAuditTrail",
67
- "Comment",
68
- "MessageControlType"]
47
+ describe '#type' do
48
+ it "gives the type of an element" do
49
+ expect(reader['NewReleaseMessage']['MessageHeader'].type).to eq 'ern:MessageHeader'
50
+ end
69
51
 
70
- expect(header.elements.map(&:name)).to eq expected
71
- expect(header.complex_type.all_elements.map(&:name)).to eq expected
52
+ it "gives the type of an elements obtained through the referenced element" do
53
+ expect(referencing_reader['Album']['Source'].type).to eq 'xs:string'
72
54
  end
73
55
  end
74
56
 
75
- describe "#elements" do
76
-
77
- it "includes elements within a choice node" do
78
- el = element.elements[3]
79
- expect(el.name).to eq 'CatalogTransfer'
80
- elements_without = ["CatalogTransferCompleted", "EffectiveTransferDate", "CatalogReleaseReferenceList", "TransferringFrom", "TransferringTo"]
81
- elements_with = ["CatalogTransferCompleted", "EffectiveTransferDate", "CatalogReleaseReferenceList", "TerritoryCode", "ExcludedTerritoryCode", "TransferringFrom", "TransferringTo"]
82
- expect(el.complex_type.sequences.map{|seq| seq.elements}.flatten.map(&:name)).to eq elements_without
83
- expect(el.complex_type.all_elements.map(&:name)).to eq elements_with
84
- expect(el.complex_type.sequences[0].choices.map{|ch| ch.elements}.flatten.map(&:name)).to eq elements_with - elements_without
57
+ describe '#complex_type' do
58
+ it "gives a complex type reader" do
59
+ expect(element.complex_type.class).to eq XsdReader::ComplexType
85
60
  end
61
+ end
86
62
 
63
+ describe "#elements" do
87
64
  it "gives child elements in the right order" do
88
65
  expected = [
89
66
  "CommercialModelType",
@@ -116,6 +93,109 @@ describe XsdReader::Element do
116
93
 
117
94
  expect(reader['NewReleaseMessage']['DealList']['ReleaseDeal']['Deal']['DealTerms'].elements.map(&:name)).to eq expected
118
95
  end
96
+
97
+ it "includes elements within a choice node" do
98
+ el = element.elements[3]
99
+ expect(el.name).to eq 'CatalogTransfer'
100
+ elements_without = ["CatalogTransferCompleted", "EffectiveTransferDate", "CatalogReleaseReferenceList", "TransferringFrom", "TransferringTo"]
101
+ elements_with = ["CatalogTransferCompleted", "EffectiveTransferDate", "CatalogReleaseReferenceList", "TerritoryCode", "ExcludedTerritoryCode", "TransferringFrom", "TransferringTo"]
102
+ expect(el.complex_type.sequences.map{|seq| seq.elements}.flatten.map(&:name)).to eq elements_without
103
+ expect(el.complex_type.all_elements.map(&:name)).to eq elements_with
104
+ expect(el.complex_type.sequences[0].choices.map{|ch| ch.elements}.flatten.map(&:name)).to eq elements_with - elements_without
105
+ end
106
+
107
+ it "gives child elements defined within a complex type" do
108
+ # byebug
109
+ expect(element.elements.map(&:name)).to eq [
110
+ "MessageHeader",
111
+ "UpdateIndicator",
112
+ "IsBackfill",
113
+ "CatalogTransfer",
114
+ "WorkList",
115
+ "CueSheetList",
116
+ "ResourceList",
117
+ "CollectionList",
118
+ "ReleaseList",
119
+ "DealList"]
120
+ end
121
+
122
+ it "gives child elements defined in the referenced element" do
123
+ expect( referencing_reader['Album', 'Tracks'].elements.map(&:name) ).to eq ['Track']
124
+ expect(referencing_reader['Album', 'Tracks', 'Track'].elements.map(&:name)).to eq [
125
+ 'ISRC',
126
+ 'Artist',
127
+ 'Title',
128
+ 'DiscNumber',
129
+ 'TrackNumber',
130
+ 'Duration',
131
+ 'Label',
132
+ 'Company',
133
+ 'CompanyCountry',
134
+ 'RecordedCountry',
135
+ 'RecordedYear',
136
+ 'ReleaseDate',
137
+ 'Contributors']
138
+ end
139
+ end
140
+
141
+ describe '#attributes' do
142
+ it "gives attributes defined in a complexType" do
143
+ expected = [
144
+ "MessageSchemaVersionId",
145
+ "BusinessProfileVersionId",
146
+ "ReleaseProfileVersionId",
147
+ "LanguageAndScriptCode"]
148
+ expect(element.attributes.map(&:name)).to eq expected
149
+ expect(element.complex_type.attributes.map(&:name)).to eq expected
150
+ end
151
+
152
+ it "gives attributes defined in a simpleContent extension" do
153
+ expect(element['ResourceList']['SoundRecording']['SoundRecordingDetailsByTerritory']['DisplayArtist']['ArtistRole'].attributes.map(&:name)).to eq ["Namespace", "UserDefinedValue"]
154
+ end
155
+
156
+ it "gives attributes defined in the referenced element" do
157
+ expect(referencing_reader['Album', 'Tracks', 'Track'].attributes).to eq []
158
+ expect(referencing_reader['Album', 'Tracks', 'Track', 'Contributors', 'Contributor'].attributes.map(&:name)).to eq ['credited']
159
+ end
160
+ end
161
+
162
+ describe "External type definition" do
163
+ let(:header){
164
+ element.elements.first
165
+ }
166
+
167
+ it "gives the type name" do
168
+ expect(header.type_name).to eq 'MessageHeader'
169
+ end
170
+
171
+ it "gives the type namespace" do
172
+ expect(header.type_namespace).to eq 'ern'
173
+ end
174
+
175
+ it "gives the type string" do
176
+ expect(header.type).to eq 'ern:MessageHeader'
177
+ end
178
+
179
+ it "gives the remote complex_type, linked by type" do
180
+ expect(header.complex_type.name).to eq 'MessageHeader'
181
+ end
182
+
183
+ it "includes child elements defined in external the complex type type definitions" do
184
+ expected = [
185
+ "MessageThreadId",
186
+ "MessageId",
187
+ "MessageFileName",
188
+ "MessageSender",
189
+ "SentOnBehalfOf",
190
+ "MessageRecipient",
191
+ "MessageCreatedDateTime",
192
+ "MessageAuditTrail",
193
+ "Comment",
194
+ "MessageControlType"]
195
+
196
+ expect(header.elements.map(&:name)).to eq expected
197
+ expect(header.complex_type.all_elements.map(&:name)).to eq expected
198
+ end
119
199
  end
120
200
 
121
201
  # # this is pretty slow...
@@ -152,21 +232,4 @@ describe XsdReader::Element do
152
232
  # expect(element.family_tree['DealList']['ReleaseDeal']['Deal']['DealTerms']['RightsClaimPolicy']['Condition']['Unit']).to eq 'type:UnitOfConditionValue'
153
233
  # end
154
234
  # end
155
-
156
- describe '#attributes' do
157
- it "gives attributes defined in a complexType" do
158
- expected = [
159
- "MessageSchemaVersionId",
160
- "BusinessProfileVersionId",
161
- "ReleaseProfileVersionId",
162
- "LanguageAndScriptCode"]
163
- expect(element.attributes.map(&:name)).to eq expected
164
- expect(element.complex_type.attributes.map(&:name)).to eq expected
165
- end
166
-
167
- it "gives attributes defined in a simpleContent extension" do
168
- expect(element['ResourceList']['SoundRecording']['SoundRecordingDetailsByTerritory']['DisplayArtist']['ArtistRole'].attributes.map(&:name)).to eq ["Namespace", "UserDefinedValue"]
169
- end
170
- end
171
-
172
235
  end
@@ -0,0 +1,70 @@
1
+ <?xml version="1.0" encoding="utf-8" standalone="no"?>
2
+ <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' elementFormDefault='qualified'>
3
+ <xs:element name='Album'>
4
+ <xs:complexType>
5
+ <xs:sequence>
6
+ <xs:element ref='Source'/>
7
+ <xs:element ref='Tracks'/>
8
+ </xs:sequence>
9
+ </xs:complexType>
10
+ </xs:element>
11
+ <xs:element name='Source' type='xs:string'/>
12
+ <xs:element name='Tracks'>
13
+ <xs:complexType>
14
+ <xs:sequence>
15
+ <xs:element ref='Track'/>
16
+ </xs:sequence>
17
+ </xs:complexType>
18
+ </xs:element>
19
+ <xs:element name='Track'>
20
+ <xs:complexType>
21
+ <xs:sequence>
22
+ <xs:element ref='ISRC'/>
23
+ <xs:element ref='Artist'/>
24
+ <xs:element ref='Title'/>
25
+ <xs:element ref='DiscNumber'/>
26
+ <xs:element ref='TrackNumber'/>
27
+ <xs:element ref='Duration'/>
28
+ <xs:element ref='Label'/>
29
+ <xs:element ref='Company'/>
30
+ <xs:element ref='CompanyCountry'/>
31
+ <xs:element ref='RecordedCountry'/>
32
+ <xs:element ref='RecordedYear'/>
33
+ <xs:element ref='ReleaseDate'/>
34
+ <xs:element ref='Contributors'/>
35
+ </xs:sequence>
36
+ </xs:complexType>
37
+ </xs:element>
38
+ <xs:element name='ISRC' type='xs:NCName'/>
39
+ <xs:element name='DiscNumber' type='xs:integer'/>
40
+ <xs:element name='TrackNumber' type='xs:integer'/>
41
+ <xs:element name='Duration' type='xs:integer'/>
42
+ <xs:element name='RecordedCountry' type='xs:NCName'/>
43
+ <xs:element name='RecordedYear' type='xs:integer'/>
44
+ <xs:element name='Contributors'>
45
+ <xs:complexType>
46
+ <xs:sequence>
47
+ <xs:element maxOccurs='unbounded' ref='Contributor'/>
48
+ </xs:sequence>
49
+ </xs:complexType>
50
+ </xs:element>
51
+ <xs:element name='Contributor'>
52
+ <xs:complexType>
53
+ <xs:sequence>
54
+ <xs:element ref='Name'/>
55
+ <xs:element ref='Role'/>
56
+ <xs:element ref='Instrument'/>
57
+ </xs:sequence>
58
+ <xs:attribute name="credited" type="xs:boolean" />
59
+ </xs:complexType>
60
+ </xs:element>
61
+ <xs:element name='Name' type='xs:string'/>
62
+ <xs:element name='Role' type='xs:NCName'/>
63
+ <xs:element name='Instrument' type='xs:NCName'/>
64
+ <xs:element name='Title' type='xs:string'/>
65
+ <xs:element name='Artist' type='xs:string'/>
66
+ <xs:element name='Label' type='xs:string'/>
67
+ <xs:element name='Company' type='xs:string'/>
68
+ <xs:element name='CompanyCountry' type='xs:NCName'/>
69
+ <xs:element name='ReleaseDate' type='xs:NMTOKEN'/>
70
+ </xs:schema>
@@ -44,7 +44,7 @@ describe XsdReader do
44
44
  end
45
45
 
46
46
  describe "#all_elements" do
47
- it "includes elements from linked complex types fmor an imported schema" do
47
+ it "includes elements from linked complex types from an imported schema" do
48
48
  el = v32['NewReleaseMessage']['CollectionList']['Collection']['Title']
49
49
  expect(el.all_elements.map(&:name)).to eq ['TitleText', 'SubTitle']
50
50
  end
@@ -192,4 +192,82 @@ describe XsdReader do
192
192
  expect(el.complex_type).to be ct
193
193
  end
194
194
  end
195
+
196
+ describe "referenced elements" do
197
+ let(:reader){
198
+ XsdReader::XML.new(:xsd_file => File.expand_path('examples/referencing.xsd', File.dirname(__FILE__)))
199
+ }
200
+
201
+ let(:element){
202
+ reader['Album', 'Tracks', 'Track', 'Contributors', 'Contributor']
203
+ }
204
+
205
+ describe '#referenced_element' do
206
+ it 'gives the referenced element' do
207
+ expect(element.referenced_element.class).to eq XsdReader::Element
208
+ expect(element.referenced_element.name).to eq 'Contributor'
209
+ expect(element.referenced_element).to_not eq element
210
+ end
211
+ end
212
+
213
+ describe '#elements' do
214
+ it "gives alements of the referenced element" do
215
+ expect(element.elements.map(&:name)).to eq ['Name', 'Role', 'Instrument']
216
+ end
217
+ end
218
+
219
+ describe '#attributes' do
220
+ it "gives the attributes of the referenced element" do
221
+ expect(element.attributes.map(&:name)).to eq ['credited']
222
+ end
223
+ end
224
+
225
+ describe '#[]' do
226
+ it "lets the caller acces elements of the referenced element" do
227
+ expect(element['Role'].type).to eq 'xs:NCName'
228
+ end
229
+
230
+ it "lets the caller access attributes of the referened element" do
231
+ expect(element['@credited'].type).to eq 'xs:boolean'
232
+ end
233
+ end
234
+
235
+ describe '#name' do
236
+ it "gives the name of the referenced element" do
237
+ expect(element.name).to eq 'Contributor'
238
+ end
239
+ end
240
+
241
+ describe '#type' do
242
+ it "gives the type of the referenced element" do
243
+ expect(element.type).to eq nil
244
+ expect(reader['Album', 'Source'].type).to eq 'xs:string'
245
+ end
246
+ end
247
+
248
+ describe '#complex_type' do
249
+ it "gives the complex type object of the referenced element" do
250
+ expect(element.complex_type.sequences.first.elements.map(&:name)).to eq ['Name', 'Role', 'Instrument']
251
+ end
252
+ end
253
+
254
+ describe '#simple_contents' do
255
+ it "it includes the referenced element's simple content objects" do
256
+ skip 'not yet implemented'
257
+ end
258
+ end
259
+
260
+ describe '#complex_contents' do
261
+ it "it includes the referenced element's complex content objects" do
262
+ skip 'not yet implemented'
263
+ end
264
+ end
265
+
266
+ describe '#extensions' do
267
+ it "it includes the referenced element's extension objects" do
268
+ skip 'not yet implemented'
269
+ end
270
+ end
271
+
272
+ end
195
273
  end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "xsd-reader"
3
- s.version = '0.2.0'
3
+ s.version = '0.3.0'
4
4
  s.files = `git ls-files`.split($/)
5
5
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
6
6
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xsd-reader
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark van de Korput
@@ -103,6 +103,7 @@ files:
103
103
  - spec/examples/ddex-v32/iso639a2.xsd
104
104
  - spec/examples/ddex-v36/avs.xsd
105
105
  - spec/examples/ddex-v36/ddex-ern-v36.xsd
106
+ - spec/examples/referencing.xsd
106
107
  - spec/extension_spec.rb
107
108
  - spec/import_spec.rb
108
109
  - spec/schema_spec.rb