im_onix 1.0.2 → 1.1.1

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