im_onix 1.1.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (311) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -6
  3. data/README.md +1 -1
  4. data/bin/html_codelist_to_yml.rb +10 -6
  5. data/bin/onix_bench.rb +25 -4
  6. data/bin/onix_pp.rb +26 -26
  7. data/bin/onix_serialize.rb +12 -16
  8. data/data/codelists/codelist-1.yml +4 -5
  9. data/data/codelists/codelist-10.yml +13 -11
  10. data/data/codelists/codelist-100.yml +1 -0
  11. data/data/codelists/codelist-102.yml +3 -2
  12. data/data/codelists/codelist-11.yml +2 -2
  13. data/data/codelists/codelist-12.yml +8 -3
  14. data/data/codelists/codelist-121.yml +46 -17
  15. data/data/codelists/codelist-13.yml +3 -0
  16. data/data/codelists/codelist-139.yml +83 -9
  17. data/data/codelists/codelist-141.yml +4 -4
  18. data/data/codelists/codelist-142.yml +2 -2
  19. data/data/codelists/codelist-143.yml +11 -0
  20. data/data/codelists/codelist-144.yml +2 -2
  21. data/data/codelists/codelist-145.yml +4 -1
  22. data/data/codelists/codelist-147.yml +18 -2
  23. data/data/codelists/codelist-149.yml +1 -0
  24. data/data/codelists/codelist-15.yml +2 -1
  25. data/data/codelists/codelist-150.yml +46 -26
  26. data/data/codelists/codelist-151.yml +4 -1
  27. data/data/codelists/codelist-153.yml +19 -4
  28. data/data/codelists/codelist-154.yml +4 -2
  29. data/data/codelists/codelist-155.yml +3 -1
  30. data/data/codelists/codelist-156.yml +1 -0
  31. data/data/codelists/codelist-158.yml +18 -0
  32. data/data/codelists/codelist-159.yml +1 -1
  33. data/data/codelists/codelist-16.yml +3 -0
  34. data/data/codelists/codelist-160.yml +2 -0
  35. data/data/codelists/codelist-162.yml +2 -0
  36. data/data/codelists/codelist-163.yml +8 -3
  37. data/data/codelists/codelist-165.yml +3 -0
  38. data/data/codelists/codelist-166.yml +7 -2
  39. data/data/codelists/codelist-167.yml +6 -0
  40. data/data/codelists/codelist-168.yml +1 -0
  41. data/data/codelists/codelist-169.yml +2 -2
  42. data/data/codelists/codelist-17.yml +20 -2
  43. data/data/codelists/codelist-170.yml +5 -1
  44. data/data/codelists/codelist-171.yml +1 -0
  45. data/data/codelists/codelist-173.yml +1 -1
  46. data/data/codelists/codelist-175.yml +113 -35
  47. data/data/codelists/codelist-176.yml +2 -2
  48. data/data/codelists/codelist-177.yml +1 -0
  49. data/data/codelists/codelist-178.yml +6 -0
  50. data/data/codelists/codelist-179.yml +1 -0
  51. data/data/codelists/codelist-18.yml +3 -1
  52. data/data/codelists/codelist-184.yml +1 -0
  53. data/data/codelists/codelist-19.yml +5 -4
  54. data/data/codelists/codelist-196.yml +16 -4
  55. data/data/codelists/codelist-197.yml +2 -0
  56. data/data/codelists/codelist-198.yml +7 -0
  57. data/data/codelists/codelist-2.yml +6 -6
  58. data/data/codelists/codelist-20.yml +10 -1
  59. data/data/codelists/codelist-203.yml +1 -1
  60. data/data/codelists/codelist-204.yml +4 -0
  61. data/data/codelists/codelist-21.yml +24 -19
  62. data/data/codelists/codelist-215.yml +9 -0
  63. data/data/codelists/codelist-216.yml +11 -0
  64. data/data/codelists/codelist-217.yml +9 -0
  65. data/data/codelists/codelist-218.yml +5 -0
  66. data/data/codelists/codelist-219.yml +5 -0
  67. data/data/codelists/codelist-22.yml +5 -4
  68. data/data/codelists/codelist-220.yml +10 -0
  69. data/data/codelists/codelist-221.yml +6 -0
  70. data/data/codelists/codelist-222.yml +4 -0
  71. data/data/codelists/codelist-223.yml +4 -0
  72. data/data/codelists/codelist-224.yml +8 -0
  73. data/data/codelists/codelist-225.yml +4 -0
  74. data/data/codelists/codelist-226.yml +7 -0
  75. data/data/codelists/codelist-227.yml +21 -0
  76. data/data/codelists/codelist-228.yml +3 -0
  77. data/data/codelists/codelist-229.yml +5 -0
  78. data/data/codelists/codelist-23.yml +5 -3
  79. data/data/codelists/codelist-230.yml +8 -0
  80. data/data/codelists/codelist-238.yml +23 -0
  81. data/data/codelists/codelist-239.yml +4 -0
  82. data/data/codelists/codelist-24.yml +3 -0
  83. data/data/codelists/codelist-240.yml +6 -0
  84. data/data/codelists/codelist-241.yml +9 -0
  85. data/data/codelists/codelist-242.yml +24 -0
  86. data/data/codelists/codelist-243.yml +9 -0
  87. data/data/codelists/codelist-244.yml +3 -0
  88. data/data/codelists/codelist-245.yml +5 -0
  89. data/data/codelists/codelist-246.yml +4 -0
  90. data/data/codelists/codelist-247.yml +4 -0
  91. data/data/codelists/codelist-25.yml +4 -2
  92. data/data/codelists/codelist-26.yml +28 -18
  93. data/data/codelists/codelist-27.yml +35 -19
  94. data/data/codelists/codelist-28.yml +2 -1
  95. data/data/codelists/codelist-29.yml +8 -3
  96. data/data/codelists/codelist-3.yml +5 -2
  97. data/data/codelists/codelist-30.yml +6 -2
  98. data/data/codelists/codelist-32.yml +7 -0
  99. data/data/codelists/codelist-33.yml +6 -2
  100. data/data/codelists/codelist-34.yml +0 -11
  101. data/data/codelists/codelist-38.yml +1 -1
  102. data/data/codelists/codelist-39.yml +2 -2
  103. data/data/codelists/codelist-41.yml +4 -3
  104. data/data/codelists/codelist-42.yml +0 -12
  105. data/data/codelists/codelist-43.yml +3 -1
  106. data/data/codelists/codelist-44.yml +16 -3
  107. data/data/codelists/codelist-45.yml +8 -3
  108. data/data/codelists/codelist-46.yml +4 -4
  109. data/data/codelists/codelist-48.yml +20 -2
  110. data/data/codelists/codelist-49.yml +268 -1
  111. data/data/codelists/codelist-5.yml +6 -3
  112. data/data/codelists/codelist-51.yml +11 -5
  113. data/data/codelists/codelist-55.yml +2 -2
  114. data/data/codelists/codelist-57.yml +1 -0
  115. data/data/codelists/codelist-58.yml +14 -12
  116. data/data/codelists/codelist-59.yml +10 -1
  117. data/data/codelists/codelist-6.yml +39 -39
  118. data/data/codelists/codelist-60.yml +1 -1
  119. data/data/codelists/codelist-62.yml +2 -1
  120. data/data/codelists/codelist-64.yml +3 -2
  121. data/data/codelists/codelist-65.yml +1 -0
  122. data/data/codelists/codelist-68.yml +2 -2
  123. data/data/codelists/codelist-69.yml +2 -2
  124. data/data/codelists/codelist-7.yml +21 -17
  125. data/data/codelists/codelist-71.yml +16 -6
  126. data/data/codelists/codelist-73.yml +7 -5
  127. data/data/codelists/codelist-74.yml +59 -31
  128. data/data/codelists/codelist-75.yml +1 -1
  129. data/data/codelists/codelist-76.yml +3 -3
  130. data/data/codelists/codelist-78.yml +52 -26
  131. data/data/codelists/codelist-79.yml +16 -7
  132. data/data/codelists/codelist-8.yml +3 -3
  133. data/data/codelists/codelist-80.yml +6 -5
  134. data/data/codelists/codelist-81.yml +8 -5
  135. data/data/codelists/codelist-83.yml +3 -2
  136. data/data/codelists/codelist-85.yml +1 -1
  137. data/data/codelists/codelist-9.yml +7 -3
  138. data/data/codelists/codelist-90.yml +2 -2
  139. data/data/codelists/codelist-91.yml +11 -11
  140. data/data/codelists/codelist-92.yml +1 -1
  141. data/data/codelists/codelist-93.yml +9 -6
  142. data/data/codelists/codelist-96.yml +45 -40
  143. data/data/codelists/codelist-98.yml +6 -3
  144. data/data/codelists/codelist-99.yml +8 -5
  145. data/data/onix21/codelists/codelist-1.yml +2 -2
  146. data/data/onix21/codelists/codelist-10.yml +12 -12
  147. data/data/onix21/codelists/codelist-11.yml +2 -2
  148. data/data/onix21/codelists/codelist-12.yml +3 -3
  149. data/data/onix21/codelists/codelist-121.yml +9 -9
  150. data/data/onix21/codelists/codelist-13.yml +1 -1
  151. data/data/onix21/codelists/codelist-139.yml +6 -6
  152. data/data/onix21/codelists/codelist-141.yml +4 -4
  153. data/data/onix21/codelists/codelist-142.yml +2 -2
  154. data/data/onix21/codelists/codelist-145.yml +2 -2
  155. data/data/onix21/codelists/codelist-147.yml +2 -2
  156. data/data/onix21/codelists/codelist-148.yml +1 -1
  157. data/data/onix21/codelists/codelist-149.yml +1 -1
  158. data/data/onix21/codelists/codelist-15.yml +1 -1
  159. data/data/onix21/codelists/codelist-150.yml +23 -23
  160. data/data/onix21/codelists/codelist-151.yml +1 -1
  161. data/data/onix21/codelists/codelist-153.yml +3 -3
  162. data/data/onix21/codelists/codelist-154.yml +2 -2
  163. data/data/onix21/codelists/codelist-155.yml +1 -1
  164. data/data/onix21/codelists/codelist-158.yml +2 -2
  165. data/data/onix21/codelists/codelist-159.yml +1 -1
  166. data/data/onix21/codelists/codelist-163.yml +2 -2
  167. data/data/onix21/codelists/codelist-166.yml +1 -1
  168. data/data/onix21/codelists/codelist-169.yml +2 -2
  169. data/data/onix21/codelists/codelist-17.yml +2 -2
  170. data/data/onix21/codelists/codelist-173.yml +1 -1
  171. data/data/onix21/codelists/codelist-175.yml +23 -23
  172. data/data/onix21/codelists/codelist-176.yml +2 -2
  173. data/data/onix21/codelists/codelist-18.yml +1 -1
  174. data/data/onix21/codelists/codelist-196.yml +4 -4
  175. data/data/onix21/codelists/codelist-2.yml +6 -6
  176. data/data/onix21/codelists/codelist-203.yml +1 -1
  177. data/data/onix21/codelists/codelist-21.yml +1 -1
  178. data/data/onix21/codelists/codelist-216.yml +2 -2
  179. data/data/onix21/codelists/codelist-218.yml +1 -1
  180. data/data/onix21/codelists/codelist-22.yml +3 -3
  181. data/data/onix21/codelists/codelist-23.yml +2 -2
  182. data/data/onix21/codelists/codelist-25.yml +2 -2
  183. data/data/onix21/codelists/codelist-26.yml +18 -18
  184. data/data/onix21/codelists/codelist-27.yml +18 -18
  185. data/data/onix21/codelists/codelist-28.yml +1 -1
  186. data/data/onix21/codelists/codelist-29.yml +3 -3
  187. data/data/onix21/codelists/codelist-3.yml +2 -2
  188. data/data/onix21/codelists/codelist-30.yml +1 -1
  189. data/data/onix21/codelists/codelist-32.yml +1 -1
  190. data/data/onix21/codelists/codelist-33.yml +2 -2
  191. data/data/onix21/codelists/codelist-34.yml +2 -2
  192. data/data/onix21/codelists/codelist-38.yml +1 -1
  193. data/data/onix21/codelists/codelist-39.yml +2 -2
  194. data/data/onix21/codelists/codelist-41.yml +3 -3
  195. data/data/onix21/codelists/codelist-43.yml +1 -1
  196. data/data/onix21/codelists/codelist-44.yml +2 -2
  197. data/data/onix21/codelists/codelist-45.yml +4 -4
  198. data/data/onix21/codelists/codelist-46.yml +3 -3
  199. data/data/onix21/codelists/codelist-48.yml +2 -2
  200. data/data/onix21/codelists/codelist-49.yml +12 -12
  201. data/data/onix21/codelists/codelist-5.yml +3 -3
  202. data/data/onix21/codelists/codelist-51.yml +3 -3
  203. data/data/onix21/codelists/codelist-55.yml +2 -2
  204. data/data/onix21/codelists/codelist-58.yml +10 -10
  205. data/data/onix21/codelists/codelist-59.yml +2 -2
  206. data/data/onix21/codelists/codelist-6.yml +36 -36
  207. data/data/onix21/codelists/codelist-60.yml +1 -1
  208. data/data/onix21/codelists/codelist-62.yml +1 -1
  209. data/data/onix21/codelists/codelist-64.yml +2 -2
  210. data/data/onix21/codelists/codelist-68.yml +2 -2
  211. data/data/onix21/codelists/codelist-69.yml +2 -2
  212. data/data/onix21/codelists/codelist-7.yml +17 -17
  213. data/data/onix21/codelists/codelist-71.yml +2 -2
  214. data/data/onix21/codelists/codelist-73.yml +5 -5
  215. data/data/onix21/codelists/codelist-74.yml +28 -28
  216. data/data/onix21/codelists/codelist-75.yml +1 -1
  217. data/data/onix21/codelists/codelist-76.yml +3 -3
  218. data/data/onix21/codelists/codelist-78.yml +24 -24
  219. data/data/onix21/codelists/codelist-79.yml +6 -6
  220. data/data/onix21/codelists/codelist-8.yml +3 -3
  221. data/data/onix21/codelists/codelist-80.yml +5 -5
  222. data/data/onix21/codelists/codelist-81.yml +4 -4
  223. data/data/onix21/codelists/codelist-83.yml +2 -2
  224. data/data/onix21/codelists/codelist-85.yml +1 -1
  225. data/data/onix21/codelists/codelist-9.yml +3 -3
  226. data/data/onix21/codelists/codelist-90.yml +2 -2
  227. data/data/onix21/codelists/codelist-91.yml +6 -6
  228. data/data/onix21/codelists/codelist-92.yml +1 -1
  229. data/data/onix21/codelists/codelist-93.yml +6 -6
  230. data/data/onix21/codelists/codelist-96.yml +1 -1
  231. data/data/onix21/codelists/codelist-98.yml +2 -2
  232. data/data/onix21/codelists/codelist-99.yml +4 -4
  233. data/doc-src/handlers.rb +32 -2
  234. data/im_onix.gemspec +3 -1
  235. data/lib/onix/addressee.rb +5 -3
  236. data/lib/onix/ancillary_content.rb +7 -0
  237. data/lib/onix/audience.rb +7 -0
  238. data/lib/onix/audience_range.rb +10 -0
  239. data/lib/onix/barcode.rb +6 -0
  240. data/lib/onix/builder.rb +197 -0
  241. data/lib/onix/cited_content.rb +15 -0
  242. data/lib/onix/code.rb +322 -42
  243. data/lib/onix/collateral_detail.rb +9 -13
  244. data/lib/onix/collection.rb +14 -4
  245. data/lib/onix/collection_sequence.rb +3 -3
  246. data/lib/onix/comparison_product_price.rb +17 -0
  247. data/lib/onix/complexity.rb +6 -0
  248. data/lib/onix/content_detail.rb +7 -0
  249. data/lib/onix/content_item.rb +38 -0
  250. data/lib/onix/contributor.rb +56 -34
  251. data/lib/onix/contributor_place.rb +12 -0
  252. data/lib/onix/copyright_statement.rb +8 -0
  253. data/lib/onix/date.rb +107 -56
  254. data/lib/onix/descriptive_detail.rb +98 -49
  255. data/lib/onix/discount.rb +9 -0
  256. data/lib/onix/discount_coded.rb +3 -3
  257. data/lib/onix/entity.rb +22 -37
  258. data/lib/onix/epub_license.rb +8 -0
  259. data/lib/onix/epub_license_expression.rb +7 -0
  260. data/lib/onix/epub_usage_constraint.rb +5 -3
  261. data/lib/onix/epub_usage_limit.rb +2 -2
  262. data/lib/onix/error.rb +2 -0
  263. data/lib/onix/extent.rb +4 -3
  264. data/lib/onix/header.rb +17 -0
  265. data/lib/onix/helper.rb +3 -12
  266. data/lib/onix/identifier.rb +81 -57
  267. data/lib/onix/language.rb +5 -2
  268. data/lib/onix/market.rb +2 -1
  269. data/lib/onix/market_publishing_detail.rb +14 -3
  270. data/lib/onix/measure.rb +7 -0
  271. data/lib/onix/onix21.rb +26 -24
  272. data/lib/onix/onix_message.rb +40 -48
  273. data/lib/onix/page_run.rb +6 -0
  274. data/lib/onix/price.rb +44 -11
  275. data/lib/onix/prize.rb +11 -0
  276. data/lib/onix/product.rb +45 -17
  277. data/lib/onix/product_classification.rb +8 -0
  278. data/lib/onix/product_contact.rb +11 -0
  279. data/lib/onix/product_part.rb +25 -10
  280. data/lib/onix/{product_supplies_extractor.rb → product_supplies_methods.rb} +3 -3
  281. data/lib/onix/product_supply.rb +4 -3
  282. data/lib/onix/professional_affiliation.rb +6 -0
  283. data/lib/onix/publisher_representative.rb +11 -0
  284. data/lib/onix/publishing_detail.rb +22 -9
  285. data/lib/onix/related_material.rb +6 -2
  286. data/lib/onix/related_product.rb +14 -6
  287. data/lib/onix/related_work.rb +5 -3
  288. data/lib/onix/resource_feature.rb +9 -0
  289. data/lib/onix/resource_version.rb +85 -0
  290. data/lib/onix/resource_version_feature.rb +22 -0
  291. data/lib/onix/returns_conditions.rb +8 -0
  292. data/lib/onix/review_rating.rb +7 -0
  293. data/lib/onix/sales_outlet.rb +12 -2
  294. data/lib/onix/sales_restriction.rb +7 -16
  295. data/lib/onix/sales_rights.rb +6 -3
  296. data/lib/onix/sender.rb +5 -5
  297. data/lib/onix/serializer.rb +131 -87
  298. data/lib/onix/subject.rb +11 -6
  299. data/lib/onix/subset.rb +255 -104
  300. data/lib/onix/supplier_own_coding.rb +7 -0
  301. data/lib/onix/supply_contact.rb +9 -0
  302. data/lib/onix/supply_detail.rb +28 -5
  303. data/lib/onix/supporting_resource.rb +10 -113
  304. data/lib/onix/tax.rb +11 -5
  305. data/lib/onix/territory.rb +8 -4
  306. data/lib/onix/text_content.rb +13 -0
  307. data/lib/onix/text_item.rb +12 -0
  308. data/lib/onix/title_detail.rb +4 -3
  309. data/lib/onix/title_element.rb +16 -13
  310. data/lib/onix/website.rb +4 -3
  311. metadata +89 -3
