onix2 1.0.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.
Files changed (240) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +209 -0
  3. data/README.markdown +69 -0
  4. data/TODO +14 -0
  5. data/dtd/2.1r3/iso-amsa.ent +173 -0
  6. data/dtd/2.1r3/iso-amsb.ent +146 -0
  7. data/dtd/2.1r3/iso-amsc.ent +49 -0
  8. data/dtd/2.1r3/iso-amsn.ent +117 -0
  9. data/dtd/2.1r3/iso-amso.ent +77 -0
  10. data/dtd/2.1r3/iso-amsr.ent +205 -0
  11. data/dtd/2.1r3/iso-box.ent +67 -0
  12. data/dtd/2.1r3/iso-cyr1.ent +94 -0
  13. data/dtd/2.1r3/iso-cyr2.ent +53 -0
  14. data/dtd/2.1r3/iso-dia.ent +41 -0
  15. data/dtd/2.1r3/iso-grk3.ent +70 -0
  16. data/dtd/2.1r3/iso-lat1.ent +89 -0
  17. data/dtd/2.1r3/iso-lat2.ent +148 -0
  18. data/dtd/2.1r3/iso-mfrk.ent +79 -0
  19. data/dtd/2.1r3/iso-mopf.ent +53 -0
  20. data/dtd/2.1r3/iso-mscr.ent +79 -0
  21. data/dtd/2.1r3/iso-num.ent +103 -0
  22. data/dtd/2.1r3/iso-num.old.ent +103 -0
  23. data/dtd/2.1r3/iso-pub.ent +110 -0
  24. data/dtd/2.1r3/iso-tech.ent +183 -0
  25. data/dtd/2.1r3/onix-international.dtd +1012 -0
  26. data/dtd/2.1r3/onix-xhtml.elt +672 -0
  27. data/dtd/2.1r3/reference.elt +4758 -0
  28. data/dtd/2.1r3/xhtml-special.ent +79 -0
  29. data/dtd/2.1r3/xhtml-symbol.ent +242 -0
  30. data/lib/onix2.rb +85 -0
  31. data/lib/onix2/addressee_identifier.rb +29 -0
  32. data/lib/onix2/apa_product.rb +785 -0
  33. data/lib/onix2/audience_range.rb +37 -0
  34. data/lib/onix2/code_list_extractor.rb +69 -0
  35. data/lib/onix2/contributor.rb +55 -0
  36. data/lib/onix2/discount_coded.rb +29 -0
  37. data/lib/onix2/header.rb +68 -0
  38. data/lib/onix2/imprint.rb +31 -0
  39. data/lib/onix2/language.rb +29 -0
  40. data/lib/onix2/lists.rb +134 -0
  41. data/lib/onix2/market_representation.rb +38 -0
  42. data/lib/onix2/measure.rb +29 -0
  43. data/lib/onix2/media_file.rb +33 -0
  44. data/lib/onix2/other_text.rb +35 -0
  45. data/lib/onix2/price.rb +47 -0
  46. data/lib/onix2/product.rb +97 -0
  47. data/lib/onix2/product_identifier.rb +27 -0
  48. data/lib/onix2/publisher.rb +33 -0
  49. data/lib/onix2/reader.rb +157 -0
  50. data/lib/onix2/sales_restriction.rb +25 -0
  51. data/lib/onix2/sales_rights.rb +28 -0
  52. data/lib/onix2/sender_identifier.rb +29 -0
  53. data/lib/onix2/series.rb +28 -0
  54. data/lib/onix2/series_identifier.rb +27 -0
  55. data/lib/onix2/simple_product.rb +47 -0
  56. data/lib/onix2/stock.rb +29 -0
  57. data/lib/onix2/subject.rb +33 -0
  58. data/lib/onix2/supply_detail.rb +53 -0
  59. data/lib/onix2/title.rb +33 -0
  60. data/lib/onix2/version.rb +3 -0
  61. data/lib/onix2/website.rb +29 -0
  62. data/lib/onix2/writer.rb +86 -0
  63. data/spec/addressee_identifier_spec.rb +33 -0
  64. data/spec/apa_product_spec.rb +116 -0
  65. data/spec/audience_range_spec.rb +44 -0
  66. data/spec/contributor_spec.rb +38 -0
  67. data/spec/discount_coded_spec.rb +34 -0
  68. data/spec/header_spec.rb +153 -0
  69. data/spec/imprint_spec.rb +31 -0
  70. data/spec/language_spec.rb +38 -0
  71. data/spec/lists_spec.rb +33 -0
  72. data/spec/market_representation_spec.rb +33 -0
  73. data/spec/measure_spec.rb +38 -0
  74. data/spec/media_file_spec.rb +38 -0
  75. data/spec/other_text_spec.rb +33 -0
  76. data/spec/price_spec.rb +52 -0
  77. data/spec/product_identifier_spec.rb +34 -0
  78. data/spec/product_spec.rb +102 -0
  79. data/spec/publisher_spec.rb +33 -0
  80. data/spec/reader_spec.rb +155 -0
  81. data/spec/sales_restriction_spec.rb +27 -0
  82. data/spec/sender_identifier.rb +33 -0
  83. data/spec/series_identifier_spec.rb +33 -0
  84. data/spec/series_spec.rb +47 -0
  85. data/spec/spec_helper.rb +15 -0
  86. data/spec/stock_spec.rb +39 -0
  87. data/spec/subject_spec.rb +34 -0
  88. data/spec/supply_detail_spec.rb +97 -0
  89. data/spec/title_spec.rb +38 -0
  90. data/spec/website_spec.rb +33 -0
  91. data/spec/writer_spec.rb +78 -0
  92. data/support/codes/001.tsv +10 -0
  93. data/support/codes/002.tsv +5 -0
  94. data/support/codes/003.tsv +7 -0
  95. data/support/codes/005.tsv +13 -0
  96. data/support/codes/006.tsv +76 -0
  97. data/support/codes/007.tsv +123 -0
  98. data/support/codes/008.tsv +7 -0
  99. data/support/codes/009.tsv +7 -0
  100. data/support/codes/010.tsv +34 -0
  101. data/support/codes/011.tsv +11 -0
  102. data/support/codes/012.tsv +11 -0
  103. data/support/codes/013.tsv +7 -0
  104. data/support/codes/014.tsv +4 -0
  105. data/support/codes/015.tsv +13 -0
  106. data/support/codes/016.tsv +6 -0
  107. data/support/codes/017.tsv +90 -0
  108. data/support/codes/018.tsv +3 -0
  109. data/support/codes/019.tsv +7 -0
  110. data/support/codes/020.tsv +0 -0
  111. data/support/codes/021.tsv +31 -0
  112. data/support/codes/022.tsv +9 -0
  113. data/support/codes/023.tsv +9 -0
  114. data/support/codes/024.tsv +11 -0
  115. data/support/codes/025.tsv +29 -0
  116. data/support/codes/026.tsv +75 -0
  117. data/support/codes/027.tsv +75 -0
  118. data/support/codes/028.tsv +8 -0
  119. data/support/codes/029.tsv +16 -0
  120. data/support/codes/030.tsv +15 -0
  121. data/support/codes/031.tsv +3 -0
  122. data/support/codes/032.tsv +2 -0
  123. data/support/codes/033.tsv +36 -0
  124. data/support/codes/034.tsv +14 -0
  125. data/support/codes/035.tsv +6 -0
  126. data/support/codes/036.tsv +3 -0
  127. data/support/codes/037.tsv +6 -0
  128. data/support/codes/038.tsv +36 -0
  129. data/support/codes/039.tsv +8 -0
  130. data/support/codes/040.tsv +6 -0
  131. data/support/codes/041.tsv +6 -0
  132. data/support/codes/042.tsv +16 -0
  133. data/support/codes/043.tsv +4 -0
  134. data/support/codes/044.tsv +13 -0
  135. data/support/codes/045.tsv +12 -0
  136. data/support/codes/046.tsv +3 -0
  137. data/support/codes/047.tsv +4 -0
  138. data/support/codes/048.tsv +11 -0
  139. data/support/codes/049.tsv +84 -0
  140. data/support/codes/050.tsv +8 -0
  141. data/support/codes/051.tsv +27 -0
  142. data/support/codes/052.tsv +1 -0
  143. data/support/codes/053.tsv +3 -0
  144. data/support/codes/054.tsv +23 -0
  145. data/support/codes/055.tsv +13 -0
  146. data/support/codes/056.tsv +2 -0
  147. data/support/codes/057.tsv +5 -0
  148. data/support/codes/058.tsv +21 -0
  149. data/support/codes/059.tsv +4 -0
  150. data/support/codes/060.tsv +2 -0
  151. data/support/codes/061.tsv +3 -0
  152. data/support/codes/062.tsv +5 -0
  153. data/support/codes/063.tsv +0 -0
  154. data/support/codes/064.tsv +13 -0
  155. data/support/codes/065.tsv +25 -0
  156. data/support/codes/066.tsv +4 -0
  157. data/support/codes/067.tsv +2 -0
  158. data/support/codes/068.tsv +15 -0
  159. data/support/codes/069.tsv +4 -0
  160. data/support/codes/070.tsv +2 -0
  161. data/support/codes/071.tsv +9 -0
  162. data/support/codes/072.tsv +7 -0
  163. data/support/codes/073.tsv +36 -0
  164. data/support/codes/074.tsv +489 -0
  165. data/support/codes/075.tsv +2 -0
  166. data/support/codes/076.tsv +12 -0
  167. data/support/codes/077.tsv +19 -0
  168. data/support/codes/078.tsv +148 -0
  169. data/support/codes/079.tsv +17 -0
  170. data/support/codes/080.tsv +19 -0
  171. data/support/codes/081.tsv +11 -0
  172. data/support/codes/082.tsv +17 -0
  173. data/support/codes/083.tsv +68 -0
  174. data/support/codes/084.tsv +10 -0
  175. data/support/codes/085.tsv +23 -0
  176. data/support/codes/086.tsv +5 -0
  177. data/support/codes/087.tsv +6 -0
  178. data/support/codes/088.tsv +0 -0
  179. data/support/codes/089.tsv +1 -0
  180. data/support/codes/090.tsv +11 -0
  181. data/support/codes/091.tsv +248 -0
  182. data/support/codes/092.tsv +7 -0
  183. data/support/codes/093.tsv +13 -0
  184. data/support/codes/094.tsv +3 -0
  185. data/support/codes/095.tsv +3 -0
  186. data/support/codes/096.tsv +185 -0
  187. data/support/codes/097.tsv +1 -0
  188. data/support/codes/098.tsv +21 -0
  189. data/support/codes/099.tsv +24 -0
  190. data/support/codes/100.tsv +4 -0
  191. data/support/codes/101.tsv +2 -0
  192. data/support/codes/102.tsv +3 -0
  193. data/support/codes/121.tsv +127 -0
  194. data/support/codes/138.tsv +6 -0
  195. data/support/codes/139.tsv +70 -0
  196. data/support/codes/140.tsv +7 -0
  197. data/support/codes/141.tsv +10 -0
  198. data/support/codes/142.tsv +12 -0
  199. data/support/codes/143.tsv +7 -0
  200. data/support/codes/144.tsv +4 -0
  201. data/support/codes/145.tsv +5 -0
  202. data/support/codes/146.tsv +3 -0
  203. data/support/codes/147.tsv +7 -0
  204. data/support/codes/148.tsv +3 -0
  205. data/support/codes/149.tsv +4 -0
  206. data/support/codes/150.tsv +124 -0
  207. data/support/codes/151.tsv +7 -0
  208. data/support/codes/152.tsv +2 -0
  209. data/support/codes/153.tsv +14 -0
  210. data/support/codes/154.tsv +9 -0
  211. data/support/codes/155.tsv +5 -0
  212. data/support/codes/156.tsv +4 -0
  213. data/support/codes/157.tsv +4 -0
  214. data/support/codes/158.tsv +24 -0
  215. data/support/codes/159.tsv +6 -0
  216. data/support/codes/160.tsv +0 -0
  217. data/support/codes/161.tsv +3 -0
  218. data/support/codes/162.tsv +3 -0
  219. data/support/codes/163.tsv +7 -0
  220. data/support/codes/164.tsv +2 -0
  221. data/support/codes/165.tsv +2 -0
  222. data/support/codes/166.tsv +2 -0
  223. data/support/codes/167.tsv +3 -0
  224. data/support/codes/168.tsv +2 -0
  225. data/support/codes/169.tsv +3 -0
  226. data/support/codes/170.tsv +0 -0
  227. data/support/codes/171.tsv +2 -0
  228. data/support/codes/172.tsv +1 -0
  229. data/support/codes/173.tsv +2 -0
  230. data/support/codes/174.tsv +2 -0
  231. data/support/codes/175.tsv +175 -0
  232. data/support/codes/176.tsv +12 -0
  233. data/support/codes/177.tsv +2 -0
  234. data/support/codes/178.tsv +17 -0
  235. data/support/entities.txt +1499 -0
  236. data/support/extract.rb +25 -0
  237. data/support/switch-onix-2.1-short-to-reference.xsl +24 -0
  238. data/support/switch-onix-tagnames-1.1.xsl +25 -0
  239. data/support/switch-onix-tagnames-2.0.xsl +37 -0
  240. metadata +440 -0
