im_onix 1.1.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (303) hide show
  1. checksums.yaml +4 -4
  2. data/bin/html_codelist_to_yml.rb +10 -6
  3. data/bin/onix_bench.rb +9 -4
  4. data/bin/onix_pp.rb +26 -26
  5. data/bin/onix_serialize.rb +12 -16
  6. data/data/codelists/codelist-1.yml +4 -5
  7. data/data/codelists/codelist-10.yml +13 -11
  8. data/data/codelists/codelist-100.yml +1 -0
  9. data/data/codelists/codelist-102.yml +3 -2
  10. data/data/codelists/codelist-11.yml +2 -2
  11. data/data/codelists/codelist-12.yml +8 -3
  12. data/data/codelists/codelist-121.yml +46 -17
  13. data/data/codelists/codelist-13.yml +3 -0
  14. data/data/codelists/codelist-139.yml +83 -9
  15. data/data/codelists/codelist-141.yml +4 -4
  16. data/data/codelists/codelist-142.yml +2 -2
  17. data/data/codelists/codelist-143.yml +11 -0
  18. data/data/codelists/codelist-144.yml +2 -2
  19. data/data/codelists/codelist-145.yml +4 -1
  20. data/data/codelists/codelist-147.yml +18 -2
  21. data/data/codelists/codelist-149.yml +1 -0
  22. data/data/codelists/codelist-15.yml +2 -1
  23. data/data/codelists/codelist-150.yml +46 -26
  24. data/data/codelists/codelist-151.yml +4 -1
  25. data/data/codelists/codelist-153.yml +19 -4
  26. data/data/codelists/codelist-154.yml +4 -2
  27. data/data/codelists/codelist-155.yml +3 -1
  28. data/data/codelists/codelist-156.yml +1 -0
  29. data/data/codelists/codelist-158.yml +18 -0
  30. data/data/codelists/codelist-159.yml +1 -1
  31. data/data/codelists/codelist-16.yml +3 -0
  32. data/data/codelists/codelist-160.yml +2 -0
  33. data/data/codelists/codelist-162.yml +2 -0
  34. data/data/codelists/codelist-163.yml +8 -3
  35. data/data/codelists/codelist-165.yml +3 -0
  36. data/data/codelists/codelist-166.yml +7 -2
  37. data/data/codelists/codelist-167.yml +6 -0
  38. data/data/codelists/codelist-168.yml +1 -0
  39. data/data/codelists/codelist-169.yml +2 -2
  40. data/data/codelists/codelist-17.yml +20 -2
  41. data/data/codelists/codelist-170.yml +5 -1
  42. data/data/codelists/codelist-171.yml +1 -0
  43. data/data/codelists/codelist-173.yml +1 -1
  44. data/data/codelists/codelist-175.yml +113 -35
  45. data/data/codelists/codelist-176.yml +2 -2
  46. data/data/codelists/codelist-177.yml +1 -0
  47. data/data/codelists/codelist-178.yml +6 -0
  48. data/data/codelists/codelist-179.yml +1 -0
  49. data/data/codelists/codelist-18.yml +3 -1
  50. data/data/codelists/codelist-184.yml +1 -0
  51. data/data/codelists/codelist-19.yml +5 -4
  52. data/data/codelists/codelist-196.yml +16 -4
  53. data/data/codelists/codelist-197.yml +2 -0
  54. data/data/codelists/codelist-198.yml +7 -0
  55. data/data/codelists/codelist-2.yml +6 -6
  56. data/data/codelists/codelist-20.yml +10 -1
  57. data/data/codelists/codelist-203.yml +1 -1
  58. data/data/codelists/codelist-204.yml +4 -0
  59. data/data/codelists/codelist-21.yml +24 -19
  60. data/data/codelists/codelist-215.yml +9 -0
  61. data/data/codelists/codelist-216.yml +11 -0
  62. data/data/codelists/codelist-217.yml +9 -0
  63. data/data/codelists/codelist-218.yml +5 -0
  64. data/data/codelists/codelist-219.yml +5 -0
  65. data/data/codelists/codelist-22.yml +5 -4
  66. data/data/codelists/codelist-220.yml +10 -0
  67. data/data/codelists/codelist-221.yml +6 -0
  68. data/data/codelists/codelist-222.yml +4 -0
  69. data/data/codelists/codelist-223.yml +4 -0
  70. data/data/codelists/codelist-224.yml +8 -0
  71. data/data/codelists/codelist-225.yml +4 -0
  72. data/data/codelists/codelist-226.yml +7 -0
  73. data/data/codelists/codelist-227.yml +21 -0
  74. data/data/codelists/codelist-228.yml +3 -0
  75. data/data/codelists/codelist-229.yml +5 -0
  76. data/data/codelists/codelist-23.yml +5 -3
  77. data/data/codelists/codelist-230.yml +8 -0
  78. data/data/codelists/codelist-238.yml +23 -0
  79. data/data/codelists/codelist-239.yml +4 -0
  80. data/data/codelists/codelist-24.yml +3 -0
  81. data/data/codelists/codelist-240.yml +6 -0
  82. data/data/codelists/codelist-241.yml +9 -0
  83. data/data/codelists/codelist-242.yml +24 -0
  84. data/data/codelists/codelist-243.yml +9 -0
  85. data/data/codelists/codelist-244.yml +3 -0
  86. data/data/codelists/codelist-245.yml +5 -0
  87. data/data/codelists/codelist-246.yml +4 -0
  88. data/data/codelists/codelist-247.yml +4 -0
  89. data/data/codelists/codelist-25.yml +4 -2
  90. data/data/codelists/codelist-26.yml +28 -18
  91. data/data/codelists/codelist-27.yml +35 -19
  92. data/data/codelists/codelist-28.yml +2 -1
  93. data/data/codelists/codelist-29.yml +8 -3
  94. data/data/codelists/codelist-3.yml +5 -2
  95. data/data/codelists/codelist-30.yml +6 -2
  96. data/data/codelists/codelist-32.yml +7 -0
  97. data/data/codelists/codelist-33.yml +6 -2
  98. data/data/codelists/codelist-34.yml +0 -11
  99. data/data/codelists/codelist-38.yml +1 -1
  100. data/data/codelists/codelist-39.yml +2 -2
  101. data/data/codelists/codelist-41.yml +4 -3
  102. data/data/codelists/codelist-42.yml +0 -12
  103. data/data/codelists/codelist-43.yml +3 -1
  104. data/data/codelists/codelist-44.yml +16 -3
  105. data/data/codelists/codelist-45.yml +8 -3
  106. data/data/codelists/codelist-46.yml +4 -4
  107. data/data/codelists/codelist-48.yml +20 -2
  108. data/data/codelists/codelist-49.yml +268 -1
  109. data/data/codelists/codelist-5.yml +6 -3
  110. data/data/codelists/codelist-51.yml +11 -5
  111. data/data/codelists/codelist-55.yml +2 -2
  112. data/data/codelists/codelist-57.yml +1 -0
  113. data/data/codelists/codelist-58.yml +14 -12
  114. data/data/codelists/codelist-59.yml +10 -1
  115. data/data/codelists/codelist-6.yml +39 -39
  116. data/data/codelists/codelist-60.yml +1 -1
  117. data/data/codelists/codelist-62.yml +2 -1
  118. data/data/codelists/codelist-64.yml +3 -2
  119. data/data/codelists/codelist-65.yml +1 -0
  120. data/data/codelists/codelist-68.yml +2 -2
  121. data/data/codelists/codelist-69.yml +2 -2
  122. data/data/codelists/codelist-7.yml +21 -17
  123. data/data/codelists/codelist-71.yml +16 -6
  124. data/data/codelists/codelist-73.yml +7 -5
  125. data/data/codelists/codelist-74.yml +59 -31
  126. data/data/codelists/codelist-75.yml +1 -1
  127. data/data/codelists/codelist-76.yml +3 -3
  128. data/data/codelists/codelist-78.yml +52 -26
  129. data/data/codelists/codelist-79.yml +16 -7
  130. data/data/codelists/codelist-8.yml +3 -3
  131. data/data/codelists/codelist-80.yml +6 -5
  132. data/data/codelists/codelist-81.yml +8 -5
  133. data/data/codelists/codelist-83.yml +3 -2
  134. data/data/codelists/codelist-85.yml +1 -1
  135. data/data/codelists/codelist-9.yml +7 -3
  136. data/data/codelists/codelist-90.yml +2 -2
  137. data/data/codelists/codelist-91.yml +11 -11
  138. data/data/codelists/codelist-92.yml +1 -1
  139. data/data/codelists/codelist-93.yml +9 -6
  140. data/data/codelists/codelist-96.yml +45 -40
  141. data/data/codelists/codelist-98.yml +6 -3
  142. data/data/codelists/codelist-99.yml +8 -5
  143. data/data/onix21/codelists/codelist-1.yml +2 -2
  144. data/data/onix21/codelists/codelist-10.yml +12 -12
  145. data/data/onix21/codelists/codelist-11.yml +2 -2
  146. data/data/onix21/codelists/codelist-12.yml +3 -3
  147. data/data/onix21/codelists/codelist-121.yml +9 -9
  148. data/data/onix21/codelists/codelist-13.yml +1 -1
  149. data/data/onix21/codelists/codelist-139.yml +6 -6
  150. data/data/onix21/codelists/codelist-141.yml +4 -4
  151. data/data/onix21/codelists/codelist-142.yml +2 -2
  152. data/data/onix21/codelists/codelist-145.yml +2 -2
  153. data/data/onix21/codelists/codelist-147.yml +2 -2
  154. data/data/onix21/codelists/codelist-148.yml +1 -1
  155. data/data/onix21/codelists/codelist-149.yml +1 -1
  156. data/data/onix21/codelists/codelist-15.yml +1 -1
  157. data/data/onix21/codelists/codelist-150.yml +23 -23
  158. data/data/onix21/codelists/codelist-151.yml +1 -1
  159. data/data/onix21/codelists/codelist-153.yml +3 -3
  160. data/data/onix21/codelists/codelist-154.yml +2 -2
  161. data/data/onix21/codelists/codelist-155.yml +1 -1
  162. data/data/onix21/codelists/codelist-158.yml +2 -2
  163. data/data/onix21/codelists/codelist-159.yml +1 -1
  164. data/data/onix21/codelists/codelist-163.yml +2 -2
  165. data/data/onix21/codelists/codelist-166.yml +1 -1
  166. data/data/onix21/codelists/codelist-169.yml +2 -2
  167. data/data/onix21/codelists/codelist-17.yml +2 -2
  168. data/data/onix21/codelists/codelist-173.yml +1 -1
  169. data/data/onix21/codelists/codelist-175.yml +23 -23
  170. data/data/onix21/codelists/codelist-176.yml +2 -2
  171. data/data/onix21/codelists/codelist-18.yml +1 -1
  172. data/data/onix21/codelists/codelist-196.yml +4 -4
  173. data/data/onix21/codelists/codelist-2.yml +6 -6
  174. data/data/onix21/codelists/codelist-203.yml +1 -1
  175. data/data/onix21/codelists/codelist-21.yml +1 -1
  176. data/data/onix21/codelists/codelist-216.yml +2 -2
  177. data/data/onix21/codelists/codelist-218.yml +1 -1
  178. data/data/onix21/codelists/codelist-22.yml +3 -3
  179. data/data/onix21/codelists/codelist-23.yml +2 -2
  180. data/data/onix21/codelists/codelist-25.yml +2 -2
  181. data/data/onix21/codelists/codelist-26.yml +18 -18
  182. data/data/onix21/codelists/codelist-27.yml +18 -18
  183. data/data/onix21/codelists/codelist-28.yml +1 -1
  184. data/data/onix21/codelists/codelist-29.yml +3 -3
  185. data/data/onix21/codelists/codelist-3.yml +2 -2
  186. data/data/onix21/codelists/codelist-30.yml +1 -1
  187. data/data/onix21/codelists/codelist-32.yml +1 -1
  188. data/data/onix21/codelists/codelist-33.yml +2 -2
  189. data/data/onix21/codelists/codelist-34.yml +2 -2
  190. data/data/onix21/codelists/codelist-38.yml +1 -1
  191. data/data/onix21/codelists/codelist-39.yml +2 -2
  192. data/data/onix21/codelists/codelist-41.yml +3 -3
  193. data/data/onix21/codelists/codelist-43.yml +1 -1
  194. data/data/onix21/codelists/codelist-44.yml +2 -2
  195. data/data/onix21/codelists/codelist-45.yml +4 -4
  196. data/data/onix21/codelists/codelist-46.yml +3 -3
  197. data/data/onix21/codelists/codelist-48.yml +2 -2
  198. data/data/onix21/codelists/codelist-49.yml +12 -12
  199. data/data/onix21/codelists/codelist-5.yml +3 -3
  200. data/data/onix21/codelists/codelist-51.yml +3 -3
  201. data/data/onix21/codelists/codelist-55.yml +2 -2
  202. data/data/onix21/codelists/codelist-58.yml +10 -10
  203. data/data/onix21/codelists/codelist-59.yml +2 -2
  204. data/data/onix21/codelists/codelist-6.yml +36 -36
  205. data/data/onix21/codelists/codelist-60.yml +1 -1
  206. data/data/onix21/codelists/codelist-62.yml +1 -1
  207. data/data/onix21/codelists/codelist-64.yml +2 -2
  208. data/data/onix21/codelists/codelist-68.yml +2 -2
  209. data/data/onix21/codelists/codelist-69.yml +2 -2
  210. data/data/onix21/codelists/codelist-7.yml +17 -17
  211. data/data/onix21/codelists/codelist-71.yml +2 -2
  212. data/data/onix21/codelists/codelist-73.yml +5 -5
  213. data/data/onix21/codelists/codelist-74.yml +28 -28
  214. data/data/onix21/codelists/codelist-75.yml +1 -1
  215. data/data/onix21/codelists/codelist-76.yml +3 -3
  216. data/data/onix21/codelists/codelist-78.yml +24 -24
  217. data/data/onix21/codelists/codelist-79.yml +6 -6
  218. data/data/onix21/codelists/codelist-8.yml +3 -3
  219. data/data/onix21/codelists/codelist-80.yml +5 -5
  220. data/data/onix21/codelists/codelist-81.yml +4 -4
  221. data/data/onix21/codelists/codelist-83.yml +2 -2
  222. data/data/onix21/codelists/codelist-85.yml +1 -1
  223. data/data/onix21/codelists/codelist-9.yml +3 -3
  224. data/data/onix21/codelists/codelist-90.yml +2 -2
  225. data/data/onix21/codelists/codelist-91.yml +6 -6
  226. data/data/onix21/codelists/codelist-92.yml +1 -1
  227. data/data/onix21/codelists/codelist-93.yml +6 -6
  228. data/data/onix21/codelists/codelist-96.yml +1 -1
  229. data/data/onix21/codelists/codelist-98.yml +2 -2
  230. data/data/onix21/codelists/codelist-99.yml +4 -4
  231. data/im_onix.gemspec +1 -1
  232. data/lib/onix/addressee.rb +4 -3
  233. data/lib/onix/ancillary_content.rb +7 -0
  234. data/lib/onix/audience.rb +7 -0
  235. data/lib/onix/audience_range.rb +9 -0
  236. data/lib/onix/builder.rb +181 -0
  237. data/lib/onix/cited_content.rb +15 -0
  238. data/lib/onix/code.rb +285 -6
  239. data/lib/onix/collateral_detail.rb +9 -13
  240. data/lib/onix/collection.rb +11 -4
  241. data/lib/onix/collection_sequence.rb +3 -3
  242. data/lib/onix/comparison_product_price.rb +17 -0
  243. data/lib/onix/complexity.rb +6 -0
  244. data/lib/onix/content_detail.rb +7 -0
  245. data/lib/onix/content_item.rb +32 -0
  246. data/lib/onix/contributor.rb +42 -34
  247. data/lib/onix/contributor_place.rb +12 -0
  248. data/lib/onix/copyright_statement.rb +7 -0
  249. data/lib/onix/date.rb +77 -47
  250. data/lib/onix/descriptive_detail.rb +56 -25
  251. data/lib/onix/discount.rb +9 -0
  252. data/lib/onix/discount_coded.rb +3 -3
  253. data/lib/onix/entity.rb +16 -36
  254. data/lib/onix/epub_license.rb +8 -0
  255. data/lib/onix/epub_license_expression.rb +7 -0
  256. data/lib/onix/epub_usage_constraint.rb +5 -3
  257. data/lib/onix/epub_usage_limit.rb +2 -2
  258. data/lib/onix/error.rb +2 -0
  259. data/lib/onix/extent.rb +4 -3
  260. data/lib/onix/header.rb +17 -0
  261. data/lib/onix/identifier.rb +29 -13
  262. data/lib/onix/language.rb +5 -2
  263. data/lib/onix/market.rb +2 -1
  264. data/lib/onix/market_publishing_detail.rb +13 -3
  265. data/lib/onix/measure.rb +7 -0
  266. data/lib/onix/onix_message.rb +36 -48
  267. data/lib/onix/page_run.rb +6 -0
  268. data/lib/onix/price.rb +33 -9
  269. data/lib/onix/prize.rb +11 -0
  270. data/lib/onix/product.rb +31 -11
  271. data/lib/onix/product_classification.rb +8 -0
  272. data/lib/onix/product_contact.rb +11 -0
  273. data/lib/onix/product_part.rb +18 -8
  274. data/lib/onix/product_supply.rb +3 -3
  275. data/lib/onix/professional_affiliation.rb +6 -0
  276. data/lib/onix/publishing_detail.rb +16 -9
  277. data/lib/onix/related_material.rb +2 -2
  278. data/lib/onix/related_product.rb +8 -4
  279. data/lib/onix/related_work.rb +2 -2
  280. data/lib/onix/resource_feature.rb +9 -0
  281. data/lib/onix/resource_version.rb +82 -0
  282. data/lib/onix/resource_version_feature.rb +22 -0
  283. data/lib/onix/returns_conditions.rb +8 -0
  284. data/lib/onix/review_rating.rb +7 -0
  285. data/lib/onix/sales_outlet.rb +10 -2
  286. data/lib/onix/sales_restriction.rb +6 -16
  287. data/lib/onix/sales_rights.rb +6 -3
  288. data/lib/onix/sender.rb +4 -4
  289. data/lib/onix/serializer.rb +130 -86
  290. data/lib/onix/subject.rb +10 -6
  291. data/lib/onix/subset.rb +125 -24
  292. data/lib/onix/supplier_own_coding.rb +7 -0
  293. data/lib/onix/supply_contact.rb +9 -0
  294. data/lib/onix/supply_detail.rb +20 -5
  295. data/lib/onix/supporting_resource.rb +8 -113
  296. data/lib/onix/tax.rb +11 -5
  297. data/lib/onix/territory.rb +4 -4
  298. data/lib/onix/text_content.rb +13 -0
  299. data/lib/onix/text_item.rb +12 -0
  300. data/lib/onix/title_detail.rb +3 -3
  301. data/lib/onix/title_element.rb +15 -13
  302. data/lib/onix/website.rb +4 -3
  303. metadata +58 -2
