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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/lib/elibri_onix/external_timestamp.rb +2 -2
  3. data/lib/elibri_onix/onix_3_0/audience_range.rb +4 -17
  4. data/lib/elibri_onix/onix_3_0/collection.rb +0 -0
  5. data/lib/elibri_onix/onix_3_0/contributor.rb +15 -38
  6. data/lib/elibri_onix/onix_3_0/excerpt_info.rb +8 -21
  7. data/lib/elibri_onix/onix_3_0/extent.rb +9 -24
  8. data/lib/elibri_onix/onix_3_0/file_info.rb +2 -13
  9. data/lib/elibri_onix/onix_3_0/header.rb +7 -17
  10. data/lib/elibri_onix/onix_3_0/imprint.rb +2 -18
  11. data/lib/elibri_onix/onix_3_0/language.rb +5 -22
  12. data/lib/elibri_onix/onix_3_0/measure.rb +4 -18
  13. data/lib/elibri_onix/onix_3_0/onix_message.rb +2 -17
  14. data/lib/elibri_onix/onix_3_0/price.rb +14 -25
  15. data/lib/elibri_onix/onix_3_0/price_constraint_limit.rb +22 -0
  16. data/lib/elibri_onix/onix_3_0/price_identifier.rb +18 -0
  17. data/lib/elibri_onix/onix_3_0/product.rb +62 -127
  18. data/lib/elibri_onix/onix_3_0/product_identifier.rb +6 -22
  19. data/lib/elibri_onix/onix_3_0/publisher.rb +4 -21
  20. data/lib/elibri_onix/onix_3_0/publisher_subject.rb +3 -13
  21. data/lib/elibri_onix/onix_3_0/publishing_date.rb +3 -21
  22. data/lib/elibri_onix/onix_3_0/related_product.rb +5 -24
  23. data/lib/elibri_onix/onix_3_0/sales_restriction.rb +5 -22
  24. data/lib/elibri_onix/onix_3_0/sender.rb +0 -12
  25. data/lib/elibri_onix/onix_3_0/stock_quantity_coded.rb +4 -19
  26. data/lib/elibri_onix/onix_3_0/supplier.rb +7 -25
  27. data/lib/elibri_onix/onix_3_0/supplier_identifier.rb +4 -23
  28. data/lib/elibri_onix/onix_3_0/supply_detail.rb +9 -26
  29. data/lib/elibri_onix/onix_3_0/supporting_resource.rb +7 -20
  30. data/lib/elibri_onix/onix_3_0/text_content.rb +9 -24
  31. data/lib/elibri_onix/onix_3_0/thema_subject.rb +2 -15
  32. data/lib/elibri_onix/onix_3_0/title_detail.rb +9 -28
  33. data/lib/elibri_onix/onix_3_0/title_element.rb +10 -35
  34. data/lib/elibri_onix/releases.rb +2 -2
  35. data/lib/elibri_onix/timestamp_parser.rb +12 -0
  36. data/lib/elibri_onix/version.rb +1 -1
  37. data/lib/elibri_onix.rb +4 -8
  38. data/test/elibri_audiobook_test.rb +1 -1
  39. data/test/elibri_contributors_test.rb +3 -3
  40. data/test/elibri_ebook_files_test.rb +2 -2
  41. data/test/elibri_extensions_test.rb +0 -12
  42. data/test/elibri_group_contributor_test.rb +1 -1
  43. data/test/elibri_onix_release_3_0_onix_message_test.rb +1 -6
  44. data/test/elibri_record_identifiers_test.rb +2 -2
  45. data/test/elibri_supporting_resources_test.rb +2 -2
  46. data/test/elibri_texts_test.rb +5 -5
  47. data/test/fixtures/all_possible_tags.xml +1 -18
  48. data/test/fixtures/lending_example.xml +419 -0
  49. data/test/fixtures/onix_announced_product_example.xml +1 -3
  50. data/test/fixtures/onix_audience_range_example.xml +1 -3
  51. data/test/fixtures/onix_audiobook_extent_example.xml +1 -3
  52. data/test/fixtures/onix_collective_work_example.xml +1 -3
  53. data/test/fixtures/onix_contributors_example.xml +1 -3
  54. data/test/fixtures/onix_ebook_extent_example.xml +1 -4
  55. data/test/fixtures/onix_edition_example.xml +1 -3
  56. data/test/fixtures/onix_epub_details_example.xml +5 -4
  57. data/test/fixtures/onix_languages_example.xml +1 -3
  58. data/test/fixtures/onix_measurement_example.xml +1 -3
  59. data/test/fixtures/onix_no_contributors_example.xml +1 -3
  60. data/test/fixtures/onix_out_of_print_product_example.xml +1 -3
  61. data/test/fixtures/onix_preorder_product_example.xml +1 -3
  62. data/test/fixtures/onix_product_form_example.xml +1 -4
  63. data/test/fixtures/onix_published_group_product_example.xml +1 -3
  64. data/test/fixtures/onix_published_product_example.xml +1 -3
  65. data/test/fixtures/onix_publisher_info_example.xml +1 -3
  66. data/test/fixtures/onix_record_identifiers_example.xml +1 -4
  67. data/test/fixtures/onix_related_products_example.xml +1 -3
  68. data/test/fixtures/onix_removed_elibri_extensions.xml +0 -1
  69. data/test/fixtures/onix_sale_restrictions_example.xml +1 -3
  70. data/test/fixtures/onix_series_memberships_example.xml +1 -3
  71. data/test/fixtures/onix_supporting_resources_example.xml +1 -2
  72. data/test/fixtures/onix_territorial_rights_example.xml +1 -4
  73. data/test/fixtures/onix_texts_example.xml +1 -3
  74. data/test/fixtures/onix_title_with_collection_example.xml +1 -3
  75. data/test/fixtures/onix_titles_example.xml +1 -3
  76. data/test/fixtures/onix_unlimited_book_sample_example.xml +1 -4
  77. data/test/lending_licence_test.rb +43 -0
  78. metadata +9 -20
  79. data/lib/elibri_onix/hash_id.rb +0 -37
  80. data/test/fixtures/old_dialect.xml +0 -29
  81. 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').try(:text)