@@ -4,6 +4,7 @@ require 'time'
4
4
  require 'onix/subset'
5
5
  require 'onix/helper'
6
6
  require 'onix/code'
7
+ require 'onix/header'
7
8
  require 'onix/sender'
8
9
  require 'onix/addressee'
9
10
  require 'onix/product'
@@ -11,11 +12,22 @@ require 'onix/product'
11
12
  require 'onix/onix21'
12
13
 
13
14
  module ONIX
14
- class ONIXMessage < Subset
15
- attr_accessor :sender, :adressee, :sent_date_time,
16
- :default_language_of_text, :default_currency_code,
17
- :products,
18
- :release
15
+ class ONIXMessage < SubsetDSL
16
+ extend Forwardable
17
+ attr_accessor :release
18
+
19
+ element "Header", :subset, :cardinality => 1
20
+ elements "Product", :subset, :cardinality => 0..n
21
+
22
+ def_delegator :header, :sender
23
+ def_delegator :header, :addressee
24
+ def_delegator :header, :default_language_of_text
25
+ def_delegator :header, :default_currency_code
26
+ def_delegator :header, :sent_date_time
27
+
28
+ def header
29
+ @header || Header.new
30
+ end
19
31
 
20
32
  def initialize
21
33
  @products = []
@@ -53,6 +65,8 @@ module ONIX
53
65
  product.identifiers.each do |ident|
