rbook 0.4.1 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require 'rake/testtask'
5
5
  require "rake/gempackagetask"
6
6
  require "rubygems"
7
7
 
8
- PKG_VERSION = "0.4.1"
8
+ PKG_VERSION = "0.4.3"
9
9
  PKG_NAME = "rbook"
10
10
  PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
11
11
  RUBYFORGE_PROJECT = 'rbook'
@@ -7,6 +7,6 @@ require File.dirname(__FILE__) + '/../lib/rbook/gbip'
7
7
 
8
8
  gbip = RBook::GBIP::POS.new("username", "password")
9
9
 
10
- puts gbip.find("0091835135").inspect
11
- #puts tp.find("1741146712").inspect
10
+ #puts gbip.find("0091835135").inspect
11
+ puts gbip.find("1741146712").inspect
12
12
 
@@ -7,8 +7,7 @@ require File.dirname(__FILE__) + '/../lib/rbook/pacstream'
7
7
 
8
8
  counter = 0
9
9
 
10
- RBook::Pacstream.get(:orders, :username => "9021000", :password => "test", :servername => "127.0.0.1") do |order|
11
- #File.open("#{counter.to_s}.ord", "w") { |f| f.puts order }
12
- puts order
10
+ RBook::Pacstream.get(:orders, :username => "myusername", :password => "mypass") do |order|
11
+ File.open("#{counter.to_s}.ord", "w") { |f| f.puts order }
13
12
  counter += 1
14
13
  end
@@ -0,0 +1,18 @@
1
+ # assuming you have rbook installed via rubygems,
2
+ # in a regular script, replace the following require
3
+ # line with these 2 lines:
4
+ # require 'rubygems'
5
+ # require 'rbook/titlepage'
6
+ require File.dirname(__FILE__) + '/../lib/rbook/titlepage'
7
+ require File.dirname(__FILE__) + '/../lib/rbook/onix'
8
+
9
+ client = RBook::TitlePage::WWWClient.new
10
+
11
+ client.login("username", "password")
12
+
13
+ text = client.get_onix_file("9780060000707")
14
+ #msg = RBook::Onix::Message.load_from_string(text)
15
+ #puts msg.to_s
16
+ puts text
17
+
18
+ client.logout
@@ -8,5 +8,9 @@
8
8
  require File.dirname(__FILE__) + '/../../lib/rbook/www'
9
9
 
10
10
 
11
- puts RBook::WWW.find_cover(ARGV[0], :amazon_uk).inspect
11
+ result = RBook::WWW.find_cover(:first, ARGV[0], :amazon_uk)
12
+
13
+ unless result.nil?
14
+ File.open("cover.jpg","w") { |of| of.write result[:data]}
15
+ end
12
16
 
@@ -73,6 +73,16 @@ module RBook
73
73
  # load each lineitem into the message
74
74
  item = RBook::Bisac::POLineItem.load_from_string(line)
75
75
  msg.items << item
76
+ when "41"
77
+ if line.length > 21
78
+ title = line[21, line.length - 21]
79
+ msg.items.last.title = title.strip unless title.nil?
80
+ end
81
+ when "42"
82
+ if line.length > 21
83
+ author = line[21, line.length - 21]
84
+ msg.items.last.author = author.strip unless author.nil?
85
+ end
76
86
  when "90" # footer
77
87
  # check the built objects match the file
78
88
  end
@@ -9,6 +9,7 @@ module RBook
9
9
 
10
10
  attr_accessor :sequence_number, :po_number, :line_item_number
11
11
  attr_accessor :isbn, :qty, :catalogue_code, :price
12
+ attr_accessor :author, :title
12
13
 
13
14
  # returns a new RBook::Bisac::POLineItem object using the data passed in as a string
14
15
  # refer to the bisac spec for the expected format of the string
@@ -2,6 +2,8 @@ $LOAD_PATH.unshift(File.dirname(__FILE__) + "/../")
2
2
 