@@ -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
@@ -0,0 +1,82 @@
1
+ require 'onix/resource_version_feature'
2
+
3
+ module ONIX
4
+ class ResourceVersion < SubsetDSL
5
+ element "ResourceForm", :subset, :shortcut => :form, :cardinality => 1
6
+ elements "ResourceVersionFeature", :subset, :shortcut => :features, :cardinality => 0..n
7
+ elements "ResourceLink", :text, :shortcut => :links, :cardinality => 1..n
8
+ elements "ContentDate", :subset, :cardinality => 0..n
9
+
10
+ def filename
11
+ if @resource_form.human == "DownloadableFile"
12
+ resource_links.first
13
+ end
14
+ end
15
+
16
+ def file_format_feature
17
+ @resource_version_features.select { |f| f.type.human == "FileFormat" }.first
18
+ end
19
+
20
+ def file_format
21
+ if ["DownloadableFile", "LinkableResource"].include?(@resource_form.human)
22
+ if file_format_feature
23
+ file_format_feature.value.human
24
+ end
25
+ end
26
+ end
27
+
28
+ def file_mimetype
29
+ if ["DownloadableFile", "LinkableResource"].include?(@resource_form.human)
30
+ if file_format_feature
31
+ file_format_feature.value.mimetype
32
+ end
33
+ end
34
+ end
35
+
36
+ def image_width_feature
37
+ @resource_version_features.image_pixels_width.first
38
+ end
39
+
40
+ def image_height_feature
41
+ @resource_version_features.image_pixels_height.first
42
+ end
43
+
44
+ def md5_hash_feature
45
+ @resource_version_features.md5_hash.first
46
+ end
47
+
48
+ def image_width
49
+ if self.image_width_feature
50
+ self.image_width_feature.value.to_i
51
+ end
52
+ end
53
+
54
+ def image_height
55
+ if self.image_height_feature
56
+ self.image_height_feature.value.to_i
57
+ end
58
+ end
59
+
60
+ def md5_hash
61
+ if self.md5_hash_feature
62
+ self.md5_hash_feature.value
63
+ end
64
+ end
65
+
66
+ def last_updated_content_date
67
+ @content_dates.last_updated.first
68
+ end
69
+
70
+ def last_updated
71
+ if self.last_updated_content_date
72
+ self.last_updated_content_date.date
73
+ end
74
+ end
75
+
76
+ def last_updated_utc
77
+ if self.last_updated_content_date and self.last_updated_content_date.date
78
+ self.last_updated_content_date.date.to_time.utc.strftime('%Y%m%dT%H%M%S%z')
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,22 @@
1
+ module ONIX
2
+ class ResourceVersionFeature < SubsetDSL
3
+ element "ResourceVersionFeatureType", :subset, :shortcut => :type, :cardinality => 1
4
+ elements "FeatureNote", :text, :shortcut => :notes, :cardinality => 0..n
5
+ element "FeatureValue", :text, {
6
+ :shortcut => :value,
7
+ :serialize_lambda => lambda { |v| v.class == SupportingResourceFileFormat ? v.code : v }
8
+ }
9
+
10
+ scope :image_pixels_width, lambda { human_code_match(:resource_version_feature_type, "ImageWidthInPixels") }
11
+ scope :image_pixels_height, lambda { human_code_match(:resource_version_feature_type, "ImageHeightInPixels") }
12
+ scope :md5_hash, lambda { human_code_match(:resource_version_feature_type, "Md5HashValue") }
13
+
14
+ def parse(n)
15
+ super
16
+
17
+ if @resource_version_feature_type.human == "FileFormat"
18
+ @feature_value = SupportingResourceFileFormat.from_code(@feature_value)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,8 @@
1
+ module ONIX
2
+ class ReturnsConditions < SubsetDSL
3
+ element "ReturnsCodeType", :subset, :cardinality => 1
4
+ element "ReturnsCodeTypeName", :text, :cardinality => 0..1
5
+ element "ReturnsCode", :subset, :cardinality => 1
6
+ elements "ReturnsNote", :text, :cardinality => 0..n
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ module ONIX
2
+ class ReviewRating < SubsetDSL
3
+ element "Rating", :text, :cardinality => 1
4
+ element "RatingLimit", :integer, :cardinality => 0..1
5
+ elements "RatingUnits", :text, :cardinality => 0..n
6
+ end
7
+ end
@@ -1,6 +1,14 @@
1
1
  module ONIX
