elibri_onix 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +7 -7
- data/README.rdoc +48 -1
- data/elibri_onix.gemspec +2 -2
- data/lib/elibri_onix/hash_id.rb +37 -0
- data/lib/elibri_onix/onix_3_0/audience_range.rb +4 -0
- data/lib/elibri_onix/onix_3_0/collection.rb +0 -0
- data/lib/elibri_onix/onix_3_0/contributor.rb +9 -0
- data/lib/elibri_onix/onix_3_0/extent.rb +4 -0
- data/lib/elibri_onix/onix_3_0/header.rb +6 -0
- data/lib/elibri_onix/onix_3_0/imprint.rb +6 -0
- data/lib/elibri_onix/onix_3_0/language.rb +4 -0
- data/lib/elibri_onix/onix_3_0/measure.rb +9 -3
- data/lib/elibri_onix/onix_3_0/onix_message.rb +5 -1
- data/lib/elibri_onix/onix_3_0/price.rb +5 -0
- data/lib/elibri_onix/onix_3_0/product.rb +4 -1
- data/lib/elibri_onix/onix_3_0/product_identifier.rb +7 -0
- data/lib/elibri_onix/onix_3_0/publisher.rb +5 -0
- data/lib/elibri_onix/onix_3_0/publishing_date.rb +7 -0
- data/lib/elibri_onix/onix_3_0/related_product.rb +5 -0
- data/lib/elibri_onix/onix_3_0/sales_restriction.rb +6 -0
- data/lib/elibri_onix/onix_3_0/sender.rb +4 -0
- data/lib/elibri_onix/onix_3_0/stock_quantity_coded.rb +7 -0
- data/lib/elibri_onix/onix_3_0/subject.rb +9 -3
- data/lib/elibri_onix/onix_3_0/supplier.rb +5 -0
- data/lib/elibri_onix/onix_3_0/supplier_identifier.rb +8 -0
- data/lib/elibri_onix/onix_3_0/supply_detail.rb +7 -0
- data/lib/elibri_onix/onix_3_0/supporting_resource.rb +3 -0
- data/lib/elibri_onix/onix_3_0/text_content.rb +6 -3
- data/lib/elibri_onix/onix_3_0/title_detail.rb +10 -3
- data/lib/elibri_onix/onix_3_0/title_element.rb +15 -0
- data/lib/elibri_onix/version.rb +4 -1
- data/lib/elibri_onix.rb +1 -0
- metadata +297 -252
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
elibri_onix (0.2.
|
4
|
+
elibri_onix (0.2.1)
|
5
5
|
activesupport (>= 2.3.5)
|
6
6
|
elibri_onix_dict (>= 0.0.5)
|
7
7
|
i18n
|
@@ -10,20 +10,20 @@ PATH
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
-
activesupport (3.2.
|
13
|
+
activesupport (3.2.5)
|
14
14
|
i18n (~> 0.6)
|
15
15
|
multi_json (~> 1.0)
|
16
16
|
coderay (1.0.6)
|
17
|
-
elibri_onix_dict (0.0.
|
17
|
+
elibri_onix_dict (0.0.15)
|
18
18
|
i18n (0.6.0)
|
19
19
|
metaclass (0.0.1)
|
20
20
|
method_source (0.7.1)
|
21
|
-
minitest (3.0.
|
21
|
+
minitest (3.0.1)
|
22
22
|
mocha (0.11.4)
|
23
23
|
metaclass (~> 0.0.1)
|
24
|
-
multi_json (1.3.
|
25
|
-
nokogiri (1.5.
|
26
|
-
nokogiri (1.5.
|
24
|
+
multi_json (1.3.6)
|
25
|
+
nokogiri (1.5.3)
|
26
|
+
nokogiri (1.5.3-java)
|
27
27
|
pry (0.9.9.6)
|
28
28
|
coderay (~> 1.0.5)
|
29
29
|
method_source (~> 0.7.1)
|
data/README.rdoc
CHANGED
@@ -6,7 +6,54 @@
|
|
6
6
|
|
7
7
|
== Description
|
8
8
|
|
9
|
-
|
9
|
+
This is gem designed to parse eLibri generated onix files.
|
10
|
+
If you don't have access to eLibri api, but you still want to make some us of it - check elibri_onix_mocks gem for mocks and examples of using it.
|
11
|
+
|
12
|
+
== Usage
|
13
|
+
|
14
|
+
Usage depends on what you want to parse. In normal usage, when you received response from eLibri server you want to parse it using ONIXMessage class. Therefore you need to execute:
|
15
|
+
|
16
|
+
Elibri::ONIX::Release_3_0::ONIXMessage.new(xml_data)
|
17
|
+
|
18
|
+
xml_data should be string containing ONIX xml you want to parse.
|
19
|
+
|
20
|
+
Creating a new ONIXMessage object will also create embedded objects inside - representing structure of xml file.
|
21
|
+
ONIXMessage -> many Product(s)
|
22
|
+
Product -> many ProductIdentifier(s)
|
23
|
+
Product -> many RelatedProduct(s)
|
24
|
+
RelatedProduct -> many ProductIdentifier(s)
|
25
|
+
Product -> many SupplyDetail(s)
|
26
|
+
SupplyDetail -> one Supplier
|
27
|
+
SupplyDetail -> one Price
|
28
|
+
SupplyDetail -> one StockQuantityCoded
|
29
|
+
Product -> many Measure(s)
|
30
|
+
Product -> many TitleDetail(s)
|
31
|
+
TitleDetail -> many TitleElement(s)
|
32
|
+
Product -> many Collection(s)
|
33
|
+
Collection -> many TitleElement(s)
|
34
|
+
Collection -> one TitleDetail
|
35
|
+
Product -> many Contributor(s)
|
36
|
+
Product -> many Language(s)
|
37
|
+
Product -> many Extent(s)
|
38
|
+
Product -> many Subject(s)
|
39
|
+
Product -> many AudienceRange(s)
|
40
|
+
Product -> many TextContent(s)
|
41
|
+
Product -> many SupportingResource(s)
|
42
|
+
Product -> one Imprint
|
43
|
+
Product -> one Publisher
|
44
|
+
Product -> one PublishingDate
|
45
|
+
Product -> many SalesRestriction(s)
|
46
|
+
ONIXMessage -> one Header
|
47
|
+
Header -> one Sender
|
48
|
+
|
49
|
+
|
50
|
+
However if you have only fragment of xml that you want to parse - for example Contributor, you may parse only this fragment invoking constructor of appropriate class, providing xml as an argument, for example:
|
51
|
+
|
52
|
+
Elibri::ONIX::Release_3_0::Contributor.new(xml_data)
|
53
|
+
|
54
|
+
Each object provide method to_xml which will return xml used to construct it.
|
55
|
+
|
56
|
+
Object contains attributes, which are represented by instance variables. You can see list of attributes in FIELDS file.
|
10
57
|
|
11
58
|
== Contributing to elibri_onix
|
12
59
|
|
data/elibri_onix.gemspec
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
require File.expand_path('../lib/elibri_onix/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = ["Marcin Urbanski"]
|
6
|
-
gem.email = ["marcin@urbanski.vdl.pl"]
|
5
|
+
gem.authors = ["Marcin Urbanski", "Piotr Szmielew"]
|
6
|
+
gem.email = ["marcin@urbanski.vdl.pl", "p.szmielew@ava.waw.pl"]
|
7
7
|
gem.description = %q{EDItEUR ONIX format subset implementation used in Elibri publication system}
|
8
8
|
gem.summary = %q{EDItEUR ONIX format subset implementation used in Elibri publication system}
|
9
9
|
gem.homepage = "http://github.com/elibri/elibri_onix"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module HashId
|
2
|
+
|
3
|
+
SKIPPED_ATTRIBS = ["@opts", "@default_namespace", "@instance", "@roxml_references"]
|
4
|
+
SKIPPED_2 = ["@id", "@id_before_type_cast"]
|
5
|
+
|
6
|
+
def eid
|
7
|
+
calculate_hash(self)
|
8
|
+
end
|
9
|
+
|
10
|
+
def calculate_hash(object)
|
11
|
+
result = []
|
12
|
+
if object.is_a? Array
|
13
|
+
object.each { |x| result << calculate_hash(x) }
|
14
|
+
else
|
15
|
+
vars = []
|
16
|
+
if object.class.to_s.include? "Elibri::ONIX"
|
17
|
+
vars += object.class::ATTRIBUTES
|
18
|
+
vars += object.class::RELATIONS
|
19
|
+
end
|
20
|
+
vars = object.instance_variables if vars.blank?
|
21
|
+
vars.each do |attrib|
|
22
|
+
next if SKIPPED_ATTRIBS.include? attrib
|
23
|
+
next if SKIPPED_2.include? attrib
|
24
|
+
attrib = attrib.to_s.gsub("@", "").to_sym if attrib.is_a?(String)
|
25
|
+
if object.send(attrib).is_a? Array
|
26
|
+
result << calculate_hash(object.send(attrib))
|
27
|
+
elsif object.send(attrib).is_a?(String) || object.send(attrib).is_a?(Numeric) || object.send(attrib).is_a?(Fixnum) || object.send(attrib).is_a?(Symbol)
|
28
|
+
result << object.send(attrib)
|
29
|
+
else
|
30
|
+
result << calculate_hash(object.send(attrib))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
return Digest::SHA1.hexdigest(result.join("-"))
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -5,6 +5,10 @@ module Elibri
|
|
5
5
|
|
6
6
|
class AudienceRange
|
7
7
|
|
8
|
+
#from ONIX documentation:
|
9
|
+
#An optional and repeatable group of data elements which together describe an audience or readership range for which a product
|
10
|
+
#is intended.
|
11
|
+
|
8
12
|
ATTRIBUTES = [
|
9
13
|
:qualifier, :precision, :value
|
10
14
|
]
|
Binary file
|
@@ -7,6 +7,15 @@ module Elibri
|
|
7
7
|
include ExternalId
|
8
8
|
include ExternalTimestamp
|
9
9
|
|
10
|
+
#from ONIX documentation:
|
11
|
+
#Authorship and other forms of contribution are described by repeats of the <Contributor> composite,
|
12
|
+
#within which the recommended form of representation of a person name is the structured data element
|
13
|
+
#group consisting of Person name part 1 to Person name part 8. A single occurrence of the composite may
|
14
|
+
#carry both the primary name of a contributor, and one or more alternative names,
|
15
|
+
#for example if a contributor is referenced both by their real name and by a pseudonym,
|
16
|
+
#or by the name given on the title page and by an authority-controlled name.
|
17
|
+
#In addition, more than one representation of the same name may be sent.
|
18
|
+
|
10
19
|
ATTRIBUTES =
|
11
20
|
[
|
12
21
|
:number, :role, :person_name, :from_language, :titles_before_names, :names_before_key, :prefix_to_key,
|
@@ -5,6 +5,10 @@ module Elibri
|
|
5
5
|
module Release_3_0
|
6
6
|
|
7
7
|
class Extent
|
8
|
+
|
9
|
+
#from ONIX documentation:
|
10
|
+
#covers product extents, in terms of pages, running times, file sizes etc, as may be appropriate to each media type.
|
11
|
+
#For products whose content is primarily readable text, it also covers illustrations and other kinds of ancillary matter such as the inclusion of a bibliography or index.
|
8
12
|
|
9
13
|
ATTRIBUTES = [
|
10
14
|
:type, :value, :unit, :type_name, :unit_name
|
@@ -5,6 +5,12 @@ module Elibri
|
|
5
5
|
module Release_3_0
|
6
6
|
|
7
7
|
class Header
|
8
|
+
|
9
|
+
#from ONIX documentation:
|
10
|
+
#A group of data elements which together constitute a message header.
|
11
|
+
#Mandatory in any ONIX for Books message, and non-repeating.
|
12
|
+
#In ONIX 3.0, a number of redundant elements have been deleted, and the Sender and Addressee structures and
|
13
|
+
#the name and format of the <SentDateTime> element have been made consistent with other current ONIX formats.
|
8
14
|
|
9
15
|
attr_accessor :sent_date_time, :sender, :to_xml
|
10
16
|
|
@@ -6,6 +6,12 @@ module Elibri
|
|
6
6
|
|
7
7
|
class Imprint
|
8
8
|
|
9
|
+
include HashId
|
10
|
+
|
11
|
+
#from ONIX documentation:
|
12
|
+
#A repeatable group of data elements which together identify an imprint or brand under which the product is marketed.
|
13
|
+
#The composite must carry either a name identifier or a name or both.
|
14
|
+
|
9
15
|
ATTRIBUTES = [
|
10
16
|
:name
|
11
17
|
]
|
@@ -6,6 +6,10 @@ module Elibri
|
|
6
6
|
|
7
7
|
class Language
|
8
8
|
|
9
|
+
#from ONIX documentation:
|
10
|
+
#An optional and repeatable group of data elements which together represent a language, and specify its role and,
|
11
|
+
#where required, whether it is a country variant.
|
12
|
+
|
9
13
|
ATTRIBUTES = [
|
10
14
|
:role, :code, :role_name, :language
|
11
15
|
]
|
@@ -6,6 +6,12 @@ module Elibri
|
|
6
6
|
|
7
7
|
class Measure
|
8
8
|
|
9
|
+
include HashId
|
10
|
+
|
11
|
+
#from ONIX documentation:
|
12
|
+
#An optional and repeatable group of data elements which together identify a measurement and the units in which
|
13
|
+
#it is expressed; used to specify the overall dimensions of a physical product including its packaging (if any).
|
14
|
+
|
9
15
|
ATTRIBUTES = [
|
10
16
|
:type, :measurement, :unit, :type_name
|
11
17
|
]
|
@@ -32,9 +38,9 @@ module Elibri
|
|
32
38
|
[:type_name]
|
33
39
|
end
|
34
40
|
|
35
|
-
|
36
|
-
|
37
|
-
|
41
|
+
# def eid
|
42
|
+
# @type.to_i
|
43
|
+
# end
|
38
44
|
|
39
45
|
def id
|
40
46
|
Kernel.warn "[DEPRECATION] `id` is deprecated. Please use `eid` instead."
|
@@ -8,6 +8,11 @@ module Elibri
|
|
8
8
|
|
9
9
|
class Price
|
10
10
|
|
11
|
+
#from ONIX documentation:
|
12
|
+
#A repeatable group of data elements which together specify a unit price.
|
13
|
+
|
14
|
+
include HashId
|
15
|
+
|
11
16
|
ATTRIBUTES = [
|
12
17
|
:type, :minimum_order_quantity, :amount, :currency_code, :printed_on_product,
|
13
18
|
:position_on_product, :tax_type, :tax_rate_percent, :vat
|
@@ -5,7 +5,10 @@ module Elibri
|
|
5
5
|
|
6
6
|
class Product
|
7
7
|
|
8
|
-
|
8
|
+
#class representing one Product from eLibri.
|
9
|
+
#important thing - record reference is unique eLibri identifier
|
10
|
+
|
11
|
+
|
9
12
|
ATTRIBUTES =
|
10
13
|
[
|
11
14
|
:elibri_dialect, :height, :width, :thickness, :weight, :ean, :isbn13, :number_of_pages, :duration,
|
@@ -4,6 +4,13 @@ module Elibri
|
|
4
4
|
module Release_3_0
|
5
5
|
|
6
6
|
class ProductIdentifier
|
7
|
+
|
8
|
+
#from ONIX documentation:
|
9
|
+
#A repeatable group of data elements which together define an identifier of a product in accordance with a specified scheme.
|
10
|
+
#As well as standard identifiers, the composite allows proprietary identifiers (SKUs) assigned by wholesalers or
|
11
|
+
#vendors to be sent as part of the ONIX record.
|
12
|
+
|
13
|
+
include HashId
|
7
14
|
|
8
15
|
attr_accessor :type, :type_name, :value, :to_xml
|
9
16
|
|
@@ -7,6 +7,11 @@ module Elibri
|
|
7
7
|
|
8
8
|
class Publisher
|
9
9
|
|
10
|
+
#from ONIX documentation:
|
11
|
+
#A repeatable group of data elements which together identify an entity which is associated with the publishing of a product.
|
12
|
+
#The composite allows additional publishing roles to be introduced without adding new fields.
|
13
|
+
#Each occurrence of the composite must carry a publishing role code and either a name identifier code or a name or both.
|
14
|
+
|
10
15
|
ATTRIBUTES = [
|
11
16
|
:role, :name, :eid
|
12
17
|
]
|
@@ -7,6 +7,13 @@ module Elibri
|
|
7
7
|
|
8
8
|
class PublishingDate
|
9
9
|
|
10
|
+
#from ONIX documentation:
|
11
|
+
#A repeatable group of data elements which together specify a date associated with the publishing of the product.
|
12
|
+
#Optional, but a date of publication must be specified either or in <MarketPublishingDetail> (P.25).
|
13
|
+
#Other dates related to the publishing of a product can be sent in further repeats.
|
14
|
+
|
15
|
+
include HashId
|
16
|
+
|
10
17
|
ATTRIBUTES = [
|
11
18
|
:role, :format, :date, :parsed
|
12
19
|
]
|
@@ -8,6 +8,11 @@ module Elibri
|
|
8
8
|
|
9
9
|
class RelatedProduct
|
10
10
|
|
11
|
+
#from ONIX documentation:
|
12
|
+
#An optional and repeatable group of data elements which together describe a product which has a specified relationship
|
13
|
+
#to the product described in the ONIX record.
|
14
|
+
include HashId
|
15
|
+
|
11
16
|
ATTRIBUTES = [
|
12
17
|
:relation_code, :proprietary_identifiers, :record_reference
|
13
18
|
]
|
@@ -6,6 +6,12 @@ module Elibri
|
|
6
6
|
module Release_3_0
|
7
7
|
|
8
8
|
class SalesRestriction
|
9
|
+
|
10
|
+
#from ONIX documentation:
|
11
|
+
#A group of data elements which together identify a non-territorial sales restriction which a publisher applies to a product.
|
12
|
+
#Optional and repeatable.
|
13
|
+
|
14
|
+
include HashId
|
9
15
|
|
10
16
|
ATTRIBUTES = [
|
11
17
|
:type, :outlet_name, :end_date
|
@@ -5,6 +5,10 @@ module Elibri
|
|
5
5
|
|
6
6
|
class Sender
|
7
7
|
|
8
|
+
#from ONIX documentation
|
9
|
+
#A group of data elements which together specify the sender of an ONIX for Books message.
|
10
|
+
#Mandatory in any ONIX for Books message, and non-repeating.
|
11
|
+
|
8
12
|
attr_accessor :sender_name, :contact_name, :email_address, :to_xml
|
9
13
|
|
10
14
|
ATTRIBUTES = [
|
@@ -3,6 +3,13 @@ module Elibri
|
|
3
3
|
module Release_3_0
|
4
4
|
|
5
5
|
class StockQuantityCoded
|
6
|
+
|
7
|
+
#from ONIX documentation:
|
8
|
+
#A group of data elements which together specify coded stock level without stating the exact quantity of stock.
|
9
|
+
#Either <StockQuantityCoded> or <OnHand> is mandatory in each occurrence of the <Stock> composite, even if
|
10
|
+
#the quantity on hand is zero. Non-repeating.
|
11
|
+
|
12
|
+
include HashId
|
6
13
|
|
7
14
|
ATTRIBUTES = [
|
8
15
|
:code_type, :code
|
@@ -6,6 +6,12 @@ module Elibri
|
|
6
6
|
|
7
7
|
class Subject
|
8
8
|
|
9
|
+
#from ONIX documentation:
|
10
|
+
#An optional and repeatable group of data elements which together specify a subject classification or subject heading.
|
11
|
+
|
12
|
+
include HashId
|
13
|
+
|
14
|
+
|
9
15
|
ATTRIBUTES = [
|
10
16
|
:scheme_identifier, :scheme_name, :scheme_version, :code, :heading_text, :main_subject
|
11
17
|
]
|
@@ -28,9 +34,9 @@ module Elibri
|
|
28
34
|
@main_subject == ''
|
29
35
|
end
|
30
36
|
|
31
|
-
|
32
|
-
|
33
|
-
|
37
|
+
# def eid
|
38
|
+
# @code
|
39
|
+
# end
|
34
40
|
|
35
41
|
def id
|
36
42
|
Kernel.warn "[DEPRECATION] `id` is deprecated. Please use `eid` instead."
|
@@ -6,6 +6,9 @@ module Elibri
|
|
6
6
|
module Release_3_0
|
7
7
|
|
8
8
|
class Supplier
|
9
|
+
|
10
|
+
#from ONIX documentation:
|
11
|
+
#A group of data elements which together define a supplier. Mandatory in each occurrence of the <SupplyDetail> composite, and not repeatable.
|
9
12
|
|
10
13
|
ATTRIBUTES = [
|
11
14
|
:role, :name, :telephone_number, :email_address, :website, :nip
|
@@ -15,6 +18,8 @@ module Elibri
|
|
15
18
|
:identifiers
|
16
19
|
]
|
17
20
|
|
21
|
+
include HashId
|
22
|
+
|
18
23
|
attr_accessor :role, :identifiers, :name, :telephone_number, :email_address, :website, :to_xml
|
19
24
|
|
20
25
|
def initialize(data)
|
@@ -7,6 +7,14 @@ module Elibri
|
|
7
7
|
module Release_3_0
|
8
8
|
|
9
9
|
class SupplierIdentifier
|
10
|
+
|
11
|
+
#from ONIX documentation:
|
12
|
+
#A repeatable group of data elements which together define the identifier of a supplier in accordance with a specified scheme,
|
13
|
+
#and allowing different types of supplier identifier to be included without defining additional data elements.
|
14
|
+
#Optional, but each occurrence of the <Supplier> composite must carry either at least one supplier identifier,
|
15
|
+
#or a <SupplierName>, or both.
|
16
|
+
|
17
|
+
include HashId
|
10
18
|
|
11
19
|
ATTRIBUTES = [
|
12
20
|
:type, :type_name, :value
|
@@ -6,6 +6,13 @@ module Elibri
|
|
6
6
|
module Release_3_0
|
7
7
|
|
8
8
|
class SupplyDetail
|
9
|
+
|
10
|
+
#from ONIX documentation:
|
11
|
+
#A group of data elements which together give details of a supply source, and price and availability from that source.
|
12
|
+
#Mandatory in each occurrence of the <ProductSupply> block and repeatable.
|
13
|
+
|
14
|
+
include HashId
|
15
|
+
|
9
16
|
|
10
17
|
ATTRIBUTES = [
|
11
18
|
:relation_code, :supplier, :product_availability, :pack_quantity, :price, :on_hand, :quantity_coded, :quantity_code
|
@@ -8,6 +8,9 @@ module Elibri
|
|
8
8
|
include ExternalId
|
9
9
|
include ExternalTimestamp
|
10
10
|
|
11
|
+
#from ONIX documentation:
|
12
|
+
#An optional and repeatable group of data elements which together describe a supporting resource.
|
13
|
+
|
11
14
|
ATTRIBUTES = [
|
12
15
|
:content_type, :mode, :form, :link, :content_type_name, :mode_name, :form_name
|
13
16
|
]
|
@@ -4,9 +4,12 @@ module Elibri
|
|
4
4
|
module Release_3_0
|
5
5
|
|
6
6
|
class TextContent
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
include ExternalId
|
8
|
+
include ExternalTimestamp
|
9
|
+
|
10
|
+
#from ONIX documentation:
|
11
|
+
#An optional and repeatable group of data elements which together carry text related to the product.
|
12
|
+
|
10
13
|
ATTRIBUTES = [
|
11
14
|
:type, :author, :source_title, :text, :source_url, :type_name
|
12
15
|
]
|
@@ -6,6 +6,13 @@ module Elibri
|
|
6
6
|
|
7
7
|
class TitleDetail
|
8
8
|
|
9
|
+
#from ONIX documentation:
|
10
|
+
#A repeatable group of data elements which together give the text of a collection title and specify its type.
|
11
|
+
#Optional, but the composite is required unless the collection title is carried in full, and word-for- word,
|
12
|
+
#as an integral part of the product title in P.6, in which case it should not be repeated in P.5.
|
13
|
+
|
14
|
+
include HashId
|
15
|
+
|
9
16
|
ATTRIBUTES = [
|
10
17
|
:type, :type_name, :full_title, :product_level_title, :product_level, :collection_level_title,
|
11
18
|
:collection_level
|
@@ -23,9 +30,9 @@ module Elibri
|
|
23
30
|
@elements = data.xpath('xmlns:TitleElement').map { |element_data| TitleElement.new(element_data) }
|
24
31
|
end
|
25
32
|
|
26
|
-
|
27
|
-
|
28
|
-
|
33
|
+
# def eid
|
34
|
+
# @type.to_i
|
35
|
+
# end
|
29
36
|
|
30
37
|
def id
|
31
38
|
Kernel.warn "[DEPRECATION] `id` is deprecated. Please use `eid` instead."
|
@@ -4,6 +4,21 @@ module Elibri
|
|
4
4
|
module Release_3_0
|
5
5
|
|
6
6
|
class TitleElement
|
7
|
+
|
8
|
+
#from ONIX documentation:
|
9
|
+
#A repeatable group of data elements which together represent an element of a collection title.
|
10
|
+
#At least one title element is mandatory in each occurrence of the <TitleDetail> composite.
|
11
|
+
#An instance of the <TitleElement> composite must include at least one of: <PartNumber>; <YearOfAnnual>; <TitleText>, or <TitlePrefix> together
|
12
|
+
#with <TitleWithoutPrefix>. In other words it must carry either the text of a title element or a part or year designation; and it may carry both.
|
13
|
+
#A title element must be designated as belonging to product level, collection level, or subcollection level
|
14
|
+
#(the first of these may not occur in a title element representing a collective identity, and the last-named may only occur
|
15
|
+
#in the case of a multi-level collection).
|
16
|
+
#In the simplest case, title detail sent in a <Collection> composite will consist of a single title element, at collection level.
|
17
|
+
#However, the composite structure in ONIX 3.0 allows more complex combinations of titles and part designations in multi-level
|
18
|
+
#collections to be correctly represented.
|
19
|
+
|
20
|
+
|
21
|
+
include HashId
|
7
22
|
|
8
23
|
ATTRIBUTES = [
|
9
24
|
:level, :part_number, :title, :subtitle, :full_title
|
data/lib/elibri_onix/version.rb
CHANGED
data/lib/elibri_onix.rb
CHANGED
@@ -9,6 +9,7 @@ require 'nokogiri'
|
|
9
9
|
require 'elibri_onix/version'
|
10
10
|
require 'elibri_onix/inspector'
|
11
11
|
require 'elibri_onix/external_id'
|
12
|
+
require 'elibri_onix/hash_id'
|
12
13
|
require 'elibri_onix/external_timestamp'
|
13
14
|
require 'elibri_onix/releases'
|
14
15
|
require 'elibri_onix/nokogiri_patch'
|
metadata
CHANGED
@@ -1,290 +1,335 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elibri_onix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 21
|
4
5
|
prerelease:
|
5
|
-
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
- 1
|
10
|
+
version: 0.2.1
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
|
-
|
13
|
+
- Marcin Urbanski
|
14
|
+
- Piotr Szmielew
|
9
15
|
autorequire:
|
10
16
|
bindir: bin
|
11
17
|
cert_chain: []
|
12
18
|
|
13
|
-
date: 2012-
|
14
|
-
default_executable:
|
19
|
+
date: 2012-06-07 00:00:00 Z
|
15
20
|
dependencies:
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: activesupport
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 9
|
30
|
+
segments:
|
31
|
+
- 2
|
32
|
+
- 3
|
33
|
+
- 5
|
34
|
+
version: 2.3.5
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: nokogiri
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 3
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
version: "0"
|
49
|
+
type: :runtime
|
50
|
+
version_requirements: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
name: i18n
|
53
|
+
prerelease: false
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
type: :runtime
|
64
|
+
version_requirements: *id003
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: elibri_onix_dict
|
67
|
+
prerelease: false
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
hash: 21
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
- 0
|
77
|
+
- 5
|
78
|
+
version: 0.0.5
|
79
|
+
type: :runtime
|
80
|
+
version_requirements: *id004
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: pry
|
83
|
+
prerelease: false
|
84
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
type: :development
|
94
|
+
version_requirements: *id005
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: mocha
|
97
|
+
prerelease: false
|
98
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
hash: 3
|
104
|
+
segments:
|
105
|
+
- 0
|
106
|
+
version: "0"
|
107
|
+
type: :development
|
108
|
+
version_requirements: *id006
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: minitest
|
111
|
+
prerelease: false
|
112
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
hash: 3
|
118
|
+
segments:
|
119
|
+
- 0
|
120
|
+
version: "0"
|
121
|
+
type: :development
|
122
|
+
version_requirements: *id007
|
123
|
+
- !ruby/object:Gem::Dependency
|
124
|
+
name: bundler
|
125
|
+
prerelease: false
|
126
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
127
|
+
none: false
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
hash: 23
|
132
|
+
segments:
|
133
|
+
- 1
|
134
|
+
- 0
|
135
|
+
- 0
|
136
|
+
version: 1.0.0
|
137
|
+
type: :development
|
138
|
+
version_requirements: *id008
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rake
|
141
|
+
prerelease: false
|
142
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
143
|
+
none: false
|
144
|
+
requirements:
|
145
|
+
- - ">="
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
hash: 3
|
148
|
+
segments:
|
149
|
+
- 0
|
150
|
+
version: "0"
|
151
|
+
type: :development
|
152
|
+
version_requirements: *id009
|
115
153
|
description: EDItEUR ONIX format subset implementation used in Elibri publication system
|
116
154
|
email:
|
117
|
-
|
155
|
+
- marcin@urbanski.vdl.pl
|
156
|
+
- p.szmielew@ava.waw.pl
|
118
157
|
executables: []
|
119
158
|
|
120
159
|
extensions: []
|
121
160
|
|
122
161
|
extra_rdoc_files:
|
123
|
-
|
124
|
-
|
125
|
-
|
162
|
+
- LICENSE.txt
|
163
|
+
- README.rdoc
|
164
|
+
- FIELDS.rdoc
|
126
165
|
files:
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
166
|
+
- .gitignore
|
167
|
+
- .travis.yml
|
168
|
+
- FIELDS.rdoc
|
169
|
+
- Gemfile
|
170
|
+
- Gemfile.lock
|
171
|
+
- LICENSE.txt
|
172
|
+
- README.rdoc
|
173
|
+
- Rakefile
|
174
|
+
- elibri_onix.gemspec
|
175
|
+
- generate.rb
|
176
|
+
- lib/elibri_onix.rb
|
177
|
+
- lib/elibri_onix/external_id.rb
|
178
|
+
- lib/elibri_onix/external_timestamp.rb
|
179
|
+
- lib/elibri_onix/hash_id.rb
|
180
|
+
- lib/elibri_onix/inspector.rb
|
181
|
+
- lib/elibri_onix/nokogiri_patch.rb
|
182
|
+
- lib/elibri_onix/onix_3_0/audience_range.rb
|
183
|
+
- lib/elibri_onix/onix_3_0/collection.rb
|
184
|
+
- lib/elibri_onix/onix_3_0/contributor.rb
|
185
|
+
- lib/elibri_onix/onix_3_0/extent.rb
|
186
|
+
- lib/elibri_onix/onix_3_0/header.rb
|
187
|
+
- lib/elibri_onix/onix_3_0/imprint.rb
|
188
|
+
- lib/elibri_onix/onix_3_0/language.rb
|
189
|
+
- lib/elibri_onix/onix_3_0/measure.rb
|
190
|
+
- lib/elibri_onix/onix_3_0/onix_message.rb
|
191
|
+
- lib/elibri_onix/onix_3_0/price.rb
|
192
|
+
- lib/elibri_onix/onix_3_0/product.rb
|
193
|
+
- lib/elibri_onix/onix_3_0/product_identifier.rb
|
194
|
+
- lib/elibri_onix/onix_3_0/publisher.rb
|
195
|
+
- lib/elibri_onix/onix_3_0/publishing_date.rb
|
196
|
+
- lib/elibri_onix/onix_3_0/related_product.rb
|
197
|
+
- lib/elibri_onix/onix_3_0/sales_restriction.rb
|
198
|
+
- lib/elibri_onix/onix_3_0/sender.rb
|
199
|
+
- lib/elibri_onix/onix_3_0/stock_quantity_coded.rb
|
200
|
+
- lib/elibri_onix/onix_3_0/subject.rb
|
201
|
+
- lib/elibri_onix/onix_3_0/supplier.rb
|
202
|
+
- lib/elibri_onix/onix_3_0/supplier_identifier.rb
|
203
|
+
- lib/elibri_onix/onix_3_0/supply_detail.rb
|
204
|
+
- lib/elibri_onix/onix_3_0/supporting_resource.rb
|
205
|
+
- lib/elibri_onix/onix_3_0/text_content.rb
|
206
|
+
- lib/elibri_onix/onix_3_0/title_detail.rb
|
207
|
+
- lib/elibri_onix/onix_3_0/title_element.rb
|
208
|
+
- lib/elibri_onix/releases.rb
|
209
|
+
- lib/elibri_onix/version.rb
|
210
|
+
- test/elibri_audience_range_test.rb
|
211
|
+
- test/elibri_categories_test.rb
|
212
|
+
- test/elibri_contributors_test.rb
|
213
|
+
- test/elibri_edition_test.rb
|
214
|
+
- test/elibri_extensions_test.rb
|
215
|
+
- test/elibri_extent_test.rb
|
216
|
+
- test/elibri_languages_test.rb
|
217
|
+
- test/elibri_measurement_test.rb
|
218
|
+
- test/elibri_onix_release_3_0_onix_message_test.rb
|
219
|
+
- test/elibri_onix_test.rb
|
220
|
+
- test/elibri_product_form_test.rb
|
221
|
+
- test/elibri_publisher_info_test.rb
|
222
|
+
- test/elibri_publishing_status_test.rb
|
223
|
+
- test/elibri_record_identifiers_test.rb
|
224
|
+
- test/elibri_sale_restrictions_test.rb
|
225
|
+
- test/elibri_series_memberships_test.rb
|
226
|
+
- test/elibri_supporting_resources_test.rb
|
227
|
+
- test/elibri_texts_test.rb
|
228
|
+
- test/elibri_titles_test.rb
|
229
|
+
- test/fixtures/all_possible_tags.xml
|
230
|
+
- test/fixtures/old_dialect.xml
|
231
|
+
- test/fixtures/onix_announced_product_example.xml
|
232
|
+
- test/fixtures/onix_audience_range_example.xml
|
233
|
+
- test/fixtures/onix_audiobook_extent_example.xml
|
234
|
+
- test/fixtures/onix_categories_example.xml
|
235
|
+
- test/fixtures/onix_collective_work_example.xml
|
236
|
+
- test/fixtures/onix_contributors_example.xml
|
237
|
+
- test/fixtures/onix_ebook_extent_example.xml
|
238
|
+
- test/fixtures/onix_edition_example.xml
|
239
|
+
- test/fixtures/onix_elibri_extensions_example.xml
|
240
|
+
- test/fixtures/onix_languages_example.xml
|
241
|
+
- test/fixtures/onix_measurement_example.xml
|
242
|
+
- test/fixtures/onix_no_contributors_example.xml
|
243
|
+
- test/fixtures/onix_out_of_print_product_example.xml
|
244
|
+
- test/fixtures/onix_preorder_product_example.xml
|
245
|
+
- test/fixtures/onix_product_form_example.xml
|
246
|
+
- test/fixtures/onix_published_product_example.xml
|
247
|
+
- test/fixtures/onix_publisher_info_example.xml
|
248
|
+
- test/fixtures/onix_record_identifiers_example.xml
|
249
|
+
- test/fixtures/onix_sale_restrictions_example.xml
|
250
|
+
- test/fixtures/onix_series_memberships_example.xml
|
251
|
+
- test/fixtures/onix_supporting_resources_example.xml
|
252
|
+
- test/fixtures/onix_texts_example.xml
|
253
|
+
- test/fixtures/onix_title_with_collection_example.xml
|
254
|
+
- test/fixtures/onix_titles_example.xml
|
255
|
+
- test/helper.rb
|
217
256
|
homepage: http://github.com/elibri/elibri_onix
|
218
257
|
licenses:
|
219
|
-
|
258
|
+
- MIT
|
220
259
|
post_install_message:
|
221
260
|
rdoc_options: []
|
222
261
|
|
223
262
|
require_paths:
|
224
|
-
|
263
|
+
- lib
|
225
264
|
required_ruby_version: !ruby/object:Gem::Requirement
|
226
265
|
none: false
|
227
266
|
requirements:
|
228
|
-
|
229
|
-
|
230
|
-
|
267
|
+
- - ">="
|
268
|
+
- !ruby/object:Gem::Version
|
269
|
+
hash: 3
|
270
|
+
segments:
|
271
|
+
- 0
|
272
|
+
version: "0"
|
231
273
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
232
274
|
none: false
|
233
275
|
requirements:
|
234
|
-
|
235
|
-
|
236
|
-
|
276
|
+
- - ">="
|
277
|
+
- !ruby/object:Gem::Version
|
278
|
+
hash: 3
|
279
|
+
segments:
|
280
|
+
- 0
|
281
|
+
version: "0"
|
237
282
|
requirements: []
|
238
283
|
|
239
284
|
rubyforge_project:
|
240
|
-
rubygems_version: 1.
|
285
|
+
rubygems_version: 1.8.21
|
241
286
|
signing_key:
|
242
287
|
specification_version: 3
|
243
288
|
summary: EDItEUR ONIX format subset implementation used in Elibri publication system
|
244
289
|
test_files:
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
290
|
+
- test/elibri_audience_range_test.rb
|
291
|
+
- test/elibri_categories_test.rb
|
292
|
+
- test/elibri_contributors_test.rb
|
293
|
+
- test/elibri_edition_test.rb
|
294
|
+
- test/elibri_extensions_test.rb
|
295
|
+
- test/elibri_extent_test.rb
|
296
|
+
- test/elibri_languages_test.rb
|
297
|
+
- test/elibri_measurement_test.rb
|
298
|
+
- test/elibri_onix_release_3_0_onix_message_test.rb
|
299
|
+
- test/elibri_onix_test.rb
|
300
|
+
- test/elibri_product_form_test.rb
|
301
|
+
- test/elibri_publisher_info_test.rb
|
302
|
+
- test/elibri_publishing_status_test.rb
|
303
|
+
- test/elibri_record_identifiers_test.rb
|
304
|
+
- test/elibri_sale_restrictions_test.rb
|
305
|
+
- test/elibri_series_memberships_test.rb
|
306
|
+
- test/elibri_supporting_resources_test.rb
|
307
|
+
- test/elibri_texts_test.rb
|
308
|
+
- test/elibri_titles_test.rb
|
309
|
+
- test/fixtures/all_possible_tags.xml
|
310
|
+
- test/fixtures/old_dialect.xml
|
311
|
+
- test/fixtures/onix_announced_product_example.xml
|
312
|
+
- test/fixtures/onix_audience_range_example.xml
|
313
|
+
- test/fixtures/onix_audiobook_extent_example.xml
|
314
|
+
- test/fixtures/onix_categories_example.xml
|
315
|
+
- test/fixtures/onix_collective_work_example.xml
|
316
|
+
- test/fixtures/onix_contributors_example.xml
|
317
|
+
- test/fixtures/onix_ebook_extent_example.xml
|
318
|
+
- test/fixtures/onix_edition_example.xml
|
319
|
+
- test/fixtures/onix_elibri_extensions_example.xml
|
320
|
+
- test/fixtures/onix_languages_example.xml
|
321
|
+
- test/fixtures/onix_measurement_example.xml
|
322
|
+
- test/fixtures/onix_no_contributors_example.xml
|
323
|
+
- test/fixtures/onix_out_of_print_product_example.xml
|
324
|
+
- test/fixtures/onix_preorder_product_example.xml
|
325
|
+
- test/fixtures/onix_product_form_example.xml
|
326
|
+
- test/fixtures/onix_published_product_example.xml
|
327
|
+
- test/fixtures/onix_publisher_info_example.xml
|
328
|
+
- test/fixtures/onix_record_identifiers_example.xml
|
329
|
+
- test/fixtures/onix_sale_restrictions_example.xml
|
330
|
+
- test/fixtures/onix_series_memberships_example.xml
|
331
|
+
- test/fixtures/onix_supporting_resources_example.xml
|
332
|
+
- test/fixtures/onix_texts_example.xml
|
333
|
+
- test/fixtures/onix_title_with_collection_example.xml
|
334
|
+
- test/fixtures/onix_titles_example.xml
|
335
|
+
- test/helper.rb
|