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/contributor.rb
CHANGED
@@ -1,49 +1,84 @@
|
|
1
1
|
require 'onix/subset'
|
2
2
|
require 'onix/website'
|
3
|
+
require 'onix/professional_affiliation'
|
4
|
+
require 'onix/contributor_place'
|
3
5
|
|
4
6
|
module ONIX
|
5
7
|
class Contributor < SubsetDSL
|
6
|
-
element "SequenceNumber", :integer
|
7
|
-
element "ContributorRole", :subset, :shortcut => :role
|
8
|
-
elements "
|
9
|
-
|
10
|
-
|
11
|
-
element "
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
element "
|
16
|
-
|
17
|
-
element "
|
18
|
-
|
8
|
+
element "SequenceNumber", :integer, :cardinality => 0..1
|
9
|
+
element "ContributorRole", :subset, :shortcut => :role, :cardinality => 1..n
|
10
|
+
elements "FromLanguage", :subset, :klass => "LanguageCode", :cardinality => 0..n
|
11
|
+
elements "ToLanguage", :subset, :klass => "LanguageCode", :cardinality => 0..n
|
12
|
+
|
13
|
+
# element "NameType", :subset, :cardinality => 0..1
|
14
|
+
|
15
|
+
|
16
|
+
elements "NameIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
|
17
|
+
element "PersonName", :text, :cardinality => 0..1
|
18
|
+
element "PersonNameInverted", :text, :cardinality => 0..1
|
19
|
+
element "TitlesBeforeNames", :text, :cardinality => 0..1
|
20
|
+
element "NamesBeforeKey", :text, :shortcut => :name_before_key, :cardinality => 0..1
|
21
|
+
element "PrefixToKey", :text, :cardinality => 0..1
|
22
|
+
element "KeyNames", :text, :cardinality => 0..1
|
23
|
+
element "NamesAfterKey", :text, :cardinality => 0..1
|
24
|
+
element "SuffixToKey", :text, :cardinality => 0..1
|
25
|
+
element "LettersAfterNames", :text, :cardinality => 0..1
|
26
|
+
element "TitlesAfterNames", :text, :cardinality => 0..1
|
27
|
+
|
28
|
+
# element "Gender", :subset, :cardinality => 0..1
|
29
|
+
|
30
|
+
|
31
|
+
element "CorporateName", :text, :cardinality => 0..1
|
32
|
+
element "CorporateNameInverted", :text, :cardinality => 0..1
|
33
|
+
|
34
|
+
# element "UnnamedPersons", :subset, :cardinality => 0..1
|
35
|
+
# elements "AlternativeName", :subset, :cardinality => 0..n
|
36
|
+
|
37
|
+
|
38
|
+
elements "ContributorDate", :subset, :shortcut => :dates, :cardinality => 0..n
|
39
|
+
elements "ProfessionalAffiliation", :subset, :cardinality => 0..n
|
40
|
+
elements "Prize", :subset, :cardinality => 0..n
|
41
|
+
elements "BiographicalNote", :text, :shortcut => :biographies, :cardinality => 0..n
|
42
|
+
elements "Website", :subset, :cardinality => 0..n
|
43
|
+
elements "ContributorDescription", :text, :cardinality => 0..n
|
44
|
+
elements "ContributorPlace", :subset, :shortcut => :places, :cardinality => 0..n
|
45
|
+
|
46
|
+
# @!group Shortcuts
|
47
|
+
|
48
|
+
# @return [ContributorPlace]
|
49
|
+
def place
|
50
|
+
self.places.first
|
51
|
+
end
|
52
|
+
|
53
|
+
# !@endgroup
|
19
54
|
|
20
55
|
# @!group High level
|
21
56
|
# flatten person name (firstname lastname)
|
22
57
|
# @return [String]
|
23
58
|
def name
|
24
|
-
return
|
59
|
+
return person_name if person_name
|
25
60
|
|
26
|
-
if
|
27
|
-
if
|
28
|
-
return "#{
|
61
|
+
if key_names
|
62
|
+
if names_before_key
|
63
|
+
return "#{names_before_key} #{key_names}"
|
29
64
|
else
|
30
|
-
return
|
65
|
+
return key_names
|
31
66
|
end
|
32
67
|
end
|
33
68
|
|
34
|
-
|
69
|
+
corporate_name
|
35
70
|
end
|
36
71
|
|
37
72
|
# inverted flatten person name
|
38
73
|
# @return [String]
|
39
74
|
def inverted_name
|
40
|
-
|
75
|
+
person_name_inverted || corporate_name_inverted
|
41
76
|
end
|
42
77
|
|
43
78
|
# biography string with HTML
|
44
79
|
# @return [String]
|
45
80
|
def biography
|
46
|
-
|
81
|
+
self.biographies.first
|
47
82
|
end
|
48
83
|
|
49
84
|
# raw biography string without HTML
|
@@ -72,17 +107,4 @@ module ONIX
|
|
72
107
|
|
73
108
|
# @!endgroup
|
74
109
|
end
|
75
|
-
|
76
|
-
class ContributorPlace < SubsetDSL
|
77
|
-
element "ContributorPlaceRelator", :subset
|
78
|
-
element "CountryCode", :subset
|
79
|
-
|
80
|
-
def relator
|
81
|
-
@contributor_place_relator
|
82
|
-
end
|
83
|
-
|
84
|
-
def country_code
|
85
|
-
@country_code.code
|
86
|
-
end
|
87
|
-
end
|
88
110
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module ONIX
|
2
|
+
class ContributorPlace < SubsetDSL
|
3
|
+
element "ContributorPlaceRelator", :subset, :shortcut => :relator, :cardinality => 1
|
4
|
+
element "CountryCode", :subset, :cardinality => 0..1
|
5
|
+
element "RegionCode", :subset, :cardinality => 0..1
|
6
|
+
elements "LocationName", :text, :cardinality => 0..n
|
7
|
+
|
8
|
+
def country_code
|
9
|
+
@country_code.code
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/onix/date.rb
CHANGED
@@ -1,62 +1,63 @@
|
|
1
1
|
module ONIX
|
2
|
-
module
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
if t["dateformat"]
|
18
|
-
@date_format = DateFormat.from_code(t["dateformat"])
|
2
|
+
module DateMethods
|
3
|
+
# @return [DateFormat]
|
4
|
+
attr_accessor :date_format
|
5
|
+
# @return [Date]
|
6
|
+
attr_accessor :date
|
7
|
+
# @return [Time]
|
8
|
+
attr_accessor :datetime
|
9
|
+
|
10
|
+
def parse_date
|
11
|
+
if @date_format
|
12
|
+
@deprecated_date_format = true
|
13
|
+
else
|
14
|
+
if @date.is_a?(TextWithAttributes)
|
15
|
+
@date_format = @date.attributes["dateformat"]
|
19
16
|
end
|
20
17
|
end
|
21
18
|
|
22
|
-
|
19
|
+
@datetime = strpdate!(@date, @date_format)
|
20
|
+
@date = @datetime ? @datetime.to_date : nil
|
21
|
+
end
|
22
|
+
|
23
|
+
# @param [String] date_txt
|
24
|
+
# @param [DateFormat] date_format
|
25
|
+
# @return [Time]
|
26
|
+
def strpdate!(date_txt, date_format)
|
27
|
+
date_format ||= DateFormat.from_code("00")
|
28
|
+
code_format = format_from_code(date_format.code)
|
23
29
|
text_format = format_from_string(date_txt)
|
24
30
|
|
25
31
|
format = code_format
|
26
32
|
|
27
33
|
if code_format != text_format
|
28
|
-
#
|
34
|
+
# puts "WARN incorrect date format #{text_format} != #{code_format}"
|
29
35
|
format = text_format
|
30
36
|
end
|
31
37
|
|
32
38
|
begin
|
33
|
-
if format
|
34
|
-
|
35
|
-
when "00"
|
36
|
-
@date = Date.strptime(date_txt, format)
|
37
|
-
when "01"
|
38
|
-
@date = Date.strptime(date_txt, format)
|
39
|
-
when "05"
|
40
|
-
@date = Date.strptime(date_txt, format)
|
41
|
-
when "14"
|
42
|
-
@date = Time.strptime(date_txt, format)
|
43
|
-
else
|
44
|
-
@date = nil
|
45
|
-
end
|
46
|
-
end
|
47
|
-
rescue
|
39
|
+
datetime = Time.strptime(date_txt, format) if format && %w[00 01 02 05 13 14].include?(date_format.code)
|
40
|
+
rescue => e
|
48
41
|
# invalid date
|
49
42
|
end
|
43
|
+
|
44
|
+
datetime
|
50
45
|
end
|
51
46
|
|
47
|
+
# @param [String] code
|
48
|
+
# @return [String]
|
52
49
|
def format_from_code(code)
|
53
50
|
case code
|
54
51
|
when "00"
|
55
52
|
"%Y%m%d"
|
56
53
|
when "01"
|
57
54
|
"%Y%m"
|
55
|
+
when "02"
|
56
|
+
"%Y%%W"
|
58
57
|
when "05"
|
59
58
|
"%Y"
|
59
|
+
when "13"
|
60
|
+
"%Y%m%dT%H%M%S"
|
60
61
|
when "14"
|
61
62
|
"%Y%m%dT%H%M%S%z"
|
62
63
|
else
|
@@ -64,6 +65,7 @@ module ONIX
|
|
64
65
|
end
|
65
66
|
end
|
66
67
|
|
68
|
+
# @param [String] str
|
67
69
|
def format_from_string(str)
|
68
70
|
case str
|
69
71
|
when /^\d{4}\d{2}\d{2}T\d{2}\d{2}\d{2}/
|
@@ -81,67 +83,116 @@ module ONIX
|
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
86
|
+
# @return [Time]
|
84
87
|
def time
|
85
|
-
@
|
88
|
+
@datetime
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# support for datestamp attribute and SentDateTime
|
93
|
+
class DateStamp
|
94
|
+
attr_accessor :format, :datetime
|
95
|
+
|
96
|
+
def initialize(dt = nil, fmt = "%Y%m%d")
|
97
|
+
@datetime = dt
|
98
|
+
@format = fmt unless @datetime.is_a?(String)
|
99
|
+
end
|
100
|
+
|
101
|
+
def supported_formats
|
102
|
+
["%Y%m%dT%H%M%S%z", "%Y%m%dT%H%M%S", "%Y%m%dT%H%M%z", "%Y%m%dT%H%M", "%Y%m%d"]
|
103
|
+
end
|
104
|
+
|
105
|
+
def parse(tm)
|
106
|
+
@format = nil
|
107
|
+
found_format = nil
|
108
|
+
supported_formats.each do |supported_format|
|
109
|
+
begin
|
110
|
+
@datetime = Time.strptime(tm, supported_format)
|
111
|
+
found_format = supported_format
|
112
|
+
break
|
113
|
+
rescue
|
114
|
+
end
|
115
|
+
end
|
116
|
+
@format = found_format
|
117
|
+
@datetime = tm unless @format
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.from_code(code)
|
121
|
+
ds = self.new
|
122
|
+
ds.parse(code)
|
123
|
+
ds
|
124
|
+
end
|
125
|
+
|
126
|
+
def human
|
127
|
+
@datetime
|
128
|
+
end
|
129
|
+
|
130
|
+
def code
|
131
|
+
@format ? @datetime.strftime(@format) : @datetime
|
86
132
|
end
|
87
133
|
end
|
88
134
|
|
89
135
|
class BaseDate < SubsetDSL
|
90
|
-
include
|
136
|
+
include DateMethods
|
137
|
+
|
138
|
+
class << self
|
139
|
+
def date_elements(role)
|
140
|
+
element role, :subset, :shortcut => :role
|
141
|
+
element "DateFormat", :subset
|
142
|
+
element "Date", :text
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
# use former date representation
|
147
|
+
# @return [Boolean]
|
148
|
+
attr_accessor :deprecated_date_format
|
149
|
+
|
150
|
+
def initialize
|
151
|
+
super
|
152
|
+
@deprecated_date_format = false
|
153
|
+
end
|
91
154
|
|
92
155
|
def parse(n)
|
93
156
|
super
|
94
|
-
parse_date
|
157
|
+
parse_date
|
95
158
|
end
|
96
159
|
end
|
97
160
|
|
98
161
|
class MarketDate < BaseDate
|
99
|
-
|
100
|
-
element "DateFormat", :ignore
|
101
|
-
element "MarketDateRole", :subset, :shortcut => :role
|
162
|
+
date_elements "MarketDateRole"
|
102
163
|
|
103
164
|
scope :availability, lambda { human_code_match(:market_date_role, ["PublicationDate", "EmbargoDate"]) }
|
104
165
|
end
|
105
166
|
|
106
167
|
class PriceDate < BaseDate
|
107
|
-
|
108
|
-
element "DateFormat", :ignore
|
109
|
-
element "PriceDateRole", :subset, :shortcut => :role
|
168
|
+
date_elements "PriceDateRole"
|
110
169
|
|
111
170
|
scope :from_date, lambda { human_code_match(:price_date_role, "FromDate") }
|
112
171
|
scope :until_date, lambda { human_code_match(:price_date_role, "UntilDate") }
|
113
172
|
end
|
114
173
|
|
115
174
|
class SupplyDate < BaseDate
|
116
|
-
|
117
|
-
element "DateFormat", :ignore
|
118
|
-
element "SupplyDateRole", :subset, :shortcut => :role
|
175
|
+
date_elements "SupplyDateRole"
|
119
176
|
|
120
177
|
scope :availability, lambda { human_code_match(:supply_date_role, ["ExpectedAvailabilityDate", "EmbargoDate"]) }
|
121
178
|
end
|
122
179
|
|
123
180
|
class PublishingDate < BaseDate
|
124
|
-
|
125
|
-
element "DateFormat", :ignore
|
126
|
-
element "PublishingDateRole", :subset, :shortcut => :role
|
181
|
+
date_elements "PublishingDateRole"
|
127
182
|
|
128
183
|
scope :publication, lambda { human_code_match(:publishing_date_role, ["PublicationDate", "PublicationDateOfPrintCounterpart"]) }
|
129
|
-
scope :embargo, lambda { human_code_match(:publishing_date_role, "
|
184
|
+
scope :embargo, lambda { human_code_match(:publishing_date_role, "SalesEmbargoDate") }
|
130
185
|
scope :preorder_embargo, lambda { human_code_match(:publishing_date_role, "PreorderEmbargoDate") }
|
131
186
|
scope :public_announcement, lambda { human_code_match(:publishing_date_role, "PublicAnnouncementDate") }
|
132
187
|
end
|
133
188
|
|
134
189
|
class ContentDate < BaseDate
|
135
|
-
|
136
|
-
element "DateFormat", :ignore
|
137
|
-
element "ContentDateRole", :subset, :shortcut => :role
|
190
|
+
date_elements "ContentDateRole"
|
138
191
|
|
139
192
|
scope :last_updated, lambda { human_code_match(:content_date_role, "LastUpdated") }
|
140
193
|
end
|
141
194
|
|
142
195
|
class ContributorDate < BaseDate
|
143
|
-
|
144
|
-
element "DateFormat", :ignore
|
145
|
-
element "ContributorDateRole", :subset, :shortcut => :role
|
196
|
+
date_elements "ContributorDateRole"
|
146
197
|
end
|
147
198
|
end
|
@@ -1,53 +1,123 @@
|
|
1
1
|
require 'onix/collection'
|
2
|
-
require 'onix/collection_sequence'
|
3
2
|
require 'onix/epub_usage_constraint'
|
4
|
-
require 'onix/
|
3
|
+
require 'onix/epub_license'
|
5
4
|
require 'onix/extent'
|
6
5
|
require 'onix/language'
|
6
|
+
require 'onix/ancillary_content'
|
7
7
|
require 'onix/product_form_feature'
|
8
|
+
require 'onix/product_classification'
|
8
9
|
require 'onix/product_part'
|
9
10
|
require 'onix/title_detail'
|
10
11
|
require 'onix/contributor'
|
12
|
+
require 'onix/measure'
|
11
13
|
require 'onix/subject'
|
14
|
+
require 'onix/audience'
|
15
|
+
require 'onix/audience_range'
|
16
|
+
require 'onix/complexity'
|
12
17
|
|
13
18
|
module ONIX
|
14
19
|
class DescriptiveDetail < SubsetDSL
|
15
|
-
element "ProductComposition", :subset, :shortcut => :composition
|
16
|
-
element "ProductForm", :subset, :shortcut => :form
|
17
|
-
elements "ProductFormDetail", :subset, :shortcut => :form_details
|
18
|
-
elements "ProductFormFeature", :subset, :shortcut => :form_features
|
19
|
-
element "
|
20
|
-
element "
|
21
|
-
|
22
|
-
|
23
|
-
elements "
|
24
|
-
elements "
|
25
|
-
|
26
|
-
|
27
|
-
elements "
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
elements "
|
33
|
-
|
34
|
-
elements "
|
35
|
-
|
20
|
+
element "ProductComposition", :subset, :shortcut => :composition, :cardinality => 1
|
21
|
+
element "ProductForm", :subset, :shortcut => :form, :cardinality => 1
|
22
|
+
elements "ProductFormDetail", :subset, :shortcut => :form_details, :cardinality => 0..n
|
23
|
+
elements "ProductFormFeature", :subset, :shortcut => :form_features, :cardinality => 0..n
|
24
|
+
element "ProductPackaging", :subset, :cardinality => 0..1
|
25
|
+
element "ProductFormDescription", :text, :shortcut => :file_description, :cardinality => 0..n
|
26
|
+
element "TradeCategory", :subset, :cardinality => 0..1
|
27
|
+
element "PrimaryContentType", :subset, :klass => "ProductContentType"
|
28
|
+
elements "ProductContentType", :subset, :shortcut => :content_types, :cardinality => 0..n
|
29
|
+
elements "Measure", :subset, :cardinality => 0..n
|
30
|
+
element "CountryOfManufacture", :subset, :klass=>"CountryCode", :cardinality => 0..1
|
31
|
+
elements "EpubTechnicalProtection", :subset, :cardinality => 0..n
|
32
|
+
elements "EpubUsageConstraint", :subset, :cardinality => 0..n
|
33
|
+
element "EpubLicense", :subset, :cardinality => 0..1
|
34
|
+
elements "MapScale", :integer, :cardinality => 0..n
|
35
|
+
elements "ProductClassification", :subset, :cardinality => 0..n
|
36
|
+
elements "ProductPart", :subset, :shortcut => :parts, :cardinality => 0..n
|
37
|
+
elements "Collection", :subset, :cardinality => 0..n
|
38
|
+
element "NoCollection", :bool, :cardinality => 0..1
|
39
|
+
elements "TitleDetail", :subset, :cardinality => 0..n
|
40
|
+
element "ThesisType", :subset, :cardinality => 0..1
|
41
|
+
element "ThesisPresentedTo", :text, :cardinality => 0..1
|
42
|
+
element "ThesisYear", :text, :cardinality => 0..1
|
43
|
+
elements "Contributor", :subset, :cardinality => 0..n
|
44
|
+
elements "ContributorStatement", :text, :cardinality => 0..n
|
45
|
+
element "NoContributor", :bool, :cardinality => 0..1
|
46
|
+
|
47
|
+
# elements "Conference", :subset, :cardinality => 0..n
|
48
|
+
# elements "Event", :subset, :cardinality => 0..n
|
49
|
+
|
50
|
+
|
51
|
+
element "EditionType", :subset, :cardinality => 0..n
|
52
|
+
element "EditionNumber", :integer, :cardinality => 0..1
|
53
|
+
element "EditionVersionNumber", :text, :cardinality => 0..1
|
54
|
+
elements "EditionStatement", :text, :cardinality => 0..n
|
55
|
+
element "NoEdition", :bool, :cardinality => 0..1
|
56
|
+
|
57
|
+
# element "ReligiousText", :subset, :cardinality => 0..1
|
58
|
+
|
59
|
+
|
60
|
+
elements "Language", :subset, :cardinality => 0..1
|
61
|
+
elements "Extent", :subset, :cardinality => 0..n
|
62
|
+
element "Illustrated", :subset, :cardinality => 0..1
|
63
|
+
element "NumberOfIllustrations", :integer, :cardinality => 0..1
|
64
|
+
elements "IllustrationsNote", :text, :cardinality => 0..n
|
65
|
+
elements "AncillaryContent", :subset, :cardinality => 0..n
|
66
|
+
elements "Subject", :subset, :cardinality => 0..n
|
67
|
+
|
68
|
+
# elements "NameAsSubject", :subset, :cardinality => 0..n
|
69
|
+
|
70
|
+
|
71
|
+
elements "AudienceCode", :subset, :cardinality => 0..n
|
72
|
+
elements "Audience", :subset, :cardinality => 0..n
|
73
|
+
elements "AudienceRange", :subset, :cardinality => 0..n
|
74
|
+
elements "AudienceDescription", :text, :cardinality => 0..n
|
75
|
+
elements "Complexity", :subset, :cardinality => 0..n
|
36
76
|
|
37
77
|
# @!group Shortcuts
|
38
78
|
|
79
|
+
# @return [Extent]
|
39
80
|
def pages_extent
|
40
81
|
@extents.page.first
|
41
82
|
end
|
42
83
|
|
84
|
+
# @return [TitleElement]
|
43
85
|
def product_title_element
|
44
86
|
@title_details.distinctive_title.first.title_elements.product_level.first if @title_details.distinctive_title.first
|
45
87
|
end
|
46
88
|
|
89
|
+
# @return [Array<ProductFormDetail>]
|
47
90
|
def file_formats
|
48
91
|
@product_form_details.select { |fd| fd.code =~ /^E1.*/ }
|
49
92
|
end
|
50
93
|
|
94
|
+
# @return [Collection]
|
95
|
+
def publisher_collection
|
96
|
+
@collections.publisher.first
|
97
|
+
end
|
98
|
+
|
99
|
+
# @return [Extent]
|
100
|
+
def filesize_extent
|
101
|
+
@extents.filesize.first
|
102
|
+
end
|
103
|
+
|
104
|
+
# @return [Array<ProductFormDetail>]
|
105
|
+
def audio_formats
|
106
|
+
@product_form_details.select { |fd| fd.code =~ /^A.*/ }
|
107
|
+
end
|
108
|
+
|
109
|
+
# BISAC categories
|
110
|
+
# @return [Array<Subject>]
|
111
|
+
def bisac_categories
|
112
|
+
@subjects.bisac
|
113
|
+
end
|
114
|
+
|
115
|
+
# CLIL categories
|
116
|
+
# @return [Array<Subject>]
|
117
|
+
def clil_categories
|
118
|
+
@subjects.clil
|
119
|
+
end
|
120
|
+
|
51
121
|
# @!endgroup
|
52
122
|
|
53
123
|
# @!group High level
|
@@ -72,10 +142,6 @@ module ONIX
|
|
72
142
|
end
|
73
143
|
end
|
74
144
|
|
75
|
-
def filesize_extent
|
76
|
-
@extents.filesize.first
|
77
|
-
end
|
78
|
-
|
79
145
|
# file size in bytes
|
80
146
|
# @return [Integer]
|
81
147
|
def filesize
|
@@ -114,18 +180,15 @@ module ONIX
|
|
114
180
|
not audio_formats.empty?
|
115
181
|
end
|
116
182
|
|
183
|
+
# @return [String]
|
117
184
|
def audio_format
|
118
185
|
self.audio_formats.first.human if self.audio_formats.first
|
119
186
|
end
|
120
187
|
|
121
|
-
def audio_formats
|
122
|
-
@product_form_details.select { |fd| fd.code =~ /^A.*/ }
|
123
|
-
end
|
124
|
-
|
125
188
|
# is digital offer a bundle ?
|
126
189
|
# @return [Boolean]
|
127
190
|
def bundle?
|
128
|
-
@product_composition.human == "
|
191
|
+
@product_composition.human == "MultipleComponentRetailProduct"
|
129
192
|
end
|
130
193
|
|
131
194
|
# digital file format string (Epub,Pdf,AmazonKindle)
|
@@ -164,11 +227,12 @@ module ONIX
|
|
164
227
|
# protections string array
|
165
228
|
# @return [Array<String>]
|
166
229
|
def protections
|
167
|
-
return
|
230
|
+
return [] if @epub_technical_protections.length == 0
|
168
231
|
@epub_technical_protections.map(&:human)
|
169
232
|
end
|
170
233
|
|
171
234
|
# language of text
|
235
|
+
# @return [String]
|
172
236
|
def language_of_text
|
173
237
|
l = @languages.of_text.first
|
174
238
|
if l
|
@@ -176,10 +240,6 @@ module ONIX
|
|
176
240
|
end
|
177
241
|
end
|
178
242
|
|
179
|
-
def publisher_collection
|
180
|
-
@collections.publisher.first
|
181
|
-
end
|
182
|
-
|
183
243
|
# publisher collection title
|
184
244
|
# @return [String]
|
185
245
|
def publisher_collection_title
|
@@ -188,24 +248,12 @@ module ONIX
|
|
188
248
|
end
|
189
249
|
end
|
190
250
|
|
191
|
-
# BISAC categories
|
192
|
-
# @return [Array<Subject>]
|
193
|
-
def bisac_categories
|
194
|
-
@subjects.bisac
|
195
|
-
end
|
196
|
-
|
197
251
|
# BISAC categories identifiers string array (eg: FIC000000)
|
198
252
|
# @return [Array<String>]
|
199
253
|
def bisac_categories_codes
|
200
254
|
self.bisac_categories.map { |c| c.code }.uniq
|
201
255
|
end
|
202
256
|
|
203
|
-
# BISAC categories
|
204
|
-
# @return [Array<Subject>]
|
205
|
-
def clil_categories
|
206
|
-
@subjects.clil
|
207
|
-
end
|
208
|
-
|
209
257
|
# CLIL categories identifier string array
|
210
258
|
# @return [Array<String>]
|
211
259
|
def clil_categories_codes
|
@@ -213,6 +261,7 @@ module ONIX
|
|
213
261
|
end
|
214
262
|
|
215
263
|
# keywords string array
|
264
|
+
# @return [Array<String>]
|
216
265
|
def keywords
|
217
266
|
kws = @subjects.keyword.map { |kw| kw.heading_text }.compact
|
218
267
|
kws = kws.flat_map { |kw| kw.split(/;|,|\n/) }.map { |kw| kw.strip }
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module ONIX
|
2
|
+
class Discount < SubsetDSL
|
3
|
+
element "DiscountType", :subset, :cardinality => 0..1
|
4
|
+
element "Quantity", :integer, :cardinality => 0..1
|
5
|
+
element "ToQuantity", :integer, :cardinality => 0..1
|
6
|
+
element "DiscountPercent", :text, :cardinality => 0..1
|
7
|
+
element "DiscountAmount", :text, :cardinality => 0..1
|
8
|
+
end
|
9
|
+
end
|
data/lib/onix/discount_coded.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module ONIX
|
2
2
|
class DiscountCoded < SubsetDSL
|
3
|
-
element "DiscountCodeType", :text, :shortcut => :code_type
|
4
|
-
element "DiscountCodeTypeName", :text, :shortcut => :code_type_name
|
5
|
-
element "DiscountCode", :text, :shortcut => :code
|
3
|
+
element "DiscountCodeType", :text, :shortcut => :code_type, :cardinality => 1
|
4
|
+
element "DiscountCodeTypeName", :text, :shortcut => :code_type_name, :cardinality => 0..1
|
5
|
+
element "DiscountCode", :text, :shortcut => :code, :cardinality => 1
|
6
6
|
end
|
7
7
|
end
|