2
2
  class SalesOutlet < SubsetDSL
3
- element "SalesOutletIdentifier", :subset, :shortcut => :identifier
4
- element "SalesOutletName", :text, :shortcut => :name
3
+ elements "SalesOutletIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
4
+ element "SalesOutletName", :text, :shortcut => :name, :cardinality => 0..1
5
+
6
+ def sales_outlet_identifier
7
+ self.sales_outlet_identifiers.first
8
+ end
9
+
10
+ def identifier
11
+ self.identifiers.first
12
+ end
5
13
  end
6
14
  end
@@ -2,23 +2,13 @@ require 'onix/sales_outlet'
2
2
  module ONIX
3
3
  class SalesRestriction < SubsetDSL
4
4
  element "SalesRestrictionType", :subset, :shortcut => :type
5
- elements "SalesOutlet", :subset
6
- element "SalesRestrictionNote", :text, :shortcut => :note
5
+ elements "SalesOutlet", :subset, :cardinality => 0..n
6
+ elements "SalesRestrictionNote", :text, :shortcut => :notes
7
+ element "StartDate", :date, :cardinality => 0..1
8
+ element "EndDate", :date, :cardinality => 0..1
7
9
 
8
- attr_accessor :start_date, :end_date
9
-
10
- def parse(n)
11
- super
12
- n.elements.each do |t|
13
- case t
14
- when tag_match("StartDate")
15
- fmt = t["dateformat"] || "00"
16
- @start_date = ONIX::Helper.to_date(fmt, t.text)
17
- when tag_match("EndDate")
18
- fmt = t["dateformat"] || "00"
19
- @end_date = ONIX::Helper.to_date(fmt, t.text)
20
- end
21
- end
10
+ def note
11
+ self.notes.first
22
12
  end