3
3
  require 'rbook/isbn'
4
4
  require 'rbook/gbip/pos'
5
+ require 'rbook/gbip/title'
6
+ require 'rbook/gbip/warehouse'
5
7
 
6
8
  module RBook
7
9
 
@@ -1,4 +1,5 @@
1
1
  require 'socket'
2
+ require 'enumerator'
2
3
 
3
4
  module RBook
4
5
 
@@ -8,7 +9,8 @@ module RBook
8
9
  # RBook::GBIP has basic usage examples.
9
10
  class POS
10
11
 
11
- attr_accessor :username, :password
12
+ # don't think we really need these
13
+ #attr_accessor :username, :password
12
14
 
13
15
  POS_SERVER = "pos.bowker.com"
14
16
  POS_PORT = 7052
@@ -21,18 +23,94 @@ module RBook
21
23
 
22
24
  # search for the specified ISBN on globalbooksinprint.com.
23
25
  # Accepts both ISBN10 and ISBN13's.
24
- def find(isbn)
26
+ def find(type, isbn, options = {})
27
+ if type != :first && type != :all
28
+ raise ArgumentError, 'type must by :first or :all'
29
+ end
30
+
31
+ # global only accepts ISBNs as 10 digits at this stage
25
32
  isbn = RBook::ISBN::convert_to_isbn10(isbn)
26
33
  return nil if isbn.nil?
27
34
 
28
- request = "POS\t3\t2\t#{@username}\t#{@password}\t2\t\tbn=#{isbn}\t1|1|1|1|1|1|1|1|1|1\t10,0\t1\t\t"
35
+ request_format = "POS"
36
+ account_type = "3"
37
+ product = "2"
38
+ username = "#{@username}"
39
+ password = "#{@password}"
40
+ version = "2"
41
+ supplier = ""
42
+ request = "bn=#{isbn}"
43
+ filters = "1|1|1|1|1|1|1|1|1|1"
44
+ if type.eql?(:first)
45
+ records = "1,0"
46
+ else
47
+ records = "10,0"
48
+ end
49
+ sort_order = "1"
50
+ markets = options[:markets] || ""
51
+
52
+ request_string = "#{request_format}\t#{account_type}\t#{product}\t#{username}\t#{password}\t"
53
+ request_string << "#{version}\t#{supplier}\t#{request}\t#{filters}\t#{records}\t#{sort_order}\t"
54
+ request_string << "#{markets}\t"
55
+
29
56
  gbip = TCPSocket.new(POS_SERVER, POS_PORT)
30
- gbip.print request
31
- response = gbip.gets(nil)
57
+ gbip.print request_string
58
+ response = gbip.gets(nil).split("#")
32
59
  gbip.close
33
- return response.split("\t")
60
+
61
+ header = nil
62
+ titles_arr = []
63
+ response.each do |arr|
64
+ if header.nil?
65
+ header = arr.split("\t")
66
+ else
67
+ titles_arr << arr.split("\t")
68
+ titles_arr[-1] = titles_arr.last[1,titles_arr.last.size-1]
69
+ end
70
+ end
71
+
72
+ # raise an exception if incorrect login details were provided
73
+ if header.first.eql?("66")
74
+ raise ArgumentError, "Invalid username or password"
75
+ end
76
+
77
+ if titles_arr.size == 0
78
+ # return nil if no matching records found
79
+ return nil
80
+ else
81
+
82
+ titles = []
83
+ titles_arr.each do |arr|
84
+ title = build_object_tree(arr)
85
+ titles << title unless title.nil?
86
+ end
87
+
88
+ if type.eql?(:first)
89
+ return titles.first
90
+ else
91
+ return titles
92
+ end
93
+ end
94
+
34
95
  end
35
96
 
