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
data/lib/onix/entity.rb CHANGED
@@ -7,51 +7,25 @@ module ONIX
7
7
  end
8
8
 
9
9
  class Entity < SubsetDSL
10
- # entity name
11
- attr_accessor :name
12
- # entity role
13
- attr_accessor :role
14
- # entity Identifier list
15
- attr_accessor :identifiers
16
-
17
- include GlnMethods
10
+ include IdentifiersMethods::Gln
18
11
  include EntityHelper
19
12
 
20
- def initialize
21
- super
22
- @identifiers = []
23
- end
24
-
13
+ # @return [String]
25
14
  def self.role_tag
26
15
  "#{self.prefix}Role"
27
16
  end
28
17
 
18
+ # @return [String]
29
19
  def self.name_tag
30
20
  "#{self.prefix}Name"
31
21
  end
32
22
 
23
+ # @return [String]
33
24
  def self.identifier_tag
34
25
  "#{self.prefix}Identifier"
35
26
  end
36
27
 
37
- def parse(n)
38
- super
39
- n.children.each do |t|
40
- case t
41
- when tag_match(self.class.name_tag)
42
- @name = t.text
43
- when tag_match(self.class.role_tag)
44
- if self.class.role_class
45
- @role = self.class.role_class.parse(t)
46
- end
47
- when tag_match(self.class.identifier_tag)
48
- if self.class.identifier_class
49
- @identifiers << self.class.identifier_class.parse(t)
50
- end
51
- end
52
- end
53
- end
54
-
28
+ # @return [String]
55
29
  def self.prefix
56
30
  end
57
31
 
@@ -73,29 +47,40 @@ module ONIX
73
47
  define_singleton_method :role_class do
74
48
  return role
75
49
  end
50
+
51
+ self.element self.role_tag, :subset, :klass => self.role_class.to_s, :shortcut => :role, :cardinality => 1
52
+ self.elements self.identifier_tag, :subset, :klass => self.identifier_class.to_s, :shortcut => :identifiers, :cardinality => 0..n
53
+ self.element self.name_tag, :text, :shortcut => :name, :cardinality => 0..1
76
54
  end
77
55
  end
78
56
 
79
57
  class Agent < Entity
80
58
  entity_setup "Agent", AgentIdentifier, AgentRole
59
+ elements "Website", :subset, :cardinality => 0..n
81
60
  end
82
61
 
83
- class Imprint < Entity
84
- entity_setup "Imprint", ImprintIdentifier
62
+ class Imprint < SubsetDSL
63
+ include IdentifiersMethods::Gln
64
+
65
+ elements "ImprintIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
66
+ element "ImprintName", :text, :shortcut => :name, :cardinality => 0..1
85
67
  end
86
68
 
87
69
  class Supplier < Entity
88
- elements "Website", :subset
89
70
  entity_setup "Supplier", SupplierIdentifier, SupplierRole
71
+ elements "TelephoneNumber", :text, :cardinality => 0..n
72
+ elements "FaxNumber", :text, :cardinality => 0..n
73
+ elements "EmailAddress", :text, :cardinality => 0..n
74
+ elements "Website", :subset, :cardinality => 0..n
90
75
  end
91
76
 
92
77
  class Publisher < Entity
93
- elements "Website", :subset
94
- entity_setup "Publisher", PublisherIdentifier, PublishingRole
95
-
96
78
  # @note role tag is not PublisherRole but PublishingRole
97
79
  def self.role_tag
98
80
  "PublishingRole"
99
81
  end
82
+
83
+ entity_setup "Publisher", PublisherIdentifier, PublishingRole
84
+ elements "Website", :subset, :cardinality => 0..n
100
85
  end
101
86
  end
