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