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
@@ -1,49 +1,84 @@
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
+
13
+ # element "NameType", :subset, :cardinality => 0..1
14
+
15
+
16
+ elements "NameIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
17
+ element "PersonName", :text, :cardinality => 0..1
18
+ element "PersonNameInverted", :text, :cardinality => 0..1
19
+ element "TitlesBeforeNames", :text, :cardinality => 0..1
20
+ element "NamesBeforeKey", :text, :shortcut => :name_before_key, :cardinality => 0..1
21
+ element "PrefixToKey", :text, :cardinality => 0..1
22
+ element "KeyNames", :text, :cardinality => 0..1
23
+ element "NamesAfterKey", :text, :cardinality => 0..1
24
+ element "SuffixToKey", :text, :cardinality => 0..1
25
+ element "LettersAfterNames", :text, :cardinality => 0..1
26
+ element "TitlesAfterNames", :text, :cardinality => 0..1
27
+
28
+ # element "Gender", :subset, :cardinality => 0..1
29
+
30
+
31
+ element "CorporateName", :text, :cardinality => 0..1
32
+ element "CorporateNameInverted", :text, :cardinality => 0..1
33
+
34
+ # element "UnnamedPersons", :subset, :cardinality => 0..1
35
+ # elements "AlternativeName", :subset, :cardinality => 0..n
36
+
37
+
38
+ elements "ContributorDate", :subset, :shortcut => :dates, :cardinality => 0..n
39
+ elements "ProfessionalAffiliation", :subset, :cardinality => 0..n
40
+ elements "Prize", :subset, :cardinality => 0..n
41
+ elements "BiographicalNote", :text, :shortcut => :biographies, :cardinality => 0..n
42
+ elements "Website", :subset, :cardinality => 0..n
43
+ elements "ContributorDescription", :text, :cardinality => 0..n
44
+ elements "ContributorPlace", :subset, :shortcut => :places, :cardinality => 0..n
45
+
46
+ # @!group Shortcuts
47
+
48
+ # @return [ContributorPlace]
49
+ def place
50
+ self.places.first
51
+ end
52
+
53
+ # !@endgroup
19
54
 
20
55
  # @!group High level
21
56
  # flatten person name (firstname lastname)
22
57
  # @return [String]
23
58
  def name
24
- return @person_name if @person_name
59
+ return person_name if person_name
25
60
 
26
- if @key_names
27
- if @names_before_key
28
- return "#{@names_before_key} #{@key_names}"
61
+ if key_names
62
+ if names_before_key
63
+ return "#{names_before_key} #{key_names}"
29
64
  else
30
- return @key_names
65
+ return key_names
31
66
  end
32
67
  end
33
68
 
34
- @corporate_name
69
+ corporate_name
35
70
  end
36
71
 
37
72
  # inverted flatten person name
38
73
  # @return [String]
39
74
  def inverted_name
40
- @person_name_inverted || @corporate_name_inverted
75
+ person_name_inverted || corporate_name_inverted
41
76
  end
42
77
 
43
78
  # biography string with HTML
44
79
  # @return [String]
45
80
  def biography
46
- @biographical_note
81
+ self.biographies.first
47
82
  end
48
83
 
49
84
  # raw biography string without HTML
@@ -72,17 +107,4 @@ module ONIX
72
107
 
73
108
  # @!endgroup
74
109
  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
110
  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,8 @@
1
+ module ONIX
2
+ class CopyrightStatement < SubsetDSL
3
+ element "CopyrightType", :subset, :cardinality => 0..1
4
+ elements "CopyrightYear", :text, :cardinality => 0..n
5
+
6
+ # elements "CopyrightOwner", :subset, :cardinality => 0..n
7
+ end
8
+ end
data/lib/onix/date.rb CHANGED
@@ -1,62 +1,63 @@
1
1
  module ONIX
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
16
-
17
- if t["dateformat"]
18
- @date_format = DateFormat.from_code(t["dateformat"])
2
+ module DateMethods
3
+ # @return [DateFormat]
4
+ attr_accessor :date_format
5
+ # @return [Date]
6
+ attr_accessor :date
7
+ # @return [Time]
8
+ attr_accessor :datetime
9
+
10
+ def parse_date
11
+ if @date_format
12
+ @deprecated_date_format = true
13
+ else
14
+ if @date.is_a?(TextWithAttributes)
15
+ @date_format = @date.attributes["dateformat"]
19
16
  end
20
17
  end
21
18
 