@@ -0,0 +1,8 @@
1
+ require 'onix/epub_license_expression'
2
+
3
+ module ONIX
4
+ class EpubLicense < SubsetDSL
5
+ elements "EpubLicenseName", :text, :cardinality => 1..n
6
+ elements "EpubLicenseExpression", :subset, :cardinality => 0..n
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ module ONIX
2
+ class EpubLicenseExpression < SubsetDSL
3
+ element "EpubLicenseExpressionType", :subset, :cardinality => 1
4
+ element "EpubLicenseExpressionTypeName", :text, :cardinality => 0..1
5
+ element "EpubLicenseExpressionLink", :text, :cardinality => 1
6
+ end
7
+ end
@@ -1,7 +1,9 @@
1
+ require 'onix/epub_usage_limit'
2
+
1
3
  module ONIX
2
4
  class EpubUsageConstraint < SubsetDSL
3
- element "EpubUsageType", :subset, :shortcut => :type
4
- element "EpubUsageStatus", :subset, :shortcut => :status
5
- elements "EpubUsageLimit", :subset, :shortcut => :limits
5
+ element "EpubUsageType", :subset, :shortcut => :type, :cardinality => 1
6
+ element "EpubUsageStatus", :subset, :shortcut => :status, :cardinality => 1
7
+ elements "EpubUsageLimit", :subset, :shortcut => :limits, :cardinality => 0..n
6
8
  end
7
9
  end
@@ -1,6 +1,6 @@
1
1
  module ONIX
2
2
  class EpubUsageLimit < SubsetDSL
3
- element "EpubUsageUnit", :subset, :shortcut => :unit
4
- element "Quantity", :integer
3
+ element "Quantity", :integer, :cardinality => 1
4
+ element "EpubUsageUnit", :subset, :shortcut => :unit, :cardinality => 1
5
5
  end
6
6
  end
data/lib/onix/error.rb CHANGED
@@ -3,4 +3,6 @@ module ONIX
3
3
  end
4
4
  class ExpectsOneButHasSeveral < StandardError
5
5
  end
6
+ class UnknownElement < StandardError
7
+ end
6
8
  end
data/lib/onix/extent.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  module ONIX
2
2
  class Extent < SubsetDSL
3
- element "ExtentType", :subset, :shortcut => :type
4
- element "ExtentUnit", :subset, :shortcut => :unit
5
- element "ExtentValue", :text, :shortcut => :value
3
+ element "ExtentType", :subset, :shortcut => :type, :cardinality => 1
4
+ element "ExtentValue", :text, :shortcut => :value, :cardinality => 0..1
5
+ element "ExtentValueRoman", :text, :cardinality => 0..1
6
+ element "ExtentUnit", :subset, :shortcut => :unit, :cardinality => 1
6
7
 
7
8
  scope :filesize, lambda { human_code_match(:extent_type, /Filesize/) }
8
9
  scope :page, lambda { human_code_match(:extent_type, /Page/) }
@@ -0,0 +1,17 @@
1
+ require 'onix/sender'
2
+ require 'onix/addressee'
3
+
4
+ module ONIX
5
+ class Header < SubsetDSL
6
+ element "Sender", :subset, :cardinality => 1
7
+ element "Addressee", :subset, :cardinality => 0..n
8
+ element "MessageNumber", :integer, :cardinality => 0..1
9
+ element "MessageRepeat", :integer, :cardinality => 0..1
10
+ element "SentDateTime", :datestamp, :cardinality => 1,
11
+ :serialize_lambda => lambda {|v| v.is_a?(Time) ? v.strftime("%Y%m%dT%H%M%S%z") : v}
12
+ element "MessageNote", :text, :cardinality => 0..n
13
+ element "DefaultLanguageOfText", :subset, :klass => "LanguageCode", :cardinality => 0..1
14
+ element "DefaultPriceType", :subset, :klass => "PriceType", :cardinality => 0..1
15
+ element "DefaultCurrencyCode", :text, :cardinality => 0..1
16
+ end
17
+ end
data/lib/onix/helper.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  module ONIX
2
2
  class Helper
3
3
  # convert arbitrary arg to File/String
4
+ # @param [String, File] arg
4
5
  def self.arg_to_data(arg)
5
6
  data = ""
6
7
  case arg
@@ -33,18 +34,8 @@ module ONIX
33
34
  end
34
35
  end
35
36
 
