elibri_onix 0.1.23 → 0.2.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.
Files changed (40) hide show
  1. data/Gemfile +1 -0
  2. data/Gemfile.lock +3 -5
  3. data/elibri_onix.gemspec +2 -1
  4. data/lib/elibri_onix.rb +3 -2
  5. data/lib/elibri_onix/external_id.rb +15 -2
  6. data/lib/elibri_onix/external_timestamp.rb +5 -1
  7. data/lib/elibri_onix/nokogiri_patch.rb +17 -0
  8. data/lib/elibri_onix/onix_3_0/audience_range.rb +14 -8
  9. data/lib/elibri_onix/onix_3_0/collection.rb +10 -9
  10. data/lib/elibri_onix/onix_3_0/contributor.rb +21 -18
  11. data/lib/elibri_onix/onix_3_0/extent.rb +18 -11
  12. data/lib/elibri_onix/onix_3_0/header.rb +7 -6
  13. data/lib/elibri_onix/onix_3_0/imprint.rb +6 -5
  14. data/lib/elibri_onix/onix_3_0/language.rb +16 -9
  15. data/lib/elibri_onix/onix_3_0/measure.rb +17 -9
  16. data/lib/elibri_onix/onix_3_0/onix_message.rb +14 -30
  17. data/lib/elibri_onix/onix_3_0/price.rb +19 -17
  18. data/lib/elibri_onix/onix_3_0/product.rb +118 -77
  19. data/lib/elibri_onix/onix_3_0/product_identifier.rb +9 -7
  20. data/lib/elibri_onix/onix_3_0/publisher.rb +19 -9
  21. data/lib/elibri_onix/onix_3_0/publishing_date.rb +10 -9
  22. data/lib/elibri_onix/onix_3_0/related_product.rb +10 -15
  23. data/lib/elibri_onix/onix_3_0/sales_restriction.rb +11 -8
  24. data/lib/elibri_onix/onix_3_0/sender.rb +9 -8
  25. data/lib/elibri_onix/onix_3_0/stock_quantity_coded.rb +8 -11
  26. data/lib/elibri_onix/onix_3_0/subject.rb +19 -13
  27. data/lib/elibri_onix/onix_3_0/supplier.rb +15 -12
  28. data/lib/elibri_onix/onix_3_0/supplier_identifier.rb +9 -8
  29. data/lib/elibri_onix/onix_3_0/supply_detail.rb +16 -15
  30. data/lib/elibri_onix/onix_3_0/supporting_resource.rb +15 -15
  31. data/lib/elibri_onix/onix_3_0/text_content.rb +18 -15
  32. data/lib/elibri_onix/onix_3_0/title_detail.rb +17 -11
  33. data/lib/elibri_onix/onix_3_0/title_element.rb +10 -9
  34. data/lib/elibri_onix/version.rb +1 -1
  35. data/test/elibri_contributors_test.rb +1 -1
  36. data/test/elibri_onix_release_3_0_onix_message_test.rb +2 -2
  37. data/test/elibri_supporting_resources_test.rb +1 -1
  38. data/test/elibri_texts_test.rb +4 -4
  39. data/test/helper.rb +2 -1
  40. metadata +252 -295
data/Gemfile CHANGED
@@ -2,3 +2,4 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in elibri_onix.gemspec
4
4
  gemspec
5
+ # gem 'ruby-debug'
@@ -1,11 +1,11 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- elibri_onix (0.1.23)
4
+ elibri_onix (0.2.0)
5
5
  activesupport (>= 2.3.5)
6
6
  elibri_onix_dict (>= 0.0.5)
7
7
  i18n
8
- roxml (= 3.1.3)
8
+ nokogiri
9
9
 
10
10
  GEM
11
11
  remote: https://rubygems.org/
@@ -23,6 +23,7 @@ GEM
23
23
  metaclass (~> 0.0.1)
24
24
  multi_json (1.3.5)
25
25
  nokogiri (1.5.2)
26
+ nokogiri (1.5.2-java)
26
27
  pry (0.9.9.6)
27
28
  coderay (~> 1.0.5)
28
29
  method_source (~> 0.7.1)
@@ -33,9 +34,6 @@ GEM
33
34
  slop (>= 2.4.4, < 3)
34
35
  spoon (~> 0.0)
35
36
  rake (0.9.2.2)
36
- roxml (3.1.3)
37
- activesupport (>= 2.1.0)
38
- nokogiri (>= 1.3.3)
39
37
  slop (2.4.4)