22
- code_format = format_from_code(@date_format.code)
19
+ @datetime = strpdate!(@date, @date_format)
20
+ @date = @datetime ? @datetime.to_date : nil
21
+ end
22
+
23
+ # @param [String] date_txt
24
+ # @param [DateFormat] date_format
25
+ # @return [Time]
26
+ def strpdate!(date_txt, date_format)
27
+ date_format ||= DateFormat.from_code("00")
28
+ code_format = format_from_code(date_format.code)
23
29
  text_format = format_from_string(date_txt)
24
30
 
25
31
  format = code_format
26
32
 
27
33
  if code_format != text_format
28
- # puts "EEE date #{n.text} (#{text_format}) do not match code #{@format.code} (#{code_format})"
34
+ # puts "WARN incorrect date format #{text_format} != #{code_format}"
29
35
  format = text_format
30
36
  end
31
37
 
32
38
  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
39
+ datetime = Time.strptime(date_txt, format) if format && %w[00 01 02 05 13 14].include?(date_format.code)
40
+ rescue => e
48
41
  # invalid date
49
42
  end
43
+
44
+ datetime
50
45
  end
51
46
 
47
+ # @param [String] code
48
+ # @return [String]
52
49
  def format_from_code(code)
53
50
  case code
54
51
  when "00"
55
52
  "%Y%m%d"
56
53
  when "01"
57
54
  "%Y%m"
55
+ when "02"
56
+ "%Y%%W"
58
57
  when "05"
59
58
  "%Y"
59
+ when "13"
60
+ "%Y%m%dT%H%M%S"
60
61
  when "14"
61
62
  "%Y%m%dT%H%M%S%z"
62
63
  else
@@ -64,6 +65,7 @@ module ONIX
64
65
  end
65
66
  end
66
67
 
68
+ # @param [String] str
67
69
  def format_from_string(str)
68
70
  case str
69
71
  when /^\d{4}\d{2}\d{2}T\d{2}\d{2}\d{2}/
@@ -81,67 +83,116 @@ module ONIX
81
83
  end
82
84
  end
83
85
 
86
+ # @return [Time]
84
87
  def time
85
- @date.to_time
88
+ @datetime
89
+ end
90
+ end
91
+
92
+ # support for datestamp attribute and SentDateTime
93
+ class DateStamp
94
+ attr_accessor :format, :datetime
95
+
96
+ def initialize(dt = nil, fmt = "%Y%m%d")
97
+ @datetime = dt
98
+ @format = fmt unless @datetime.is_a?(String)
99
+ end
100
+
101
+ def supported_formats
102
+ ["%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"]
103
+ end
104
+
105
+ def parse(tm)
106
+ @format = nil
107
+ found_format = nil
108
+ supported_formats.each do |supported_format|
109
+ begin
110
+ @datetime = Time.strptime(tm, supported_format)
111
+ found_format = supported_format
112
+ break
113
+ rescue
114
+ end
115
+ end
116
+ @format = found_format
117
+ @datetime = tm unless @format
118
+ end
119
+
120
+ def self.from_code(code)
121
+ ds = self.new
122
+ ds.parse(code)
123
+ ds
124
+ end
125
+
126
+ def human
127
+ @datetime
128
+ end
129
+
130
+ def code
131
+ @format ? @datetime.strftime(@format) : @datetime
86
132
  end
87
133
  end
88
134
 
89
135
  class BaseDate < SubsetDSL
90
- include DateHelper
136
+ include DateMethods
137
+
138
+ class << self
139
+ def date_elements(role)
140
+ element role, :subset, :shortcut => :role
141
+ element "DateFormat", :subset
142
+ element "Date", :text
143
+ end
144
+ end
145
+
146
+ # use former date representation
147
+ # @return [Boolean]
148
+ attr_accessor :deprecated_date_format
149
+
150
+ def initialize
151
+ super
152
+ @deprecated_date_format = false
153
+ end
91
154
 
92
155
  def parse(n)
93
156
  super
94
- parse_date(n)
157
+ parse_date
95
158
  end
96
159
  end
97
160
 
98
161
  class MarketDate < BaseDate
99
- element "Date", :ignore
100
- element "DateFormat", :ignore
101
- element "MarketDateRole", :subset, :shortcut => :role
162
+ date_elements "MarketDateRole"
102
163
 
103
164
  scope :availability, lambda { human_code_match(:market_date_role, ["PublicationDate", "EmbargoDate"]) }
104
165
  end
105
166
 
106
167
  class PriceDate < BaseDate
