im_onix 1.0.2 → 1.1.1

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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -0
  3. data/.yardopts +1 -0
  4. data/Gemfile +8 -0
  5. data/LICENSE.md +7 -0
  6. data/README.md +3 -3
  7. data/Rakefile +10 -0
  8. data/bin/html_codelist_to_yml.rb +14 -15
  9. data/bin/onix_bench.rb +1 -0
  10. data/bin/onix_pp.rb +4 -8
  11. data/bin/onix_serialize.rb +27 -0
  12. data/doc-src/handlers.rb +154 -0
  13. data/im_onix.gemspec +32 -0
  14. data/lib/im_onix.rb +0 -1
  15. data/lib/onix/addressee.rb +10 -0
  16. data/lib/onix/code.rb +108 -282
  17. data/lib/onix/collateral_detail.rb +24 -17
  18. data/lib/onix/collection.rb +38 -0
  19. data/lib/onix/collection_sequence.rb +7 -0
  20. data/lib/onix/contributor.rb +40 -39
  21. data/lib/onix/date.rb +73 -109
  22. data/lib/onix/descriptive_detail.rb +90 -417
  23. data/lib/onix/discount_coded.rb +3 -16
  24. data/lib/onix/entity.rb +28 -62
  25. data/lib/onix/epub_usage_constraint.rb +7 -0
  26. data/lib/onix/epub_usage_limit.rb +6 -0
  27. data/lib/onix/extent.rb +39 -0
  28. data/lib/onix/helper.rb +25 -25
  29. data/lib/onix/identifier.rb +13 -54
  30. data/lib/onix/language.rb +8 -0
  31. data/lib/onix/market.rb +5 -0
  32. data/lib/onix/market_publishing_detail.rb +20 -0
  33. data/lib/onix/onix21.rb +76 -139
  34. data/lib/onix/onix_message.rb +87 -100
  35. data/lib/onix/price.rb +19 -39
  36. data/lib/onix/product.rb +141 -637
  37. data/lib/onix/product_form_feature.rb +7 -0
  38. data/lib/onix/product_part.rb +89 -0
  39. data/lib/onix/product_supplies_extractor.rb +275 -0
  40. data/lib/onix/product_supply.rb +17 -58
  41. data/lib/onix/publishing_detail.rb +16 -32
  42. data/lib/onix/related_material.rb +4 -3
  43. data/lib/onix/related_product.rb +9 -29
  44. data/lib/onix/related_work.rb +3 -17
  45. data/lib/onix/sales_outlet.rb +2 -10
  46. data/lib/onix/sales_restriction.rb +8 -21
  47. data/lib/onix/sales_rights.rb +1 -5
  48. data/lib/onix/sender.rb +12 -0
  49. data/lib/onix/serializer.rb +156 -0
  50. data/lib/onix/subject.rb +9 -30
  51. data/lib/onix/subset.rb +88 -78
  52. data/lib/onix/supply_detail.rb +42 -0
  53. data/lib/onix/supporting_resource.rb +29 -86
  54. data/lib/onix/tax.rb +9 -18
  55. data/lib/onix/territory.rb +23 -17
  56. data/lib/onix/title_detail.rb +22 -0
  57. data/lib/onix/title_element.rb +32 -0
  58. data/lib/onix/website.rb +3 -16
  59. metadata +53 -34
@@ -4,16 +4,18 @@ module ONIX
4
4
  class PublishingDetail < SubsetDSL
5
5
  elements "Imprint", :subset
6
6
  elements "Publisher", :subset
7
- element "CityOfPublication", :text
8
- element "CountryOfPublication", :text
9
- element "PublishingStatus", :subset
7
+ element "CityOfPublication", :text, :shortcut => :city
8
+ element "CountryOfPublication", :text, :shortcut => :country
9
+ element "PublishingStatus", :subset, :shortcut => :status
10
10
  elements "PublishingDate", :subset
11
- elements "SalesRights", :subset, {:pluralize=>false}
12
- element "ROWSalesRightsType", :subset, {:klass=>"SalesRightsType"}
11
+ elements "SalesRights", :subset, {:pluralize => false}
12
+ element "ROWSalesRightsType", :subset, {:klass => "SalesRightsType"}
13
13
  element "SalesRestriction", :subset
14
14
 
15
+ # @!group High level
16
+
15
17
  def publisher
16
- main_publishers = @publishers.select { |p| p.role.human=="Publisher" }
18
+ main_publishers = @publishers.select { |p| p.role.human == "Publisher" }
17
19
  return nil if main_publishers.empty?
18
20
  if main_publishers.length == 1