23
13
  end
24
14
  end
@@ -1,8 +1,11 @@
1
1
  require 'onix/sales_restriction'
2
+
2
3
  module ONIX
3
4
  class SalesRights < SubsetDSL
4
- element "SalesRightsType", :subset, :shortcut => :type
5
- element "Territory", :subset
6
- elements "SalesRestriction", :subset
5
+ element "SalesRightsType", :subset, :shortcut => :type, :cardinality => 1
6
+ element "Territory", :subset, :cardinality => 1
7
+ elements "SalesRestriction", :subset, :cardinality => 0..n
8
+ elements "ProductIdentifier", :subset, :cardinality => 0..n
9
+ element "PublisherName", :text, :cardinality => 0..1
7
10
  end
8
11
  end
data/lib/onix/sender.rb CHANGED
@@ -4,9 +4,9 @@ module ONIX
4
4
  class Sender < SubsetDSL
5
5
  include GlnMethods
6
6
 
7
- elements "SenderIdentifier", :subset, :shortcut => :identifiers
8
- element "SenderName", :text, :shortcut => :name
9
- element "ContactName", :text
10
- element "EmailAddress", :text
7
+ elements "SenderIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
8
+ element "SenderName", :text, :shortcut => :name, :cardinality => 0..1
9
+ element "ContactName", :text, :cardinality => 0..1
10
+ element "EmailAddress", :text, :cardinality => 0..1
11
11
  end
