rbook 0.1

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 (63) hide show
  1. data/COPYING +340 -0
  2. data/LICENSE +13 -0
  3. data/README +16 -0
  4. data/Rakefile +206 -0
  5. data/examples/titlepage.rb +14 -0
  6. data/examples/www/find_all.rb +23 -0
  7. data/examples/www/find_cover_from_amazon.rb +12 -0
  8. data/examples/www/find_url_from_rainbow.rb +12 -0
  9. data/examples/www/list.rb +13 -0
  10. data/lib/rbook/bisac.rb +175 -0
  11. data/lib/rbook/errors.rb +7 -0
  12. data/lib/rbook/isbn.rb +249 -0
  13. data/lib/rbook/onix.rb +68 -0
  14. data/lib/rbook/onix/contributor.rb +60 -0
  15. data/lib/rbook/onix/lists.rb +2 -0
  16. data/lib/rbook/onix/lists/contributor_role.rb +10 -0
  17. data/lib/rbook/onix/lists/product_form.rb +100 -0
  18. data/lib/rbook/onix/message.rb +101 -0
  19. data/lib/rbook/onix/product.rb +188 -0
  20. data/lib/rbook/onix/sales_restriction.rb +51 -0
  21. data/lib/rbook/onix/supply_detail.rb +68 -0
  22. data/lib/rbook/onix/xchar.rb +98 -0
  23. data/lib/rbook/titlepage.rb +96 -0
  24. data/lib/rbook/titlepage/TitleQueryClient.rb +62 -0
  25. data/lib/rbook/titlepage/titlepage_driver.rb +134 -0
  26. data/lib/rbook/titlepage/titlepage_utils.rb +374 -0
  27. data/lib/rbook/www.rb +172 -0
  28. data/lib/rbook/www/aau_scraper.rb +76 -0
  29. data/lib/rbook/www/amazon_uk_scraper.rb +44 -0
  30. data/lib/rbook/www/base.rb +87 -0
  31. data/lib/rbook/www/harper_au_scraper.rb +56 -0
  32. data/lib/rbook/www/harper_us_scraper.rb +55 -0
  33. data/lib/rbook/www/hha_scraper.rb +50 -0
  34. data/lib/rbook/www/macmillan_scraper.rb +62 -0
  35. data/lib/rbook/www/orbis_scraper.rb +48 -0
  36. data/lib/rbook/www/oup_scraper.rb +64 -0
  37. data/lib/rbook/www/paulist_scraper.rb +53 -0
  38. data/lib/rbook/www/pearson_au_scraper.rb +52 -0
  39. data/lib/rbook/www/penguin_scraper.rb +45 -0
  40. data/lib/rbook/www/random_au_scraper.rb +90 -0
  41. data/lib/rbook/www/random_us_scraper.rb +59 -0
  42. data/lib/rbook/www/sas_scraper.rb +54 -0
  43. data/lib/rbook/www/unireps_scraper.rb +58 -0
  44. data/lib/rbook/www/wiley_us_scraper.rb +54 -0
  45. data/test/data/abingdon.xml +38931 -0
  46. data/test/data/augsburg.xml +39009 -0
  47. data/test/data/chalice.xml +10851 -0
  48. data/test/data/eerdsman.xml +36942 -0
  49. data/test/data/invalid_no_product.xml +9 -0
  50. data/test/data/not_xml.csv +1 -0
  51. data/test/data/single_product.xml +50 -0
  52. data/test/data/xml_not_onix.xml +7 -0
  53. data/test/mocks/titlepage_driver.rb +107 -0
  54. data/test/unit/bisac_test.rb +57 -0
  55. data/test/unit/isbn_test.rb +149 -0
  56. data/test/unit/onix/contributor_test.rb +50 -0
  57. data/test/unit/onix/message_test.rb +119 -0
  58. data/test/unit/onix/product_test.rb +101 -0
  59. data/test/unit/onix/sales_restriction_test.rb +48 -0
  60. data/test/unit/onix/supply_detail_test.rb +53 -0
  61. data/test/unit/onix/xchar_test.rb +37 -0
  62. data/test/unit/titlepage_test.rb +127 -0
  63. metadata +130 -0