19
21
  main_publishers.first
@@ -24,63 +26,45 @@ module ONIX
24
26
 
25
27
  def imprint
26
28
  if @imprints.length > 0
27
- if @imprints.length==1
29
+ if @imprints.length == 1
28
30
  @imprints.first
29
31
  else
30
32
  raise ExpectsOneButHasSeveral, @imprints.map(&:name)
31
33
  end
32
- else
33
- nil
34
34
  end
35
35
  end
36
36
 
37
+ # date of publication
37
38
  def publication_date
38
- pub=@publishing_dates.publication.first
39
+ pub = @publishing_dates.publication.first
39
40
  if pub
40
41
  pub.date
41
- else
42
- nil
43
42
  end
44
43
  end
45
44
 
45
+ # date of embargo
46
46
  def embargo_date
47
- pub=@publishing_dates.embargo.first
47
+ pub = @publishing_dates.embargo.first
48
48
  if pub
49
49
  pub.date
50
- else
51
- nil
52
50
  end
53
51
  end
54
52
 
55
53
  def preorder_embargo_date
56
- pub=@publishing_dates.preorder_embargo.first
54
+ pub = @publishing_dates.preorder_embargo.first
57
55
  if pub
58
56
  pub.date
59
- else
60
- nil
61
57
  end
62
58
  end
63
59
 
64
60
  def public_announcement_date
65
- pub=@publishing_dates.public_announcement.first
61
+ pub = @publishing_dates.public_announcement.first
66
62
  if pub
67
63
  pub.date
68
- else
69
- nil
70
64
  end
71
65
  end
72
66
 
73
- def status
74
- @publising_status
75
- end
76
-
77
- def city
78
- @city_of_publication
79
- end
80
-
81
- def country
82
- @country_of_publication
83
- end
67
+ # @!endgroup
84
68
 
85
69
  end
86
70
  end
@@ -5,26 +5,27 @@ module ONIX
5
5
  elements "RelatedWork", :subset
6
6
  elements "RelatedProduct", :subset
7
7
 
8
+ # @!group High level
9
+
8
10
  def linking(human)
9
11
  @related_products.select{|rp| rp.code.human==human}
10
12
  end
11
13
 
12
- # :category: High level
13
14
  # print products RelatedProduct array
14
15
  def print_products
15
16
  linking("EpublicationBasedOnPrintProduct") + self.alternative_format_products.select{|rp| rp.form && rp.form.code=~/^B/}
16
17
  end
17
18
 
18
- # :category: High level
19
19
  # is part of products RelatedProduct array
20
20
  def part_of_products
21
21
  linking("IsPartOf")
22
22
  end
23
23
 
24
- # :category: High level
25
24
  # alternative format products RelatedProduct array
26
25
  def alternative_format_products
27
26
  linking("AlternativeFormat")
28
27
  end
28
+
29
+ # @!endgroup
29
30
  end
30
31
  end
@@ -3,43 +3,23 @@ module ONIX
3
3
  include EanMethods
4
4
  include ProprietaryIdMethods
5
5
 
6
- element "ProductRelationCode", :subset
7
- elements "ProductIdentifier", :subset
8
- element "ProductForm", :subset
9
- elements "ProductFormDetail", :subset
10
-
11
- # shortcuts
12
- def code
13
- @product_relation_code
14
- end
15
-
16
- def identifiers
17
- @product_identifiers
18
- end
19
-
20
- def form
21
- @product_form
22
- end
23
-
24
- def form_details
25
- @product_form_details
26
- end
6
+ element "ProductRelationCode", :subset, :shortcut => :code
7
+ elements "ProductIdentifier", :subset, :shortcut => :identifiers
8
+ element "ProductForm", :subset, :shortcut => :form
9
+ elements "ProductFormDetail", :subset, :shortcut => :form_details
27
10
 
28
11
  # full Product if referenced in ONIXMessage
29
- def product
30
- @product
31
- end
32
-
33
- def product=v
34
- @product=v
35
- end
12
+ attr_accessor :product
36
13
 
14
+ # @!group High level
37
15
  def file_format
38
16
  file_formats.first.human if file_formats.first
39
17
  end
40
18
 
19
+ # @!endgroup
20
+
41
21
  def file_formats
42
- @product_form_details.select{|fd| fd.code =~ /^E1.*/}
22
+ @product_form_details.select { |fd| fd.code =~ /^E1.*/ }
43
23
  end
44
24
  end
45
25
  end
@@ -1,24 +1,10 @@
1
1
  module ONIX
2
2
  class RelatedWork < SubsetDSL
3
3
  include EanMethods
