im_onix 1.2.3 → 1.3.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.
- checksums.yaml +4 -4
- data/Gemfile +1 -6
- data/README.md +1 -1
- data/bin/onix_bench.rb +16 -0
- data/im_onix.gemspec +3 -1
- data/lib/onix/addressee.rb +2 -1
- data/lib/onix/barcode.rb +6 -0
- data/lib/onix/builder.rb +22 -6
- data/lib/onix/code.rb +42 -44
- data/lib/onix/date.rb +17 -11
- data/lib/onix/entity.rb +3 -2
- data/lib/onix/identifier.rb +69 -64
- data/lib/onix/market_publishing_detail.rb +1 -0
- data/lib/onix/onix21.rb +26 -24
- data/lib/onix/product.rb +7 -9
- data/lib/onix/product_part.rb +2 -2
- data/lib/onix/{product_supplies_extractor.rb → product_supplies_methods.rb} +3 -3
- data/lib/onix/publisher_representative.rb +11 -0
- data/lib/onix/related_product.rb +2 -2
- data/lib/onix/related_work.rb +2 -1
- data/lib/onix/sender.rb +1 -1
- data/lib/onix/serializer.rb +5 -5
- data/lib/onix/subset.rb +158 -114
- metadata +33 -3
data/lib/onix/onix21.rb
CHANGED
@@ -2,26 +2,28 @@ module ONIX
|
|
2
2
|
module ONIX21
|
3
3
|
class ShortToRef
|
4
4
|
def self.names
|
5
|
-
@shortnames ||= YAML.load(File.open(File.dirname(__FILE__) + "/../../data/onix21/shortnames.yml"))
|
5
|
+
@shortnames ||= YAML.load(File.open(File.dirname(__FILE__) + "/../../data/onix21/shortnames.yml")).freeze
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
9
|
class RefToShort
|
10
10
|
def self.names
|
11
|
-
@refnames ||= ShortToRef.names.invert
|
11
|
+
@refnames ||= ShortToRef.names.invert.freeze
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
class SubsetDSL < ONIX::SubsetDSL
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
class << self
|
17
|
+
def short_to_ref(name)
|
18
|
+
ONIX::ONIX21::ShortToRef.names[name]
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
-
|
21
|
+
def ref_to_short(name)
|
22
|
+
ONIX::ONIX21::RefToShort.names[name]
|
23
|
+
end
|
22
24
|
end
|
23
25
|
|
24
|
-
def
|
26
|
+
def get_class(name)
|
25
27
|
if ONIX::ONIX21.const_defined?(name, false)
|
26
28
|
ONIX::ONIX21.const_get(name)
|
27
29
|
else
|
@@ -34,11 +36,11 @@ module ONIX
|
|
34
36
|
|
35
37
|
class CodeFromYaml < Code
|
36
38
|
def self.hash
|
37
|
-
@hash ||= YAML.load(File.open(File.dirname(__FILE__) + "/../../data/onix21/codelists/codelist-#{self.code_ident}.yml"))[:codelist]
|
39
|
+
@hash ||= YAML.load(File.open(File.dirname(__FILE__) + "/../../data/onix21/codelists/codelist-#{self.code_ident}.yml"))[:codelist].freeze
|
38
40
|
end
|
39
41
|
|
40
42
|
def self.list
|
41
|
-
self.hash.
|
43
|
+
self.hash.keys
|
42
44
|
end
|
43
45
|
|
44
46
|
def self.code_ident
|
@@ -131,8 +133,8 @@ module ONIX
|
|
131
133
|
class Price < SubsetDSL
|
132
134
|
element "PriceTypeCode", :subset, :klass => "PriceType"
|
133
135
|
element "PriceAmount", :float, {
|
134
|
-
|
135
|
-
|
136
|
+
:shortcut => :amount,
|
137
|
+
:parse_lambda => lambda { |v| (v * 100).round }
|
136
138
|
}
|
137
139
|
element "PriceQualifier", :subset, :shortcut => :qualifier
|
138
140
|
element "DiscountCoded", :subset
|
@@ -196,8 +198,8 @@ module ONIX
|
|
196
198
|
element "AvailabilityCode", :text
|
197
199
|
element "ProductAvailability", :text
|
198
200
|
element "OnSaleDate", :text, {
|
199
|
-
|
200
|
-
|
201
|
+
:shortcut => :availability_date,
|
202
|
+
:parse_lambda => lambda { |v| Date.strptime(v, "%Y%m%d") }
|
201
203
|
}
|
202
204
|
elements "Price", :subset
|
203
205
|
|
@@ -232,8 +234,8 @@ module ONIX
|
|
232
234
|
end
|
233
235
|
|
234
236
|
class RelatedProduct < SubsetDSL
|
235
|
-
include
|
236
|
-
include
|
237
|
+
include IdentifiersMethods::Ean
|
238
|
+
include IdentifiersMethods::ProprietaryId
|
237
239
|
|
238
240
|
element "RelationCode", :text, :shortcut => :code
|
239
241
|
elements "ProductIdentifier", :subset, :shortcut => :identifiers
|
@@ -246,17 +248,17 @@ module ONIX
|
|
246
248
|
element "SubjectCode", :text, :shortcut => :code
|
247
249
|
element "SubjectHeadingText", :text, :shortcut => :heading_text
|
248
250
|
element "MainSubjectSchemeIdentifier", :subset, {
|
249
|
-
|
250
|
-
|
251
|
+
:shortcut => :scheme_identifier,
|
252
|
+
:klass => "SubjectSchemeIdentifier"
|
251
253
|
}
|
252
254
|
element "SubjectSchemeName", :text, :shortcut => :scheme_name
|
253
255
|
element "SubjectSchemeVersion", :text, :shortcut => :scheme_version
|
254
256
|
end
|
255
257
|
|
256
258
|
class Product < SubsetDSL
|
257
|
-
include
|
258
|
-
include
|
259
|
-
include
|
259
|
+
include IdentifiersMethods::Ean
|
260
|
+
include IdentifiersMethods::Isbn
|
261
|
+
include IdentifiersMethods::ProprietaryId
|
260
262
|
|
261
263
|
element "RecordReference", :text
|
262
264
|
elements "ProductIdentifier", :subset, :shortcut => :identifiers
|
@@ -281,7 +283,7 @@ module ONIX
|
|
281
283
|
|
282
284
|
elements "OtherText", :subset
|
283
285
|
|
284
|
-
elements "SalesRights", :subset, {:pluralize => false}
|
286
|
+
elements "SalesRights", :subset, { :pluralize => false }
|
285
287
|
elements "NotForSale", :subset
|
286
288
|
|
287
289
|
element "BASICMainSubject", :text
|
@@ -289,7 +291,7 @@ module ONIX
|
|
289
291
|
elements "Subject", :subset
|
290
292
|
|
291
293
|
element "PublishingStatus", :text
|
292
|
-
element "PublicationDate", :text, {:parse_lambda => lambda { |v| Date.strptime(v, "%Y%m%d") }}
|
294
|
+
element "PublicationDate", :text, { :parse_lambda => lambda { |v| Date.strptime(v, "%Y%m%d") } }
|
293
295
|
|
294
296
|
elements "RelatedProduct", :subset, :shortcut => :related
|
295
297
|
|
@@ -440,7 +442,7 @@ module ONIX
|
|
440
442
|
nil
|
441
443
|
end
|
442
444
|
|
443
|
-
include
|
445
|
+
include ProductSuppliesMethods
|
444
446
|
|
445
447
|
# doesn't apply
|
446
448
|
def parts
|
data/lib/onix/product.rb
CHANGED
@@ -3,6 +3,7 @@ require 'onix/helper'
|
|
3
3
|
require 'onix/code'
|
4
4
|
require 'onix/entity'
|
5
5
|
require 'onix/identifier'
|
6
|
+
require 'onix/barcode'
|
6
7
|
require 'onix/descriptive_detail'
|
7
8
|
require 'onix/publishing_detail'
|
8
9
|
require 'onix/collateral_detail'
|
@@ -12,15 +13,15 @@ require 'onix/product_supply'
|
|
12
13
|
require 'onix/content_detail'
|
13
14
|
require 'onix/territory'
|
14
15
|
require 'onix/error'
|
15
|
-
require 'onix/
|
16
|
+
require 'onix/product_supplies_methods'
|
16
17
|
|
17
18
|
module ONIX
|
18
19
|
class Product < SubsetDSL
|
19
20
|
extend Forwardable
|
20
|
-
include
|
21
|
-
include
|
22
|
-
include
|
23
|
-
include
|
21
|
+
include IdentifiersMethods::Ean
|
22
|
+
include IdentifiersMethods::Isbn
|
23
|
+
include IdentifiersMethods::ProprietaryId
|
24
|
+
include ProductSuppliesMethods
|
24
25
|
|
25
26
|
element "RecordReference", :text, :cardinality => 1
|
26
27
|
element "NotificationType", :subset, :cardinality => 1
|
@@ -29,10 +30,7 @@ module ONIX
|
|
29
30
|
elements "RecordSourceIdentifier", :subset, :cardinality => 0..n
|
30
31
|
element "RecordSourceName", :text, :cardinality => 0..1
|
31
32
|
elements "ProductIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
|
32
|
-
|
33
|
-
# elements "Barcode", :subset, :cardinality => 0..n
|
34
|
-
|
35
|
-
|
33
|
+
elements "Barcode", :subset, :cardinality => 0..n
|
36
34
|
element "DescriptiveDetail", :subset, :cardinality => 0..1
|
37
35
|
element "CollateralDetail", :subset, :cardinality => 0..1
|
38
36
|
|
data/lib/onix/product_part.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module ONIX
|
2
2
|
# product part use full Product to provide file protection and file size
|
3
3
|
class ProductPart < SubsetDSL
|
4
|
-
include
|
5
|
-
include
|
4
|
+
include IdentifiersMethods::Ean
|
5
|
+
include IdentifiersMethods::ProprietaryId
|
6
6
|
|
7
7
|
element "PrimaryPart", :bool, :cardinality => 0..1
|
8
8
|
elements "ProductIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module ONIX
|
2
2
|
# flattened supplies extractor
|
3
|
-
module
|
3
|
+
module ProductSuppliesMethods
|
4
4
|
# class must define a product_supplies returning an Array of objects responding to :
|
5
5
|
# - availability_date (Date)
|
6
6
|
# - countries (country code Array)
|
@@ -112,7 +112,7 @@ module ONIX
|
|
112
112
|
|
113
113
|
# merge by territories
|
114
114
|
grouped_territories_supplies = {}
|
115
|
-
grouped_supplies.each do |
|
115
|
+
grouped_supplies.values.each do |supply|
|
116
116
|
fsupply = supply.first
|
117
117
|
pr_key = "#{fsupply[:available]}_#{fsupply[:including_tax]}_#{fsupply[:currency]}"
|
118
118
|
supply.each do |s|
|
@@ -124,7 +124,7 @@ module ONIX
|
|
124
124
|
|
125
125
|
supplies = []
|
126
126
|
|
127
|
-
grouped_territories_supplies.each do |
|
127
|
+
grouped_territories_supplies.values.each do |supply|
|
128
128
|
fsupply = supply.first.first
|
129
129
|
supplies << {:including_tax => fsupply[:including_tax], :currency => fsupply[:currency],
|
130
130
|
:territory => supply.map { |fs| fs.map { |s| s[:territory] } }.flatten.uniq,
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module ONIX
|
2
|
+
class PublisherRepresentative < SubsetDSL
|
3
|
+
element "AgentRole", :subset, :cardinality => 1
|
4
|
+
elements "AgentIdentifier", :subset, :cardinality => 0..n
|
5
|
+
element "AgentName", :text, :cardinality => 0..1
|
6
|
+
elements "TelephoneNumber", :text, :cardinality => 0..n
|
7
|
+
elements "FaxNumber", :text, :cardinality => 0..n
|
8
|
+
elements "EmailAddress", :text, :cardinality => 0..n
|
9
|
+
elements "Website", :subset, :cardinality => 0..n
|
10
|
+
end
|
11
|
+
end
|
data/lib/onix/related_product.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module ONIX
|
2
2
|
class RelatedProduct < SubsetDSL
|
3
|
-
include
|
4
|
-
include
|
3
|
+
include IdentifiersMethods::Ean
|
4
|
+
include IdentifiersMethods::ProprietaryId
|
5
5
|
|
6
6
|
elements "ProductRelationCode", :subset, :shortcut => :codes, :cardinality => 1..n
|
7
7
|
elements "ProductIdentifier", :subset, :shortcut => :identifiers, :cardinality => 1..n
|
data/lib/onix/related_work.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module ONIX
|
2
2
|
class RelatedWork < SubsetDSL
|
3
|
-
include
|
3
|
+
include IdentifiersMethods::Ean
|
4
|
+
|
4
5
|
element "WorkRelationCode", :subset, :shortcut => :code, :cardinality => 0..n
|
5
6
|
elements "WorkIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
|
6
7
|
|
data/lib/onix/sender.rb
CHANGED
@@ -2,7 +2,7 @@ require 'onix/identifier'
|
|
2
2
|
|
3
3
|
module ONIX
|
4
4
|
class Sender < SubsetDSL
|
5
|
-
include
|
5
|
+
include IdentifiersMethods::Gln
|
6
6
|
|
7
7
|
elements "SenderIdentifier", :subset, :shortcut => :identifiers, :cardinality => 0..n
|
8
8
|
element "SenderName", :text, :shortcut => :name, :cardinality => 0..1
|
data/lib/onix/serializer.rb
CHANGED
@@ -18,10 +18,10 @@ module ONIX
|
|
18
18
|
if subset.is_a?(ONIX::ONIXMessage)
|
19
19
|
mod.const_get("Root").serialize(data, subset, "ONIXMessage", level)
|
20
20
|
else
|
21
|
-
if subset.class.included_modules.include?(
|
21
|
+
if subset.class.included_modules.include?(DateMethods)
|
22
22
|
mod.const_get("Date").serialize(data, subset, parent_tag, level)
|
23
23
|
else
|
24
|
-
if subset.class.included_modules.include?(
|
24
|
+
if subset.class.included_modules.include?(CodeMethods)
|
25
25
|
mod.const_get("Code").serialize(data, subset, parent_tag, level)
|
26
26
|
else
|
27
27
|
mod.const_get("Subset").serialize(data, subset, parent_tag, level)
|
@@ -47,8 +47,8 @@ module ONIX
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def self.recursive_serialize(mod, data, subset, parent_tag = nil, level = 0)
|
50
|
-
if subset.
|
51
|
-
subset.
|
50
|
+
if subset.respond_to?(:registered_elements)
|
51
|
+
subset.registered_elements.each do |tag, element|
|
52
52
|
next if element.short
|
53
53
|
val = subset.instance_variable_get(element.to_instance)
|
54
54
|
if val
|
@@ -112,7 +112,7 @@ module ONIX
|
|
112
112
|
code_format = date.format_from_code(date_format.code)
|
113
113
|
|
114
114
|
xml.send(parent_tag, nil) {
|
115
|
-
date.
|
115
|
+
date.registered_elements.each do |tag, element|
|
116
116
|
next if element.short
|
117
117
|
val = date.instance_variable_get(element.to_instance)
|
118
118
|
if val
|