12
12
  end
@@ -1,156 +1,200 @@
1
1
  module ONIX
2
+ class Root < SubsetDSL
3
+ element "ONIXMessage", :subset
4
+ elements "Product", :subset
5
+ end
6
+
2
7
  module Serializer
3
8
  class Traverser
4
9
 
5
- def self.serialize_subset(mod, xml, subset, parent_tag = nil, level = 0)
6
- if subset.class.included_modules.include?(DateHelper)
7
- mod.const_get("Date").serialize(xml, subset, parent_tag, level)
10
+ def self.serialize(mod, xml, subset, tag = nil)
11
+ ONIX::Serializer::Traverser.serialize_subset(mod, xml, subset, tag)
12
+ end
13
+
14
+ def self.serialize_subset(mod, data, subset, parent_tag = nil, level = 0)
15
+ if subset.is_a?(ONIX::Root)
16
+ ONIX::Serializer::Traverser.recursive_serialize(mod, data, subset, parent_tag, level)
8
17
  else
9
- if subset.class.included_modules.include?(CodeHelper)
10
- mod.const_get("Code").serialize(xml, subset, parent_tag, level)
18
+ if subset.is_a?(ONIX::ONIXMessage)
19
+ mod.const_get("Root").serialize(data, subset, "ONIXMessage", level)
11
20
  else
