im_onix 1.1.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -6
- data/README.md +1 -1
- data/bin/html_codelist_to_yml.rb +10 -6
- data/bin/onix_bench.rb +25 -4
- data/bin/onix_pp.rb +26 -26
- data/bin/onix_serialize.rb +12 -16
- data/data/codelists/codelist-1.yml +4 -5
- data/data/codelists/codelist-10.yml +13 -11
- data/data/codelists/codelist-100.yml +1 -0
- data/data/codelists/codelist-102.yml +3 -2
- data/data/codelists/codelist-11.yml +2 -2
- data/data/codelists/codelist-12.yml +8 -3
- data/data/codelists/codelist-121.yml +46 -17
- data/data/codelists/codelist-13.yml +3 -0
- data/data/codelists/codelist-139.yml +83 -9
- data/data/codelists/codelist-141.yml +4 -4
- data/data/codelists/codelist-142.yml +2 -2
- data/data/codelists/codelist-143.yml +11 -0
- data/data/codelists/codelist-144.yml +2 -2
- data/data/codelists/codelist-145.yml +4 -1
- data/data/codelists/codelist-147.yml +18 -2
- data/data/codelists/codelist-149.yml +1 -0
- data/data/codelists/codelist-15.yml +2 -1
- data/data/codelists/codelist-150.yml +46 -26
- data/data/codelists/codelist-151.yml +4 -1
- data/data/codelists/codelist-153.yml +19 -4
- data/data/codelists/codelist-154.yml +4 -2
- data/data/codelists/codelist-155.yml +3 -1
- data/data/codelists/codelist-156.yml +1 -0
- data/data/codelists/codelist-158.yml +18 -0
- data/data/codelists/codelist-159.yml +1 -1
- data/data/codelists/codelist-16.yml +3 -0
- data/data/codelists/codelist-160.yml +2 -0
- data/data/codelists/codelist-162.yml +2 -0
- data/data/codelists/codelist-163.yml +8 -3
- data/data/codelists/codelist-165.yml +3 -0
- data/data/codelists/codelist-166.yml +7 -2
- data/data/codelists/codelist-167.yml +6 -0
- data/data/codelists/codelist-168.yml +1 -0
- data/data/codelists/codelist-169.yml +2 -2
- data/data/codelists/codelist-17.yml +20 -2
- data/data/codelists/codelist-170.yml +5 -1
- data/data/codelists/codelist-171.yml +1 -0
- data/data/codelists/codelist-173.yml +1 -1
- data/data/codelists/codelist-175.yml +113 -35
- data/data/codelists/codelist-176.yml +2 -2
- data/data/codelists/codelist-177.yml +1 -0
- data/data/codelists/codelist-178.yml +6 -0
- data/data/codelists/codelist-179.yml +1 -0
- data/data/codelists/codelist-18.yml +3 -1
- data/data/codelists/codelist-184.yml +1 -0
- data/data/codelists/codelist-19.yml +5 -4
- data/data/codelists/codelist-196.yml +16 -4
- data/data/codelists/codelist-197.yml +2 -0
- data/data/codelists/codelist-198.yml +7 -0
- data/data/codelists/codelist-2.yml +6 -6
- data/data/codelists/codelist-20.yml +10 -1
- data/data/codelists/codelist-203.yml +1 -1
- data/data/codelists/codelist-204.yml +4 -0
- data/data/codelists/codelist-21.yml +24 -19
- data/data/codelists/codelist-215.yml +9 -0
- data/data/codelists/codelist-216.yml +11 -0
- data/data/codelists/codelist-217.yml +9 -0
- data/data/codelists/codelist-218.yml +5 -0
- data/data/codelists/codelist-219.yml +5 -0
- data/data/codelists/codelist-22.yml +5 -4
- data/data/codelists/codelist-220.yml +10 -0
- data/data/codelists/codelist-221.yml +6 -0
- data/data/codelists/codelist-222.yml +4 -0
- data/data/codelists/codelist-223.yml +4 -0
- data/data/codelists/codelist-224.yml +8 -0
- data/data/codelists/codelist-225.yml +4 -0
- data/data/codelists/codelist-226.yml +7 -0
- data/data/codelists/codelist-227.yml +21 -0
- data/data/codelists/codelist-228.yml +3 -0
- data/data/codelists/codelist-229.yml +5 -0
- data/data/codelists/codelist-23.yml +5 -3
- data/data/codelists/codelist-230.yml +8 -0
- data/data/codelists/codelist-238.yml +23 -0
- data/data/codelists/codelist-239.yml +4 -0
- data/data/codelists/codelist-24.yml +3 -0
- data/data/codelists/codelist-240.yml +6 -0
- data/data/codelists/codelist-241.yml +9 -0
- data/data/codelists/codelist-242.yml +24 -0
- data/data/codelists/codelist-243.yml +9 -0
- data/data/codelists/codelist-244.yml +3 -0
- data/data/codelists/codelist-245.yml +5 -0
- data/data/codelists/codelist-246.yml +4 -0
- data/data/codelists/codelist-247.yml +4 -0
- data/data/codelists/codelist-25.yml +4 -2
- data/data/codelists/codelist-26.yml +28 -18
- data/data/codelists/codelist-27.yml +35 -19
- data/data/codelists/codelist-28.yml +2 -1
- data/data/codelists/codelist-29.yml +8 -3
- data/data/codelists/codelist-3.yml +5 -2
- data/data/codelists/codelist-30.yml +6 -2
- data/data/codelists/codelist-32.yml +7 -0
- data/data/codelists/codelist-33.yml +6 -2
- data/data/codelists/codelist-34.yml +0 -11
- data/data/codelists/codelist-38.yml +1 -1
- data/data/codelists/codelist-39.yml +2 -2
- data/data/codelists/codelist-41.yml +4 -3
- data/data/codelists/codelist-42.yml +0 -12
- data/data/codelists/codelist-43.yml +3 -1
- data/data/codelists/codelist-44.yml +16 -3
- data/data/codelists/codelist-45.yml +8 -3
- data/data/codelists/codelist-46.yml +4 -4
- data/data/codelists/codelist-48.yml +20 -2
- data/data/codelists/codelist-49.yml +268 -1
- data/data/codelists/codelist-5.yml +6 -3
- data/data/codelists/codelist-51.yml +11 -5
- data/data/codelists/codelist-55.yml +2 -2
- data/data/codelists/codelist-57.yml +1 -0
- data/data/codelists/codelist-58.yml +14 -12
- data/data/codelists/codelist-59.yml +10 -1
- data/data/codelists/codelist-6.yml +39 -39
- data/data/codelists/codelist-60.yml +1 -1
- data/data/codelists/codelist-62.yml +2 -1
- data/data/codelists/codelist-64.yml +3 -2
- data/data/codelists/codelist-65.yml +1 -0
- data/data/codelists/codelist-68.yml +2 -2
- data/data/codelists/codelist-69.yml +2 -2
- data/data/codelists/codelist-7.yml +21 -17
- data/data/codelists/codelist-71.yml +16 -6
- data/data/codelists/codelist-73.yml +7 -5
- data/data/codelists/codelist-74.yml +59 -31
- data/data/codelists/codelist-75.yml +1 -1
- data/data/codelists/codelist-76.yml +3 -3
- data/data/codelists/codelist-78.yml +52 -26
- data/data/codelists/codelist-79.yml +16 -7
- data/data/codelists/codelist-8.yml +3 -3
- data/data/codelists/codelist-80.yml +6 -5
- data/data/codelists/codelist-81.yml +8 -5
- data/data/codelists/codelist-83.yml +3 -2
- data/data/codelists/codelist-85.yml +1 -1
- data/data/codelists/codelist-9.yml +7 -3
- data/data/codelists/codelist-90.yml +2 -2
- data/data/codelists/codelist-91.yml +11 -11
- data/data/codelists/codelist-92.yml +1 -1
- data/data/codelists/codelist-93.yml +9 -6
- data/data/codelists/codelist-96.yml +45 -40
- data/data/codelists/codelist-98.yml +6 -3
- data/data/codelists/codelist-99.yml +8 -5
- data/data/onix21/codelists/codelist-1.yml +2 -2
- data/data/onix21/codelists/codelist-10.yml +12 -12
- data/data/onix21/codelists/codelist-11.yml +2 -2
- data/data/onix21/codelists/codelist-12.yml +3 -3
- data/data/onix21/codelists/codelist-121.yml +9 -9
- data/data/onix21/codelists/codelist-13.yml +1 -1
- data/data/onix21/codelists/codelist-139.yml +6 -6
- data/data/onix21/codelists/codelist-141.yml +4 -4
- data/data/onix21/codelists/codelist-142.yml +2 -2
- data/data/onix21/codelists/codelist-145.yml +2 -2
- data/data/onix21/codelists/codelist-147.yml +2 -2
- data/data/onix21/codelists/codelist-148.yml +1 -1
- data/data/onix21/codelists/codelist-149.yml +1 -1
- data/data/onix21/codelists/codelist-15.yml +1 -1
- data/data/onix21/codelists/codelist-150.yml +23 -23
- data/data/onix21/codelists/codelist-151.yml +1 -1
- data/data/onix21/codelists/codelist-153.yml +3 -3
- data/data/onix21/codelists/codelist-154.yml +2 -2
- data/data/onix21/codelists/codelist-155.yml +1 -1
- data/data/onix21/codelists/codelist-158.yml +2 -2
- data/data/onix21/codelists/codelist-159.yml +1 -1
- data/data/onix21/codelists/codelist-163.yml +2 -2
- data/data/onix21/codelists/codelist-166.yml +1 -1
- data/data/onix21/codelists/codelist-169.yml +2 -2
- data/data/onix21/codelists/codelist-17.yml +2 -2
- data/data/onix21/codelists/codelist-173.yml +1 -1
- data/data/onix21/codelists/codelist-175.yml +23 -23
- data/data/onix21/codelists/codelist-176.yml +2 -2
- data/data/onix21/codelists/codelist-18.yml +1 -1
- data/data/onix21/codelists/codelist-196.yml +4 -4
- data/data/onix21/codelists/codelist-2.yml +6 -6
- data/data/onix21/codelists/codelist-203.yml +1 -1
- data/data/onix21/codelists/codelist-21.yml +1 -1
- data/data/onix21/codelists/codelist-216.yml +2 -2
- data/data/onix21/codelists/codelist-218.yml +1 -1
- data/data/onix21/codelists/codelist-22.yml +3 -3
- data/data/onix21/codelists/codelist-23.yml +2 -2
- data/data/onix21/codelists/codelist-25.yml +2 -2
- data/data/onix21/codelists/codelist-26.yml +18 -18
- data/data/onix21/codelists/codelist-27.yml +18 -18
- data/data/onix21/codelists/codelist-28.yml +1 -1
- data/data/onix21/codelists/codelist-29.yml +3 -3
- data/data/onix21/codelists/codelist-3.yml +2 -2
- data/data/onix21/codelists/codelist-30.yml +1 -1
- data/data/onix21/codelists/codelist-32.yml +1 -1
- data/data/onix21/codelists/codelist-33.yml +2 -2
- data/data/onix21/codelists/codelist-34.yml +2 -2
- data/data/onix21/codelists/codelist-38.yml +1 -1
- data/data/onix21/codelists/codelist-39.yml +2 -2
- data/data/onix21/codelists/codelist-41.yml +3 -3
- data/data/onix21/codelists/codelist-43.yml +1 -1
- data/data/onix21/codelists/codelist-44.yml +2 -2
- data/data/onix21/codelists/codelist-45.yml +4 -4
- data/data/onix21/codelists/codelist-46.yml +3 -3
- data/data/onix21/codelists/codelist-48.yml +2 -2
- data/data/onix21/codelists/codelist-49.yml +12 -12
- data/data/onix21/codelists/codelist-5.yml +3 -3
- data/data/onix21/codelists/codelist-51.yml +3 -3
- data/data/onix21/codelists/codelist-55.yml +2 -2
- data/data/onix21/codelists/codelist-58.yml +10 -10
- data/data/onix21/codelists/codelist-59.yml +2 -2
- data/data/onix21/codelists/codelist-6.yml +36 -36
- data/data/onix21/codelists/codelist-60.yml +1 -1
- data/data/onix21/codelists/codelist-62.yml +1 -1
- data/data/onix21/codelists/codelist-64.yml +2 -2
- data/data/onix21/codelists/codelist-68.yml +2 -2
- data/data/onix21/codelists/codelist-69.yml +2 -2
- data/data/onix21/codelists/codelist-7.yml +17 -17
- data/data/onix21/codelists/codelist-71.yml +2 -2
- data/data/onix21/codelists/codelist-73.yml +5 -5
- data/data/onix21/codelists/codelist-74.yml +28 -28
- data/data/onix21/codelists/codelist-75.yml +1 -1
- data/data/onix21/codelists/codelist-76.yml +3 -3
- data/data/onix21/codelists/codelist-78.yml +24 -24
- data/data/onix21/codelists/codelist-79.yml +6 -6
- data/data/onix21/codelists/codelist-8.yml +3 -3
- data/data/onix21/codelists/codelist-80.yml +5 -5
- data/data/onix21/codelists/codelist-81.yml +4 -4
- data/data/onix21/codelists/codelist-83.yml +2 -2
- data/data/onix21/codelists/codelist-85.yml +1 -1
- data/data/onix21/codelists/codelist-9.yml +3 -3
- data/data/onix21/codelists/codelist-90.yml +2 -2
- data/data/onix21/codelists/codelist-91.yml +6 -6
- data/data/onix21/codelists/codelist-92.yml +1 -1
- data/data/onix21/codelists/codelist-93.yml +6 -6
- data/data/onix21/codelists/codelist-96.yml +1 -1
- data/data/onix21/codelists/codelist-98.yml +2 -2
- data/data/onix21/codelists/codelist-99.yml +4 -4
- data/doc-src/handlers.rb +32 -2
- data/im_onix.gemspec +3 -1
- data/lib/onix/addressee.rb +5 -3
- data/lib/onix/ancillary_content.rb +7 -0
- data/lib/onix/audience.rb +7 -0
- data/lib/onix/audience_range.rb +10 -0
- data/lib/onix/barcode.rb +6 -0
- data/lib/onix/builder.rb +197 -0
- data/lib/onix/cited_content.rb +15 -0
- data/lib/onix/code.rb +322 -42
- data/lib/onix/collateral_detail.rb +9 -13
- data/lib/onix/collection.rb +14 -4
- data/lib/onix/collection_sequence.rb +3 -3
- data/lib/onix/comparison_product_price.rb +17 -0
- data/lib/onix/complexity.rb +6 -0
- data/lib/onix/content_detail.rb +7 -0
- data/lib/onix/content_item.rb +38 -0
- data/lib/onix/contributor.rb +56 -34
- data/lib/onix/contributor_place.rb +12 -0
- data/lib/onix/copyright_statement.rb +8 -0
- data/lib/onix/date.rb +107 -56
- data/lib/onix/descriptive_detail.rb +98 -49
- data/lib/onix/discount.rb +9 -0
- data/lib/onix/discount_coded.rb +3 -3
- data/lib/onix/entity.rb +22 -37
- data/lib/onix/epub_license.rb +8 -0
- data/lib/onix/epub_license_expression.rb +7 -0
- data/lib/onix/epub_usage_constraint.rb +5 -3
- data/lib/onix/epub_usage_limit.rb +2 -2
- data/lib/onix/error.rb +2 -0
- data/lib/onix/extent.rb +4 -3
- data/lib/onix/header.rb +17 -0
- data/lib/onix/helper.rb +3 -12
- data/lib/onix/identifier.rb +81 -57
- data/lib/onix/language.rb +5 -2
- data/lib/onix/market.rb +2 -1
- data/lib/onix/market_publishing_detail.rb +14 -3
- data/lib/onix/measure.rb +7 -0
- data/lib/onix/onix21.rb +26 -24
- data/lib/onix/onix_message.rb +40 -48
- data/lib/onix/page_run.rb +6 -0
- data/lib/onix/price.rb +44 -11
- data/lib/onix/prize.rb +11 -0
- data/lib/onix/product.rb +45 -17
- data/lib/onix/product_classification.rb +8 -0
- data/lib/onix/product_contact.rb +11 -0
- data/lib/onix/product_part.rb +25 -10
- data/lib/onix/{product_supplies_extractor.rb → product_supplies_methods.rb} +3 -3
- data/lib/onix/product_supply.rb +4 -3
- data/lib/onix/professional_affiliation.rb +6 -0
- data/lib/onix/publisher_representative.rb +11 -0
- data/lib/onix/publishing_detail.rb +22 -9
- data/lib/onix/related_material.rb +6 -2
- data/lib/onix/related_product.rb +14 -6
- data/lib/onix/related_work.rb +5 -3
- data/lib/onix/resource_feature.rb +9 -0
- data/lib/onix/resource_version.rb +85 -0
- data/lib/onix/resource_version_feature.rb +22 -0
- data/lib/onix/returns_conditions.rb +8 -0
- data/lib/onix/review_rating.rb +7 -0
- data/lib/onix/sales_outlet.rb +12 -2
- data/lib/onix/sales_restriction.rb +7 -16
- data/lib/onix/sales_rights.rb +6 -3
- data/lib/onix/sender.rb +5 -5
- data/lib/onix/serializer.rb +131 -87
- data/lib/onix/subject.rb +11 -6
- data/lib/onix/subset.rb +255 -104
- data/lib/onix/supplier_own_coding.rb +7 -0
- data/lib/onix/supply_contact.rb +9 -0
- data/lib/onix/supply_detail.rb +28 -5
- data/lib/onix/supporting_resource.rb +10 -113
- data/lib/onix/tax.rb +11 -5
- data/lib/onix/territory.rb +8 -4
- data/lib/onix/text_content.rb +13 -0
- data/lib/onix/text_item.rb +12 -0
- data/lib/onix/title_detail.rb +4 -3
- data/lib/onix/title_element.rb +16 -13
- data/lib/onix/website.rb +4 -3
- metadata +89 -3
data/lib/onix/onix_message.rb
CHANGED
@@ -4,6 +4,7 @@ require 'time'
|
|
4
4
|
require 'onix/subset'
|
5
5
|
require 'onix/helper'
|
6
6
|
require 'onix/code'
|
7
|
+
require 'onix/header'
|
7
8
|
require 'onix/sender'
|
8
9
|
require 'onix/addressee'
|
9
10
|
require 'onix/product'
|
@@ -11,11 +12,22 @@ require 'onix/product'
|
|
11
12
|
require 'onix/onix21'
|
12
13
|
|
13
14
|
module ONIX
|
14
|
-
class ONIXMessage <
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
class ONIXMessage < SubsetDSL
|
16
|
+
extend Forwardable
|
17
|
+
attr_accessor :release
|
18
|
+
|
19
|
+
element "Header", :subset, :cardinality => 1
|
20
|
+
elements "Product", :subset, :cardinality => 0..n
|
21
|
+
|
22
|
+
def_delegator :header, :sender
|
23
|
+
def_delegator :header, :addressee
|
24
|
+
def_delegator :header, :default_language_of_text
|
25
|
+
def_delegator :header, :default_currency_code
|
26
|
+
def_delegator :header, :sent_date_time
|
27
|
+
|
28
|
+
def header
|
29
|
+
@header || Header.new
|
30
|
+
end
|
19
31
|
|
20
32
|
def initialize
|
21
33
|
@products = []
|
@@ -53,6 +65,8 @@ module ONIX
|
|
53
65
|
product.identifiers.each do |ident|
|
54
66
|
@vault[ident.uniq_id] = product
|
55
67
|
end
|
68
|
+
product.default_language_of_text = self.default_language_of_text if @header
|
69
|
+
product.default_currency_code = self.default_currency_code if @header
|
56
70
|
end
|
57
71
|
|
58
72
|
@products.each do |product|
|
@@ -75,6 +89,7 @@ module ONIX
|
|
75
89
|
end
|
76
90
|
|
77
91
|
# open with arg detection
|
92
|
+
# @param [String, File] arg
|
78
93
|
def open(arg, force_encoding = nil)
|
79
94
|
data = ONIX::Helper.arg_to_data(arg)
|
80
95
|
|
@@ -90,6 +105,7 @@ module ONIX
|
|
90
105
|
end
|
91
106
|
|
92
107
|
# release as an integer eg: 210, 300, 301
|
108
|
+
# @return [Number]
|
93
109
|
def version
|
94
110
|
if @release
|
95
111
|
@release.gsub(/\./, "").to_i * 10 ** (3 - @release.scan(".").length - 1)
|
@@ -97,6 +113,7 @@ module ONIX
|
|
97
113
|
end
|
98
114
|
|
99
115
|
# detect ONIX version from XML tags
|
116
|
+
# @return [String]
|
100
117
|
def detect_release(element)
|
101
118
|
if element
|
102
119
|
return "3.0" if element.search("//DescriptiveDetail").length > 0
|
@@ -117,57 +134,32 @@ module ONIX
|
|
117
134
|
end
|
118
135
|
end
|
119
136
|
|
137
|
+
def product_klass
|
138
|
+
self.version >= 300 ? Product : ONIX21::Product
|
139
|
+
end
|
140
|
+
|
141
|
+
def get_class(name)
|
142
|
+
if name == "Product"
|
143
|
+
self.product_klass
|
144
|
+
else
|
145
|
+
super(name)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
120
149
|
# parse filename or file
|
150
|
+
# @param [String, File] arg
|
121
151
|
def parse(arg, force_encoding = nil, force_release = nil)
|
122
|
-
xml = open(arg, force_encoding)
|
123
152
|
@products = []
|
153
|
+
xml = open(arg, force_encoding)
|
124
154
|
root = xml.root
|
125
155
|
set_release_from_xml(root, force_release)
|
126
156
|
case root
|
127
|
-
when tag_match("ONIXMessage")
|
128
|
-
root.elements.each do |e|
|
129
|
-
case e
|
130
|
-
when tag_match("Header")
|
131
|
-
e.elements.each do |t|
|
132
|
-
case t
|
133
|
-
when tag_match("Sender")
|
134
|
-
@sender = Sender.parse(t)
|
135
|
-
when tag_match("Addressee")
|
136
|
-
@addressee = Addressee.parse(t)
|
137
|
-
when tag_match("SentDateTime")
|
138
|
-
tm = t.text
|
139
|
-
@sent_date_time = Time.strptime(tm, "%Y%m%dT%H%M%S") rescue Time.strptime(tm, "%Y%m%dT%H%M") rescue Time.strptime(tm, "%Y%m%d") rescue nil
|
140
|
-
when tag_match("DefaultLanguageOfText")
|
141
|
-
@default_language_of_text = LanguageCode.parse(t)
|
142
|
-
when tag_match("DefaultCurrencyCode")
|
143
|
-
@default_currency_code = t.text
|
144
|
-
else
|
145
|
-
unsupported(t)
|
146
|
-
end
|
147
|
-
end
|
148
|
-
when tag_match("Product")
|
149
|
-
product = nil
|
150
|
-
if self.version >= 300
|
151
|
-
product = Product.parse(e)
|
152
|
-
else
|
153
|
-
product = ONIX21::Product.parse(e)
|
154
|
-
end
|
155
|
-
product.default_language_of_text = @default_language_of_text
|
156
|
-
product.default_currency_code = @default_currency_code
|
157
|
-
@products << product
|
158
|
-
end
|
159
|
-
end
|
160
157
|
when tag_match("Product")
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
else
|
165
|
-
product = ONIX21::Product.parse(root)
|
166
|
-
end
|
167
|
-
product.default_language_of_text = @default_language_of_text
|
168
|
-
product.default_currency_code = @default_currency_code
|
169
|
-
@products << product
|
158
|
+
@products << self.product_klass.parse(root)
|
159
|
+
else # ONIXMessage
|
160
|
+
super(root)
|
170
161
|
end
|
162
|
+
|
171
163
|
init_vault
|
172
164
|
end
|
173
165
|
end
|
data/lib/onix/price.rb
CHANGED
@@ -1,23 +1,56 @@
|
|
1
|
+
require 'onix/date'
|
1
2
|
require 'onix/tax'
|
2
3
|
require 'onix/discount_coded'
|
3
|
-
require 'onix/
|
4
|
+
require 'onix/discount'
|
5
|
+
require 'onix/epub_license'
|
6
|
+
require 'onix/comparison_product_price'
|
4
7
|
|
5
8
|
module ONIX
|
6
9
|
class Price < SubsetDSL
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
+
# elements "PriceIdentifier", :subset, :cardinality => 0..n
|
11
|
+
|
12
|
+
|
13
|
+
element "PriceType", :subset, :shortcut => :type, :cardinality => 0..1
|
14
|
+
element "PriceQualifier", :subset, :shortcut => :qualifier, :cardinality => 0..1
|
15
|
+
elements "EpubTechnicalProtection", :subset, :cardinality => 0..n
|
16
|
+
|
17
|
+
# elements "PriceConstraint", :subset, :cardinality => 0..n
|
18
|
+
|
19
|
+
|
20
|
+
element "EpubLicense", :subset, :cardinality => 0..1
|
21
|
+
element "PriceTypeDescription", :text, :cardinality => 0..n
|
22
|
+
|
23
|
+
# element "PricePer", :subset, :cardinality => 0..1
|
24
|
+
# elements "PriceCondition", :subset, :cardinality => 0..n
|
25
|
+
# element "MinimumOrderQuantity", :integer, :cardinality => 0..1
|
26
|
+
# elements "BatchBonus", :subset, :cardinality => 0..n
|
27
|
+
|
28
|
+
|
29
|
+
elements "DiscountCoded", :subset, :cardinality => 0..n
|
30
|
+
elements "Discount", :subset, :cardinality => 0..n
|
10
31
|
element "PriceStatus", :subset
|
11
|
-
elements "PriceDate", :subset, :shortcut => :dates
|
12
32
|
element "PriceAmount", :float,
|
13
33
|
{
|
14
|
-
|
15
|
-
|
16
|
-
|
34
|
+
:shortcut => :amount,
|
35
|
+
:parse_lambda => lambda { |v| (v * 100).round },
|
36
|
+
:serialize_lambda => lambda { |v| format("%.2f", v / 100.0) },
|
37
|
+
:cardinality => 0..1
|
17
38
|
}
|
18
|
-
element "Tax", :subset
|
19
|
-
element "
|
20
|
-
element "
|
39
|
+
element "Tax", :subset, :cardinality => 0..n
|
40
|
+
element "TaxExempt", :bool, :cardinality => 0..1
|
41
|
+
element "UnpricedItemType", :subset, :cardinality => 0..1
|
42
|
+
element "CurrencyCode", :text, :shortcut => :currency, :cardinality => 0..1
|
43
|
+
element "Territory", :subset, :cardinality => 0..1
|
44
|
+
elements "ComparisonProductPrice", :subset, :cardinality => 0..n
|
45
|
+
elements "PriceDate", :subset, :shortcut => :dates, :cardinality => 0..n
|
46
|
+
element "PrintedOnProduct", :subset, :cardinality => 0..1
|
47
|
+
element "PositionOnProduct", :subset, :cardinality => 0..1
|
48
|
+
|
49
|
+
# FIXME discount_coded != discount
|
50
|
+
# @return [DiscountCoded]
|
51
|
+
def discount
|
52
|
+
self.discount_codeds.first
|
53
|
+
end
|
21
54
|
|
22
55
|
# @!group High level
|
23
56
|
|
data/lib/onix/prize.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
module ONIX
|
2
|
+
class Prize < SubsetDSL
|
3
|
+
elements "PrizeName", :text, :cardinality => 1..n
|
4
|
+
element "PrizeYear", :text, :cardinality => 0..1
|
5
|
+
element "PrizeCountry", :subset, :klass => "CountryCode", :cardinality => 0..1
|
6
|
+
element "PrizeRegion", :subset, :klass => "RegionCode", :cardinality => 0..1
|
7
|
+
element "PrizeCode", :subset, :cardinality => 0..1
|
8
|
+
elements "PrizeStatement", :text, :cardinality => 0..n
|
9
|
+
elements "PrizeJury", :text, :cardinality => 0..n
|
10
|
+
end
|
11
|
+
end
|
data/lib/onix/product.rb
CHANGED
@@ -2,33 +2,45 @@ require 'forwardable'
|
|
2
2
|
require 'onix/helper'
|
3
3
|
require 'onix/code'
|
4
4
|
require 'onix/entity'
|
5
|
+
require 'onix/identifier'
|
6
|
+
require 'onix/barcode'
|
5
7
|
require 'onix/descriptive_detail'
|
6
8
|
require 'onix/publishing_detail'
|
7
9
|
require 'onix/collateral_detail'
|
8
10
|
require 'onix/related_material'
|
9
11
|
require 'onix/supporting_resource'
|
10
12
|
require 'onix/product_supply'
|
13
|
+
require 'onix/content_detail'
|
11
14
|
require 'onix/territory'
|
12
15
|
require 'onix/error'
|
13
|
-
require 'onix/
|
16
|
+
require 'onix/product_supplies_methods'
|
14
17
|
|
15
18
|
module ONIX
|
16
19
|
class Product < SubsetDSL
|
17
20
|
extend Forwardable
|
18
|
-
include
|
19
|
-
include
|
20
|
-
include
|
21
|
-
include
|
22
|
-
|
23
|
-
element "RecordReference", :text
|
24
|
-
element "NotificationType", :subset
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
element "
|
29
|
-
|
30
|
-
|
31
|
-
|
21
|
+
include IdentifiersMethods::Ean
|
22
|
+
include IdentifiersMethods::Isbn
|
23
|
+
include IdentifiersMethods::ProprietaryId
|
24
|
+
include ProductSuppliesMethods
|
25
|
+
|
26
|
+
element "RecordReference", :text, :cardinality => 1
|
27
|
+
element "NotificationType", :subset, :cardinality => 1
|
28
|
+
elements "DeletionText", :text, :cardinality => 0..n
|
29
|
+
element "RecordSourceType", :subset, :cardinality => 0..1
|
30
|
+
elements "RecordSourceIdentifier", :subset, :cardinality => 0..n
|
31
|
+
element "RecordSourceName", :text, :cardinality => 0..1
|
32
|
+
elements "ProductIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
|
33
|
+
elements "Barcode", :subset, :cardinality => 0..n
|
34
|
+
element "DescriptiveDetail", :subset, :cardinality => 0..1
|
35
|
+
element "CollateralDetail", :subset, :cardinality => 0..1
|
36
|
+
|
37
|
+
# element "PromotionDetail", :subset, :cardinality => 0..1
|
38
|
+
|
39
|
+
|
40
|
+
element "ContentDetail", :subset, :cardinality => 0..1
|
41
|
+
element "PublishingDetail", :subset, :cardinality => 0..1
|
42
|
+
element "RelatedMaterial", :subset, :cardinality => 0..1
|
43
|
+
elements "ProductSupply", :subset, :cardinality => 0..n
|
32
44
|
|
33
45
|
# default LanguageCode from ONIXMessage
|
34
46
|
attr_accessor :default_language_of_text
|
@@ -91,7 +103,23 @@ module ONIX
|
|
91
103
|
def_delegator :publishing_detail, :imprint
|
92
104
|
def_delegator :publishing_detail, :publisher
|
93
105
|
|
106
|
+
# @return [CollateralDetail]
|
107
|
+
def collateral_detail
|
108
|
+
@collateral_detail || CollateralDetail.new
|
109
|
+
end
|
110
|
+
|
111
|
+
# @return [DescriptiveDetail]
|
112
|
+
def descriptive_detail
|
113
|
+
@descriptive_detail || DescriptiveDetail.new
|
114
|
+
end
|
115
|
+
|
116
|
+
# @return [PublishingDetail]
|
117
|
+
def publishing_detail
|
118
|
+
@publishing_detail || PublishingDetail.new
|
119
|
+
end
|
120
|
+
|
94
121
|
# product LanguageCode of text
|
122
|
+
# @return [String]
|
95
123
|
def language_of_text
|
96
124
|
@descriptive_detail.language_of_text || @default_language_of_text
|
97
125
|
end
|
@@ -274,7 +302,7 @@ module ONIX
|
|
274
302
|
def excerpts
|
275
303
|
return [] unless @collateral_detail && @collateral_detail.supporting_resources
|
276
304
|
|
277
|
-
@collateral_detail.supporting_resources.sample_content.human_code_match(:resource_mode, ["Text", "
|
305
|
+
@collateral_detail.supporting_resources.sample_content.human_code_match(:resource_mode, ["Text", "MultiMode"]).map do |resource|
|
278
306
|
{
|
279
307
|
:url => resource.versions.last.links.first.strip,
|
280
308
|
:form => resource.versions.last.form.human,
|
@@ -328,7 +356,7 @@ module ONIX
|
|
328
356
|
(!sales_restriction.end_date or sales_restriction.end_date >= Date.today)
|
329
357
|
}.map { |sale_right|
|
330
358
|
sale_right.sales_outlets.select { |sale_outlet|
|
331
|
-
sale_outlet.identifier and sale_outlet.identifier.type.human == "
|
359
|
+
sale_outlet.identifier and sale_outlet.identifier.type.human == "OnixRetailSalesOutletIdCode" }.map { |sale_outlet|
|
332
360
|
sale_outlet.identifier.value
|
333
361
|
}
|
334
362
|
}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module ONIX
|
2
|
+
class ProductClassification < SubsetDSL
|
3
|
+
element "ProductClassificationType", :subset, :cardinality => 1
|
4
|
+
element "ProductClassificationTypeName", :text, :cardinality => 0..1
|
5
|
+
element "ProductClassificationCode", :text, :cardinality => 1
|
6
|
+
element "Percent", :text, :cardinality => 0..1
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'onix/identifier'
|
2
|
+
|
3
|
+
module ONIX
|
4
|
+
class ProductContact < SubsetDSL
|
5
|
+
element "ProductContactRole", :subset, :cardinality => 1
|
6
|
+
elements "ProductContactIdentifier", :subset, :cardinality => 0..n
|
7
|
+
element "ProductContactName", :text, :cardinality => 0..1
|
8
|
+
element "ContactName", :text, :cardinality => 0..1
|
9
|
+
element "EmailAddress", :text, :cardinality => 0..1
|
10
|
+
end
|
11
|
+
end
|
data/lib/onix/product_part.rb
CHANGED
@@ -1,21 +1,36 @@
|
|
1
1
|
module ONIX
|
2
2
|
# product part use full Product to provide file protection and file size
|
3
3
|
class ProductPart < SubsetDSL
|
4
|
-
include
|
5
|
-
include
|
4
|
+
include IdentifiersMethods::Ean
|
5
|
+
include IdentifiersMethods::ProprietaryId
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
element "
|
10
|
-
elements "ProductFormDetail", :subset, :shortcut => :form_details
|
11
|
-
elements "
|
12
|
-
|
7
|
+
element "PrimaryPart", :bool, :cardinality => 0..1
|
8
|
+
elements "ProductIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
|
9
|
+
element "ProductForm", :subset, :shortcut => :form, :cardinality => 1
|
10
|
+
elements "ProductFormDetail", :subset, :shortcut => :form_details, :cardinality => 0..n
|
11
|
+
elements "ProductFormFeature", :subset, :cardinality => 0..n
|
12
|
+
|
13
|
+
# element "ProductPackaging", :subset, :cardinality => 0..1
|
14
|
+
|
15
|
+
|
16
|
+
elements "ProductFormDescription", :text, :shortcut => :file_description, :cardinality => 0..n
|
17
|
+
elements "ProductContentType", :subset, :shortcut => :content_types, :cardinality => 0..n
|
18
|
+
elements "Measure", :subset, :cardinality => 0..n
|
19
|
+
element "NumberOfItemsOfThisForm", :integer, :cardinality => 0..1
|
20
|
+
element "NumberOfCopies", :integer, :cardinality => 0..1
|
21
|
+
element "CountryOfManufacture", :subset, :cardinality => 0..1
|
13
22
|
|
14
23
|
def file_formats
|
15
24
|
@product_form_details.select { |fd| fd.code =~ /^E1.*/ }
|
16
25
|
end
|
17
26
|
|
27
|
+
# @return [ProductFormDescription]
|
28
|
+
def product_form_description
|
29
|
+
product_form_descriptions.first
|
30
|
+
end
|
31
|
+
|
18
32
|
# full Product if referenced in ONIXMessage
|
33
|
+
# @return [Product]
|
19
34
|
attr_accessor :product
|
20
35
|
|
21
36
|
# this ProductPart is part of Product
|
@@ -47,8 +62,8 @@ module ONIX
|
|
47
62
|
# raw part file description string without HTML
|
48
63
|
# @return [String]
|
49
64
|
def raw_file_description
|
50
|
-
if
|
51
|
-
Helper.strip_html(
|
65
|
+
if product_form_description
|
66
|
+
Helper.strip_html(product_form_description).gsub(/\s+/, " ").strip
|
52
67
|
end
|
53
68
|
end
|
54
69
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module ONIX
|
2
2
|
# flattened supplies extractor
|
3
|
-
module
|
3
|
+
module ProductSuppliesMethods
|
4
4
|
# class must define a product_supplies returning an Array of objects responding to :
|
5
5
|
# - availability_date (Date)
|
6
6
|
# - countries (country code Array)
|
@@ -112,7 +112,7 @@ module ONIX
|
|
112
112
|
|
113
113
|
# merge by territories
|
114
114
|
grouped_territories_supplies = {}
|
115
|
-
grouped_supplies.each do |
|
115
|
+
grouped_supplies.values.each do |supply|
|
116
116
|
fsupply = supply.first
|
117
117
|
pr_key = "#{fsupply[:available]}_#{fsupply[:including_tax]}_#{fsupply[:currency]}"
|
118
118
|
supply.each do |s|
|
@@ -124,7 +124,7 @@ module ONIX
|
|
124
124
|
|
125
125
|
supplies = []
|
126
126
|
|
127
|
-
grouped_territories_supplies.each do |
|
127
|
+
grouped_territories_supplies.values.each do |supply|
|
128
128
|
fsupply = supply.first.first
|
129
129
|
supplies << {:including_tax => fsupply[:including_tax], :currency => fsupply[:currency],
|
130
130
|
:territory => supply.map { |fs| fs.map { |s| s[:territory] } }.flatten.uniq,
|
data/lib/onix/product_supply.rb
CHANGED
@@ -5,9 +5,9 @@ require 'onix/supply_detail'
|
|
5
5
|
|
6
6
|
module ONIX
|
7
7
|
class ProductSupply < SubsetDSL
|
8
|
-
elements "Market", :subset
|
9
|
-
element "MarketPublishingDetail", :subset
|
10
|
-
elements "SupplyDetail", :subset
|
8
|
+
elements "Market", :subset, :cardinality => 0..n
|
9
|
+
element "MarketPublishingDetail", :subset, :cardinality => 0..1
|
10
|
+
elements "SupplyDetail", :subset, :cardinality => 1..n
|
11
11
|
|
12
12
|
# availability date from market
|
13
13
|
# @return [Date]
|
@@ -41,6 +41,7 @@ module ONIX
|
|
41
41
|
@supply_details.delete_if { |supply_detail| supply_detail.available? }
|
42
42
|
end
|
43
43
|
|
44
|
+
# @return [Boolean]
|
44
45
|
def available?
|
45
46
|
self.available_supply_details.length > 0
|
46
47
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module ONIX
|
2
|
+
class PublisherRepresentative < SubsetDSL
|
3
|
+
element "AgentRole", :subset, :cardinality => 1
|
4
|
+
elements "AgentIdentifier", :subset, :cardinality => 0..n
|
5
|
+
element "AgentName", :text, :cardinality => 0..1
|
6
|
+
elements "TelephoneNumber", :text, :cardinality => 0..n
|
7
|
+
elements "FaxNumber", :text, :cardinality => 0..n
|
8
|
+
elements "EmailAddress", :text, :cardinality => 0..n
|
9
|
+
elements "Website", :subset, :cardinality => 0..n
|
10
|
+
end
|
11
|
+
end
|
@@ -1,19 +1,27 @@
|
|
1
|
+
require 'onix/product_contact'
|
1
2
|
require 'onix/sales_rights'
|
3
|
+
require 'onix/copyright_statement'
|
2
4
|
require 'onix/date'
|
5
|
+
|
3
6
|
module ONIX
|
4
7
|
class PublishingDetail < SubsetDSL
|
5
|
-
elements "Imprint", :subset
|
6
|
-
elements "Publisher", :subset
|
7
|
-
element "CityOfPublication", :text, :shortcut => :city
|
8
|
-
element "CountryOfPublication", :text, :shortcut => :country
|
9
|
-
|
10
|
-
|
11
|
-
elements "
|
12
|
-
|
13
|
-
element "
|
8
|
+
elements "Imprint", :subset, :cardinality => 0..n
|
9
|
+
elements "Publisher", :subset, :cardinality => 0..n
|
10
|
+
element "CityOfPublication", :text, :shortcut => :city, :cardinality => 0..n
|
11
|
+
element "CountryOfPublication", :text, :shortcut => :country, :cardinality => 0..1
|
12
|
+
elements "ProductContact", :subset, :cardinality => 0..n
|
13
|
+
element "PublishingStatus", :subset, :shortcut => :status, :cardinality => 0..1
|
14
|
+
elements "PublishingStatusNote", :text, :cardinality => 0..n
|
15
|
+
elements "PublishingDate", :subset, :cardinality => 0..n
|
16
|
+
element "LatestReprintNumber", :integer, :cardinality => 0..1
|
17
|
+
elements "CopyrightStatement", :subset, :cardinality => 0..n
|
18
|
+
elements "SalesRights", :subset, :pluralize => false, :cardinality => 0..n
|
19
|
+
element "ROWSalesRightsType", :subset, :klass => "SalesRightsType", :cardinality => 0..1
|
20
|
+
element "SalesRestriction", :subset, :cardinality => 0..n
|
14
21
|
|
15
22
|
# @!group High level
|
16
23
|
|
24
|
+
# @return [Publisher]
|
17
25
|
def publisher
|
18
26
|
main_publishers = @publishers.select { |p| p.role.human == "Publisher" }
|
19
27
|
return nil if main_publishers.empty?
|
@@ -24,6 +32,7 @@ module ONIX
|
|
24
32
|
end
|
25
33
|
end
|
26
34
|
|
35
|
+
# @return [Imprint]
|
27
36
|
def imprint
|
28
37
|
if @imprints.length > 0
|
29
38
|
if @imprints.length == 1
|
@@ -35,6 +44,7 @@ module ONIX
|
|
35
44
|
end
|
36
45
|
|
37
46
|
# date of publication
|
47
|
+
# @return [Date]
|
38
48
|
def publication_date
|
39
49
|
pub = @publishing_dates.publication.first
|
40
50
|
if pub
|
@@ -43,6 +53,7 @@ module ONIX
|
|
43
53
|
end
|
44
54
|
|
45
55
|
# date of embargo
|
56
|
+
# @return [Date]
|
46
57
|
def embargo_date
|
47
58
|
pub = @publishing_dates.embargo.first
|
48
59
|
if pub
|
@@ -50,6 +61,7 @@ module ONIX
|
|
50
61
|
end
|
51
62
|
end
|
52
63
|
|
64
|
+
# @return [Date]
|
53
65
|
def preorder_embargo_date
|
54
66
|
pub = @publishing_dates.preorder_embargo.first
|
55
67
|
if pub
|
@@ -57,6 +69,7 @@ module ONIX
|
|
57
69
|
end
|
58
70
|
end
|
59
71
|
|
72
|
+
# @return [Date]
|
60
73
|
def public_announcement_date
|
61
74
|
pub = @publishing_dates.public_announcement.first
|
62
75
|
if pub
|
@@ -2,26 +2,30 @@ require 'onix/related_product'
|
|
2
2
|
require 'onix/related_work'
|
3
3
|
module ONIX
|
4
4
|
class RelatedMaterial < SubsetDSL
|
5
|
-
elements "RelatedWork", :subset
|
6
|
-
elements "RelatedProduct", :subset
|
5
|
+
elements "RelatedWork", :subset, :cardinality => 0..n
|
6
|
+
elements "RelatedProduct", :subset, :cardinality => 0..n
|
7
7
|
|
8
8
|
# @!group High level
|
9
9
|
|
10
|
+
# @return [Array<RelatedProduct>]
|
10
11
|
def linking(human)
|
11
12
|
@related_products.select{|rp| rp.code.human==human}
|
12
13
|
end
|
13
14
|
|
14
15
|
# print products RelatedProduct array
|
16
|
+
# @return [Array<RelatedProduct>]
|
15
17
|
def print_products
|
16
18
|
linking("EpublicationBasedOnPrintProduct") + self.alternative_format_products.select{|rp| rp.form && rp.form.code=~/^B/}
|
17
19
|
end
|
18
20
|
|
19
21
|
# is part of products RelatedProduct array
|
22
|
+
# @return [Array<RelatedProduct>]
|
20
23
|
def part_of_products
|
21
24
|
linking("IsPartOf")
|
22
25
|
end
|
23
26
|
|
24
27
|
# alternative format products RelatedProduct array
|
28
|
+
# @return [Array<RelatedProduct>]
|
25
29
|
def alternative_format_products
|
26
30
|
linking("AlternativeFormat")
|
27
31
|
end
|
data/lib/onix/related_product.rb
CHANGED
@@ -1,23 +1,31 @@
|
|
1
1
|
module ONIX
|
2
2
|
class RelatedProduct < SubsetDSL
|
3
|
-
include
|
4
|
-
include
|
3
|
+
include IdentifiersMethods::Ean
|
4
|
+
include IdentifiersMethods::ProprietaryId
|
5
5
|
|
6
|
-
|
7
|
-
elements "ProductIdentifier", :subset, :shortcut => :identifiers
|
8
|
-
element "ProductForm", :subset, :shortcut => :form
|
9
|
-
elements "ProductFormDetail", :subset, :shortcut => :form_details
|
6
|
+
elements "ProductRelationCode", :subset, :shortcut => :codes, :cardinality => 1..n
|
7
|
+
elements "ProductIdentifier", :subset, :shortcut => :identifiers, :cardinality => 1..n
|
8
|
+
element "ProductForm", :subset, :shortcut => :form, :cardinality => 0..1
|
9
|
+
elements "ProductFormDetail", :subset, :shortcut => :form_details, :cardinality => 0..n
|
10
10
|
|
11
11
|
# full Product if referenced in ONIXMessage
|
12
|
+
# @return [Product]
|
12
13
|
attr_accessor :product
|
13
14
|
|
15
|
+
# @return [ProductRelationCode]
|
16
|
+
def code
|
17
|
+
self.codes.first
|
18
|
+
end
|
19
|
+
|
14
20
|
# @!group High level
|
21
|
+
# @return [String]
|
15
22
|
def file_format
|
16
23
|
file_formats.first.human if file_formats.first
|
17
24
|
end
|
18
25
|
|
19
26
|
# @!endgroup
|
20
27
|
|
28
|
+
# @return [Array<ProductFormDetail>]
|
21
29
|
def file_formats
|
22
30
|
@product_form_details.select { |fd| fd.code =~ /^E1.*/ }
|
23
31
|
end
|
data/lib/onix/related_work.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
module ONIX
|
2
2
|
class RelatedWork < SubsetDSL
|
3
|
-
include
|
4
|
-
|
5
|
-
|
3
|
+
include IdentifiersMethods::Ean
|
4
|
+
|
5
|
+
element "WorkRelationCode", :subset, :shortcut => :code, :cardinality => 0..n
|
6
|
+
elements "WorkIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
|
6
7
|
|
7
8
|
# full Product if referenced in ONIXMessage
|
9
|
+
# @return [Product]
|
8
10
|
attr_accessor :product
|
9
11
|
end
|
10
12
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module ONIX
|
2
|
+
class ResourceFeature < SubsetDSL
|
3
|
+
element "ResourceFeatureType", :subset, :shortcut => :type, :cardinality => 1
|
4
|
+
element "FeatureValue", :text, :shortcut => :value, :cardinality => 0..1
|
5
|
+
elements "FeatureNote", :text, :shortcut => :notes, :cardinality => 0..n
|
6
|
+
|
7
|
+
scope :caption, lambda { human_code_match(:resource_feature_type, "Caption") }
|
8
|
+
end
|
9
|
+
end
|