im_onix 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +39 -0
  3. data/bin/html_codelist_to_yml.rb +46 -0
  4. data/bin/onix3_to_onix2.rb +192 -0
  5. data/bin/onix3_to_onix3.rb +401 -0
  6. data/bin/onix_bench.rb +15 -0
  7. data/bin/onix_pp.rb +216 -0
  8. data/bin/onix_split.rb +72 -0
  9. data/data/codelists/codelist-1.yml +12 -0
  10. data/data/codelists/codelist-10.yml +51 -0
  11. data/data/codelists/codelist-100.yml +8 -0
  12. data/data/codelists/codelist-101.yml +7 -0
  13. data/data/codelists/codelist-102.yml +5 -0
  14. data/data/codelists/codelist-11.yml +13 -0
  15. data/data/codelists/codelist-12.yml +15 -0
  16. data/data/codelists/codelist-121.yml +162 -0
  17. data/data/codelists/codelist-13.yml +10 -0
  18. data/data/codelists/codelist-138.yml +8 -0
  19. data/data/codelists/codelist-139.yml +102 -0
  20. data/data/codelists/codelist-14.yml +6 -0
  21. data/data/codelists/codelist-140.yml +9 -0
  22. data/data/codelists/codelist-141.yml +12 -0
  23. data/data/codelists/codelist-142.yml +14 -0
  24. data/data/codelists/codelist-143.yml +9 -0
  25. data/data/codelists/codelist-144.yml +10 -0
  26. data/data/codelists/codelist-145.yml +9 -0
  27. data/data/codelists/codelist-146.yml +5 -0
  28. data/data/codelists/codelist-147.yml +16 -0
  29. data/data/codelists/codelist-148.yml +6 -0
  30. data/data/codelists/codelist-149.yml +7 -0
  31. data/data/codelists/codelist-15.yml +15 -0
  32. data/data/codelists/codelist-150.yml +128 -0
  33. data/data/codelists/codelist-151.yml +10 -0
  34. data/data/codelists/codelist-152.yml +4 -0
  35. data/data/codelists/codelist-153.yml +19 -0
  36. data/data/codelists/codelist-154.yml +11 -0
  37. data/data/codelists/codelist-155.yml +10 -0
  38. data/data/codelists/codelist-156.yml +6 -0
  39. data/data/codelists/codelist-157.yml +6 -0
  40. data/data/codelists/codelist-158.yml +32 -0
  41. data/data/codelists/codelist-159.yml +8 -0
  42. data/data/codelists/codelist-16.yml +8 -0
  43. data/data/codelists/codelist-160.yml +6 -0
  44. data/data/codelists/codelist-161.yml +5 -0
  45. data/data/codelists/codelist-162.yml +9 -0
  46. data/data/codelists/codelist-163.yml +18 -0
  47. data/data/codelists/codelist-164.yml +7 -0
  48. data/data/codelists/codelist-165.yml +6 -0
  49. data/data/codelists/codelist-166.yml +6 -0
  50. data/data/codelists/codelist-167.yml +7 -0
  51. data/data/codelists/codelist-168.yml +4 -0
  52. data/data/codelists/codelist-169.yml +7 -0
  53. data/data/codelists/codelist-17.yml +95 -0
  54. data/data/codelists/codelist-170.yml +2 -0
  55. data/data/codelists/codelist-171.yml +4 -0
  56. data/data/codelists/codelist-172.yml +3 -0
  57. data/data/codelists/codelist-173.yml +5 -0
  58. data/data/codelists/codelist-174.yml +4 -0
  59. data/data/codelists/codelist-175.yml +217 -0
  60. data/data/codelists/codelist-176.yml +16 -0
  61. data/data/codelists/codelist-177.yml +4 -0
  62. data/data/codelists/codelist-178.yml +30 -0
  63. data/data/codelists/codelist-179.yml +4 -0
  64. data/data/codelists/codelist-18.yml +8 -0
  65. data/data/codelists/codelist-184.yml +10 -0
  66. data/data/codelists/codelist-19.yml +9 -0
  67. data/data/codelists/codelist-196.yml +22 -0
  68. data/data/codelists/codelist-197.yml +7 -0
  69. data/data/codelists/codelist-198.yml +4 -0
  70. data/data/codelists/codelist-2.yml +8 -0
  71. data/data/codelists/codelist-20.yml +2 -0
  72. data/data/codelists/codelist-203.yml +10 -0
  73. data/data/codelists/codelist-204.yml +6 -0
  74. data/data/codelists/codelist-21.yml +36 -0
  75. data/data/codelists/codelist-22.yml +11 -0
  76. data/data/codelists/codelist-23.yml +17 -0
  77. data/data/codelists/codelist-24.yml +13 -0
  78. data/data/codelists/codelist-25.yml +31 -0
  79. data/data/codelists/codelist-26.yml +94 -0
  80. data/data/codelists/codelist-27.yml +101 -0
  81. data/data/codelists/codelist-28.yml +10 -0
  82. data/data/codelists/codelist-29.yml +26 -0
  83. data/data/codelists/codelist-3.yml +13 -0
  84. data/data/codelists/codelist-30.yml +19 -0
  85. data/data/codelists/codelist-31.yml +5 -0
  86. data/data/codelists/codelist-32.yml +5 -0
  87. data/data/codelists/codelist-33.yml +44 -0
  88. data/data/codelists/codelist-34.yml +18 -0
  89. data/data/codelists/codelist-35.yml +8 -0
  90. data/data/codelists/codelist-36.yml +5 -0
  91. data/data/codelists/codelist-37.yml +8 -0
  92. data/data/codelists/codelist-38.yml +42 -0
  93. data/data/codelists/codelist-39.yml +21 -0
  94. data/data/codelists/codelist-40.yml +8 -0
  95. data/data/codelists/codelist-41.yml +8 -0
  96. data/data/codelists/codelist-42.yml +18 -0
  97. data/data/codelists/codelist-43.yml +8 -0
  98. data/data/codelists/codelist-44.yml +22 -0
  99. data/data/codelists/codelist-45.yml +15 -0
  100. data/data/codelists/codelist-46.yml +11 -0
  101. data/data/codelists/codelist-47.yml +6 -0
  102. data/data/codelists/codelist-48.yml +13 -0
  103. data/data/codelists/codelist-49.yml +87 -0
  104. data/data/codelists/codelist-5.yml +20 -0
  105. data/data/codelists/codelist-50.yml +10 -0
  106. data/data/codelists/codelist-51.yml +37 -0
  107. data/data/codelists/codelist-52.yml +3 -0
  108. data/data/codelists/codelist-53.yml +7 -0
  109. data/data/codelists/codelist-54.yml +25 -0
  110. data/data/codelists/codelist-55.yml +21 -0
  111. data/data/codelists/codelist-56.yml +4 -0
  112. data/data/codelists/codelist-57.yml +7 -0
  113. data/data/codelists/codelist-58.yml +27 -0
  114. data/data/codelists/codelist-59.yml +12 -0
  115. data/data/codelists/codelist-6.yml +78 -0
  116. data/data/codelists/codelist-60.yml +4 -0
  117. data/data/codelists/codelist-61.yml +5 -0
  118. data/data/codelists/codelist-62.yml +7 -0
  119. data/data/codelists/codelist-63.yml +2 -0
  120. data/data/codelists/codelist-64.yml +18 -0
  121. data/data/codelists/codelist-65.yml +31 -0
  122. data/data/codelists/codelist-66.yml +6 -0
  123. data/data/codelists/codelist-67.yml +4 -0
  124. data/data/codelists/codelist-68.yml +19 -0
  125. data/data/codelists/codelist-69.yml +6 -0
  126. data/data/codelists/codelist-7.yml +128 -0
  127. data/data/codelists/codelist-70.yml +4 -0
  128. data/data/codelists/codelist-71.yml +13 -0
  129. data/data/codelists/codelist-72.yml +9 -0
  130. data/data/codelists/codelist-73.yml +43 -0
  131. data/data/codelists/codelist-74.yml +491 -0
  132. data/data/codelists/codelist-75.yml +4 -0
  133. data/data/codelists/codelist-76.yml +14 -0
  134. data/data/codelists/codelist-77.yml +21 -0
  135. data/data/codelists/codelist-78.yml +179 -0
  136. data/data/codelists/codelist-79.yml +25 -0
  137. data/data/codelists/codelist-8.yml +9 -0
  138. data/data/codelists/codelist-80.yml +23 -0
  139. data/data/codelists/codelist-81.yml +41 -0
  140. data/data/codelists/codelist-82.yml +19 -0
  141. data/data/codelists/codelist-83.yml +71 -0
  142. data/data/codelists/codelist-84.yml +12 -0
  143. data/data/codelists/codelist-85.yml +25 -0
  144. data/data/codelists/codelist-86.yml +7 -0
  145. data/data/codelists/codelist-87.yml +8 -0
  146. data/data/codelists/codelist-88.yml +2 -0
  147. data/data/codelists/codelist-89.yml +3 -0
  148. data/data/codelists/codelist-9.yml +11 -0
  149. data/data/codelists/codelist-90.yml +13 -0
  150. data/data/codelists/codelist-91.yml +254 -0
  151. data/data/codelists/codelist-92.yml +11 -0
  152. data/data/codelists/codelist-93.yml +15 -0
  153. data/data/codelists/codelist-94.yml +5 -0
  154. data/data/codelists/codelist-95.yml +5 -0
  155. data/data/codelists/codelist-96.yml +193 -0
  156. data/data/codelists/codelist-97.yml +3 -0
  157. data/data/codelists/codelist-98.yml +23 -0
  158. data/data/codelists/codelist-99.yml +26 -0
  159. data/data/onix21/codelists/codelist-1.yml +14 -0
  160. data/data/onix21/codelists/codelist-10.yml +52 -0
  161. data/data/onix21/codelists/codelist-100.yml +8 -0
  162. data/data/onix21/codelists/codelist-101.yml +7 -0
  163. data/data/onix21/codelists/codelist-102.yml +5 -0
  164. data/data/onix21/codelists/codelist-11.yml +13 -0
  165. data/data/onix21/codelists/codelist-12.yml +16 -0
  166. data/data/onix21/codelists/codelist-121.yml +162 -0
  167. data/data/onix21/codelists/codelist-13.yml +11 -0
  168. data/data/onix21/codelists/codelist-138.yml +8 -0
  169. data/data/onix21/codelists/codelist-139.yml +109 -0
  170. data/data/onix21/codelists/codelist-14.yml +6 -0
  171. data/data/onix21/codelists/codelist-140.yml +9 -0
  172. data/data/onix21/codelists/codelist-141.yml +12 -0
  173. data/data/onix21/codelists/codelist-142.yml +14 -0
  174. data/data/onix21/codelists/codelist-143.yml +9 -0
  175. data/data/onix21/codelists/codelist-144.yml +8 -0
  176. data/data/onix21/codelists/codelist-145.yml +10 -0
  177. data/data/onix21/codelists/codelist-146.yml +5 -0
  178. data/data/onix21/codelists/codelist-147.yml +16 -0
  179. data/data/onix21/codelists/codelist-148.yml +6 -0
  180. data/data/onix21/codelists/codelist-149.yml +8 -0
  181. data/data/onix21/codelists/codelist-15.yml +16 -0
  182. data/data/onix21/codelists/codelist-150.yml +133 -0
  183. data/data/onix21/codelists/codelist-151.yml +10 -0
  184. data/data/onix21/codelists/codelist-152.yml +4 -0
  185. data/data/onix21/codelists/codelist-153.yml +22 -0
  186. data/data/onix21/codelists/codelist-154.yml +11 -0
  187. data/data/onix21/codelists/codelist-155.yml +10 -0
  188. data/data/onix21/codelists/codelist-156.yml +6 -0
  189. data/data/onix21/codelists/codelist-157.yml +6 -0
  190. data/data/onix21/codelists/codelist-158.yml +35 -0
  191. data/data/onix21/codelists/codelist-159.yml +8 -0
  192. data/data/onix21/codelists/codelist-16.yml +8 -0
  193. data/data/onix21/codelists/codelist-160.yml +7 -0
  194. data/data/onix21/codelists/codelist-161.yml +5 -0
  195. data/data/onix21/codelists/codelist-162.yml +9 -0
  196. data/data/onix21/codelists/codelist-163.yml +18 -0
  197. data/data/onix21/codelists/codelist-164.yml +7 -0
  198. data/data/onix21/codelists/codelist-165.yml +6 -0
  199. data/data/onix21/codelists/codelist-166.yml +6 -0
  200. data/data/onix21/codelists/codelist-167.yml +11 -0
  201. data/data/onix21/codelists/codelist-168.yml +4 -0
  202. data/data/onix21/codelists/codelist-169.yml +7 -0
  203. data/data/onix21/codelists/codelist-17.yml +98 -0
  204. data/data/onix21/codelists/codelist-170.yml +6 -0
  205. data/data/onix21/codelists/codelist-171.yml +4 -0
  206. data/data/onix21/codelists/codelist-172.yml +3 -0
  207. data/data/onix21/codelists/codelist-173.yml +5 -0
  208. data/data/onix21/codelists/codelist-174.yml +4 -0
  209. data/data/onix21/codelists/codelist-175.yml +230 -0
  210. data/data/onix21/codelists/codelist-176.yml +16 -0
  211. data/data/onix21/codelists/codelist-177.yml +4 -0
  212. data/data/onix21/codelists/codelist-178.yml +30 -0
  213. data/data/onix21/codelists/codelist-179.yml +5 -0
  214. data/data/onix21/codelists/codelist-18.yml +8 -0
  215. data/data/onix21/codelists/codelist-184.yml +10 -0
  216. data/data/onix21/codelists/codelist-19.yml +9 -0
  217. data/data/onix21/codelists/codelist-196.yml +22 -0
  218. data/data/onix21/codelists/codelist-197.yml +7 -0
  219. data/data/onix21/codelists/codelist-198.yml +8 -0
  220. data/data/onix21/codelists/codelist-2.yml +8 -0
  221. data/data/onix21/codelists/codelist-20.yml +2 -0
  222. data/data/onix21/codelists/codelist-203.yml +10 -0
  223. data/data/onix21/codelists/codelist-204.yml +7 -0
  224. data/data/onix21/codelists/codelist-21.yml +36 -0
  225. data/data/onix21/codelists/codelist-215.yml +9 -0
  226. data/data/onix21/codelists/codelist-216.yml +11 -0
  227. data/data/onix21/codelists/codelist-217.yml +3 -0
  228. data/data/onix21/codelists/codelist-218.yml +5 -0
  229. data/data/onix21/codelists/codelist-219.yml +5 -0
  230. data/data/onix21/codelists/codelist-22.yml +11 -0
  231. data/data/onix21/codelists/codelist-220.yml +7 -0
  232. data/data/onix21/codelists/codelist-23.yml +17 -0
  233. data/data/onix21/codelists/codelist-24.yml +14 -0
  234. data/data/onix21/codelists/codelist-25.yml +31 -0
  235. data/data/onix21/codelists/codelist-26.yml +100 -0
  236. data/data/onix21/codelists/codelist-27.yml +107 -0
  237. data/data/onix21/codelists/codelist-28.yml +10 -0
  238. data/data/onix21/codelists/codelist-29.yml +30 -0
  239. data/data/onix21/codelists/codelist-3.yml +13 -0
  240. data/data/onix21/codelists/codelist-30.yml +20 -0
  241. data/data/onix21/codelists/codelist-31.yml +5 -0
  242. data/data/onix21/codelists/codelist-32.yml +10 -0
  243. data/data/onix21/codelists/codelist-33.yml +46 -0
  244. data/data/onix21/codelists/codelist-34.yml +18 -0
  245. data/data/onix21/codelists/codelist-35.yml +8 -0
  246. data/data/onix21/codelists/codelist-36.yml +5 -0
  247. data/data/onix21/codelists/codelist-37.yml +8 -0
  248. data/data/onix21/codelists/codelist-38.yml +42 -0
  249. data/data/onix21/codelists/codelist-39.yml +21 -0
  250. data/data/onix21/codelists/codelist-40.yml +8 -0
  251. data/data/onix21/codelists/codelist-41.yml +9 -0
  252. data/data/onix21/codelists/codelist-42.yml +18 -0
  253. data/data/onix21/codelists/codelist-43.yml +9 -0
  254. data/data/onix21/codelists/codelist-44.yml +27 -0
  255. data/data/onix21/codelists/codelist-45.yml +20 -0
  256. data/data/onix21/codelists/codelist-46.yml +11 -0
  257. data/data/onix21/codelists/codelist-47.yml +6 -0
  258. data/data/onix21/codelists/codelist-48.yml +13 -0
  259. data/data/onix21/codelists/codelist-49.yml +281 -0
  260. data/data/onix21/codelists/codelist-5.yml +20 -0
  261. data/data/onix21/codelists/codelist-50.yml +10 -0
  262. data/data/onix21/codelists/codelist-51.yml +37 -0
  263. data/data/onix21/codelists/codelist-52.yml +3 -0
  264. data/data/onix21/codelists/codelist-53.yml +7 -0
  265. data/data/onix21/codelists/codelist-54.yml +25 -0
  266. data/data/onix21/codelists/codelist-55.yml +21 -0
  267. data/data/onix21/codelists/codelist-56.yml +4 -0
  268. data/data/onix21/codelists/codelist-57.yml +7 -0
  269. data/data/onix21/codelists/codelist-58.yml +27 -0
  270. data/data/onix21/codelists/codelist-59.yml +12 -0
  271. data/data/onix21/codelists/codelist-6.yml +78 -0
  272. data/data/onix21/codelists/codelist-60.yml +4 -0
  273. data/data/onix21/codelists/codelist-61.yml +5 -0
  274. data/data/onix21/codelists/codelist-62.yml +7 -0
  275. data/data/onix21/codelists/codelist-63.yml +2 -0
  276. data/data/onix21/codelists/codelist-64.yml +18 -0
  277. data/data/onix21/codelists/codelist-65.yml +31 -0
  278. data/data/onix21/codelists/codelist-66.yml +6 -0
  279. data/data/onix21/codelists/codelist-67.yml +4 -0
  280. data/data/onix21/codelists/codelist-68.yml +19 -0
  281. data/data/onix21/codelists/codelist-69.yml +6 -0
  282. data/data/onix21/codelists/codelist-7.yml +132 -0
  283. data/data/onix21/codelists/codelist-70.yml +4 -0
  284. data/data/onix21/codelists/codelist-71.yml +14 -0
  285. data/data/onix21/codelists/codelist-72.yml +9 -0
  286. data/data/onix21/codelists/codelist-73.yml +43 -0
  287. data/data/onix21/codelists/codelist-74.yml +492 -0
  288. data/data/onix21/codelists/codelist-75.yml +4 -0
  289. data/data/onix21/codelists/codelist-76.yml +14 -0
  290. data/data/onix21/codelists/codelist-77.yml +21 -0
  291. data/data/onix21/codelists/codelist-78.yml +191 -0
  292. data/data/onix21/codelists/codelist-79.yml +26 -0
  293. data/data/onix21/codelists/codelist-8.yml +9 -0
  294. data/data/onix21/codelists/codelist-80.yml +23 -0
  295. data/data/onix21/codelists/codelist-81.yml +41 -0
  296. data/data/onix21/codelists/codelist-82.yml +19 -0
  297. data/data/onix21/codelists/codelist-83.yml +72 -0
  298. data/data/onix21/codelists/codelist-84.yml +12 -0
  299. data/data/onix21/codelists/codelist-85.yml +25 -0
  300. data/data/onix21/codelists/codelist-86.yml +7 -0
  301. data/data/onix21/codelists/codelist-87.yml +8 -0
  302. data/data/onix21/codelists/codelist-88.yml +2 -0
  303. data/data/onix21/codelists/codelist-89.yml +3 -0
  304. data/data/onix21/codelists/codelist-9.yml +13 -0
  305. data/data/onix21/codelists/codelist-90.yml +13 -0
  306. data/data/onix21/codelists/codelist-91.yml +254 -0
  307. data/data/onix21/codelists/codelist-92.yml +11 -0
  308. data/data/onix21/codelists/codelist-93.yml +15 -0
  309. data/data/onix21/codelists/codelist-94.yml +5 -0
  310. data/data/onix21/codelists/codelist-95.yml +5 -0
  311. data/data/onix21/codelists/codelist-96.yml +194 -0
  312. data/data/onix21/codelists/codelist-97.yml +3 -0
  313. data/data/onix21/codelists/codelist-98.yml +25 -0
  314. data/data/onix21/codelists/codelist-99.yml +26 -0
  315. data/data/onix21/shortnames.yml +431 -0
  316. data/data/shortnames.yml +395 -0
  317. data/lib/im_onix.rb +2 -0
  318. data/lib/onix/code.rb +543 -0
  319. data/lib/onix/collateral_detail.rb +94 -0
  320. data/lib/onix/contributor.rb +87 -0
  321. data/lib/onix/date.rb +183 -0
  322. data/lib/onix/descriptive_detail.rb +552 -0
  323. data/lib/onix/discount_coded.rb +20 -0
  324. data/lib/onix/entity.rb +135 -0
  325. data/lib/onix/error.rb +6 -0
  326. data/lib/onix/helper.rb +66 -0
  327. data/lib/onix/identifier.rb +158 -0
  328. data/lib/onix/onix21.rb +604 -0
  329. data/lib/onix/onix_message.rb +187 -0
  330. data/lib/onix/price.rb +74 -0
  331. data/lib/onix/product.rb +846 -0
  332. data/lib/onix/product_supply.rb +89 -0
  333. data/lib/onix/publishing_detail.rb +86 -0
  334. data/lib/onix/related_material.rb +30 -0
  335. data/lib/onix/related_product.rb +45 -0
  336. data/lib/onix/related_work.rb +24 -0
  337. data/lib/onix/sales_outlet.rb +14 -0
  338. data/lib/onix/sales_restriction.rb +37 -0
  339. data/lib/onix/sales_rights.rb +12 -0
  340. data/lib/onix/subject.rb +35 -0
  341. data/lib/onix/subset.rb +334 -0
  342. data/lib/onix/supporting_resource.rb +192 -0
  343. data/lib/onix/tax.rb +23 -0
  344. data/lib/onix/territory.rb +56 -0
  345. data/lib/onix/website.rb +21 -0
  346. metadata +477 -0