97
+ private
98
+
99
+ def build_object_tree(arr)
100
+ raise ArgumentError, 'arr must be an array' unless arr.class == Array
101
+ return nil if arr.size < 18
102
+
103
+ title_arr = arr[0, 15]
104
+ warehouse_arr = arr[15,arr.size - 15]
105
+ title = Title.new(title_arr)
106
+
107
+ warehouse_arr.each_slice(5) do |slice|
108
+ warehouse_obj = Warehouse.new(slice)
109
+ title.warehouses << warehouse_obj unless warehouse_obj.nil?
110
+ end
111
+
112
+ return title
113
+ end
36
114
  end
37
115
 
38
116
  end
@@ -0,0 +1,36 @@
1
+ require 'bigdecimal'
2
+
3
+ module RBook
4
+ module GBIP
5
+
6
+ # models a warehouse supply detail from the Global Books in Print API
7
+ class Title
8
+
9
+
10
+ attr_accessor :market, :title, :isbn, :binding, :status, :edition
11
+ attr_accessor :contributor, :publisher, :publication_date
12
+ attr_accessor :rrp, :supplier, :suppliers_with_stock
13
+ attr_accessor :warehouses
14
+
15
+ def initialize(arr)
16
+ raise ArgumentError, "arr must be an array" unless arr.class == Array
17
+ #raise ArgumentError, "Invalid number of array elements" unless arr.size == 14
18
+
19
+ self.market = arr[2].strip
20
+ self.title = arr[3].strip
21
+ self.isbn = RBook::ISBN.convert_to_isbn13(arr[4].strip) || arr[4].strip
22
+ self.binding = arr[5].strip
23
+ self.status = arr[6].strip
24
+ self.edition = arr[7].strip
25
+ self.contributor = arr[8].strip
26
+ self.publisher = arr[9].strip
27
+ self.publication_date = arr[10].strip
28
+ self.rrp = BigDecimal.new(arr[11].strip)
29
+ self.supplier = arr[12].strip
30
+ self.suppliers_with_stock = arr[13].strip
31
+
32
+ @warehouses = []
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,27 @@
1
+ require 'date'
2
+
3
+ module RBook
4
+ module GBIP
5
+
6
+ # models a warehouse supply detail from the Global Books in Print API
7
+ class Warehouse
8
+
9
+
10
+ attr_accessor :name, :status, :onhand, :onorder, :updated_at
11
+
12
+ def initialize(arr)
13
+ raise ArgumentError, "arr must be an array" unless arr.class == Array
14
+ raise ArgumentError, "Invalid number of array elements" unless arr.size == 5
15
+
16
+ puts arr.inspect
17
+ self.name = arr[0].strip
18
+ self.status = arr[1].strip
19
+ self.onhand = arr[2].to_i
20
+ self.onorder = arr[3].to_i
21
+ tmpdate = arr[4]
22
+ puts tmpdate
23
+ self.updated_at = Date.civil(tmpdate[6,4].to_i, tmpdate[0,2].to_i, tmpdate[3,2].to_i)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -31,7 +31,6 @@ module RBook
31
31
  calc = calc.insert(15, "-")
32
32
  return calc
33
33
  end
34
-
35
34
  end
36
35
 
37
36
  # Returns true if the supplied string is a valid isbn10 or isbn13
@@ -59,6 +58,7 @@ module RBook
59
58
  # ISBN::valid_isbn10?("not an isbn")
60
59
  # #=> false
61
60
  def ISBN::valid_isbn10?(isbn)
61
+ isbn.gsub!("-","") if isbn.class == String
62
62
  if isbn.nil?
63
63
  false
64
64
  elsif isbn.class != String
@@ -68,7 +68,12 @@ module RBook
68
68
  elsif isbn[/[^\dxX]/]
69
69
  false
70
70
  else
71
- isbn == isbn[0,9] + ISBN::calc_isbn10_check(isbn.to_s[0,9])
71
+ checkdigit = ISBN::calc_isbn10_check(isbn.to_s[0,9])
72
+ if checkdigit.eql?("X")
73
+ isbn == isbn[0,9] + "x" || isbn == isbn[0,9] + "X"
74
+ else
75
+ isbn == isbn[0,9] + checkdigit
76
+ end
72
77
  end
