onix2 1.0.0

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.
Files changed (240) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +209 -0
  3. data/README.markdown +69 -0
  4. data/TODO +14 -0
  5. data/dtd/2.1r3/iso-amsa.ent +173 -0
  6. data/dtd/2.1r3/iso-amsb.ent +146 -0
  7. data/dtd/2.1r3/iso-amsc.ent +49 -0
  8. data/dtd/2.1r3/iso-amsn.ent +117 -0
  9. data/dtd/2.1r3/iso-amso.ent +77 -0
  10. data/dtd/2.1r3/iso-amsr.ent +205 -0
  11. data/dtd/2.1r3/iso-box.ent +67 -0
  12. data/dtd/2.1r3/iso-cyr1.ent +94 -0
  13. data/dtd/2.1r3/iso-cyr2.ent +53 -0
  14. data/dtd/2.1r3/iso-dia.ent +41 -0
  15. data/dtd/2.1r3/iso-grk3.ent +70 -0
  16. data/dtd/2.1r3/iso-lat1.ent +89 -0
  17. data/dtd/2.1r3/iso-lat2.ent +148 -0
  18. data/dtd/2.1r3/iso-mfrk.ent +79 -0
  19. data/dtd/2.1r3/iso-mopf.ent +53 -0
  20. data/dtd/2.1r3/iso-mscr.ent +79 -0
  21. data/dtd/2.1r3/iso-num.ent +103 -0
  22. data/dtd/2.1r3/iso-num.old.ent +103 -0
  23. data/dtd/2.1r3/iso-pub.ent +110 -0
  24. data/dtd/2.1r3/iso-tech.ent +183 -0
  25. data/dtd/2.1r3/onix-international.dtd +1012 -0
  26. data/dtd/2.1r3/onix-xhtml.elt +672 -0
  27. data/dtd/2.1r3/reference.elt +4758 -0
  28. data/dtd/2.1r3/xhtml-special.ent +79 -0
  29. data/dtd/2.1r3/xhtml-symbol.ent +242 -0
  30. data/lib/onix2.rb +85 -0
  31. data/lib/onix2/addressee_identifier.rb +29 -0
  32. data/lib/onix2/apa_product.rb +785 -0
  33. data/lib/onix2/audience_range.rb +37 -0
  34. data/lib/onix2/code_list_extractor.rb +69 -0
  35. data/lib/onix2/contributor.rb +55 -0
  36. data/lib/onix2/discount_coded.rb +29 -0
  37. data/lib/onix2/header.rb +68 -0
  38. data/lib/onix2/imprint.rb +31 -0
  39. data/lib/onix2/language.rb +29 -0
  40. data/lib/onix2/lists.rb +134 -0
  41. data/lib/onix2/market_representation.rb +38 -0
  42. data/lib/onix2/measure.rb +29 -0
  43. data/lib/onix2/media_file.rb +33 -0
  44. data/lib/onix2/other_text.rb +35 -0
  45. data/lib/onix2/price.rb +47 -0
  46. data/lib/onix2/product.rb +97 -0
  47. data/lib/onix2/product_identifier.rb +27 -0
  48. data/lib/onix2/publisher.rb +33 -0
  49. data/lib/onix2/reader.rb +157 -0
  50. data/lib/onix2/sales_restriction.rb +25 -0
  51. data/lib/onix2/sales_rights.rb +28 -0
  52. data/lib/onix2/sender_identifier.rb +29 -0
  53. data/lib/onix2/series.rb +28 -0
  54. data/lib/onix2/series_identifier.rb +27 -0
  55. data/lib/onix2/simple_product.rb +47 -0
  56. data/lib/onix2/stock.rb +29 -0
  57. data/lib/onix2/subject.rb +33 -0
  58. data/lib/onix2/supply_detail.rb +53 -0
  59. data/lib/onix2/title.rb +33 -0
  60. data/lib/onix2/version.rb +3 -0
  61. data/lib/onix2/website.rb +29 -0
  62. data/lib/onix2/writer.rb +86 -0
  63. data/spec/addressee_identifier_spec.rb +33 -0
  64. data/spec/apa_product_spec.rb +116 -0
  65. data/spec/audience_range_spec.rb +44 -0
  66. data/spec/contributor_spec.rb +38 -0
  67. data/spec/discount_coded_spec.rb +34 -0
  68. data/spec/header_spec.rb +153 -0
  69. data/spec/imprint_spec.rb +31 -0
  70. data/spec/language_spec.rb +38 -0
  71. data/spec/lists_spec.rb +33 -0
  72. data/spec/market_representation_spec.rb +33 -0
  73. data/spec/measure_spec.rb +38 -0
  74. data/spec/media_file_spec.rb +38 -0
  75. data/spec/other_text_spec.rb +33 -0
  76. data/spec/price_spec.rb +52 -0
  77. data/spec/product_identifier_spec.rb +34 -0
  78. data/spec/product_spec.rb +102 -0
  79. data/spec/publisher_spec.rb +33 -0
  80. data/spec/reader_spec.rb +155 -0
  81. data/spec/sales_restriction_spec.rb +27 -0
  82. data/spec/sender_identifier.rb +33 -0
  83. data/spec/series_identifier_spec.rb +33 -0
  84. data/spec/series_spec.rb +47 -0
  85. data/spec/spec_helper.rb +15 -0
  86. data/spec/stock_spec.rb +39 -0
  87. data/spec/subject_spec.rb +34 -0
  88. data/spec/supply_detail_spec.rb +97 -0
  89. data/spec/title_spec.rb +38 -0
  90. data/spec/website_spec.rb +33 -0
  91. data/spec/writer_spec.rb +78 -0
  92. data/support/codes/001.tsv +10 -0
  93. data/support/codes/002.tsv +5 -0
  94. data/support/codes/003.tsv +7 -0
  95. data/support/codes/005.tsv +13 -0
  96. data/support/codes/006.tsv +76 -0
  97. data/support/codes/007.tsv +123 -0
  98. data/support/codes/008.tsv +7 -0
  99. data/support/codes/009.tsv +7 -0
  100. data/support/codes/010.tsv +34 -0
  101. data/support/codes/011.tsv +11 -0
  102. data/support/codes/012.tsv +11 -0
  103. data/support/codes/013.tsv +7 -0
  104. data/support/codes/014.tsv +4 -0
  105. data/support/codes/015.tsv +13 -0
  106. data/support/codes/016.tsv +6 -0
  107. data/support/codes/017.tsv +90 -0
  108. data/support/codes/018.tsv +3 -0
  109. data/support/codes/019.tsv +7 -0
  110. data/support/codes/020.tsv +0 -0
  111. data/support/codes/021.tsv +31 -0
  112. data/support/codes/022.tsv +9 -0
  113. data/support/codes/023.tsv +9 -0
  114. data/support/codes/024.tsv +11 -0
  115. data/support/codes/025.tsv +29 -0
  116. data/support/codes/026.tsv +75 -0
  117. data/support/codes/027.tsv +75 -0
  118. data/support/codes/028.tsv +8 -0
  119. data/support/codes/029.tsv +16 -0
  120. data/support/codes/030.tsv +15 -0
  121. data/support/codes/031.tsv +3 -0
  122. data/support/codes/032.tsv +2 -0
  123. data/support/codes/033.tsv +36 -0
  124. data/support/codes/034.tsv +14 -0
  125. data/support/codes/035.tsv +6 -0
  126. data/support/codes/036.tsv +3 -0
  127. data/support/codes/037.tsv +6 -0
  128. data/support/codes/038.tsv +36 -0
  129. data/support/codes/039.tsv +8 -0
  130. data/support/codes/040.tsv +6 -0
  131. data/support/codes/041.tsv +6 -0
  132. data/support/codes/042.tsv +16 -0
  133. data/support/codes/043.tsv +4 -0
  134. data/support/codes/044.tsv +13 -0
  135. data/support/codes/045.tsv +12 -0
  136. data/support/codes/046.tsv +3 -0
  137. data/support/codes/047.tsv +4 -0
  138. data/support/codes/048.tsv +11 -0
  139. data/support/codes/049.tsv +84 -0
  140. data/support/codes/050.tsv +8 -0
  141. data/support/codes/051.tsv +27 -0
  142. data/support/codes/052.tsv +1 -0
  143. data/support/codes/053.tsv +3 -0
  144. data/support/codes/054.tsv +23 -0
  145. data/support/codes/055.tsv +13 -0
  146. data/support/codes/056.tsv +2 -0
  147. data/support/codes/057.tsv +5 -0
  148. data/support/codes/058.tsv +21 -0
  149. data/support/codes/059.tsv +4 -0
  150. data/support/codes/060.tsv +2 -0
  151. data/support/codes/061.tsv +3 -0
  152. data/support/codes/062.tsv +5 -0
  153. data/support/codes/063.tsv +0 -0
  154. data/support/codes/064.tsv +13 -0
  155. data/support/codes/065.tsv +25 -0
  156. data/support/codes/066.tsv +4 -0
  157. data/support/codes/067.tsv +2 -0
  158. data/support/codes/068.tsv +15 -0
  159. data/support/codes/069.tsv +4 -0
  160. data/support/codes/070.tsv +2 -0
  161. data/support/codes/071.tsv +9 -0
  162. data/support/codes/072.tsv +7 -0
  163. data/support/codes/073.tsv +36 -0
  164. data/support/codes/074.tsv +489 -0
  165. data/support/codes/075.tsv +2 -0
  166. data/support/codes/076.tsv +12 -0
  167. data/support/codes/077.tsv +19 -0
  168. data/support/codes/078.tsv +148 -0
  169. data/support/codes/079.tsv +17 -0
  170. data/support/codes/080.tsv +19 -0
  171. data/support/codes/081.tsv +11 -0
  172. data/support/codes/082.tsv +17 -0
  173. data/support/codes/083.tsv +68 -0
  174. data/support/codes/084.tsv +10 -0
  175. data/support/codes/085.tsv +23 -0
  176. data/support/codes/086.tsv +5 -0
  177. data/support/codes/087.tsv +6 -0
  178. data/support/codes/088.tsv +0 -0
  179. data/support/codes/089.tsv +1 -0
  180. data/support/codes/090.tsv +11 -0
  181. data/support/codes/091.tsv +248 -0
  182. data/support/codes/092.tsv +7 -0
  183. data/support/codes/093.tsv +13 -0
  184. data/support/codes/094.tsv +3 -0
  185. data/support/codes/095.tsv +3 -0
  186. data/support/codes/096.tsv +185 -0
  187. data/support/codes/097.tsv +1 -0
  188. data/support/codes/098.tsv +21 -0
  189. data/support/codes/099.tsv +24 -0
  190. data/support/codes/100.tsv +4 -0
  191. data/support/codes/101.tsv +2 -0
  192. data/support/codes/102.tsv +3 -0
  193. data/support/codes/121.tsv +127 -0
  194. data/support/codes/138.tsv +6 -0
  195. data/support/codes/139.tsv +70 -0
  196. data/support/codes/140.tsv +7 -0
  197. data/support/codes/141.tsv +10 -0
  198. data/support/codes/142.tsv +12 -0
  199. data/support/codes/143.tsv +7 -0
  200. data/support/codes/144.tsv +4 -0
  201. data/support/codes/145.tsv +5 -0
  202. data/support/codes/146.tsv +3 -0
  203. data/support/codes/147.tsv +7 -0
  204. data/support/codes/148.tsv +3 -0
  205. data/support/codes/149.tsv +4 -0
  206. data/support/codes/150.tsv +124 -0
  207. data/support/codes/151.tsv +7 -0
  208. data/support/codes/152.tsv +2 -0
  209. data/support/codes/153.tsv +14 -0
  210. data/support/codes/154.tsv +9 -0
  211. data/support/codes/155.tsv +5 -0
  212. data/support/codes/156.tsv +4 -0
  213. data/support/codes/157.tsv +4 -0
  214. data/support/codes/158.tsv +24 -0
  215. data/support/codes/159.tsv +6 -0
  216. data/support/codes/160.tsv +0 -0
  217. data/support/codes/161.tsv +3 -0
  218. data/support/codes/162.tsv +3 -0
  219. data/support/codes/163.tsv +7 -0
  220. data/support/codes/164.tsv +2 -0
  221. data/support/codes/165.tsv +2 -0
  222. data/support/codes/166.tsv +2 -0
  223. data/support/codes/167.tsv +3 -0
  224. data/support/codes/168.tsv +2 -0
  225. data/support/codes/169.tsv +3 -0
  226. data/support/codes/170.tsv +0 -0
  227. data/support/codes/171.tsv +2 -0
  228. data/support/codes/172.tsv +1 -0
  229. data/support/codes/173.tsv +2 -0
  230. data/support/codes/174.tsv +2 -0
  231. data/support/codes/175.tsv +175 -0
  232. data/support/codes/176.tsv +12 -0
  233. data/support/codes/177.tsv +2 -0
  234. data/support/codes/178.tsv +17 -0
  235. data/support/entities.txt +1499 -0
  236. data/support/extract.rb +25 -0
  237. data/support/switch-onix-2.1-short-to-reference.xsl +24 -0
  238. data/support/switch-onix-tagnames-1.1.xsl +25 -0
  239. data/support/switch-onix-tagnames-2.0.xsl +37 -0
  240. metadata +440 -0
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+
3
+ module ONIX2
4
+ class SalesRestriction
5
+ include Virtus.model
6
+
7
+ attribute :sales_restriction_type, Integer
8
+
9
+ def to_xml
10
+ SalesRestrictionRepresenter.new(self).to_xml
11
+ end
12
+
13
+ def self.from_xml(data)
14
+ SalesRestrictionRepresenter.new(self.new).from_xml(data)
15
+ end
16
+ end
17
+
18
+ class SalesRestrictionRepresenter < Representable::Decorator
19
+ include Representable::XML
20
+
21
+ self.representation_wrap = :SalesRestriction
22
+
23
+ property :sales_restriction_type, as: "SalesRestrictionType", render_filter: ::ONIX2::Formatters::TWO_DIGITS
24
+ end
25
+ end
@@ -0,0 +1,28 @@
1
+ module ONIX2
2
+ class SalesRights
3
+ include Virtus.model
4
+
5
+ attribute :sales_rights_type
6
+ attribute :rights_country
7
+ attribute :rights_territory
8
+
9
+ def to_xml
10
+ SalesRightsRepresenter.new(self).to_xml
11
+ end
12
+
13
+ def self.from_xml(data)
14
+ SalesRightsRepresenter.new(self.new).from_xml(data)
15
+ end
16
+ end
17
+
18
+ class SalesRightsRepresenter < Representable::Decorator
19
+ include Representable::XML
20
+
21
+ self.representation_wrap = :SalesRights
22
+
23
+ property :sales_rights_type, as: "SalesRightsType"
24
+ property :rights_country, as: "RightsCountry"
25
+ property :rights_territory, as: "RightsTerritory"
26
+ end
27
+ end
28
+
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+
3
+ module ONIX2
4
+ class SenderIdentifier
5
+ include Virtus.model
6
+
7
+ attribute :sender_id_type, Integer
8
+ attribute :id_type_name
9
+ attribute :id_value
10
+
11
+ def to_xml
12
+ SenderIdentifierRepresenter.new(self).to_xml
13
+ end
14
+
15
+ def self.from_xml(data)
16
+ SenderIdentifierRepresenter.new(self.new).from_xml(data)
17
+ end
18
+ end
19
+
20
+ class SenderIdentifierRepresenter < Representable::Decorator
21
+ include Representable::XML
22
+
23
+ self.representation_wrap = :SenderIdentifier
24
+
25
+ property :sender_id_type, as: "SenderIDType", render_filter: ::ONIX2::Formatters::TWO_DIGITS
26
+ property :id_type_name, as: "IDTypeName"
27
+ property :id_value, as: "IDValue"
28
+ end
29
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+
3
+ module ONIX2
4
+ class Series
5
+ include Virtus.model
6
+
7
+ attribute :series_identifiers, Array[ONIX2::SeriesIdentifier]
8
+ attribute :title_of_series
9
+
10
+ def to_xml
11
+ SeriesRepresenter.new(self).to_xml
12
+ end
13
+
14
+ def self.from_xml(data)
15
+ SeriesRepresenter.new(self.new).from_xml(data)
16
+ end
17
+
18
+ end
19
+
20
+ class SeriesRepresenter < Representable::Decorator
21
+ include Representable::XML
22
+
23
+ self.representation_wrap = :Series
24
+
25
+ collection :series_identifiers, as: "SeriesIdentifier", extend: ONIX2::SeriesIdentifierRepresenter, class: ONIX2::SeriesIdentifier
26
+ property :title_of_series, as: "TitleOfSeries"
27
+ end
28
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+
3
+ module ONIX2
4
+ class SeriesIdentifier
5
+ include Virtus.model
6
+
7
+ attribute :series_id_type, Integer
8
+ attribute :id_value
9
+
10
+ def to_xml
11
+ SeriesIdentifierRepresenter.new(self).to_xml
12
+ end
13
+
14
+ def self.from_xml(data)
15
+ SeriesIdentifierRepresenter.new(self.new).from_xml(data)
16
+ end
17
+ end
18
+
19
+ class SeriesIdentifierRepresenter < Representable::Decorator
20
+ include Representable::XML
21
+
22
+ self.representation_wrap = :SeriesIdentifier
23
+
24
+ property :series_id_type, as: "SeriesIDType", render_filter: ::ONIX2::Formatters::TWO_DIGITS
25
+ property :id_value, as: "IDValue"
26
+ end
27
+ end
@@ -0,0 +1,47 @@
1
+ # coding: utf-8
2
+
3
+ require 'forwardable'
4
+
5
+ module ONIX2
6
+ # super class for some simplified ONIX2::Product wrappers
7
+ class SimpleProduct
8
+
9
+ def initialize(product = nil)
10
+ @product = product || ::ONIX2::Product.new
11
+ end
12
+
13
+ class << self
14
+
15
+ include Forwardable
16
+
17
+ def from_xml(xml)
18
+ self.new(::ONIX2::Product.from_xml(xml))
19
+ end
20
+
21
+ def parse_file(filename)
22
+ self.new(::ONIX2::Product.parse(File.read(filename)))
23
+ end
24
+
25
+ def parse(xml)
26
+ self.new(::ONIX2::Product.parse(xml))
27
+ end
28
+
29
+ protected
30
+
31
+ def delegate(*args)
32
+ def_delegators :@product, *args
33
+ end
34
+ end
35
+
36
+ def product
37
+ @product
38
+ end
39
+
40
+ def to_xml
41
+ product.to_xml
42
+ end
43
+
44
+ # TODO: add method missing magic to proxy through to the underlying product?
45
+
46
+ end
47
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+
3
+ module ONIX2
4
+ class Stock
5
+ include Virtus.model
6
+
7
+ # NOTE: these *should* be numeric fields according to the spec,
8
+ # but heaps of ONIX files in the wild use text
9
+ attribute :on_hand
10
+ attribute :on_order
11
+
12
+ def to_xml
13
+ StockRepresenter.new(self).to_xml
14
+ end
15
+
16
+ def self.from_xml(data)
17
+ StockRepresenter.new(self.new).from_xml(data)
18
+ end
19
+ end
20
+
21
+ class StockRepresenter < Representable::Decorator
22
+ include Representable::XML
23
+
24
+ self.representation_wrap = :Stock
25
+
26
+ property :on_hand, as: "OnHand"
27
+ property :on_order, as: "OnOrder"
28
+ end
29
+ end
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+
3
+ module ONIX2
4
+ class Subject
5
+ include Virtus.model
6
+
7
+ attribute :subject_scheme_id, Integer
8
+ attribute :subject_scheme_name
9
+ attribute :subject_scheme_version
10
+ attribute :subject_code
11
+ attribute :subject_heading_text
12
+
13
+ def to_xml
14
+ SubjectRepresenter.new(self).to_xml
15
+ end
16
+
17
+ def self.from_xml(data)
18
+ SubjectRepresenter.new(self.new).from_xml(data)
19
+ end
20
+ end
21
+
22
+ class SubjectRepresenter < Representable::Decorator
23
+ include Representable::XML
24
+
25
+ self.representation_wrap = :Subject
26
+
27
+ property :subject_scheme_id, as: "SubjectSchemeIdentifier", render_filter: ::ONIX2::Formatters::TWO_DIGITS
28
+ property :subject_scheme_name, as: "SubjectSchemeName"
29
+ property :subject_scheme_version, as: "SubjectSchemeVersion"
30
+ property :subject_code, as: "SubjectCode"
31
+ property :subject_heading_text, as: "SubjectHeadingText"
32
+ end
33
+ end
@@ -0,0 +1,53 @@
1
+ # coding: utf-8
2
+
3
+ module ONIX2
4
+ class SupplyDetail
5
+ include Virtus.model
6
+
7
+ attribute :supplier_ean_location_number
8
+ attribute :supplier_san
9
+ attribute :supplier_name
10
+ attribute :telephone_number
11
+ attribute :fax_number
12
+ attribute :email_address
13
+ attribute :websites, Array[ONIX2::Website]
14
+ attribute :supplier_role, Integer
15
+ attribute :supply_to_country
16
+ attribute :supply_to_territory
17
+ attribute :availability_status_code, Integer
18
+ attribute :product_availability, Integer
19
+ attribute :stock, Array[ONIX2::Stock]
20
+ attribute :pack_quantity, Integer
21
+ attribute :prices, Array[ONIX2::Price]
22
+
23
+ def to_xml
24
+ SupplyDetailRepresenter.new(self).to_xml
25
+ end
26
+
27
+ def self.from_xml(data)
28
+ SupplyDetailRepresenter.new(self.new).from_xml(data)
29
+ end
30
+ end
31
+
32
+ class SupplyDetailRepresenter < Representable::Decorator
33
+ include Representable::XML
34
+
35
+ self.representation_wrap = :SupplyDetail
36
+
37
+ property :supplier_ean_location_number, as: "SupplierEANLocationNumber"
38
+ property :supplier_san, as: "SupplierSAN"
39
+ property :supplier_name, as: "SupplierName"
40
+ property :telephone_number, as: "TelephoneNumber"
41
+ property :fax_number, as: "FaxNumber"
42
+ property :email_address, as: "EmailAddress"
43
+ collection :websites, as: "Website", extend: ONIX2::WebsiteRepresenter, class: ONIX2::Website
44
+ property :supplier_role, as: "SupplierRole", render_filter: ::ONIX2::Formatters::TWO_DIGITS
45
+ property :supply_to_country, as: "SupplyToCountry"
46
+ property :supply_to_territory, as: "SupplyToTerritory"
47
+ property :availability_status_code, as: "AvailabilityStatusCode", render_filter: ::ONIX2::Formatters::TWO_DIGITS
48
+ property :product_availability, as: "ProductAvailability", render_filter: ::ONIX2::Formatters::TWO_DIGITS
49
+ collection :stock, as: "Stock", extend: ONIX2::StockRepresenter, class: ONIX2::Stock
50
+ property :pack_quantity, as: "PackQuantity"
51
+ collection :prices, as: "Price", extend: ONIX2::PriceRepresenter, class: ONIX2::Price
52
+ end
53
+ end
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+
3
+ module ONIX2
4
+ class Title
5
+ include Virtus.model
6
+
7
+ attribute :title_type, Integer
8
+ attribute :title_text
9
+ attribute :title_prefix
10
+ attribute :title_without_prefix
11
+ attribute :subtitle
12
+
13
+ def to_xml
14
+ TitleRepresenter.new(self).to_xml
15
+ end
16
+
17
+ def self.from_xml(data)
18
+ TitleRepresenter.new(self.new).from_xml(data)
19
+ end
20
+ end
21
+
22
+ class TitleRepresenter < Representable::Decorator
23
+ include Representable::XML
24
+
25
+ self.representation_wrap = :Title
26
+
27
+ property :title_type, as: "TitleType", render_filter: ::ONIX2::Formatters::TWO_DIGITS
28
+ property :title_text, as: "TitleText"
29
+ property :title_prefix, as: "TitlePrefix"
30
+ property :title_without_prefix, as: "TitleWithoutPrefix"
31
+ property :subtitle, as: "Subtitle"
32
+ end
33
+ end
@@ -0,0 +1,3 @@
1
+ module ONIX2
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+
3
+ module ONIX2
4
+ class Website
5
+ include Virtus.model
6
+
7
+ attribute :website_role, Integer
8
+ attribute :website_description
9
+ attribute :website_link
10
+
11
+ def to_xml
12
+ WebsiteRepresenter.new(self).to_xml
13
+ end
14
+
15
+ def self.from_xml(data)
16
+ WebsiteRepresenter.new(self.new).from_xml(data)
17
+ end
18
+ end
19
+
20
+ class WebsiteRepresenter < Representable::Decorator
21
+ include Representable::XML
22
+
23
+ self.representation_wrap = :Website
24
+
25
+ property :website_role, as: "WebsiteRole", render_filter: ::ONIX2::Formatters::TWO_DIGITS
26
+ property :website_description, as: "WebsiteDescription"
27
+ property :website_link, as: "WebsiteLink"
28
+ end
29
+ end
@@ -0,0 +1,86 @@
1
+ # coding: utf-8
2
+
3
+ module ONIX2
4
+ # The primary way to write a new ONIX file.
5
+ #
6
+ # Heres a quick example. The generated file will be nice and boring, as the
7
+ # header and product objects have no data in them, but you get the idea.
8
+ #
9
+ # File.open("output.xml","w") do |output|
10
+ # header = ONIX2::Header.new
11
+ # ONIX2::Writer.open(output, header) do |writer|
12
+ # writer << ONIX2::Product.new
13
+ # writer << ONIX2::Product.new
14
+ # end
15
+ # end
16
+ #
17
+ # If you prefer, you can build your products using the APAProduct shim layer.
18
+ #
19
+ # File.open("output.xml","w") do |output|
20
+ # header = ONIX2::Header.new
21
+ # ONIX2::Writer.open(output, header) do |writer|
22
+ # writer << ONIX2::APAProduct.new
23
+ # writer << ONIX2::APAProduct.new
24
+ # end
25
+ # end
26
+ #
27
+ class Writer
28
+
29
+ DOCTYPE = "http://www.editeur.org/onix/2.1/03/reference/onix-international.dtd"
30
+
31
+ # Default constructor.
32
+ def initialize(output, header)
33
+ raise ArgumentError, 'msg must be an ONIX2::Header object' unless header.kind_of?(ONIX2::Header)
34
+ @output = output
35
+ @header = header
36
+ @finished = false
37
+
38
+ start_document
39
+ end
40
+
41
+ # deprecated
42
+ def start_document
43
+ puts "ONIX2::StreamWriter#start_document is no longer required"
44
+ end
45
+
46
+ def << (product)
47
+ unless product.kind_of?(ONIX2::Product) || product.kind_of?(ONIX2::SimpleProduct)
48
+ raise ArgumentError, 'product must be an ONIX2::Product or ONIX2::SimpleProduct'
49
+ end
50
+ raise "Can't add products to a finished writer" if finished?
51
+
52
+ @output.write(product.to_xml.to_s)
53
+ @output.write("\n")
54
+ end
55
+
56
+ def end_document
57
+ @output.write("</ONIXMessage>\n")
58
+ @finished = true
59
+ end
60
+
61
+ def finished?
62
+ @finished
63
+ end
64
+
65
+ def self.open(output, header)
66
+ if block_given?
67
+ writer = self.new(output, header)
68
+ yield writer
69
+ writer.end_document
70
+ else
71
+ self.new(output, header)
72
+ end
73
+ end
74
+
75
+ private
76
+
77
+ def start_document
78
+ @output.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
79
+ @output.write("<!DOCTYPE ONIXMessage SYSTEM \"#{DOCTYPE}\">\n")
80
+ @output.write("<ONIXMessage release=\"2.1\">\n")
81
+ @output.write(@header.to_xml.to_s)
82
+ @output.write("\n")
83
+ end
84
+
85
+ end
86
+ end