36
- def self.text_at(n, xpath)
37
- if n.at_xpath(xpath)
38
- n.at_xpath(xpath).text.strip
39
- else
40
- nil
41
- end
42
- end
43
-
44
- def self.mandatory_text_at(n, xpath)
45
- self.text_at(n, xpath)
46
- end
47
-
37
+ # @param [String] html
38
+ # @return [String]
48
39
  def self.strip_html(html)
49
40
  html.gsub(/&nbsp;/, " ").gsub(/<[^>]*(>+|\s*\z)/m, '')
50
41
  end
@@ -1,10 +1,11 @@
1
1
  module ONIX
2
2
  class Identifier < SubsetDSL
3
- element "IDValue", :text, :shortcut => :value
4
- element "IDTypeName", :text, :shortcut => :name
5
-
6
- def type
7
- nil
3
+ class << self
4
+ def identifier_elements(id_type)
5
+ element id_type, :subset, :shortcut => :type, :cardinality => 1
6
+ element "IDTypeName", :text, :shortcut => :name, :cardinality => 0..1
7
+ element "IDValue", :text, :shortcut => :value, :cardinality => 1
8
+ end
8
9
  end
9
10
 
10
11
  def uniq_id
@@ -13,105 +14,128 @@ module ONIX
13
14
  end
14
15
 
15
16
  class SenderIdentifier < Identifier
16
- element "SenderIDType", :subset, :shortcut => :type
17
+ identifier_elements "SenderIDType"
17
18
  end
18
19
 
19
20
  class AddresseeIdentifier < Identifier
20
- element "AddresseeIDType", :subset, :shortcut => :type
21
+ identifier_elements "AddresseeIDType"
22
+ end
23
+
24
+ class RecordSourceIdentifier < Identifier
25
+ identifier_elements "RecordSourceIDType"
21
26
  end
22
27
 
23
28
  class AgentIdentifier < Identifier
24
- element "AgentIDType", :subset, :shortcut => :type
29
+ identifier_elements "AgentIDType"
25
30
  end
26
31
 
27
32
  class ImprintIdentifier < Identifier
28
- element "ImprintIDType", :subset, :shortcut => :type
33
+ identifier_elements "ImprintIDType"
29
34
  end
30
35
 
31
36
  class PublisherIdentifier < Identifier
32
- element "PublisherIDType", :subset, :shortcut => :type
37
+ identifier_elements "PublisherIDType"
33
38
  end
34
39
 
35
40
  class SupplierIdentifier < Identifier
36
- element "SupplierIDType", :subset, :shortcut => :type
41
+ identifier_elements "SupplierIDType"
37
42
  end
38
43
 
39
44
  class NameIdentifier < Identifier
40
- element "NameIDType", :subset, :shortcut => :type
45
+ identifier_elements "NameIDType"
41
46
  end
42
47
 
43
48
  class CollectionIdentifier < Identifier
44
- element "CollectionIDType", :subset, :shortcut => :type
49
+ identifier_elements "CollectionIDType"
45
50
  end
46
51
 
47
52
  class ProductIdentifier < Identifier
48
- element "ProductIDType", :subset, :shortcut => :type
53
+ identifier_elements "ProductIDType"
54
+ end
55
+
56
+ class ProductContactIdentifier < Identifier
57
+ identifier_elements "ProductContactIDType"
49
58
  end
50
59
 
51
60
  class SalesOutletIdentifier < Identifier
52
- element "SalesOutletIDType", :subset, :shortcut => :type
61
+ identifier_elements "SalesOutletIDType"
53
62
  end
54
63
 
55
64
  class WorkIdentifier < Identifier
56
- element "WorkIDType", :subset, :shortcut => :type
65
+ identifier_elements "WorkIDType"
57
66
  end
58
67
 
59
- module EanMethods
60
- # EAN string identifier from identifiers
61
- def ean
62
- if ean_identifier
63
- ean_identifier.value
64
- else
65
- nil
66
- end
67
- end
68
+ class SupplyContactIdentifier < Identifier
69
+ identifier_elements "SupplyContactIDType"
70
+ end
68
71
 