40
38
  spoon (0.0.1)
41
39
 
@@ -24,7 +24,7 @@ Gem::Specification.new do |gem|
24
24
  ]
25
25
 
26
26
  gem.add_runtime_dependency 'activesupport', '>= 2.3.5'
27
- gem.add_runtime_dependency 'roxml', '= 3.1.3'
27
+ gem.add_runtime_dependency 'nokogiri'
28
28
  gem.add_runtime_dependency 'i18n'
29
29
  gem.add_runtime_dependency 'elibri_onix_dict', '>= 0.0.5'
30
30
 
@@ -33,6 +33,7 @@ Gem::Specification.new do |gem|
33
33
  gem.add_development_dependency "minitest", ">= 0"
34
34
  gem.add_development_dependency "bundler", ">= 1.0.0"
35
35
  gem.add_development_dependency "rake"
36
+ # gem.add_development_dependency "ruby-debug"
36
37
  #gem.add_development_dependency "rcov", ">= 0"
37
38
 
38
39
  end
@@ -1,16 +1,17 @@
1
1
 
2
2
  require 'bigdecimal'
3
+ require 'date'
3
4
  # Old ActiveSupport needs 'thread' to see Mutex:
4
5
  require 'thread'
5
6
  require 'active_support'
6
7
  require 'active_support/core_ext'
7
- require 'roxml'
8
+ require 'nokogiri'
8
9
  require 'elibri_onix/version'
9
10
  require 'elibri_onix/inspector'
10
11
  require 'elibri_onix/external_id'
11
12
  require 'elibri_onix/external_timestamp'
12
13
  require 'elibri_onix/releases'
13
-
14
+ require 'elibri_onix/nokogiri_patch'
14
15
  require 'elibri_onix_dict'
15
16
 
16
17
  $KCODE = "UTF-8"
@@ -1,11 +1,24 @@
1
1
  module ExternalId
2
2
 
3
+ # def self.included(base)
4
+ # base.xml_accessor :id_before_type_cast, :from => "@sourcename"
5
+ # end
6
+
3
7
  def self.included(base)
4
- base.xml_accessor :id_before_type_cast, :from => "@sourcename"
8
+ base.send(:attr_accessor, :id_before_type_cast)
9
+ end
10
+
11
+ def set_eid(data)
12
+ @id_before_type_cast = data.attr('sourcename')
5
13
  end
6
14
 
15
+ def eid
16
+ @id_before_type_cast.split(":")[1].to_i
17
+ end
18
+
7
19
  def id
8
- id_before_type_cast.split(":")[1].to_i
20
+ Kernel.warn "[DEPRECATION] `id` is deprecated. Please use `eid` instead."
21
+ eid
9
22
  end
10
23
 
11
24
  end
@@ -1,7 +1,11 @@
1
1
  module ExternalTimestamp
2
2
 
3
3
  def self.included(base)
4
- base.xml_accessor :datestamp_before_type_cast, :from => "@datestamp"
4
+ base.send(:attr_accessor, :datestamp_before_type_cast) #, :from => "@datestamp"
5
+ end
6
+
7
+ def set_datestamp(data)
8
+ @datestamp_before_type_cast = data.attr('datestamp')
5
9
  end
6
10
 
7
11
  def datestamp
@@ -0,0 +1,17 @@
1
+ module Nokogiri
2
+ module XML
3
+ class Node
4
+ alias_method :orig_xpath, :xpath
5
+
6
+ def xpath *paths
7
+ unless Nokogiri.uses_libxml?
8
+ paths.each do |path|
9
+ path.gsub!(/xmlns:/, ' :') if path.is_a?(String)
10
+ end
11
+ end
12
+ orig_xpath *paths
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -4,23 +4,29 @@ module Elibri
4
4
  module Release_3_0
5
5
 
6
6
  class AudienceRange
7
- include ROXML
8
- include Inspector
9
-
10
- xml_name 'AudienceRange'
11
7
 
12
8
  ATTRIBUTES = [
13
9
  :qualifier, :precision, :value
14
10
  ]
15
11
 
16
12
  RELATIONS = []
13
+
14
+ attr_accessor :qualifier, :precision, :value, :to_xml
17
15
 