107
- element "Date", :ignore
108
- element "DateFormat", :ignore
109
- element "PriceDateRole", :subset, :shortcut => :role
168
+ date_elements "PriceDateRole"
110
169
 
111
170
  scope :from_date, lambda { human_code_match(:price_date_role, "FromDate") }
112
171
  scope :until_date, lambda { human_code_match(:price_date_role, "UntilDate") }
113
172
  end
114
173
 
115
174
  class SupplyDate < BaseDate
116
- element "Date", :ignore
117
- element "DateFormat", :ignore
118
- element "SupplyDateRole", :subset, :shortcut => :role
175
+ date_elements "SupplyDateRole"
119
176
 
120
177
  scope :availability, lambda { human_code_match(:supply_date_role, ["ExpectedAvailabilityDate", "EmbargoDate"]) }
121
178
  end
122
179
 
123
180
  class PublishingDate < BaseDate
124
- element "Date", :ignore
125
- element "DateFormat", :ignore
126
- element "PublishingDateRole", :subset, :shortcut => :role
181
+ date_elements "PublishingDateRole"
127
182
 
128
183
  scope :publication, lambda { human_code_match(:publishing_date_role, ["PublicationDate", "PublicationDateOfPrintCounterpart"]) }
129
- scope :embargo, lambda { human_code_match(:publishing_date_role, "EmbargoDate") }
184
+ scope :embargo, lambda { human_code_match(:publishing_date_role, "SalesEmbargoDate") }
130
185
  scope :preorder_embargo, lambda { human_code_match(:publishing_date_role, "PreorderEmbargoDate") }
131
186
  scope :public_announcement, lambda { human_code_match(:publishing_date_role, "PublicAnnouncementDate") }
132
187
  end
133
188
 
134
189
  class ContentDate < BaseDate
135
- element "Date", :ignore
136
- element "DateFormat", :ignore
137
- element "ContentDateRole", :subset, :shortcut => :role
190
+ date_elements "ContentDateRole"
138
191
 
139
192
  scope :last_updated, lambda { human_code_match(:content_date_role, "LastUpdated") }
140
193
  end
141
194
 
142
195
  class ContributorDate < BaseDate
143
- element "Date", :ignore
144
- element "DateFormat", :ignore
145
- element "ContributorDateRole", :subset, :shortcut => :role
196
+ date_elements "ContributorDateRole"
146
197
  end
147
198
  end
@@ -1,53 +1,123 @@
1
1
  require 'onix/collection'
2
- require 'onix/collection_sequence'
3
2
  require 'onix/epub_usage_constraint'
4
- require 'onix/epub_usage_limit'
3
+ require 'onix/epub_license'
5
4
  require 'onix/extent'
6
5
  require 'onix/language'
6
+ require 'onix/ancillary_content'
7
7
  require 'onix/product_form_feature'
8
+ require 'onix/product_classification'
8
9
  require 'onix/product_part'
9
10
  require 'onix/title_detail'
10
11
  require 'onix/contributor'
12
+ require 'onix/measure'
11
13
  require 'onix/subject'
14
+ require 'onix/audience'
15
+ require 'onix/audience_range'
16
+ require 'onix/complexity'
12
17
 
13
18
  module ONIX
14
19
  class DescriptiveDetail < SubsetDSL