54
66
  @vault[ident.uniq_id] = product
55
67
  end
68
+ product.default_language_of_text = self.default_language_of_text if @header
69
+ product.default_currency_code = self.default_currency_code if @header
56
70
  end
57
71
 
58
72
  @products.each do |product|
@@ -75,6 +89,7 @@ module ONIX
75
89
  end
76
90
 
77
91
  # open with arg detection
92
+ # @param [String, File] arg
78
93
  def open(arg, force_encoding = nil)
79
94
  data = ONIX::Helper.arg_to_data(arg)
80
95
 
@@ -90,6 +105,7 @@ module ONIX
90
105
  end
91
106
 
92
107
  # release as an integer eg: 210, 300, 301
108
+ # @return [Number]
93
109
  def version
94
110
  if @release
95
111
  @release.gsub(/\./, "").to_i * 10 ** (3 - @release.scan(".").length - 1)
@@ -97,6 +113,7 @@ module ONIX
97
113
  end
98
114
 
99
115
  # detect ONIX version from XML tags
116
+ # @return [String]
100
117
  def detect_release(element)
101
118
  if element
102
119
  return "3.0" if element.search("//DescriptiveDetail").length > 0
@@ -117,57 +134,32 @@ module ONIX
117
134
  end
118
135
  end
119
136
 