73
78
  end
74
79
 
@@ -83,6 +88,7 @@ module RBook
83
88
  # ISBN::valid_isbn13?("not an isbn")
84
89
  # #=> false
85
90
  def ISBN::valid_isbn13?(isbn)
91
+ isbn.gsub!("-","") if isbn.class == String
86
92
  if isbn.nil?
87
93
  false
88
94
  elsif isbn.class != String
@@ -15,8 +15,14 @@ module RBook
15
15
  @products = []
16
16
  end
17
17
 
18
+ # Attempts to create a message object using thge supplied xml string
19
+ def self.load_from_string(str)
20
+ doc = REXML::Document.new(str)
21
+ self.load_from_xmldoc(doc)
22
+ end
23
+
18
24
  # Attempts to create a message object using thge supplied xml document
19
- def Message.load_from_xmldoc(doc)
25
+ def self.load_from_xmldoc(doc)
20
26
  raise ArgumentError, 'load_from_xmldoc expects a REXML document object' unless doc.class == REXML::Document
21
27
  if REXML::XPath.first(doc, '/ONIXMessage/').nil? ||
22
28
  REXML::XPath.first(doc, '/ONIXMessage/Header').nil? ||
@@ -36,19 +36,25 @@ module RBook
36
36
  server = args[0][:servername] || "pacstream.tedis.com.au"
37
37
 
38
38
  begin
39
+ transaction_complete = false
39
40
  Net::FTP.open(server) do |ftp|
40
- file_regexp = Regexp.new(".*\.#{FILE_EXTENSIONS[type]}$", Regexp::IGNORECASE)
41
- ftp.login(args[0][:username], args[0][:password])
42
- ftp.chdir("outgoing/")
43
- ftp.nlst.each do |file|
44
- if file.match(file_regexp)
45
- tempfile = Tempfile.new("pacstream")
46
- tempfile.close
47
- ftp.getbinaryfile(file, tempfile.path)
48
- yield File.read(tempfile.path)
41
+
42
+ file_regexp = Regexp.new(".*\.#{FILE_EXTENSIONS[type]}$", Regexp::IGNORECASE)
43
+ ftp.login(args[0][:username].to_s, args[0][:password].to_s)
44
+ ftp.chdir("outgoing/")
45
+ ftp.nlst.each do |file|
46
+ if file.match(file_regexp)
47
+ tempfile = Tempfile.new("pacstream")
48
+ tempfile.close
49
+ ftp.getbinaryfile(file, tempfile.path)
50
+ yield File.read(tempfile.path)
51
+ end
49
52
  end
50
- end
53
+ transaction_complete = true
54
+ #ftp.quit
51
55
  end
56
+ rescue EOFError
57
+ raise "Connection terminated by remote server" unless transaction_complete
52
58
  rescue Net::FTPPermError
53
59
  raise "Error while communicating with the pacstream server"
54
60
  end
@@ -4,6 +4,7 @@ require 'rbook/isbn'
4
4
  require 'rbook/errors'
5
5
  require 'rbook/titlepage/titlepage_driver'
6
6
  require 'rbook/titlepage/client'
7
+ require 'rbook/titlepage/wwwclient'
7
8
 
8
9
  module RBook
9
10
 