12
- if subset.class.included_modules.include?(EntityHelper)
13
- mod.const_get("Entity").serialize(xml, subset, parent_tag, level)
21
+ if subset.class.included_modules.include?(DateHelper)
22
+ mod.const_get("Date").serialize(data, subset, parent_tag, level)
14
23
  else
15
- mod.const_get("Subset").serialize(xml, parent_tag, subset, level)
24
+ if subset.class.included_modules.include?(CodeHelper)
25
+ mod.const_get("Code").serialize(data, subset, parent_tag, level)
26
+ else
27
+ mod.const_get("Subset").serialize(data, subset, parent_tag, level)
28
+ end
16
29
  end
17
30
  end
18
31
  end
19
32
  end
20
33
 
21
- def self.recursive_serialize(mod, xml, subset, parent_tag = nil, level = 0)
34
+ def self.any_serialize(type, mod, data, val, tag, level)
35
+ case type
36
+ when :subset
37
+ self.serialize_subset(mod, data, val, tag, level)
38
+ when :datestamp
39
+ mod.const_get("Primitive").serialize(data, val.code, tag, level)
40
+ when :text, :integer, :float
41
+ mod.const_get("Primitive").serialize(data, val, tag, level)
42
+ when :bool
43
+ mod.const_get("Primitive").serialize(data, nil, tag, level) if val
44
+ when :ignore
45
+ else
46
+ end
47
+ end
48
+
49
+ def self.recursive_serialize(mod, data, subset, parent_tag = nil, level = 0)
22
50
  if subset.class.respond_to?(:ancestors_registered_elements)
