elibri_onix 0.5.19 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 +62 -127
- 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_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,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module Elibri
|
3
2
|
module ONIX
|
4
3
|
module Release_3_0
|
@@ -8,41 +7,11 @@ module Elibri
|
|
8
7
|
|
9
8
|
include Inspector
|
10
9
|
|
11
|
-
#:nodoc:
|
12
|
-
ATTRIBUTES =
|
13
|
-
[
|
14
|
-
:height, :width, :thickness, :weight, :ean, :isbn13, :number_of_pages, :duration,
|
15
|
-
:file_size, :publisher_name, :publisher_id, :imprint_name, :current_state, :reading_age_from, :reading_age_to,
|
16
|
-
:table_of_contents, :description, :reviews, :excerpts, :series, :title, :subtitle, :collection_title,
|
17
|
-
:collection_part, :full_title, :original_title, :trade_title, :parsed_publishing_date, :record_reference,
|
18
|
-
:deletion_text, :cover_type, :cover_price, :vat, :pkwiu, :additional_info, :product_composition,
|
19
|
-
:publisher, :product_form, :no_contributor, :edition_statement, :edition_type_onix_code, :number_of_illustrations, :publishing_status,
|
20
|
-
:publishing_date, :premiere, :front_cover, :series_names, :city_of_publication,
|
21
|
-
:preview_exists, :short_description, :sale_restricted_to_poland,
|
22
|
-
:technical_protection_onix_code, :unlimited_licence, :hyphenated_isbn, :preorder_embargo_date, :additional_trade_information,
|
23
|
-
:number_of_pieces, :players_number_from, :players_number_to, :playing_time_from, :playing_time_to
|
24
|
-
|
25
|
-
]
|
26
|
-
|
27
|
-
#:nodoc:
|
28
|
-
RELATIONS =
|
29
|
-
[
|
30
|
-
:contributors, #IMPORTANT
|
31
|
-
:related_products, :languages, :measures, :supply_details, :measures, :title_details,
|
32
|
-
:collections, :extents, :thema_subjects, :publisher_subjects, :audience_ranges,
|
33
|
-
:text_contents, #IMPORTANT
|
34
|
-
:supporting_resources, #for example: cover
|
35
|
-
:sales_restrictions, :authors,
|
36
|
-
:ghostwriters, :scenarists, :originators, :illustrators, :photographers, :author_of_prefaces, :drawers,
|
37
|
-
:cover_designers, :inked_or_colored_bys, :editors, :revisors, :translators, :editor_in_chiefs, :read_bys
|
38
|
-
]
|
39
|
-
|
40
10
|
def inspect_include_fields
|
41
11
|
[:record_reference, :full_title, :front_cover, :publisher, :isbn13, :ean, :premiere, :contributors, :languages, :description, :product_form_name,
|
42
12
|
:technical_protection, :digital_formats]
|
43
13
|
end
|
44
14
|
|
45
|
-
|
46
15
|
#:doc:
|
47
16
|
#wysokość w milimetrach
|
48
17
|
attr_reader :height
|
@@ -264,20 +233,11 @@ module Elibri
|
|
264
233
|
##publishing_details
|
265
234
|
@sales_restrictions = []
|
266
235
|
@excerpt_infos = []
|
267
|
-
@cover_type = nil
|
268
236
|
#moving to parsing attributes
|
269
237
|
|
270
|
-
@record_reference = data.at_css('RecordReference')
|
271
|
-
@notification_type = data.at_css('NotificationType')
|
272
|
-
@deletion_text = data.at_css('DeletionText')
|
273
|
-
|
274
|
-
if data.namespaces.values.any? { |uri| uri =~ /elibri/ }
|
275
|
-
@cover_type = data.at_xpath('elibri:CoverType').try(:text)
|
276
|
-
@pkwiu = data.at_xpath('elibri:PKWiU').try(:text)
|
277
|
-
@hyphenated_isbn = data.at_xpath('elibri:HyphenatedISBN').try(:text)
|
278
|
-
@pdw_exclusiveness = data.at_xpath('elibri:PDWExclusiveness').try(:text)
|
279
|
-
@additional_info = data.at_xpath('elibri:AdditionalInfo').try(:text)
|
280
|
-
end
|
238
|
+
@record_reference = data.at_css('RecordReference')&.text
|
239
|
+
@notification_type = data.at_css('NotificationType')&.text
|
240
|
+
@deletion_text = data.at_css('DeletionText')&.text
|
281
241
|
|
282
242
|
@identifiers = data.children.find_all { |node| node.name == 'ProductIdentifier' }.map { |ident_data| ProductIdentifier.new(ident_data) }
|
283
243
|
begin
|
@@ -285,71 +245,49 @@ module Elibri
|
|
285
245
|
rescue
|
286
246
|
@related_products = []
|
287
247
|
end
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
@
|
296
|
-
@vat = data.at_xpath('elibri:Vat').try(:text).try(:to_i)
|
297
|
-
else
|
298
|
-
#00 - Supplier role - Unspecified
|
299
|
-
price_sd = @supply_details.find { |sd| sd.supplier && ["00", Elibri::ONIX::Dict::Release_3_0::SupplierRole::PUB_TO_RET].include?(sd.supplier.role) }
|
300
|
-
if price_sd && price_sd.price && price_sd.price && price_sd.price.type == Elibri::ONIX::Dict::Release_3_0::PriceTypeCode::RRP_WITH_TAX
|
301
|
-
@vat = price_sd.price.tax_rate_percent.to_i
|
302
|
-
@cover_price = price_sd.price.amount
|
303
|
-
@additional_trade_information = price_sd.additional_trade_information
|
304
|
-
end
|
248
|
+
@supply_details = data.css('SupplyDetail').map { |supply_data| SupplyDetail.new(supply_data) }
|
249
|
+
|
250
|
+
#00 - Supplier role - Unspecified
|
251
|
+
price_sd = @supply_details.find { |sd| sd.supplier && ["00", Elibri::ONIX::Dict::Release_3_0::SupplierRole::PUB_TO_RET].include?(sd.supplier.role) }
|
252
|
+
if price_sd && price_sd.prices[0] && price_sd.prices[0].type == Elibri::ONIX::Dict::Release_3_0::PriceTypeCode::RRP_WITH_TAX
|
253
|
+
@vat = price_sd.prices[0].tax_rate_percent.to_i
|
254
|
+
@cover_price = price_sd.prices[0].amount
|
255
|
+
@additional_trade_information = price_sd.additional_trade_information
|
305
256
|
end
|
306
257
|
|
307
258
|
descriptive_details_setup(data.at_css('DescriptiveDetail')) if data.at_css('DescriptiveDetail')
|
308
259
|
collateral_details_setup(data.at_css('CollateralDetail')) if data.at_css('CollateralDetail')
|
309
260
|
|
310
|
-
|
311
|
-
@preview_exists = (data.at_xpath('elibri:preview_exists').text == "true")
|
312
|
-
else
|
313
|
-
@preview_exists = @supporting_resources.find { |sr| sr.content_type_name == "widget" && sr.link =~ /p.elibri.com.pl/ }.present?
|
314
|
-
end
|
261
|
+
@preview_exists = !!@supporting_resources.find { |sr| sr.content_type_name == "widget" && sr.link =~ /p.elibri.com.pl/ }
|
315
262
|
|
316
263
|
product_form_features_setup(data.css("ProductFormFeature"))
|
317
264
|
|
318
265
|
publishing_details_setup(data.at_css('PublishingDetail')) if data.at_css('PublishingDetail')
|
319
266
|
licence_information_setup(data)
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
demo = @supporting_resources.find { |sr| sr.content_type_name == "sample_content" }
|
324
|
-
if demo
|
325
|
-
@excerpt_infos = demo.data.css("ResourceVersion").map { |node| ExcerptInfo.new(node) }
|
326
|
-
end
|
327
|
-
|
267
|
+
demo = @supporting_resources.find { |sr| sr.content_type_name == "sample_content" }
|
268
|
+
if demo
|
269
|
+
@excerpt_infos = demo.data.css("ResourceVersion").map { |node| ExcerptInfo.new(node) }
|
328
270
|
end
|
271
|
+
|
329
272
|
@file_infos = data.css("BodyResource").map { |node| FileInfo.new(node) }
|
330
273
|
after_parse
|
331
274
|
end
|
332
275
|
|
276
|
+
def cover_type
|
277
|
+
if @product_form && @product_form =~ /^B/ &&
|
278
|
+
Elibri::ONIX::Dict::CoverType.determine_cover_type(@product_form, data.at_css('ProductFormDetail')&.text)
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
333
282
|
def licence_information_setup(data)
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
@licence_limited_to = _parse_date(date)
|
341
|
-
end
|
283
|
+
daten = data.css('PublishingDate').find { |d| d.at_css("PublishingDateRole") && d.at_css("PublishingDateRole").text == Elibri::ONIX::Dict::Release_3_0::PublishingDateRole::OUT_OF_PRINT_DATE }
|
284
|
+
if daten
|
285
|
+
date = daten.at_css('Date').text
|
286
|
+
@licence_limited_to_before_type_cast = date
|
287
|
+
@licence_limited_to = _parse_date(date)
|
288
|
+
@unlimited_licence = false
|
342
289
|
else
|
343
|
-
|
344
|
-
if daten
|
345
|
-
date = daten.at_css('Date').text
|
346
|
-
@licence_limited_to_before_type_cast = date
|
347
|
-
@licence_limited_to = _parse_date(date)
|
348
|
-
@unlimited_licence = false
|
349
|
-
else
|
350
|
-
@unlimited_licence = true
|
351
|
-
end
|
352
|
-
|
290
|
+
@unlimited_licence = true
|
353
291
|
end
|
354
292
|
end
|
355
293
|
|
@@ -371,23 +309,20 @@ module Elibri
|
|
371
309
|
end
|
372
310
|
|
373
311
|
def descriptive_details_setup(data)
|
374
|
-
@country_of_manufacture = data.at_css("CountryOfManufacture")
|
312
|
+
@country_of_manufacture = data.at_css("CountryOfManufacture")&.text
|
375
313
|
|
376
|
-
@product_composition = data.at_css('ProductComposition')
|
377
|
-
@product_form = data.at_css('ProductForm')
|
314
|
+
@product_composition = data.at_css('ProductComposition')&.text
|
315
|
+
@product_form = data.at_css('ProductForm')&.text
|
378
316
|
if @product_form
|
379
|
-
if @product_form.starts_with?("B") && !@cover_type
|
380
|
-
@cover_type = Elibri::ONIX::Dict::CoverType.determine_cover_type(@product_form, data.at_css('ProductFormDetail').try(:text))
|
381
|
-
end
|
382
317
|
if Elibri::ONIX::Dict::Release_3_0::ProductFormCode::find_by_onix_code(@product_form)
|
383
318
|
@product_form_name = Elibri::ONIX::Dict::Release_3_0::ProductFormCode::find_by_onix_code(@product_form).name(:en).downcase
|
384
319
|
end
|
385
320
|
|
386
|
-
simplified_product_form = @product_form
|
387
|
-
if Elibri::ONIX::Dict::Release_3_0::ProductFormCode::find_by_onix_code(simplified_product_form)
|
321
|
+
simplified_product_form = @product_form =~ /^B/ ? "BA" : @product_form
|
322
|
+
if Elibri::ONIX::Dict::Release_3_0::ProductFormCode::find_by_onix_code(simplified_product_form)&.digital?
|
388
323
|
@digital_formats = []
|
389
324
|
data.css("ProductFormDetail").each do |format|
|
390
|
-
format_name = Elibri::ONIX::Dict::Release_3_0::ProductFormDetail::find_by_onix_code(format.text)
|
325
|
+
format_name = Elibri::ONIX::Dict::Release_3_0::ProductFormDetail::find_by_onix_code(format.text)&.name
|
391
326
|
@digital_formats << format_name.upcase.gsub("MOBIPOCKET", "MOBI") if format_name
|
392
327
|
end
|
393
328
|
end
|
@@ -411,23 +346,23 @@ module Elibri
|
|
411
346
|
@extents = data.css('Extent').map { |extent_data| Extent.new(extent_data) }
|
412
347
|
|
413
348
|
@publisher_subjects = data.css('Subject').find_all { |sd|
|
414
|
-
%w{24}.include?(sd.at_css('SubjectSchemeIdentifier')
|
349
|
+
%w{24}.include?(sd.at_css('SubjectSchemeIdentifier')&.text) }.map { |sd| PublisherSubject.new(sd) }
|
415
350
|
@thema_subjects = data.css('Subject').find_all { |sd|
|
416
|
-
%w{93 94 95 96 97 98 99}.include?(sd.at_css('SubjectSchemeIdentifier')
|
351
|
+
%w{93 94 95 96 97 98 99}.include?(sd.at_css('SubjectSchemeIdentifier')&.text) }.map { |sd| ThemaSubject.new(sd) }
|
417
352
|
@audience_ranges = data.css('AudienceRange').map { |audience_data| AudienceRange.new(audience_data) }
|
418
353
|
|
419
354
|
#zabezpiecznie pliku
|
420
|
-
if protection = data.at_css("EpubTechnicalProtection")
|
421
|
-
@technical_protection = Elibri::ONIX::Dict::Release_3_0::EpubTechnicalProtection::find_by_onix_code(protection)
|
355
|
+
if protection = data.at_css("EpubTechnicalProtection")&.text
|
356
|
+
@technical_protection = Elibri::ONIX::Dict::Release_3_0::EpubTechnicalProtection::find_by_onix_code(protection)&.name
|
422
357
|
@technical_protection_onix_code = protection
|
423
358
|
end
|
424
359
|
|
425
|
-
@edition_statement = data.at_css('EditionStatement')
|
426
|
-
if Elibri::ONIX::Dict::Release_3_0::EditionType.find_by_onix_code(data.at_css('EditionType')
|
427
|
-
@edition_type_onix_code = data.at_css('EditionType')
|
360
|
+
@edition_statement = data.at_css('EditionStatement')&.text
|
361
|
+
if Elibri::ONIX::Dict::Release_3_0::EditionType.find_by_onix_code(data.at_css('EditionType')&.text)
|
362
|
+
@edition_type_onix_code = data.at_css('EditionType')&.text
|
428
363
|
end
|
429
364
|
|
430
|
-
@number_of_illustrations = data.at_css('NumberOfIllustrations')
|
365
|
+
@number_of_illustrations = data.at_css('NumberOfIllustrations')&.text&.to_i
|
431
366
|
end
|
432
367
|
|
433
368
|
def collateral_details_setup(data)
|
@@ -438,8 +373,8 @@ module Elibri
|
|
438
373
|
def publishing_details_setup(data)
|
439
374
|
@imprint = Imprint.new(data.at_css('Imprint')) if data.at_css('Imprint')
|
440
375
|
@publisher = Publisher.new(data.at_css('Publisher')) if data.at_css('Publisher')
|
441
|
-
@publishing_status = data.at_css('PublishingStatus')
|
442
|
-
@city_of_publication = data.at_css("CityOfPublication")
|
376
|
+
@publishing_status = data.at_css('PublishingStatus')&.text
|
377
|
+
@city_of_publication = data.at_css("CityOfPublication")&.text
|
443
378
|
publication_dates = data.css('PublishingDate').map do |node|
|
444
379
|
PublishingDate.new(node)
|
445
380
|
end
|
@@ -449,7 +384,7 @@ module Elibri
|
|
449
384
|
|
450
385
|
@sales_restrictions = data.css('SalesRestriction').map { |restriction_data| SalesRestriction.new(restriction_data) }
|
451
386
|
#ograniczenia terytorialne
|
452
|
-
if data.at_css("CountriesIncluded")
|
387
|
+
if data.at_css("CountriesIncluded")&.text == "PL"
|
453
388
|
@sale_restricted_to_poland = true
|
454
389
|
else
|
455
390
|
@sale_restricted_to_poland = false
|
@@ -483,7 +418,7 @@ module Elibri
|
|
483
418
|
|
484
419
|
#flaga, czy książka to praca zbiorowa?
|
485
420
|
def unnamed_persons?
|
486
|
-
@contributors.size == 1 && contributors[0].unnamed_persons
|
421
|
+
@contributors.size == 1 && contributors[0].unnamed_persons
|
487
422
|
end
|
488
423
|
|
489
424
|
#flaga, czy istnieje podgląd produktu
|
@@ -553,21 +488,21 @@ module Elibri
|
|
553
488
|
|
554
489
|
def after_parse
|
555
490
|
%w{height width thickness weight}.each do |mn|
|
556
|
-
instance_variable_set("@#{mn}", measures.find { |m| m.type_name == mn }
|
491
|
+
instance_variable_set("@#{mn}", measures.find { |m| m.type_name == mn }&.measurement)
|
557
492
|
end
|
558
493
|
|
559
|
-
@ean = @identifiers.find { |identifier| identifier.identifier_type == "ean" }
|
494
|
+
@ean = @identifiers.find { |identifier| identifier.identifier_type == "ean" }&.value
|
560
495
|
|
561
|
-
@number_of_pages = @extents.find {|extent| extent.type_name == "page_count" }
|
562
|
-
@duration = @extents.find {|extent| extent.type_name == "duration" }
|
563
|
-
@file_size = @extents.find {|extent| extent.type_name == "file_size" }
|
496
|
+
@number_of_pages = @extents.find {|extent| extent.type_name == "page_count" }&.value
|
497
|
+
@duration = @extents.find {|extent| extent.type_name == "duration" }&.value
|
498
|
+
@file_size = @extents.find {|extent| extent.type_name == "file_size" }&.value
|
564
499
|
@publisher_name = @publisher.name if publisher
|
565
500
|
@publisher_id = @publisher.eid if publisher
|
566
501
|
@imprint_name = @imprint.name if imprint
|
567
|
-
@isbn13 = @identifiers.find { |identifier| identifier.identifier_type == "isbn13" }
|
502
|
+
@isbn13 = @identifiers.find { |identifier| identifier.identifier_type == "isbn13" }&.value
|
568
503
|
@hyphenated_isbn ||= @isbn13
|
569
|
-
@reading_age_from = @audience_ranges.find {|ar| (ar.qualifier == "18") && (ar.precision == "03")}
|
570
|
-
@reading_age_to = @audience_ranges.find {|ar| (ar.qualifier == "18") && (ar.precision == "04")}
|
504
|
+
@reading_age_from = @audience_ranges.find {|ar| (ar.qualifier == "18") && (ar.precision == "03")}&.value&.to_i
|
505
|
+
@reading_age_to = @audience_ranges.find {|ar| (ar.qualifier == "18") && (ar.precision == "04")}&.value&.to_i
|
571
506
|
@table_of_contents = @text_contents.find { |t| t.type_name == "table_of_contents" }
|
572
507
|
@description = @text_contents.find { |t| t.type_name == "main_description" }
|
573
508
|
@short_description = @text_contents.find { |t| t.type_name == "short_description" }
|
@@ -576,14 +511,14 @@ module Elibri
|
|
576
511
|
@series = @collections.map { |c| [c.title_detail.elements[0].title, c.title_detail.elements[0].part_number] }
|
577
512
|
distinctive_title = find_title(Elibri::ONIX::Dict::Release_3_0::TitleType::DISTINCTIVE_TITLE)
|
578
513
|
if distinctive_title
|
579
|
-
@title = distinctive_title.product_level
|
580
|
-
@subtitle = distinctive_title.product_level
|
581
|
-
@collection_title = distinctive_title.collection_level
|
582
|
-
@collection_part = distinctive_title.collection_level
|
514
|
+
@title = distinctive_title.product_level&.title
|
515
|
+
@subtitle = distinctive_title.product_level&.subtitle
|
516
|
+
@collection_title = distinctive_title.collection_level&.title
|
517
|
+
@collection_part = distinctive_title.collection_level&.part_number
|
583
518
|
end
|
584
|
-
@full_title = find_title(Elibri::ONIX::Dict::Release_3_0::TitleType::DISTINCTIVE_TITLE)
|
585
|
-
@original_title = find_title(Elibri::ONIX::Dict::Release_3_0::TitleType::ORIGINAL_TITLE)
|
586
|
-
@trade_title = find_title(Elibri::ONIX::Dict::Release_3_0::TitleType::DISTRIBUTORS_TITLE)
|
519
|
+
@full_title = find_title(Elibri::ONIX::Dict::Release_3_0::TitleType::DISTINCTIVE_TITLE)&.full_title
|
520
|
+
@original_title = find_title(Elibri::ONIX::Dict::Release_3_0::TitleType::ORIGINAL_TITLE)&.full_title
|
521
|
+
@trade_title = find_title(Elibri::ONIX::Dict::Release_3_0::TitleType::DISTRIBUTORS_TITLE)&.full_title
|
587
522
|
|
588
523
|
compute_state!
|
589
524
|
end
|
@@ -1,45 +1,30 @@
|
|
1
|
-
|
2
1
|
module Elibri
|
3
2
|
module ONIX
|
4
3
|
module Release_3_0
|
5
|
-
|
6
|
-
#product identifier, for example isbn
|
7
4
|
class ProductIdentifier
|
8
|
-
|
9
|
-
include HashId
|
10
5
|
|
11
6
|
#onix code of type (see elibri_onix_dict, Elibri::ONIX::Dict::Release_3_0::ProductIDType)
|
12
7
|
attr_accessor :type
|
13
8
|
|
14
9
|
#if type is prioprietery (01) - then the name of type
|
15
10
|
attr_accessor :type_name
|
16
|
-
|
11
|
+
|
17
12
|
#identifier value
|
18
13
|
attr_accessor :value
|
19
14
|
|
20
15
|
#xml representation of identifier
|
21
16
|
attr_accessor :to_xml
|
22
|
-
|
23
|
-
#:nodoc:
|
24
|
-
ATTRIBUTES = [
|
25
|
-
:type, :type_name, :value, :identifier_type
|
26
|
-
]
|
27
|
-
|
28
|
-
#:nodoc:
|
29
|
-
RELATIONS = [
|
30
|
-
:inspect_include_fields
|
31
|
-
]
|
32
|
-
|
17
|
+
|
33
18
|
def initialize(data)
|
34
19
|
@to_xml = data.to_s
|
35
|
-
@type = data.at_css('ProductIDType')
|
36
|
-
@type_name = data.at_css('IDTypeName')
|
37
|
-
@value = data.at_css('IDValue')
|
20
|
+
@type = data.at_css('ProductIDType')&.text
|
21
|
+
@type_name = data.at_css('IDTypeName')&.text
|
22
|
+
@value = data.at_css('IDValue')&.text
|
38
23
|
end
|
39
24
|
|
40
25
|
#returs the string name of value type
|
41
26
|
def identifier_type
|
42
|
-
Elibri::ONIX::Dict::Release_3_0::ProductIDType.find_by_onix_code(@type)
|
27
|
+
Elibri::ONIX::Dict::Release_3_0::ProductIDType.find_by_onix_code(@type)&.const_name&.downcase
|
43
28
|
end
|
44
29
|
|
45
30
|
#:nodoc:
|
@@ -47,7 +32,6 @@ module Elibri
|
|
47
32
|
[:identifier_type]
|
48
33
|
end
|
49
34
|
end
|
50
|
-
|
51
35
|
end
|
52
36
|
end
|
53
37
|
end
|
@@ -1,36 +1,19 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
1
|
module Elibri
|
5
2
|
module ONIX
|
6
3
|
module Release_3_0
|
7
|
-
|
8
4
|
class Publisher
|
9
|
-
|
10
|
-
#from ONIX documentation:
|
11
|
-
#A repeatable group of data elements which together identify an entity which is associated with the publishing of a product.
|
12
|
-
#The composite allows additional publishing roles to be introduced without adding new fields.
|
13
|
-
#Each occurrence of the composite must carry a publishing role code and either a name identifier code or a name or both.
|
14
|
-
|
15
|
-
|
16
5
|
include Inspector
|
17
6
|
|
18
|
-
ATTRIBUTES = [
|
19
|
-
:role, :name, :eid
|
20
|
-
]
|
21
|
-
|
22
|
-
RELATIONS = []
|
23
|
-
|
24
7
|
#role występuje w tej chwili tylko 01 - główny wydawca
|
25
8
|
|
26
9
|
attr_accessor :role, :name, :eid, :to_xml
|
27
|
-
|
10
|
+
|
28
11
|
def initialize(data)
|
29
12
|
@to_xml = data.to_s
|
30
|
-
@role = data.at_css('PublishingRole')
|
31
|
-
@name = data.at_css('PublisherName')
|
13
|
+
@role = data.at_css('PublishingRole')&.text
|
14
|
+
@name = data.at_css('PublisherName')&.text
|
32
15
|
if data.at_css('PublisherIdentifier')
|
33
|
-
@eid = data.at_css('PublisherIdentifier').at_css('IDValue')
|
16
|
+
@eid = data.at_css('PublisherIdentifier').at_css('IDValue')&.text&.to_i
|
34
17
|
end
|
35
18
|
end
|
36
19
|
|
@@ -1,31 +1,21 @@
|
|
1
|
-
|
2
1
|
module Elibri
|
3
2
|
module ONIX
|
4
3
|
module Release_3_0
|
5
4
|
|
6
5
|
class PublisherSubject
|
7
6
|
|
8
|
-
include HashId
|
9
|
-
|
10
|
-
ATTRIBUTES = [
|
11
|
-
:code, :heading_text
|
12
|
-
]
|
13
|
-
|
14
|
-
RELATIONS = [
|
15
|
-
:inspect_include_fields
|
16
|
-
]
|
17
|
-
|
18
7
|
attr_accessor :code, :heading_text, :to_xml
|
19
8
|
|
20
9
|
def initialize(data)
|
21
10
|
@to_xml = data.to_s
|
22
|
-
@code = data.at_css('SubjectCode')
|
23
|
-
@heading_text = data.at_css('SubjectHeadingText')
|
11
|
+
@code = data.at_css('SubjectCode')&.text
|
12
|
+
@heading_text = data.at_css('SubjectHeadingText')&.text
|
24
13
|
end
|
25
14
|
|
26
15
|
def inspect_include_fields
|
27
16
|
[:code]
|
28
17
|
end
|
18
|
+
|
29
19
|
end
|
30
20
|
end
|
31
21
|
end
|
@@ -1,32 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
1
|
module Elibri
|
5
2
|
module ONIX
|
6
3
|
module Release_3_0
|
7
|
-
|
8
4
|
class PublishingDate
|
9
5
|
|
10
|
-
#from ONIX documentation:
|
11
|
-
#A repeatable group of data elements which together specify a date associated with the publishing of the product.
|
12
|
-
#Optional, but a date of publication must be specified either or in <MarketPublishingDetail> (P.25).
|
13
|
-
#Other dates related to the publishing of a product can be sent in further repeats.
|
14
|
-
|
15
|
-
include HashId
|
16
|
-
|
17
|
-
ATTRIBUTES = [
|
18
|
-
:role, :format, :date, :parsed
|
19
|
-
]
|
20
|
-
|
21
|
-
RELATIONS = []
|
22
|
-
|
23
6
|
attr_accessor :role, :format, :date, :to_xml
|
24
7
|
|
25
8
|
def initialize(data)
|
26
9
|
@to_xml = data.to_s
|
27
|
-
@role = data.at_css('PublishingDateRole')
|
28
|
-
@format = data.at_css('DateFormat')
|
29
|
-
@date = data.at_css('Date')
|
10
|
+
@role = data.at_css('PublishingDateRole')&.text
|
11
|
+
@format = data.at_css('DateFormat')&.text || data.at_css('Date')['dateformat'] || '00'
|
12
|
+
@date = data.at_css('Date')&.text
|
30
13
|
end
|
31
14
|
|
32
15
|
def parsed
|
@@ -38,7 +21,6 @@ module Elibri
|
|
38
21
|
end
|
39
22
|
|
40
23
|
end
|
41
|
-
|
42
24
|
end
|
43
25
|
end
|
44
26
|
end
|
@@ -1,39 +1,21 @@
|
|
1
|
-
|
2
|
-
|
3
1
|
module Elibri
|
4
2
|
module ONIX
|
5
3
|
module Release_3_0
|
6
|
-
|
7
4
|
class RelatedProduct
|
8
|
-
|
9
|
-
#from ONIX documentation:
|
10
|
-
#An optional and repeatable group of data elements which together describe a product which has a specified relationship
|
11
|
-
#to the product described in the ONIX record.
|
12
|
-
include HashId
|
13
|
-
|
14
|
-
#:nodoc:
|
15
|
-
ATTRIBUTES = [
|
16
|
-
:relation_code, :proprietary_identifiers, :record_reference
|
17
|
-
]
|
18
|
-
|
19
|
-
#:nodoc:
|
20
|
-
RELATIONS = [
|
21
|
-
:identifiers
|
22
|
-
]
|
23
|
-
|
5
|
+
|
24
6
|
attr_reader :relation_code
|
25
7
|
attr_reader :identifiers
|
26
8
|
attr_reader :to_xml
|
27
|
-
|
9
|
+
|
28
10
|
def initialize(data)
|
29
11
|
@to_xml = data.to_s
|
30
|
-
@relation_code = data.at_css('ProductRelationCode')
|
12
|
+
@relation_code = data.at_css('ProductRelationCode')&.text
|
31
13
|
@identifiers = data.css('ProductIdentifier').map { |identifier_data| ProductIdentifier.new(identifier_data) }
|
32
14
|
end
|
33
15
|
|
34
|
-
|
16
|
+
|
35
17
|
def record_reference
|
36
|
-
@identifiers.find {|identifier| identifier.type == '01' && identifier.type_name == 'elibri' }
|
18
|
+
@identifiers.find {|identifier| identifier.type == '01' && identifier.type_name == 'elibri' }&.value
|
37
19
|
end
|
38
20
|
|
39
21
|
|
@@ -46,7 +28,6 @@ module Elibri
|
|
46
28
|
end
|
47
29
|
|
48
30
|
end
|
49
|
-
|
50
31
|
end
|
51
32
|
end
|
52
33
|
end
|
@@ -1,41 +1,24 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
1
|
module Elibri
|
5
2
|
module ONIX
|
6
3
|
module Release_3_0
|
7
|
-
|
8
4
|
class SalesRestriction
|
9
5
|
|
10
|
-
#from ONIX documentation:
|
11
|
-
#A group of data elements which together identify a non-territorial sales restriction which a publisher applies to a product.
|
12
|
-
#Optional and repeatable.
|
13
|
-
|
14
|
-
include HashId
|
15
|
-
|
16
|
-
ATTRIBUTES = [
|
17
|
-
:type, :outlet_name, :end_date
|
18
|
-
]
|
19
|
-
|
20
|
-
RELATIONS = []
|
21
|
-
|
22
6
|
attr_accessor :type, :outlet_name, :outlet_code, :end_date, :to_xml
|
23
7
|
|
24
8
|
def initialize(data)
|
25
9
|
@to_xml = data.to_s
|
26
|
-
@type = data.at_css('SalesRestrictionType')
|
10
|
+
@type = data.at_css('SalesRestrictionType')&.text&.to_i
|
27
11
|
if data.at_css('SalesOutlet')
|
28
|
-
@outlet_name = data.at_css('SalesOutlet').at_css('SalesOutletName')
|
12
|
+
@outlet_name = data.at_css('SalesOutlet').at_css('SalesOutletName')&.text
|
29
13
|
outlet_id_struct = data.at_css('SalesOutlet').at_css('SalesOutletIdentifier')
|
30
|
-
if outlet_id_struct && outlet_id_struct.at_css("SalesOutletIDType")
|
31
|
-
@outlet_code = outlet_id_struct.at_css("IDValue")
|
14
|
+
if outlet_id_struct && outlet_id_struct.at_css("SalesOutletIDType")&.text == "03"
|
15
|
+
@outlet_code = outlet_id_struct.at_css("IDValue")&.text
|
32
16
|
end
|
33
17
|
end
|
34
|
-
@end_date = Date.parse(data.at_css('EndDate')
|
18
|
+
@end_date = Date.parse(data.at_css('EndDate')&.text) if data.at_css('EndDate')
|
35
19
|
end
|
36
20
|
|
37
21
|
end
|
38
|
-
|
39
22
|
end
|
40
23
|
end
|
41
24
|
end
|
@@ -1,9 +1,6 @@
|
|
1
|
-
|
2
1
|
module Elibri
|
3
2
|
module ONIX
|
4
3
|
module Release_3_0
|
5
|
-
|
6
|
-
#Sender of the message
|
7
4
|
class Sender
|
8
5
|
include Inspector
|
9
6
|
|
@@ -13,14 +10,6 @@ module Elibri
|
|
13
10
|
#xml representation of sender
|
14
11
|
attr_accessor :to_xml
|
15
12
|
|
16
|
-
#:nodoc:
|
17
|
-
ATTRIBUTES = [
|
18
|
-
:sender_name, :contact_name, :email_address
|
19
|
-
]
|
20
|
-
|
21
|
-
#:nodoc:
|
22
|
-
RELATIONS = []
|
23
|
-
|
24
13
|
#:nodoc:
|
25
14
|
def inspect_include_fields
|
26
15
|
[:sender_name]
|
@@ -32,7 +21,6 @@ module Elibri
|
|
32
21
|
end
|
33
22
|
|
34
23
|
end
|
35
|
-
|
36
24
|
end
|
37
25
|
end
|
38
26
|
end
|
@@ -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
|