69
- private
70
- def ean_identifier
71
- self.identifiers.select { |id| id.type.human=="Gtin13" }.first || self.identifiers.select { |id| id.type.human=="Isbn13" }.first
72
- end
72
+ class TextItemIdentifier < Identifier
73
+ identifier_elements "TextItemIDType"
73
74
  end
74
75
 
75
- module IsbnMethods
76
- # ISBN-13 string identifier from identifiers
77
- def isbn13
78
- if isbn13_identifier
79
- isbn13_identifier.value
80
- else
81
- nil
76
+ module IdentifiersMethods
77
+ module Ean
78
+ # EAN string identifier from identifiers
79
+ # @return [String]
80
+ def ean
81
+ if ean_identifier
82
+ ean_identifier.value
83
+ else
84
+ nil
85
+ end
82
86
  end
83
- end
84
87
 
85
- private
86
- def isbn13_identifier
87
- self.identifiers.select{|id| id.type.human=="Isbn13"}.first
88
+ private
89
+
90
+ def ean_identifier
91
+ self.identifiers.select { |id| id.type.human == "Gtin13" }.first || self.identifiers.select { |id| id.type.human == "Isbn13" }.first
92
+ end
88
93
  end
89
- end
90
94
 
91
- module GlnMethods
92
- # GLN string identifier from identifiers
93
- def gln
94
- if gln_identifier
95
- if gln_identifier.value =~ /\d{13}/
96
- gln_identifier.value
95
+ module Isbn
96
+ # ISBN-13 string identifier from identifiers
97
+ # @return [String]
98
+ def isbn13
99
+ if isbn13_identifier
100
+ isbn13_identifier.value
97
101
  else
98
- puts "Invalid GLN #{gln_identifier.value}"
99
102
  nil
100
103
  end
101
- else
102
- nil
104
+ end
105
+
106
+ private
107
+
108
+ def isbn13_identifier
109
+ self.identifiers.select { |id| id.type.human == "Isbn13" }.first
103
110
  end
104
111
  end
105
112
 
106
- # private
107
- def gln_identifier
108
- self.identifiers.select { |id| id.type.human=="Gln" }.first
113
+ module Gln
114
+ # GLN string identifier from identifiers
115
+ # @return [String]
116
+ def gln
117
+ if gln_identifier
118
+ if gln_identifier.value =~ /\d{13}/
119
+ gln_identifier.value
120
+ else
121
+ # puts "WARN Invalid GLN #{gln_identifier.value}"
122
+ nil
123
+ end
124
+ else
125
+ nil
126
+ end
127
+ end
128
+
129
+ # private
130
+ def gln_identifier
131
+ self.identifiers.select { |id| id.type.human == "Gln" }.first
132
+ end
109
133
  end
110
- end
111
134
 
112
- module ProprietaryIdMethods
113
- def proprietary_ids
114
- self.identifiers.select { |id| id.type.human=="Proprietary" }
135
+ module ProprietaryId
136
+ def proprietary_ids
137
+ self.identifiers.select { |id| id.type.human == "Proprietary" }
138
+ end
115
139
  end
116
140
  end
117
141
  end
data/lib/onix/language.rb CHANGED
@@ -1,7 +1,10 @@
1
1
  module ONIX
2
2
  class Language < SubsetDSL
3
- element "LanguageRole", :subset, :shortcut => :role
4
- element "LanguageCode", :subset, :shortcut => :code
3
+ element "LanguageRole", :subset, :shortcut => :role, :cardinality => 1
4
+ element "LanguageCode", :subset, :shortcut => :code, :cardinality => 1
5
+ element "CountryCode", :subset, :cardinality => 0..1
6
+ element "RegionCode", :subset, :cardinality => 0..1
7
+ element "ScriptCode", :subset, :cardinality => 0..1
5
8
 
6
9
  scope :of_text, lambda { human_code_match(:language_role, "LanguageOfText") }
7
10
  end
