im_onix 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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