elibri_onix 0.5.18 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/elibri_onix/external_timestamp.rb +2 -2
- data/lib/elibri_onix/onix_3_0/audience_range.rb +4 -17
- data/lib/elibri_onix/onix_3_0/collection.rb +0 -0
- data/lib/elibri_onix/onix_3_0/contributor.rb +15 -38
- data/lib/elibri_onix/onix_3_0/excerpt_info.rb +8 -21
- data/lib/elibri_onix/onix_3_0/extent.rb +9 -24
- data/lib/elibri_onix/onix_3_0/file_info.rb +2 -13
- data/lib/elibri_onix/onix_3_0/header.rb +7 -17
- data/lib/elibri_onix/onix_3_0/imprint.rb +2 -18
- data/lib/elibri_onix/onix_3_0/language.rb +5 -22
- data/lib/elibri_onix/onix_3_0/measure.rb +4 -18
- data/lib/elibri_onix/onix_3_0/onix_message.rb +2 -17
- data/lib/elibri_onix/onix_3_0/price.rb +14 -25
- data/lib/elibri_onix/onix_3_0/price_constraint_limit.rb +22 -0
- data/lib/elibri_onix/onix_3_0/price_identifier.rb +18 -0
- data/lib/elibri_onix/onix_3_0/product.rb +63 -131
- data/lib/elibri_onix/onix_3_0/product_identifier.rb +6 -22
- data/lib/elibri_onix/onix_3_0/publisher.rb +4 -21
- data/lib/elibri_onix/onix_3_0/publisher_subject.rb +3 -13
- data/lib/elibri_onix/onix_3_0/publishing_date.rb +3 -21
- data/lib/elibri_onix/onix_3_0/related_product.rb +5 -24
- data/lib/elibri_onix/onix_3_0/sales_restriction.rb +5 -22
- data/lib/elibri_onix/onix_3_0/sender.rb +0 -12
- data/lib/elibri_onix/onix_3_0/stock_quantity_coded.rb +4 -19
- data/lib/elibri_onix/onix_3_0/supplier.rb +7 -25
- data/lib/elibri_onix/onix_3_0/supplier_identifier.rb +4 -23
- data/lib/elibri_onix/onix_3_0/supply_detail.rb +9 -26
- data/lib/elibri_onix/onix_3_0/supporting_resource.rb +7 -20
- data/lib/elibri_onix/onix_3_0/text_content.rb +9 -24
- data/lib/elibri_onix/onix_3_0/thema_subject.rb +2 -15
- data/lib/elibri_onix/onix_3_0/title_detail.rb +9 -28
- data/lib/elibri_onix/onix_3_0/title_element.rb +10 -35
- data/lib/elibri_onix/releases.rb +2 -2
- data/lib/elibri_onix/timestamp_parser.rb +12 -0
- data/lib/elibri_onix/version.rb +1 -1
- data/lib/elibri_onix.rb +4 -8
- data/test/elibri_audiobook_test.rb +1 -1
- data/test/elibri_contributors_test.rb +3 -3
- data/test/elibri_ebook_files_test.rb +2 -2
- data/test/elibri_extensions_test.rb +0 -12
- data/test/elibri_group_contributor_test.rb +1 -1
- data/test/elibri_onix_release_3_0_onix_message_test.rb +1 -6
- data/test/elibri_record_identifiers_test.rb +2 -2
- data/test/elibri_sale_restrictions_test.rb +1 -1
- data/test/elibri_supporting_resources_test.rb +2 -2
- data/test/elibri_texts_test.rb +5 -5
- data/test/fixtures/all_possible_tags.xml +1 -18
- data/test/fixtures/lending_example.xml +419 -0
- data/test/fixtures/onix_announced_product_example.xml +1 -3
- data/test/fixtures/onix_audience_range_example.xml +1 -3
- data/test/fixtures/onix_audiobook_extent_example.xml +1 -3
- data/test/fixtures/onix_collective_work_example.xml +1 -3
- data/test/fixtures/onix_contributors_example.xml +1 -3
- data/test/fixtures/onix_ebook_extent_example.xml +1 -4
- data/test/fixtures/onix_edition_example.xml +1 -3
- data/test/fixtures/onix_epub_details_example.xml +5 -4
- data/test/fixtures/onix_languages_example.xml +1 -3
- data/test/fixtures/onix_measurement_example.xml +1 -3
- data/test/fixtures/onix_no_contributors_example.xml +1 -3
- data/test/fixtures/onix_out_of_print_product_example.xml +1 -3
- data/test/fixtures/onix_preorder_product_example.xml +1 -3
- data/test/fixtures/onix_product_form_example.xml +1 -4
- data/test/fixtures/onix_published_group_product_example.xml +1 -3
- data/test/fixtures/onix_published_product_example.xml +1 -3
- data/test/fixtures/onix_publisher_info_example.xml +1 -3
- data/test/fixtures/onix_record_identifiers_example.xml +1 -4
- data/test/fixtures/onix_related_products_example.xml +1 -3
- data/test/fixtures/onix_removed_elibri_extensions.xml +0 -1
- data/test/fixtures/onix_sale_restrictions_example.xml +1 -3
- data/test/fixtures/onix_series_memberships_example.xml +1 -3
- data/test/fixtures/onix_supporting_resources_example.xml +1 -2
- data/test/fixtures/onix_territorial_rights_example.xml +1 -4
- data/test/fixtures/onix_texts_example.xml +1 -3
- data/test/fixtures/onix_title_with_collection_example.xml +1 -3
- data/test/fixtures/onix_titles_example.xml +1 -3
- data/test/fixtures/onix_unlimited_book_sample_example.xml +1 -4
- data/test/lending_licence_test.rb +43 -0
- metadata +9 -20
- data/lib/elibri_onix/hash_id.rb +0 -37
- data/test/fixtures/old_dialect.xml +0 -29
- data/test/fixtures/onix_elibri_extensions_example.xml +0 -57
@@ -1,32 +1,17 @@
|
|
1
1
|
module Elibri
|
2
2
|
module ONIX
|
3
3
|
module Release_3_0
|
4
|
-
|
5
4
|
class StockQuantityCoded
|
6
|
-
|
7
|
-
#from ONIX documentation:
|
8
|
-
#A group of data elements which together specify coded stock level without stating the exact quantity of stock.
|
9
|
-
#Either <StockQuantityCoded> or <OnHand> is mandatory in each occurrence of the <Stock> composite, even if
|
10
|
-
#the quantity on hand is zero. Non-repeating.
|
11
|
-
|
12
|
-
include HashId
|
13
5
|
|
14
|
-
ATTRIBUTES = [
|
15
|
-
:code_type, :code
|
16
|
-
]
|
17
|
-
|
18
|
-
RELATIONS = []
|
19
|
-
|
20
6
|
attr_accessor :code_type, :code, :to_xml
|
21
|
-
|
7
|
+
|
22
8
|
def initialize(data)
|
23
9
|
@to_xml = data.to_s
|
24
|
-
@code_type = data.at_css('StockQuantityCodeType')
|
25
|
-
@code = data.at_css('StockQuantityCode')
|
10
|
+
@code_type = data.at_css('StockQuantityCodeType')&.text&.to_i
|
11
|
+
@code = data.at_css('StockQuantityCode')&.text
|
26
12
|
end
|
27
|
-
|
28
|
-
end
|
29
13
|
|
14
|
+
end
|
30
15
|
end
|
31
16
|
end
|
32
17
|
end
|
@@ -1,45 +1,27 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
1
|
module Elibri
|
5
2
|
module ONIX
|
6
3
|
module Release_3_0
|
7
|
-
|
8
4
|
class Supplier
|
9
|
-
|
10
|
-
#from ONIX documentation:
|
11
|
-
#A group of data elements which together define a supplier. Mandatory in each occurrence of the <SupplyDetail> composite, and not repeatable.
|
12
5
|
|
13
|
-
ATTRIBUTES = [
|
14
|
-
:role, :name, :telephone_number, :email_address, :website, :nip
|
15
|
-
]
|
16
|
-
|
17
|
-
RELATIONS = [
|
18
|
-
:identifiers
|
19
|
-
]
|
20
|
-
|
21
|
-
include HashId
|
22
|
-
|
23
6
|
attr_accessor :role, :identifiers, :name, :telephone_number, :email_address, :website, :to_xml
|
24
|
-
|
7
|
+
|
25
8
|
def initialize(data)
|
26
9
|
@to_xml = data.to_s
|
27
|
-
@role = data.at_css('SupplierRole')
|
10
|
+
@role = data.at_css('SupplierRole')&.text
|
28
11
|
@identifiers = data.css('SupplierIdentifier').map { |identifier_data| SupplierIdentifier.new(identifier_data) }
|
29
|
-
@name = data.at_css('SupplierName')
|
30
|
-
@telephone_number = data.at_css('TelephoneNumber')
|
31
|
-
@email_address = data.at_css('EmailAddress')
|
12
|
+
@name = data.at_css('SupplierName')&.text
|
13
|
+
@telephone_number = data.at_css('TelephoneNumber')&.text
|
14
|
+
@email_address = data.at_css('EmailAddress')&.text
|
32
15
|
if data.at_css('Website')
|
33
|
-
@website = data.at_css('Website').at_css('WebsiteLink')
|
16
|
+
@website = data.at_css('Website').at_css('WebsiteLink')&.text
|
34
17
|
end
|
35
18
|
end
|
36
19
|
|
37
20
|
def nip
|
38
|
-
@identifiers.find {|identifier| (identifier.type == '02') && (identifier.type_name == 'NIP')}
|
21
|
+
@identifiers.find {|identifier| (identifier.type == '02') && (identifier.type_name == 'NIP')}&.value
|
39
22
|
end
|
40
23
|
|
41
24
|
end
|
42
|
-
|
43
25
|
end
|
44
26
|
end
|
45
27
|
end
|
@@ -1,34 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
1
|
module Elibri
|
6
2
|
module ONIX
|
7
3
|
module Release_3_0
|
8
|
-
|
9
4
|
class SupplierIdentifier
|
10
|
-
|
11
|
-
#from ONIX documentation:
|
12
|
-
#A repeatable group of data elements which together define the identifier of a supplier in accordance with a specified scheme,
|
13
|
-
#and allowing different types of supplier identifier to be included without defining additional data elements.
|
14
|
-
#Optional, but each occurrence of the <Supplier> composite must carry either at least one supplier identifier,
|
15
|
-
#or a <SupplierName>, or both.
|
16
|
-
|
17
|
-
include HashId
|
18
5
|
|
19
|
-
ATTRIBUTES = [
|
20
|
-
:type, :type_name, :value
|
21
|
-
]
|
22
|
-
|
23
|
-
RELATIONS = []
|
24
|
-
|
25
6
|
attr_accessor :type, :type_name, :value, :to_xml
|
26
|
-
|
7
|
+
|
27
8
|
def initialize(data)
|
28
9
|
@to_xml = data.to_s
|
29
|
-
@type = data.at_css('SupplierIDType')
|
30
|
-
@type_name = data.at_css('IDTypeName')
|
31
|
-
@value = data.at_css('IDValue')
|
10
|
+
@type = data.at_css('SupplierIDType')&.text
|
11
|
+
@type_name = data.at_css('IDTypeName')&.text
|
12
|
+
@value = data.at_css('IDValue')&.text
|
32
13
|
end
|
33
14
|
|
34
15
|
end
|
@@ -1,51 +1,34 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
1
|
module Elibri
|
5
2
|
module ONIX
|
6
3
|
module Release_3_0
|
7
|
-
|
8
4
|
class SupplyDetail
|
9
|
-
|
10
|
-
#from ONIX documentation:
|
11
|
-
#A group of data elements which together give details of a supply source, and price and availability from that source.
|
12
|
-
#Mandatory in each occurrence of the <ProductSupply> block and repeatable.
|
13
|
-
|
14
|
-
include HashId
|
15
|
-
|
16
5
|
|
17
|
-
|
18
|
-
|
19
|
-
]
|
20
|
-
|
21
|
-
attr_accessor :relation_code, :supplier, :product_availability, :pack_quantity, :price, :on_hand, :quantity_coded, :to_xml, :additional_trade_information
|
6
|
+
attr_accessor :relation_code, :supplier, :product_availability, :pack_quantity, :prices,
|
7
|
+
:on_hand, :quantity_coded, :to_xml, :additional_trade_information
|
22
8
|
|
23
|
-
RELATIONS = []
|
24
|
-
|
25
9
|
def initialize(data)
|
26
10
|
@to_xml = data.to_s
|
27
|
-
@relation_code = data.at_css('ProductRelationCode')
|
11
|
+
@relation_code = data.at_css('ProductRelationCode')&.text&.to_i
|
28
12
|
@supplier = Supplier.new(data.at_css('Supplier')) if data.at_css('Supplier')
|
29
|
-
@product_availability = data.at_css('ProductAvailability')
|
30
|
-
@pack_quantity = data.at_css('PackQuantity')
|
31
|
-
@
|
13
|
+
@product_availability = data.at_css('ProductAvailability')&.text&.to_i
|
14
|
+
@pack_quantity = data.at_css('PackQuantity')&.text&.to_i
|
15
|
+
@prices = data.css("Price").map { |p| Price.new(p) }
|
32
16
|
if data.at_css('Stock')
|
33
|
-
@on_hand = data.at_css('Stock').at_css('OnHand')
|
17
|
+
@on_hand = data.at_css('Stock').at_css('OnHand')&.text&.to_i
|
34
18
|
@quantity_coded = StockQuantityCoded.new(data.at_css('Stock').at_css('StockQuantityCoded')) if data.at_css('Stock').at_css('StockQuantityCoded')
|
35
19
|
end
|
36
20
|
if own_coding = data.at_css('SupplierOwnCoding')
|
37
21
|
if own_coding.at_css('SupplierCodeType').text == Elibri::ONIX::Dict::Release_3_0::SupplierOwnCodeType::SUPPLIERS_SALES_CLASSIFICATION
|
38
|
-
@additional_trade_information = own_coding.at_css('SupplierCodeValue').text
|
22
|
+
@additional_trade_information = own_coding.at_css('SupplierCodeValue').text
|
39
23
|
end
|
40
24
|
end
|
41
25
|
end
|
42
26
|
|
43
27
|
def quantity_code
|
44
|
-
@quantity_coded
|
28
|
+
@quantity_coded&.code
|
45
29
|
end
|
46
30
|
|
47
31
|
end
|
48
|
-
|
49
32
|
end
|
50
33
|
end
|
51
34
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
1
|
module Elibri
|
4
2
|
module ONIX
|
5
3
|
module Release_3_0
|
@@ -8,27 +6,16 @@ module Elibri
|
|
8
6
|
include ExternalId
|
9
7
|
include ExternalTimestamp
|
10
8
|
include Inspector
|
11
|
-
|
12
|
-
#from ONIX documentation:
|
13
|
-
#An optional and repeatable group of data elements which together describe a supporting resource.
|
14
|
-
|
15
|
-
ATTRIBUTES = [
|
16
|
-
:content_type, :mode, :form, :link, :content_type_name, :mode_name, :form_name
|
17
|
-
]
|
18
|
-
|
19
|
-
RELATIONS = [
|
20
|
-
:inspect_include_fields
|
21
|
-
]
|
22
|
-
|
9
|
+
|
23
10
|
attr_accessor :content_type, :mode, :form, :link, :to_xml, :data
|
24
|
-
|
11
|
+
|
25
12
|
def initialize(data)
|
26
13
|
@data = data
|
27
14
|
@to_xml = data.to_s
|
28
|
-
@content_type = data.at_css('ResourceContentType')
|
29
|
-
@mode = data.at_css('ResourceMode')
|
30
|
-
@form = data.at_css('ResourceVersion').at_css('ResourceForm')
|
31
|
-
@link = data.at_css('ResourceVersion').at_css('ResourceLink')
|
15
|
+
@content_type = data.at_css('ResourceContentType')&.text
|
16
|
+
@mode = data.at_css('ResourceMode')&.text
|
17
|
+
@form = data.at_css('ResourceVersion').at_css('ResourceForm')&.text
|
18
|
+
@link = data.at_css('ResourceVersion').at_css('ResourceLink')&.text
|
32
19
|
set_eid(data)
|
33
20
|
set_datestamp(data)
|
34
21
|
end
|
@@ -41,7 +28,7 @@ module Elibri
|
|
41
28
|
raise ArgumentError, "Cannot find ResourceContentType for #{@content_type}"
|
42
29
|
end
|
43
30
|
end
|
44
|
-
|
31
|
+
|
45
32
|
#def audience_name
|
46
33
|
# Elibri::ONIX::Dict::Release_3_0::ContentAudience.find_by_onix_code(audience).const_name.downcase
|
47
34
|
#end
|
@@ -1,46 +1,31 @@
|
|
1
|
-
|
2
1
|
module Elibri
|
3
2
|
module ONIX
|
4
3
|
module Release_3_0
|
5
|
-
|
6
4
|
class TextContent
|
7
5
|
include ExternalId
|
8
6
|
include ExternalTimestamp
|
9
7
|
include Inspector
|
10
|
-
|
11
|
-
#from ONIX documentation:
|
12
|
-
#An optional and repeatable group of data elements which together carry text related to the product.
|
13
|
-
|
14
|
-
#:nodoc:
|
15
|
-
ATTRIBUTES = [
|
16
|
-
:type, :author, :source_title, :text, :source_url, :type_name
|
17
|
-
]
|
18
|
-
|
19
|
-
#:nodoc:
|
20
|
-
RELATIONS = [
|
21
|
-
:inspect_include_fields
|
22
|
-
]
|
23
|
-
|
8
|
+
|
24
9
|
attr_accessor :type, :author, :source_title, :text, :source_url, :to_xml
|
25
|
-
|
10
|
+
|
26
11
|
def initialize(data)
|
27
12
|
@to_xml = data.to_s
|
28
|
-
@type = data.at_css('TextType')
|
29
|
-
@author = data.at_css('TextAuthor')
|
30
|
-
@source_title = data.at_css('SourceTitle')
|
13
|
+
@type = data.at_css('TextType')&.text
|
14
|
+
@author = data.at_css('TextAuthor')&.text
|
15
|
+
@source_title = data.at_css('SourceTitle')&.text
|
31
16
|
if data.at_css('Text')
|
32
|
-
@text = data.at_css('Text').children.find { |x| x.cdata? }
|
33
|
-
@source_url = data.at_css('Text').attribute('sourcename')
|
17
|
+
@text = data.at_css('Text').children.find { |x| x.cdata? }&.text #cdata => true ?
|
18
|
+
@source_url = data.at_css('Text').attribute('sourcename')&.text
|
34
19
|
end
|
35
20
|
set_eid(data)
|
36
21
|
set_datestamp(data)
|
37
22
|
end
|
38
23
|
|
39
24
|
def type_name
|
40
|
-
Elibri::ONIX::Dict::Release_3_0::OtherTextType.find_by_onix_code(@type)
|
25
|
+
Elibri::ONIX::Dict::Release_3_0::OtherTextType.find_by_onix_code(@type)&.const_name&.downcase
|
41
26
|
end
|
42
27
|
|
43
|
-
|
28
|
+
|
44
29
|
def inspect_include_fields
|
45
30
|
[:type_name, :text]
|
46
31
|
end
|
@@ -1,27 +1,14 @@
|
|
1
|
-
|
2
1
|
module Elibri
|
3
2
|
module ONIX
|
4
3
|
module Release_3_0
|
5
|
-
|
6
|
-
#Kategoria Themy
|
7
4
|
class ThemaSubject
|
8
5
|
|
9
|
-
include HashId
|
10
|
-
|
11
|
-
ATTRIBUTES = [
|
12
|
-
:code, :heading_text
|
13
|
-
]
|
14
|
-
|
15
|
-
RELATIONS = [
|
16
|
-
:inspect_include_fields
|
17
|
-
]
|
18
|
-
|
19
6
|
attr_accessor :code, :heading_text, :to_xml
|
20
7
|
|
21
8
|
def initialize(data)
|
22
9
|
@to_xml = data.to_s
|
23
|
-
@code = data.at_css('SubjectCode')
|
24
|
-
@heading_text = data.at_css('SubjectHeadingText')
|
10
|
+
@code = data.at_css('SubjectCode')&.text
|
11
|
+
@heading_text = data.at_css('SubjectHeadingText')&.text
|
25
12
|
end
|
26
13
|
|
27
14
|
def inspect_include_fields
|
@@ -1,32 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
1
|
module Elibri
|
4
2
|
module ONIX
|
5
3
|
module Release_3_0
|
6
|
-
|
7
4
|
class TitleDetail
|
8
|
-
|
9
|
-
#from ONIX documentation:
|
10
|
-
#A repeatable group of data elements which together give the text of a collection title and specify its type.
|
11
|
-
#Optional, but the composite is required unless the collection title is carried in full, and word-for- word,
|
12
|
-
#as an integral part of the product title in P.6, in which case it should not be repeated in P.5.
|
13
|
-
|
14
|
-
include HashId
|
15
|
-
|
16
|
-
ATTRIBUTES = [
|
17
|
-
:type, :type_name, :full_title, :product_level_title, :product_level, :collection_level_title,
|
18
|
-
:collection_level
|
19
|
-
]
|
20
|
-
|
21
|
-
RELATIONS = [
|
22
|
-
:elements, :inspect_include_fields
|
23
|
-
]
|
24
|
-
|
5
|
+
|
25
6
|
attr_accessor :type, :elements, :to_xml
|
26
|
-
|
7
|
+
|
27
8
|
def initialize(data)
|
28
9
|
@to_xml = data.to_s
|
29
|
-
@type = data.at_css('TitleType')
|
10
|
+
@type = data.at_css('TitleType')&.text
|
30
11
|
@elements = data.css('TitleElement').map { |element_data| TitleElement.new(element_data) }
|
31
12
|
end
|
32
13
|
|
@@ -40,16 +21,16 @@ module Elibri
|
|
40
21
|
|
41
22
|
def full_title
|
42
23
|
String.new.tap do |_full_title|
|
43
|
-
_full_title << collection_level_title if collection_level_title.
|
44
|
-
if product_level_title.
|
45
|
-
_full_title << ". " if _full_title.
|
46
|
-
_full_title << product_level_title
|
24
|
+
_full_title << collection_level_title if collection_level_title && collection_level_title.size > 0
|
25
|
+
if product_level_title && product_level_title.size > 0
|
26
|
+
_full_title << ". " if _full_title && _full_title.size > 0
|
27
|
+
_full_title << product_level_title
|
47
28
|
end
|
48
29
|
end
|
49
30
|
end
|
50
31
|
|
51
32
|
def product_level_title
|
52
|
-
product_level
|
33
|
+
product_level&.full_title
|
53
34
|
end
|
54
35
|
|
55
36
|
def product_level
|
@@ -57,7 +38,7 @@ module Elibri
|
|
57
38
|
end
|
58
39
|
|
59
40
|
def collection_level_title
|
60
|
-
collection_level
|
41
|
+
collection_level&.full_title
|
61
42
|
end
|
62
43
|
|
63
44
|
def collection_level
|
@@ -1,60 +1,35 @@
|
|
1
|
-
|
2
1
|
module Elibri
|
3
2
|
module ONIX
|
4
3
|
module Release_3_0
|
5
|
-
|
6
4
|
class TitleElement
|
7
|
-
|
8
|
-
#from ONIX documentation:
|
9
|
-
#A repeatable group of data elements which together represent an element of a collection title.
|
10
|
-
#At least one title element is mandatory in each occurrence of the <TitleDetail> composite.
|
11
|
-
#An instance of the <TitleElement> composite must include at least one of: <PartNumber>; <YearOfAnnual>; <TitleText>, or <TitlePrefix> together
|
12
|
-
#with <TitleWithoutPrefix>. In other words it must carry either the text of a title element or a part or year designation; and it may carry both.
|
13
|
-
#A title element must be designated as belonging to product level, collection level, or subcollection level
|
14
|
-
#(the first of these may not occur in a title element representing a collective identity, and the last-named may only occur
|
15
|
-
#in the case of a multi-level collection).
|
16
|
-
#In the simplest case, title detail sent in a <Collection> composite will consist of a single title element, at collection level.
|
17
|
-
#However, the composite structure in ONIX 3.0 allows more complex combinations of titles and part designations in multi-level
|
18
|
-
#collections to be correctly represented.
|
19
|
-
|
20
|
-
|
21
|
-
include HashId
|
22
5
|
|
23
|
-
ATTRIBUTES = [
|
24
|
-
:level, :part_number, :title, :subtitle, :full_title
|
25
|
-
]
|
26
|
-
|
27
|
-
RELATIONS = []
|
28
|
-
|
29
6
|
attr_accessor :level, :part_number, :title, :subtitle, :to_xml
|
30
|
-
|
7
|
+
|
31
8
|
def initialize(data)
|
32
9
|
@to_xml = data.to_s
|
33
|
-
@level = data.at_css('TitleElementLevel')
|
34
|
-
@part_number = data.at_css('PartNumber')
|
35
|
-
@title = data.at_css('TitleText')
|
36
|
-
@subtitle = data.at_css('Subtitle')
|
10
|
+
@level = data.at_css('TitleElementLevel')&.text
|
11
|
+
@part_number = data.at_css('PartNumber')&.text
|
12
|
+
@title = data.at_css('TitleText')&.text
|
13
|
+
@subtitle = data.at_css('Subtitle')&.text
|
37
14
|
end
|
38
15
|
|
39
16
|
def full_title
|
40
17
|
String.new(self.title.to_s.strip).tap do |_full_title|
|
41
18
|
if _full_title =~ /[\.!\?]$/ #czy kończy się ?!.
|
42
|
-
_full_title << " " + self.subtitle if self.subtitle.
|
19
|
+
_full_title << " " + self.subtitle if self.subtitle && self.subtitle.size > 0
|
43
20
|
else
|
44
|
-
_full_title << ". " + self.subtitle if self.subtitle.
|
21
|
+
_full_title << ". " + self.subtitle if self.subtitle && self.subtitle.size > 0
|
45
22
|
end
|
46
|
-
if self.part_number.
|
23
|
+
if self.part_number && self.part_number.size > 0
|
47
24
|
if self.part_number.to_i.to_s == self.part_number
|
48
|
-
_full_title << " (##{self.part_number})"
|
25
|
+
_full_title << " (##{self.part_number})"
|
49
26
|
else
|
50
27
|
_full_title << " (#{self.part_number})"
|
51
|
-
end
|
28
|
+
end
|
52
29
|
end
|
53
30
|
end
|
54
31
|
end
|
55
|
-
|
56
32
|
end
|
57
|
-
|
58
33
|
end
|
59
34
|
end
|
60
35
|
end
|
data/lib/elibri_onix/releases.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
sender header product_identifier measure title_element title_detail collection contributor
|
5
5
|
language extent audience_range text_content supporting_resource imprint publisher publishing_date
|
6
6
|
sales_restriction related_product supplier_identifier stock_quantity_coded price supplier supply_detail
|
7
|
-
product onix_message excerpt_info file_info thema_subject publisher_subject
|
7
|
+
product onix_message excerpt_info file_info thema_subject publisher_subject price_identifier price_constraint_limit
|
8
8
|
}.each do |file_name|
|
9
9
|
require File.join(File.dirname(__FILE__), "onix_3_0", file_name)
|
10
|
-
end
|
10
|
+
end
|
data/lib/elibri_onix/version.rb
CHANGED
data/lib/elibri_onix.rb
CHANGED
@@ -1,16 +1,12 @@
|
|
1
|
-
|
2
|
-
require 'bigdecimal'
|
1
|
+
require 'i18n'
|
3
2
|
require 'date'
|
4
|
-
|
5
|
-
require 'thread'
|
6
|
-
require 'active_support'
|
7
|
-
require 'active_support/core_ext'
|
3
|
+
require 'bigdecimal'
|
8
4
|
require 'nokogiri'
|
9
5
|
require 'elibri_onix/version'
|
10
6
|
require 'elibri_onix/inspector'
|
11
7
|
require 'elibri_onix/external_id'
|
12
|
-
require 'elibri_onix/hash_id'
|
13
8
|
require 'elibri_onix/external_timestamp'
|
9
|
+
require 'elibri_onix/timestamp_parser'
|
14
10
|
require 'elibri_onix/releases'
|
15
11
|
require 'elibri_onix_dict'
|
16
12
|
|
@@ -18,7 +14,7 @@ require 'elibri_onix_dict'
|
|
18
14
|
module Elibri
|
19
15
|
module ONIX
|
20
16
|
module Release_3_0; end
|
21
|
-
|
17
|
+
|
22
18
|
end
|
23
19
|
end
|
24
20
|
|
@@ -12,7 +12,7 @@ describe Elibri::ONIX::Release_3_0::ONIXMessage do
|
|
12
12
|
assert_equal 2589928, e.file_size
|
13
13
|
assert_equal "0bf20c528f323dd2a6d91627ccddf52e", e.md5
|
14
14
|
assert_equal "mp3_excerpt", e.file_type
|
15
|
-
assert_equal Time.
|
15
|
+
assert_equal Time.new(2019, 7, 12, 21, 58), e.updated_at
|
16
16
|
assert_equal "https://www.elibri.com.pl/excerpt/109048/0bf20c528f323dd2a6d91627ccddf52e/kwiaty-dla-algernona-fragment.mp3", e.link
|
17
17
|
assert_equal 109048, e.eid
|
18
18
|
|
@@ -15,17 +15,17 @@ describe Elibri::ONIX::Release_3_0::ONIXMessage do
|
|
15
15
|
assert_equal "contributorid:255", cont1.id_before_type_cast
|
16
16
|
assert_equal 255, cont1.eid
|
17
17
|
assert_equal "20111104T0905", cont1.datestamp_before_type_cast
|
18
|
-
assert_equal
|
18
|
+
assert_equal Time.new(2011, 11, 04, 9, 5), cont1.datestamp
|
19
19
|
|
20
20
|
assert_equal "author", cont1.role_name
|
21
21
|
assert_equal "Św. Tomasz z Akwinu", cont1.person_name
|
22
22
|
assert_equal ["Św. Tomasz z Akwinu"], product.authors
|
23
|
-
assert cont1.biographical_note.
|
23
|
+
assert cont1.biographical_note && cont1.biographical_note.size > 0
|
24
24
|
|
25
25
|
assert_equal "translator", cont2.role_name
|
26
26
|
assert_equal "prof. ks. Henryk von Hausswolff OP", cont2.person_name
|
27
27
|
assert_equal ["prof. ks. Henryk von Hausswolff OP"], product.translators
|
28
|
-
|
28
|
+
|
29
29
|
product = load_fixture("onix_no_contributors_example.xml")
|
30
30
|
assert product.no_contributor?
|
31
31
|
assert !product.unnamed_persons?
|
@@ -11,7 +11,7 @@ describe Elibri::ONIX::Release_3_0::ONIXMessage do
|
|
11
11
|
assert_equal 2100230, e.file_size
|
12
12
|
assert_equal "4b145ff46636b06f49225abdab70927f", e.md5
|
13
13
|
assert_equal "epub_excerpt", e.file_type
|
14
|
-
assert_equal Time.
|
14
|
+
assert_equal Time.new(2012, 12, 30, 15, 18), e.updated_at
|
15
15
|
assert_equal "https://www.elibri.com.pl/excerpt/767/4b145ff46636b06f49225abdab70927f/fragment.epub", e.link
|
16
16
|
assert_equal 767, e.eid
|
17
17
|
|
@@ -20,7 +20,7 @@ describe Elibri::ONIX::Release_3_0::ONIXMessage do
|
|
20
20
|
assert_equal 4197382, f.file_size
|
21
21
|
assert_equal "e9353ce40eaa677f8c5d666c2f8bbb3f", f.md5
|
22
22
|
assert_equal "epub", f.file_type
|
23
|
-
assert_equal Time.
|
23
|
+
assert_equal Time.new(2012, 12, 30, 15, 18), f.updated_at
|
24
24
|
assert_equal 765, f.eid
|
25
25
|
end
|
26
26
|
|
@@ -3,18 +3,6 @@ require 'helper'
|
|
3
3
|
|
4
4
|
describe Elibri::ONIX::Release_3_0::ONIXMessage do
|
5
5
|
|
6
|
-
it "should be able to parse elibri extensions" do
|
7
|
-
product = load_fixture("onix_elibri_extensions_example.xml")
|
8
|
-
|
9
|
-
assert_equal "miękka", product.cover_type
|
10
|
-
assert_equal 12.99, product.cover_price
|
11
|
-
assert_equal 5, product.vat
|
12
|
-
assert_equal "58.11.1", product.pkwiu
|
13
|
-
assert_equal "VIC", product.pdw_exclusiveness
|
14
|
-
assert product.preview_exists?
|
15
|
-
assert_equal "PROMOCJA!", product.additional_info
|
16
|
-
end
|
17
|
-
|
18
6
|
it "should be able to parse the info without the propertiary extensions" do
|
19
7
|
product = load_fixture("onix_removed_elibri_extensions.xml")
|
20
8
|
assert_equal 12.99, product.cover_price
|
@@ -18,7 +18,7 @@ describe Elibri::ONIX::Release_3_0::ONIXMessage do
|
|
18
18
|
assert_equal "author", cont1.role_name
|
19
19
|
assert_nil cont1.person_name
|
20
20
|
assert_equal ["praca zbiorowa"], product.authors
|
21
|
-
|
21
|
+
assert_nil cont1.biographical_note
|
22
22
|
|
23
23
|
end
|
24
24
|
|
@@ -16,11 +16,6 @@ describe Elibri::ONIX::Release_3_0::ONIXMessage do
|
|
16
16
|
|
17
17
|
product = onix.products.first
|
18
18
|
|
19
|
-
assert_equal 'miękka', product.cover_type
|
20
|
-
assert_equal 12.99, product.cover_price
|
21
|
-
assert_equal 5, product.vat
|
22
|
-
assert_equal '58.11.1', product.pkwiu
|
23
|
-
|
24
19
|
assert_equal 'fdb8fa072be774d97a97', product.record_reference
|
25
20
|
assert_equal '03', product.notification_type
|
26
21
|
assert_equal "Record had many errors", product.deletion_text
|
@@ -134,7 +129,7 @@ describe Elibri::ONIX::Release_3_0::ONIXMessage do
|
|
134
129
|
assert_equal 1000, supply_detail.on_hand
|
135
130
|
assert_equal 7, supply_detail.pack_quantity
|
136
131
|
|
137
|
-
supply_detail.
|
132
|
+
supply_detail.prices[0].tap do |price|
|
138
133
|
assert_equal "02", price.type
|
139
134
|
assert_equal 20, price.minimum_order_quantity
|
140
135
|
assert_equal 12.99, price.amount
|
@@ -4,11 +4,11 @@ describe Elibri::ONIX::Release_3_0::ONIXMessage do
|
|
4
4
|
|
5
5
|
it "should be able to parse record identifiers" do
|
6
6
|
product = load_fixture("onix_record_identifiers_example.xml")
|
7
|
-
|
7
|
+
|
8
8
|
assert_equal "fdb8fa072be774d97a97", product.record_reference
|
9
9
|
assert_equal '9788324799992', product.isbn13
|
10
10
|
assert_equal '9788324788882', product.ean
|
11
|
-
assert_equal '
|
11
|
+
assert_equal '9788324799992', product.hyphenated_isbn
|
12
12
|
|
13
13
|
assert_equal({"Olesiejuk" => "355006"}, product.proprietary_identifiers)
|
14
14
|
|
@@ -5,7 +5,7 @@ describe Elibri::ONIX::Release_3_0::ONIXMessage do
|
|
5
5
|
it "should be able to parse information about sales restrictions" do
|
6
6
|
product = load_fixture("onix_sale_restrictions_example.xml")
|
7
7
|
assert product.sales_restrictions?
|
8
|
-
assert_equal
|
8
|
+
assert_equal Date.new(2012, 7, 22), product.sales_restrictions[0].end_date
|
9
9
|
end
|
10
10
|
|
11
11
|
end
|