137
+ def product_klass
138
+ self.version >= 300 ? Product : ONIX21::Product
139
+ end
140
+
141
+ def get_class(name)
142
+ if name == "Product"
143
+ self.product_klass
144
+ else
145
+ super(name)
146
+ end
147
+ end
148
+
120
149
  # parse filename or file
150
+ # @param [String, File] arg
121
151
  def parse(arg, force_encoding = nil, force_release = nil)
122
- xml = open(arg, force_encoding)
123
152
  @products = []
153
+ xml = open(arg, force_encoding)
124
154
  root = xml.root
125
155
  set_release_from_xml(root, force_release)
126
156
  case root
127
- when tag_match("ONIXMessage")
128
- root.elements.each do |e|
129
- case e
130
- when tag_match("Header")
131
- e.elements.each do |t|
132
- case t
133
- when tag_match("Sender")
134
- @sender = Sender.parse(t)
135
- when tag_match("Addressee")
136
- @addressee = Addressee.parse(t)
137
- when tag_match("SentDateTime")
138
- tm = t.text
139
- @sent_date_time = Time.strptime(tm, "%Y%m%dT%H%M%S") rescue Time.strptime(tm, "%Y%m%dT%H%M") rescue Time.strptime(tm, "%Y%m%d") rescue nil
140
- when tag_match("DefaultLanguageOfText")
141
- @default_language_of_text = LanguageCode.parse(t)
142
- when tag_match("DefaultCurrencyCode")
143
- @default_currency_code = t.text
144
- else
145
- unsupported(t)
146
- end
147
- end
148
- when tag_match("Product")
149
- product = nil
150
- if self.version >= 300
151
- product = Product.parse(e)
152
- else
153
- product = ONIX21::Product.parse(e)
154
- end
155
- product.default_language_of_text = @default_language_of_text
156
- product.default_currency_code = @default_currency_code
157
- @products << product
158
- end
159
- end
160
157
  when tag_match("Product")