4
- element "WorkRelationCode", :subset
5
- elements "WorkIdentifier", :subset
6
-
7
- def code
8
- @work_relation_code
9
- end
10
-
11
- def identifiers
12
- @work_identifiers
13
- end
4
+ element "WorkRelationCode", :subset, :shortcut => :code
5
+ elements "WorkIdentifier", :subset, :shortcut => :identifiers
14
6
 
15
7
  # full Product if referenced in ONIXMessage
16
- def product
17
- @product
18
- end
19
-
20
- def product=v
21
- @product=v
22
- end
8
+ attr_accessor :product
23
9
  end
24
10
  end
@@ -1,14 +1,6 @@
1
1
  module ONIX
2
2
  class SalesOutlet < SubsetDSL
3
- element "SalesOutletIdentifier", :subset
4
- element "SalesOutletName", :text
5
-
6
- def identifier
7
- @sales_outlet_identifier
8
- end
9
-
10
- def name
11
- @sales_outlet_name
12
- end
3
+ element "SalesOutletIdentifier", :subset, :shortcut => :identifier
4
+ element "SalesOutletName", :text, :shortcut => :name
13
5
  end
14
6
  end
@@ -1,35 +1,22 @@
1
1
  require 'onix/sales_outlet'
2
2
  module ONIX
3
3
  class SalesRestriction < SubsetDSL
4
- element "SalesRestrictionType", :subset
4
+ element "SalesRestrictionType", :subset, :shortcut => :type
5
5
  elements "SalesOutlet", :subset
6
- element "SalesRestrictionNote", :text
6
+ element "SalesRestrictionNote", :text, :shortcut => :note
7
7
 
8
8
  attr_accessor :start_date, :end_date
9
9
 
10
- # shortcuts
11
- def type
12
- @sales_restriction_type
13
- end
14
-
15
- def note
16
- @sales_restriction_note
17
- end
18
-
19
- def initialize
20
- @sales_outlets=[]
21
- end
22
-
23
10
  def parse(n)
24
11
  super
25
12
  n.elements.each do |t|
26
13
  case t
27
- when tag_match("StartDate")
28
- fmt=t["dateformat"] || "00"
29
- @start_date=ONIX::Helper.to_date(fmt,t.text)
30
- when tag_match("EndDate")
31
- fmt=t["dateformat"] || "00"
32
- @end_date=ONIX::Helper.to_date(fmt,t.text)
14
+ when tag_match("StartDate")
15
+ fmt = t["dateformat"] || "00"
16
+ @start_date = ONIX::Helper.to_date(fmt, t.text)
17
+ when tag_match("EndDate")
18
+ fmt = t["dateformat"] || "00"
19
+ @end_date = ONIX::Helper.to_date(fmt, t.text)
33
20
  end
34
21
  end
35
22
  end
@@ -1,12 +1,8 @@
1
1
  require 'onix/sales_restriction'
2
2
  module ONIX
3
3
  class SalesRights < SubsetDSL
4
- element "SalesRightsType", :subset
4
+ element "SalesRightsType", :subset, :shortcut => :type
5
5
  element "Territory", :subset
6
6
  elements "SalesRestriction", :subset
7
-
8
- def type
9
- @sales_rights_type
10
- end
11
7
  end
12
8
  end