271
- @notification_type = data.at_css('NotificationType').try(:text)
272
- @deletion_text = data.at_css('DeletionText').try(:text)
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
- begin
289
- @supply_details = data.at_css('ProductSupply').css('SupplyDetail').map { |supply_data| SupplyDetail.new(supply_data) }
290
- rescue
291
- @supply_details = []
292
- end
293
-
294
- if data.namespaces.values.any? { |uri| uri =~ /elibri/ } && (data.at_xpath('elibri:Vat') || data.at_xpath('elibri:CoverPrice'))
295
- @cover_price = BigDecimal(data.at_xpath('elibri:CoverPrice').try(:text)) if data.at_xpath('elibri:CoverPrice')
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
- if data.namespaces.values.any? { |uri| uri =~ /elibri/ } && data.at_xpath('elibri:preview_exists')
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
- begin
321
- @excerpt_infos = data.at_xpath("elibri:excerpts").xpath("elibri:excerpt").map { |node| ExcerptInfo.new(node) }
322
- rescue
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
- if data.namespaces.values.any? { |uri| uri =~ /elibri/ } && (data.at_xpath("elibri:SaleNotRestricted") || data.at_xpath("elibri:SaleRestrictedTo"))
335
- if data.at_xpath("elibri:SaleNotRestricted")
336
- @unlimited_licence = true
337
- elsif date = data.at_xpath("elibri:SaleRestrictedTo").try(:text)
338
- @unlimited_licence = false
339
- @licence_limited_to_before_type_cast = date
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
- 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 }
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").try(:text)
312
+ @country_of_manufacture = data.at_css("CountryOfManufacture")&.text
375
313
 
376
- @product_composition = data.at_css('ProductComposition').try(:text)
377
- @product_form = data.at_css('ProductForm').try(:text)
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.starts_with?("B") ? "BA" : @product_form
387
- if Elibri::ONIX::Dict::Release_3_0::ProductFormCode::find_by_onix_code(simplified_product_form).try!(:digital?)
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).try(:name)
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').try(:text)) }.map { |sd| PublisherSubject.new(sd) }
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').try(:text)) }.map { |sd| ThemaSubject.new(sd) }
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").try(:text)
421
- @technical_protection = Elibri::ONIX::Dict::Release_3_0::EpubTechnicalProtection::find_by_onix_code(protection).try(:name)
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').try(:text)
426
- if Elibri::ONIX::Dict::Release_3_0::EditionType.find_by_onix_code(data.at_css('EditionType').try(:text))
427
- @edition_type_onix_code = data.at_css('EditionType').try(:text)
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').try(:text).try(:to_i)
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').try(:text)
442
- @city_of_publication = data.at_css("CityOfPublication").try(:text)
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").try(:text) == "PL"
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.present?
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 }.try(:measurement))
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" }.try(:value)
494
+ @ean = @identifiers.find { |identifier| identifier.identifier_type == "ean" }&.value
560
495
 
561
- @number_of_pages = @extents.find {|extent| extent.type_name == "page_count" }.try(:value)
562
- @duration = @extents.find {|extent| extent.type_name == "duration" }.try(:value)
563
- @file_size = @extents.find {|extent| extent.type_name == "file_size" }.try(:value)
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" }.try(:value)
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")}.try(:value).try(:to_i)
570
- @reading_age_to = @audience_ranges.find {|ar| (ar.qualifier == "18") && (ar.precision == "04")}.try(:value).try(:to_i)
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.try(:title)
580
- @subtitle = distinctive_title.product_level.try(:subtitle)
581
- @collection_title = distinctive_title.collection_level.try(:title)
582
- @collection_part = distinctive_title.collection_level.try(:part_number)
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).try(:full_title)
585
- @original_title = find_title(Elibri::ONIX::Dict::Release_3_0::TitleType::ORIGINAL_TITLE).try(:full_title)
586
- @trade_title = find_title(Elibri::ONIX::Dict::Release_3_0::TitleType::DISTRIBUTORS_TITLE).try(:full_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').try(:text)
36
- @type_name = data.at_css('IDTypeName').try(:text)
37
- @value = data.at_css('IDValue').try(:text)
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).try(:const_name).try(:downcase)
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').try(:text)
31
- @name = data.at_css('PublisherName').try(:text)
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').try(:text).try(:to_i)
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').try(:text)
23
- @heading_text = data.at_css('SubjectHeadingText').try(:text)
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').try(:text)
28
- @format = data.at_css('DateFormat').try(:text) || data.at_css('Date')['dateformat'] || '00'
29
- @date = data.at_css('Date').try(:text)
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').try(:text)
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' }.try(:value)
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').try(:text).try(:to_i)
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').try(:text)
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").try(:text) == "03"
31
- @outlet_code = outlet_id_struct.at_css("IDValue").try(:text)
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').try(:text)) if 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').try(:text).try(:to_i)
25
- @code = data.at_css('StockQuantityCode').try(:text)
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