data/lib/onix/market.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  module ONIX
2
2
  class Market < SubsetDSL
3
- element "Territory", :subset
3
+ element "Territory", :subset, :cardinality => 1
4
+ elements "SalesRestriction", :subset, :cardinality => 0..n
4
5
  end
5
6
  end
@@ -1,8 +1,19 @@
1
+ require 'onix/publisher_representative'
2
+ require 'onix/product_contact'
3
+
1
4
  module ONIX
2
5
  class MarketPublishingDetail < SubsetDSL
3
- elements "PublisherRepresentative", :subset, {:klass => "Agent"}
4
- element "MarketPublishingStatus", :subset
5
- elements "MarketDate", :subset
6
+ elements "PublisherRepresentative", :subset, :klass => "Agent", :cardinality => 0..n
7
+ elements "ProductContact", :subset, :cardinality => 0..n
8
+ element "MarketPublishingStatus", :subset, :cardinality => 1
9
+ elements "MarketPublishingStatusNote", :text, :cardinality => 0..n
10
+ elements "MarketDate", :subset, :cardinality => 0..n
11
+ elements "PromotionCampaign", :text, :cardinality => 0..n
12
+ element "PromotionContact", :text, :cardinality => 0..1
13
+ elements "InitialPrintRun", :text, :cardinality => 0..n
14
+ elements "ReprintDetail", :text, :cardinality => 0..n
15
+ elements "CopiesSold", :text, :cardinality => 0..n
16
+ elements "BookClubAdoption", :text, :cardinality => 0..n
6
17
 
7
18
  # @!group High level
8
19
 
@@ -0,0 +1,7 @@
1
+ module ONIX
2
+ class Measure < SubsetDSL
3
+ element "MeasureType", :subset, :cardinality => 1
4
+ element "Measurement", :text, :cardinality => 1
5
+ element "MeasureUnitCode", :subset, :cardinality => 1
6
+ end
7
+ end
data/lib/onix/onix21.rb CHANGED
@@ -2,26 +2,28 @@ module ONIX
2
2
  module ONIX21
3
3
  class ShortToRef
4
4
  def self.names
5
- @shortnames ||= YAML.load(File.open(File.dirname(__FILE__) + "/../../data/onix21/shortnames.yml"))
5
+ @shortnames ||= YAML.load(File.open(File.dirname(__FILE__) + "/../../data/onix21/shortnames.yml")).freeze
6
6
  end
7
7
  end
8
8
 
9
9
  class RefToShort
10
10
  def self.names
11
- @refnames ||= ShortToRef.names.invert
11
+ @refnames ||= ShortToRef.names.invert.freeze
12
12
  end
13
13
  end
14
14
 
15
15
  class SubsetDSL < ONIX::SubsetDSL
16
- def self.short_to_ref(name)
17
- ONIX::ONIX21::ShortToRef.names[name]
18
- end
16
+ class << self
17
+ def short_to_ref(name)
18
+ ONIX::ONIX21::ShortToRef.names[name]
19
+ end
19
20
 
20
- def self.ref_to_short(name)
21
- ONIX::ONIX21::RefToShort.names[name]
21
+ def ref_to_short(name)
22
+ ONIX::ONIX21::RefToShort.names[name]
23
+ end
22
24
  end
23
25
 
24
- def self.get_class(name)
26
+ def get_class(name)
25
27
  if ONIX::ONIX21.const_defined?(name, false)
26
28
  ONIX::ONIX21.const_get(name)
27
29
  else
@@ -34,11 +36,11 @@ module ONIX
34
36
 
35
37
  class CodeFromYaml < Code
36
38
  def self.hash
37
- @hash ||= YAML.load(File.open(File.dirname(__FILE__) + "/../../data/onix21/codelists/codelist-#{self.code_ident}.yml"))[:codelist]
39
+ @hash ||= YAML.load(File.open(File.dirname(__FILE__) + "/../../data/onix21/codelists/codelist-#{self.code_ident}.yml"))[:codelist].freeze
38
40
  end
39
41
 
40
42
  def self.list
