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
@@ -1,18 +1,14 @@
1
- module ONIX
2
- class TextContent < SubsetDSL
3
- element "TextType", :subset, :shortcut => :type
4
- element "ContentAudience", :subset
5
- element "Text", :text
6
- element "TextAuthor", :text
7
- element "SourceTitle", :text
8
-
9
- scope :description, lambda { human_code_match(:text_type, "Description") }
10
- scope :short_description, lambda { human_code_match(:text_type, "ShortDescriptionannotation") }
11
- end
1
+ require 'onix/text_content'
2
+ require 'onix/supporting_resource'
3
+ require 'onix/cited_content'
4
+ require 'onix/prize'
12
5
 
6
+ module ONIX
13
7
  class CollateralDetail < SubsetDSL
14
- elements "TextContent", :subset
15
- elements "SupportingResource", :subset
8
+ elements "TextContent", :subset, :cardinality => 0..n
9
+ elements "CitedContent", :subset, :cardinality => 0..n
10
+ elements "SupportingResource", :subset, :cardinality => 0..n
11
+ elements "Prize", :subset, :cardinality => 0..n
16
12
 
17
13
  # @!group High level
18
14
 
@@ -1,9 +1,16 @@
1
+ require 'onix/collection_sequence'
2
+
1
3
  module ONIX
2
4
  class Collection < SubsetDSL
3
- element "CollectionType", :subset, :shortcut => :type
4
- elements "CollectionIdentifier", :subset, :shortcut => :identifiers
5
- elements "TitleDetail", :subset
6
- elements "CollectionSequence", :subset, :shortcut => :sequences
5
+ element "CollectionType", :subset, :shortcut => :type, :cardinality => 1
6
+ element "SourceName", :text, :cardinality => 0..1
7
+ elements "CollectionIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
8
+ elements "CollectionSequence", :subset, :shortcut => :sequences, :cardinality => 0..n
9
+ elements "TitleDetail", :subset, :cardinality => 0..n
10
+ elements "Contributor", :subset, :cardinality => 0..n
11
+ elements "ContributorStatement", :text, :cardinality => 0..n
12
+ elements "ContributorStatement", :text, :cardinality => 0..n
13
+ element "NoContributor", :bool, :cardinality => 0..1
7
14
 
8
15
  scope :publisher, lambda { human_code_match(:collection_type, "PublisherCollection") }
9
16
 
@@ -1,7 +1,7 @@
1
1
  module ONIX
2
2
  class CollectionSequence < SubsetDSL
3
- element "CollectionSequenceType", :subset, :shortcut => :type
4
- element "CollectionSequenceTypeName", :string, :shortcut => :type_name
5
- element "CollectionSequenceNumber", :string, :shortcut => :number
3
+ element "CollectionSequenceType", :subset, :shortcut => :type, :cardinality => 1
4
+ element "CollectionSequenceTypeName", :string, :shortcut => :type_name, :cardinality => 0..1
5
+ element "CollectionSequenceNumber", :string, :shortcut => :number, :cardinality => 1
6
6
  end
7
7
  end
@@ -0,0 +1,17 @@
1
+ require 'onix/code'
2
+ require 'onix/identifier'
3
+
4
+ module ONIX
5
+ class ComparisonProductPrice < SubsetDSL
6
+ elements "ProductIdentifier", :subset, :cardinality => 1..n
7
+ element "PriceType", :subset, :shortcut => :type, :cardinality => 0..1
8
+ element "PriceAmount", :float,
9
+ {
10
+ :shortcut => :amount,
11
+ :parse_lambda => lambda { |v| (v * 100).round },
12
+ :serialize_lambda => lambda { |v| v / 100.0 },
13
+ :cardinality => 1
14
+ }
15
+ element "CurrencyCode", :text, :shortcut => :currency, :cardinality => 0..1
16
+ end
17
+ end
@@ -0,0 +1,6 @@
1
+ module ONIX
2
+ class Complexity < SubsetDSL
3
+ element "ComplexitySchemeIdentifier", :subset, :cardinality => 1
4
+ element "ComplexityCode", :text, :cardinality => 1
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ require 'onix/content_item'
2
+
3
+ module ONIX
4
+ class ContentDetail < SubsetDSL
5
+ elements "ContentItem", :subset, :cardinality => 0..n
6
+ end
7
+ end
@@ -0,0 +1,32 @@
1
+ require 'onix/text_item'
2
+ require 'onix/contributor'
3
+ require 'onix/language'
4
+ require 'onix/subject'
5
+ require 'onix/title_detail'
6
+ require 'onix/text_content'
7
+ require 'onix/cited_content'
8
+ require 'onix/supporting_resource'
9
+ require 'onix/related_work'
10
+ require 'onix/related_product'
11
+
12
+ module ONIX
13
+ class ContentItem < SubsetDSL
14
+ element "LevelSequenceNumber", :integer, :cardinality => 0..1
15
+ element "TextItem", :subset, :cardinality => 0..1
16
+ # element "AVItem", :subset, :cardinality => 0..1
17
+ element "ComponentTypeName", :text, :cardinality => 0..1
18
+ element "ComponentNumber", :text, :cardinality => 0..1
19
+ elements "TitleDetail", :subset, :cardinality => 0..n
20
+ elements "Contributor", :subset, :cardinality => 0..n
21
+ elements "ContributorStatement", :text, :cardinality => 0..n
22
+ element "NoContributor", :bool, :cardinality => 0..1
23
+ elements "Language", :subset, :cardinality => 0..n
24
+ elements "Subject", :subset, :cardinality => 0..n
25
+ # elements "NameAsSubject", :subset, :cardinality => 0..n
26
+ elements "TextContent", :subset, :cardinality => 0..n
27
+ elements "CitedContent", :subset, :cardinality => 0..n
28
+ elements "SupportingResource", :subset, :cardinality => 0..n
29
+ elements "RelatedWork", :subset, :cardinality => 0..n
30
+ elements "RelatedProduct", :subset, :cardinality => 0..n
31
+ end
32
+ end
@@ -1,49 +1,70 @@
1
1
  require 'onix/subset'