@@ -0,0 +1,155 @@
1
+ # coding: utf-8
2
+
3
+ require File.dirname(__FILE__) + '/spec_helper.rb'
4
+
5
+ describe ONIX2::Reader do
6
+
7
+ before(:each) do
8
+ @data_path = File.join(File.dirname(__FILE__),"..","data")
9
+ @file1 = File.join(@data_path, "9780194351898.xml")
10
+ @file2 = File.join(@data_path, "two_products.xml")
11
+ @long_file = File.join(@data_path, "Bookwise_July_2008.xml")
12
+ @entity_file = File.join(@data_path, "entities.xml")
13
+ @utf_16_file = File.join(@data_path, "utf_16.xml")
14
+ @iso_8859_1_file = File.join(@data_path, "iso_8859_1.xml")
15
+ @no_encoding_decl_file = File.join(@data_path, "aau.xml")
16
+ end
17
+
18
+ it "should initialize with a filename" do
19
+ reader = ONIX2::Reader.new(@file1)
20
+ expect(reader.instance_variable_get("@reader")).to be_a_kind_of(Nokogiri::XML::Reader)
21
+ end
22
+
23
+ it "should initialize with an IO object" do
24
+ File.open(@file1,"rb") do |f|
25
+ reader = ONIX2::Reader.new(f)
26
+ expect(reader.instance_variable_get("@reader")).to be_a_kind_of(Nokogiri::XML::Reader)
27
+ end
28
+ end
29
+
30
+ it "should provide access to various XML metadata from file" do
31
+ filename = File.join(@data_path, "reference_with_release_attrib.xml")
32
+ reader = ONIX2::Reader.new(filename)
33
+ expect(reader.release).to eql(BigDecimal.new("2.1"))
34
+ end
35
+
36
+ it "should provide access to the header in an ONIX file" do
37
+ reader = ONIX2::Reader.new(@file1)
38
+ expect(reader.header).to be_a_kind_of(ONIX2::Header)
39
+ end
40
+
41
+ it "should iterate over all product records in an ONIX file" do
42
+ reader = ONIX2::Reader.new(@file1)
43
+ counter = 0
44
+ reader.each do |product|
45
+ expect(product).to be_a_kind_of(ONIX2::Product)
46
+ counter += 1
47
+ end
48
+
49
+ expect(counter).to be_eql(1)
50
+ end
51
+
52
+ it "should iterate over all product records in an ONIX file" do
53
+ reader = ONIX2::Reader.new(@file2)
54
+ products = []
55
+ reader.each do |product|
56
+ products << product
57
+ end
58
+
59
+ expect(products.size).to be_eql(2)
60
+ expect(products[0].record_reference).to be_eql("365-9780194351898")
61
+ expect(products[1].record_reference).to be_eql("9780754672326")
62
+ end
63
+
64
+ # libxml can handle the 3 standard entities fine (&amp; &lt; and ^gt;) but
65
+ # barfs when it encounters others. In theory other entities are defined in the
66
+ # ONIX DTD, but I can't work out how to get libxml to recognise them
67
+ it "should correctly parse a file that has an entity in it" do
68
+ reader = ONIX2::Reader.new(@entity_file)
69
+
70
+ products = []
71
+ reader.each do |product|
72
+ products << product
73
+ end
74
+
75
+ expect(products.size).to be_eql(1)
76
+ expect(products.first.titles.size).to be_eql(1)
77
+ expect(products.first.titles.first.title_text).to be_eql("High Noon\342\200\223in Nimbin")
78
+ expect(products.first.record_reference).to be_eql("9780732287573")
79
+ end
80
+
81
+ # for some reason I'm getting segfaults when I read a file with more than 7 records
82
+ it "should correctly parse a file with more than 7 records in in" do
83
+ reader = ONIX2::Reader.new(@long_file)
84
+ counter = 0
85
+ reader.each do |product|
86
+ counter += 1
87
+ end
88
+
89
+ expect(counter).to be_eql(346)
90
+ end
91
+
92
+ it "should transparently convert a iso-8859-1 file to utf-8" do
93
+ reader = ONIX2::Reader.new(@iso_8859_1_file)
94
+ reader.each do |product|
95
+ if RUBY_VERSION >= "1.9"
96
+ utf8 = Encoding.find("utf-8")
97
+ expect(product.contributors[0].person_name_inverted.encoding).to be_eql(utf8)
98
+ end
99
+
100
+ expect(product.contributors[0].person_name_inverted).to be_eql("Küng, Hans")
101
+ end
102
+ end
103
+
104
+ # This isn't ideal behaviour, but i'm somewhat hamstrung by nokogiri API. It'd
105
+ # be nice to have the option to replace unrecognised bytes with a valid char.
106
+ it "should raise an exception when an iso-8859-1 file isn't declared as such" do
107
+ reader = ONIX2::Reader.new(@no_encoding_decl_file)
108
+ expect {
109
+ reader.each do |product|
110
+ end
111
+ }.to raise_error(Nokogiri::XML::SyntaxError)
112
+ end
113
+
114
+ it "should transparently convert an iso-8859-1 file to utf-8 when there's no declaration but the user manually specifies iso-8859-1" do
115
+ reader = ONIX2::Reader.new(@no_encoding_decl_file, :encoding => "iso-8859-1")
116
+ reader.each do |product|
117
+ if RUBY_VERSION >= "1.9"
118
+ utf8 = Encoding.find("utf-8")
119
+ expect(product.contributors[0].person_name_inverted.encoding).to be_eql(utf8)
120
+ end
121
+
122
+ expect(product.contributors[0].person_name_inverted).to be_eql("Melo,Patr¡cia")
123
+ end
124
+ end
125
+
126
+ it "should transparently convert a utf-16 file to utf-8" do
127
+ reader = ONIX2::Reader.new(@utf_16_file)
128
+ product = nil
129
+ reader.each do |p|
130
+ product = p
131
+ end
132
+
133
+ # ROXML appears to munge the string encodings
134
+ if RUBY_VERSION >= "1.9"
135
+ utf8 = Encoding.find("utf-8")
136
+ expect(product.contributors[0].person_name_inverted.encoding).to be_eql(utf8)
137
+ end
138
+
139
+ expect(product.contributors[0].person_name_inverted).to be_eql("Küng, Hans")
140
+ end
141
+
142
+ it "should support returning an APAProduct using deprecated API" do
143
+ reader = ONIX2::Reader.new(@file1, ONIX2::APAProduct)
144
+ reader.each do |product|
145
+ expect(product).to be_a_kind_of(ONIX2::APAProduct)
146
+ end
147
+ end
148
+
149
+ it "should support returning an APAProduct using new API" do
150
+ reader = ONIX2::Reader.new(@file1, :product_class => ONIX2::APAProduct)
151
+ reader.each do |product|
152
+ expect(product).to be_a_kind_of(ONIX2::APAProduct)
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe "ONIX2::SalesRestriction" do
6
+
7
+ Given(:doc) { load_xml "sales_restriction.xml" }
8
+
9
+ describe "should correctly convert to a string" do
10
+ Given(:sr) { ONIX2::SalesRestriction.from_xml(doc) }
11
+ Then { sr.to_xml.to_s.start_with? "<SalesRestriction>" }
12
+ end
13
+
14
+ describe "should provide read access to first level attributes" do
15
+ Given(:sr) { ONIX2::SalesRestriction.from_xml(doc) }
16
+ Then { sr.sales_restriction_type == 0 }
17
+ end
18
+
19
+ context "should provide write access to first level attributes" do
20
+ Given(:sr) { ONIX2::SalesRestriction.new }
21
+ describe :sales_restriction_type= do
22
+ When { sr.sales_restriction_type = 1 }
23
+ Then { sr.to_xml.to_s.include? "<SalesRestrictionType>01</SalesRestrictionType>" }
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ONIX2::SenderIdentifier do
6
+
7
+ Given(:doc) { load_xml "sender_identifier.xml" }
8
+
9
+ describe "should correctly convert to a string" do
10
+ Given(:id) { ONIX2::SenderIdentifier.from_xml(doc) }
11
+ Then { id.to_xml.to_s.start_with? "<SenderIdentifier>" }
12
+ end
13
+
14
+ describe "should provide read access to first level attributes" do
15
+ Given(:id) { ONIX2::SenderIdentifier.from_xml(doc) }
16
+
17
+ Then { id.sender_id_type == 1 }
18
+ Then { id.id_value == "123456" }
19
+ end
20
+
21
+ context "should provide write access to first level attributes" do
22
+ Given(:id) { ONIX2::SenderIdentifier.new }
23
+ describe :sender_id_type= do
24
+ When { id.sender_id_type = 1 }
25
+ Then { id.to_xml.to_s.include? "<SenderIDType>01</SenderIDType>" }
26
+ end
27
+ describe :id_value= do
28
+ When { id.id_value = "54321" }
29
+ Then { id.to_xml.to_s.include? "<IDValue>54321</IDValue>" }
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ONIX2::SeriesIdentifier do
6
+
7
+ Given(:doc) { load_xml "series_identifier.xml" }
8
+
9
+ describe "should correctly convert to a string" do
10
+ Given(:series) { ONIX2::SeriesIdentifier.from_xml(doc) }
11
+ Then { series.to_xml.to_s.start_with? "<SeriesIdentifier>" }
12
+ end
13
+
14
+ describe "should provide read access to first level attributes" do
15
+ Given(:series) { ONIX2::SeriesIdentifier.from_xml(doc) }
16
+
17
+ Then { series.series_id_type == 1 }
18
+ Then { series.id_value == "10001" }
19
+ end
20
+
21
+ context "should provide write access to first level attributes" do
22
+ Given(:series) { ONIX2::SeriesIdentifier.new }
23
+ describe :series_id_type= do
24
+ When { series.series_id_type = 9 }
25
+ Then { series.to_xml.to_s.include? "<SeriesIDType>09</SeriesIDType>" }
26
+ end
27
+ describe :id_value= do
28
+ When { series.id_value = 999 }
29
+ Then { series.to_xml.to_s.include? "<IDValue>999</IDValue>" }
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,47 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ONIX2::Series do
6
+
7
+ Given(:doc) { load_xml "series.xml" }
8
+
9
+ describe "should correctly convert to a string" do
10
+ Given(:series) { ONIX2::Series.from_xml(doc) }
11
+
12
+ Then{ series.to_xml.to_s.start_with? "<Series>" }
13
+ end
14
+
15
+ describe "should provide read access to first level attributes" do
16
+ Given(:series) { ONIX2::Series.from_xml(doc) }
17
+
18
+ Then{ series.title_of_series == "Citizens and Their Governments" }
19
+ end
20
+
21
+ context "should provide write access to first level attributes" do
22
+ Given(:series) { ONIX2::Series.new }
23
+ describe :title_of_series= do
24
+ When { series.title_of_series = "Cool Science Careers" }
25
+ Then { series.to_xml.to_s.include? "<TitleOfSeries>Cool Science Careers</TitleOfSeries>" }
26
+ end
27
+ end
28
+
29
+ describe "should provide read access to series IDs" do
30
+ Given(:series) { ONIX2::Series.from_xml(doc) }
31
+ Then { series.series_identifiers.size == 2 }
32
+ end
33
+
34
+ context "should provide write access to series IDs" do
35
+ Given(:series_identifier1) { ONIX2::SeriesIdentifier.new(series_id_type: 1, id_value: 10001) }
36
+ Given(:series_identifier2) { ONIX2::SeriesIdentifier.new(series_id_type: 2, id_value: 20002) }
37
+ Given(:series) { ONIX2::Series.new }
38
+
39
+ describe :series_identifiers= do
40
+ When { series.series_identifiers = [series_identifier1, series_identifier2] }
41
+
42
+ Then { series.to_xml.to_s.include? "<SeriesIDType>01</SeriesIDType>" }
43
+ Then { series.to_xml.to_s.include? "<IDValue>20002</IDValue>" }
44
+ end
45
+ end
46
+
47
+ end
@@ -0,0 +1,15 @@
1
+ # coding: utf-8
2
+
3
+ require "rubygems"
4
+ require "bundler/setup"
5
+
6
+ require "pry"
7
+ require 'date'
8
+ require 'stringio'
9
+ require 'rubygems'
10
+ require 'onix2'
11
+ require 'rspec/given'
12
+
13
+ def load_xml(file)
14
+ File.read(File.join(File.dirname(__FILE__), "..", "data", file))
15
+ end
@@ -0,0 +1,39 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ONIX2::Stock do
6
+
7
+ Given(:doc) { load_xml "stock.xml" }
8
+
9
+ describe "should correctly convert to a string" do
10
+ Given(:s) { ONIX2::Stock.from_xml(doc) }
11
+ Then { s.to_xml.to_s.start_with? "<Stock>" }
12
+ end
13
+
14
+ describe "should provide read access to first level attributes" do
15
+ Given(:s) { ONIX2::Stock.from_xml(doc) }
16
+
17
+ # note that these fields *should* be numeric according to the ONIX spec,
18
+ # however heaps of ONIX files in the wild have strings there.
19
+ Then { s.on_hand == "2862" }
20
+ Then { s.on_order == "0" }
21
+ end
22
+
23
+ context "should provide write access to first level attributes" do
24
+ Given(:s) { ONIX2::Stock.new }
25
+ describe :on_hand= do
26
+ When { s.on_hand = "123" }
27
+ Then { s.to_xml.to_s.include? "<OnHand>123</OnHand>" }
28
+ end
29
+ describe :on_order= do
30
+ When { s.on_order = "011" }
31
+ Then { s.to_xml.to_s.include? "<OnOrder>011</OnOrder>" }
32
+ end
33
+ describe :on_order= do
34
+ When { s.on_order = 11 }
35
+ Then { s.to_xml.to_s.include? "<OnOrder>11</OnOrder>" }
36
+ end
37
+ end
38
+
39
+ end
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ONIX2::Subject do
6
+
7
+ Given(:doc) { load_xml "subject.xml" }
8
+
9
+ describe "should correctly convert to a string" do
10
+ Given(:sub) { ONIX2::Subject.from_xml(doc) }
11
+ Then { sub.to_xml.to_s.start_with? "<Subject>" }
12
+ end
13
+
14
+ describe "should provide read access to first level attributes" do
15
+ Given(:sub) { ONIX2::Subject.from_xml(doc) }
16
+
17
+ Then { sub.subject_scheme_id == 3 }
18
+ Then { sub.subject_scheme_name == "RBA Subjects" }
19
+ Then { sub.subject_code == "AABB" }
20
+ end
21
+
22
+ context "should provide write access to first level attributes" do
23
+ Given(:sub) { ONIX2::Subject.new }
24
+ describe :subject_scheme_id= do
25
+ When { sub.subject_scheme_id = 2 }
26
+ Then { sub.to_xml.to_s.include? "<SubjectSchemeIdentifier>02</SubjectSchemeIdentifier>" }
27
+ end
28
+ describe :subject_code= do
29
+ When { sub.subject_code = "ABCD" }
30
+ Then { sub.to_xml.to_s.include? "<SubjectCode>ABCD</SubjectCode>" }
31
+ end
32
+ end
33
+
34
+ end
@@ -0,0 +1,97 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ONIX2::SupplyDetail do
6
+
7
+ Given(:doc) { load_xml "supply_detail.xml" }
8
+
9
+ describe "should correctly convert to a string" do
10
+ Given(:sd) { ONIX2::SupplyDetail.from_xml(doc) }
11
+ Then { sd.to_xml.to_s.start_with? "<SupplyDetail>" }
12
+ end
13
+
14
+ describe "should provide read access to first level attributes" do
15
+ Given(:sd) { ONIX2::SupplyDetail.from_xml(doc) }
16
+
17
+ Then { sd.supplier_name == "Rainbow Book Agencies" }
18
+ Then { sd.product_availability == 21 }
19
+ Then { sd.stock.is_a? Array }
20
+ Then { sd.stock.size == 1 }
21
+ Then { sd.pack_quantity == 16 }
22
+ Then { sd.prices.is_a? Array }
23
+ Then { sd.prices.size == 1 }
24
+ end
25
+
26
+ context "should provide write access to first level attributes" do
27
+ Given(:sd) { ONIX2::SupplyDetail.new }
28
+ describe :supplier_name= do
29
+ When { sd.supplier_name = "RBA" }
30
+ Then { sd.to_xml.to_s.include? "<SupplierName>RBA</SupplierName>" }
31
+ end
32
+ describe :supplier_role= do
33
+ When { sd.supplier_role = 1 }
34
+ Then { sd.to_xml.to_s.include? "<SupplierRole>01</SupplierRole>" }
35
+ end
36
+ describe :availability_status_code= do
37
+ When { sd.availability_status_code = 2 }
38
+ Then { sd.to_xml.to_s.include? "<AvailabilityStatusCode>02</AvailabilityStatusCode>" }
39
+ end
40
+ describe :product_availability= do
41
+ When { sd.product_availability = 3 }
42
+ Then { sd.to_xml.to_s.include? "<ProductAvailability>03</ProductAvailability>" }
43
+ end
44
+ describe :pack_quantity= do
45
+ When { sd.pack_quantity = 12 }
46
+ Then { sd.to_xml.to_s.include? "<PackQuantity>12</PackQuantity>" }
47
+ end
48
+ end
49
+
50
+ describe "should provide read access to website IDs" do
51
+ Given(:sd) { ONIX2::SupplyDetail.from_xml(doc) }
52
+ Then { sd.websites.size == 2 }
53
+ end
54
+
55
+ context "should provide write access to website IDs" do
56
+ Given(:website) { ONIX2::Website.new(website_role: 1) }
57
+ Given(:sd) { ONIX2::SupplyDetail.new }
58
+
59
+ describe :series_identifiers= do
60
+ When { sd.websites = [website] }
61
+ Then { sd.to_xml.to_s.include? "<WebsiteRole>01</WebsiteRole>" }
62
+ end
63
+ end
64
+
65
+ describe "should provide read access to stock IDs" do
66
+ Given(:sd) { ONIX2::SupplyDetail.from_xml(doc) }
67
+ Then { sd.stock.size == 1 }
68
+ end
69
+
70
+ context "should provide write access to stock IDs" do
71
+ Given(:stock1) { ONIX2::Stock.new(on_hand: 1251) }
72
+ Given(:stock2) { ONIX2::Stock.new(on_hand: 52458, on_order: 0) }
73
+ Given(:sd) { ONIX2::SupplyDetail.new }
74
+
75
+ describe :series_identifiers= do
76
+ When { sd.stock = [stock1, stock2] }
77
+ Then { sd.to_xml.to_s.include? "<OnHand>1251</OnHand>" }
78
+ Then { sd.to_xml.to_s.include? "<OnOrder>0</OnOrder>" }
79
+ end
80
+ end
81
+
82
+ describe "should provide read access to price IDs" do
83
+ Given(:sd) { ONIX2::SupplyDetail.from_xml(doc) }
84
+ Then { sd.prices.size == 1 }
85
+ end
86
+
87
+ context "should provide write access to price IDs" do
88
+ Given(:price) { ONIX2::Price.new(price_amount: BigDecimal.new("0.59")) }
89
+ Given(:sd) { ONIX2::SupplyDetail.new }
90
+
91
+ describe :series_identifiers= do
92
+ When { sd.prices = [price] }
93
+ Then { sd.to_xml.to_s.include? "<PriceAmount>0.59</PriceAmount>" }
94
+ end
95
+ end
96
+
97
+ end