15
- element "ProductComposition", :subset, :shortcut => :composition
16
- element "ProductForm", :subset, :shortcut => :form
17
- elements "ProductFormDetail", :subset, :shortcut => :form_details
18
- elements "ProductFormFeature", :subset, :shortcut => :form_features
19
- element "ProductFormDescription", :text, :shortcut => :file_description
20
- element "PrimaryContentType", :subset, {:klass => "ProductContentType"}
21
- elements "ProductContentType", :subset, :shortcut => :content_types
22
- elements "EpubTechnicalProtection", :subset
23
- elements "EpubUsageConstraint", :subset
24
- elements "ProductPart", :subset, :shortcut => :parts
25
- elements "Collection", :subset
26
- element "NoCollection", :ignore
27
- elements "TitleDetail", :subset
28
- elements "Contributor", :subset
29
- element "EditionType", :subset
30
- element "EditionNumber", :integer
31
- element "NoEdition", :ignore
32
- elements "Language", :subset
33
- elements "Extent", :subset
34
- elements "Subject", :subset
35
- elements "AudienceCode", :subset
20
+ element "ProductComposition", :subset, :shortcut => :composition, :cardinality => 1
21
+ element "ProductForm", :subset, :shortcut => :form, :cardinality => 1
22
+ elements "ProductFormDetail", :subset, :shortcut => :form_details, :cardinality => 0..n
23
+ elements "ProductFormFeature", :subset, :shortcut => :form_features, :cardinality => 0..n
24
+ element "ProductPackaging", :subset, :cardinality => 0..1
25
+ element "ProductFormDescription", :text, :shortcut => :file_description, :cardinality => 0..n
26
+ element "TradeCategory", :subset, :cardinality => 0..1
27
+ element "PrimaryContentType", :subset, :klass => "ProductContentType"
28
+ elements "ProductContentType", :subset, :shortcut => :content_types, :cardinality => 0..n
29
+ elements "Measure", :subset, :cardinality => 0..n
30
+ element "CountryOfManufacture", :subset, :klass=>"CountryCode", :cardinality => 0..1
31
+ elements "EpubTechnicalProtection", :subset, :cardinality => 0..n
32
+ elements "EpubUsageConstraint", :subset, :cardinality => 0..n
33
+ element "EpubLicense", :subset, :cardinality => 0..1
34
+ elements "MapScale", :integer, :cardinality => 0..n
35
+ elements "ProductClassification", :subset, :cardinality => 0..n
36
+ elements "ProductPart", :subset, :shortcut => :parts, :cardinality => 0..n
37
+ elements "Collection", :subset, :cardinality => 0..n
38
+ element "NoCollection", :bool, :cardinality => 0..1
39
+ elements "TitleDetail", :subset, :cardinality => 0..n
40
+ element "ThesisType", :subset, :cardinality => 0..1
41
+ element "ThesisPresentedTo", :text, :cardinality => 0..1
42
+ element "ThesisYear", :text, :cardinality => 0..1
43
+ elements "Contributor", :subset, :cardinality => 0..n
44
+ elements "ContributorStatement", :text, :cardinality => 0..n
45
+ element "NoContributor", :bool, :cardinality => 0..1
46
+
47
+ # elements "Conference", :subset, :cardinality => 0..n
48
+ # elements "Event", :subset, :cardinality => 0..n
49
+
50
+
51
+ element "EditionType", :subset, :cardinality => 0..n
52
+ element "EditionNumber", :integer, :cardinality => 0..1
53
+ element "EditionVersionNumber", :text, :cardinality => 0..1
54
+ elements "EditionStatement", :text, :cardinality => 0..n
55
+ element "NoEdition", :bool, :cardinality => 0..1
56
+
57
+ # element "ReligiousText", :subset, :cardinality => 0..1
58
+
59
+
60
+ elements "Language", :subset, :cardinality => 0..1
61
+ elements "Extent", :subset, :cardinality => 0..n
62
+ element "Illustrated", :subset, :cardinality => 0..1
63
+ element "NumberOfIllustrations", :integer, :cardinality => 0..1
64
+ elements "IllustrationsNote", :text, :cardinality => 0..n
65
+ elements "AncillaryContent", :subset, :cardinality => 0..n
66
+ elements "Subject", :subset, :cardinality => 0..n
67
+
68
+ # elements "NameAsSubject", :subset, :cardinality => 0..n
69
+
70
+
71
+ elements "AudienceCode", :subset, :cardinality => 0..n
72
+ elements "Audience", :subset, :cardinality => 0..n
73
+ elements "AudienceRange", :subset, :cardinality => 0..n
74
+ elements "AudienceDescription", :text, :cardinality => 0..n
75
+ elements "Complexity", :subset, :cardinality => 0..n
36
76
 
37
77
  # @!group Shortcuts
38
78
 
79
+ # @return [Extent]
39
80
  def pages_extent
40
81
  @extents.page.first
41
82
  end
42
83
 
84
+ # @return [TitleElement]
43
85
  def product_title_element
44
86
  @title_details.distinctive_title.first.title_elements.product_level.first if @title_details.distinctive_title.first
45
87
  end
46
88
 
89
+ # @return [Array<ProductFormDetail>]
47
90
  def file_formats
48
91
  @product_form_details.select { |fd| fd.code =~ /^E1.*/ }
49
92
  end
50
93
 
94
+ # @return [Collection]
95
+ def publisher_collection
96
+ @collections.publisher.first
97
+ end
98
+
99
+ # @return [Extent]
100
+ def filesize_extent
101
+ @extents.filesize.first
102
+ end
103
+
104
+ # @return [Array<ProductFormDetail>]
105
+ def audio_formats
106
+ @product_form_details.select { |fd| fd.code =~ /^A.*/ }
107
+ end
108
+
109
+ # BISAC categories
110
+ # @return [Array<Subject>]
111
+ def bisac_categories
112
+ @subjects.bisac
113
+ end
114
+
115
+ # CLIL categories
116
+ # @return [Array<Subject>]
117
+ def clil_categories
118
+ @subjects.clil
119
+ end
120
+
51
121
  # @!endgroup
