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,604 @@
1
+ module ONIX
2
+ module ONIX21
3
+ class ShortToRef
4
+ def self.names
5
+ @shortnames||=YAML.load(File.open(File.dirname(__FILE__) + "/../../data/onix21/shortnames.yml"))
6
+ end
7
+ end
8
+
9
+ class RefToShort
10
+ def self.names
11
+ @refnames||=ShortToRef.names.invert
12
+ end
13
+ end
14
+
15
+ class SubsetDSL < ONIX::SubsetDSL
16
+ def self.short_to_ref(name)
17
+ ONIX::ONIX21::ShortToRef.names[name]
18
+ end
19
+ def self.ref_to_short(name)
20
+ ONIX::ONIX21::RefToShort.names[name]
21
+ end
22
+
23
+ def self.get_class(name)
24
+ if ONIX::ONIX21.const_defined?(name,false)
25
+ ONIX::ONIX21.const_get(name)
26
+ else
27
+ ONIX.const_get(name)
28
+ end
29
+ end
30
+ end
31
+
32
+ # ONIX 2.1 codes
33
+
34
+ class CodeFromYaml < Code
35
+ def self.hash
36
+ @hash||=YAML.load(File.open(File.dirname(__FILE__) + "/../../data/onix21/codelists/codelist-#{self.code_ident}.yml"))[:codelist]
37
+ end
38
+
39
+ def self.list
40
+ self.hash.to_a.map{|h| h.first}
41
+ end
42
+
43
+ def self.code_ident
44
+ nil
45
+ end
46
+ end
47
+
48
+ class EpubType < CodeFromYaml
49
+ private
50
+ def self.code_ident
51
+ 10
52
+ end
53
+ end
54
+
55
+ class TextTypeCode < CodeFromYaml
56
+ private
57
+ def self.code_ident
58
+ 33
59
+ end
60
+ end
61
+
62
+ class MediaFileTypeCode < CodeFromYaml
63
+ private
64
+ def self.code_ident
65
+ 38
66
+ end
67
+ end
68
+
69
+ class MediaFileFormatCode < CodeFromYaml
70
+ private
71
+ def self.code_ident
72
+ 36
73
+ end
74
+ end
75
+
76
+ class MediaFileLinkTypeCode < CodeFromYaml
77
+ private
78
+ def self.code_ident
79
+ 37
80
+ end
81
+ end
82
+
83
+ # ONIX 2.1 subset
84
+
85
+ class Title < SubsetDSL
86
+ element "TitleType", :subset
87
+ element "TitleText", :text
88
+ element "TitlePrefix", :text
89
+ element "TitleWithoutPrefix", :text
90
+ element "AbbreviatedLength", :integer
91
+ element "Subtitle", :text
92
+
93
+ def type
94
+ @title_type
95
+ end
96
+
97
+ def title
98
+ @title_text
99
+ end
100
+ end
101
+
102
+ class OtherText < SubsetDSL
103
+ element "TextTypeCode", :subset
104
+ element "TextFormat", :text
105
+ element "Text", :text
106
+
107
+ def type
108
+ @text_type_code
109
+ end
110
+ end
111
+
112
+ class MediaFile < SubsetDSL
113
+ element "MediaFileTypeCode", :subset
114
+ element "MediaFileFormatCode", :subset
115
+ element "MediaFileLinkTypeCode", :subset
116
+ element "MediaFileLink", :text
117
+
118
+ def type
119
+ @media_file_type_code
120
+ end
121
+
122
+ def format
123
+ @media_file_format_code
124
+ end
125
+
126
+ def link_type
127
+ @media_file_link_type_code
128
+ end
129
+
130
+ def link
131
+ @media_file_link
132
+ end
133
+ end
134
+
135
+ class Territory
136
+ attr_accessor :countries
137
+
138
+ def initialize(countries)
139
+ @countries=countries
140
+ end
141
+
142
+ def +v
143
+ Territory.new((@countries + v.countries).uniq)
144
+ end
145
+
146
+ def -v
147
+ Territory.new((@countries - v.countries).uniq)
148
+ end
149
+ end
150
+
151
+ class Price < SubsetDSL
152
+ element "PriceTypeCode", :subset, :klass => "PriceType"
153
+ element "PriceAmount", :float, {:parse_lambda => lambda { |v| (v*100).round }}
154
+ element "PriceQualifier", :subset
155
+ element "DiscountCoded", :subset
156
+ element "CurrencyCode", :text
157
+ elements "CountryCode", :text
158
+ element "PriceEffectiveFrom", :text
159
+ element "PriceEffectiveUntil", :text
160
+
161
+ def amount
162
+ @price_amount
163
+ end
164
+
165
+ def currency
166
+ @currency_code
167
+ end
168
+
169
+ def qualifier
170
+ @price_qualifier
171
+ end
172
+
173
+ def including_tax?
174
+ if @price_type_code.human =~/IncludingTax/
175
+ true
176
+ else
177
+ false
178
+ end
179
+ end
180
+
181
+ def from_date
182
+ if @price_effective_from
183
+ Date.strptime(@price_effective_from,"%Y%m%d")
184
+ end
185
+ end
186
+
187
+ def until_date
188
+ if @price_effective_until
189
+ Date.strptime(@price_effective_until,"%Y%m%d")
190
+ end
191
+ end
192
+
193
+ def territory
194
+ Territory.new(@country_codes)
195
+ end
196
+
197
+ def tax
198
+ nil
199
+ end
200
+ end
201
+
202
+
203
+ class Supplier
204
+ attr_accessor :name
205
+ attr_accessor :role
206
+
207
+ def initialize(name,role)
208
+ @name = name
209
+ @role = role
210
+ end
211
+
212
+ def identifiers
213
+ []
214
+ end
215
+
216
+ def websites
217
+ []
218
+ end
219
+ end
220
+
221
+ class SupplyDetail < SubsetDSL
222
+ element "SupplierName", :text
223
+ element "TelephoneNumber", :text
224
+ element "SupplierRole", :text
225
+
226
+ element "AvailabilityCode", :text
227
+ element "ProductAvailability", :text
228
+ element "OnSaleDate", :text, {:parse_lambda => lambda { |v| Date.strptime(v, "%Y%m%d") }}
229
+ elements "Price", :subset
230
+
231
+ def availability_date
232
+ @on_sale_date
233
+ end
234
+
235
+ def available?
236
+ @product_availability=="20" or @availability_code == "IP"
237
+ end
238
+
239
+ def suppliers
240
+ [Supplier.new(self.supplier_name,self.supplier_role)]
241
+ end
242
+ end
243
+
244
+ class SalesRights < SubsetDSL
245
+ element "SalesRightsType", :text
246
+ element "RightsCountry", :text
247
+
248
+ def not_for_sale?
249
+ ["03","04","05","06"].include?(@sales_rights_type)
250
+ end
251
+
252
+ def territory
253
+ Territory.new(@rights_country.split(" "))
254
+ end
255
+ end
256
+
257
+ class NotForSale < SubsetDSL
258
+ element "RightsCountry", :text
259
+
260
+ def territory
261
+ Territory.new(@rights_country.split(" "))
262
+ end
263
+ end
264
+
265
+ class RelatedProduct < SubsetDSL
266
+ include EanMethods
267
+ include ProprietaryIdMethods
268
+
269
+ element "RelationCode", :text
270
+ elements "ProductIdentifier", :subset
271
+
272
+ def product=v
273
+ end
274
+
275
+ def identifiers
276
+ @product_identifiers
277
+ end
278
+
279
+ def code
280
+ @relation_code
281
+ end
282
+ end
283
+
284
+ class MainSubject < SubsetDSL
285
+ element "SubjectCode", :text
286
+ element "SubjectHeadingText", :text
287
+ element "MainSubjectSchemeIdentifier", :subset, :klass=>"SubjectSchemeIdentifier"
288
+ element "SubjectSchemeName", :text
289
+ element "SubjectSchemeVersion", :text
290
+
291
+ # shortcuts
292
+ def code
293
+ @subject_code
294
+ end
295
+
296
+ def heading_text
297
+ @subject_heading_text
298
+ end
299
+
300
+ def scheme_identifier
301
+ @main_subject_scheme_identifier
302
+ end
303
+
304
+ def scheme_name
305
+ @subject_scheme_name
306
+ end
307
+
308
+ def scheme_version
309
+ @subject_scheme_version
310
+ end
311
+ end
312
+
313
+ class Product < SubsetDSL
314
+ include EanMethods
315
+ include ProprietaryIdMethods
316
+
317
+ element "RecordReference", :text
318
+ elements "ProductIdentifier", :subset
319
+ element "NotificationType", :subset
320
+ element "RecordSourceName", :text
321
+ elements "Title", :subset
322
+ elements "ProductSupply", :subset
323
+
324
+ elements "Contributor", :subset
325
+ element "ContributorStatement", :text
326
+
327
+ elements "Extent", :subset
328
+ elements "Language", :subset
329
+ elements "MediaFile", :subset
330
+
331
+ element "NumberOfPages", :text
332
+
333
+ elements "Publisher", :subset
334
+ elements "Imprint", :subset
335
+
336
+ element "ProductForm", :text
337
+
338
+ elements "OtherText", :subset
339
+
340
+ elements "SalesRights", :subset, {:pluralize => false}
341
+ elements "NotForSale", :subset
342
+
343
+ element "BASICMainSubject", :text
344
+ elements "MainSubject", :subset
345
+ elements "Subject", :subset
346
+
347
+ element "PublishingStatus", :text
348
+ element "PublicationDate", :text, {:parse_lambda => lambda { |v| Date.strptime(v, "%Y%m%d") }}
349
+
350
+ elements "RelatedProduct", :subset
351
+
352
+ elements "SupplyDetail", :subset
353
+
354
+ element "EpubType", :subset
355
+ element "EpubTypeDescription", :text
356
+ element "EpubFormat", :text
357
+ element "EpubTypeNote", :text
358
+
359
+ element "EditionNumber", :integer
360
+ element "NoEdition", :ignore
361
+ element "NoSeries", :ignore
362
+
363
+ # shortcuts
364
+ def identifiers
365
+ @product_identifiers
366
+ end
367
+
368
+ # default LanguageCode from ONIXMessage
369
+ attr_accessor :default_language_of_text
370
+ # default code from ONIXMessage
371
+ attr_accessor :default_currency_code
372
+
373
+ def title
374
+ product_title.title
375
+ end
376
+
377
+ # :category: High level
378
+ # product subtitle string
379
+ def subtitle
380
+ product_title.subtitle
381
+ end
382
+
383
+ def product_title
384
+ @titles.select { |td| td.type.human=~/DistinctiveTitle/ }.first
385
+ end
386
+
387
+ def bisac_categories_codes
388
+ cats=[]
389
+ if @basic_main_subject
390
+ cats << @basic_main_subject
391
+ end
392
+ cats+=(@main_subjects + @subjects).select { |s| s.scheme_identifier.human=="BisacSubjectHeading" }.map{|s| s.code}
393
+ cats
394
+ end
395
+
396
+ def clil_categories_codes
397
+ (@main_subjects + @subjects).select { |s| s.scheme_identifier.human=="Clil" }.map{|s| s.code}
398
+ end
399
+
400
+ def keywords
401
+ kws=(@main_subjects + @subjects).select { |s| s.scheme_identifier.human=="Keywords" }.map { |kw| kw.heading_text }.compact
402
+ kws.map { |kw| kw.split(/;|,|\n/) }.flatten.map { |kw| kw.strip }
403
+ end
404
+
405
+ # doesn't apply
406
+ def onix_outlets_values
407
+ []
408
+ end
409
+
410
+ # product LanguageCode of text
411
+ def language_of_text
412
+ lang=nil
413
+ l=@languages.select { |l| l.role.human=="LanguageOfText" }.first
414
+ if l
415
+ lang=l.code
416
+ end
417
+ lang || @default_language_of_text
418
+ end
419
+
420
+ def language_code_of_text
421
+ if self.language_of_text
422
+ self.language_of_text.code
423
+ end
424
+ end
425
+
426
+ def language_name_of_text
427
+ if self.language_of_text
428
+ self.language_of_text.human
429
+ end
430
+ end
431
+
432
+ def publisher_name
433
+ if @publishers.first
434
+ @publishers.first.name
435
+ end
436
+ end
437
+
438
+ def imprint_name
439
+ if @imprints.first
440
+ @imprints.first.name
441
+ end
442
+ end
443
+
444
+ # doesn't apply
445
+ def sold_separately?
446
+ true
447
+ end
448
+
449
+ def description
450
+ desc_contents=@other_texts.select{|tc| tc.type.human=="MainDescription"} + @other_texts.select{|tc| tc.type.human=="LongDescription"} + @other_texts.select{|tc| tc.type.human=="ShortDescriptionannotation"}
451
+ if desc_contents.length > 0
452
+ desc_contents.first.text
453
+ else
454
+ nil
455
+ end
456
+ end
457
+
458
+ def raw_description
459
+ if self.description
460
+ Helper.strip_html(self.description).gsub(/\s+/, " ").strip
461
+ else
462
+ nil
463
+ end
464
+ end
465
+
466
+ def product_supplies
467
+ [self]
468
+ end
469
+
470
+ def countries
471
+ territory=Territory.new(CountryCode.list)
472
+ @sales_rights.each do |sr|
473
+ if sr.not_for_sale?
474
+ territory=territory-sr.territory
475
+ else
476
+ territory=territory+sr.territory
477
+ end
478
+ end
479
+
480
+ @not_for_sales.each do |sr|
481
+ territory=territory-sr.territory
482
+ end
483
+
484
+ territory.countries
485
+ end
486
+
487
+ def availability_date
488
+ nil
489
+ end
490
+
491
+ def embargo_date
492
+ nil
493
+ end
494
+
495
+ def preorder_embargo_date
496
+ nil
497
+ end
498
+
499
+ def public_announcement_date
500
+ nil
501
+ end
502
+
503
+ include ProductSuppliesExtractor
504
+
505
+ def related
506
+ @related_products
507
+ end
508
+
509
+ # doesn't apply
510
+ def parts
511
+ []
512
+ end
513
+
514
+ # doesn't apply
515
+ def bundle?
516
+ false
517
+ end
518
+
519
+ def digital?
520
+ @product_form=="DG"
521
+ end
522
+
523
+ def available?
524
+ @supply_details.select { |sd| sd.available? }.length > 0
525
+ end
526
+
527
+ def available_for_country?(country)
528
+ self.supplies_for_country(country).select{|s| s[:available]}.length > 0 and self.available?
529
+ end
530
+
531
+ def pages
532
+ if @number_of_pages
533
+ @number_of_pages.to_i
534
+ end
535
+ end
536
+
537
+ def edition_number
538
+ @edition_number
539
+ end
540
+
541
+ def distributor_name
542
+ nil
543
+ end
544
+
545
+ def frontcover_url
546
+ fc=@media_files.select { |mf| mf.media_file_type_code.human=="ImageFrontCover" && mf.media_file_link_type_code.human=="Url"}
547
+ if fc.length > 0
548
+ fc.first.link
549
+ else
550
+ nil
551
+ end
552
+ end
553
+
554
+ # TODO
555
+ def publisher_collection_title
556
+ nil
557
+ end
558
+
559
+ def file_format
560
+ @epub_type.human
561
+ end
562
+
563
+ def file_description
564
+ @epub_type_description
565
+ end
566
+
567
+ def raw_file_description
568
+ file_description
569
+ end
570
+
571
+ # doesn't apply
572
+ def filesize
573
+ nil
574
+ end
575
+
576
+ # doesn't apply
577
+ def protection_type
578
+ nil
579
+ end
580
+
581
+ def epub_sample_url
582
+ nil
583
+ end
584
+
585
+ def print_product
586
+ @related_products.select { |rp| rp.code=="13" }.first
587
+ end
588
+
589
+ # DEPRECATED see print_product instead
590
+ def paper_linking
591
+ self.print_product
592
+ end
593
+
594
+ def publisher_gln
595
+ nil
596
+ end
597
+
598
+ def method_missing(method)
599
+ raise "WARN #{method} not found"
600
+ end
601
+
602
+ end
603
+ end
604
+ end