161
- product = nil
162
- if self.version >= 300
163
- product = Product.parse(root)
164
- else
165
- product = ONIX21::Product.parse(root)
166
- end
167
- product.default_language_of_text = @default_language_of_text
168
- product.default_currency_code = @default_currency_code
169
- @products << product
158
+ @products << self.product_klass.parse(root)
159
+ else # ONIXMessage
160
+ super(root)
170
161
  end
162
+
171
163
  init_vault
172
164
  end
173
165
  end
@@ -0,0 +1,6 @@
1
+ module ONIX
2
+ class PageRun < SubsetDSL
3
+ element "FirstPageNumber", :text, :cardinality => 1
4
+ element "LastPageNumber", :text, :cardinality => 0..1
5
+ end
6
+ end
data/lib/onix/price.rb CHANGED
@@ -1,23 +1,56 @@
1
+ require 'onix/date'
1
2
  require 'onix/tax'
2
3
  require 'onix/discount_coded'
3
- require 'onix/date'
4
+ require 'onix/discount'
5
+ require 'onix/epub_license'
6
+ require 'onix/comparison_product_price'
4
7
 
5
8
  module ONIX
6
9
  class Price < SubsetDSL
7
- element "PriceType", :subset, :shortcut => :type
8
- element "PriceQualifier", :subset, :shortcut => :qualifier
9
- element "DiscountCoded", :subset, :shortcut => :discount
10
+ # elements "PriceIdentifier", :subset, :cardinality => 0..n
11
+
12
+
13
+ element "PriceType", :subset, :shortcut => :type, :cardinality => 0..1
14
+ element "PriceQualifier", :subset, :shortcut => :qualifier, :cardinality => 0..1
15
+ elements "EpubTechnicalProtection", :subset, :cardinality => 0..n
16
+
17
+ # elements "PriceConstraint", :subset, :cardinality => 0..n
18
+
19
+
20
+ element "EpubLicense", :subset, :cardinality => 0..1
21
+ element "PriceTypeDescription", :text, :cardinality => 0..n
22
+
23
+ # element "PricePer", :subset, :cardinality => 0..1
24
+ # elements "PriceCondition", :subset, :cardinality => 0..n
25
+ # element "MinimumOrderQuantity", :integer, :cardinality => 0..1
26
+ # elements "BatchBonus", :subset, :cardinality => 0..n
27
+
28
+
29
+ elements "DiscountCoded", :subset, :cardinality => 0..n
30
+ elements "Discount", :subset, :cardinality => 0..n
10
31
  element "PriceStatus", :subset
11
- elements "PriceDate", :subset, :shortcut => :dates
12
32
  element "PriceAmount", :float,
13
33
  {
14
- :shortcut => :amount,
15
- :parse_lambda => lambda { |v| (v * 100).round },
16
- :serialize_lambda => lambda { |v| v / 100.0 }
34
+ :shortcut => :amount,
35
+ :parse_lambda => lambda { |v| (v * 100).round },
36
+ :serialize_lambda => lambda { |v| format("%.2f", v / 100.0) },
37
+ :cardinality => 0..1
17
38
  }
18
- element "Tax", :subset
19
- element "CurrencyCode", :text, :shortcut => :currency
20
- element "Territory", :subset
39
+ element "Tax", :subset, :cardinality => 0..n
40
+ element "TaxExempt", :bool, :cardinality => 0..1
41
+ element "UnpricedItemType", :subset, :cardinality => 0..1
42
+ element "CurrencyCode", :text, :shortcut => :currency, :cardinality => 0..1
43
+ element "Territory", :subset, :cardinality => 0..1
44
+ elements "ComparisonProductPrice", :subset, :cardinality => 0..n
45
+ elements "PriceDate", :subset, :shortcut => :dates, :cardinality => 0..n
46
+ element "PrintedOnProduct", :subset, :cardinality => 0..1
47
+ element "PositionOnProduct", :subset, :cardinality => 0..1
48
+
49
+ # FIXME discount_coded != discount
50
+ # @return [DiscountCoded]
51
+ def discount
52
+ self.discount_codeds.first
53
+ end
21
54
 
22
55
  # @!group High level
23
56
 
data/lib/onix/prize.rb ADDED
@@ -0,0 +1,11 @@
1
+ module ONIX
2
+ class Prize < SubsetDSL
3
+ elements "PrizeName", :text, :cardinality => 1..n
4
+ element "PrizeYear", :text, :cardinality => 0..1
5
+ element "PrizeCountry", :subset, :klass => "CountryCode", :cardinality => 0..1
6
+ element "PrizeRegion", :subset, :klass => "RegionCode", :cardinality => 0..1
7
+ element "PrizeCode", :subset, :cardinality => 0..1
8
+ elements "PrizeStatement", :text, :cardinality => 0..n
9
+ elements "PrizeJury", :text, :cardinality => 0..n
10
+ end
11
+ end
data/lib/onix/product.rb CHANGED
@@ -2,33 +2,45 @@ require 'forwardable'
2
2
  require 'onix/helper'
3
3
  require 'onix/code'
4
4
  require 'onix/entity'
5
+ require 'onix/identifier'
6
+ require 'onix/barcode'
5
7
  require 'onix/descriptive_detail'
6
8
  require 'onix/publishing_detail'
7
9
  require 'onix/collateral_detail'
8
10
  require 'onix/related_material'
9
11
  require 'onix/supporting_resource'
10
12
  require 'onix/product_supply'
13
+ require 'onix/content_detail'
11
14
  require 'onix/territory'
12
15
  require 'onix/error'
13
- require 'onix/product_supplies_extractor'
16
+ require 'onix/product_supplies_methods'
14
17
 
15
18
  module ONIX
16
19
  class Product < SubsetDSL
17
20
  extend Forwardable