52
122
 
53
123
  # @!group High level
@@ -72,10 +142,6 @@ module ONIX
72
142
  end
73
143
  end
74
144
 
75
- def filesize_extent
76
- @extents.filesize.first
77
- end
78
-
79
145
  # file size in bytes
80
146
  # @return [Integer]
81
147
  def filesize
@@ -114,18 +180,15 @@ module ONIX
114
180
  not audio_formats.empty?
115
181
  end
116
182
 
183
+ # @return [String]
117
184
  def audio_format
118
185
  self.audio_formats.first.human if self.audio_formats.first
119
186
  end
120
187
 
121
- def audio_formats
122
- @product_form_details.select { |fd| fd.code =~ /^A.*/ }
123
- end
124
-
125
188
  # is digital offer a bundle ?
126
189
  # @return [Boolean]
127
190
  def bundle?
128
- @product_composition.human == "MultipleitemRetailProduct"
191
+ @product_composition.human == "MultipleComponentRetailProduct"
129
192
  end
130
193
 
131
194
  # digital file format string (Epub,Pdf,AmazonKindle)
@@ -164,11 +227,12 @@ module ONIX
164
227
  # protections string array
165
228
  # @return [Array<String>]
166
229
  def protections
167
- return nil if @epub_technical_protections.length == 0
230
+ return [] if @epub_technical_protections.length == 0
168
231
  @epub_technical_protections.map(&:human)
169
232
  end
170
233
 
171
234
  # language of text
235
+ # @return [String]
172
236
  def language_of_text
173
237
  l = @languages.of_text.first
174
238
  if l
@@ -176,10 +240,6 @@ module ONIX
176
240
  end
177
241
  end
178
242
 
179
- def publisher_collection
180
- @collections.publisher.first
181
- end
182
-
183
243
  # publisher collection title
184
244
  # @return [String]
185
245
  def publisher_collection_title
@@ -188,24 +248,12 @@ module ONIX
188
248
  end
189
249
  end
190
250
 
191
- # BISAC categories
192
- # @return [Array<Subject>]
193
- def bisac_categories
194
- @subjects.bisac
195
- end
196
-
197
251
  # BISAC categories identifiers string array (eg: FIC000000)
198
252
  # @return [Array<String>]
199
253
  def bisac_categories_codes
200
254
  self.bisac_categories.map { |c| c.code }.uniq
201
255
  end
202
256
 
203
- # BISAC categories
204
- # @return [Array<Subject>]
205
- def clil_categories
206
- @subjects.clil
207
- end
208
-
209
257
  # CLIL categories identifier string array
210
258
  # @return [Array<String>]
211
259
  def clil_categories_codes
@@ -213,6 +261,7 @@ module ONIX
213
261
  end
214
262
 
215
263
  # keywords string array
264
+ # @return [Array<String>]
216
265
  def keywords
217
266
  kws = @subjects.keyword.map { |kw| kw.heading_text }.compact
218
267
  kws = kws.flat_map { |kw| kw.split(/;|,|\n/) }.map { |kw| kw.strip }
@@ -0,0 +1,9 @@
1
+ module ONIX
2
+ class Discount < SubsetDSL
3
+ element "DiscountType", :subset, :cardinality => 0..1
4
+ element "Quantity", :integer, :cardinality => 0..1
5
+ element "ToQuantity", :integer, :cardinality => 0..1
6
+ element "DiscountPercent", :text, :cardinality => 0..1
7
+ element "DiscountAmount", :text, :cardinality => 0..1
8
+ end
9
+ end
@@ -1,7 +1,7 @@
1
1
  module ONIX
2
2
  class DiscountCoded < SubsetDSL
3
- element "DiscountCodeType", :text, :shortcut => :code_type
4
- element "DiscountCodeTypeName", :text, :shortcut => :code_type_name
5
- element "DiscountCode", :text, :shortcut => :code
3
+ element "DiscountCodeType", :text, :shortcut => :code_type, :cardinality => 1
4
+ element "DiscountCodeTypeName", :text, :shortcut => :code_type_name, :cardinality => 0..1
5
+ element "DiscountCode", :text, :shortcut => :code, :cardinality => 1
6
6
  end
7
7
  end