@@ -0,0 +1,96 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + "/../")
2
+
3
+ require 'rbook/isbn'
4
+ require 'rbook/errors'
5
+
6
+ module RBook
7
+ module TitlePage
8
+
9
+ # You should be aware of any limits of query volume imposed by the provider - currently a
10
+ # maximum of 30 queries per minute is permitted.
11
+ class WWWClient
12
+
13
+ TITLEPAGE_DOMAIN = "www.titlepage.com"
14
+ @@uri = nil
15
+
16
+ def initialize
17
+ end
18
+
19
+ def get_onix_file(isbn)
20
+ isbn = RBook::ISBN.convert_to_isbn13(isbn)
21
+ raise ArgumentError, 'Invalid ISBN supplied' if isbn.nil?
22
+
23
+ headers = { 'Cookie' => @cookie }
24
+
25
+ login_response = Net::HTTP.start(TITLEPAGE_DOMAIN, 80) do |http|
26
+ data = [
27
+ "posted=yes",
28
+ "quicksearch=#{isbn}",
29
+ "qsrchby=ean",
30
+ "detailed=Search"
31
+ ].join("&")
32
+ http.post('/results.php', data, headers)
33
+ end
34
+ regex = /onclick=\"bookPopUp\(\'(.+)\'\);\"/
35
+ code = login_response.body.match(regex)
36
+ if code.nil?
37
+ return nil
38
+ else
39
+ code = code[1]
40
+ end
41
+ onix_file = Net::HTTP.start(TITLEPAGE_DOMAIN, 80) do |http|
42
+ data = [
43
+ "download=Download",
44
+ "rr=#{code}"
45
+ ].join("&")
46
+ http.post('/detail.php', data, headers)
47
+ end
48
+ return onix_file.body
49
+ end
50
+
51
+ # login to the titlepage website.
52
+ def login(username, password)
53
+ login_response = Net::HTTP.start(TITLEPAGE_DOMAIN, 80) do |http|
54
+ data = [
55
+ "usr=#{username}",
56
+ "pwd=#{password}",
57
+ "login=Login"
58
+ ].join("&")
59
+ http.post('/index.php', data)
60
+ end
61
+ @cookie = login_response['set-cookie']
62
+ end
63
+
64
+ # logout from the titlepage API
65
+ def logout
66
+ if @cookie
67
+ login_response = Net::HTTP.start(TITLEPAGE_DOMAIN, 80) do |http|
68
+ http.get("/logout.php")
69
+ end
70
+ @cookie = nil
71
+ end
72
+ end
73
+
74
+ # a convenience method to make queries to title page a little cleaner. This function
75
+ # essentially calls the login and logout functions for you automatically.
76
+ #
77
+ # RBook::TitlePage::WWWClient.open("username","password") do |tp|
78
+ # result = tp.get_onix_file("9780091835132")
79
+ # end
80
+ def self.open(username, password)
81
+
82
+ tp = self.new
83
+
84
+ begin
85
+ tp.login(username, password)
86
+
87
+ yield(tp)
88
+
89
+ ensure
90
+ tp.logout
91
+ end
92
+ end
93
+
94
+ end
95
+ end
96
+ end
@@ -59,7 +59,7 @@ module RBook
59
59
  scrapers.each do |scraper|
60
60
  worker = scraper.new
61
61
  result = worker.get_info(isbn)
62
- if !result.nil? && search_type.eql(:first)
62
+ if !result.nil? && search_type.eql?(:first)
63
63
  return result
64
64
  elsif !result.nil?
65
65
  results << result