18
- include EanMethods
19
- include IsbnMethods
20
- include ProprietaryIdMethods
21
- include ProductSuppliesExtractor
22
-
23
- element "RecordReference", :text
24
- element "NotificationType", :subset
25
- element "RecordSourceName", :text
26
- elements "ProductIdentifier", :subset, :shortcut => :identifiers
27
- element "DescriptiveDetail", :subset
28
- element "CollateralDetail", :subset
29
- element "PublishingDetail", :subset
30
- element "RelatedMaterial", :subset
31
- elements "ProductSupply", :subset
21
+ include IdentifiersMethods::Ean
22
+ include IdentifiersMethods::Isbn
23
+ include IdentifiersMethods::ProprietaryId
24
+ include ProductSuppliesMethods
25
+
26
+ element "RecordReference", :text, :cardinality => 1
27
+ element "NotificationType", :subset, :cardinality => 1
28
+ elements "DeletionText", :text, :cardinality => 0..n
29
+ element "RecordSourceType", :subset, :cardinality => 0..1
30
+ elements "RecordSourceIdentifier", :subset, :cardinality => 0..n
31
+ element "RecordSourceName", :text, :cardinality => 0..1
32
+ elements "ProductIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
33
+ elements "Barcode", :subset, :cardinality => 0..n
34
+ element "DescriptiveDetail", :subset, :cardinality => 0..1
35
+ element "CollateralDetail", :subset, :cardinality => 0..1
36
+
37
+ # element "PromotionDetail", :subset, :cardinality => 0..1
38
+
39
+
40
+ element "ContentDetail", :subset, :cardinality => 0..1
41
+ element "PublishingDetail", :subset, :cardinality => 0..1
42
+ element "RelatedMaterial", :subset, :cardinality => 0..1
43
+ elements "ProductSupply", :subset, :cardinality => 0..n
32
44
 
33
45
  # default LanguageCode from ONIXMessage
34
46
  attr_accessor :default_language_of_text
@@ -91,7 +103,23 @@ module ONIX
91
103
  def_delegator :publishing_detail, :imprint
92
104
  def_delegator :publishing_detail, :publisher
93
105
 
106
+ # @return [CollateralDetail]
107
+ def collateral_detail
108
+ @collateral_detail || CollateralDetail.new
109
+ end
110
+
111
+ # @return [DescriptiveDetail]
112
+ def descriptive_detail
113
+ @descriptive_detail || DescriptiveDetail.new
114
+ end
115
+
116
+ # @return [PublishingDetail]
117
+ def publishing_detail
118
+ @publishing_detail || PublishingDetail.new
119
+ end
120
+
94
121
  # product LanguageCode of text
122
+ # @return [String]
95
123
  def language_of_text
96
124
  @descriptive_detail.language_of_text || @default_language_of_text
97
125
  end
@@ -274,7 +302,7 @@ module ONIX
274
302
  def excerpts
275
303
  return [] unless @collateral_detail && @collateral_detail.supporting_resources
276
304
 
277
- @collateral_detail.supporting_resources.sample_content.human_code_match(:resource_mode, ["Text", "Multimode"]).map do |resource|
305
+ @collateral_detail.supporting_resources.sample_content.human_code_match(:resource_mode, ["Text", "MultiMode"]).map do |resource|
278
306
  {
279
307
  :url => resource.versions.last.links.first.strip,
280
308
  :form => resource.versions.last.form.human,
@@ -328,7 +356,7 @@ module ONIX
328
356
  (!sales_restriction.end_date or sales_restriction.end_date >= Date.today)
329
357
  }.map { |sale_right|
330
358
  sale_right.sales_outlets.select { |sale_outlet|
331
- sale_outlet.identifier and sale_outlet.identifier.type.human == "OnixSalesOutletIdCode" }.map { |sale_outlet|
359
+ sale_outlet.identifier and sale_outlet.identifier.type.human == "OnixRetailSalesOutletIdCode" }.map { |sale_outlet|
332
360
  sale_outlet.identifier.value
333
361
  }
334
362
  }
@@ -0,0 +1,8 @@
1
+ module ONIX
2
+ class ProductClassification < SubsetDSL
3
+ element "ProductClassificationType", :subset, :cardinality => 1
4
+ element "ProductClassificationTypeName", :text, :cardinality => 0..1
5
+ element "ProductClassificationCode", :text, :cardinality => 1
6
+ element "Percent", :text, :cardinality => 0..1
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ require 'onix/identifier'
2
+
3
+ module ONIX
4
+ class ProductContact < SubsetDSL
5
+ element "ProductContactRole", :subset, :cardinality => 1
6
+ elements "ProductContactIdentifier", :subset, :cardinality => 0..n
7
+ element "ProductContactName", :text, :cardinality => 0..1
8
+ element "ContactName", :text, :cardinality => 0..1
9
+ element "EmailAddress", :text, :cardinality => 0..1
10
+ end
11
+ end
@@ -1,21 +1,36 @@
1
1
  module ONIX
2
2
  # product part use full Product to provide file protection and file size
3
3
  class ProductPart < SubsetDSL
4
- include EanMethods
5
- include ProprietaryIdMethods
4
+ include IdentifiersMethods::Ean
5
+ include IdentifiersMethods::ProprietaryId
6
6
 
7
- elements "ProductIdentifier", :subset, :shortcut => :identifiers
8
- element "ProductForm", :subset, :shortcut => :form
9
- element "ProductFormDescription", :text, :shortcut => :file_description
10
- elements "ProductFormDetail", :subset, :shortcut => :form_details
11
- elements "ProductContentType", :subset, :shortcut => :content_types
12
- element "NumberOfCopies", :integer
7
+ element "PrimaryPart", :bool, :cardinality => 0..1
8
+ elements "ProductIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
9
+ element "ProductForm", :subset, :shortcut => :form, :cardinality => 1
10
+ elements "ProductFormDetail", :subset, :shortcut => :form_details, :cardinality => 0..n
11
+ elements "ProductFormFeature", :subset, :cardinality => 0..n
12
+
13
+ # element "ProductPackaging", :subset, :cardinality => 0..1
14
+
15
+
16
+ elements "ProductFormDescription", :text, :shortcut => :file_description, :cardinality => 0..n
17
+ elements "ProductContentType", :subset, :shortcut => :content_types, :cardinality => 0..n
18
+ elements "Measure", :subset, :cardinality => 0..n
19
+ element "NumberOfItemsOfThisForm", :integer, :cardinality => 0..1
20
+ element "NumberOfCopies", :integer, :cardinality => 0..1
21
+ element "CountryOfManufacture", :subset, :cardinality => 0..1
13
22
 
