milkfarm-onix 0.8.8 → 0.8.9
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +6 -0
- data/lib/onix/list_writer.rb +21 -0
- data/lib/onix/product.rb +4 -10
- data/lib/onix/product_identifiers.rb +63 -0
- data/lib/onix/related_product.rb +22 -0
- data/lib/onix/set.rb +12 -60
- data/lib/onix/sl_product.rb +18 -3
- data/lib/onix/version.rb +1 -1
- data/lib/onix/work_identifier.rb +2 -7
- data/lib/onix.rb +3 -0
- data/spec/list_writer_spec.rb +46 -0
- data/spec/product_identifiers_spec.rb +71 -0
- data/spec/related_product_spec.rb +45 -0
- data/spec/set_spec.rb +4 -4
- data/spec/sl_product_spec.rb +63 -28
- data/spec/work_identifier_spec.rb +6 -0
- metadata +13 -4
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
v0.8.9 (24 March 2011)
|
2
|
+
- Add RelatedProduct composite (PR.23.7 - PR.23.33)
|
3
|
+
- Create ProductIdentifiers module
|
4
|
+
- Create ListWriter module
|
5
|
+
- WARNING: Set methods product_identifier, product_identifier_set removed
|
6
|
+
|
1
7
|
v0.8.8 (15 March 2011)
|
2
8
|
- Format EpubType value as 3-digit, padded number
|
3
9
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX
|
4
|
+
module ListWriter
|
5
|
+
|
6
|
+
def list_writer(name, options = {})
|
7
|
+
options.symbolize_keys!
|
8
|
+
unless options.is_a?(Hash) && options[:list].is_a?(Integer)
|
9
|
+
raise ArgumentError, "Must specify code list number as ':list => Integer'"
|
10
|
+
end
|
11
|
+
define_method("#{name}=") do |value|
|
12
|
+
if value.nil? || ONIX::Lists.list(options[:list]).keys.include?(value)
|
13
|
+
self.instance_variable_set("@#{name}", value)
|
14
|
+
else
|
15
|
+
raise ArgumentError, "Invalid #{("_" + name.to_s).downcase.gsub!(/_(.)/) { $1.upcase }} '#{value}' -- Refer to ONIX Code List #{options[:list]}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
data/lib/onix/product.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
module ONIX
|
4
4
|
class Product
|
5
5
|
include ROXML
|
6
|
+
extend ONIX::ListWriter
|
6
7
|
|
7
8
|
xml_name "Product"
|
8
9
|
|
@@ -12,6 +13,7 @@ module ONIX
|
|
12
13
|
xml_accessor :product_form, :from => "ProductForm"
|
13
14
|
xml_accessor :product_form_detail, :from => "ProductFormDetail"
|
14
15
|
xml_reader :epub_type, :from => "EpubType", :as => Fixnum, :to_xml => ONIX::Formatters.three_digit
|
16
|
+
list_writer :epub_type, :list => 10
|
15
17
|
xml_accessor :series, :from => "Series", :as => [ONIX::Series]
|
16
18
|
xml_accessor :sets, :from => "Set", :as => [ONIX::Set]
|
17
19
|
xml_accessor :titles, :from => "Title", :as => [ONIX::Title]
|
@@ -42,6 +44,7 @@ module ONIX
|
|
42
44
|
xml_accessor :year_first_published, :from => "YearFirstPublished", :as => Fixnum
|
43
45
|
xml_accessor :sales_restrictions, :from => "SalesRestriction", :as => [ONIX::SalesRestriction]
|
44
46
|
xml_accessor :measurements, :from => "Measure", :as => [ONIX::Measure]
|
47
|
+
xml_accessor :related_products, :from => "RelatedProduct", :as => [ONIX::RelatedProduct]
|
45
48
|
xml_accessor :supply_details, :from => "SupplyDetail", :as => [ONIX::SupplyDetail]
|
46
49
|
xml_accessor :market_representations, :from => "MarketRepresentation", :as => [ONIX::MarketRepresentation]
|
47
50
|
|
@@ -71,19 +74,10 @@ module ONIX
|
|
71
74
|
self.publishers = []
|
72
75
|
self.sales_restrictions = []
|
73
76
|
self.measurements = []
|
77
|
+
self.related_products = []
|
74
78
|
self.supply_details = []
|
75
79
|
self.market_representations = []
|
76
80
|
end
|
77
81
|
|
78
|
-
# TODO: Refactor writer methods using method_missing
|
79
|
-
def epub_type=(new_epub_type)
|
80
|
-
if new_epub_type.nil? || ONIX::Lists.list(10).keys.include?(new_epub_type)
|
81
|
-
# ProductForm code must equal DG if EpubType element is present
|
82
|
-
@product_form = "DG"
|
83
|
-
@epub_type = new_epub_type
|
84
|
-
else
|
85
|
-
raise "Invalid EpubType #{new_epub_type}"
|
86
|
-
end
|
87
|
-
end
|
88
82
|
end
|
89
83
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX
|
4
|
+
module ProductIdentifiers
|
5
|
+
ACCESSOR_METHODS = {:proprietary_id => 1, :ean => 3, :isbn10 => 2, :isbn13 => 15, :isbn => 15, :lccn => 13}
|
6
|
+
|
7
|
+
def initialize_product_identifiers(options)
|
8
|
+
@product_identifiers ||= []
|
9
|
+
ACCESSOR_METHODS.keys.push(:product_identifiers).each do |name|
|
10
|
+
self.send("#{name}=", options[name]) if options[name]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
ACCESSOR_METHODS.each do |name, digit|
|
15
|
+
define_method(name) do
|
16
|
+
identifier(digit).andand.id_value
|
17
|
+
end
|
18
|
+
define_method("#{name}=") do |value|
|
19
|
+
identifier_set(digit, value)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def product_identifiers
|
24
|
+
@product_identifiers ||= []
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def product_identifiers=(values)
|
30
|
+
values = [values] if values.nil? || values.is_a?(ONIX::ProductIdentifier)
|
31
|
+
if values.is_a?(Array)
|
32
|
+
# Empty array
|
33
|
+
@product_identifiers = []
|
34
|
+
# Add any valid value
|
35
|
+
values.each do |value|
|
36
|
+
@product_identifiers << value if value.is_a?(ONIX::ProductIdentifier)
|
37
|
+
end
|
38
|
+
else
|
39
|
+
raise ArgumentError, "Invalid ProductIdentifier value: #{values.inspect}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# find the ProductIdentifier matching a particular type
|
44
|
+
def identifier(type)
|
45
|
+
@product_identifiers.find { |obj| obj.product_id_type == type }
|
46
|
+
end
|
47
|
+
|
48
|
+
# set the value of a particular ProductIdentifier (found by type)
|
49
|
+
def identifier_set(type, value)
|
50
|
+
obj = identifier(type)
|
51
|
+
|
52
|
+
# create a new product identifier object if we necessary
|
53
|
+
if obj.nil?
|
54
|
+
obj = ONIX::ProductIdentifier.new
|
55
|
+
obj.product_id_type = type
|
56
|
+
@product_identifiers << obj
|
57
|
+
end
|
58
|
+
|
59
|
+
obj.id_value = value
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX
|
4
|
+
class RelatedProduct
|
5
|
+
include ROXML
|
6
|
+
include ONIX::ProductIdentifiers
|
7
|
+
extend ONIX::ListWriter
|
8
|
+
|
9
|
+
xml_name "RelatedProduct"
|
10
|
+
|
11
|
+
xml_reader :relation_code, :from => "RelationCode", :as => Fixnum, :to_xml => ONIX::Formatters.two_digit
|
12
|
+
xml_reader :product_identifiers, :from => "ProductIdentifier", :as => [ONIX::ProductIdentifier]
|
13
|
+
list_writer :relation_code, :list => 51
|
14
|
+
|
15
|
+
def initialize(options = {})
|
16
|
+
options.symbolize_keys!
|
17
|
+
self.relation_code = options[:relation_code]
|
18
|
+
self.initialize_product_identifiers(options) # Must be called to setup @product_identifiers array
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
data/lib/onix/set.rb
CHANGED
@@ -3,74 +3,26 @@
|
|
3
3
|
module ONIX
|
4
4
|
class Set
|
5
5
|
include ROXML
|
6
|
+
include ONIX::ProductIdentifiers
|
6
7
|
|
7
8
|
xml_name "Set"
|
8
9
|
|
9
|
-
|
10
|
+
xml_reader :product_identifiers, :from => "ProductIdentifier", :as => [ONIX::ProductIdentifier]
|
10
11
|
xml_accessor :title_of_set, :from => "TitleOfSet"
|
11
12
|
|
12
|
-
def initialize
|
13
|
-
|
13
|
+
def initialize(options = {})
|
14
|
+
options.symbolize_keys!
|
15
|
+
self.initialize_product_identifiers(options) # Must be called to setup @product_identifiers array
|
14
16
|
end
|
15
17
|
|
16
|
-
#
|
17
|
-
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
# set a new proprietary set ID
|
22
|
-
def proprietary_set_id=(id)
|
23
|
-
product_identifier_set(1, id)
|
24
|
-
end
|
18
|
+
# Following methods removed os of gem 0.8.9 (aliased for backwards compatible):
|
19
|
+
alias_method :proprietary_set_id, :proprietary_id
|
20
|
+
alias_method :proprietary_set_id=, :proprietary_id=
|
25
21
|
|
26
|
-
#
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
# set a new 10-digit isbn
|
32
|
-
def isbn10=(id)
|
33
|
-
product_identifier_set(2, id)
|
34
|
-
end
|
22
|
+
# Following methods removed os of gem 0.8.9 (NOT backwards compatible):
|
23
|
+
# original method -> replacement method
|
24
|
+
# product_identifier(type) -> see product_identifiers.rb (eg, use isbn, lccn...)
|
25
|
+
# product_identifier_set(type, value) -> see product_identifiers.rb (eg, use isbn=, lccn=...)
|
35
26
|
|
36
|
-
# retrieve the 13-digit isbn
|
37
|
-
def isbn
|
38
|
-
product_identifier(15).andand.id_value
|
39
|
-
end
|
40
|
-
|
41
|
-
# set a new 13-digit isbn
|
42
|
-
def isbn=(id)
|
43
|
-
product_identifier_set(15, id)
|
44
|
-
end
|
45
|
-
|
46
|
-
# retrieve the lccn
|
47
|
-
def lccn
|
48
|
-
product_identifier(13).andand.id_value
|
49
|
-
end
|
50
|
-
|
51
|
-
# set a new lccn
|
52
|
-
def lccn=(id)
|
53
|
-
product_identifier_set(13, id)
|
54
|
-
end
|
55
|
-
|
56
|
-
# retrieve the value of a particular ID
|
57
|
-
def product_identifier(type)
|
58
|
-
identifier = product_identifiers.find { |id| id.product_id_type == type }
|
59
|
-
end
|
60
|
-
|
61
|
-
# set the value of a particular ID
|
62
|
-
def product_identifier_set(type, value)
|
63
|
-
product_identifier_id = product_identifiers.find { |id| id.product_id_type == type }
|
64
|
-
|
65
|
-
# create a new set identifier record if we need to
|
66
|
-
if product_identifier_id.nil?
|
67
|
-
product_identifier_id = ONIX::ProductIdentifier.new
|
68
|
-
end
|
69
|
-
|
70
|
-
product_identifier_id.product_id_type = type
|
71
|
-
product_identifier_id.id_value = value
|
72
|
-
|
73
|
-
product_identifiers << product_identifier_id
|
74
|
-
end
|
75
27
|
end
|
76
28
|
end
|
data/lib/onix/sl_product.rb
CHANGED
@@ -8,6 +8,7 @@ module ONIX
|
|
8
8
|
delegate :product_form_detail, :product_form_detail=
|
9
9
|
delegate :basic_main_subject, :basic_main_subject=
|
10
10
|
delegate :epub_type, :epub_type=
|
11
|
+
delegate :related_products, :related_products=
|
11
12
|
|
12
13
|
# retrieve the value of a particular ID
|
13
14
|
def series(str)
|
@@ -63,14 +64,28 @@ module ONIX
|
|
63
64
|
# process based on value type
|
64
65
|
if value.is_a?(WorkIdentifier)
|
65
66
|
str = value.id_value
|
66
|
-
|
67
|
+
obj = value
|
67
68
|
else
|
68
69
|
str = value
|
69
|
-
|
70
|
+
obj = ONIX::WorkIdentifier.new(:work_id_type => type, :id_value => value)
|
70
71
|
end
|
71
72
|
# check if exists already
|
72
73
|
unless work_identifier(str)
|
73
|
-
product.work_identifiers <<
|
74
|
+
product.work_identifiers << obj
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# find the related_product that has relation_code 5
|
79
|
+
def replacement
|
80
|
+
product.related_products.find { |obj| obj.relation_code == 5 }
|
81
|
+
end
|
82
|
+
|
83
|
+
# set the proprietary_id of the replacement product
|
84
|
+
def replacement=(value)
|
85
|
+
if obj = replacement
|
86
|
+
obj.proprietary_id = value
|
87
|
+
else
|
88
|
+
product.related_products << ONIX::RelatedProduct.new(:relation_code => 5, :proprietary_id => value)
|
74
89
|
end
|
75
90
|
end
|
76
91
|
|
data/lib/onix/version.rb
CHANGED
data/lib/onix/work_identifier.rb
CHANGED
@@ -3,12 +3,14 @@
|
|
3
3
|
module ONIX
|
4
4
|
class WorkIdentifier
|
5
5
|
include ROXML
|
6
|
+
extend ONIX::ListWriter
|
6
7
|
|
7
8
|
xml_name "WorkIdentifier"
|
8
9
|
|
9
10
|
xml_reader :work_id_type, :from => "WorkIDType", :as => Fixnum, :to_xml => ONIX::Formatters.two_digit
|
10
11
|
xml_accessor :id_type_name, :from => "IDTypeName"
|
11
12
|
xml_accessor :id_value, :from => "IDValue"
|
13
|
+
list_writer :work_id_type, :list => 16
|
12
14
|
|
13
15
|
def initialize(options = {})
|
14
16
|
options.symbolize_keys!
|
@@ -17,12 +19,5 @@ module ONIX
|
|
17
19
|
@id_value = options[:id_value]
|
18
20
|
end
|
19
21
|
|
20
|
-
def work_id_type=(new_work_id_type)
|
21
|
-
if new_work_id_type.nil? || ::ONIX::Lists.list(16).keys.include?(new_work_id_type)
|
22
|
-
@work_id_type = new_work_id_type
|
23
|
-
else
|
24
|
-
raise "Invalid WorkIDType #{new_work_id_type}"
|
25
|
-
end
|
26
|
-
end
|
27
22
|
end
|
28
23
|
end
|
data/lib/onix.rb
CHANGED
@@ -55,9 +55,11 @@ end
|
|
55
55
|
# core files
|
56
56
|
# - ordering is important, classes need to be defined before any
|
57
57
|
# other class can use them
|
58
|
+
require File.join(File.dirname(__FILE__), "onix", "list_writer")
|
58
59
|
require File.join(File.dirname(__FILE__), "onix", "sender_identifier")
|
59
60
|
require File.join(File.dirname(__FILE__), "onix", "addressee_identifier")
|
60
61
|
require File.join(File.dirname(__FILE__), "onix", "header")
|
62
|
+
require File.join(File.dirname(__FILE__), "onix", "product_identifiers")
|
61
63
|
require File.join(File.dirname(__FILE__), "onix", "product_identifier")
|
62
64
|
require File.join(File.dirname(__FILE__), "onix", "series_identifier")
|
63
65
|
require File.join(File.dirname(__FILE__), "onix", "series")
|
@@ -76,6 +78,7 @@ require File.join(File.dirname(__FILE__), "onix", "media_file")
|
|
76
78
|
require File.join(File.dirname(__FILE__), "onix", "sales_restriction")
|
77
79
|
require File.join(File.dirname(__FILE__), "onix", "stock")
|
78
80
|
require File.join(File.dirname(__FILE__), "onix", "price")
|
81
|
+
require File.join(File.dirname(__FILE__), "onix", "related_product")
|
79
82
|
require File.join(File.dirname(__FILE__), "onix", "supply_detail")
|
80
83
|
require File.join(File.dirname(__FILE__), "onix", "market_representation")
|
81
84
|
require File.join(File.dirname(__FILE__), "onix", "measure")
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
4
|
+
|
5
|
+
describe ONIX::ListWriter do
|
6
|
+
|
7
|
+
module ONIX
|
8
|
+
class FakeEntity
|
9
|
+
include ROXML
|
10
|
+
extend ONIX::ListWriter
|
11
|
+
|
12
|
+
xml_name "FakeEntity"
|
13
|
+
xml_reader :series_id_type, :from => "SeriesIDType", :as => Fixnum, :to_xml => ONIX::Formatters.two_digit
|
14
|
+
list_writer :series_id_type, :list => 13
|
15
|
+
|
16
|
+
def initialize(options = {})
|
17
|
+
self.series_id_type = options[:series_id_type]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
before :each do
|
23
|
+
data_path = File.join(File.dirname(__FILE__),"..","data")
|
24
|
+
file1 = File.join(data_path, "fake_entity_for_lists.xml")
|
25
|
+
@doc = Nokogiri::XML::Document.parse(File.read(file1))
|
26
|
+
@root = @doc.root
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should provide read access to first level attribute" do
|
30
|
+
fake = ONIX::FakeEntity.from_xml(@root.to_s)
|
31
|
+
fake.series_id_type.should eql(1)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should provide write access to first level attribute" do
|
35
|
+
fake = ONIX::FakeEntity.new(:series_id_type => 3)
|
36
|
+
fake.series_id_type.should eql(3)
|
37
|
+
fake.to_xml.to_s.include?("<SeriesIDType>03</SeriesIDType>").should be_true
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should raise error writing value not in list" do
|
41
|
+
fake = ONIX::FakeEntity.new
|
42
|
+
lambda {fake.series_id_type = 100}.should raise_error
|
43
|
+
lambda {ONIX::FakeEntity.new(:series_id_type => 100)}.should raise_error
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
4
|
+
|
5
|
+
describe ONIX::ProductIdentifiers do
|
6
|
+
|
7
|
+
module ONIX
|
8
|
+
class FakeEntity
|
9
|
+
include ROXML
|
10
|
+
include ONIX::ProductIdentifiers
|
11
|
+
|
12
|
+
xml_name "FakeEntity"
|
13
|
+
xml_reader :product_identifiers, :from => "ProductIdentifier", :as => [ONIX::ProductIdentifier]
|
14
|
+
|
15
|
+
def initialize(options = {})
|
16
|
+
self.initialize_product_identifiers(options)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
before :each do
|
22
|
+
@fake = ONIX::FakeEntity.new(:isbn => 123456)
|
23
|
+
data_path = File.join(File.dirname(__FILE__),"..","data")
|
24
|
+
file1 = File.join(data_path, "fake_entity.xml")
|
25
|
+
@doc = Nokogiri::XML::Document.parse(File.read(file1))
|
26
|
+
@root = @doc.root
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should instantiate product identifiers array" do
|
30
|
+
@fake.product_identifiers.should be_a(Array)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should provide read access to product identifiers" do
|
34
|
+
fe = ONIX::FakeEntity.from_xml(@root.to_s)
|
35
|
+
fe.proprietary_id.should eql("PROPRIETARY_ID")
|
36
|
+
fe.isbn10.should eql("ISBN10")
|
37
|
+
fe.isbn.should eql("ISBN13")
|
38
|
+
fe.isbn13.should eql("ISBN13")
|
39
|
+
fe.ean.should eql("EAN")
|
40
|
+
fe.lccn.should eql("LCCN")
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should provide write access to product identifiers" do
|
44
|
+
id_value = "123456"
|
45
|
+
{:proprietary_id => 1, :ean => 3, :isbn10 => 2, :isbn13 => 15, :isbn => 15, :lccn => 13}.each do |key, product_id_type|
|
46
|
+
fe = ONIX::FakeEntity.new(key => id_value)
|
47
|
+
fe.to_xml.to_s.include?("<ProductIDType>#{sprintf('%02d', product_id_type)}</ProductIDType>").should be_true
|
48
|
+
fe.to_xml.to_s.include?("<IDValue>#{id_value}</IDValue>").should be_true
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should provide write access to product_identifiers array" do
|
53
|
+
id = ONIX::ProductIdentifier.new
|
54
|
+
id.product_id_type = 1
|
55
|
+
id.id_value = "123456"
|
56
|
+
fe = ONIX::FakeEntity.new(:product_identifiers => id)
|
57
|
+
|
58
|
+
fe.to_xml.to_s.include?("<ProductIdentifier>").should be_true
|
59
|
+
fe.to_xml.to_s.include?("<ProductIDType>01</ProductIDType>").should be_true
|
60
|
+
fe.to_xml.to_s.include?("<IDValue>123456</IDValue>").should be_true
|
61
|
+
|
62
|
+
id = ONIX::ProductIdentifier.new
|
63
|
+
id.product_id_type = 2
|
64
|
+
id.id_value = "987654"
|
65
|
+
fe.product_identifiers << id
|
66
|
+
|
67
|
+
fe.to_xml.to_s.include?("<ProductIDType>02</ProductIDType>").should be_true
|
68
|
+
fe.to_xml.to_s.include?("<IDValue>987654</IDValue>").should be_true
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
4
|
+
|
5
|
+
describe ONIX::RelatedProduct do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
data_path = File.join(File.dirname(__FILE__),"..","data")
|
9
|
+
file1 = File.join(data_path, "related_product.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
|
+
rp = ONIX::RelatedProduct.from_xml(@root.to_s)
|
16
|
+
rp.to_xml.to_s[0,16].should eql("<RelatedProduct>")
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should provide read access to relation_code" do
|
20
|
+
rp = ONIX::RelatedProduct.from_xml(@root.to_s)
|
21
|
+
rp.relation_code.should eql(5)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should provide write access to relation_code" do
|
25
|
+
rp = ONIX::RelatedProduct.new(:relation_code => 1)
|
26
|
+
rp.to_xml.to_s.include?("<RelationCode>01</RelationCode>").should be_true
|
27
|
+
|
28
|
+
rp.relation_code = 2
|
29
|
+
rp.to_xml.to_s.include?("<RelationCode>02</RelationCode>").should be_true
|
30
|
+
end
|
31
|
+
|
32
|
+
# This is essentially testing product_identifers.rb module
|
33
|
+
it "should provide read access to proprietary_id" do
|
34
|
+
rp = ONIX::RelatedProduct.from_xml(@root.to_s)
|
35
|
+
rp.proprietary_id.should eql("123456")
|
36
|
+
end
|
37
|
+
|
38
|
+
# This is essentially testing product_identifers.rb module
|
39
|
+
it "should provide write access to proprietary_id" do
|
40
|
+
rp = ONIX::RelatedProduct.new(:proprietary_id => 123456)
|
41
|
+
rp.to_xml.to_s.include?("<ProductIDType>01</ProductIDType>").should be_true
|
42
|
+
rp.to_xml.to_s.include?("<IDValue>123456</IDValue>").should be_true
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
data/spec/set_spec.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require File.dirname(__FILE__) + '/spec_helper.rb'
|
4
4
|
|
5
|
-
|
5
|
+
describe ONIX::Set do
|
6
6
|
|
7
7
|
before(:each) do
|
8
8
|
data_path = File.join(File.dirname(__FILE__),"..","data")
|
@@ -11,18 +11,18 @@ context "ONIX::Set" do
|
|
11
11
|
@root = @doc.root
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
it "should correctly convert to a string" do
|
15
15
|
set = ONIX::Set.from_xml(@root.to_s)
|
16
16
|
set.to_xml.to_s[0,5].should eql("<Set>")
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
it "should provide read access to first level attributes" do
|
20
20
|
set = ONIX::Set.from_xml(@root.to_s)
|
21
21
|
|
22
22
|
set.title_of_set.should eql("Citizens and Their Governments")
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
it "should provide write access to first level attributes" do
|
26
26
|
set = ONIX::Set.new
|
27
27
|
|
28
28
|
set.title_of_set = "Cool Science Careers"
|
data/spec/sl_product_spec.rb
CHANGED
@@ -3,43 +3,45 @@
|
|
3
3
|
require File.dirname(__FILE__) + '/spec_helper.rb'
|
4
4
|
require 'date'
|
5
5
|
|
6
|
-
|
6
|
+
describe ONIX::SLProduct do
|
7
7
|
|
8
8
|
before(:each) do
|
9
9
|
@data_path = File.join(File.dirname(__FILE__),"..","data")
|
10
|
-
file1 = File.join(@data_path, "
|
10
|
+
file1 = File.join(@data_path, "sl_product.xml")
|
11
11
|
@doc = Nokogiri::XML::Document.parse(File.read(file1))
|
12
12
|
@product_node = @doc.root
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
|
-
@product
|
17
|
-
@sl
|
15
|
+
it "should provide read access to attributes" do
|
16
|
+
@product = ONIX::Product.from_xml(@product_node.to_s)
|
17
|
+
@sl = ONIX::SLProduct.new(@product)
|
18
18
|
|
19
|
-
@sl.record_reference.should eql("
|
19
|
+
@sl.record_reference.should eql("200002")
|
20
20
|
@sl.notification_type.should eql(3)
|
21
|
-
@sl.product_form.should eql("
|
22
|
-
@sl.number_of_pages.should eql(
|
23
|
-
@sl.
|
21
|
+
@sl.product_form.should eql("BB")
|
22
|
+
@sl.number_of_pages.should eql(32)
|
23
|
+
@sl.basic_main_subject.should eql("JNF053090")
|
24
24
|
@sl.publishing_status.should eql(4)
|
25
|
-
@sl.publication_date.should eql(Date.civil(
|
26
|
-
@sl.
|
25
|
+
@sl.publication_date.should eql(Date.civil(2007,8,1))
|
26
|
+
@sl.related_products.should be_a(Array)
|
27
|
+
@sl.related_products[0].should be_a(ONIX::RelatedProduct)
|
28
|
+
@sl.related_products[0].relation_code.should eql(5)
|
27
29
|
end
|
28
30
|
|
29
|
-
|
31
|
+
it "should provide write access to attributes" do
|
30
32
|
sl = ONIX::SLProduct.new
|
31
33
|
|
32
34
|
sl.notification_type = 3
|
33
35
|
sl.to_xml.to_s.include?("<NotificationType>03</NotificationType>").should be_true
|
34
36
|
|
35
|
-
sl.record_reference = "
|
36
|
-
sl.to_xml.to_s.include?("<RecordReference>
|
37
|
+
sl.record_reference = "200002"
|
38
|
+
sl.to_xml.to_s.include?("<RecordReference>200002</RecordReference>").should be_true
|
37
39
|
|
38
|
-
sl.product_form = "
|
39
|
-
sl.to_xml.to_s.include?("<ProductForm>
|
40
|
+
sl.product_form = "BB"
|
41
|
+
sl.to_xml.to_s.include?("<ProductForm>BB</ProductForm>").should be_true
|
40
42
|
|
41
|
-
sl.number_of_pages =
|
42
|
-
sl.to_xml.to_s.include?("<NumberOfPages>
|
43
|
+
sl.number_of_pages = 32
|
44
|
+
sl.to_xml.to_s.include?("<NumberOfPages>32</NumberOfPages>").should be_true
|
43
45
|
|
44
46
|
sl.basic_main_subject = "JNF053090"
|
45
47
|
sl.to_xml.to_s.include?("<BASICMainSubject>JNF053090</BASICMainSubject>").should be_true
|
@@ -47,17 +49,50 @@ context "ONIX::SLProduct" do
|
|
47
49
|
sl.publishing_status = 4
|
48
50
|
sl.to_xml.to_s.include?("<PublishingStatus>04</PublishingStatus>").should be_true
|
49
51
|
|
50
|
-
sl.publication_date = Date.civil(
|
51
|
-
sl.to_xml.to_s.include?("<PublicationDate>
|
52
|
+
sl.publication_date = Date.civil(2007,8,1)
|
53
|
+
sl.to_xml.to_s.include?("<PublicationDate>20070801</PublicationDate>").should be_true
|
54
|
+
|
55
|
+
id = ONIX::ProductIdentifier.new
|
56
|
+
id.product_id_type = 1
|
57
|
+
id.id_value = "123456"
|
58
|
+
sl.related_products = [ONIX::RelatedProduct.new(:relation_code => 1, :product_identifiers => id)]
|
59
|
+
sl.related_products << ONIX::RelatedProduct.new(:relation_code => 2, :product_identifiers => id)
|
60
|
+
sl.related_products[0].to_xml.to_s.include?("<RelationCode>01</RelationCode>").should be_true
|
61
|
+
sl.related_products[1].to_xml.to_s.include?("<RelationCode>02</RelationCode>").should be_true
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should provide read access to replacement" do
|
65
|
+
@product = ONIX::Product.from_xml(@product_node.to_s)
|
66
|
+
@sl = ONIX::SLProduct.new(@product)
|
52
67
|
|
53
|
-
sl.
|
54
|
-
sl.
|
68
|
+
@sl.replacement.relation_code.should eql(5)
|
69
|
+
@sl.replacement.proprietary_id.should eql("123456")
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should provide write access to replacement" do
|
73
|
+
sl = ONIX::SLProduct.new
|
74
|
+
|
75
|
+
sl.replacement = "XYZ123"
|
76
|
+
sl.related_products[0].to_xml.to_s.include?("<RelationCode>05</RelationCode>").should be_true
|
77
|
+
sl.related_products[0].to_xml.to_s.include?("<ProductIDType>01</ProductIDType>").should be_true
|
78
|
+
sl.related_products[0].to_xml.to_s.include?("<IDValue>XYZ123</IDValue>").should be_true
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should provide write access to epub_type" do
|
82
|
+
sl = ONIX::SLProduct.new
|
83
|
+
sl.epub_type = 1
|
84
|
+
sl.to_xml.to_s.include?("<EpubType>001</EpubType>").should be_true
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should raise error when writing invalid epub_type" do
|
88
|
+
sl = ONIX::SLProduct.new
|
89
|
+
lambda {sl.epub_type = 999}.should raise_error
|
55
90
|
end
|
56
91
|
|
57
92
|
end
|
58
93
|
|
59
|
-
|
60
|
-
|
94
|
+
describe ONIX::SLProduct, "series method" do
|
95
|
+
it "should set the nested series value on the underlying product class" do
|
61
96
|
sl = ONIX::SLProduct.new
|
62
97
|
|
63
98
|
sl.series = "Harry Potter"
|
@@ -67,7 +102,7 @@ context ONIX::SLProduct, "series method" do
|
|
67
102
|
end
|
68
103
|
end
|
69
104
|
|
70
|
-
|
105
|
+
describe ONIX::SLProduct, "price method" do
|
71
106
|
before(:each) do
|
72
107
|
@data_path = File.join(File.dirname(__FILE__),"..","data")
|
73
108
|
file1 = File.join(@data_path, "usd.xml")
|
@@ -75,7 +110,7 @@ context ONIX::SLProduct, "price method" do
|
|
75
110
|
@product_node = @doc.root
|
76
111
|
end
|
77
112
|
|
78
|
-
|
113
|
+
it "should return the first price in the file, regardless of type" do
|
79
114
|
@product = ONIX::Product.from_xml(@product_node.to_s)
|
80
115
|
@sl = ONIX::SLProduct.new(@product)
|
81
116
|
|
@@ -83,7 +118,7 @@ context ONIX::SLProduct, "price method" do
|
|
83
118
|
end
|
84
119
|
end
|
85
120
|
|
86
|
-
|
121
|
+
describe ONIX::SLProduct, "rrp_exc_sales_tax method" do
|
87
122
|
before(:each) do
|
88
123
|
@data_path = File.join(File.dirname(__FILE__),"..","data")
|
89
124
|
file1 = File.join(@data_path, "usd.xml")
|
@@ -91,7 +126,7 @@ context ONIX::SLProduct, "rrp_exc_sales_tax method" do
|
|
91
126
|
@product_node = @doc.root
|
92
127
|
end
|
93
128
|
|
94
|
-
|
129
|
+
it "should return the first price in the file of type 1" do
|
95
130
|
@product = ONIX::Product.from_xml(@product_node.to_s)
|
96
131
|
@sl = ONIX::SLProduct.new(@product)
|
97
132
|
|
@@ -35,5 +35,11 @@ describe ONIX::WorkIdentifier do
|
|
35
35
|
t.id_value = "ABC123"
|
36
36
|
t.to_xml.to_s.include?("<IDValue>ABC123</IDValue>").should be_true
|
37
37
|
end
|
38
|
+
|
39
|
+
it "should raise error writing work_id_type value not in list" do
|
40
|
+
t = ONIX::WorkIdentifier.new
|
41
|
+
lambda {t.work_id_type = 999}.should raise_error
|
42
|
+
lambda {ONIX::WorkIdentifier.new(:work_id_type => 999)}.should raise_error
|
43
|
+
end
|
38
44
|
|
39
45
|
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: 45
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 8
|
9
|
-
-
|
10
|
-
version: 0.8.
|
9
|
+
- 9
|
10
|
+
version: 0.8.9
|
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-03-
|
19
|
+
date: 2011-03-24 00:00:00 -07:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -126,6 +126,7 @@ files:
|
|
126
126
|
- lib/onix/header.rb
|
127
127
|
- lib/onix/imprint.rb
|
128
128
|
- lib/onix/language.rb
|
129
|
+
- lib/onix/list_writer.rb
|
129
130
|
- lib/onix/lists.rb
|
130
131
|
- lib/onix/market_representation.rb
|
131
132
|
- lib/onix/measure.rb
|
@@ -135,8 +136,10 @@ files:
|
|
135
136
|
- lib/onix/price.rb
|
136
137
|
- lib/onix/product.rb
|
137
138
|
- lib/onix/product_identifier.rb
|
139
|
+
- lib/onix/product_identifiers.rb
|
138
140
|
- lib/onix/publisher.rb
|
139
141
|
- lib/onix/reader.rb
|
142
|
+
- lib/onix/related_product.rb
|
140
143
|
- lib/onix/sales_restriction.rb
|
141
144
|
- lib/onix/sender_identifier.rb
|
142
145
|
- lib/onix/series.rb
|
@@ -335,6 +338,7 @@ files:
|
|
335
338
|
- spec/header_spec.rb
|
336
339
|
- spec/imprint_spec.rb
|
337
340
|
- spec/language_spec.rb
|
341
|
+
- spec/list_writer_spec.rb
|
338
342
|
- spec/lists_spec.rb
|
339
343
|
- spec/market_representation_spec.rb
|
340
344
|
- spec/measure_spec.rb
|
@@ -343,9 +347,11 @@ files:
|
|
343
347
|
- spec/other_text_spec.rb
|
344
348
|
- spec/price_spec.rb
|
345
349
|
- spec/product_identifier_spec.rb
|
350
|
+
- spec/product_identifiers_spec.rb
|
346
351
|
- spec/product_spec.rb
|
347
352
|
- spec/publisher_spec.rb
|
348
353
|
- spec/reader_spec.rb
|
354
|
+
- spec/related_product_spec.rb
|
349
355
|
- spec/sales_restriction_spec.rb
|
350
356
|
- spec/sender_identifier.rb
|
351
357
|
- spec/series_identifier_spec.rb
|
@@ -403,6 +409,7 @@ test_files:
|
|
403
409
|
- spec/header_spec.rb
|
404
410
|
- spec/imprint_spec.rb
|
405
411
|
- spec/language_spec.rb
|
412
|
+
- spec/list_writer_spec.rb
|
406
413
|
- spec/lists_spec.rb
|
407
414
|
- spec/market_representation_spec.rb
|
408
415
|
- spec/measure_spec.rb
|
@@ -411,9 +418,11 @@ test_files:
|
|
411
418
|
- spec/other_text_spec.rb
|
412
419
|
- spec/price_spec.rb
|
413
420
|
- spec/product_identifier_spec.rb
|
421
|
+
- spec/product_identifiers_spec.rb
|
414
422
|
- spec/product_spec.rb
|
415
423
|
- spec/publisher_spec.rb
|
416
424
|
- spec/reader_spec.rb
|
425
|
+
- spec/related_product_spec.rb
|
417
426
|
- spec/sales_restriction_spec.rb
|
418
427
|
- spec/sender_identifier.rb
|
419
428
|
- spec/series_identifier_spec.rb
|