onix2 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG +209 -0
- data/README.markdown +69 -0
- data/TODO +14 -0
- data/dtd/2.1r3/iso-amsa.ent +173 -0
- data/dtd/2.1r3/iso-amsb.ent +146 -0
- data/dtd/2.1r3/iso-amsc.ent +49 -0
- data/dtd/2.1r3/iso-amsn.ent +117 -0
- data/dtd/2.1r3/iso-amso.ent +77 -0
- data/dtd/2.1r3/iso-amsr.ent +205 -0
- data/dtd/2.1r3/iso-box.ent +67 -0
- data/dtd/2.1r3/iso-cyr1.ent +94 -0
- data/dtd/2.1r3/iso-cyr2.ent +53 -0
- data/dtd/2.1r3/iso-dia.ent +41 -0
- data/dtd/2.1r3/iso-grk3.ent +70 -0
- data/dtd/2.1r3/iso-lat1.ent +89 -0
- data/dtd/2.1r3/iso-lat2.ent +148 -0
- data/dtd/2.1r3/iso-mfrk.ent +79 -0
- data/dtd/2.1r3/iso-mopf.ent +53 -0
- data/dtd/2.1r3/iso-mscr.ent +79 -0
- data/dtd/2.1r3/iso-num.ent +103 -0
- data/dtd/2.1r3/iso-num.old.ent +103 -0
- data/dtd/2.1r3/iso-pub.ent +110 -0
- data/dtd/2.1r3/iso-tech.ent +183 -0
- data/dtd/2.1r3/onix-international.dtd +1012 -0
- data/dtd/2.1r3/onix-xhtml.elt +672 -0
- data/dtd/2.1r3/reference.elt +4758 -0
- data/dtd/2.1r3/xhtml-special.ent +79 -0
- data/dtd/2.1r3/xhtml-symbol.ent +242 -0
- data/lib/onix2.rb +85 -0
- data/lib/onix2/addressee_identifier.rb +29 -0
- data/lib/onix2/apa_product.rb +785 -0
- data/lib/onix2/audience_range.rb +37 -0
- data/lib/onix2/code_list_extractor.rb +69 -0
- data/lib/onix2/contributor.rb +55 -0
- data/lib/onix2/discount_coded.rb +29 -0
- data/lib/onix2/header.rb +68 -0
- data/lib/onix2/imprint.rb +31 -0
- data/lib/onix2/language.rb +29 -0
- data/lib/onix2/lists.rb +134 -0
- data/lib/onix2/market_representation.rb +38 -0
- data/lib/onix2/measure.rb +29 -0
- data/lib/onix2/media_file.rb +33 -0
- data/lib/onix2/other_text.rb +35 -0
- data/lib/onix2/price.rb +47 -0
- data/lib/onix2/product.rb +97 -0
- data/lib/onix2/product_identifier.rb +27 -0
- data/lib/onix2/publisher.rb +33 -0
- data/lib/onix2/reader.rb +157 -0
- data/lib/onix2/sales_restriction.rb +25 -0
- data/lib/onix2/sales_rights.rb +28 -0
- data/lib/onix2/sender_identifier.rb +29 -0
- data/lib/onix2/series.rb +28 -0
- data/lib/onix2/series_identifier.rb +27 -0
- data/lib/onix2/simple_product.rb +47 -0
- data/lib/onix2/stock.rb +29 -0
- data/lib/onix2/subject.rb +33 -0
- data/lib/onix2/supply_detail.rb +53 -0
- data/lib/onix2/title.rb +33 -0
- data/lib/onix2/version.rb +3 -0
- data/lib/onix2/website.rb +29 -0
- data/lib/onix2/writer.rb +86 -0
- data/spec/addressee_identifier_spec.rb +33 -0
- data/spec/apa_product_spec.rb +116 -0
- data/spec/audience_range_spec.rb +44 -0
- data/spec/contributor_spec.rb +38 -0
- data/spec/discount_coded_spec.rb +34 -0
- data/spec/header_spec.rb +153 -0
- data/spec/imprint_spec.rb +31 -0
- data/spec/language_spec.rb +38 -0
- data/spec/lists_spec.rb +33 -0
- data/spec/market_representation_spec.rb +33 -0
- data/spec/measure_spec.rb +38 -0
- data/spec/media_file_spec.rb +38 -0
- data/spec/other_text_spec.rb +33 -0
- data/spec/price_spec.rb +52 -0
- data/spec/product_identifier_spec.rb +34 -0
- data/spec/product_spec.rb +102 -0
- data/spec/publisher_spec.rb +33 -0
- data/spec/reader_spec.rb +155 -0
- data/spec/sales_restriction_spec.rb +27 -0
- data/spec/sender_identifier.rb +33 -0
- data/spec/series_identifier_spec.rb +33 -0
- data/spec/series_spec.rb +47 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/stock_spec.rb +39 -0
- data/spec/subject_spec.rb +34 -0
- data/spec/supply_detail_spec.rb +97 -0
- data/spec/title_spec.rb +38 -0
- data/spec/website_spec.rb +33 -0
- data/spec/writer_spec.rb +78 -0
- data/support/codes/001.tsv +10 -0
- data/support/codes/002.tsv +5 -0
- data/support/codes/003.tsv +7 -0
- data/support/codes/005.tsv +13 -0
- data/support/codes/006.tsv +76 -0
- data/support/codes/007.tsv +123 -0
- data/support/codes/008.tsv +7 -0
- data/support/codes/009.tsv +7 -0
- data/support/codes/010.tsv +34 -0
- data/support/codes/011.tsv +11 -0
- data/support/codes/012.tsv +11 -0
- data/support/codes/013.tsv +7 -0
- data/support/codes/014.tsv +4 -0
- data/support/codes/015.tsv +13 -0
- data/support/codes/016.tsv +6 -0
- data/support/codes/017.tsv +90 -0
- data/support/codes/018.tsv +3 -0
- data/support/codes/019.tsv +7 -0
- data/support/codes/020.tsv +0 -0
- data/support/codes/021.tsv +31 -0
- data/support/codes/022.tsv +9 -0
- data/support/codes/023.tsv +9 -0
- data/support/codes/024.tsv +11 -0
- data/support/codes/025.tsv +29 -0
- data/support/codes/026.tsv +75 -0
- data/support/codes/027.tsv +75 -0
- data/support/codes/028.tsv +8 -0
- data/support/codes/029.tsv +16 -0
- data/support/codes/030.tsv +15 -0
- data/support/codes/031.tsv +3 -0
- data/support/codes/032.tsv +2 -0
- data/support/codes/033.tsv +36 -0
- data/support/codes/034.tsv +14 -0
- data/support/codes/035.tsv +6 -0
- data/support/codes/036.tsv +3 -0
- data/support/codes/037.tsv +6 -0
- data/support/codes/038.tsv +36 -0
- data/support/codes/039.tsv +8 -0
- data/support/codes/040.tsv +6 -0
- data/support/codes/041.tsv +6 -0
- data/support/codes/042.tsv +16 -0
- data/support/codes/043.tsv +4 -0
- data/support/codes/044.tsv +13 -0
- data/support/codes/045.tsv +12 -0
- data/support/codes/046.tsv +3 -0
- data/support/codes/047.tsv +4 -0
- data/support/codes/048.tsv +11 -0
- data/support/codes/049.tsv +84 -0
- data/support/codes/050.tsv +8 -0
- data/support/codes/051.tsv +27 -0
- data/support/codes/052.tsv +1 -0
- data/support/codes/053.tsv +3 -0
- data/support/codes/054.tsv +23 -0
- data/support/codes/055.tsv +13 -0
- data/support/codes/056.tsv +2 -0
- data/support/codes/057.tsv +5 -0
- data/support/codes/058.tsv +21 -0
- data/support/codes/059.tsv +4 -0
- data/support/codes/060.tsv +2 -0
- data/support/codes/061.tsv +3 -0
- data/support/codes/062.tsv +5 -0
- data/support/codes/063.tsv +0 -0
- data/support/codes/064.tsv +13 -0
- data/support/codes/065.tsv +25 -0
- data/support/codes/066.tsv +4 -0
- data/support/codes/067.tsv +2 -0
- data/support/codes/068.tsv +15 -0
- data/support/codes/069.tsv +4 -0
- data/support/codes/070.tsv +2 -0
- data/support/codes/071.tsv +9 -0
- data/support/codes/072.tsv +7 -0
- data/support/codes/073.tsv +36 -0
- data/support/codes/074.tsv +489 -0
- data/support/codes/075.tsv +2 -0
- data/support/codes/076.tsv +12 -0
- data/support/codes/077.tsv +19 -0
- data/support/codes/078.tsv +148 -0
- data/support/codes/079.tsv +17 -0
- data/support/codes/080.tsv +19 -0
- data/support/codes/081.tsv +11 -0
- data/support/codes/082.tsv +17 -0
- data/support/codes/083.tsv +68 -0
- data/support/codes/084.tsv +10 -0
- data/support/codes/085.tsv +23 -0
- data/support/codes/086.tsv +5 -0
- data/support/codes/087.tsv +6 -0
- data/support/codes/088.tsv +0 -0
- data/support/codes/089.tsv +1 -0
- data/support/codes/090.tsv +11 -0
- data/support/codes/091.tsv +248 -0
- data/support/codes/092.tsv +7 -0
- data/support/codes/093.tsv +13 -0
- data/support/codes/094.tsv +3 -0
- data/support/codes/095.tsv +3 -0
- data/support/codes/096.tsv +185 -0
- data/support/codes/097.tsv +1 -0
- data/support/codes/098.tsv +21 -0
- data/support/codes/099.tsv +24 -0
- data/support/codes/100.tsv +4 -0
- data/support/codes/101.tsv +2 -0
- data/support/codes/102.tsv +3 -0
- data/support/codes/121.tsv +127 -0
- data/support/codes/138.tsv +6 -0
- data/support/codes/139.tsv +70 -0
- data/support/codes/140.tsv +7 -0
- data/support/codes/141.tsv +10 -0
- data/support/codes/142.tsv +12 -0
- data/support/codes/143.tsv +7 -0
- data/support/codes/144.tsv +4 -0
- data/support/codes/145.tsv +5 -0
- data/support/codes/146.tsv +3 -0
- data/support/codes/147.tsv +7 -0
- data/support/codes/148.tsv +3 -0
- data/support/codes/149.tsv +4 -0
- data/support/codes/150.tsv +124 -0
- data/support/codes/151.tsv +7 -0
- data/support/codes/152.tsv +2 -0
- data/support/codes/153.tsv +14 -0
- data/support/codes/154.tsv +9 -0
- data/support/codes/155.tsv +5 -0
- data/support/codes/156.tsv +4 -0
- data/support/codes/157.tsv +4 -0
- data/support/codes/158.tsv +24 -0
- data/support/codes/159.tsv +6 -0
- data/support/codes/160.tsv +0 -0
- data/support/codes/161.tsv +3 -0
- data/support/codes/162.tsv +3 -0
- data/support/codes/163.tsv +7 -0
- data/support/codes/164.tsv +2 -0
- data/support/codes/165.tsv +2 -0
- data/support/codes/166.tsv +2 -0
- data/support/codes/167.tsv +3 -0
- data/support/codes/168.tsv +2 -0
- data/support/codes/169.tsv +3 -0
- data/support/codes/170.tsv +0 -0
- data/support/codes/171.tsv +2 -0
- data/support/codes/172.tsv +1 -0
- data/support/codes/173.tsv +2 -0
- data/support/codes/174.tsv +2 -0
- data/support/codes/175.tsv +175 -0
- data/support/codes/176.tsv +12 -0
- data/support/codes/177.tsv +2 -0
- data/support/codes/178.tsv +17 -0
- data/support/entities.txt +1499 -0
- data/support/extract.rb +25 -0
- data/support/switch-onix-2.1-short-to-reference.xsl +24 -0
- data/support/switch-onix-tagnames-1.1.xsl +25 -0
- data/support/switch-onix-tagnames-2.0.xsl +37 -0
- metadata +440 -0
@@ -0,0 +1,38 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX2
|
4
|
+
class MarketRepresentation
|
5
|
+
include Virtus.model
|
6
|
+
|
7
|
+
attribute :agent_name
|
8
|
+
attribute :agent_role, Integer
|
9
|
+
attribute :market_country
|
10
|
+
attribute :market_territory
|
11
|
+
attribute :market_country_excluded
|
12
|
+
attribute :market_restriction_detail
|
13
|
+
attribute :market_publishing_status, Integer
|
14
|
+
|
15
|
+
def to_xml
|
16
|
+
MarketRepresentationRepresenter.new(self).to_xml
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.from_xml(data)
|
20
|
+
MarketRepresentationRepresenter.new(self.new).from_xml(data)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class MarketRepresentationRepresenter < Representable::Decorator
|
25
|
+
include Representable::XML
|
26
|
+
|
27
|
+
self.representation_wrap = :MarketRepresentation
|
28
|
+
|
29
|
+
property :agent_name, as: "AgentName"
|
30
|
+
property :agent_role, as: "AgentRole", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
31
|
+
property :market_country, as: "MarketCountry"
|
32
|
+
property :market_territory, as: "MarketTerritory"
|
33
|
+
property :market_country_excluded, as: "MarketCountryExcluded"
|
34
|
+
property :market_restriction_detail, as: "MarketRestrictionDetail"
|
35
|
+
property :market_publishing_status, as: "MarketPublishingStatus", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX2
|
4
|
+
class Measure
|
5
|
+
include Virtus.model
|
6
|
+
|
7
|
+
attribute :measure_type_code, Integer
|
8
|
+
attribute :measurement #Integer or Decimal
|
9
|
+
attribute :measure_unit_code
|
10
|
+
|
11
|
+
def to_xml
|
12
|
+
MeasureRepresenter.new(self).to_xml
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.from_xml(data)
|
16
|
+
MeasureRepresenter.new(self.new).from_xml(data)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class MeasureRepresenter < Representable::Decorator
|
21
|
+
include Representable::XML
|
22
|
+
|
23
|
+
self.representation_wrap = :Measure
|
24
|
+
|
25
|
+
property :measure_type_code, as: "MeasureTypeCode", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
26
|
+
property :measurement, as: "Measurement", render_filter: ::ONIX2::Formatters::DECIMAL, parse_filter: ->(value, *context) { value.is_a?(Integer) ? value.to_i : BigDecimal.new(value) }
|
27
|
+
property :measure_unit_code, as: "MeasureUnitCode"
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX2
|
4
|
+
class MediaFile
|
5
|
+
include Virtus.model
|
6
|
+
|
7
|
+
attribute :media_file_type_code, Integer
|
8
|
+
attribute :media_file_format_code, Integer
|
9
|
+
attribute :image_resolution
|
10
|
+
attribute :media_file_link_type_code, Integer
|
11
|
+
attribute :media_file_link
|
12
|
+
|
13
|
+
def to_xml
|
14
|
+
MediaFileRepresenter.new(self).to_xml
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.from_xml(data)
|
18
|
+
MediaFileRepresenter.new(self.new).from_xml(data)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class MediaFileRepresenter < Representable::Decorator
|
23
|
+
include Representable::XML
|
24
|
+
|
25
|
+
self.representation_wrap = :MediaFile
|
26
|
+
|
27
|
+
property :media_file_type_code, as: "MediaFileTypeCode", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
28
|
+
property :media_file_format_code, as: "MediaFileFormatCode", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
29
|
+
property :image_resolution, as: "ImageResolution"
|
30
|
+
property :media_file_link_type_code, as: "MediaFileLinkTypeCode", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
31
|
+
property :media_file_link, as: "MediaFileLink"
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX2
|
4
|
+
class OtherText
|
5
|
+
include Virtus.model
|
6
|
+
|
7
|
+
attribute :text_type_code, Integer
|
8
|
+
attribute :text_format
|
9
|
+
attribute :text
|
10
|
+
attribute :text_link_type,Integer
|
11
|
+
attribute :text_link
|
12
|
+
attribute :text_author
|
13
|
+
|
14
|
+
def to_xml
|
15
|
+
OtherTextRepresenter.new(self).to_xml
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.from_xml(data)
|
19
|
+
OtherTextRepresenter.new(self.new).from_xml(data)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class OtherTextRepresenter < Representable::Decorator
|
24
|
+
include Representable::XML
|
25
|
+
|
26
|
+
self.representation_wrap = :OtherText
|
27
|
+
|
28
|
+
property :text_type_code, as: "TextTypeCode", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
29
|
+
property :text_format, as: "TextFormat"
|
30
|
+
property :text, as: "Text"
|
31
|
+
property :text_link_type, as: "TextLinkType", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
32
|
+
property :text_link, as: "TextLink"
|
33
|
+
property :text_author, as: "TextAuthor"
|
34
|
+
end
|
35
|
+
end
|
data/lib/onix2/price.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX2
|
4
|
+
class Price
|
5
|
+
include Virtus.model
|
6
|
+
|
7
|
+
attribute :price_type_code, Integer
|
8
|
+
attribute :price_type_qualifier, Integer
|
9
|
+
attribute :price_type_description
|
10
|
+
attribute :price_per, Integer
|
11
|
+
attribute :minimum_order_qty, Integer
|
12
|
+
attribute :class_of_trade
|
13
|
+
attribute :bic_discount_group_code
|
14
|
+
attribute :discounts_coded, Array[DiscountCoded]
|
15
|
+
attribute :price_status, Integer
|
16
|
+
attribute :price_amount, Decimal
|
17
|
+
attribute :currency_code
|
18
|
+
attribute :discount_percent, Decimal
|
19
|
+
|
20
|
+
def to_xml
|
21
|
+
PriceRepresenter.new(self).to_xml
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.from_xml(data)
|
25
|
+
PriceRepresenter.new(self.new).from_xml(data)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class PriceRepresenter < Representable::Decorator
|
30
|
+
include Representable::XML
|
31
|
+
|
32
|
+
self.representation_wrap = :Price
|
33
|
+
|
34
|
+
property :price_type_code, as: "PriceTypeCode", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
35
|
+
property :price_type_qualifier, as: "PriceQualifier", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
36
|
+
property :price_type_description, as: "PriceTypeDescription"
|
37
|
+
property :price_per, as: "PricePer", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
38
|
+
property :minimum_order_qty, as: "MinimumOrderQuantity"
|
39
|
+
property :class_of_trade, as: "ClassOfTrade"
|
40
|
+
property :bic_discount_group_code, as: "BICDiscountGroupCode"
|
41
|
+
collection :discounts_coded, as: "DiscountCoded", extend: ONIX2::DiscountCodedRepresenter, class: ONIX2::DiscountCoded
|
42
|
+
property :price_status, as: "PriceStatus", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
43
|
+
property :price_amount, as: "PriceAmount", render_filter: ::ONIX2::Formatters::DECIMAL
|
44
|
+
property :currency_code, as: "CurrencyCode"
|
45
|
+
property :discount_percent, as: "DiscountPercent"
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX2
|
4
|
+
class Product
|
5
|
+
include Virtus.model
|
6
|
+
|
7
|
+
attribute :record_reference
|
8
|
+
attribute :notification_type, Integer
|
9
|
+
attribute :product_identifiers, Array[ONIX2::ProductIdentifier]
|
10
|
+
attribute :product_form
|
11
|
+
attribute :product_form_detail
|
12
|
+
attribute :series, Array[ONIX2::Series]
|
13
|
+
attribute :titles, Array[ONIX2::Title]
|
14
|
+
attribute :websites, Array[ONIX2::Website]
|
15
|
+
attribute :contributors, Array[ONIX2::Contributor]
|
16
|
+
attribute :edition_number, Integer
|
17
|
+
attribute :languages, Array[ONIX2::Language]
|
18
|
+
attribute :number_of_pages, Integer
|
19
|
+
attribute :basic_main_subject
|
20
|
+
attribute :bic_main_subject
|
21
|
+
attribute :subjects, Array[ONIX2::Subject]
|
22
|
+
attribute :audience_code
|
23
|
+
attribute :audience_ranges, Array[ONIX2::AudienceRange]
|
24
|
+
attribute :text, Array[ONIX2::OtherText]
|
25
|
+
attribute :media_files, Array[ONIX2::MediaFile]
|
26
|
+
attribute :imprints, Array[ONIX2::Imprint]
|
27
|
+
attribute :publishers, Array[ONIX2::Publisher]
|
28
|
+
attribute :publishing_status, Integer
|
29
|
+
attribute :publication_date
|
30
|
+
attribute :copyright_year, Integer
|
31
|
+
attribute :year_first_published, Integer
|
32
|
+
attribute :sales_restrictions, Array[ONIX2::SalesRestriction]
|
33
|
+
attribute :measurements, Array[ONIX2::Measure]
|
34
|
+
attribute :supply_details, Array[ONIX2::SupplyDetail]
|
35
|
+
attribute :market_representations, Array[ONIX2::MarketRepresentation]
|
36
|
+
attribute :sales_rights, Array[ONIX2::SalesRights]
|
37
|
+
|
38
|
+
# some deprecated attributes. Read only
|
39
|
+
# - See the measures array for the current way of specifying
|
40
|
+
# various measurements of the product
|
41
|
+
attribute :height, Decimal
|
42
|
+
attribute :width, Decimal
|
43
|
+
attribute :thickness, Decimal
|
44
|
+
attribute :weight, Decimal
|
45
|
+
attribute :dimensions
|
46
|
+
|
47
|
+
def to_xml
|
48
|
+
ProductRepresenter.new(self).to_xml
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.from_xml(data)
|
52
|
+
ProductRepresenter.new(self.new).from_xml(data)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class ProductRepresenter < Representable::Decorator
|
57
|
+
include Representable::XML
|
58
|
+
|
59
|
+
self.representation_wrap = :Product
|
60
|
+
|
61
|
+
property :record_reference, as: "RecordReference"
|
62
|
+
property :notification_type, as: "NotificationType", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
63
|
+
collection :product_identifiers, as: "ProductIdentifier", extend: ONIX2::ProductIdentifierRepresenter, class: ONIX2::ProductIdentifier
|
64
|
+
property :product_form, as: "ProductForm"
|
65
|
+
property :product_form_detail, as: "ProductFormDetail", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
66
|
+
collection :series, as: "Series", extend: ONIX2::SeriesRepresenter, class: ONIX2::Series
|
67
|
+
collection :titles, as: "Title", extend: ONIX2::TitleRepresenter, class: ONIX2::Title
|
68
|
+
collection :websites, as: "Website", extend: ONIX2::WebsiteRepresenter, class: ONIX2::Website
|
69
|
+
collection :contributors, as: "Contributor", extend: ONIX2::ContributorRepresenter, class: ONIX2::Contributor
|
70
|
+
property :edition_number, as: "EditionNumber"
|
71
|
+
collection :languages, as: "Language", extend: ONIX2::LanguageRepresenter, class: ONIX2::Language
|
72
|
+
property :number_of_pages, as: "NumberOfPages"
|
73
|
+
property :basic_main_subject, as: "BASICMainSubject"
|
74
|
+
property :bic_main_subject, as: "BICMainSubject"
|
75
|
+
collection :subjects, as: "Subject", extend: ONIX2::SubjectRepresenter, class: ONIX2::Subject
|
76
|
+
property :audience_code, as: "AudienceCode", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
77
|
+
collection :audience_ranges, as: "AudienceRange", extend: ONIX2::AudienceRangeRepresenter, class: ONIX2::AudienceRange
|
78
|
+
collection :text, as: "OtherText", extend: ONIX2::OtherTextRepresenter, class: ONIX2::OtherText
|
79
|
+
collection :media_files, as: "MediaFile", extend: ONIX2::MediaFileRepresenter, class: ONIX2::MediaFile
|
80
|
+
collection :imprints, as: "Imprint", extend: ONIX2::ImprintRepresenter, class: ONIX2::Imprint
|
81
|
+
collection :publishers, as: "Publisher", extend: ONIX2::PublisherRepresenter, class: ONIX2::Publisher
|
82
|
+
property :publishing_status, as: "PublishingStatus", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
83
|
+
property :publication_date, as: "PublicationDate", render_filter: ::ONIX2::Formatters::YYYYMMDD, parse_filter: ->(value, *context) { Date.parse(value) rescue nil }
|
84
|
+
property :copyright_year, as: "CopyrightYear"
|
85
|
+
property :year_first_published, as: "YearFirstPublished"
|
86
|
+
collection :sales_restrictions, as: "SalesRestriction", extend: ONIX2::SalesRestrictionRepresenter, class: ONIX2::SalesRestriction
|
87
|
+
collection :measurements, as: "Measure", extend: ONIX2::MeasureRepresenter, class: ONIX2::Measure
|
88
|
+
collection :supply_details, as: "SupplyDetail", extend: ONIX2::SupplyDetailRepresenter, class: ONIX2::SupplyDetail
|
89
|
+
collection :market_representations, as: "MarketRepresentation", extend: ONIX2::MarketRepresentationRepresenter, class: ONIX2::MarketRepresentation
|
90
|
+
property :height, as: "Height"
|
91
|
+
property :width, as: "Width"
|
92
|
+
property :thickness, as: "Thickness"
|
93
|
+
property :weight, as: "Weight"
|
94
|
+
property :dimensions, as: "Dimensions"
|
95
|
+
collection :sales_rights, as: "SalesRights", extend: ONIX2::SalesRightsRepresenter, class: ONIX2::SalesRights
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX2
|
4
|
+
class ProductIdentifier
|
5
|
+
include Virtus.model
|
6
|
+
|
7
|
+
attribute :product_id_type, Integer
|
8
|
+
attribute :id_value
|
9
|
+
|
10
|
+
def to_xml
|
11
|
+
ProductIdentifierRepresenter.new(self).to_xml
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.from_xml(data)
|
15
|
+
ProductIdentifierRepresenter.new(self.new).from_xml(data)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class ProductIdentifierRepresenter < Representable::Decorator
|
20
|
+
include Representable::XML
|
21
|
+
|
22
|
+
self.representation_wrap = :ProductIdentifier
|
23
|
+
|
24
|
+
property :product_id_type, as: "ProductIDType", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
25
|
+
property :id_value, as: "IDValue"
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX2
|
4
|
+
class Publisher
|
5
|
+
include Virtus.model
|
6
|
+
|
7
|
+
attribute :publishing_role, Integer
|
8
|
+
attribute :name_code_type, Integer
|
9
|
+
attribute :name_code_type_name
|
10
|
+
attribute :name_code_type_value
|
11
|
+
attribute :publisher_name
|
12
|
+
|
13
|
+
def to_xml
|
14
|
+
PublisherRepresenter.new(self).to_xml
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.from_xml(data)
|
18
|
+
PublisherRepresenter.new(self.new).from_xml(data)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class PublisherRepresenter < Representable::Decorator
|
23
|
+
include Representable::XML
|
24
|
+
|
25
|
+
self.representation_wrap = :Publisher
|
26
|
+
|
27
|
+
property :publishing_role, as: "PublishingRole", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
28
|
+
property :name_code_type, as: "NameCodeType", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
29
|
+
property :name_code_type_name, as: "NameCodeTypeName"
|
30
|
+
property :name_code_type_value, as: "NameCodeTypeValue"
|
31
|
+
property :publisher_name, as: "PublisherName"
|
32
|
+
end
|
33
|
+
end
|
data/lib/onix2/reader.rb
ADDED
@@ -0,0 +1,157 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'stringio'
|
4
|
+
|
5
|
+
module ONIX2
|
6
|
+
|
7
|
+
# This is the primary class for reading data from an ONIX file, and there's
|
8
|
+
# really not much to it
|
9
|
+
#
|
10
|
+
# Each file should contain a single header, and 1 or more products:
|
11
|
+
#
|
12
|
+
# reader = ONIX2::Reader.new("somefile.xml")
|
13
|
+
#
|
14
|
+
# puts reader.header.inspect
|
15
|
+
#
|
16
|
+
# reader.each do |product|
|
17
|
+
# puts product.inspect
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# The header will be returned as an ONIX2::Header object, and the product will
|
21
|
+
# be an ONIX2::Product.
|
22
|
+
#
|
23
|
+
# The ONIX2::Product class can be a bit of a hassle to work with, as data can be
|
24
|
+
# nested in it fairly deeply. To wrap all the products returned by the reader
|
25
|
+
# in a shim that provides simple accessor access to common attributes, pass the
|
26
|
+
# shim class as a second argument
|
27
|
+
#
|
28
|
+
# reader = ONIX2::Reader.new("somefile.xml", :product_class => ONIX2::APAProduct)
|
29
|
+
#
|
30
|
+
# puts reader.header.inspect
|
31
|
+
#
|
32
|
+
# reader.each do |product|
|
33
|
+
# puts product.inspect
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# APAProduct stands for Australian Publishers Association and provides simple
|
37
|
+
# access to the ONIX attributes that are commonly used in the Australian market.
|
38
|
+
#
|
39
|
+
# As well as accessing the file header, there are handful of other read only
|
40
|
+
# attributes that might be useful
|
41
|
+
#
|
42
|
+
# reader = ONIX2::Reader.new("somefile.xml")
|
43
|
+
#
|
44
|
+
# puts reader.version
|
45
|
+
# puts reader.xml_lang
|
46
|
+
# puts reader.xml_version
|
47
|
+
# puts reader.encoding
|
48
|
+
#
|
49
|
+
# The version attribute is particuarly useful. There are multiple revisions of the
|
50
|
+
# ONIX spec, and you may need to handle the file differently based on what
|
51
|
+
# version it is.
|
52
|
+
#
|
53
|
+
# == File Encoding
|
54
|
+
#
|
55
|
+
# ONIX2::Reader returns all strings as UTF-8. Source file encoding is detected by
|
56
|
+
# the encoding declaration at the top of the file, like so:
|
57
|
+
#
|
58
|
+
# <?xml version="1.0" encoding="iso-8859-1"?>
|
59
|
+
#
|
60
|
+
# If the encoding declaration is missing the file is assumed to be UTF-8.
|
61
|
+
#
|
62
|
+
# If the encoding declaration is missing or wrong and the file isn't UTF-8,
|
63
|
+
# you can manually set or override it like so:
|
64
|
+
#
|
65
|
+
# reader = ONIX2::Reader.new("somefile.xml", :encoding => "iso-8859-1")
|
66
|
+
#
|
67
|
+
# If the file contains invalid bytes for the source encoding an exception will
|
68
|
+
# be raised. This isn't ideal, but I'm still looking for ways to make this
|
69
|
+
# behaviour configurable.
|
70
|
+
#
|
71
|
+
# If you're running 1.9, you might imagine passing an IO stream that auto
|
72
|
+
# transcodes to UTF-8 into ONIX2::Reader might have the same effect, but that
|
73
|
+
# isn't the case. Nokogiri is used to parse the file, and it seems to ignore
|
74
|
+
# IO encoding and just read raw bytes.
|
75
|
+
#
|
76
|
+
class Reader
|
77
|
+
include Enumerable
|
78
|
+
|
79
|
+
attr_reader :header, :release
|
80
|
+
|
81
|
+
def initialize(input, *args)
|
82
|
+
opts = args.last.kind_of?(Hash) ? args.pop : {}
|
83
|
+
if args.size > 0
|
84
|
+
ActiveSupport::Deprecation.warn("Passing a klass as ONIX2::Reader's second argument is deprecated, use the :product_class option instead", caller)
|
85
|
+
end
|
86
|
+
@product_klass = opts[:product_class] || args.pop || ::ONIX2::Product
|
87
|
+
|
88
|
+
if input.kind_of?(String)
|
89
|
+
@file = File.open(input, "r")
|
90
|
+
@reader = Nokogiri::XML::Reader(@file, nil, opts[:encoding]) { |cfg| cfg.dtdload.noent }
|
91
|
+
elsif input.kind_of?(IO)
|
92
|
+
@reader = Nokogiri::XML::Reader(input, nil, opts[:encoding]) { |cfg| cfg.dtdload.noent }
|
93
|
+
else
|
94
|
+
raise ArgumentError, "Unable to read from file or IO stream"
|
95
|
+
end
|
96
|
+
|
97
|
+
@release = find_release
|
98
|
+
@header = find_header
|
99
|
+
|
100
|
+
@xml_lang ||= @reader.lang
|
101
|
+
@xml_version ||= @reader.xml_version.to_f
|
102
|
+
end
|
103
|
+
|
104
|
+
# Iterate over all the products in an ONIX file
|
105
|
+
#
|
106
|
+
def each(&block)
|
107
|
+
@reader.each do |node|
|
108
|
+
if @reader.node_type == 1 && @reader.name == "Product"
|
109
|
+
str = @reader.outer_xml
|
110
|
+
if str.nil?
|
111
|
+
yield @product_klass.new
|
112
|
+
else
|
113
|
+
yield @product_klass.from_xml(str)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def close
|
120
|
+
@reader.close if @reader
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
124
|
+
|
125
|
+
def find_release
|
126
|
+
2.times do
|
127
|
+
@reader.read
|
128
|
+
if @reader.node_type == 1 && @reader.name == "ONIXMessage"
|
129
|
+
value = @reader.attributes["release"]
|
130
|
+
if value
|
131
|
+
return BigDecimal.new(value)
|
132
|
+
else
|
133
|
+
return nil
|
134
|
+
end
|
135
|
+
elsif @reader.node_type == 14
|
136
|
+
return nil
|
137
|
+
end
|
138
|
+
end
|
139
|
+
return nil
|
140
|
+
end
|
141
|
+
|
142
|
+
def find_header
|
143
|
+
100.times do
|
144
|
+
@reader.read
|
145
|
+
if @reader.node_type == 1 && @reader.name == "Header"
|
146
|
+
str = @reader.outer_xml
|
147
|
+
if str.nil?
|
148
|
+
return ONIX2::Header.new
|
149
|
+
else
|
150
|
+
return ONIX2::Header.from_xml(str)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
return nil
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|