@@ -0,0 +1,12 @@
1
+ require 'onix/identifier'
2
+
3
+ module ONIX
4
+ class Sender < SubsetDSL
5
+ include GlnMethods
6
+
7
+ elements "SenderIdentifier", :subset, :shortcut => :identifiers
8
+ element "SenderName", :text, :shortcut => :name
9
+ element "ContactName", :text
10
+ element "EmailAddress", :text
11
+ end
12
+ end
@@ -0,0 +1,156 @@
1
+ module ONIX
2
+ module Serializer
3
+ class Traverser
4
+
5
+ def self.serialize_subset(mod, xml, subset, parent_tag = nil, level = 0)
6
+ if subset.class.included_modules.include?(DateHelper)
7
+ mod.const_get("Date").serialize(xml, subset, parent_tag, level)
8
+ else
9
+ if subset.class.included_modules.include?(CodeHelper)
10
+ mod.const_get("Code").serialize(xml, subset, parent_tag, level)
11
+ else
12
+ if subset.class.included_modules.include?(EntityHelper)
13
+ mod.const_get("Entity").serialize(xml, subset, parent_tag, level)
14
+ else
15
+ mod.const_get("Subset").serialize(xml, parent_tag, subset, level)
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ def self.recursive_serialize(mod, xml, subset, parent_tag = nil, level = 0)
22
+ if subset.class.respond_to?(:ancestors_registered_elements)
23
+ subset.class.ancestors_registered_elements.each do |n, e|
24
+ unless e.short
25
+ v = subset.instance_variable_get(e.to_instance)
26
+ if v
27
+ if e.is_array?
28
+ v.each do |vv|
29
+ case e.type
30
+ when :subset
31
+ self.serialize_subset(mod, xml, vv, n, level)
32
+ when :text, :integer, :float, :bool
33
+ mod.const_get("Primitive").serialize(xml, n, vv, level)
34
+ when :ignore
35
+ else
36
+ end
37
+ end
38
+ else
39
+ case e.type
40
+ when :subset
41
+ self.serialize_subset(mod, xml, v, n, level)
42
+ when :text, :integer, :float, :bool
43
+ mod.const_get("Primitive").serialize(xml, n, e.serialize_lambda(v), level)
44
+ when :ignore
45
+ else
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ end
54
+ end
55
+
56
+ module Default
57
+ class Subset
58
+ def self.serialize(xml, tag, subset, level = 0)
59
+ xml.send(tag, nil) {
60
+ ONIX::Serializer::Traverser.recursive_serialize(Default, xml, subset, tag, level+1)
61
+ }
62
+ end
63
+ end
64
+
65
+ class Primitive
66
+ def self.serialize(xml, tag, data, level = 0)
67
+ unless data.respond_to?(:empty?) ? !!data.empty? : !data # rails blank?
68
+ xml.send(tag, data)
69
+ end
70
+ end
71
+ end
72
+
73
+ class Date
74
+ def self.serialize(xml, date, parent_tag = nil, level = 0)
75
+ xml.send(parent_tag, nil) {
76
+ ONIX::Serializer::Traverser.recursive_serialize(Default, xml, date, parent_tag, level+1)
77
+ xml.DateFormat(date.date_format.code)
78
+ code_format=date.format_from_code(date.date_format.code)
79
+ xml.Date(date.date.strftime(code_format))
80
+ }
81
+
82
+ end
83
+ end
84
+
85
+ class Code
86
+ def self.serialize(xml, code, parent_tag = nil, level = 0)
87
+ xml.send(parent_tag, nil) {
88
+ xml.text(code.code)
89
+ }
90
+ end
91
+ end
92
+
93
+ class Entity
94
+ def self.serialize(xml, entity, parent_tag = nil, level = 0)
95
+ xml.send(parent_tag, nil) {
96
+ if entity.role
97
+ Code.serialize(xml, entity.role, entity.class.role_tag, level+1)
98
+ end
99
+ entity.identifiers.each do |identifier|
100
+ Subset.serialize(xml, entity.class.identifier_tag, identifier, level+1)
101
+ end
102
+ if entity.name
103
+ xml.send(entity.class.name_tag, entity.name)
104
+ end
105
+ ONIX::Serializer::Traverser.recursive_serialize(Default, xml, entity, parent_tag, level+1)
106
+ }
107
+ end
108
+ end
109
+ end
110
+
111
+ module Dump
112
+ class Subset
113
+ def self.serialize(io, tag, subset, level = 0)
114
+ io.write " "*level
115
+ io.write "#{tag}:\n"
116
+ ONIX::Serializer::Traverser.recursive_serialize(Dump, io, subset, tag, level+1)
117
+ end
118
+ end
119
+
120
+ class Primitive
121
+ def self.serialize(io, tag, data, level = 0)
122
+ unless data.respond_to?(:empty?) ? !!data.empty? : !data # rails blank?
123
+ io.write " "*level
124
+ io.write "#{tag} : #{data}\n"
125
+ end
126
+ end
127
+ end
128
+
129
+ class Date
130
+ def self.serialize(io, date, parent_tag = nil, level = 0)
131
+ io.write " "*level
132
+ io.write "#{parent_tag}: #{date.date}\n"
133
+ end
134
+ end
135
+
136
+ class Code
137
+ def self.serialize(io, code, parent_tag = nil, level = 0)
138
+ io.write " "*level
139
+ io.write "#{parent_tag}: #{code.human}(#{code.code})\n"
140
+ end
141
+ end
142
+
143
+ class Entity
144
+ def self.serialize(io, entity, parent_tag = nil, level = 0)
145
+ io.write " "*level
146
+ io.write "#{parent_tag}: #{entity.name}\n"
147
+ if entity.role
148
+ io.write " "*(level+1)
149
+ io.write "Role: #{entity.role.human}(#{entity.role.code})\n"
150
+ end
151
+ end
152
+ end
153
+ end
154
+
155
+ end
156
+ end