18
- xml_accessor :qualifier, :from => 'AudienceRangeQualifier'
19
- xml_accessor :precision, :from => 'AudienceRangePrecision'
20
- xml_accessor :value, :from => 'AudienceRangeValue', :as => Fixnum
16
+ def initialize(data)
17
+ @old_xml = data.to_s
18
+ @qualifier = data.at_xpath('xmlns:AudienceRangeQualifier').try(:text)
19
+ @precision = data.at_xpath('xmlns:AudienceRangePrecision').try(:text)
20
+ @value = data.at_xpath('xmlns:AudienceRangeValue').try(:text).try(:to_i)
21
+ end
21
22
 
23
+ def eid
24
+ "#{@qualifier}-#{@precision}-#{@value}"
25
+ end
26
+
22
27
  def id
23
- "#{qualifier}-#{precision}-#{value}"
28
+ Kernel.warn "[DEPRECATION] `id` is deprecated. Please use `eid` instead."
29
+ eid
24
30
  end
25
31
 
26
32
  end
@@ -4,10 +4,6 @@ module Elibri
4
4
  module Release_3_0
5
5
 
6
6
  class Collection
7
- include ROXML
8
- include Inspector
9
-
10
- xml_name 'Collection'
11
7
 
12
8
  ATTRIBUTES = [
13
9
  :type, :title_detail, :full_title, :type_name
@@ -16,17 +12,22 @@ module Elibri
16
12
  RELATIONS = [
17
13
  :elements, :inspect_include_fields
18
14
  ]
19
-
20
- xml_accessor :type, :from => 'CollectionType'
21
- xml_accessor :elements, :as => [TitleElement]
22
- xml_accessor :title_detail, :as => TitleDetail
15
+
16
+ attr_accessor :type, :elements, :title_detail, :to_xml
17
+
18
+ def initialize(data)
19
+ @to_xml = data.to_s
20
+ @type = data.at_xpath('xmlns:CollectionType').try(:text)
21
+ @elements = data.xpath('xmlns:TitleElement').map { |element_data| TitleElement.new(element_data) }
22
+ @title_detail = TitleDetail.new(data.at_xpath('xmlns:TitleDetail')) if data.at_xpath('xmlns:TitleDetail')
23
+ end
23
24
 
24
25
  def full_title
25
26
  title_detail.try(:full_title)
26
27
  end
27
28
 
28
29
  def type_name
29
- Elibri::ONIX::Dict::Release_3_0::CollectionType.find_by_onix_code(type).const_name.downcase
30
+ Elibri::ONIX::Dict::Release_3_0::CollectionType.find_by_onix_code(@type).const_name.downcase
30
31
  end
31
32
 
32
33
  def inspect_include_fields
@@ -4,8 +4,6 @@ module Elibri
4
4
  module Release_3_0
5
5
 
6
6
  class Contributor
7
- include ROXML
8
- include Inspector
9
7
  include ExternalId
10
8
  include ExternalTimestamp
11
9
 
@@ -19,24 +17,29 @@ module Elibri
19
17
  [
20
18
  :inspect_include_fields
21
19
  ]
22
-
23
- xml_name 'Contributor'
24
-
25
- xml_accessor :number, :from => 'SequenceNumber', :as => Fixnum
26
- xml_accessor :role, :from => 'ContributorRole'
27
- xml_accessor :person_name, :from => 'PersonName'
28
- xml_accessor :from_language, :from => 'FromLanguage'
29
- xml_accessor :titles_before_names, :from => 'TitlesBeforeNames'
30
- xml_accessor :names_before_key, :from => 'NamesBeforeKey'
31
- xml_accessor :prefix_to_key, :from => 'PrefixToKey'
32
- xml_accessor :key_names, :from => 'KeyNames'
33
- xml_accessor :names_after_key, :from => 'NamesAfterKey'
34
- xml_accessor :biographical_note, :from => 'BiographicalNote'
35
-
36
- xml_accessor :unnamed_persons, :from => 'UnnamedPersons'
20
+
21
+ attr_accessor :number, :role, :person_name, :from_language, :titles_before_names, :names_before_key, :prefix_to_key,
22
+ :key_names, :names_after_key, :biographical_note, :unnamed_persons, :to_xml
23
+
24
+ def initialize(data)
25
+ @to_xml = data.to_s
26
+ @number = data.at_xpath('xmlns:SequenceNumber').try(:text).try(:to_i)
27
+ @role = data.at_xpath('xmlns:ContributorRole').try(:text)
28
+ @person_name = data.at_xpath('xmlns:PersonName').try(:text)
29
+ @from_language = data.at_xpath('xmlns:FromLanguage').try(:text)
30
+ @titles_before_names = data.at_xpath('xmlns:TitlesBeforeNames').try(:text)
31
+ @names_before_key = data.at_xpath('xmlns:NamesBeforeKey').try(:text)
32
+ @prefix_to_key = data.at_xpath('xmlns:PrefixToKey').try(:text)
33
+ @key_names = data.at_xpath('xmlns:KeyNames').try(:text)
34
+ @names_after_key = data.at_xpath('xmlns:NamesAfterKey').try(:text)
35
+ @biographical_note = data.at_xpath('xmlns:BiographicalNote').try(:text)
36
+ @unnamed_persons = data.at_xpath('xmlns:UnnamedPersons').try(:text)
37
+ set_eid(data)
38
+ set_datestamp(data)
39
+ end
37
40
 
38
41
  def role_name
39
- Elibri::ONIX::Dict::Release_3_0::ContributorRole.find_by_onix_code(self.role).const_name.downcase
42
+ Elibri::ONIX::Dict::Release_3_0::ContributorRole.find_by_onix_code(@role).const_name.downcase
40
43
  end
41
44
 
42
45
  def inspect_include_fields
@@ -5,14 +5,7 @@ module Elibri
5
5
  module Release_3_0
6
6
 
7
7
  class Extent
8
- include ROXML
9
- include Inspector
10
-
11
- xml_name 'Extent'
12
- xml_accessor :type, :from => 'ExtentType'
13
- xml_accessor :value, :from => 'ExtentValue', :as => Fixnum
14
- xml_accessor :unit, :from => 'ExtentUnit'
15
-
8
+
16
9
  ATTRIBUTES = [
17
10
  :type, :value, :unit, :type_name, :unit_name
18
11
  ]
@@ -20,17 +13,31 @@ module Elibri
20
13
  RELATIONS = [
21
14
  :inspect_include_fields
22
15
  ]
16
+
17
+ attr_accessor :type, :value, :unit, :to_xml
18
+
19
+ def initialize(data)
20
+ @to_xml = data.to_s
21
+ @type = data.xpath('xmlns:ExtentType').try(:text)
22
+ @value = data.xpath('xmlns:ExtentValue').try(:text).try(:to_i)
23
+ @unit = data.xpath('xmlns:ExtentUnit').try(:text)
24
+ end
23
25
 
26
+ def eid
27
+ @type.to_i
28
+ end
29
+
24
30
  def id
25
- type.to_i
31
+ Kernel.warn "[DEPRECATION] `id` is deprecated. Please use `eid` instead."
32
+ eid
26
33
  end
27
34
 
28
35
  def type_name
29
- Elibri::ONIX::Dict::Release_3_0::ExtentType.find_by_onix_code(type).const_name.downcase
36
+ Elibri::ONIX::Dict::Release_3_0::ExtentType.find_by_onix_code(@type).const_name.downcase
30
37
  end
31
38
 
32
39
  def unit_name
33
- Elibri::ONIX::Dict::Release_3_0::ExtentUnit.find_by_onix_code(unit).const_name.downcase
40
+ Elibri::ONIX::Dict::Release_3_0::ExtentUnit.find_by_onix_code(@unit).const_name.downcase
34
41
  end
35
42
 
36
43
  def inspect_include_fields
@@ -5,13 +5,8 @@ module Elibri
5
5
  module Release_3_0
6
6
 
7
7
  class Header
8
- include ROXML
9
- include Inspector
10
8
 
11
- xml_name 'Header'
12
- xml_accessor :sent_date_time, :as => Date, :from => 'SentDateTime'
13
-
14
- xml_accessor :sender, :as => Sender
9
+ attr_accessor :sent_date_time, :sender, :to_xml
15
10
 
16
11
  ATTRIBUTES = [
17
12
  :sent_date_time, :sender
@@ -19,6 +14,12 @@ module Elibri
19
14
 
20
15
  RELATIONS = []
21
16
 
17
+ def initialize(data)
18
+ @to_xml = data.to_s
19
+ @sent_date_time = Date.parse(data.xpath('xmlns:SentDateTime').try(:text)) if data.xpath('xmlns:SentDateTime')
20
+ @sender = Sender.new(data.at_xpath('xmlns:Sender')) if data.at_xpath('xmlns:Sender')
21
+ end
22
+
22
23
  end
23
24
 
24
25
  end
@@ -5,10 +5,6 @@ module Elibri
5
5
  module Release_3_0
6
6
 
7
7
  class Imprint
8
- include ROXML
9
- include Inspector
10
-
11
- xml_name 'Imprint'
12
8
 
13
9
  ATTRIBUTES = [
14
10
  :name
@@ -16,7 +12,12 @@ module Elibri
16
12
 
17
13
  RELATIONS = []
18
14
 
19
- xml_accessor :name, :from => 'ImprintName'
15
+ attr_accessor :name, :to_xml
16
+
17
+ def initialize(data)
18
+ @to_xml = data.to_s
19
+ @name = data.at_xpath('xmlns:ImprintName').try(:text)
20
+ end
20
21
 
21
22
  end
22
23
 
@@ -5,12 +5,6 @@ module Elibri
5
5
  module Release_3_0
6
6
 
7
7
  class Language
8
- include ROXML
9
- include Inspector
10
- xml_name 'Language'
11
-
12
- xml_accessor :role, :from => 'LanguageRole'
13
- xml_accessor :code, :from => 'LanguageCode'
14
8
 
15
9
  ATTRIBUTES = [
16
10
  :role, :code, :role_name, :language
@@ -19,21 +13,34 @@ module Elibri
19
13
  RELATIONS = [
20
14
  :inspect_include_fields
21
15
  ]
16
+
17
+ attr_accessor :role, :code, :to_xml
18
+
19
+ def initialize(data)
20
+ @to_xml = data.to_s
21
+ @role = data.at_xpath('xmlns:LanguageRole').try(:text)
22
+ @code = data.at_xpath('xmlns:LanguageCode').try(:text)
23
+ end
22
24
 
23
25
  def role_name
24
- Elibri::ONIX::Dict::Release_3_0::LanguageRole.find_by_onix_code(self.role).const_name.downcase
26
+ Elibri::ONIX::Dict::Release_3_0::LanguageRole.find_by_onix_code(@role).const_name.downcase
25
27
  end
26
28
 
27
29
  def language
28
- Elibri::ONIX::Dict::Release_3_0::LanguageCode.find_by_onix_code(self.code).name(:pl).downcase
30
+ Elibri::ONIX::Dict::Release_3_0::LanguageCode.find_by_onix_code(@code).name(:pl).downcase
29
31
  end
30
32
 
31
33
  def inspect_include_fields
32
34
  [:role_name, :language]
33
35
  end
34
36
 
37
+ def eid
38
+ "#{@role}-#{@code}"
39
+ end
40
+
35
41
  def id
36
- "#{role}-#{code}"
42
+ Kernel.warn "[DEPRECATION] `id` is deprecated. Please use `eid` instead."
43
+ eid
37
44
  end
38
45
 
39
46
  end
@@ -5,13 +5,6 @@ module Elibri
5
5
  module Release_3_0
6
6
 
7
7
  class Measure
8
- include ROXML
9
- include Inspector
10
-
11
- xml_name 'Measure'
12
- xml_accessor :type, :from => 'MeasureType'
13
- xml_accessor :measurement, :from => 'Measurement', :as => Fixnum
14
- xml_accessor :unit, :from => 'MeasureUnitCode'
15
8
 
16
9
  ATTRIBUTES = [
17
10
  :type, :measurement, :unit, :type_name
@@ -20,17 +13,32 @@ module Elibri
20
13
  RELATIONS = [
21
14
  :inspect_include_fields
22
15
  ]
16
+
17
+ attr_accessor :type, :measurement, :unit, :type_name, :to_xml
18
+
19
+ def initialize(data)
20
+ @to_xml = data.to_s
21
+ @type = data.at_xpath('xmlns:MeasureType').try(:text)
22
+ @measurement = data.at_xpath('xmlns:Measurement').try(:text).try(:to_i)
23
+ @unit = data.at_xpath('xmlns:MeasureUnitCode').try(:text)
24
+
25
+ end
23
26
 
24
27
  def type_name
25
- Elibri::ONIX::Dict::Release_3_0::MeasureType.find_by_onix_code(type).const_name.downcase
28
+ Elibri::ONIX::Dict::Release_3_0::MeasureType.find_by_onix_code(@type).const_name.downcase
26
29
  end
27
30
 
28
31
  def inspect_include_fields
29
32
  [:type_name]
30
33
  end
31
34
 
35
+ def eid
36
+ @type.to_i
37
+ end
38
+
32
39
  def id
33
- type.to_i
40
+ Kernel.warn "[DEPRECATION] `id` is deprecated. Please use `eid` instead."
41
+ eid
34
42
  end
35
43
 
36
44
  end