xsd-reader 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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