2
2
  require 'onix/website'
3
+ require 'onix/professional_affiliation'
4
+ require 'onix/contributor_place'
3
5
 
4
6
  module ONIX
5
7
  class Contributor < SubsetDSL
6
- element "SequenceNumber", :integer
7
- element "ContributorRole", :subset, :shortcut => :role
8
- elements "NameIdentifier", :subset, :shortcut => :identifiers
9
- element "PersonName", :text
10
- element "PersonNameInverted", :text
11
- element "NamesBeforeKey", :text, :shortcut => :name_before_key
12
- element "KeyNames", :text
13
- element "CorporateName", :text
14
- element "CorporateNameInverted", :text
15
- element "BiographicalNote", :text
16
- elements "Website", :subset
17
- element "ContributorPlace", :subset, :shortcut => :place
18
- elements "ContributorDate", :subset, :shortcut => :dates
8
+ element "SequenceNumber", :integer, :cardinality => 0..1
9
+ element "ContributorRole", :subset, :shortcut => :role, :cardinality => 1..n
10
+ elements "FromLanguage", :subset, :klass => "LanguageCode", :cardinality => 0..n
11
+ elements "ToLanguage", :subset, :klass => "LanguageCode", :cardinality => 0..n
12
+ # element "NameType", :subset, :cardinality => 0..1
13
+ elements "NameIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
14
+ element "PersonName", :text, :cardinality => 0..1
15
+ element "PersonNameInverted", :text, :cardinality => 0..1
16
+ element "TitlesBeforeNames", :text, :cardinality => 0..1
17
+ element "NamesBeforeKey", :text, :shortcut => :name_before_key, :cardinality => 0..1
18
+ element "PrefixToKey", :text, :cardinality => 0..1
19
+ element "KeyNames", :text, :cardinality => 0..1
20
+ element "NamesAfterKey", :text, :cardinality => 0..1
21
+ element "SuffixToKey", :text, :cardinality => 0..1
22
+ element "LettersAfterNames", :text, :cardinality => 0..1
23
+ element "TitlesAfterNames", :text, :cardinality => 0..1
24
+ # element "Gender", :subset, :cardinality => 0..1
25
+ element "CorporateName", :text, :cardinality => 0..1
26
+ element "CorporateNameInverted", :text, :cardinality => 0..1
27
+ # element "UnnamedPersons", :subset, :cardinality => 0..1
28
+ # elements "AlternativeName", :subset, :cardinality => 0..n
29
+ elements "ContributorDate", :subset, :shortcut => :dates, :cardinality => 0..n
30
+ elements "ProfessionalAffiliation", :subset, :cardinality => 0..n
31
+ elements "Prize", :subset, :cardinality => 0..n
32
+ elements "BiographicalNote", :text, :shortcut => :biographies, :cardinality => 0..n
33
+ elements "Website", :subset, :cardinality => 0..n
34
+ elements "ContributorDescription", :text, :cardinality => 0..n
35
+ elements "ContributorPlace", :subset, :shortcut => :places, :cardinality => 0..n
19
36
 
20
37
  # @!group High level
21
38
  # flatten person name (firstname lastname)
22
39
  # @return [String]
23
40
  def name
24
- return @person_name if @person_name
41
+ return person_name if person_name
25
42
 
26
- if @key_names
27
- if @names_before_key
28
- return "#{@names_before_key} #{@key_names}"
43
+ if key_names
44
+ if names_before_key
45
+ return "#{names_before_key} #{key_names}"
29
46
  else