41
- self.hash.to_a.map { |h| h.first }
43
+ self.hash.keys
42
44
  end
43
45
 
44
46
  def self.code_ident
@@ -131,8 +133,8 @@ module ONIX
131
133
  class Price < SubsetDSL
132
134
  element "PriceTypeCode", :subset, :klass => "PriceType"
133
135
  element "PriceAmount", :float, {
134
- :shortcut => :amount,
135
- :parse_lambda => lambda { |v| (v * 100).round }
136
+ :shortcut => :amount,
137
+ :parse_lambda => lambda { |v| (v * 100).round }
136
138
  }
137
139
  element "PriceQualifier", :subset, :shortcut => :qualifier
138
140
  element "DiscountCoded", :subset
@@ -196,8 +198,8 @@ module ONIX
196
198
  element "AvailabilityCode", :text
197
199
  element "ProductAvailability", :text
198
200
  element "OnSaleDate", :text, {
199
- :shortcut => :availability_date,
200
- :parse_lambda => lambda { |v| Date.strptime(v, "%Y%m%d") }
201
+ :shortcut => :availability_date,
202
+ :parse_lambda => lambda { |v| Date.strptime(v, "%Y%m%d") }
201
203
  }
202
204
  elements "Price", :subset
203
205
 
@@ -232,8 +234,8 @@ module ONIX
232
234
  end
233
235
 
234
236
  class RelatedProduct < SubsetDSL
235
- include EanMethods
236
- include ProprietaryIdMethods
237
+ include IdentifiersMethods::Ean
238
+ include IdentifiersMethods::ProprietaryId
237
239
 
238
240
  element "RelationCode", :text, :shortcut => :code
239
241
  elements "ProductIdentifier", :subset, :shortcut => :identifiers
@@ -246,17 +248,17 @@ module ONIX
246
248
  element "SubjectCode", :text, :shortcut => :code
247
249
  element "SubjectHeadingText", :text, :shortcut => :heading_text
248
250
  element "MainSubjectSchemeIdentifier", :subset, {
249
- :shortcut => :scheme_identifier,
250
- :klass => "SubjectSchemeIdentifier"
251
+ :shortcut => :scheme_identifier,
252
+ :klass => "SubjectSchemeIdentifier"
251
253
  }
252
254
  element "SubjectSchemeName", :text, :shortcut => :scheme_name
253
255
  element "SubjectSchemeVersion", :text, :shortcut => :scheme_version
254
256
  end
255
257
 
256
258
  class Product < SubsetDSL
257
- include EanMethods
258
- include IsbnMethods
259
- include ProprietaryIdMethods
259
+ include IdentifiersMethods::Ean
260
+ include IdentifiersMethods::Isbn
261
+ include IdentifiersMethods::ProprietaryId
260
262
 
261
263
  element "RecordReference", :text
262
264
  elements "ProductIdentifier", :subset, :shortcut => :identifiers
@@ -281,7 +283,7 @@ module ONIX
281
283
 
282
284
  elements "OtherText", :subset
283
285
 
284
- elements "SalesRights", :subset, {:pluralize => false}
286
+ elements "SalesRights", :subset, { :pluralize => false }
285
287
  elements "NotForSale", :subset
286
288
 
287
289
  element "BASICMainSubject", :text
@@ -289,7 +291,7 @@ module ONIX
289
291
  elements "Subject", :subset
290
292
 
291
293
  element "PublishingStatus", :text
292
- element "PublicationDate", :text, {:parse_lambda => lambda { |v| Date.strptime(v, "%Y%m%d") }}
294
+ element "PublicationDate", :text, { :parse_lambda => lambda { |v| Date.strptime(v, "%Y%m%d") } }
293
295
 
294
296
  elements "RelatedProduct", :subset, :shortcut => :related
295
297
 
@@ -440,7 +442,7 @@ module ONIX
440
442
  nil
441
443
  end
442
444
 
443
- include ProductSuppliesExtractor
445
+ include ProductSuppliesMethods
444
446
 
445
447
  # doesn't apply
446
448
  def parts