23
- subset.class.ancestors_registered_elements.each do |n, e|
24
- unless e.short
25
- v = subset.instance_variable_get(e.to_instance)
26
- if v
27
- if e.is_array?
28
- v.each do |vv|
29
- case e.type
30
- when :subset
31
- self.serialize_subset(mod, xml, vv, n, level)
32
- when :text, :integer, :float, :bool
33
- mod.const_get("Primitive").serialize(xml, n, vv, level)
34
- when :ignore
35
- else
36
- end
37
- end
38
- else
39
- case e.type
40
- when :subset
41
- self.serialize_subset(mod, xml, v, n, level)
42
- when :text, :integer, :float, :bool
43
- mod.const_get("Primitive").serialize(xml, n, e.serialize_lambda(v), level)
44
- when :ignore
45
- else
46
- end
51
+ subset.class.ancestors_registered_elements.each do |tag, element|
52
+ next if element.short
53
+ val = subset.instance_variable_get(element.to_instance)
54
+ if val
55
+ if element.is_array?
56
+ val.each do |subval|
57
+ self.any_serialize(element.type, mod, data, subval, tag, level)
47
58
  end
59
+ else
60
+ self.any_serialize(element.type, mod, data, element.serialize_lambda(val), tag, level)
48
61
  end
49
62
  end
50
63
  end
51
64
  end
52
-
53
65
  end
54
66
  end
55
67
 
56
68
  module Default
