milkfarm-onix 0.8.9 → 0.8.10
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.
- data/CHANGELOG +6 -0
- data/lib/onix.rb +8 -2
- data/lib/onix/discount_coded.rb +17 -0
- data/lib/onix/discount_codeds.rb +73 -0
- data/lib/onix/inflector.rb +24 -0
- data/lib/onix/price.rb +9 -0
- data/lib/onix/product_identifier.rb +5 -1
- data/lib/onix/product_identifiers.rb +19 -12
- data/lib/onix/related_product.rb +4 -3
- data/lib/onix/version.rb +1 -1
- data/lib/onix/work_identifier.rb +1 -7
- data/lib/onix/work_identifiers.rb +74 -0
- data/spec/discount_coded_spec.rb +52 -0
- data/spec/discount_codeds_spec.rb +96 -0
- data/spec/list_writer_spec.rb +7 -7
- data/spec/price_spec.rb +50 -3
- data/spec/product_identifier_spec.rb +8 -2
- data/spec/product_identifiers_spec.rb +4 -1
- data/spec/work_identifier_spec.rb +7 -0
- data/spec/work_identifiers_spec.rb +100 -0
- metadata +14 -4
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
v0.8.10 (25 May 2011)
|
2
|
+
- Add DiscountCoded to Price composite
|
3
|
+
- Add DiscountPercent to Price composite
|
4
|
+
- Add PriceEffectiveFrom, PriceEffectiveUntil to Price composite
|
5
|
+
- Create WorkIdentifiers module
|
6
|
+
|
1
7
|
v0.8.9 (24 March 2011)
|
2
8
|
- Add RelatedProduct composite (PR.23.7 - PR.23.33)
|
3
9
|
- Create ProductIdentifiers module
|
data/lib/onix.rb
CHANGED
@@ -52,14 +52,19 @@ module ONIX
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
+
# helper modules
|
56
|
+
require File.join(File.dirname(__FILE__), "onix", "list_writer")
|
57
|
+
require File.join(File.dirname(__FILE__), "onix", "inflector")
|
58
|
+
require File.join(File.dirname(__FILE__), "onix", "product_identifiers")
|
59
|
+
require File.join(File.dirname(__FILE__), "onix", "work_identifiers")
|
60
|
+
require File.join(File.dirname(__FILE__), "onix", "discount_codeds")
|
61
|
+
|
55
62
|
# core files
|
56
63
|
# - ordering is important, classes need to be defined before any
|
57
64
|
# other class can use them
|
58
|
-
require File.join(File.dirname(__FILE__), "onix", "list_writer")
|
59
65
|
require File.join(File.dirname(__FILE__), "onix", "sender_identifier")
|
60
66
|
require File.join(File.dirname(__FILE__), "onix", "addressee_identifier")
|
61
67
|
require File.join(File.dirname(__FILE__), "onix", "header")
|
62
|
-
require File.join(File.dirname(__FILE__), "onix", "product_identifiers")
|
63
68
|
require File.join(File.dirname(__FILE__), "onix", "product_identifier")
|
64
69
|
require File.join(File.dirname(__FILE__), "onix", "series_identifier")
|
65
70
|
require File.join(File.dirname(__FILE__), "onix", "series")
|
@@ -77,6 +82,7 @@ require File.join(File.dirname(__FILE__), "onix", "other_text")
|
|
77
82
|
require File.join(File.dirname(__FILE__), "onix", "media_file")
|
78
83
|
require File.join(File.dirname(__FILE__), "onix", "sales_restriction")
|
79
84
|
require File.join(File.dirname(__FILE__), "onix", "stock")
|
85
|
+
require File.join(File.dirname(__FILE__), "onix", "discount_coded")
|
80
86
|
require File.join(File.dirname(__FILE__), "onix", "price")
|
81
87
|
require File.join(File.dirname(__FILE__), "onix", "related_product")
|
82
88
|
require File.join(File.dirname(__FILE__), "onix", "supply_detail")
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX
|
4
|
+
class DiscountCoded
|
5
|
+
include ROXML
|
6
|
+
extend ONIX::ListWriter
|
7
|
+
include ONIX::Inflector
|
8
|
+
|
9
|
+
xml_name "DiscountCoded"
|
10
|
+
|
11
|
+
xml_reader :discount_code_type, :from => "DiscountCodeType", :as => Fixnum, :to_xml => ONIX::Formatters.two_digit
|
12
|
+
xml_accessor :discount_code_type_name, :from => "DiscountCodeTypeName"
|
13
|
+
xml_accessor :discount_code, :from => "DiscountCode"
|
14
|
+
list_writer :discount_code_type, :list => 100
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX
|
4
|
+
module DiscountCodeds
|
5
|
+
CODE_TYPES = {:bic => 1, :proprietary => 2, :boeksoort => 3, :german => 4}
|
6
|
+
DEFAULT_ATTRIBUTE = :discount_code_type
|
7
|
+
|
8
|
+
def initialize_discount_codeds(options = {})
|
9
|
+
self.discount_codeds = options[:discount_codeds]
|
10
|
+
end
|
11
|
+
|
12
|
+
def discount_codeds
|
13
|
+
@discount_codeds ||= []
|
14
|
+
end
|
15
|
+
|
16
|
+
# find the DiscountCoded matching a particular type
|
17
|
+
def find_discount_coded(options = {})
|
18
|
+
raise NoMethodError, "Must call initialize_discount_codeds first" unless defined?(@discount_codeds)
|
19
|
+
|
20
|
+
# test find parameters
|
21
|
+
attribute, value = set_type_options(options).first
|
22
|
+
raise ArgumentError, "Find method passed unknown attribute '#{attribute}'" unless ONIX::DiscountCoded.new.attributes.include?(attribute.to_s)
|
23
|
+
|
24
|
+
@discount_codeds.find { |obj| obj.send(attribute) == value }
|
25
|
+
end
|
26
|
+
|
27
|
+
# set the value of a particular DiscountCoded (found by type)
|
28
|
+
# type can be either type code or key from CODE_TYPES
|
29
|
+
def set_discount_coded(type, value)
|
30
|
+
obj = find_discount_coded(type)
|
31
|
+
|
32
|
+
# create a new discount_coded object if necessary
|
33
|
+
if obj.nil?
|
34
|
+
obj = ONIX::DiscountCoded.new(set_type_options(type))
|
35
|
+
@discount_codeds << obj
|
36
|
+
end
|
37
|
+
|
38
|
+
obj.discount_code = value
|
39
|
+
end
|
40
|
+
|
41
|
+
def discount_codeds=(values)
|
42
|
+
values = [values] if values.nil? || values.is_a?(ONIX::DiscountCoded)
|
43
|
+
if values.is_a?(Array)
|
44
|
+
# Empty array
|
45
|
+
@discount_codeds = []
|
46
|
+
# Add any valid value
|
47
|
+
values.each do |value|
|
48
|
+
@discount_codeds << value if value.is_a?(ONIX::DiscountCoded)
|
49
|
+
end
|
50
|
+
else
|
51
|
+
raise ArgumentError, "Invalid DiscountCoded value: #{values.inspect}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def set_type_options(options = {})
|
58
|
+
if options.is_a?(Fixnum)
|
59
|
+
# assume value is DEFAULT_ATTRIBUTE
|
60
|
+
options = {DEFAULT_ATTRIBUTE => options}
|
61
|
+
elsif options.is_a?(String) || options.is_a?(Symbol)
|
62
|
+
# assume value is the key to CODE_TYPES
|
63
|
+
if key = CODE_TYPES[options.to_sym]
|
64
|
+
options = {DEFAULT_ATTRIBUTE => CODE_TYPES[options.to_sym]}
|
65
|
+
else
|
66
|
+
raise ArgumentError, "Unknown key '#{options}'"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
options
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# utf-8
|
2
|
+
|
3
|
+
module ONIX
|
4
|
+
module Inflector
|
5
|
+
|
6
|
+
def initialize(options = {})
|
7
|
+
initialize_attributes(options)
|
8
|
+
end
|
9
|
+
|
10
|
+
def attributes
|
11
|
+
public_methods.map {|meth| meth.match(/^(?!roxml|taguri|=)(.+)=$/) ? $1 : nil }.compact
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def initialize_attributes(options)
|
17
|
+
options.symbolize_keys!
|
18
|
+
attributes.each do |attribute|
|
19
|
+
self.send("#{attribute}=", options[attribute.to_sym]) if options[attribute.to_sym]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
data/lib/onix/price.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
module ONIX
|
4
4
|
class Price
|
5
5
|
include ROXML
|
6
|
+
include ONIX::DiscountCodeds
|
6
7
|
|
7
8
|
xml_name "Price"
|
8
9
|
|
@@ -13,8 +14,16 @@ module ONIX
|
|
13
14
|
xml_accessor :minimum_order_qty, :from => "MinimumOrderQuantity", :as => Fixnum
|
14
15
|
xml_accessor :class_of_trade, :from => "ClassOfTrade"
|
15
16
|
xml_accessor :bic_discount_group_code, :from => "BICDiscountGroupCode"
|
17
|
+
xml_reader :discount_codeds, :from => "DiscountCoded", :as => [ONIX::DiscountCoded]
|
18
|
+
xml_accessor :discount_percent, :from => "DiscountPercent", :as => BigDecimal, :to_xml => ONIX::Formatters.decimal
|
16
19
|
xml_accessor :price_status, :from => "PriceStatus", :as => Fixnum, :to_xml => ONIX::Formatters.two_digit
|
17
20
|
xml_accessor :price_amount, :from => "PriceAmount", :as => BigDecimal, :to_xml => ONIX::Formatters.decimal
|
18
21
|
xml_accessor :currency_code, :from => "CurrencyCode"
|
22
|
+
xml_accessor :price_effective_from, :from => "PriceEffectiveFrom", :to_xml => ONIX::Formatters.yyyymmdd
|
23
|
+
xml_accessor :price_effective_until, :from => "PriceEffectiveUntil", :to_xml => ONIX::Formatters.yyyymmdd
|
24
|
+
|
25
|
+
def initialize(options = {})
|
26
|
+
initialize_discount_codeds(options) # @discount_codeds array
|
27
|
+
end
|
19
28
|
end
|
20
29
|
end
|
@@ -3,10 +3,14 @@
|
|
3
3
|
module ONIX
|
4
4
|
class ProductIdentifier
|
5
5
|
include ROXML
|
6
|
+
extend ONIX::ListWriter
|
7
|
+
include ONIX::Inflector
|
6
8
|
|
7
9
|
xml_name "ProductIdentifier"
|
8
10
|
|
9
|
-
|
11
|
+
xml_reader :product_id_type, :from => "ProductIDType", :as => Fixnum, :to_xml => ONIX::Formatters.two_digit
|
10
12
|
xml_accessor :id_value, :from => "IDValue"
|
13
|
+
list_writer :product_id_type, :list => 5
|
14
|
+
|
11
15
|
end
|
12
16
|
end
|
@@ -5,18 +5,17 @@ module ONIX
|
|
5
5
|
ACCESSOR_METHODS = {:proprietary_id => 1, :ean => 3, :isbn10 => 2, :isbn13 => 15, :isbn => 15, :lccn => 13}
|
6
6
|
|
7
7
|
def initialize_product_identifiers(options)
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
8
|
+
self.product_identifiers = options[:product_identifiers]
|
9
|
+
# To initialize accessor methods, class in which this module is included
|
10
|
+
# must also include Inflector and call initialize_attributes
|
12
11
|
end
|
13
12
|
|
14
13
|
ACCESSOR_METHODS.each do |name, digit|
|
15
14
|
define_method(name) do
|
16
|
-
|
15
|
+
find(digit).andand.id_value
|
17
16
|
end
|
18
17
|
define_method("#{name}=") do |value|
|
19
|
-
|
18
|
+
set(digit, value)
|
20
19
|
end
|
21
20
|
end
|
22
21
|
|
@@ -41,18 +40,26 @@ module ONIX
|
|
41
40
|
end
|
42
41
|
|
43
42
|
# find the ProductIdentifier matching a particular type
|
44
|
-
def
|
45
|
-
|
43
|
+
def find(options = {})
|
44
|
+
raise NoMethodError, "Must call initialize_product_identifiers first" unless defined?(@product_identifiers)
|
45
|
+
|
46
|
+
# use default find 'product_id_type' if implied
|
47
|
+
options = {:product_id_type => options} unless options.is_a?(Hash)
|
48
|
+
|
49
|
+
# test find parameters
|
50
|
+
attribute, value = options.first
|
51
|
+
raise ArgumentError, "Find method passed unknown attribute '#{attribute}'" unless ONIX::ProductIdentifier.new.attributes.include?(attribute.to_s)
|
52
|
+
|
53
|
+
@product_identifiers.find { |obj| obj.send(attribute) == value }
|
46
54
|
end
|
47
55
|
|
48
56
|
# set the value of a particular ProductIdentifier (found by type)
|
49
|
-
def
|
50
|
-
obj =
|
57
|
+
def set(type, value)
|
58
|
+
obj = find(type)
|
51
59
|
|
52
60
|
# create a new product identifier object if we necessary
|
53
61
|
if obj.nil?
|
54
|
-
obj = ONIX::ProductIdentifier.new
|
55
|
-
obj.product_id_type = type
|
62
|
+
obj = ONIX::ProductIdentifier.new(:product_id_type => type)
|
56
63
|
@product_identifiers << obj
|
57
64
|
end
|
58
65
|
|
data/lib/onix/related_product.rb
CHANGED
@@ -5,6 +5,7 @@ module ONIX
|
|
5
5
|
include ROXML
|
6
6
|
include ONIX::ProductIdentifiers
|
7
7
|
extend ONIX::ListWriter
|
8
|
+
include ONIX::Inflector
|
8
9
|
|
9
10
|
xml_name "RelatedProduct"
|
10
11
|
|
@@ -13,9 +14,9 @@ module ONIX
|
|
13
14
|
list_writer :relation_code, :list => 51
|
14
15
|
|
15
16
|
def initialize(options = {})
|
16
|
-
|
17
|
-
|
18
|
-
|
17
|
+
# Must initialize arrays prior to attributes
|
18
|
+
initialize_product_identifiers(options) # @product_identifiers array
|
19
|
+
initialize_attributes(options)
|
19
20
|
end
|
20
21
|
|
21
22
|
end
|
data/lib/onix/version.rb
CHANGED
data/lib/onix/work_identifier.rb
CHANGED
@@ -4,6 +4,7 @@ module ONIX
|
|
4
4
|
class WorkIdentifier
|
5
5
|
include ROXML
|
6
6
|
extend ONIX::ListWriter
|
7
|
+
include ONIX::Inflector
|
7
8
|
|
8
9
|
xml_name "WorkIdentifier"
|
9
10
|
|
@@ -12,12 +13,5 @@ module ONIX
|
|
12
13
|
xml_accessor :id_value, :from => "IDValue"
|
13
14
|
list_writer :work_id_type, :list => 16
|
14
15
|
|
15
|
-
def initialize(options = {})
|
16
|
-
options.symbolize_keys!
|
17
|
-
self.work_id_type = options[:work_id_type]
|
18
|
-
@id_type_name = options[:id_type_name]
|
19
|
-
@id_value = options[:id_value]
|
20
|
-
end
|
21
|
-
|
22
16
|
end
|
23
17
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX
|
4
|
+
module WorkIdentifiers
|
5
|
+
ID_TYPES = {:proprietary_id => 1, :isbn10 => 2, :isbn13 => 15, :isbn => 15}
|
6
|
+
|
7
|
+
def initialize_work_identifiers(options = {})
|
8
|
+
self.work_identifiers = options[:work_identifiers]
|
9
|
+
# To initialize accessor methods, class in which this module is included
|
10
|
+
# must also include Inflector and call initialize_attributes
|
11
|
+
end
|
12
|
+
|
13
|
+
def work_identifiers
|
14
|
+
@work_identifiers ||= []
|
15
|
+
end
|
16
|
+
|
17
|
+
# find the WorkIdentifier matching a particular type
|
18
|
+
def find_work_identifier(options = {})
|
19
|
+
raise NoMethodError, "Must call initialize_work_identifiers first" unless defined?(@work_identifiers)
|
20
|
+
|
21
|
+
# test find parameters
|
22
|
+
attribute, value = set_type_options(options).first
|
23
|
+
raise ArgumentError, "Find method passed unknown attribute '#{attribute}'" unless ONIX::WorkIdentifier.new.attributes.include?(attribute.to_s)
|
24
|
+
|
25
|
+
@work_identifiers.find { |obj| obj.send(attribute) == value }
|
26
|
+
end
|
27
|
+
|
28
|
+
# set the value of a particular WorkIdentifier (found by type)
|
29
|
+
# type can be either type code or key from ID_TYPES
|
30
|
+
def set_work_identifier(type, value)
|
31
|
+
obj = find_work_identifier(type)
|
32
|
+
|
33
|
+
# create a new work identifier object if necessary
|
34
|
+
if obj.nil?
|
35
|
+
obj = ONIX::WorkIdentifier.new(set_type_options(type))
|
36
|
+
@work_identifiers << obj
|
37
|
+
end
|
38
|
+
|
39
|
+
obj.id_value = value
|
40
|
+
end
|
41
|
+
|
42
|
+
def work_identifiers=(values)
|
43
|
+
values = [values] if values.nil? || values.is_a?(ONIX::WorkIdentifier)
|
44
|
+
if values.is_a?(Array)
|
45
|
+
# Empty array
|
46
|
+
@work_identifiers = []
|
47
|
+
# Add any valid value
|
48
|
+
values.each do |value|
|
49
|
+
@work_identifiers << value if value.is_a?(ONIX::WorkIdentifier)
|
50
|
+
end
|
51
|
+
else
|
52
|
+
raise ArgumentError, "Invalid WorkIdentifier value: #{values.inspect}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def set_type_options(options = {})
|
59
|
+
if options.is_a?(Fixnum)
|
60
|
+
# assume value is 'work_id_type'
|
61
|
+
options = {:work_id_type => options}
|
62
|
+
elsif options.is_a?(String) || options.is_a?(Symbol)
|
63
|
+
# assume value is the key to ID_TYPES
|
64
|
+
if key = ID_TYPES[options.to_sym]
|
65
|
+
options = {:work_id_type => ID_TYPES[options.to_sym]}
|
66
|
+
else
|
67
|
+
raise ArgumentError, "Unknown key '#{options}'"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
options
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
4
|
+
|
5
|
+
describe ONIX::DiscountCoded do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
data_path = File.join(File.dirname(__FILE__), "..", "data")
|
9
|
+
file1 = File.join(data_path, "discount_coded.xml")
|
10
|
+
@doc = Nokogiri::XML::Document.parse(File.read(file1))
|
11
|
+
@root = @doc.root
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should correctly convert to a string" do
|
15
|
+
t = ONIX::DiscountCoded.from_xml(@root.to_s)
|
16
|
+
t.to_xml.to_s[0,15].should eql("<DiscountCoded>")
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should provide read access to first level attributes" do
|
20
|
+
t = ONIX::DiscountCoded.from_xml(@root.to_s)
|
21
|
+
t.discount_code_type.should eql(2)
|
22
|
+
t.discount_code_type_name.should eql("Proprietary Scheme")
|
23
|
+
t.discount_code.should eql("ABC123")
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should provide write access to first level attributes" do
|
27
|
+
t = ONIX::DiscountCoded.new
|
28
|
+
|
29
|
+
t.discount_code_type = 1
|
30
|
+
t.to_xml.to_s.include?("<DiscountCodeType>01</DiscountCodeType>").should be_true
|
31
|
+
|
32
|
+
t.discount_code_type_name = "BIC Scheme"
|
33
|
+
t.to_xml.to_s.include?("<DiscountCodeTypeName>BIC Scheme</DiscountCodeTypeName>").should be_true
|
34
|
+
|
35
|
+
t.discount_code = "ABC123"
|
36
|
+
t.to_xml.to_s.include?("<DiscountCode>ABC123</DiscountCode>").should be_true
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should raise error writing discount_code_type value not in list" do
|
40
|
+
t = ONIX::DiscountCoded.new
|
41
|
+
lambda {t.discount_code_type = 999}.should raise_error
|
42
|
+
lambda {ONIX::DiscountCoded.new(:discount_code_type => 999)}.should raise_error
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should properly initialize attributes when calling new" do
|
46
|
+
t = ONIX::DiscountCoded.new(:discount_code_type => 1, :discount_code => "value", :discount_code_type_name => "name")
|
47
|
+
t.discount_code_type.should eql(1)
|
48
|
+
t.discount_code.should eql("value")
|
49
|
+
t.discount_code_type_name.should eql("name")
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
4
|
+
|
5
|
+
describe ONIX::DiscountCodeds do
|
6
|
+
|
7
|
+
module ONIX
|
8
|
+
class FakeDiscountEntity
|
9
|
+
include ROXML
|
10
|
+
include ONIX::DiscountCodeds
|
11
|
+
|
12
|
+
xml_name "FakeDiscountEntity"
|
13
|
+
xml_reader :discount_codeds, :from => "DiscountCoded", :as => [ONIX::DiscountCoded]
|
14
|
+
|
15
|
+
def initialize(options = {})
|
16
|
+
initialize_discount_codeds(options) # @discount_codeds array
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
before :each do
|
22
|
+
@fake = ONIX::FakeDiscountEntity.new(:proprietary => 123456)
|
23
|
+
data_path = File.join(File.dirname(__FILE__),"..","data")
|
24
|
+
file = File.join(data_path, "fake_entity.xml")
|
25
|
+
@doc = Nokogiri::XML::Document.parse(File.read(file))
|
26
|
+
@root = @doc.root
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should instantiate discount_codeds array" do
|
30
|
+
@fake.discount_codeds.should be_a(Array)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should provide read access to discount_codeds" do
|
34
|
+
fe = ONIX::FakeDiscountEntity.from_xml(@root.to_s)
|
35
|
+
wid = fe.find_discount_coded(2)
|
36
|
+
wid.discount_code.should eql("PROPRIETARY_CODE")
|
37
|
+
wid = fe.find_discount_coded(:proprietary)
|
38
|
+
wid.discount_code.should eql("PROPRIETARY_CODE")
|
39
|
+
wid = fe.find_discount_coded(:bic)
|
40
|
+
wid.discount_code.should eql("BIC_CODE")
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should provide write access to discount_codeds by discount_code_type" do
|
44
|
+
discount_code = "123456"
|
45
|
+
{:bic => 1, :proprietary => 2, :boeksoort => 3, :german => 4}.each do |key, discount_code_type|
|
46
|
+
fe = ONIX::FakeDiscountEntity.new
|
47
|
+
fe.set_discount_coded(discount_code_type, discount_code)
|
48
|
+
fe.to_xml.to_s.include?("<DiscountCodeType>#{sprintf('%02d', discount_code_type)}</DiscountCodeType>").should be_true
|
49
|
+
fe.to_xml.to_s.include?("<DiscountCode>#{discount_code}</DiscountCode>").should be_true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should provide write access to discount_codeds by key" do
|
54
|
+
discount_code = "123456"
|
55
|
+
{:bic => 1, :proprietary => 2, :boeksoort => 3, :german => 4}.each do |key, discount_code_type|
|
56
|
+
fe = ONIX::FakeDiscountEntity.new
|
57
|
+
fe.set_discount_coded(key, discount_code)
|
58
|
+
fe.to_xml.to_s.include?("<DiscountCodeType>#{sprintf('%02d', discount_code_type)}</DiscountCodeType>").should be_true
|
59
|
+
fe.to_xml.to_s.include?("<DiscountCode>#{discount_code}</DiscountCode>").should be_true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should fail to write discount_coded with invalid discount_code_type" do
|
64
|
+
discount_code = "123456"
|
65
|
+
discount_code_type = 99
|
66
|
+
fe = ONIX::FakeDiscountEntity.new
|
67
|
+
lambda {fe.set_discount_coded(discount_code_type, discount_code)}.should raise_error(ArgumentError)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should fail to write discount_coded with invalid key" do
|
71
|
+
discount_code = "123456"
|
72
|
+
key = "bad_key"
|
73
|
+
fe = ONIX::FakeDiscountEntity.new
|
74
|
+
lambda {fe.set_discount_coded(key, discount_code)}.should raise_error(ArgumentError)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should provide write access to discount_codeds array" do
|
78
|
+
id = ONIX::DiscountCoded.new
|
79
|
+
id.discount_code_type = 1
|
80
|
+
id.discount_code = "123456"
|
81
|
+
fe = ONIX::FakeDiscountEntity.new(:discount_codeds => id)
|
82
|
+
|
83
|
+
fe.to_xml.to_s.include?("<DiscountCoded>").should be_true
|
84
|
+
fe.to_xml.to_s.include?("<DiscountCodeType>01</DiscountCodeType>").should be_true
|
85
|
+
fe.to_xml.to_s.include?("<DiscountCode>123456</DiscountCode>").should be_true
|
86
|
+
|
87
|
+
id = ONIX::DiscountCoded.new
|
88
|
+
id.discount_code_type = 2
|
89
|
+
id.discount_code = "987654"
|
90
|
+
fe.discount_codeds << id
|
91
|
+
|
92
|
+
fe.to_xml.to_s.include?("<DiscountCodeType>02</DiscountCodeType>").should be_true
|
93
|
+
fe.to_xml.to_s.include?("<DiscountCode>987654</DiscountCode>").should be_true
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
data/spec/list_writer_spec.rb
CHANGED
@@ -5,11 +5,11 @@ require File.dirname(__FILE__) + '/spec_helper.rb'
|
|
5
5
|
describe ONIX::ListWriter do
|
6
6
|
|
7
7
|
module ONIX
|
8
|
-
class
|
8
|
+
class FakeListEntity
|
9
9
|
include ROXML
|
10
10
|
extend ONIX::ListWriter
|
11
11
|
|
12
|
-
xml_name "
|
12
|
+
xml_name "FakeListEntity"
|
13
13
|
xml_reader :series_id_type, :from => "SeriesIDType", :as => Fixnum, :to_xml => ONIX::Formatters.two_digit
|
14
14
|
list_writer :series_id_type, :list => 13
|
15
15
|
|
@@ -21,26 +21,26 @@ describe ONIX::ListWriter do
|
|
21
21
|
|
22
22
|
before :each do
|
23
23
|
data_path = File.join(File.dirname(__FILE__),"..","data")
|
24
|
-
file1 = File.join(data_path, "
|
24
|
+
file1 = File.join(data_path, "fake_entity.xml")
|
25
25
|
@doc = Nokogiri::XML::Document.parse(File.read(file1))
|
26
26
|
@root = @doc.root
|
27
27
|
end
|
28
28
|
|
29
29
|
it "should provide read access to first level attribute" do
|
30
|
-
fake = ONIX::
|
30
|
+
fake = ONIX::FakeListEntity.from_xml(@root.to_s)
|
31
31
|
fake.series_id_type.should eql(1)
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should provide write access to first level attribute" do
|
35
|
-
fake = ONIX::
|
35
|
+
fake = ONIX::FakeListEntity.new(:series_id_type => 3)
|
36
36
|
fake.series_id_type.should eql(3)
|
37
37
|
fake.to_xml.to_s.include?("<SeriesIDType>03</SeriesIDType>").should be_true
|
38
38
|
end
|
39
39
|
|
40
40
|
it "should raise error writing value not in list" do
|
41
|
-
fake = ONIX::
|
41
|
+
fake = ONIX::FakeListEntity.new
|
42
42
|
lambda {fake.series_id_type = 100}.should raise_error
|
43
|
-
lambda {ONIX::
|
43
|
+
lambda {ONIX::FakeListEntity.new(:series_id_type => 100)}.should raise_error
|
44
44
|
end
|
45
45
|
|
46
46
|
end
|
data/spec/price_spec.rb
CHANGED
@@ -6,9 +6,9 @@ describe ONIX::Price do
|
|
6
6
|
|
7
7
|
before(:each) do
|
8
8
|
data_path = File.join(File.dirname(__FILE__),"..","data")
|
9
|
-
file1
|
10
|
-
@doc
|
11
|
-
@root
|
9
|
+
file1 = File.join(data_path, "price.xml")
|
10
|
+
@doc = Nokogiri::XML::Document.parse(File.read(file1))
|
11
|
+
@root = @doc.root
|
12
12
|
end
|
13
13
|
|
14
14
|
it "should correctly convert to a string" do
|
@@ -20,7 +20,27 @@ describe ONIX::Price do
|
|
20
20
|
p = ONIX::Price.from_xml(@root.to_s)
|
21
21
|
|
22
22
|
p.price_type_code.should eql(2)
|
23
|
+
p.discount_percent.should eql(BigDecimal.new("45"))
|
23
24
|
p.price_amount.should eql(BigDecimal.new("7.5"))
|
25
|
+
p.price_effective_from.should eql("19990101")
|
26
|
+
p.price_effective_until.should eql("20001231")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should provide read access to discount_codeds" do
|
30
|
+
p = ONIX::Price.from_xml(@root.to_s)
|
31
|
+
|
32
|
+
d = p.find_discount_coded(1)
|
33
|
+
d.discount_code_type_name.should eql("britishco")
|
34
|
+
d.discount_code.should eql("999ZZZ")
|
35
|
+
|
36
|
+
d = p.find_discount_coded(:discount_code_type_name => 'bakertaylor')
|
37
|
+
d.discount_code_type.should eql(2)
|
38
|
+
d.discount_code_type_name.should eql("bakertaylor")
|
39
|
+
d.discount_code.should eql("ABC123")
|
40
|
+
|
41
|
+
d = p.find_discount_coded(:proprietary) # will retrieve first proprietary discount code
|
42
|
+
d.discount_code_type_name.should eql("ingram")
|
43
|
+
d.discount_code.should eql("XYZ987")
|
24
44
|
end
|
25
45
|
|
26
46
|
it "should provide write access to first level attributes" do
|
@@ -29,9 +49,36 @@ describe ONIX::Price do
|
|
29
49
|
p.price_type_code = 1
|
30
50
|
p.to_xml.to_s.include?("<PriceTypeCode>01</PriceTypeCode>").should be_true
|
31
51
|
|
52
|
+
p.discount_percent = BigDecimal.new("50")
|
53
|
+
p.to_xml.to_s.include?("<DiscountPercent>50.0</DiscountPercent>").should be_true
|
54
|
+
|
32
55
|
p.price_amount = BigDecimal.new("7.5")
|
33
56
|
p.to_xml.to_s.include?("<PriceAmount>7.5</PriceAmount>").should be_true
|
34
57
|
|
58
|
+
p.price_effective_from = Date.civil(1999,1,1)
|
59
|
+
p.to_xml.to_s.include?("<PriceEffectiveFrom>19990101</PriceEffectiveFrom>").should be_true
|
60
|
+
|
61
|
+
p.price_effective_until = Date.civil(2000,12,31)
|
62
|
+
p.to_xml.to_s.include?("<PriceEffectiveUntil>20001231</PriceEffectiveUntil>").should be_true
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should provide write access to discount_codeds" do
|
66
|
+
d1 = ONIX::DiscountCoded.new(:discount_code_type => 1, :discount_code => "value1", :discount_code_type_name => "name1")
|
67
|
+
d2 = ONIX::DiscountCoded.new(:discount_code_type => 2, :discount_code => "value2", :discount_code_type_name => "name2")
|
68
|
+
d3 = ONIX::DiscountCoded.new(:discount_code_type => 3, :discount_code => "value3", :discount_code_type_name => "name3")
|
69
|
+
# p = ONIX::Price.new(:discount_codeds => [d1,d2])
|
70
|
+
p = ONIX::Price.new
|
71
|
+
p.discount_codeds = [d1, d2]
|
72
|
+
p.discount_codeds << d3
|
73
|
+
p.discount_codeds.size.should eql(3)
|
74
|
+
(1..p.discount_codeds.size).to_a.each do |i|
|
75
|
+
name = "name#{i}"
|
76
|
+
value = "value#{i}"
|
77
|
+
t = p.find_discount_coded(:discount_code_type_name => name)
|
78
|
+
t.discount_code_type.should eql(i)
|
79
|
+
t.discount_code.should eql(value)
|
80
|
+
t.discount_code_type_name.should eql(name)
|
81
|
+
end
|
35
82
|
end
|
36
83
|
|
37
84
|
end
|
@@ -24,14 +24,20 @@ describe ONIX::ProductIdentifier do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it "should provide write access to first level attributes" do
|
27
|
-
id = ONIX::ProductIdentifier.new
|
27
|
+
id = ONIX::ProductIdentifier.new(:product_id_type => 1, :id_value => "TESTING")
|
28
|
+
id.to_xml.to_s.include?("<ProductIDType>01</ProductIDType>").should be_true
|
29
|
+
id.to_xml.to_s.include?("<IDValue>TESTING</IDValue>").should be_true
|
28
30
|
|
29
31
|
id.product_id_type = 2
|
30
32
|
id.to_xml.to_s.include?("<ProductIDType>02</ProductIDType>").should be_true
|
31
33
|
|
32
34
|
id.id_value = "James"
|
33
35
|
id.to_xml.to_s.include?("<IDValue>James</IDValue>").should be_true
|
34
|
-
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should raise error when writing invalid product_id_type" do
|
39
|
+
id = ONIX::ProductIdentifier.new
|
40
|
+
lambda {id.product_id_type = 999}.should raise_error
|
35
41
|
end
|
36
42
|
|
37
43
|
end
|
@@ -8,12 +8,15 @@ describe ONIX::ProductIdentifiers do
|
|
8
8
|
class FakeEntity
|
9
9
|
include ROXML
|
10
10
|
include ONIX::ProductIdentifiers
|
11
|
+
include ONIX::Inflector
|
11
12
|
|
12
13
|
xml_name "FakeEntity"
|
13
14
|
xml_reader :product_identifiers, :from => "ProductIdentifier", :as => [ONIX::ProductIdentifier]
|
14
15
|
|
15
16
|
def initialize(options = {})
|
16
|
-
|
17
|
+
# Must initialize arrays prior to attributes
|
18
|
+
initialize_product_identifiers(options) # @product_identifiers array
|
19
|
+
initialize_attributes(options)
|
17
20
|
end
|
18
21
|
end
|
19
22
|
end
|
@@ -41,5 +41,12 @@ describe ONIX::WorkIdentifier do
|
|
41
41
|
lambda {t.work_id_type = 999}.should raise_error
|
42
42
|
lambda {ONIX::WorkIdentifier.new(:work_id_type => 999)}.should raise_error
|
43
43
|
end
|
44
|
+
|
45
|
+
it "should properly initialize attributes when calling new" do
|
46
|
+
t = ONIX::WorkIdentifier.new(:work_id_type => 1, :id_value => "value", :id_type_name => "name")
|
47
|
+
t.work_id_type.should eql(1)
|
48
|
+
t.id_value.should eql("value")
|
49
|
+
t.id_type_name.should eql("name")
|
50
|
+
end
|
44
51
|
|
45
52
|
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
4
|
+
|
5
|
+
describe ONIX::WorkIdentifiers do
|
6
|
+
|
7
|
+
module ONIX
|
8
|
+
class FakeWorkEntity
|
9
|
+
include ROXML
|
10
|
+
include ONIX::WorkIdentifiers
|
11
|
+
|
12
|
+
xml_name "FakeWorkEntity"
|
13
|
+
xml_reader :work_identifiers, :from => "WorkIdentifier", :as => [ONIX::WorkIdentifier]
|
14
|
+
|
15
|
+
def initialize(options = {})
|
16
|
+
initialize_work_identifiers(options) # @work_identifiers array
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
before :each do
|
22
|
+
@fake = ONIX::FakeWorkEntity.new(:isbn => 123456)
|
23
|
+
data_path = File.join(File.dirname(__FILE__),"..","data")
|
24
|
+
file = File.join(data_path, "fake_entity.xml")
|
25
|
+
@doc = Nokogiri::XML::Document.parse(File.read(file))
|
26
|
+
@root = @doc.root
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should instantiate work identifiers array" do
|
30
|
+
@fake.work_identifiers.should be_a(Array)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should provide read access to work identifiers" do
|
34
|
+
fe = ONIX::FakeWorkEntity.from_xml(@root.to_s)
|
35
|
+
wid = fe.find_work_identifier(1)
|
36
|
+
wid.id_value.should eql("WD_PROPRIETARY_ID")
|
37
|
+
wid = fe.find_work_identifier(:proprietary_id)
|
38
|
+
wid.id_value.should eql("WD_PROPRIETARY_ID")
|
39
|
+
wid = fe.find_work_identifier(:isbn10)
|
40
|
+
wid.id_value.should eql("WD_ISBN10")
|
41
|
+
wid = fe.find_work_identifier(:isbn13)
|
42
|
+
wid.id_value.should eql("WD_ISBN13")
|
43
|
+
wid = fe.find_work_identifier(:isbn)
|
44
|
+
wid.id_value.should eql("WD_ISBN13")
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should provide write access to work identifiers by work_id_type" do
|
48
|
+
id_value = "123456"
|
49
|
+
{:proprietary_id => 1, :isbn10 => 2, :isbn13 => 15, :isbn => 15}.each do |key, work_id_type|
|
50
|
+
fe = ONIX::FakeWorkEntity.new
|
51
|
+
fe.set_work_identifier(work_id_type, id_value)
|
52
|
+
fe.to_xml.to_s.include?("<WorkIDType>#{sprintf('%02d', work_id_type)}</WorkIDType>").should be_true
|
53
|
+
fe.to_xml.to_s.include?("<IDValue>#{id_value}</IDValue>").should be_true
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should provide write access to work identifiers by key" do
|
58
|
+
id_value = "123456"
|
59
|
+
{:proprietary_id => 1, :isbn10 => 2, :isbn13 => 15, :isbn => 15}.each do |key, work_id_type|
|
60
|
+
fe = ONIX::FakeWorkEntity.new
|
61
|
+
fe.set_work_identifier(key, id_value)
|
62
|
+
fe.to_xml.to_s.include?("<WorkIDType>#{sprintf('%02d', work_id_type)}</WorkIDType>").should be_true
|
63
|
+
fe.to_xml.to_s.include?("<IDValue>#{id_value}</IDValue>").should be_true
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should fail to write work identifier with invalid work_id_type" do
|
68
|
+
id_value = "123456"
|
69
|
+
work_id_type = 99
|
70
|
+
fe = ONIX::FakeWorkEntity.new
|
71
|
+
lambda {fe.set_work_identifier(work_id_type, id_value)}.should raise_error(ArgumentError)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should fail to write work identifier with invalid key" do
|
75
|
+
id_value = "123456"
|
76
|
+
key = "bad_key"
|
77
|
+
fe = ONIX::FakeWorkEntity.new
|
78
|
+
lambda {fe.set_work_identifier(key, id_value)}.should raise_error(ArgumentError)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should provide write access to work_identifiers array" do
|
82
|
+
id = ONIX::WorkIdentifier.new
|
83
|
+
id.work_id_type = 1
|
84
|
+
id.id_value = "123456"
|
85
|
+
fe = ONIX::FakeWorkEntity.new(:work_identifiers => id)
|
86
|
+
|
87
|
+
fe.to_xml.to_s.include?("<WorkIdentifier>").should be_true
|
88
|
+
fe.to_xml.to_s.include?("<WorkIDType>01</WorkIDType>").should be_true
|
89
|
+
fe.to_xml.to_s.include?("<IDValue>123456</IDValue>").should be_true
|
90
|
+
|
91
|
+
id = ONIX::WorkIdentifier.new
|
92
|
+
id.work_id_type = 2
|
93
|
+
id.id_value = "987654"
|
94
|
+
fe.work_identifiers << id
|
95
|
+
|
96
|
+
fe.to_xml.to_s.include?("<WorkIDType>02</WorkIDType>").should be_true
|
97
|
+
fe.to_xml.to_s.include?("<IDValue>987654</IDValue>").should be_true
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: milkfarm-onix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 43
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 8
|
9
|
-
-
|
10
|
-
version: 0.8.
|
9
|
+
- 10
|
10
|
+
version: 0.8.10
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- James Healy
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-
|
19
|
+
date: 2011-05-25 00:00:00 -07:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -123,8 +123,11 @@ files:
|
|
123
123
|
- lib/onix/audience_range.rb
|
124
124
|
- lib/onix/code_list_extractor.rb
|
125
125
|
- lib/onix/contributor.rb
|
126
|
+
- lib/onix/discount_coded.rb
|
127
|
+
- lib/onix/discount_codeds.rb
|
126
128
|
- lib/onix/header.rb
|
127
129
|
- lib/onix/imprint.rb
|
130
|
+
- lib/onix/inflector.rb
|
128
131
|
- lib/onix/language.rb
|
129
132
|
- lib/onix/list_writer.rb
|
130
133
|
- lib/onix/lists.rb
|
@@ -154,6 +157,7 @@ files:
|
|
154
157
|
- lib/onix/version.rb
|
155
158
|
- lib/onix/website.rb
|
156
159
|
- lib/onix/work_identifier.rb
|
160
|
+
- lib/onix/work_identifiers.rb
|
157
161
|
- lib/onix/writer.rb
|
158
162
|
- lib/onix.rb
|
159
163
|
- support/codes/001.tsv
|
@@ -335,6 +339,8 @@ files:
|
|
335
339
|
- spec/apa_product_spec.rb
|
336
340
|
- spec/audience_range_spec.rb
|
337
341
|
- spec/contributor_spec.rb
|
342
|
+
- spec/discount_coded_spec.rb
|
343
|
+
- spec/discount_codeds_spec.rb
|
338
344
|
- spec/header_spec.rb
|
339
345
|
- spec/imprint_spec.rb
|
340
346
|
- spec/language_spec.rb
|
@@ -365,6 +371,7 @@ files:
|
|
365
371
|
- spec/title_spec.rb
|
366
372
|
- spec/website_spec.rb
|
367
373
|
- spec/work_identifier_spec.rb
|
374
|
+
- spec/work_identifiers_spec.rb
|
368
375
|
- spec/writer_spec.rb
|
369
376
|
has_rdoc: true
|
370
377
|
homepage: http://github.com/milkfarm/onix
|
@@ -406,6 +413,8 @@ test_files:
|
|
406
413
|
- spec/apa_product_spec.rb
|
407
414
|
- spec/audience_range_spec.rb
|
408
415
|
- spec/contributor_spec.rb
|
416
|
+
- spec/discount_coded_spec.rb
|
417
|
+
- spec/discount_codeds_spec.rb
|
409
418
|
- spec/header_spec.rb
|
410
419
|
- spec/imprint_spec.rb
|
411
420
|
- spec/language_spec.rb
|
@@ -436,4 +445,5 @@ test_files:
|
|
436
445
|
- spec/title_spec.rb
|
437
446
|
- spec/website_spec.rb
|
438
447
|
- spec/work_identifier_spec.rb
|
448
|
+
- spec/work_identifiers_spec.rb
|
439
449
|
- spec/writer_spec.rb
|