xsd-reader 0.0.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.
- checksums.yaml +7 -0
- data/.gitignore +35 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +40 -0
- data/LICENSE +22 -0
- data/README.md +60 -0
- data/Rakefile +20 -0
- data/lib/xsd_reader/attribute.rb +9 -0
- data/lib/xsd_reader/choice.rb +8 -0
- data/lib/xsd_reader/complex_type.rb +26 -0
- data/lib/xsd_reader/element.rb +65 -0
- data/lib/xsd_reader/extension.rb +5 -0
- data/lib/xsd_reader/schema.rb +5 -0
- data/lib/xsd_reader/sequence.rb +8 -0
- data/lib/xsd_reader/shared.rb +214 -0
- data/lib/xsd_reader/simple_content.rb +9 -0
- data/lib/xsd_reader/xml.rb +38 -0
- data/lib/xsd_reader.rb +11 -0
- data/spec/attribute_spec.rb +35 -0
- data/spec/element_spec.rb +169 -0
- data/spec/examples/ddex-ern-v36.xsd +8815 -0
- data/spec/schema_spec.rb +17 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/xml_spec.rb +24 -0
- data/spec/xsd_reader_spec.rb +62 -0
- data/xsd-reader.gemspec +20 -0
- metadata +96 -0
@@ -0,0 +1,169 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe XsdReader::Element do
|
4
|
+
|
5
|
+
before :all do
|
6
|
+
@reader ||= XsdReader::XML.new(:xsd_file => File.expand_path(File.join(File.dirname(__FILE__), 'examples', 'ddex-ern-v36.xsd')))
|
7
|
+
@element = @reader.elements[0]
|
8
|
+
end
|
9
|
+
|
10
|
+
it "gives the element's name" do
|
11
|
+
expect(@element.name).to eq 'NewReleaseMessage'
|
12
|
+
end
|
13
|
+
|
14
|
+
it "gives a complex type reader" do
|
15
|
+
expect(@element.complex_type.class).to eq XsdReader::ComplexType
|
16
|
+
end
|
17
|
+
|
18
|
+
it "gives child elements defined within a complex type" do
|
19
|
+
# byebug
|
20
|
+
expect(@element.elements.map(&:name)).to eq [
|
21
|
+
"MessageHeader",
|
22
|
+
"UpdateIndicator",
|
23
|
+
"IsBackfill",
|
24
|
+
"CatalogTransfer",
|
25
|
+
"WorkList",
|
26
|
+
"CueSheetList",
|
27
|
+
"ResourceList",
|
28
|
+
"CollectionList",
|
29
|
+
"ReleaseList",
|
30
|
+
"DealList"]
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "External type definition" do
|
34
|
+
before :each do
|
35
|
+
@element = @element.elements.first
|
36
|
+
end
|
37
|
+
|
38
|
+
it "gives the type name" do
|
39
|
+
expect(@element.type_name).to eq 'MessageHeader'
|
40
|
+
end
|
41
|
+
|
42
|
+
it "gives the type namespace" do
|
43
|
+
expect(@element.type_namespace).to eq 'ern'
|
44
|
+
end
|
45
|
+
|
46
|
+
it "gives the type string" do
|
47
|
+
expect(@element.type).to eq 'ern:MessageHeader'
|
48
|
+
end
|
49
|
+
|
50
|
+
it "gives the remote complex_type, linked by type" do
|
51
|
+
expect(@element.complex_type.name).to eq 'MessageHeader'
|
52
|
+
end
|
53
|
+
|
54
|
+
it "includes child elements defined in external the complex type type definitions" do
|
55
|
+
expected = [
|
56
|
+
"MessageThreadId",
|
57
|
+
"MessageId",
|
58
|
+
"MessageFileName",
|
59
|
+
"MessageSender",
|
60
|
+
"SentOnBehalfOf",
|
61
|
+
"MessageRecipient",
|
62
|
+
"MessageCreatedDateTime",
|
63
|
+
"MessageAuditTrail",
|
64
|
+
"Comment",
|
65
|
+
"MessageControlType"]
|
66
|
+
|
67
|
+
expect(@element.elements.map(&:name)).to eq expected
|
68
|
+
expect(@element.complex_type.all_elements.map(&:name)).to eq expected
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "#elements" do
|
73
|
+
|
74
|
+
it "includes elements within a choice node" do
|
75
|
+
el = @element.elements[3]
|
76
|
+
expect(el.name).to eq 'CatalogTransfer'
|
77
|
+
elements_without = ["CatalogTransferCompleted", "EffectiveTransferDate", "CatalogReleaseReferenceList", "TransferringFrom", "TransferringTo"]
|
78
|
+
elements_with = ["CatalogTransferCompleted", "EffectiveTransferDate", "CatalogReleaseReferenceList", "TerritoryCode", "ExcludedTerritoryCode", "TransferringFrom", "TransferringTo"]
|
79
|
+
expect(el.complex_type.sequences.map{|seq| seq.elements}.flatten.map(&:name)).to eq elements_without
|
80
|
+
expect(el.complex_type.all_elements.map(&:name)).to eq elements_with
|
81
|
+
expect(el.complex_type.sequences[0].choices.map{|ch| ch.elements}.flatten.map(&:name)).to eq elements_with - elements_without
|
82
|
+
end
|
83
|
+
|
84
|
+
it "gives child elements in the right order" do
|
85
|
+
expected = [
|
86
|
+
"CommercialModelType",
|
87
|
+
"Usage",
|
88
|
+
"AllDealsCancelled",
|
89
|
+
"TakeDown",
|
90
|
+
"TerritoryCode",
|
91
|
+
"ExcludedTerritoryCode",
|
92
|
+
"DistributionChannel",
|
93
|
+
"ExcludedDistributionChannel",
|
94
|
+
"PriceInformation",
|
95
|
+
"IsPromotional",
|
96
|
+
"PromotionalCode",
|
97
|
+
"ValidityPeriod",
|
98
|
+
"ConsumerRentalPeriod",
|
99
|
+
"PreOrderReleaseDate",
|
100
|
+
"ReleaseDisplayStartDate",
|
101
|
+
"TrackListingPreviewStartDate",
|
102
|
+
"CoverArtPreviewStartDate",
|
103
|
+
"ClipPreviewStartDate",
|
104
|
+
"PreOrderPreviewDate",
|
105
|
+
"IsExclusive",
|
106
|
+
"RelatedReleaseOfferSet",
|
107
|
+
"PhysicalReturns",
|
108
|
+
"NumberOfProductsPerCarton",
|
109
|
+
"RightsClaimPolicy",
|
110
|
+
"WebPolicy"]
|
111
|
+
|
112
|
+
# byebug
|
113
|
+
|
114
|
+
expect(@reader['NewReleaseMessage']['DealList']['ReleaseDeal']['Deal']['DealTerms'].elements.map(&:name)).to eq expected
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# # this is pretty slow...
|
119
|
+
# describe "#family_tree" do
|
120
|
+
# before :each do
|
121
|
+
# @element = @reader.elements[0]
|
122
|
+
# end
|
123
|
+
|
124
|
+
# it "gives a family tree as a nested list of children, keys being nodes name, values being either another hash of children of strings with the names of the children" do
|
125
|
+
# expect(@element.family_tree.keys).to eq [
|
126
|
+
# "MessageHeader",
|
127
|
+
# "UpdateIndicator",
|
128
|
+
# "IsBackfill",
|
129
|
+
# "CatalogTransfer",
|
130
|
+
# "WorkList",
|
131
|
+
# "CueSheetList",
|
132
|
+
# "ResourceList",
|
133
|
+
# "CollectionList",
|
134
|
+
# "ReleaseList",
|
135
|
+
# "DealList"
|
136
|
+
# ]
|
137
|
+
|
138
|
+
# expect(@element.family_tree['ResourceList'].keys).to eq [
|
139
|
+
# "SoundRecording",
|
140
|
+
# "MIDI",
|
141
|
+
# "Video",
|
142
|
+
# "Image",
|
143
|
+
# "Text",
|
144
|
+
# "SheetMusic",
|
145
|
+
# "Software",
|
146
|
+
# "UserDefinedResource"
|
147
|
+
# ]
|
148
|
+
|
149
|
+
# expect(@element.family_tree['DealList']['ReleaseDeal']['Deal']['DealTerms']['RightsClaimPolicy']['Condition']['Unit']).to eq 'type:UnitOfConditionValue'
|
150
|
+
# end
|
151
|
+
# end
|
152
|
+
|
153
|
+
describe '#attributes' do
|
154
|
+
it "gives attributes defined in a complexType" do
|
155
|
+
expected = [
|
156
|
+
"MessageSchemaVersionId",
|
157
|
+
"BusinessProfileVersionId",
|
158
|
+
"ReleaseProfileVersionId",
|
159
|
+
"LanguageAndScriptCode"]
|
160
|
+
expect(@element.attributes.map(&:name)).to eq expected
|
161
|
+
expect(@element.complex_type.attributes.map(&:name)).to eq expected
|
162
|
+
end
|
163
|
+
|
164
|
+
it "gives attributes defined in a simpleContent extension" do
|
165
|
+
expect(@element['ResourceList']['SoundRecording']['SoundRecordingDetailsByTerritory']['DisplayArtist']['ArtistRole'].attributes.map(&:name)).to eq ["Namespace", "UserDefinedValue"]
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|