@@ -0,0 +1,374 @@
1
+ require 'xsd/qname'
2
+
3
+ # {urn:TitleQuery}ProductIdentifier
4
+ class ProductIdentifier
5
+ @@schema_type = "ProductIdentifier"
6
+ @@schema_ns = "urn:TitleQuery"
7
+ @@schema_element = [["productIDType", ["SOAP::SOAPString", XSD::QName.new(nil, "ProductIDType")]], ["iDValue", ["SOAP::SOAPString", XSD::QName.new(nil, "IDValue")]]]
8
+
9
+ def ProductIDType
10
+ @productIDType
11
+ end
12
+
13
+ def ProductIDType=(value)
14
+ @productIDType = value
15
+ end
16
+
17
+ def IDValue
18
+ @iDValue
19
+ end
20
+
21
+ def IDValue=(value)
22
+ @iDValue = value
23
+ end
24
+
25
+ def initialize(productIDType = nil, iDValue = nil)
26
+ @productIDType = productIDType
27
+ @iDValue = iDValue
28
+ end
29
+ end
30
+
31
+ # {urn:TitleQuery}Title
32
+ class Title
33
+ @@schema_type = "Title"
34
+ @@schema_ns = "urn:TitleQuery"
35
+ @@schema_element = [["titleType", ["SOAP::SOAPString", XSD::QName.new(nil, "TitleType")]], ["titleText", ["SOAP::SOAPString", XSD::QName.new(nil, "TitleText")]], ["titlePrefix", ["SOAP::SOAPString", XSD::QName.new(nil, "TitlePrefix")]], ["titleWithoutPrefix", ["SOAP::SOAPString", XSD::QName.new(nil, "TitleWithoutPrefix")]], ["subtitle", ["SOAP::SOAPString", XSD::QName.new(nil, "Subtitle")]]]
36
+
37
+ def TitleType
38
+ @titleType
39
+ end
40
+
41
+ def TitleType=(value)
42
+ @titleType = value
43
+ end
44
+
45
+ def TitleText
46
+ @titleText
47
+ end
48
+
49
+ def TitleText=(value)
50
+ @titleText = value
51
+ end
52
+
53
+ def TitlePrefix
54
+ @titlePrefix
55
+ end
56
+
57
+ def TitlePrefix=(value)
58
+ @titlePrefix = value
59
+ end
60
+
61
+ def TitleWithoutPrefix
62
+ @titleWithoutPrefix
63
+ end
64
+
65
+ def TitleWithoutPrefix=(value)
66
+ @titleWithoutPrefix = value
67
+ end
68
+
69
+ def Subtitle
70
+ @subtitle
71
+ end
72
+
73
+ def Subtitle=(value)
74
+ @subtitle = value
75
+ end
76
+
77
+ def initialize(titleType = nil, titleText = nil, titlePrefix = nil, titleWithoutPrefix = nil, subtitle = nil)
78
+ @titleType = titleType
79
+ @titleText = titleText
80
+ @titlePrefix = titlePrefix
81
+ @titleWithoutPrefix = titleWithoutPrefix
82
+ @subtitle = subtitle
83
+ end
84
+ end
85
+
86
+ # {urn:TitleQuery}Contributor
87
+ class Contributor
88
+ @@schema_type = "Contributor"
89
+ @@schema_ns = "urn:TitleQuery"
90
+ @@schema_element = [["sequenceNumber", ["SOAP::SOAPInteger", XSD::QName.new(nil, "SequenceNumber")]], ["contributorRole", ["SOAP::SOAPString", XSD::QName.new(nil, "ContributorRole")]], ["personName", ["SOAP::SOAPString", XSD::QName.new(nil, "PersonName")]], ["personNameInverted", ["SOAP::SOAPString", XSD::QName.new(nil, "PersonNameInverted")]], ["titlesBeforeNames", ["SOAP::SOAPString", XSD::QName.new(nil, "TitlesBeforeNames")]], ["keyNames", ["SOAP::SOAPString", XSD::QName.new(nil, "KeyNames")]]]
91
+
92
+ def SequenceNumber
93
+ @sequenceNumber
94
+ end
95
+
96
+ def SequenceNumber=(value)
97
+ @sequenceNumber = value
98
+ end
99
+
100
+ def ContributorRole
101
+ @contributorRole
102
+ end
103
+
104
+ def ContributorRole=(value)
105
+ @contributorRole = value
106
+ end
107
+
108
+ def PersonName
109
+ @personName
110
+ end
111
+
112
+ def PersonName=(value)
113
+ @personName = value
114
+ end
115
+
116
+ def PersonNameInverted
117
+ @personNameInverted
118
+ end
119
+
120
+ def PersonNameInverted=(value)
121
+ @personNameInverted = value
122
+ end
123
+
124
+ def TitlesBeforeNames
125
+ @titlesBeforeNames
126
+ end
127
+
128
+ def TitlesBeforeNames=(value)
129
+ @titlesBeforeNames = value
130
+ end
131
+
132
+ def KeyNames
133
+ @keyNames
134
+ end
135
+
136
+ def KeyNames=(value)
137
+ @keyNames = value
138
+ end
139
+
140
+ def initialize(sequenceNumber = nil, contributorRole = nil, personName = nil, personNameInverted = nil, titlesBeforeNames = nil, keyNames = nil)
141
+ @sequenceNumber = sequenceNumber
142
+ @contributorRole = contributorRole
143
+ @personName = personName
144
+ @personNameInverted = personNameInverted
145
+ @titlesBeforeNames = titlesBeforeNames
146
+ @keyNames = keyNames
147
+ end
148
+ end
149
+
150
+ # {urn:TitleQuery}Stock
151
+ class Stock
152
+ @@schema_type = "Stock"
153
+ @@schema_ns = "urn:TitleQuery"
154
+ @@schema_element = [["onHand", ["SOAP::SOAPString", XSD::QName.new(nil, "OnHand")]], ["onOrder", ["SOAP::SOAPString", XSD::QName.new(nil, "OnOrder")]]]
155
+
156
+ def OnHand
157
+ @onHand
158
+ end
159
+
160
+ def OnHand=(value)
161
+ @onHand = value
162
+ end
163
+
164
+ def OnOrder
165
+ @onOrder
166
+ end
167
+
168
+ def OnOrder=(value)
169
+ @onOrder = value
170
+ end
171
+
172
+ def initialize(onHand = nil, onOrder = nil)
173
+ @onHand = onHand
174
+ @onOrder = onOrder
175
+ end
176
+ end
177
+
178
+ # {urn:TitleQuery}Price
179
+ class Price
180
+ @@schema_type = "Price"
181
+ @@schema_ns = "urn:TitleQuery"
182
+ @@schema_element = [["priceTypeCode", ["SOAP::SOAPString", XSD::QName.new(nil, "PriceTypeCode")]], ["priceAmount", ["SOAP::SOAPDecimal", XSD::QName.new(nil, "PriceAmount")]]]
183
+
184
+ def PriceTypeCode
185
+ @priceTypeCode
186
+ end
187
+
188
+ def PriceTypeCode=(value)
189
+ @priceTypeCode = value
190
+ end
191
+
192
+ def PriceAmount
193
+ @priceAmount
194
+ end
195
+
196
+ def PriceAmount=(value)
197
+ @priceAmount = value
198
+ end
199
+
200
+ def initialize(priceTypeCode = nil, priceAmount = nil)
201
+ @priceTypeCode = priceTypeCode
202
+ @priceAmount = priceAmount
203
+ end
204
+ end
205
+
206
+ # {urn:TitleQuery}SupplyDetail
207
+ class SupplyDetail
208
+ @@schema_type = "SupplyDetail"
209
+ @@schema_ns = "urn:TitleQuery"
210
+ @@schema_element = [["supplierName", ["SOAP::SOAPString", XSD::QName.new(nil, "SupplierName")]], ["supplierRole", ["SOAP::SOAPString", XSD::QName.new(nil, "SupplierRole")]], ["productAvailability", ["SOAP::SOAPString", XSD::QName.new(nil, "ProductAvailability")]], ["expectedShipDate", ["SOAP::SOAPString", XSD::QName.new(nil, "ExpectedShipDate")]], ["stock", ["Stock", XSD::QName.new(nil, "Stock")]], ["packQuantity", ["SOAP::SOAPInteger", XSD::QName.new(nil, "PackQuantity")]], ["price", ["Price", XSD::QName.new(nil, "Price")]]]
211
+
212
+ def SupplierName
213
+ @supplierName
214
+ end
215
+
216
+ def SupplierName=(value)
217
+ @supplierName = value
218
+ end
219
+
220
+ def SupplierRole
221
+ @supplierRole
222
+ end
223
+
224
+ def SupplierRole=(value)
225
+ @supplierRole = value
226
+ end
227
+
228
+ def ProductAvailability
229
+ @productAvailability
230
+ end
231
+
232
+ def ProductAvailability=(value)
233
+ @productAvailability = value
234
+ end
235
+
236
+ def ExpectedShipDate
237
+ @expectedShipDate
238
+ end
239
+
240
+ def ExpectedShipDate=(value)
241
+ @expectedShipDate = value
242
+ end
243
+
244
+ def Stock
245
+ @stock
246
+ end
247
+
248
+ def Stock=(value)
249
+ @stock = value
250
+ end
251
+
252
+ def PackQuantity
253
+ @packQuantity
254
+ end
255
+
256
+ def PackQuantity=(value)
257
+ @packQuantity = value
258
+ end
259
+
260
+ def Price
261
+ @price
262
+ end
263
+
264
+ def Price=(value)
265
+ @price = value
266
+ end
267
+
268
+ def initialize(supplierName = nil, supplierRole = nil, productAvailability = nil, expectedShipDate = nil, stock = nil, packQuantity = nil, price = nil)
269
+ @supplierName = supplierName
270
+ @supplierRole = supplierRole
271
+ @productAvailability = productAvailability
272
+ @expectedShipDate = expectedShipDate
273
+ @stock = stock
274
+ @packQuantity = packQuantity
275
+ @price = price
276
+ end
277
+ end
278
+
279
+ # {urn:TitleQuery}ArrayOfContributor
280
+ class ArrayOfContributor < ::Array
281
+ @@schema_type = "Contributor"
282
+ @@schema_ns = "urn:TitleQuery"
283
+ @@schema_element = [["item", ["Contributor", XSD::QName.new(nil, "item")]]]
284
+ end
285
+
286
+ # {urn:TitleQuery}ArrayOfProductIdentifier
287
+ class ArrayOfProductIdentifier < ::Array
288
+ @@schema_type = "ProductIdentifier"
289
+ @@schema_ns = "urn:TitleQuery"
290
+ @@schema_element = [["item", ["ProductIdentifier", XSD::QName.new(nil, "item")]]]
291
+ end
292
+
293
+ # {urn:TitleQuery}Product
294
+ class Product
295
+ @@schema_type = "Product"
296
+ @@schema_ns = "urn:TitleQuery"
297
+ @@schema_element = [["productIdentifiers", ["ArrayOfProductIdentifier", XSD::QName.new(nil, "ProductIdentifiers")]], ["title", ["Title", XSD::QName.new(nil, "Title")]], ["contributors", ["ArrayOfContributor", XSD::QName.new(nil, "Contributors")]], ["supplyDetail", ["SupplyDetail", XSD::QName.new(nil, "SupplyDetail")]]]
298
+
299
+ def ProductIdentifiers
300
+ @productIdentifiers
301
+ end
302
+
303
+ def ProductIdentifiers=(value)
304
+ @productIdentifiers = value
305
+ end
306
+
307
+ def Title
308
+ @title
309
+ end
310
+
311
+ def Title=(value)
312
+ @title = value
313
+ end
314
+
315
+ def Contributors
316
+ @contributors
317
+ end
318
+
319
+ def Contributors=(value)
320
+ @contributors = value
321
+ end
322
+
323
+ def SupplyDetail
324
+ @supplyDetail
325
+ end
326
+
327
+ def SupplyDetail=(value)
328
+ @supplyDetail = value
329
+ end
330
+
331
+ def initialize(productIdentifiers = nil, title = nil, contributors = nil, supplyDetail = nil)
332
+ @productIdentifiers = productIdentifiers
333
+ @title = title
334
+ @contributors = contributors
335
+ @supplyDetail = supplyDetail
336
+ end
337
+ end
338
+
339
+ # {urn:TitleQuery}SearchResults
340
+ class SearchResults
341
+ @@schema_type = "SearchResults"
342
+ @@schema_ns = "urn:TitleQuery"
343
+ @@schema_element = [["iSBN", ["SOAP::SOAPString", XSD::QName.new(nil, "ISBN")]], ["eAN", ["SOAP::SOAPString", XSD::QName.new(nil, "EAN")]], ["product", ["Product", XSD::QName.new(nil, "Product")]]]
344
+
345
+ def ISBN
346
+ @iSBN
347
+ end
348
+
349
+ def ISBN=(value)
350
+ @iSBN = value
351
+ end
352
+
353
+ def EAN
354
+ @eAN
355
+ end
356
+
357
+ def EAN=(value)
358
+ @eAN = value
359
+ end
360
+
361
+ def Product
362
+ @product
363
+ end
364
+
365
+ def Product=(value)
366
+ @product = value
367
+ end
368
+
369
+ def initialize(iSBN = nil, eAN = nil, product = nil)
370
+ @iSBN = iSBN
371
+ @eAN = eAN
372
+ @product = product
373
+ end
374
+ end
data/lib/rbook/www.rb ADDED
@@ -0,0 +1,172 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + "/../")
2
+
3
+ require 'rubygems'
4
+ require 'scrapi'
5
+
6
+ require 'rbook/isbn'
7
+ require 'rbook/www/base'
8
+
9
+ # load all scraping classes
10
+ files = Dir.entries(File.dirname(__FILE__) + '/www/')
11
+ files.delete(".")
12
+ files.delete("..")
13
+ files.delete(".svn")
14
+ files.delete("base.rb")
15
+ files.each do |file|
16
+ require 'rbook/www/' + file
17
+ end
18
+
19
+ module RBook
20
+ # A set of classes to make scraping title information from various publisher websites easier.
21
+ #
22
+ # Basic usage:
23
+ # require 'rubygems'
24
+ # require 'rbook/www'
25
+ # RBook::WWW.find_info(:first, "1841492280", :penguin)
26
+ # #=> Hash
27
+ # RBook::WWW.find_info(:all, "1841492280", [:penguin, :harpercollins_au])
28
+ # #=> Array of Hashes
29
+ module WWW
30
+
31
+ # Find any information possible about the supplied isbn using the
32
+ # specified scrapers.
33
+ #
34
+ # - isbn - a valid isbn10 or isbn13
35
+ # - scrapers - a symbol or array of symbols specifying which scrapers to search with
36
+ #
37
+ # Returns the results as an array containing the results
38
+ #
39
+ # RBook::WWW.find_info(:first, "1841492280", :penguin)
40
+ # #=> Hash
41
+ # RBook::WWW.find_info(:all, "1841492280", [:penguin, :harpercollins_au])
42
+ # #=> Array of Hashes
43
+ def self.find_info(search_type, isbn, scrapers)
44
+
45
+ raise ArgumentError, 'search_type must be :first or :all' if !search_type.eql?(:first) && !search_type.eql?(:all)
46
+ raise ArgumentError, 'Supplied isbn is not valid' unless ISBN::valid_isbn?(isbn)
47
+ raise ArgumentError, 'scrapers must be a symbol or array of symbols' unless scrapers.kind_of?(Symbol) || scrapers.kind_of?(Array)
48
+
49
+ isbn = ISBN::convert_to_isbn13(isbn)
50
+
51
+ if scrapers.kind_of?(Symbol)
52
+ scrapers = [Base::find_scraper(scrapers)]
53
+ else
54
+ scrapers = Base::find_scrapers(scrapers)
55
+ end
56
+
57
+ results = []
58
+
59
+ scrapers.each do |scraper|
60
+ worker = scraper.new
61
+ result = worker.get_info(isbn)
62
+ if !result.nil? && search_type.eql(:first)
63
+ return result
64
+ elsif !result.nil?
65
+ results << result
66
+ end
67
+ end
68
+
69
+ if results.empty?
70
+ return nil
71
+ else
72
+ return results
73
+ end
74
+ end
75
+
76
+ # Find any information possible about the supplied isbn using the
77
+ # specified scrapers.
78
+ #
79
+ # - isbn - a valid isbn10 or isbn13
80
+ # - scrapers - a symbol or array of symbols specifying which scrapers to search with
81
+ #
82
+ # Returns the results as an array containing the results
83
+ #
84
+ # RBook::WWW.find_cover(:first, "1841492280", :penguin)
85
+ # #=> Hash
86
+ # RBook::WWW.find_cover(:all, "1841492280", [:penguin, :harpercollins_au])
87
+ # #=> Array of Hashes
88
+ def self.find_cover(search_type, isbn, scrapers)
89
+
90
+ raise ArgumentError, 'search_type must be :first or :all' if !search_type.eql?(:first) && !search_type.eql?(:all)
91
+ raise ArgumentError, 'Supplied isbn is not valid' unless ISBN::valid_isbn?(isbn)
92
+ raise ArgumentError, 'scrapers must be a symbol or array of symbols' unless scrapers.kind_of?(Symbol) || scrapers.kind_of?(Array)
93
+
94
+ isbn = ISBN::convert_to_isbn13(isbn)
95
+
96
+ if scrapers.kind_of?(Symbol)
97
+ scrapers = [Base::find_scraper(scrapers)]
98
+ else
99
+ scrapers = Base::find_scrapers(scrapers)
100
+ end
101
+
102
+ results = []
103
+
104
+ scrapers.each do |scraper|
105
+ worker = scraper.new
106
+ result = worker.get_cover(isbn)
107
+ if !result.nil? && search_type.eql?(:first)
108
+ return result
109
+ elsif !result.nil?
110
+ results << result
111
+ end
112
+ end
113
+
114
+ if results.empty?
115
+ return nil
116
+ else
117
+ return results
118
+ end
119
+ end
120
+
121
+ # Find any information possible about the supplied isbn using the
122
+ # specified scrapers.
123
+ #
124
+ # - isbn - a valid isbn10 or isbn13
125
+ # - scrapers - a symbol or array of symbols specifying which scrapers to search with
126
+ #
127
+ # Returns the results as an array containing the results
128
+ #
129
+ # RBook::WWW.find_url(:first, "1841492280", :penguin)
130
+ # #=> Hash
131
+ # RBook::WWW.find_url(:all, "1841492280", [:penguin, :harpercollins_au])
132
+ # #=> Array of Hashes
133
+ def self.find_url(search_type, isbn, scrapers)
134
+
135
+ raise ArgumentError, 'search_type must be :first or :all' if !search_type.eql?(:first) && !search_type.eql?(:all)
136
+ raise ArgumentError, 'Supplied isbn is not valid' unless ISBN::valid_isbn?(isbn)
137
+ raise ArgumentError, 'scrapers must be a symbol or array of symbols' unless scrapers.kind_of?(Symbol) || scrapers.kind_of?(Array)
138
+
139
+ isbn = ISBN::convert_to_isbn13(isbn)
140
+
141
+ if scrapers.kind_of?(Symbol)
142
+ scrapers = [Base::find_scraper(scrapers)]
143
+ else
144
+ scrapers = Base::find_scrapers(scrapers)
145
+ end
146
+
147
+ results = []
148
+
149
+ scrapers.each do |scraper|
150
+ worker = scraper.new
151
+ result = worker.get_url(isbn)
152
+ if !result.nil? && search_type.eql?(:first)
153
+ return result
154
+ elsif !result.nil
155
+ results << result
156
+ end
157
+ end
158
+
159
+ if results.empty?
160
+ return nil
161
+ else
162
+ return results
163
+ end
164
+ end
165
+
166
+ # returns an array of all available scrapers
167
+ def self.scrapers
168
+ Base.scrapers
169
+ end
170
+
171
+ end
172
+ end