@@ -0,0 +1,62 @@
1
+
2
+ module RBook
3
+ module WWW
4
+
5
+ class BarnesAndNobleScraper < Base
6
+
7
+ SCRAPER_ID = :barnesandnoble
8
+ SCRAPER_NAME = "Barnes and Noble".freeze
9
+ SCRAPER_SITE = "http://www.barnesandnole.com/".freeze
10
+
11
+ add_scraper( self )
12
+
13
+ def get_info(isbn)
14
+
15
+ @protocol = "http://"
16
+ @host = "search.barnesandnoble.com"
17
+ @path = "/booksearch/isbninquiry.asp?z=y&cds2Pid=9481&isbn="
18
+ @imgviewer_path = "/booksearch/imageviewer.asp?z=y&ean="
19
+ @link = @protocol + @host + @path + ISBN::convert_to_isbn10(isbn)
20
+ @imgviewer_link = @protocol + @host + @imgviewer_path + ISBN::convert_to_isbn10(isbn)
21
+
22
+ main = Scraper.define do
23
+ process "h1#title", :title => :text
24
+ process "h2#contributor>a", :author => :text
25
+ process "li.format", :form => :text
26
+ process "div#coverImage>a>noscript>img", :cover_thumb => "@src"
27
+ result :title, :author, :form, :cover_thumb
28
+ end
29
+
30
+ imgscraper = Scraper.define do
31
+ process "div>img[alt=Cover Image]", :cover_large => "@src"
32
+ result :cover_large
33
+ end
34
+
35
+ content = Net::HTTP.get URI.parse(@link)
36
+ result = main.scrape(content)
37
+ if result.title.nil?
38
+ return nil
39
+ else
40
+
41
+ info = {}
42
+ info[:isbn] = isbn
43
+ info[:title] = result.title unless result.title.nil?
44
+ info[:author] = result.author unless result.author.nil?
45
+ info[:format] = result.form unless result.form.nil?
46
+ info[:cover_thumb] = result.cover_thumb
47
+ info[:link] = @link
48
+ info[:from_name] = SCRAPER_NAME
49
+ info[:from_url] = SCRAPER_SITE
50
+
51
+ content = Net::HTTP.get URI.parse(@imgviewer_link)
52
+ result = imgscraper.scrape(content)
53
+
54
+ info[:cover_large] = result unless result.nil?
55
+
56
+ return info
57
+ end
58
+ end
59
+
60
+ end
61
+ end
62
+ end
@@ -26,6 +26,9 @@ class POTest < Test::Unit::TestCase
26
26
  assert_kind_of RBook::Bisac::PO, msg
27
27
  assert_equal msg.items.size, 36
28
28
 
29
+ assert_equal "Finding Sanctuary :Monastic St", msg.items.first.title
30
+ assert_equal "JAMISON ABBOT CHRISTOPH", msg.items.first.author
31
+
29
32
  validate_msg(msg)
30
33
  end
31
34
 
@@ -32,6 +32,8 @@ include RBook
32
32
  assert_equal ISBN::valid_isbn10?('020161622X'), true
33
33
  assert_equal ISBN::valid_isbn10?('020161622'), false
34
34
  assert_equal ISBN::valid_isbn10?('023252565X'), true
35
+ assert_equal ISBN::valid_isbn10?('023252565x'), true
36
+ assert_equal ISBN::valid_isbn10?('020-161-622-X'), true
35
37
  assert_equal ISBN::valid_isbn10?('9780764812200'), false
36
38
  assert_equal ISBN::valid_isbn10?('12345'), false
37
39
  assert_equal ISBN::valid_isbn10?('12345 7890'), false
@@ -49,6 +51,7 @@ include RBook
49
51
  assert_equal ISBN::valid_isbn13?('9780201616224'), true
50
52
  assert_equal ISBN::valid_isbn13?('978020161622'), false
51
53
  assert_equal ISBN::valid_isbn13?('9780764812200'), true
54
+ assert_equal ISBN::valid_isbn13?('978-02016-1622-4'), true
52
55
  assert_equal ISBN::valid_isbn13?('978076481220'), false
53
56
  assert_equal ISBN::valid_isbn13?('978 NCR 4611'), false
54
57
  assert_equal ISBN::valid_isbn13?('12345'), false
@@ -121,8 +124,9 @@ include RBook
121
124
  assert_equal ISBN::convert_to_isbn13('0764812203'), '9780764812200'
122
125
  assert_equal ISBN::convert_to_isbn13('1856075338'), '9781856075336'
123
126
  assert_equal ISBN::convert_to_isbn13('023252565X'), '9780232525656'
127
+ assert_equal ISBN::convert_to_isbn13('023252565x'), '9780232525656'
124
128
  assert_equal ISBN::convert_to_isbn13('1863951342'), '9781863951340'
