milkfarm-onix 0.8.11 → 0.8.12
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 +14 -0
- data/README.markdown +4 -0
- data/lib/onix.rb +46 -41
- data/lib/onix/apa_product.rb +21 -21
- data/lib/onix/not_for_sale.rb +21 -0
- data/lib/onix/product.rb +2 -0
- data/lib/onix/product_identifiers.rb +1 -1
- data/lib/onix/reader.rb +34 -7
- data/lib/onix/sales_rights.rb +19 -0
- data/lib/onix/series.rb +2 -2
- data/lib/onix/version.rb +1 -1
- data/spec/not_for_sale_spec.rb +31 -0
- data/spec/reader_spec.rb +40 -9
- data/spec/sales_rights_spec.rb +39 -0
- data/spec/spec_helper.rb +35 -0
- metadata +42 -36
data/CHANGELOG
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
v0.8.12 (28 November 2011)
|
2
|
+
- Cherry pick yob's commits from 13 April to 7 November:
|
3
|
+
- Relax activesupport dependency to work with rails 3 or 3.1
|
4
|
+
- Switch back to the vanilla roxml gem
|
5
|
+
- Clarify comments explaining encoding behaviour
|
6
|
+
- Add options hash to ONIX::Reader. Only option at this stage is :encoding,
|
7
|
+
which allows the user to override the assumed encoding of the input XML
|
8
|
+
- API change
|
9
|
+
- Skipped yob's implementation of discount_coded
|
10
|
+
- It has already been addressed in this fork
|
11
|
+
NB: differing syntax discounts_coded v. discount_codeds (this fork uses latter)
|
12
|
+
- Add SalesRights (thanks joseph), with ordering adjustment
|
13
|
+
- Replace andand with try
|
14
|
+
|
1
15
|
v0.8.11 (27 May 2011)
|
2
16
|
- Add Territory, CountryExcluded, TerritoryExcluded to Price composite
|
3
17
|
- Add CountryCode to Price composite
|
data/README.markdown
CHANGED
@@ -21,6 +21,10 @@ ONIX::Normaliser to convert any short tag files to reference tags.
|
|
21
21
|
|
22
22
|
ONIX::Writer only generates reference tag ONIX files.
|
23
23
|
|
24
|
+
It baffles me why anyone thought designing two parallel versions of the ONIX
|
25
|
+
spec was a good idea. Use reference tags my friends, and let short tags fade
|
26
|
+
away into irrelevant obscurity.
|
27
|
+
|
24
28
|
## DTD Loading
|
25
29
|
|
26
30
|
To correctly handle named entities when reading an ONIX file, this gem attempts
|
data/lib/onix.rb
CHANGED
@@ -4,7 +4,6 @@ require 'bigdecimal'
|
|
4
4
|
require 'cgi'
|
5
5
|
require 'singleton'
|
6
6
|
require 'roxml'
|
7
|
-
require 'andand'
|
8
7
|
|
9
8
|
module ONIX
|
10
9
|
class Formatters
|
@@ -49,55 +48,61 @@ module ONIX
|
|
49
48
|
end
|
50
49
|
end
|
51
50
|
end
|
51
|
+
|
52
|
+
def self.space_separated
|
53
|
+
lambda { |val| val.join(" ") if val }
|
54
|
+
end
|
52
55
|
end
|
53
56
|
end
|
54
57
|
|
55
58
|
# helper modules
|
56
|
-
require
|
57
|
-
require
|
58
|
-
require
|
59
|
-
require
|
60
|
-
require
|
59
|
+
require "onix/list_writer"
|
60
|
+
require "onix/inflector"
|
61
|
+
require "onix/product_identifiers"
|
62
|
+
require "onix/work_identifiers"
|
63
|
+
require "onix/discount_codeds"
|
61
64
|
|
62
65
|
# core files
|
63
66
|
# - ordering is important, classes need to be defined before any
|
64
67
|
# other class can use them
|
65
|
-
require
|
66
|
-
require
|
67
|
-
require
|
68
|
-
require
|
69
|
-
require
|
70
|
-
require
|
71
|
-
require
|
72
|
-
require
|
73
|
-
require
|
74
|
-
require
|
75
|
-
require
|
76
|
-
require
|
77
|
-
require
|
78
|
-
require
|
79
|
-
require
|
80
|
-
require
|
81
|
-
require
|
82
|
-
require
|
83
|
-
require
|
84
|
-
require
|
85
|
-
require
|
86
|
-
require
|
87
|
-
require
|
88
|
-
require
|
89
|
-
require
|
90
|
-
require
|
91
|
-
require
|
92
|
-
require
|
93
|
-
require
|
68
|
+
require "onix/sender_identifier"
|
69
|
+
require "onix/addressee_identifier"
|
70
|
+
require "onix/header"
|
71
|
+
require "onix/product_identifier"
|
72
|
+
require "onix/series_identifier"
|
73
|
+
require "onix/series"
|
74
|
+
require "onix/set"
|
75
|
+
require "onix/title"
|
76
|
+
require "onix/work_identifier"
|
77
|
+
require "onix/website"
|
78
|
+
require "onix/contributor"
|
79
|
+
require "onix/language"
|
80
|
+
require "onix/subject"
|
81
|
+
require "onix/audience_range"
|
82
|
+
require "onix/imprint"
|
83
|
+
require "onix/publisher"
|
84
|
+
require "onix/other_text"
|
85
|
+
require "onix/media_file"
|
86
|
+
require "onix/sales_restriction"
|
87
|
+
require "onix/sales_rights"
|
88
|
+
require "onix/not_for_sale"
|
89
|
+
require "onix/stock"
|
90
|
+
require "onix/discount_coded"
|
91
|
+
require "onix/price"
|
92
|
+
require "onix/related_product"
|
93
|
+
require "onix/supply_detail"
|
94
|
+
require "onix/market_representation"
|
95
|
+
require "onix/measure"
|
96
|
+
require "onix/product"
|
97
|
+
require "onix/reader"
|
98
|
+
require "onix/writer"
|
94
99
|
|
95
100
|
# product wrappers
|
96
|
-
require
|
97
|
-
require
|
98
|
-
require
|
101
|
+
require "onix/simple_product"
|
102
|
+
require "onix/apa_product"
|
103
|
+
require "onix/sl_product"
|
99
104
|
|
100
105
|
# misc
|
101
|
-
require
|
102
|
-
require
|
103
|
-
require
|
106
|
+
require "onix/lists"
|
107
|
+
require "onix/normaliser"
|
108
|
+
require "onix/code_list_extractor"
|
data/lib/onix/apa_product.rb
CHANGED
@@ -26,7 +26,7 @@ module ONIX
|
|
26
26
|
|
27
27
|
# retrieve the current EAN
|
28
28
|
def ean
|
29
|
-
identifier(3).
|
29
|
+
identifier(3).try(:id_value)
|
30
30
|
end
|
31
31
|
|
32
32
|
# set a new EAN
|
@@ -36,7 +36,7 @@ module ONIX
|
|
36
36
|
|
37
37
|
# retrieve the proprietary ID
|
38
38
|
def proprietary_id
|
39
|
-
identifier(1).
|
39
|
+
identifier(1).try(:id_value)
|
40
40
|
end
|
41
41
|
|
42
42
|
# set a new proprietary ID
|
@@ -46,7 +46,7 @@ module ONIX
|
|
46
46
|
|
47
47
|
# retrieve the current ISBN 10
|
48
48
|
def isbn10
|
49
|
-
identifier(2).
|
49
|
+
identifier(2).try(:id_value)
|
50
50
|
end
|
51
51
|
|
52
52
|
# set a new ISBN 10
|
@@ -56,7 +56,7 @@ module ONIX
|
|
56
56
|
|
57
57
|
# retrieve the current ISBN 13
|
58
58
|
def isbn13
|
59
|
-
identifier(15).
|
59
|
+
identifier(15).try(:id_value)
|
60
60
|
end
|
61
61
|
|
62
62
|
# set a new ISBN 13
|
@@ -108,7 +108,7 @@ module ONIX
|
|
108
108
|
|
109
109
|
def series
|
110
110
|
composite = product.series.first
|
111
|
-
composite.
|
111
|
+
composite.try(:title_of_series)
|
112
112
|
end
|
113
113
|
|
114
114
|
def series=(val)
|
@@ -122,7 +122,7 @@ module ONIX
|
|
122
122
|
|
123
123
|
# retrieve the current publisher website for this particular product
|
124
124
|
def publisher_website
|
125
|
-
website(2).
|
125
|
+
website(2).try(:website_link)
|
126
126
|
end
|
127
127
|
|
128
128
|
# set a new publisher website for this particular product
|
@@ -132,7 +132,7 @@ module ONIX
|
|
132
132
|
|
133
133
|
# retrieve the current supplier website for this particular product
|
134
134
|
def supplier_website
|
135
|
-
website(12).
|
135
|
+
website(12).try(:website_link)
|
136
136
|
end
|
137
137
|
|
138
138
|
# set a new supplier website for this particular product
|
@@ -181,7 +181,7 @@ module ONIX
|
|
181
181
|
|
182
182
|
# retrieve the url to the product cover image
|
183
183
|
def cover_url
|
184
|
-
media_file(4).
|
184
|
+
media_file(4).try(:media_file_link)
|
185
185
|
end
|
186
186
|
|
187
187
|
# set the url to the product cover image
|
@@ -193,7 +193,7 @@ module ONIX
|
|
193
193
|
|
194
194
|
# retrieve the url to the high quality product cover image
|
195
195
|
def cover_url_hq
|
196
|
-
media_file(6).
|
196
|
+
media_file(6).try(:media_file_link)
|
197
197
|
end
|
198
198
|
|
199
199
|
# set the url to the high quality product cover image
|
@@ -205,7 +205,7 @@ module ONIX
|
|
205
205
|
|
206
206
|
# retrieve the url to the product thumbnail
|
207
207
|
def thumbnail_url
|
208
|
-
media_file(7).
|
208
|
+
media_file(7).try(:media_file_link)
|
209
209
|
end
|
210
210
|
|
211
211
|
# set the url to the product cover image
|
@@ -217,7 +217,7 @@ module ONIX
|
|
217
217
|
|
218
218
|
# retrieve the main description
|
219
219
|
def main_description
|
220
|
-
other_text(1).
|
220
|
+
other_text(1).try(:text)
|
221
221
|
end
|
222
222
|
|
223
223
|
# set the main description
|
@@ -227,7 +227,7 @@ module ONIX
|
|
227
227
|
|
228
228
|
# retrieve the short description
|
229
229
|
def short_description
|
230
|
-
other_text(2).
|
230
|
+
other_text(2).try(:text)
|
231
231
|
end
|
232
232
|
|
233
233
|
# set the short description
|
@@ -237,7 +237,7 @@ module ONIX
|
|
237
237
|
|
238
238
|
# retrieve the long description
|
239
239
|
def long_description
|
240
|
-
other_text(3).
|
240
|
+
other_text(3).try(:text)
|
241
241
|
end
|
242
242
|
|
243
243
|
# set the long description
|
@@ -263,7 +263,7 @@ module ONIX
|
|
263
263
|
|
264
264
|
# retrieve the publisher
|
265
265
|
def publisher
|
266
|
-
publisher_get(1).
|
266
|
+
publisher_get(1).try(:publisher_name)
|
267
267
|
end
|
268
268
|
|
269
269
|
# set a new publisher
|
@@ -417,7 +417,7 @@ module ONIX
|
|
417
417
|
|
418
418
|
# retrieve the rrp excluding any sales tax
|
419
419
|
def rrp_exc_sales_tax
|
420
|
-
price_get(1).
|
420
|
+
price_get(1).try(:price_amount)
|
421
421
|
end
|
422
422
|
|
423
423
|
# set the rrp excluding any sales tax
|
@@ -427,7 +427,7 @@ module ONIX
|
|
427
427
|
|
428
428
|
# retrieve the rrp including any sales tax
|
429
429
|
def rrp_inc_sales_tax
|
430
|
-
price_get(2).
|
430
|
+
price_get(2).try(:price_amount)
|
431
431
|
end
|
432
432
|
|
433
433
|
# set the rrp including any sales tax
|
@@ -438,7 +438,7 @@ module ONIX
|
|
438
438
|
# just get the first price we can find, regardless of the type.
|
439
439
|
# useful as a backup for reading files from that don't contain a type
|
440
440
|
def price
|
441
|
-
price_get(nil).
|
441
|
+
price_get(nil).try(:price_amount)
|
442
442
|
end
|
443
443
|
|
444
444
|
# retrieve the height of the product
|
@@ -448,7 +448,7 @@ module ONIX
|
|
448
448
|
#
|
449
449
|
def height
|
450
450
|
# TODO: auto unit conversion
|
451
|
-
measurement(1).
|
451
|
+
measurement(1).try(:measurement)
|
452
452
|
end
|
453
453
|
|
454
454
|
# set the height of the book
|
@@ -471,7 +471,7 @@ module ONIX
|
|
471
471
|
#
|
472
472
|
def width
|
473
473
|
# TODO: auto unit conversion
|
474
|
-
measurement(2).
|
474
|
+
measurement(2).try(:measurement)
|
475
475
|
end
|
476
476
|
|
477
477
|
# set the width of the product
|
@@ -494,7 +494,7 @@ module ONIX
|
|
494
494
|
#
|
495
495
|
def weight
|
496
496
|
# TODO: auto unit conversion
|
497
|
-
measurement(8).
|
497
|
+
measurement(8).try(:measurement)
|
498
498
|
end
|
499
499
|
|
500
500
|
# set the weight of the product
|
@@ -517,7 +517,7 @@ module ONIX
|
|
517
517
|
#
|
518
518
|
def thickness
|
519
519
|
# TODO: auto unit conversion
|
520
|
-
measurement(3).
|
520
|
+
measurement(3).try(:measurement)
|
521
521
|
end
|
522
522
|
|
523
523
|
# set the thickness of the product
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX
|
4
|
+
|
5
|
+
# See also: SalesRights. ONIX 2.1 prefers NotForSale blocks if a product is
|
6
|
+
# not for sale, but this can also be specified with SalesRightsType in
|
7
|
+
# SalesRights.
|
8
|
+
#
|
9
|
+
class NotForSale
|
10
|
+
|
11
|
+
include ROXML
|
12
|
+
|
13
|
+
xml_name "NotForSale"
|
14
|
+
xml_accessor(:rights_countries, :from => "RightsCountry", :to_xml => ONIX::Formatters.space_separated) { |v| v.split if v }
|
15
|
+
xml_accessor(:rights_territories, :from => "RightsTerritory", :to_xml => ONIX::Formatters.space_separated) { |v| v.split if v }
|
16
|
+
xml_accessor(:product_identifiers, :from => "ProductIdentifier", :as => [ONIX::ProductIdentifier])
|
17
|
+
xml_accessor(:publisher_name, :from => "PublisherName")
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
data/lib/onix/product.rb
CHANGED
@@ -42,6 +42,8 @@ module ONIX
|
|
42
42
|
end
|
43
43
|
xml_accessor :copyright_year, :from => "CopyrightYear", :as => Integer
|
44
44
|
xml_accessor :year_first_published, :from => "YearFirstPublished", :as => Fixnum
|
45
|
+
xml_accessor :sales_rights, :from => "SalesRights", :as => [ONIX::SalesRights]
|
46
|
+
xml_accessor :not_for_sales, :from => "NotForSale", :as => [ONIX::NotForSale]
|
45
47
|
xml_accessor :sales_restrictions, :from => "SalesRestriction", :as => [ONIX::SalesRestriction]
|
46
48
|
xml_accessor :measurements, :from => "Measure", :as => [ONIX::Measure]
|
47
49
|
xml_accessor :related_products, :from => "RelatedProduct", :as => [ONIX::RelatedProduct]
|
data/lib/onix/reader.rb
CHANGED
@@ -25,7 +25,7 @@ module ONIX
|
|
25
25
|
# in a shim that provides simple accessor access to common attributes, pass the
|
26
26
|
# shim class as a second argument
|
27
27
|
#
|
28
|
-
# reader = ONIX::Reader.new("somefile.xml", ONIX::APAProduct)
|
28
|
+
# reader = ONIX::Reader.new("somefile.xml", :product_class => ONIX::APAProduct)
|
29
29
|
#
|
30
30
|
# puts reader.header.inspect
|
31
31
|
#
|
@@ -39,7 +39,7 @@ module ONIX
|
|
39
39
|
# As well as accessing the file header, there are handful of other read only
|
40
40
|
# attributes that might be useful
|
41
41
|
#
|
42
|
-
# reader = ONIX::Reader.new("somefile.xml"
|
42
|
+
# reader = ONIX::Reader.new("somefile.xml")
|
43
43
|
#
|
44
44
|
# puts reader.version
|
45
45
|
# puts reader.xml_lang
|
@@ -50,23 +50,50 @@ module ONIX
|
|
50
50
|
# ONIX spec, and you may need to handle the file differently based on what
|
51
51
|
# version it is.
|
52
52
|
#
|
53
|
+
# == File Encoding
|
54
|
+
#
|
55
|
+
# ONIX::Reader returns all strings as UTF-8. Source file encoding is detected by
|
56
|
+
# the encoding declaration at the top of the file, like so:
|
57
|
+
#
|
58
|
+
# <?xml version="1.0" encoding="iso-8859-1"?>
|
59
|
+
#
|
60
|
+
# If the encoding declaration is missing the file is assumed to be UTF-8.
|
61
|
+
#
|
62
|
+
# If the encoding declaration is missing or wrong and the file isn't UTF-8,
|
63
|
+
# you can manually set or override it like so:
|
64
|
+
#
|
65
|
+
# reader = ONIX::Reader.new("somefile.xml", :encoding => "iso-8859-1")
|
66
|
+
#
|
67
|
+
# If the file contains invalid bytes for the source encoding an exception will
|
68
|
+
# be raised. This isn't ideal, but I'm still looking for ways to make this
|
69
|
+
# behaviour configurable.
|
70
|
+
#
|
71
|
+
# If you're running 1.9, you might imagine passing an IO stream that auto
|
72
|
+
# transcodes to UTF-8 into ONIX::Reader might have the same effect, but that
|
73
|
+
# isn't the case. Nokogiri is used to parse the file, and it seems to ignore
|
74
|
+
# IO encoding and just read raw bytes.
|
75
|
+
#
|
53
76
|
class Reader
|
54
77
|
include Enumerable
|
55
78
|
|
56
79
|
attr_reader :header, :release
|
57
80
|
|
58
|
-
def initialize(input,
|
81
|
+
def initialize(input, *args)
|
82
|
+
opts = args.last.kind_of?(Hash) ? args.pop : {}
|
83
|
+
if args.size > 0
|
84
|
+
ActiveSupport::Deprecation.warn("Passing a klass as ONIX::Reader's second argument is deprecated, use the :product_class option instead", caller)
|
85
|
+
end
|
86
|
+
@product_klass = opts[:product_class] || args.pop || ::ONIX::Product
|
87
|
+
|
59
88
|
if input.kind_of?(String)
|
60
89
|
@file = File.open(input, "r")
|
61
|
-
@reader = Nokogiri::XML::Reader(@file) { |cfg| cfg.dtdload.noent }
|
90
|
+
@reader = Nokogiri::XML::Reader(@file, nil, opts[:encoding]) { |cfg| cfg.dtdload.noent }
|
62
91
|
elsif input.kind_of?(IO)
|
63
|
-
@reader = Nokogiri::XML::Reader(input) { |cfg| cfg.dtdload.noent }
|
92
|
+
@reader = Nokogiri::XML::Reader(input, nil, opts[:encoding]) { |cfg| cfg.dtdload.noent }
|
64
93
|
else
|
65
94
|
raise ArgumentError, "Unable to read from file or IO stream"
|
66
95
|
end
|
67
96
|
|
68
|
-
@product_klass = product_klass
|
69
|
-
|
70
97
|
@release = find_release
|
71
98
|
@header = find_header
|
72
99
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX
|
4
|
+
|
5
|
+
# See also: NotForSale. It's possible to set not for sale here as well.
|
6
|
+
#
|
7
|
+
class SalesRights
|
8
|
+
include ROXML
|
9
|
+
|
10
|
+
xml_name "SalesRights"
|
11
|
+
xml_accessor :sales_rights_type, :from => "SalesRightsType", :as => Fixnum, :to_xml => ONIX::Formatters.two_digit
|
12
|
+
xml_accessor(:rights_countries, :from => "RightsCountry", :to_xml => ONIX::Formatters.space_separated) { |v| v.split if v }
|
13
|
+
xml_accessor(:rights_territories, :from => "RightsTerritory", :to_xml => ONIX::Formatters.space_separated) { |v| v.split if v }
|
14
|
+
|
15
|
+
# Deprecated accessors
|
16
|
+
xml_accessor(:rights_region, :from => "RightsRegion", :as => [])
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
data/lib/onix/series.rb
CHANGED
@@ -15,7 +15,7 @@ module ONIX
|
|
15
15
|
|
16
16
|
# retrieve the proprietary series ID
|
17
17
|
def proprietary_series_id
|
18
|
-
series_identifier(1).
|
18
|
+
series_identifier(1).try(:id_value)
|
19
19
|
end
|
20
20
|
|
21
21
|
# set a new proprietary series ID
|
@@ -25,7 +25,7 @@ module ONIX
|
|
25
25
|
|
26
26
|
# retrieve the issn
|
27
27
|
def issn
|
28
|
-
series_identifier(2).
|
28
|
+
series_identifier(2).try(:id_value)
|
29
29
|
end
|
30
30
|
|
31
31
|
# set a new issn
|
data/lib/onix/version.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
4
|
+
|
5
|
+
describe ONIX::NotForSale do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
load_doc_and_root("sales_rights.xml")
|
9
|
+
@nfs = @root.at_css("NotForSale")
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
it "should correctly convert to a string" do
|
14
|
+
rep = ONIX::NotForSale.from_xml(@nfs.to_s)
|
15
|
+
rep.should produce_the_tag("<NotForSale>")
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
it "should provide read access to first level attributes" do
|
20
|
+
p = ONIX::Product.from_xml(@root.to_s)
|
21
|
+
p.not_for_sales[0].rights_countries.should eql(["UK"])
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
it "should provide write access to first level attributes" do
|
26
|
+
nfs = ONIX::NotForSale.new
|
27
|
+
nfs.rights_countries = ["UK", "US", "IR"]
|
28
|
+
nfs.should include_the_xml("<RightsCountry>UK US IR</RightsCountry>")
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/spec/reader_spec.rb
CHANGED
@@ -12,6 +12,7 @@ describe ONIX::Reader do
|
|
12
12
|
@entity_file = File.join(@data_path, "entities.xml")
|
13
13
|
@utf_16_file = File.join(@data_path, "utf_16.xml")
|
14
14
|
@iso_8859_1_file = File.join(@data_path, "iso_8859_1.xml")
|
15
|
+
@no_encoding_decl_file = File.join(@data_path, "aau.xml")
|
15
16
|
end
|
16
17
|
|
17
18
|
it "should initialize with a filename" do
|
@@ -90,19 +91,36 @@ describe ONIX::Reader do
|
|
90
91
|
|
91
92
|
it "should transparently convert a iso-8859-1 file to utf-8" do
|
92
93
|
reader = ONIX::Reader.new(@iso_8859_1_file)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
94
|
+
reader.each do |product|
|
95
|
+
if RUBY_VERSION >= "1.9"
|
96
|
+
utf8 = Encoding.find("utf-8")
|
97
|
+
product.contributors[0].person_name_inverted.encoding.should eql(utf8)
|
98
|
+
end
|
97
99
|
|
98
|
-
|
99
|
-
if RUBY_VERSION >= "1.9"
|
100
|
-
utf8 = Encoding.find("utf-8")
|
101
|
-
product.contributors[0].person_name_inverted.encoding.should eql(utf8)
|
100
|
+
product.contributors[0].person_name_inverted.should eql("Küng, Hans")
|
102
101
|
end
|
102
|
+
end
|
103
103
|
|
104
|
-
|
104
|
+
# This isn't ideal behaviour, but i'm somewhat hamstrung by nokogiri API. It'd
|
105
|
+
# be nice to have the option to replace unrecognised bytes with a valid char.
|
106
|
+
it "should raise an exception when an iso-8859-1 file isn't declared as such" do
|
107
|
+
reader = ONIX::Reader.new(@no_encoding_decl_file)
|
108
|
+
lambda {
|
109
|
+
reader.each do |product|
|
110
|
+
end
|
111
|
+
}.should raise_error(Nokogiri::XML::SyntaxError)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should transparently convert an iso-8859-1 file to utf-8 when there's no declaration but the user manually specifies iso-8859-1" do
|
115
|
+
reader = ONIX::Reader.new(@no_encoding_decl_file, :encoding => "iso-8859-1")
|
116
|
+
reader.each do |product|
|
117
|
+
if RUBY_VERSION >= "1.9"
|
118
|
+
utf8 = Encoding.find("utf-8")
|
119
|
+
product.contributors[0].person_name_inverted.encoding.should eql(utf8)
|
120
|
+
end
|
105
121
|
|
122
|
+
product.contributors[0].person_name_inverted.should eql("Melo,Patr¡cia")
|
123
|
+
end
|
106
124
|
end
|
107
125
|
|
108
126
|
it "should transparently convert a utf-16 file to utf-8" do
|
@@ -119,6 +137,19 @@ describe ONIX::Reader do
|
|
119
137
|
end
|
120
138
|
|
121
139
|
product.contributors[0].person_name_inverted.should eql("Küng, Hans")
|
140
|
+
end
|
122
141
|
|
142
|
+
it "should support returning an APAProduct using deprecated API" do
|
143
|
+
reader = ONIX::Reader.new(@file1, ONIX::APAProduct)
|
144
|
+
reader.each do |product|
|
145
|
+
product.should be_a_kind_of(ONIX::APAProduct)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should support returning an APAProduct using new API" do
|
150
|
+
reader = ONIX::Reader.new(@file1, :product_class => ONIX::APAProduct)
|
151
|
+
reader.each do |product|
|
152
|
+
product.should be_a_kind_of(ONIX::APAProduct)
|
153
|
+
end
|
123
154
|
end
|
124
155
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
4
|
+
|
5
|
+
describe ONIX::SalesRights do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
load_doc_and_root("sales_rights.xml")
|
9
|
+
@first_right = @root.at_css("SalesRights")
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
it "should correctly convert to a string" do
|
14
|
+
rep = ONIX::SalesRights.from_xml(@first_right.to_s)
|
15
|
+
rep.should produce_the_tag("<SalesRights")
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
it "should provide read access to first level attributes" do
|
20
|
+
p = ONIX::Product.from_xml(@root.to_s)
|
21
|
+
p.sales_rights[0].sales_rights_type.should eql(1)
|
22
|
+
p.sales_rights[1].rights_countries.should eql(["AU", "NZ"])
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
it "should provide write access to first level attributes" do
|
27
|
+
sr = ONIX::SalesRights.new
|
28
|
+
sr.sales_rights_type = 2
|
29
|
+
sr.should include_the_xml("<SalesRightsType>02</SalesRightsType>")
|
30
|
+
sr.rights_territories = ["WORLD"]
|
31
|
+
sr.should include_the_xml("<RightsTerritory>WORLD</RightsTerritory>")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should provide an array for deprecated rights regions" do
|
35
|
+
p = ONIX::Product.from_xml(@root.to_s)
|
36
|
+
p.sales_rights[2].rights_region.should eql(["001", "002", "003", "004"])
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -8,3 +8,38 @@ require 'date'
|
|
8
8
|
require 'stringio'
|
9
9
|
require 'rubygems'
|
10
10
|
require 'onix'
|
11
|
+
|
12
|
+
|
13
|
+
module ONIX::SpecHelpers
|
14
|
+
|
15
|
+
def load_doc_and_root(subpath)
|
16
|
+
data_path = File.join(File.dirname(__FILE__), '..', 'data')
|
17
|
+
file1 = File.join(data_path, subpath)
|
18
|
+
@doc = Nokogiri::XML::Document.parse(File.read(file1))
|
19
|
+
@root = @doc.root
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
include ONIX::SpecHelpers
|
25
|
+
|
26
|
+
|
27
|
+
RSpec::Matchers.define(:produce_the_tag) do |expected|
|
28
|
+
match do |actual|
|
29
|
+
actual.to_xml.to_s[0, expected.size] == expected
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
RSpec::Matchers.define(:include_the_xml) do |expected|
|
34
|
+
match do |actual|
|
35
|
+
actual.to_xml.to_s.include?(expected)
|
36
|
+
end
|
37
|
+
|
38
|
+
failure_message_for_should do |actual|
|
39
|
+
"expected '#{actual.to_xml.to_s}' to include the xml '#{expected}'"
|
40
|
+
end
|
41
|
+
|
42
|
+
failure_message_for_should_not do |actual|
|
43
|
+
"expected '#{actual.to_xml.to_s}' not to include the xml '#{expected}'"
|
44
|
+
end
|
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: 39
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 8
|
9
|
-
-
|
10
|
-
version: 0.8.
|
9
|
+
- 12
|
10
|
+
version: 0.8.12
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- James Healy
|
@@ -16,14 +16,15 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-
|
20
|
-
default_executable:
|
19
|
+
date: 2011-11-29 00:00:00 Z
|
21
20
|
dependencies:
|
22
21
|
- !ruby/object:Gem::Dependency
|
23
|
-
|
22
|
+
name: roxml
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
25
|
none: false
|
25
26
|
requirements:
|
26
|
-
- -
|
27
|
+
- - ~>
|
27
28
|
- !ruby/object:Gem::Version
|
28
29
|
hash: 15
|
29
30
|
segments:
|
@@ -31,26 +32,28 @@ dependencies:
|
|
31
32
|
- 1
|
32
33
|
- 6
|
33
34
|
version: 3.1.6
|
34
|
-
prerelease: false
|
35
35
|
type: :runtime
|
36
|
-
|
37
|
-
name: roxml
|
36
|
+
version_requirements: *id001
|
38
37
|
- !ruby/object:Gem::Dependency
|
39
|
-
|
38
|
+
name: activesupport
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
41
|
none: false
|
41
42
|
requirements:
|
42
43
|
- - ">="
|
43
44
|
- !ruby/object:Gem::Version
|
44
|
-
hash:
|
45
|
+
hash: 1
|
45
46
|
segments:
|
47
|
+
- 3
|
46
48
|
- 0
|
47
|
-
|
48
|
-
|
49
|
+
- 3
|
50
|
+
version: 3.0.3
|
49
51
|
type: :runtime
|
50
|
-
|
51
|
-
name: i18n
|
52
|
+
version_requirements: *id002
|
52
53
|
- !ruby/object:Gem::Dependency
|
53
|
-
|
54
|
+
name: i18n
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
57
|
none: false
|
55
58
|
requirements:
|
56
59
|
- - ">="
|
@@ -59,27 +62,27 @@ dependencies:
|
|
59
62
|
segments:
|
60
63
|
- 0
|
61
64
|
version: "0"
|
62
|
-
prerelease: false
|
63
65
|
type: :runtime
|
64
|
-
|
65
|
-
name: andand
|
66
|
+
version_requirements: *id003
|
66
67
|
- !ruby/object:Gem::Dependency
|
67
|
-
|
68
|
+
name: nokogiri
|
69
|
+
prerelease: false
|
70
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
68
71
|
none: false
|
69
72
|
requirements:
|
70
|
-
- -
|
73
|
+
- - ~>
|
71
74
|
- !ruby/object:Gem::Version
|
72
75
|
hash: 7
|
73
76
|
segments:
|
74
77
|
- 1
|
75
78
|
- 4
|
76
79
|
version: "1.4"
|
77
|
-
prerelease: false
|
78
80
|
type: :runtime
|
79
|
-
|
80
|
-
name: nokogiri
|
81
|
+
version_requirements: *id004
|
81
82
|
- !ruby/object:Gem::Dependency
|
82
|
-
|
83
|
+
name: rake
|
84
|
+
prerelease: false
|
85
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
83
86
|
none: false
|
84
87
|
requirements:
|
85
88
|
- - ">="
|
@@ -88,12 +91,12 @@ dependencies:
|
|
88
91
|
segments:
|
89
92
|
- 0
|
90
93
|
version: "0"
|
91
|
-
prerelease: false
|
92
94
|
type: :development
|
93
|
-
|
94
|
-
name: rake
|
95
|
+
version_requirements: *id005
|
95
96
|
- !ruby/object:Gem::Dependency
|
96
|
-
|
97
|
+
name: rspec
|
98
|
+
prerelease: false
|
99
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
97
100
|
none: false
|
98
101
|
requirements:
|
99
102
|
- - ~>
|
@@ -103,10 +106,8 @@ dependencies:
|
|
103
106
|
- 2
|
104
107
|
- 1
|
105
108
|
version: "2.1"
|
106
|
-
prerelease: false
|
107
109
|
type: :development
|
108
|
-
|
109
|
-
name: rspec
|
110
|
+
version_requirements: *id006
|
110
111
|
description: A fork of the original onix gem by James Healy. Differs from original mainly in it's adjustments for the US school/library market as applied in the product wrapper SLProduct.
|
111
112
|
email:
|
112
113
|
- jimmy@deefa.com
|
@@ -135,6 +136,7 @@ files:
|
|
135
136
|
- lib/onix/measure.rb
|
136
137
|
- lib/onix/media_file.rb
|
137
138
|
- lib/onix/normaliser.rb
|
139
|
+
- lib/onix/not_for_sale.rb
|
138
140
|
- lib/onix/other_text.rb
|
139
141
|
- lib/onix/price.rb
|
140
142
|
- lib/onix/product.rb
|
@@ -144,6 +146,7 @@ files:
|
|
144
146
|
- lib/onix/reader.rb
|
145
147
|
- lib/onix/related_product.rb
|
146
148
|
- lib/onix/sales_restriction.rb
|
149
|
+
- lib/onix/sales_rights.rb
|
147
150
|
- lib/onix/sender_identifier.rb
|
148
151
|
- lib/onix/series.rb
|
149
152
|
- lib/onix/series_identifier.rb
|
@@ -350,6 +353,7 @@ files:
|
|
350
353
|
- spec/measure_spec.rb
|
351
354
|
- spec/media_file_spec.rb
|
352
355
|
- spec/normaliser_spec.rb
|
356
|
+
- spec/not_for_sale_spec.rb
|
353
357
|
- spec/other_text_spec.rb
|
354
358
|
- spec/price_spec.rb
|
355
359
|
- spec/product_identifier_spec.rb
|
@@ -359,6 +363,7 @@ files:
|
|
359
363
|
- spec/reader_spec.rb
|
360
364
|
- spec/related_product_spec.rb
|
361
365
|
- spec/sales_restriction_spec.rb
|
366
|
+
- spec/sales_rights_spec.rb
|
362
367
|
- spec/sender_identifier.rb
|
363
368
|
- spec/series_identifier_spec.rb
|
364
369
|
- spec/series_spec.rb
|
@@ -373,7 +378,6 @@ files:
|
|
373
378
|
- spec/work_identifier_spec.rb
|
374
379
|
- spec/work_identifiers_spec.rb
|
375
380
|
- spec/writer_spec.rb
|
376
|
-
has_rdoc: true
|
377
381
|
homepage: http://github.com/milkfarm/onix
|
378
382
|
licenses: []
|
379
383
|
|
@@ -405,10 +409,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
405
409
|
requirements: []
|
406
410
|
|
407
411
|
rubyforge_project:
|
408
|
-
rubygems_version: 1.
|
412
|
+
rubygems_version: 1.8.10
|
409
413
|
signing_key:
|
410
414
|
specification_version: 3
|
411
|
-
summary: A
|
415
|
+
summary: A convenient mapping between Ruby objects and the ONIX XML specification
|
412
416
|
test_files:
|
413
417
|
- spec/apa_product_spec.rb
|
414
418
|
- spec/audience_range_spec.rb
|
@@ -424,6 +428,7 @@ test_files:
|
|
424
428
|
- spec/measure_spec.rb
|
425
429
|
- spec/media_file_spec.rb
|
426
430
|
- spec/normaliser_spec.rb
|
431
|
+
- spec/not_for_sale_spec.rb
|
427
432
|
- spec/other_text_spec.rb
|
428
433
|
- spec/price_spec.rb
|
429
434
|
- spec/product_identifier_spec.rb
|
@@ -433,6 +438,7 @@ test_files:
|
|
433
438
|
- spec/reader_spec.rb
|
434
439
|
- spec/related_product_spec.rb
|
435
440
|
- spec/sales_restriction_spec.rb
|
441
|
+
- spec/sales_rights_spec.rb
|
436
442
|
- spec/sender_identifier.rb
|
437
443
|
- spec/series_identifier_spec.rb
|
438
444
|
- spec/series_spec.rb
|