im_onix 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +39 -0
- data/bin/html_codelist_to_yml.rb +46 -0
- data/bin/onix3_to_onix2.rb +192 -0
- data/bin/onix3_to_onix3.rb +401 -0
- data/bin/onix_bench.rb +15 -0
- data/bin/onix_pp.rb +216 -0
- data/bin/onix_split.rb +72 -0
- data/data/codelists/codelist-1.yml +12 -0
- data/data/codelists/codelist-10.yml +51 -0
- data/data/codelists/codelist-100.yml +8 -0
- data/data/codelists/codelist-101.yml +7 -0
- data/data/codelists/codelist-102.yml +5 -0
- data/data/codelists/codelist-11.yml +13 -0
- data/data/codelists/codelist-12.yml +15 -0
- data/data/codelists/codelist-121.yml +162 -0
- data/data/codelists/codelist-13.yml +10 -0
- data/data/codelists/codelist-138.yml +8 -0
- data/data/codelists/codelist-139.yml +102 -0
- data/data/codelists/codelist-14.yml +6 -0
- data/data/codelists/codelist-140.yml +9 -0
- data/data/codelists/codelist-141.yml +12 -0
- data/data/codelists/codelist-142.yml +14 -0
- data/data/codelists/codelist-143.yml +9 -0
- data/data/codelists/codelist-144.yml +10 -0
- data/data/codelists/codelist-145.yml +9 -0
- data/data/codelists/codelist-146.yml +5 -0
- data/data/codelists/codelist-147.yml +16 -0
- data/data/codelists/codelist-148.yml +6 -0
- data/data/codelists/codelist-149.yml +7 -0
- data/data/codelists/codelist-15.yml +15 -0
- data/data/codelists/codelist-150.yml +128 -0
- data/data/codelists/codelist-151.yml +10 -0
- data/data/codelists/codelist-152.yml +4 -0
- data/data/codelists/codelist-153.yml +19 -0
- data/data/codelists/codelist-154.yml +11 -0
- data/data/codelists/codelist-155.yml +10 -0
- data/data/codelists/codelist-156.yml +6 -0
- data/data/codelists/codelist-157.yml +6 -0
- data/data/codelists/codelist-158.yml +32 -0
- data/data/codelists/codelist-159.yml +8 -0
- data/data/codelists/codelist-16.yml +8 -0
- data/data/codelists/codelist-160.yml +6 -0
- data/data/codelists/codelist-161.yml +5 -0
- data/data/codelists/codelist-162.yml +9 -0
- data/data/codelists/codelist-163.yml +18 -0
- data/data/codelists/codelist-164.yml +7 -0
- data/data/codelists/codelist-165.yml +6 -0
- data/data/codelists/codelist-166.yml +6 -0
- data/data/codelists/codelist-167.yml +7 -0
- data/data/codelists/codelist-168.yml +4 -0
- data/data/codelists/codelist-169.yml +7 -0
- data/data/codelists/codelist-17.yml +95 -0
- data/data/codelists/codelist-170.yml +2 -0
- data/data/codelists/codelist-171.yml +4 -0
- data/data/codelists/codelist-172.yml +3 -0
- data/data/codelists/codelist-173.yml +5 -0
- data/data/codelists/codelist-174.yml +4 -0
- data/data/codelists/codelist-175.yml +217 -0
- data/data/codelists/codelist-176.yml +16 -0
- data/data/codelists/codelist-177.yml +4 -0
- data/data/codelists/codelist-178.yml +30 -0
- data/data/codelists/codelist-179.yml +4 -0
- data/data/codelists/codelist-18.yml +8 -0
- data/data/codelists/codelist-184.yml +10 -0
- data/data/codelists/codelist-19.yml +9 -0
- data/data/codelists/codelist-196.yml +22 -0
- data/data/codelists/codelist-197.yml +7 -0
- data/data/codelists/codelist-198.yml +4 -0
- data/data/codelists/codelist-2.yml +8 -0
- data/data/codelists/codelist-20.yml +2 -0
- data/data/codelists/codelist-203.yml +10 -0
- data/data/codelists/codelist-204.yml +6 -0
- data/data/codelists/codelist-21.yml +36 -0
- data/data/codelists/codelist-22.yml +11 -0
- data/data/codelists/codelist-23.yml +17 -0
- data/data/codelists/codelist-24.yml +13 -0
- data/data/codelists/codelist-25.yml +31 -0
- data/data/codelists/codelist-26.yml +94 -0
- data/data/codelists/codelist-27.yml +101 -0
- data/data/codelists/codelist-28.yml +10 -0
- data/data/codelists/codelist-29.yml +26 -0
- data/data/codelists/codelist-3.yml +13 -0
- data/data/codelists/codelist-30.yml +19 -0
- data/data/codelists/codelist-31.yml +5 -0
- data/data/codelists/codelist-32.yml +5 -0
- data/data/codelists/codelist-33.yml +44 -0
- data/data/codelists/codelist-34.yml +18 -0
- data/data/codelists/codelist-35.yml +8 -0
- data/data/codelists/codelist-36.yml +5 -0
- data/data/codelists/codelist-37.yml +8 -0
- data/data/codelists/codelist-38.yml +42 -0
- data/data/codelists/codelist-39.yml +21 -0
- data/data/codelists/codelist-40.yml +8 -0
- data/data/codelists/codelist-41.yml +8 -0
- data/data/codelists/codelist-42.yml +18 -0
- data/data/codelists/codelist-43.yml +8 -0
- data/data/codelists/codelist-44.yml +22 -0
- data/data/codelists/codelist-45.yml +15 -0
- data/data/codelists/codelist-46.yml +11 -0
- data/data/codelists/codelist-47.yml +6 -0
- data/data/codelists/codelist-48.yml +13 -0
- data/data/codelists/codelist-49.yml +87 -0
- data/data/codelists/codelist-5.yml +20 -0
- data/data/codelists/codelist-50.yml +10 -0
- data/data/codelists/codelist-51.yml +37 -0
- data/data/codelists/codelist-52.yml +3 -0
- data/data/codelists/codelist-53.yml +7 -0
- data/data/codelists/codelist-54.yml +25 -0
- data/data/codelists/codelist-55.yml +21 -0
- data/data/codelists/codelist-56.yml +4 -0
- data/data/codelists/codelist-57.yml +7 -0
- data/data/codelists/codelist-58.yml +27 -0
- data/data/codelists/codelist-59.yml +12 -0
- data/data/codelists/codelist-6.yml +78 -0
- data/data/codelists/codelist-60.yml +4 -0
- data/data/codelists/codelist-61.yml +5 -0
- data/data/codelists/codelist-62.yml +7 -0
- data/data/codelists/codelist-63.yml +2 -0
- data/data/codelists/codelist-64.yml +18 -0
- data/data/codelists/codelist-65.yml +31 -0
- data/data/codelists/codelist-66.yml +6 -0
- data/data/codelists/codelist-67.yml +4 -0
- data/data/codelists/codelist-68.yml +19 -0
- data/data/codelists/codelist-69.yml +6 -0
- data/data/codelists/codelist-7.yml +128 -0
- data/data/codelists/codelist-70.yml +4 -0
- data/data/codelists/codelist-71.yml +13 -0
- data/data/codelists/codelist-72.yml +9 -0
- data/data/codelists/codelist-73.yml +43 -0
- data/data/codelists/codelist-74.yml +491 -0
- data/data/codelists/codelist-75.yml +4 -0
- data/data/codelists/codelist-76.yml +14 -0
- data/data/codelists/codelist-77.yml +21 -0
- data/data/codelists/codelist-78.yml +179 -0
- data/data/codelists/codelist-79.yml +25 -0
- data/data/codelists/codelist-8.yml +9 -0
- data/data/codelists/codelist-80.yml +23 -0
- data/data/codelists/codelist-81.yml +41 -0
- data/data/codelists/codelist-82.yml +19 -0
- data/data/codelists/codelist-83.yml +71 -0
- data/data/codelists/codelist-84.yml +12 -0
- data/data/codelists/codelist-85.yml +25 -0
- data/data/codelists/codelist-86.yml +7 -0
- data/data/codelists/codelist-87.yml +8 -0
- data/data/codelists/codelist-88.yml +2 -0
- data/data/codelists/codelist-89.yml +3 -0
- data/data/codelists/codelist-9.yml +11 -0
- data/data/codelists/codelist-90.yml +13 -0
- data/data/codelists/codelist-91.yml +254 -0
- data/data/codelists/codelist-92.yml +11 -0
- data/data/codelists/codelist-93.yml +15 -0
- data/data/codelists/codelist-94.yml +5 -0
- data/data/codelists/codelist-95.yml +5 -0
- data/data/codelists/codelist-96.yml +193 -0
- data/data/codelists/codelist-97.yml +3 -0
- data/data/codelists/codelist-98.yml +23 -0
- data/data/codelists/codelist-99.yml +26 -0
- data/data/onix21/codelists/codelist-1.yml +14 -0
- data/data/onix21/codelists/codelist-10.yml +52 -0
- data/data/onix21/codelists/codelist-100.yml +8 -0
- data/data/onix21/codelists/codelist-101.yml +7 -0
- data/data/onix21/codelists/codelist-102.yml +5 -0
- data/data/onix21/codelists/codelist-11.yml +13 -0
- data/data/onix21/codelists/codelist-12.yml +16 -0
- data/data/onix21/codelists/codelist-121.yml +162 -0
- data/data/onix21/codelists/codelist-13.yml +11 -0
- data/data/onix21/codelists/codelist-138.yml +8 -0
- data/data/onix21/codelists/codelist-139.yml +109 -0
- data/data/onix21/codelists/codelist-14.yml +6 -0
- data/data/onix21/codelists/codelist-140.yml +9 -0
- data/data/onix21/codelists/codelist-141.yml +12 -0
- data/data/onix21/codelists/codelist-142.yml +14 -0
- data/data/onix21/codelists/codelist-143.yml +9 -0
- data/data/onix21/codelists/codelist-144.yml +8 -0
- data/data/onix21/codelists/codelist-145.yml +10 -0
- data/data/onix21/codelists/codelist-146.yml +5 -0
- data/data/onix21/codelists/codelist-147.yml +16 -0
- data/data/onix21/codelists/codelist-148.yml +6 -0
- data/data/onix21/codelists/codelist-149.yml +8 -0
- data/data/onix21/codelists/codelist-15.yml +16 -0
- data/data/onix21/codelists/codelist-150.yml +133 -0
- data/data/onix21/codelists/codelist-151.yml +10 -0
- data/data/onix21/codelists/codelist-152.yml +4 -0
- data/data/onix21/codelists/codelist-153.yml +22 -0
- data/data/onix21/codelists/codelist-154.yml +11 -0
- data/data/onix21/codelists/codelist-155.yml +10 -0
- data/data/onix21/codelists/codelist-156.yml +6 -0
- data/data/onix21/codelists/codelist-157.yml +6 -0
- data/data/onix21/codelists/codelist-158.yml +35 -0
- data/data/onix21/codelists/codelist-159.yml +8 -0
- data/data/onix21/codelists/codelist-16.yml +8 -0
- data/data/onix21/codelists/codelist-160.yml +7 -0
- data/data/onix21/codelists/codelist-161.yml +5 -0
- data/data/onix21/codelists/codelist-162.yml +9 -0
- data/data/onix21/codelists/codelist-163.yml +18 -0
- data/data/onix21/codelists/codelist-164.yml +7 -0
- data/data/onix21/codelists/codelist-165.yml +6 -0
- data/data/onix21/codelists/codelist-166.yml +6 -0
- data/data/onix21/codelists/codelist-167.yml +11 -0
- data/data/onix21/codelists/codelist-168.yml +4 -0
- data/data/onix21/codelists/codelist-169.yml +7 -0
- data/data/onix21/codelists/codelist-17.yml +98 -0
- data/data/onix21/codelists/codelist-170.yml +6 -0
- data/data/onix21/codelists/codelist-171.yml +4 -0
- data/data/onix21/codelists/codelist-172.yml +3 -0
- data/data/onix21/codelists/codelist-173.yml +5 -0
- data/data/onix21/codelists/codelist-174.yml +4 -0
- data/data/onix21/codelists/codelist-175.yml +230 -0
- data/data/onix21/codelists/codelist-176.yml +16 -0
- data/data/onix21/codelists/codelist-177.yml +4 -0
- data/data/onix21/codelists/codelist-178.yml +30 -0
- data/data/onix21/codelists/codelist-179.yml +5 -0
- data/data/onix21/codelists/codelist-18.yml +8 -0
- data/data/onix21/codelists/codelist-184.yml +10 -0
- data/data/onix21/codelists/codelist-19.yml +9 -0
- data/data/onix21/codelists/codelist-196.yml +22 -0
- data/data/onix21/codelists/codelist-197.yml +7 -0
- data/data/onix21/codelists/codelist-198.yml +8 -0
- data/data/onix21/codelists/codelist-2.yml +8 -0
- data/data/onix21/codelists/codelist-20.yml +2 -0
- data/data/onix21/codelists/codelist-203.yml +10 -0
- data/data/onix21/codelists/codelist-204.yml +7 -0
- data/data/onix21/codelists/codelist-21.yml +36 -0
- data/data/onix21/codelists/codelist-215.yml +9 -0
- data/data/onix21/codelists/codelist-216.yml +11 -0
- data/data/onix21/codelists/codelist-217.yml +3 -0
- data/data/onix21/codelists/codelist-218.yml +5 -0
- data/data/onix21/codelists/codelist-219.yml +5 -0
- data/data/onix21/codelists/codelist-22.yml +11 -0
- data/data/onix21/codelists/codelist-220.yml +7 -0
- data/data/onix21/codelists/codelist-23.yml +17 -0
- data/data/onix21/codelists/codelist-24.yml +14 -0
- data/data/onix21/codelists/codelist-25.yml +31 -0
- data/data/onix21/codelists/codelist-26.yml +100 -0
- data/data/onix21/codelists/codelist-27.yml +107 -0
- data/data/onix21/codelists/codelist-28.yml +10 -0
- data/data/onix21/codelists/codelist-29.yml +30 -0
- data/data/onix21/codelists/codelist-3.yml +13 -0
- data/data/onix21/codelists/codelist-30.yml +20 -0
- data/data/onix21/codelists/codelist-31.yml +5 -0
- data/data/onix21/codelists/codelist-32.yml +10 -0
- data/data/onix21/codelists/codelist-33.yml +46 -0
- data/data/onix21/codelists/codelist-34.yml +18 -0
- data/data/onix21/codelists/codelist-35.yml +8 -0
- data/data/onix21/codelists/codelist-36.yml +5 -0
- data/data/onix21/codelists/codelist-37.yml +8 -0
- data/data/onix21/codelists/codelist-38.yml +42 -0
- data/data/onix21/codelists/codelist-39.yml +21 -0
- data/data/onix21/codelists/codelist-40.yml +8 -0
- data/data/onix21/codelists/codelist-41.yml +9 -0
- data/data/onix21/codelists/codelist-42.yml +18 -0
- data/data/onix21/codelists/codelist-43.yml +9 -0
- data/data/onix21/codelists/codelist-44.yml +27 -0
- data/data/onix21/codelists/codelist-45.yml +20 -0
- data/data/onix21/codelists/codelist-46.yml +11 -0
- data/data/onix21/codelists/codelist-47.yml +6 -0
- data/data/onix21/codelists/codelist-48.yml +13 -0
- data/data/onix21/codelists/codelist-49.yml +281 -0
- data/data/onix21/codelists/codelist-5.yml +20 -0
- data/data/onix21/codelists/codelist-50.yml +10 -0
- data/data/onix21/codelists/codelist-51.yml +37 -0
- data/data/onix21/codelists/codelist-52.yml +3 -0
- data/data/onix21/codelists/codelist-53.yml +7 -0
- data/data/onix21/codelists/codelist-54.yml +25 -0
- data/data/onix21/codelists/codelist-55.yml +21 -0
- data/data/onix21/codelists/codelist-56.yml +4 -0
- data/data/onix21/codelists/codelist-57.yml +7 -0
- data/data/onix21/codelists/codelist-58.yml +27 -0
- data/data/onix21/codelists/codelist-59.yml +12 -0
- data/data/onix21/codelists/codelist-6.yml +78 -0
- data/data/onix21/codelists/codelist-60.yml +4 -0
- data/data/onix21/codelists/codelist-61.yml +5 -0
- data/data/onix21/codelists/codelist-62.yml +7 -0
- data/data/onix21/codelists/codelist-63.yml +2 -0
- data/data/onix21/codelists/codelist-64.yml +18 -0
- data/data/onix21/codelists/codelist-65.yml +31 -0
- data/data/onix21/codelists/codelist-66.yml +6 -0
- data/data/onix21/codelists/codelist-67.yml +4 -0
- data/data/onix21/codelists/codelist-68.yml +19 -0
- data/data/onix21/codelists/codelist-69.yml +6 -0
- data/data/onix21/codelists/codelist-7.yml +132 -0
- data/data/onix21/codelists/codelist-70.yml +4 -0
- data/data/onix21/codelists/codelist-71.yml +14 -0
- data/data/onix21/codelists/codelist-72.yml +9 -0
- data/data/onix21/codelists/codelist-73.yml +43 -0
- data/data/onix21/codelists/codelist-74.yml +492 -0
- data/data/onix21/codelists/codelist-75.yml +4 -0
- data/data/onix21/codelists/codelist-76.yml +14 -0
- data/data/onix21/codelists/codelist-77.yml +21 -0
- data/data/onix21/codelists/codelist-78.yml +191 -0
- data/data/onix21/codelists/codelist-79.yml +26 -0
- data/data/onix21/codelists/codelist-8.yml +9 -0
- data/data/onix21/codelists/codelist-80.yml +23 -0
- data/data/onix21/codelists/codelist-81.yml +41 -0
- data/data/onix21/codelists/codelist-82.yml +19 -0
- data/data/onix21/codelists/codelist-83.yml +72 -0
- data/data/onix21/codelists/codelist-84.yml +12 -0
- data/data/onix21/codelists/codelist-85.yml +25 -0
- data/data/onix21/codelists/codelist-86.yml +7 -0
- data/data/onix21/codelists/codelist-87.yml +8 -0
- data/data/onix21/codelists/codelist-88.yml +2 -0
- data/data/onix21/codelists/codelist-89.yml +3 -0
- data/data/onix21/codelists/codelist-9.yml +13 -0
- data/data/onix21/codelists/codelist-90.yml +13 -0
- data/data/onix21/codelists/codelist-91.yml +254 -0
- data/data/onix21/codelists/codelist-92.yml +11 -0
- data/data/onix21/codelists/codelist-93.yml +15 -0
- data/data/onix21/codelists/codelist-94.yml +5 -0
- data/data/onix21/codelists/codelist-95.yml +5 -0
- data/data/onix21/codelists/codelist-96.yml +194 -0
- data/data/onix21/codelists/codelist-97.yml +3 -0
- data/data/onix21/codelists/codelist-98.yml +25 -0
- data/data/onix21/codelists/codelist-99.yml +26 -0
- data/data/onix21/shortnames.yml +431 -0
- data/data/shortnames.yml +395 -0
- data/lib/im_onix.rb +2 -0
- data/lib/onix/code.rb +543 -0
- data/lib/onix/collateral_detail.rb +94 -0
- data/lib/onix/contributor.rb +87 -0
- data/lib/onix/date.rb +183 -0
- data/lib/onix/descriptive_detail.rb +552 -0
- data/lib/onix/discount_coded.rb +20 -0
- data/lib/onix/entity.rb +135 -0
- data/lib/onix/error.rb +6 -0
- data/lib/onix/helper.rb +66 -0
- data/lib/onix/identifier.rb +158 -0
- data/lib/onix/onix21.rb +604 -0
- data/lib/onix/onix_message.rb +187 -0
- data/lib/onix/price.rb +74 -0
- data/lib/onix/product.rb +846 -0
- data/lib/onix/product_supply.rb +89 -0
- data/lib/onix/publishing_detail.rb +86 -0
- data/lib/onix/related_material.rb +30 -0
- data/lib/onix/related_product.rb +45 -0
- data/lib/onix/related_work.rb +24 -0
- data/lib/onix/sales_outlet.rb +14 -0
- data/lib/onix/sales_restriction.rb +37 -0
- data/lib/onix/sales_rights.rb +12 -0
- data/lib/onix/subject.rb +35 -0
- data/lib/onix/subset.rb +334 -0
- data/lib/onix/supporting_resource.rb +192 -0
- data/lib/onix/tax.rb +23 -0
- data/lib/onix/territory.rb +56 -0
- data/lib/onix/website.rb +21 -0
- 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,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
|
data/lib/onix/subject.rb
ADDED
@@ -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
|
data/lib/onix/subset.rb
ADDED
@@ -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
|