30
- return @key_names
47
+ return key_names
31
48
  end
32
49
  end
33
50
 
34
- @corporate_name
51
+ corporate_name
35
52
  end
36
53
 
37
54
  # inverted flatten person name
38
55
  # @return [String]
39
56
  def inverted_name
40
- @person_name_inverted || @corporate_name_inverted
57
+ person_name_inverted || corporate_name_inverted
41
58
  end
42
59
 
43
60
  # biography string with HTML
44
61
  # @return [String]
45
62
  def biography
46
- @biographical_note
63
+ self.biographies.first
64
+ end
65
+
66
+ def place
67
+ self.places.first
47
68
  end
48
69
 
49
70
  # raw biography string without HTML
@@ -72,17 +93,4 @@ module ONIX
72
93
 
73
94
  # @!endgroup
74
95
  end
75
-
76
- class ContributorPlace < SubsetDSL
77
- element "ContributorPlaceRelator", :subset
78
- element "CountryCode", :subset
79
-
80
- def relator
81
- @contributor_place_relator
82
- end
83
-
84
- def country_code
85
- @country_code.code
86
- end
87
- end
88
96
  end
@@ -0,0 +1,12 @@
1
+ module ONIX
2
+ class ContributorPlace < SubsetDSL
3
+ element "ContributorPlaceRelator", :subset, :shortcut => :relator, :cardinality => 1
4
+ element "CountryCode", :subset, :cardinality => 0..1
5
+ element "RegionCode", :subset, :cardinality => 0..1
6
+ elements "LocationName", :text, :cardinality => 0..n
7
+
8
+ def country_code
9
+ @country_code.code
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ module ONIX
2
+ class CopyrightStatement < SubsetDSL
3
+ element "CopyrightType", :subset, :cardinality => 0..1
4
+ elements "CopyrightYear", :text, :cardinality => 0..n
5
+ # elements "CopyrightOwner", :subset, :cardinality => 0..n
6
+ end
7
+ end
data/lib/onix/date.rb CHANGED
@@ -1,52 +1,39 @@
1
1
  module ONIX
2
2
  module DateHelper
3
- attr_accessor :date_format, :date
4
-
5
- def parse_date(n)
6
- @date_format = DateFormat.from_code("00")
7
- date_txt = nil
8
- @date = nil
9
- n.elements.each do |t|
10
- case t
11
- when tag_match("DateFormat")
12
- @date_format = DateFormat.parse(t)
13
- when tag_match("Date")
14
- date_txt = t.text
15
- end
3
+ attr_accessor :date_format, :date, :datetime
16
4
 
17
- if t["dateformat"]
18
- @date_format = DateFormat.from_code(t["dateformat"])
5
+ def parse_date
6
+ if @date_format
7
+ @deprecated_date_format = true
8
+ else
9
+ if @date.is_a?(TextWithAttributes)
10
+ @date_format = @date.attributes["dateformat"]
19
11
  end
20
12
  end
21
13
 
22
- code_format = format_from_code(@date_format.code)
14
+ @datetime = strpdate!(@date, @date_format)
15
+ @date = @datetime ? @datetime.to_date : nil
16
+ end
17
+
18
+ def strpdate!(date_txt, date_format)
19
+ date_format ||= DateFormat.from_code("00")
20
+ code_format = format_from_code(date_format.code)
23
21
  text_format = format_from_string(date_txt)
24
22
 
25
23
  format = code_format
26
24
 
27
25
  if code_format != text_format
28
- # puts "EEE date #{n.text} (#{text_format}) do not match code #{@format.code} (#{code_format})"
26
+ puts "WARN incorrect date format #{text_format} != #{code_format}"
29
27
  format = text_format
30
28
  end
31
29
 
32
30
  begin
33
- if format
34
- case @date_format.code
35
- when "00"
36
- @date = Date.strptime(date_txt, format)
37
- when "01"
38
- @date = Date.strptime(date_txt, format)
39
- when "05"
40
- @date = Date.strptime(date_txt, format)
41
- when "14"
42
- @date = Time.strptime(date_txt, format)
43
- else
44
- @date = nil
45
- end
46
- end
47
- rescue
31
+ datetime = Time.strptime(date_txt, format) if format && %w[00 01 02 05 13 14].include?(date_format.code)
32
+ rescue => e
48
33
  # invalid date
49
34
  end
35
+
36
+ datetime
50
37
  end
51
38
 
52
39
  def format_from_code(code)
@@ -55,8 +42,12 @@ module ONIX
55
42
  "%Y%m%d"
56
43
  when "01"
57
44
  "%Y%m"
45
+ when "02"
46
+ "%Y%%W"
58
47
  when "05"
