elibri_onix 0.1.23 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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