@@ -0,0 +1,89 @@
1
+ require 'onix/price'
2
+ require 'onix/date'
3
+
4
+ module ONIX
5
+
6
+ class Market < SubsetDSL
7
+ element "Territory", :subset
8
+ end
9
+
10
+ class MarketPublishingDetail < SubsetDSL
11
+ elements "PublisherRepresentative", :subset, {:klass=>"Agent"}
12
+ element "MarketPublishingStatus", :subset
13
+ elements "MarketDate", :subset
14
+
15
+ def availability_date
16
+ av=@market_dates.availability.first
17
+ if av
18
+ av.date
19
+ else
20
+ nil
21
+ end
22
+ end
23
+ end
24
+
25
+ class SupplyDetail < SubsetDSL
26
+ elements "Supplier", :subset
27
+ element "ProductAvailability", :subset
28
+ elements "SupplyDate", :subset
29
+ elements "Price", :subset
30
+ element "UnpricedItemType", :subset
31
+
32
+ def availability
33
+ @product_availability
34
+ end
35
+
36
+ def distributors
37
+ @suppliers.select{|s| s.role.human=~/Distributor/}.uniq
38
+ end
39
+
40
+ def available?
41
+ ["Available","NotYetAvailable","InStock","ToOrder","Pod"].include?(@product_availability.human)
42
+ end
43
+
44
+ def sold_separately?
45
+ @product_availability.human!="NotSoldSeparately"
46
+ end
47
+
48
+ def availability_date
49
+ av=@supply_dates.availability.first
50
+ if av
51
+ av.date
52
+ else
53
+ nil
54
+ end
55
+ end
56
+ end
57
+
58
+ class ProductSupply < SubsetDSL
59
+ elements "Market", :subset
60
+ element "MarketPublishingDetail", :subset
61
+ elements "SupplyDetail", :subset
62
+
63
+ def availability_date
64
+ if @market_publishing_detail
65
+ @market_publishing_detail.availability_date
66
+ end
67
+ end
68
+
69
+ def countries
70
+ @markets.map{|m| m.territory.countries}.flatten.uniq
71
+ end
72
+
73
+ def distributors
74
+ @supply_details.map{|sd| sd.distributors}.flatten.uniq{|d| d.name}
75
+ end
76
+
77
+ def available_supply_details
78
+ @supply_details.select{|sd| sd.available?}
79
+ end
80
+
81
+ def unavailable_supply_details
82
+ @supply_details.delete_if{|sd| sd.available?}
83
+ end
84
+
85
+ def available?
86
+ self.available_supply_details.length > 0
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,86 @@
1
+ require 'onix/sales_rights'
2
+ require 'onix/date'
3
+ module ONIX
4
+ class PublishingDetail < SubsetDSL
5
+ elements "Imprint", :subset
6
+ elements "Publisher", :subset
7
+ element "CityOfPublication", :text
8
+ element "CountryOfPublication", :text
9
+ element "PublishingStatus", :subset
10
+ elements "PublishingDate", :subset
11
+ elements "SalesRights", :subset, {:pluralize=>false}
12
+ element "ROWSalesRightsType", :subset, {:klass=>"SalesRightsType"}
13
+ element "SalesRestriction", :subset
14
+
15
+ def publisher
16
+ main_publishers = @publishers.select { |p| p.role.human=="Publisher" }
17
+ return nil if main_publishers.empty?
18
+ if main_publishers.length == 1
19
+ main_publishers.first
20
+ else
21
+ raise ExpectsOneButHasSeveral, main_publishers.map(&:name)
22
+ end
23
+ end
24
+
25
+ def imprint
26
+ if @imprints.length > 0
27
+ if @imprints.length==1
28
+ @imprints.first
29
+ else
30
+ raise ExpectsOneButHasSeveral, @imprints.map(&:name)
31
+ end
32
+ else
33
+ nil
34
+ end
35
+ end
36
+
37
+ def publication_date
38
+ pub=@publishing_dates.publication.first
39
+ if pub
40
+ pub.date
41
+ else
42
+ nil
43
+ end
44
+ end
45
+
46
+ def embargo_date
47
+ pub=@publishing_dates.embargo.first
48
+ if pub
49
+ pub.date
50
+ else
51
+ nil
52
+ end
53
+ end
54
+
55
+ def preorder_embargo_date
56
+ pub=@publishing_dates.preorder_embargo.first
57
+ if pub
58
+ pub.date
59
+ else
60
+ nil
61
+ end
62
+ end
63
+
64
+ def public_announcement_date
65
+ pub=@publishing_dates.public_announcement.first
66
+ if pub
67
+ pub.date
68
+ else
69
+ nil
70
+ end
71
+ end
72
+
73
+ def status
74
+ @publising_status
75
+ end
76
+
77
+ def city
78
+ @city_of_publication
79
+ end
80
+
81
+ def country
82
+ @country_of_publication
83
+ end
84
+
85
+ end
86
+ end
@@ -0,0 +1,30 @@
1
+ require 'onix/related_product'
2
+ require 'onix/related_work'
3
+ module ONIX
4
+ class RelatedMaterial < SubsetDSL
5
+ elements "RelatedWork", :subset
6
+ elements "RelatedProduct", :subset
7
+
8
+ def linking(human)
9
+ @related_products.select{|rp| rp.code.human==human}
10
+ end
11
+
12
+ # :category: High level
13
+ # print products RelatedProduct array
14
+ def print_products
15
+ linking("EpublicationBasedOnPrintProduct") + self.alternative_format_products.select{|rp| rp.form && rp.form.code=~/^B/}
16
+ end
17
+
18
+ # :category: High level
19
+ # is part of products RelatedProduct array
20
+ def part_of_products
21
+ linking("IsPartOf")
22
+ end
23
+
24
+ # :category: High level
25
+ # alternative format products RelatedProduct array
26
+ def alternative_format_products
27
+ linking("AlternativeFormat")
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,45 @@
1
+ module ONIX
2
+ class RelatedProduct < SubsetDSL
3
+ include EanMethods
4
+ include ProprietaryIdMethods
5
+
6
+ element "ProductRelationCode", :subset
7
+ elements "ProductIdentifier", :subset
8
+ element "ProductForm", :subset
9
+ elements "ProductFormDetail", :subset
10
+
11
+ # shortcuts
12
+ def code
13
+ @product_relation_code
14
+ end
15
+
16
+ def identifiers
17
+ @product_identifiers
18
+ end
19
+
20
+ def form
21
+ @product_form
22
+ end
23
+
24
+ def form_details
25
+ @product_form_details
26
+ end
27
+
28
+ # full Product if referenced in ONIXMessage
29
+ def product
30
+ @product
31
+ end
32
+
33
+ def product=v
34
+ @product=v
35
+ end
36
+
37
+ def file_format
38
+ file_formats.first.human if file_formats.first
39
+ end
40
+
41
+ def file_formats
42
+ @product_form_details.select{|fd| fd.code =~ /^E1.*/}
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,24 @@
1
+ module ONIX
2
+ class RelatedWork < SubsetDSL
3
+ include EanMethods
4
+ element "WorkRelationCode", :subset
5
+ elements "WorkIdentifier", :subset
6
+
7
+ def code
8
+ @work_relation_code
9
+ end
10
+
11
+ def identifiers
12
+ @work_identifiers
13
+ end
14
+
15
+ # full Product if referenced in ONIXMessage
16
+ def product
17
+ @product
18
+ end
19
+
20
+ def product=v
21
+ @product=v
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ module ONIX
2
+ class SalesOutlet < SubsetDSL
3
+ element "SalesOutletIdentifier", :subset
4
+ element "SalesOutletName", :text
5
+
6
+ def identifier
7
+ @sales_outlet_identifier
8
+ end
9
+
10
+ def name
11
+ @sales_outlet_name
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,37 @@
1
+ require 'onix/sales_outlet'
2
+ module ONIX
3
+ class SalesRestriction < SubsetDSL
4
+ element "SalesRestrictionType", :subset
5
+ elements "SalesOutlet", :subset
6
+ element "SalesRestrictionNote", :text
7
+
8
+ attr_accessor :start_date, :end_date
9
+
10
+ # shortcuts
11
+ def type
12
+ @sales_restriction_type
13
+ end
14
+
15
+ def note
16
+ @sales_restriction_note
17
+ end
18
+
19
+ def initialize
20
+ @sales_outlets=[]
21
+ end
22
+
23
+ def parse(n)
24
+ super
25
+ n.elements.each do |t|
26
+ case t
27
+ when tag_match("StartDate")
28
+ fmt=t["dateformat"] || "00"
29
+ @start_date=ONIX::Helper.to_date(fmt,t.text)
30
+ when tag_match("EndDate")
31
+ fmt=t["dateformat"] || "00"
32
+ @end_date=ONIX::Helper.to_date(fmt,t.text)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,12 @@
1
+ require 'onix/sales_restriction'
2
+ module ONIX
3
+ class SalesRights < SubsetDSL
4
+ element "SalesRightsType", :subset
5
+ element "Territory", :subset
6
+ elements "SalesRestriction", :subset
7
+
8
+ def type
9
+ @sales_rights_type
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,35 @@
1
+ module ONIX
2
+ class Subject < SubsetDSL
3
+ element "MainSubject", :bool
4
+ element "SubjectSchemeIdentifier", :subset
5
+ element "SubjectSchemeName", :text
6
+ element "SubjectSchemeVersion", :text
7
+ element "SubjectCode", :text
8
+ element "SubjectHeadingText", :text
9
+
10
+ scope :bisac, lambda{ human_code_match(:subject_scheme_identifier, "BisacSubjectHeading") }
11
+ scope :clil, lambda{ human_code_match(:subject_scheme_identifier, "Clil") }
12
+ scope :keyword, lambda{ human_code_match(:subject_scheme_identifier, "Keywords") }
13
+
14
+ # shortcuts
15
+ def code
16
+ @subject_code
17
+ end
18
+
19
+ def heading_text
20
+ @subject_heading_text
21
+ end
22
+
23
+ def scheme_identifier
24
+ @subject_scheme_identifier
25
+ end
26
+
27
+ def scheme_name
28
+ @subject_scheme_name
29
+ end
30
+
31
+ def scheme_version
32
+ @subject_scheme_version
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,334 @@
1
+ module ONIX
2
+ class ShortToRef
3
+ def self.names
4
+ @shortnames||=YAML.load(File.open(File.dirname(__FILE__) + "/../../data/shortnames.yml"))
5
+ end
6
+ end
7
+
8
+ class RefToShort
9
+ def self.names
10
+ @refnames||=ShortToRef.names.invert
11
+ end
12
+ end
13
+
14
+ TagNameMatcher = Struct.new(:tag_name) do
15
+ def ===(target)
16
+ if target.element?
17
+ name=target.name
18
+ name.casecmp(tag_name) == 0 or ShortToRef.names[name] == tag_name
19
+ else
20
+ false
21
+ end
22
+ end
23
+ end
24
+
25
+ class Subset
26
+ # instanciate Subset form Nokogiri::XML::Element
27
+ def self.parse(n)
28
+ o=self.new
29
+ o.parse(n)
30
+ o
31
+ end
32
+
33
+ # parse Nokogiri::XML::Element
34
+ def parse(n)
35
+ end
36
+
37
+ def unsupported(tag)
38
+ # raise SubsetUnsupported,tag.name
39
+ # puts "SubsetUnsupported: #{self.class}##{tag.name} (#{ShortToRef.names[tag.name]})"
40
+ end
41
+
42
+ def tag_match(v)
43
+ TagNameMatcher.new(v)
44
+ end
45
+
46
+ def self.tag_match(v)
47
+ TagNameMatcher.new(v)
48
+ end
49
+
50
+ end
51
+
52
+ class ElementParser
53
+ attr_accessor :type, :name, :short
54
+
55
+ def self.inflectors
56
+ [['ox', 'oxes'],
57
+ ['us', 'uses'],
58
+ ['', 's'],
59
+ ['ero', 'eroes'],
60
+ ['rf', 'rves'],
61
+ ['af', 'aves'],
62
+ ['ero', 'eroes'],
63
+ ['man', 'men'],
64
+ ['ch', 'ches'],
65
+ ['sh', 'shes'],
66
+ ['ss', 'sses'],
67
+ ['ta', 'tum'],
68
+ ['ia', 'ium'],
69
+ ['ra', 'rum'],
70
+ ['ay', 'ays'],
71
+ ['ey', 'eys'],
72
+ ['oy', 'oys'],
73
+ ['uy', 'uys'],
74
+ ['y', 'ies'],
75
+ ['x', 'xes'],
76
+ ['lf', 'lves'],
77
+ ['ffe', 'ffes'],
78
+ ['afe', 'aves'],
79
+ ['ouse', 'ouses']]
80
+ end
81
+
82
+ def initialize(name, type, options={})
83
+ @name=name
84
+ @type=type
85
+ @pluralize=true
86
+ @short = false
87
+ @array=false
88
+ @parse_lambda = nil
89
+ @serialize_lambda = nil
90
+ if options[:array]
91
+ @array=true
92
+ end
93
+ if options[:pluralize]==false
94
+ @pluralize=false
95
+ end
96
+
97
+ @parse_lambda=options[:parse_lambda]
98
+ @serialize_lambda=options[:serialize_lambda]
99
+
100
+ if options[:klass]
101
+ @klass_name=options[:klass]
102
+ else
103
+ @klass_name=name
104
+ end
105
+ end
106
+
107
+ def parse_lambda(v)
108
+ if @parse_lambda
109
+ @parse_lambda.call(v)
110
+ else
111
+ v
112
+ end
113
+ end
114
+
115
+ def serialize_lambda(v)
116
+ if @serialize_lambda
117
+ @serialize_lambda.call(v)
118
+ else
119
+ v
120
+ end
121
+ end
122
+
123
+ def is_array?
124
+ @array
125
+ end
126
+
127
+ def _underscore_name
128
+ if @array and @pluralize
129
+ pluralize(underscore(@name))
130
+ else
131
+ underscore(@name)
132
+ end
133
+ end
134
+
135
+ def underscore_name
136
+ @underscore_name||=_underscore_name
137
+ end
138
+
139
+ def class_name
140
+ @klass_name
141
+ end
142
+
143
+ def to_sym
144
+ @sym||=self.underscore_name.to_sym
145
+ end
146
+
147
+ def to_instance
148
+ @instance||="@"+self.underscore_name
149
+ end
150
+
151
+ private
152
+ def pluralize(str)
153
+ rex = /(#{self.class.inflectors.map { |si, pl| si }.join('|')})$/i
154
+ hash = Hash[*self.class.inflectors.flatten]
155
+ str.sub(rex) { |m| hash[m] }
156
+ end
157
+
158
+ def underscore(str)
159
+ word = str.to_s.dup
160
+ word.gsub!('::', '/')
161
+ word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
162
+ word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
163
+ word.tr!("-", "_")
164
+ word.downcase!
165
+ word
166
+ end
167
+ end
168
+
169
+ class SubsetArray < Array
170
+ def human_code_match(k, p)
171
+ case p
172
+ when Regexp
173
+ self.class.new(self.select { |v|
174
+ code=v.instance_variable_get("@"+k.to_s)
175
+ code and code.human =~ p
176
+ })
177
+ when Array
178
+ self.class.new(self.select { |v|
179
+ code=v.instance_variable_get("@"+k.to_s)
180
+ code and p.include?(code.human)
181
+ })
182
+ else
183
+ self.class.new(self.select { |v|
184
+ code=v.instance_variable_get("@"+k.to_s)
185
+ code and code.human == p
186
+ })
187
+ end
188
+ end
189
+
190
+ def code_match(k, p)
191
+ case p
192
+ when Regexp
193
+ self.class.new(self.select { |v|
194
+ code=v.instance_variable_get("@"+k.to_s)
195
+ code.code =~ p
196
+ })
197
+ else
198
+ self.class.new(self.select { |v| v.instance_variable_get("@"+k.to_s).code == p })
199
+ end
200
+ end
201
+ end
202
+
203
+ class SubsetDSL < Subset
204
+ def self.scope(name, lambda)
205
+ @scopes ||= {}
206
+ @scopes[name] = lambda
207
+ end
208
+
209
+ def self._ancestor_registered_scopes
210
+ els=self.registered_scopes
211
+ sup=self
212
+ while sup.respond_to?(:registered_scopes)
213
+ els.merge!(sup.registered_scopes) if sup.registered_scopes
214
+ sup=sup.superclass
215
+ end
216
+ els
217
+ end
218
+
219
+ def self.ancestor_registered_scopes
220
+ @ancestors_registered_scopes||=_ancestor_registered_scopes
221
+ end
222
+
223
+ def self.registered_scopes
224
+ @scopes||{}
225
+ end
226
+
227
+ def self.element(name, type, options={})
228
+ @elements ||= {}
229
+ @elements[name]=ElementParser.new(name, type, options)
230
+ short_name=self.ref_to_short(name)
231
+ if short_name
232
+ @elements[short_name]=@elements[name].dup
233
+ @elements[short_name].short = true
234
+ end
235
+ attr_accessor @elements[name].to_sym
236
+ end
237
+
238
+ # shortcut for element :array=>true
239
+ def self.elements(name, type, options={})
240
+ self.element(name, type, options.merge(:array => true))
241
+ end
242
+
243
+ def self._ancestors_registered_elements
244
+ els=self.registered_elements
245
+ sup=self
246
+ while sup.respond_to?(:registered_elements)
247
+ els.merge!(sup.registered_elements) if sup.registered_elements
248
+ sup=sup.superclass
249
+ end
250
+ els
251
+ end
252
+
253
+ def self.ancestors_registered_elements
254
+ @ancestors_registered_elements||=_ancestors_registered_elements
255
+ end
256
+
257
+ def self.registered_elements
258
+ @elements||{}
259
+ end
260
+
261
+ def initialize
262
+ # initialize plural as Array
263
+ self.class.ancestors_registered_elements.each do |k, e|
264
+ if e.is_array?
265
+ # register a contextual SubsetArray object
266
+ subset_array = SubsetArray.new
267
+ subset_klass = self.class.get_class(e.class_name)
268
+ if subset_klass.respond_to? :registered_scopes
269
+ subset_klass.registered_scopes.each do |n, l|
270
+ unless subset_array.respond_to? n.to_s
271
+ subset_array.define_singleton_method(n.to_s) do
272
+ instance_exec(&l)
273
+ end
274
+ end
275
+ end
276
+ end
277
+ instance_variable_set(e.to_instance, subset_array)
278
+ end
279
+ end
280
+ end
281
+
282
+ def self.short_to_ref(name)
283
+ ShortToRef.names[name]
284
+ end
285
+
286
+ def self.ref_to_short(name)
287
+ RefToShort.names[name]
288
+ end
289
+
290
+ def self.get_class(name)
291
+ ONIX.const_get(name) if ONIX.const_defined? name
292
+ end
293
+
294
+ def parse(n)
295
+ n.elements.each do |t|
296
+ name = t.name
297
+ e=self.class.ancestors_registered_elements[name]
298
+ if e
299
+ case e.type
300
+ when :subset
301
+ val=self.class.get_class(e.class_name).parse(t)
302
+ when :text
303
+ val=t.text
304
+ when :integer
305
+ val=t.text.to_i
306
+ when :float
307
+ val=t.text.to_f
308
+ when :bool
309
+ val=true
310
+ when :ignore
311
+ val=nil
312
+ else
313
+ val=t.text
314
+ end
315
+ if val
316
+ if e.is_array?
317
+ instance_variable_get(e.to_instance).send(:push, val)
318
+ else
319
+ instance_variable_set(e.to_instance, e.parse_lambda(val))
320
+ end
321
+ end
322
+ else
323
+ unsupported(t)
324
+ end
325
+ end
326
+ end
327
+
328
+ def unsupported(tag)
329
+ # raise SubsetUnsupported,tag.name
330
+ # puts "SubsetUnsupported: #{self.class}##{tag.name} (#{self.class.short_to_ref(tag.name)})"
331
+ end
332
+
333
+ end
334
+ end