59
48
  "%Y"
49
+ when "13"
50
+ "%Y%m%dT%H%M%S"
60
51
  when "14"
61
52
  "%Y%m%dT%H%M%S%z"
62
53
  else
@@ -82,30 +73,77 @@ module ONIX
82
73
  end
83
74
 
84
75
  def time
85
- @date.to_time
76
+ @datetime
77
+ end
78
+ end
79
+
80
+ # support for datestamp attribute and SentDateTime
81
+ class DateStamp
82
+ attr_accessor :format, :datetime
83
+
84
+ def initialize(dt = nil, fmt = "%Y%m%d")
85
+ @datetime = dt
86
+ @format = fmt unless @datetime.is_a?(String)
87
+ end
88
+
89
+ def supported_formats
90
+ ["%Y%m%dT%H%M%S%z", "%Y%m%dT%H%M%S", "%Y%m%dT%H%M%z", "%Y%m%dT%H%M", "%Y%m%d"]
91
+ end
92
+
93
+ def parse(tm)
94
+ @format = nil
95
+ found_format = nil
96
+ supported_formats.each do |supported_format|
97
+ begin
98
+ @datetime = Time.strptime(tm, supported_format)
99
+ found_format = supported_format
100
+ break
101
+ rescue
102
+ end
103
+ end
104
+ @format = found_format
105
+ @datetime = tm unless @format
106
+ end
107
+
108
+ def self.from_code(code)
109
+ ds = self.new
110
+ ds.parse(code)
111
+ ds
112
+ end
113
+
114
+ def human
115
+ @datetime
116
+ end
117
+
118
+ def code
119
+ @format ? @datetime.strftime(@format) : @datetime
86
120
  end
87
121
  end
88
122
 
89
123
  class BaseDate < SubsetDSL
90
124
  include DateHelper
125
+ element "DateFormat", :subset
126
+ element "Date", :text
127
+ attr_accessor :deprecated_date_format
128
+
129
+ def initialize
130
+ super
131
+ @deprecated_date_format = false
132
+ end
91
133
 
92
134
  def parse(n)
93
135
  super
94
- parse_date(n)
136
+ parse_date
95
137
  end
96
138
  end
97
139
 
98
140
  class MarketDate < BaseDate
99
- element "Date", :ignore
100
- element "DateFormat", :ignore
101
141
  element "MarketDateRole", :subset, :shortcut => :role
102
142
 
103
143
  scope :availability, lambda { human_code_match(:market_date_role, ["PublicationDate", "EmbargoDate"]) }
104
144
  end
105
145
 
106
146
  class PriceDate < BaseDate
107
- element "Date", :ignore
108
- element "DateFormat", :ignore
109
147
  element "PriceDateRole", :subset, :shortcut => :role
110
148
 
111
149
  scope :from_date, lambda { human_code_match(:price_date_role, "FromDate") }
@@ -113,35 +151,27 @@ module ONIX
113
151
  end
114
152
 
115
153
  class SupplyDate < BaseDate
116
- element "Date", :ignore
117
- element "DateFormat", :ignore
118
154
  element "SupplyDateRole", :subset, :shortcut => :role
119
155
 
120
156
  scope :availability, lambda { human_code_match(:supply_date_role, ["ExpectedAvailabilityDate", "EmbargoDate"]) }
121
157
  end
122
158
 
123
159
  class PublishingDate < BaseDate
124
- element "Date", :ignore
125
- element "DateFormat", :ignore
126
160
  element "PublishingDateRole", :subset, :shortcut => :role
127
161
 
128
162
  scope :publication, lambda { human_code_match(:publishing_date_role, ["PublicationDate", "PublicationDateOfPrintCounterpart"]) }
129
- scope :embargo, lambda { human_code_match(:publishing_date_role, "EmbargoDate") }
163
+ scope :embargo, lambda { human_code_match(:publishing_date_role, "SalesEmbargoDate") }
130
164
  scope :preorder_embargo, lambda { human_code_match(:publishing_date_role, "PreorderEmbargoDate") }
131
165
  scope :public_announcement, lambda { human_code_match(:publishing_date_role, "PublicAnnouncementDate") }
132
166
  end
133
167
 
134
168
  class ContentDate < BaseDate
135
- element "Date", :ignore
136
- element "DateFormat", :ignore
137
169
  element "ContentDateRole", :subset, :shortcut => :role
138
170
 
139
171
  scope :last_updated, lambda { human_code_match(:content_date_role, "LastUpdated") }
140
172
  end
141
173
 
142
174
  class ContributorDate < BaseDate
143
- element "Date", :ignore
144
- element "DateFormat", :ignore
145
175
  element "ContributorDateRole", :subset, :shortcut => :role
146
176
  end
147
177
  end