57
- class Subset
58
- def self.serialize(xml, tag, subset, level = 0)
59
- xml.send(tag, nil) {
60
- ONIX::Serializer::Traverser.recursive_serialize(Default, xml, subset, tag, level+1)
69
+ def self.serialize(xml, subset, tag = nil)
70
+ ONIX::Serializer::Traverser.serialize(Default, xml, subset, tag)
71
+ end
72
+
73
+ class Root
74
+ def self.serialize(xml, subset, tag, level = 0)
75
+ root_options = subset.version && subset.version >= 300 ? { :xmlns => "http://ns.editeur.org/onix/3.0/reference", :release => subset.release } : {}
76
+ xml.send(tag, root_options) {
77
+ ONIX::Serializer::Traverser.recursive_serialize(Default, xml, subset, tag, level + 1)
61
78
  }
62
79
  end
63
80
  end
64
81
 
82
+ class Subset
83
+ def self.serialize(xml, subset, tag, level = 0)
84
+ if tag
85
+ xml.send(tag, subset.serialized_attributes) {
86
+ ONIX::Serializer::Traverser.recursive_serialize(Default, xml, subset, tag, level + 1)
87
+ }
88
+ end
89
+ end
90
+ end
91
+
65
92
  class Primitive
66
- def self.serialize(xml, tag, data, level = 0)
67
- unless data.respond_to?(:empty?) ? !!data.empty? : !data # rails blank?
68
- xml.send(tag, data)
93
+ def self.serialize(xml, val, tag, level = 0)
94
+ if val.is_a?(ONIX::TextWithAttributes)
95
+ if val.serialized_attributes["textformat"] == "05" # content is XHTML
96
+ xml.send(tag, val.serialized_attributes) do
97
+ xml.__send__ :insert, val.to_s
98
+ end
99
+ else
100
+ xml.send(tag, val.serialized_attributes, val)
101
+ end
102
+ else
103
+ xml.send(tag, val)
69
104
  end
70
105
  end
71
106
  end
72
107
 
73
108
  class Date
74
109
  def self.serialize(xml, date, parent_tag = nil, level = 0)
110
+ deprecated_date_format = date.deprecated_date_format
111
+ date_format = date.date_format || DateFormat.from_code("00")
112
+ code_format = date.format_from_code(date_format.code)
113
+
75
114
  xml.send(parent_tag, nil) {
76
- ONIX::Serializer::Traverser.recursive_serialize(Default, xml, date, parent_tag, level+1)
77
- xml.DateFormat(date.date_format.code)
78
- code_format=date.format_from_code(date.date_format.code)
79
- xml.Date(date.date.strftime(code_format))
115
+ date.class.ancestors_registered_elements.each do |tag, element|
116
+ next if element.short
117
+ val = date.instance_variable_get(element.to_instance)
118
+ if val
119
+ case tag
120
+ when "DateFormat"
121
+ if deprecated_date_format
122
+ xml.DateFormat(date_format.code)
123
+ end
124
+ when "Date"
125
+ if deprecated_date_format
126
+ xml.Date(date.date.strftime(code_format))
127
+ else
128
+ attrs = date.date_format ? { :dateformat => date_format.code } : {}
129
+ xml.Date(date.date.strftime(code_format), attrs)
130
+ end
131
+ else
132
+ ONIX::Serializer::Traverser.any_serialize(element.type, Default, xml, element.serialize_lambda(val), tag, level)
133
+ end
134
+ end
135
+ end
80
136
  }
81
-
82
137
  end
83
138
  end
84
139
 
85
140
  class Code
86
141
  def self.serialize(xml, code, parent_tag = nil, level = 0)
87
- xml.send(parent_tag, nil) {
142
+ xml.send(parent_tag, code.serialized_attributes) {
88
143
  xml.text(code.code)
89
144
  }
90
145
  end
91
146
  end
147
+ end
92
148
 
93
- class Entity
94
- def self.serialize(xml, entity, parent_tag = nil, level = 0)
95
- xml.send(parent_tag, nil) {
96
- if entity.role
97
- Code.serialize(xml, entity.role, entity.class.role_tag, level+1)
98
- end
99
- entity.identifiers.each do |identifier|
100
- Subset.serialize(xml, entity.class.identifier_tag, identifier, level+1)
101
- end
102
- if entity.name
103
- xml.send(entity.class.name_tag, entity.name)
104
- end
105
- ONIX::Serializer::Traverser.recursive_serialize(Default, xml, entity, parent_tag, level+1)
106
- }
149
+ module Dump
150
+ def self.serialize(io, subset, tag = nil)
151
+ ONIX::Serializer::Traverser.serialize(Dump, io, subset, tag)
152
+ end
153
+
154
+ class Root
155
+ def self.serialize(io, subset, tag, level = 0)
156
+ io.write " " * level
157
+ io.write "#{tag}(ROOT):\n"
158
+ ONIX::Serializer::Traverser.recursive_serialize(Dump, io, subset, tag, level + 1)
107
159
  end
108
160
  end
109
- end
110
161
 
111
- module Dump
112
162
  class Subset
113
- def self.serialize(io, tag, subset, level = 0)
114
- io.write " "*level
115
- io.write "#{tag}:\n"
116
- ONIX::Serializer::Traverser.recursive_serialize(Dump, io, subset, tag, level+1)
163
+ def self.serialize(io, subset, tag, level = 0)
164
+ io.write " " * level
165
+ if subset.attributes.length > 0
166
+ io.write "#{tag}[#{subset.attributes.to_a.map { |k, v| "#{k}: #{v.code}(#{v.human})" }.join(", ")}]\n"
167
+ else
168
+ io.write "#{tag}:\n"
169
+ end
170
+ ONIX::Serializer::Traverser.recursive_serialize(Dump, io, subset, tag, level + 1)
117
171
  end
118
172
  end
119
173
 
120
174
  class Primitive
121
- def self.serialize(io, tag, data, level = 0)
122
- unless data.respond_to?(:empty?) ? !!data.empty? : !data # rails blank?
123
- io.write " "*level
124
- io.write "#{tag} : #{data}\n"
175
+ def self.serialize(io, val, tag, level = 0)
176
+ io.write " " * level
177
+ if val.is_a?(ONIX::TextWithAttributes)
178
+ io.write "#{tag}[#{val.attributes.to_a.map { |k, v| "#{k}: #{v.code}(#{v.human})" }.join(", ")}]: #{val.to_s}\n"
179
+ else
180
+ io.write "#{tag}: #{val}\n"
125
181
  end
126
182
  end
127
183
  end
128
184
 
129
185
  class Date
130
186
  def self.serialize(io, date, parent_tag = nil, level = 0)
131
- io.write " "*level
187
+ io.write " " * level
132
188
  io.write "#{parent_tag}: #{date.date}\n"
133
189
  end
134
190
  end
135
191
 
136
192
  class Code
137
193
  def self.serialize(io, code, parent_tag = nil, level = 0)
138
- io.write " "*level
194
+ io.write " " * level
139
195
  io.write "#{parent_tag}: #{code.human}(#{code.code})\n"
140
196
  end
141
197
  end
142
-
143
- class Entity
144
- def self.serialize(io, entity, parent_tag = nil, level = 0)
145
- io.write " "*level
146
- io.write "#{parent_tag}: #{entity.name}\n"
147
- if entity.role
148
- io.write " "*(level+1)
149
- io.write "Role: #{entity.role.human}(#{entity.role.code})\n"
150
- end
151
- end
152
- end
153
198
  end
154
-
155
199
  end
156
- end
200
+ end