14
23
  def file_formats
15
24
  @product_form_details.select { |fd| fd.code =~ /^E1.*/ }
16
25
  end
17
26
 
27
+ # @return [ProductFormDescription]
28
+ def product_form_description
29
+ product_form_descriptions.first
30
+ end
31
+
18
32
  # full Product if referenced in ONIXMessage
33
+ # @return [Product]
19
34
  attr_accessor :product
20
35
 
21
36
  # this ProductPart is part of Product
@@ -47,8 +62,8 @@ module ONIX
47
62
  # raw part file description string without HTML
48
63
  # @return [String]
49
64
  def raw_file_description
50
- if @product_form_description
51
- Helper.strip_html(@product_form_description).gsub(/\s+/, " ").strip
65
+ if product_form_description
66
+ Helper.strip_html(product_form_description).gsub(/\s+/, " ").strip
52
67
  end
53
68
  end
54
69
 
@@ -1,6 +1,6 @@
1
1
  module ONIX
2
2
  # flattened supplies extractor
3
- module ProductSuppliesExtractor
3
+ module ProductSuppliesMethods
4
4
  # class must define a product_supplies returning an Array of objects responding to :
5
5
  # - availability_date (Date)
6
6
  # - countries (country code Array)
@@ -112,7 +112,7 @@ module ONIX
112
112
 
113
113
  # merge by territories
114
114
  grouped_territories_supplies = {}
115
- grouped_supplies.each do |ksup, supply|
115
+ grouped_supplies.values.each do |supply|
116
116
  fsupply = supply.first
117
117
  pr_key = "#{fsupply[:available]}_#{fsupply[:including_tax]}_#{fsupply[:currency]}"
118
118
  supply.each do |s|
@@ -124,7 +124,7 @@ module ONIX
124
124
 
125
125
  supplies = []
126
126
 
127
- grouped_territories_supplies.each do |ksup, supply|
127
+ grouped_territories_supplies.values.each do |supply|
128
128
  fsupply = supply.first.first