125
- assert_equal ISBN::convert_to_isbn13('186-395-134-2'), nil
129
+ assert_equal ISBN::convert_to_isbn13('186-395-134-2'), '9781863951340'
126
130
 
127
131
  #already isbn13
128
132
  assert_equal ISBN::convert_to_isbn13('9781856075336'), '9781856075336'
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0
2
+ rubygems_version: 0.9.1
3
3
  specification_version: 1
4
4
  name: rbook
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.4.1
7
- date: 2006-11-20 00:00:00 +11:00
6
+ version: 0.4.3
7
+ date: 2007-01-25 00:00:00 +11:00
8
8
  summary: A collection of classes and modules for working with bibliographic data
9
9
  require_paths:
10
10
  - lib
@@ -31,15 +31,15 @@ authors:
31
31
  files:
32
32
  - examples/www
33
33
  - examples/onix
34
- - examples/43.ord
35
34
  - examples/titlepage.rb
36
35
  - examples/pacstream.rb
37
36
  - examples/gbip.rb
37
+ - examples/titlepage_www.rb
38
38
  - examples/titlepage_with_proxy.rb
39
- - examples/www/list.rb
40
39
  - examples/www/find_cover_from_amazon.rb
41
40
  - examples/www/find_url_from_rainbow.rb
42
41
  - examples/www/find_all.rb
42
+ - examples/www/list.rb
43
43
  - examples/onix/stream_reader.rb
44
44
  - lib/rbook
45
45
  - lib/rbook/bisac
@@ -47,8 +47,8 @@ files:
47
47
  - lib/rbook/www
48
48
  - lib/rbook/onix
49
49
  - lib/rbook/titlepage
50
- - lib/rbook/titlepage.rb
51
50
  - lib/rbook/onix.rb
51
+ - lib/rbook/titlepage.rb
52
52
  - lib/rbook/pacstream.rb
53
53
  - lib/rbook/bisac.rb
54
54
  - lib/rbook/gbip.rb
@@ -57,14 +57,16 @@ files:
57
57
  - lib/rbook/errors.rb
58
58
  - lib/rbook/bisac/po.rb
59
59
  - lib/rbook/bisac/product.rb
60
- - lib/rbook/bisac/message.rb
61
60
  - lib/rbook/bisac/po_line_item.rb
61
+ - lib/rbook/bisac/message.rb
62
62
  - lib/rbook/gbip/pos.rb
63
- - lib/rbook/www/wiley_us_scraper.rb
63
+ - lib/rbook/gbip/title.rb
64
+ - lib/rbook/gbip/warehouse.rb
64
65
  - lib/rbook/www/hha_scraper.rb
65
- - lib/rbook/www/random_au_scraper.rb
66
+ - lib/rbook/www/ban_scraper.rb
67
+ - lib/rbook/www/wiley_us_scraper.rb
66
68
  - lib/rbook/www/oup_scraper.rb
67
- - lib/rbook/www/pearson_au_scraper.rb
69
+ - lib/rbook/www/random_au_scraper.rb
68
70
  - lib/rbook/www/penguin_scraper.rb
69
71
  - lib/rbook/www/harper_au_scraper.rb
70
72
  - lib/rbook/www/aau_scraper.rb
@@ -76,9 +78,9 @@ files:
76
78
  - lib/rbook/www/random_us_scraper.rb
77
79
  - lib/rbook/www/harper_us_scraper.rb
78
80
  - lib/rbook/www/base.rb
81
+ - lib/rbook/www/pearson_au_scraper.rb
79
82
  - lib/rbook/www/macmillan_scraper.rb
80
83
  - lib/rbook/onix/lists
81
- - lib/rbook/onix/sales_restriction.rb
82
84
  - lib/rbook/onix/stream_reader.rb
83
85
  - lib/rbook/onix/lists.rb