129
129
  supplies << {:including_tax => fsupply[:including_tax], :currency => fsupply[:currency],
130
130
  :territory => supply.map { |fs| fs.map { |s| s[:territory] } }.flatten.uniq,
@@ -5,9 +5,9 @@ require 'onix/supply_detail'
5
5
 
6
6
  module ONIX
7
7
  class ProductSupply < SubsetDSL
8
- elements "Market", :subset
9
- element "MarketPublishingDetail", :subset
10
- elements "SupplyDetail", :subset
8
+ elements "Market", :subset, :cardinality => 0..n
9
+ element "MarketPublishingDetail", :subset, :cardinality => 0..1
10
+ elements "SupplyDetail", :subset, :cardinality => 1..n
11
11
 
12
12
  # availability date from market
13
13
  # @return [Date]
@@ -41,6 +41,7 @@ module ONIX
41
41
  @supply_details.delete_if { |supply_detail| supply_detail.available? }
42
42
  end
43
43
 
44
+ # @return [Boolean]
44
45
  def available?
45
46
  self.available_supply_details.length > 0
46
47
  end
@@ -0,0 +1,6 @@
1
+ module ONIX
2
+ class ProfessionalAffiliation < SubsetDSL
3
+ elements "ProfessionalPosition", :text, :cardinality => 0..n
4
+ element "Affiliation", :text, :cardinality => 0..1
5
+ end
6
+ end
@@ -0,0 +1,11 @@
1
+ module ONIX
2
+ class PublisherRepresentative < SubsetDSL
3
+ element "AgentRole", :subset, :cardinality => 1
4
+ elements "AgentIdentifier", :subset, :cardinality => 0..n
5
+ element "AgentName", :text, :cardinality => 0..1
6
+ elements "TelephoneNumber", :text, :cardinality => 0..n
7
+ elements "FaxNumber", :text, :cardinality => 0..n
8
+ elements "EmailAddress", :text, :cardinality => 0..n
9
+ elements "Website", :subset, :cardinality => 0..n
10
+ end
11
+ end
@@ -1,19 +1,27 @@
1
+ require 'onix/product_contact'
1
2
  require 'onix/sales_rights'
3
+ require 'onix/copyright_statement'
2
4
  require 'onix/date'
5
+
3
6
  module ONIX
4
7
  class PublishingDetail < SubsetDSL
5
- elements "Imprint", :subset
6
- elements "Publisher", :subset
7
- element "CityOfPublication", :text, :shortcut => :city
8
- element "CountryOfPublication", :text, :shortcut => :country
9
- element "PublishingStatus", :subset, :shortcut => :status
10
- elements "PublishingDate", :subset
11
- elements "SalesRights", :subset, {:pluralize => false}
12
- element "ROWSalesRightsType", :subset, {:klass => "SalesRightsType"}
13
- element "SalesRestriction", :subset
8
+ elements "Imprint", :subset, :cardinality => 0..n
9
+ elements "Publisher", :subset, :cardinality => 0..n
10
+ element "CityOfPublication", :text, :shortcut => :city, :cardinality => 0..n
11
+ element "CountryOfPublication", :text, :shortcut => :country, :cardinality => 0..1
12
+ elements "ProductContact", :subset, :cardinality => 0..n
13
+ element "PublishingStatus", :subset, :shortcut => :status, :cardinality => 0..1
14
+ elements "PublishingStatusNote", :text, :cardinality => 0..n
15
+ elements "PublishingDate", :subset, :cardinality => 0..n
16
+ element "LatestReprintNumber", :integer, :cardinality => 0..1
17
+ elements "CopyrightStatement", :subset, :cardinality => 0..n
18
+ elements "SalesRights", :subset, :pluralize => false, :cardinality => 0..n
19
+ element "ROWSalesRightsType", :subset, :klass => "SalesRightsType", :cardinality => 0..1
20
+ element "SalesRestriction", :subset, :cardinality => 0..n
14
21
 
15
22
  # @!group High level
16
23
 
24
+ # @return [Publisher]
17
25
  def publisher
18
26
  main_publishers = @publishers.select { |p| p.role.human == "Publisher" }
19
27
  return nil if main_publishers.empty?
@@ -24,6 +32,7 @@ module ONIX
24
32
  end
25
33
  end
26
34
 
35
+ # @return [Imprint]
27
36
  def imprint
28
37
  if @imprints.length > 0
29
38
  if @imprints.length == 1
@@ -35,6 +44,7 @@ module ONIX
35
44
  end
36
45
 
37
46
  # date of publication
47
+ # @return [Date]
38
48
  def publication_date
39
49
  pub = @publishing_dates.publication.first
40
50
  if pub
@@ -43,6 +53,7 @@ module ONIX
43
53
  end
44
54
 
45
55
  # date of embargo
56
+ # @return [Date]
46
57
  def embargo_date
47
58
  pub = @publishing_dates.embargo.first
48
59
  if pub
@@ -50,6 +61,7 @@ module ONIX
50
61
  end
51
62
  end
52
63
 
64
+ # @return [Date]
53
65
  def preorder_embargo_date
54
66
  pub = @publishing_dates.preorder_embargo.first
55
67
  if pub
@@ -57,6 +69,7 @@ module ONIX
57
69
  end
58
70
  end
59
71
 
72
+ # @return [Date]
60
73
  def public_announcement_date
61
74
  pub = @publishing_dates.public_announcement.first
62
75
  if pub
@@ -2,26 +2,30 @@ require 'onix/related_product'
2
2
  require 'onix/related_work'
3
3
  module ONIX
4
4
  class RelatedMaterial < SubsetDSL
5
- elements "RelatedWork", :subset
6
- elements "RelatedProduct", :subset
5
+ elements "RelatedWork", :subset, :cardinality => 0..n
6
+ elements "RelatedProduct", :subset, :cardinality => 0..n
7
7
 
8
8
  # @!group High level
9
9
 
10
+ # @return [Array<RelatedProduct>]
10
11
  def linking(human)
11
12
  @related_products.select{|rp| rp.code.human==human}
12
13
  end
13
14
 
14
15
  # print products RelatedProduct array
16
+ # @return [Array<RelatedProduct>]
15
17
  def print_products
16
18
  linking("EpublicationBasedOnPrintProduct") + self.alternative_format_products.select{|rp| rp.form && rp.form.code=~/^B/}
17
19
  end
18
20
 
19
21
  # is part of products RelatedProduct array
22
+ # @return [Array<RelatedProduct>]
20
23
  def part_of_products
21
24
  linking("IsPartOf")
22
25
  end
23
26
 
24
27
  # alternative format products RelatedProduct array
28
+ # @return [Array<RelatedProduct>]
25
29
  def alternative_format_products
26
30
  linking("AlternativeFormat")
27
31
  end
@@ -1,23 +1,31 @@
1
1
  module ONIX
2
2
  class RelatedProduct < SubsetDSL
3
- include EanMethods
4
- include ProprietaryIdMethods
3
+ include IdentifiersMethods::Ean
4
+ include IdentifiersMethods::ProprietaryId
5
5
 
6
- element "ProductRelationCode", :subset, :shortcut => :code
7
- elements "ProductIdentifier", :subset, :shortcut => :identifiers
8
- element "ProductForm", :subset, :shortcut => :form
9
- elements "ProductFormDetail", :subset, :shortcut => :form_details
6
+ elements "ProductRelationCode", :subset, :shortcut => :codes, :cardinality => 1..n
7
+ elements "ProductIdentifier", :subset, :shortcut => :identifiers, :cardinality => 1..n
8
+ element "ProductForm", :subset, :shortcut => :form, :cardinality => 0..1
9
+ elements "ProductFormDetail", :subset, :shortcut => :form_details, :cardinality => 0..n
10
10
 
11
11
  # full Product if referenced in ONIXMessage
12
+ # @return [Product]
12
13
  attr_accessor :product
13
14
 
15
+ # @return [ProductRelationCode]
16
+ def code
17
+ self.codes.first
18
+ end
19
+
14
20
  # @!group High level
21
+ # @return [String]
15
22
  def file_format
16
23
  file_formats.first.human if file_formats.first
17
24
  end
18
25
 
19
26
  # @!endgroup
20
27
 
28
+ # @return [Array<ProductFormDetail>]
21
29
  def file_formats
22
30
  @product_form_details.select { |fd| fd.code =~ /^E1.*/ }
23
31
  end
@@ -1,10 +1,12 @@
1
1
  module ONIX
2
2
  class RelatedWork < SubsetDSL
3
- include EanMethods
4
- element "WorkRelationCode", :subset, :shortcut => :code
5
- elements "WorkIdentifier", :subset, :shortcut => :identifiers
3
+ include IdentifiersMethods::Ean
4
+
5
+ element "WorkRelationCode", :subset, :shortcut => :code, :cardinality => 0..n
6
+ elements "WorkIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
6
7
 
7
8
  # full Product if referenced in ONIXMessage
9
+ # @return [Product]
8
10
  attr_accessor :product
9
11
  end
10
12
  end
@@ -0,0 +1,9 @@
1
+ module ONIX
2
+ class ResourceFeature < SubsetDSL
3
+ element "ResourceFeatureType", :subset, :shortcut => :type, :cardinality => 1
4
+ element "FeatureValue", :text, :shortcut => :value, :cardinality => 0..1
5
+ elements "FeatureNote", :text, :shortcut => :notes, :cardinality => 0..n
6
+
7
+ scope :caption, lambda { human_code_match(:resource_feature_type, "Caption") }
8
+ end
9
+ end