84
86
  - lib/rbook/onix/supply_detail.rb
@@ -87,39 +89,41 @@ files:
87
89
  - lib/rbook/onix/xchar.rb
88
90
  - lib/rbook/onix/stream_writer.rb
89
91
  - lib/rbook/onix/contributor.rb
90
- - lib/rbook/onix/lists/contributor_role.rb
92
+ - lib/rbook/onix/sales_restriction.rb
91
93
  - lib/rbook/onix/lists/product_form.rb
94
+ - lib/rbook/onix/lists/contributor_role.rb
92
95
  - lib/rbook/titlepage/client.rb
93
96
  - lib/rbook/titlepage/titlepage_utils.rb
97
+ - lib/rbook/titlepage/wwwclient.rb
94
98
  - lib/rbook/titlepage/titlepage_driver.rb
95
99
  - test/unit
96
100
  - test/data
97
101
  - test/mocks
102
+ - test/unit/bisac
98
103
  - test/unit/onix
99
104
  - test/unit/titlepage_test.rb
100
105
  - test/unit/isbn_test.rb
101
- - test/unit/bisac
102
- - test/unit/onix/sales_restriction_test.rb
106
+ - test/unit/bisac/po_test.rb
107
+ - test/unit/bisac/bisac_test.rb
108
+ - test/unit/bisac/po_line_item_test.rb
103
109
  - test/unit/onix/supply_detail_test.rb
104
110
  - test/unit/onix/product_test.rb
105
111
  - test/unit/onix/message_test.rb
106
112
  - test/unit/onix/xchar_test.rb
107
113
  - test/unit/onix/stream_writer_test.rb
108
114
  - test/unit/onix/contributor_test.rb
115
+ - test/unit/onix/sales_restriction_test.rb
109
116
  - test/unit/onix/stream_reader_test.rb
110
- - test/unit/bisac/bisac_test.rb
111
- - test/unit/bisac/po_test.rb
112
- - test/unit/bisac/po_line_item_test.rb
113
- - test/data/xml_not_onix.xml
114
117
  - test/data/abingdon.xml
115
- - test/data/invalid_no_product.xml
116
118
  - test/data/single_product.xml
119
+ - test/data/invalid_no_product.xml
117
120
  - test/data/chalice.xml
118
121
  - test/data/not_xml.csv
119
- - test/data/valid_bisac.txt
122
+ - test/data/xml_not_onix.xml
123
+ - test/data/bisac_po.txt
120
124
  - test/data/eerdsman.xml
121
125
  - test/data/augsburg.xml
122
- - test/data/bisac_po.txt
126
+ - test/data/valid_bisac.txt
123
127
  - test/mocks/titlepage_driver.rb
124
128
  - Rakefile
125
129
  - README
@@ -1,18 +0,0 @@
1
- H,1111111,9021000,,14977,,,,061120,,,,,,,,,,,
2
- D,,,9780140441147,,2,,,0.00,,,,
3
- D,,,9780142405369,,1,,,0.00,,,,
4
- D,,,9780143300373,,1,,,0.00,,,,
5
- D,,,9780143300380,,1,,,0.00,,,,
6
- D,,,9780349115320,,2,,,0.00,,,,
7
- D,,,9780751536829,,2,,,0.00,,,,
8
- D,,,9780756614690,,1,,,0.00,,,,
9
- D,,,9780782417173,,6,,,0.00,,,,
10
- D,,,9780782417340,,9,,,0.00,,,,
11
- D,,,9780782442977,,6,,,0.00,,,,
12
- D,,,9780782443004,,3,,,0.00,,,,
13
- D,,,9780785263135,,1,,,0.00,,,,
14
- D,,,9780785283546,,1,,,0.00,,,,
15
- D,,,9781405303255,,1,,,0.00,,,,
16
- D,,,9781920885151,,10,,,0.00,,,,
17
- D,,,9781921145346,,1,,,0.00,,,,
18
- S,16,,