rbook 0.1 → 0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +1 -0
- data/Rakefile +3 -2
- data/examples/gbip.rb +12 -0
- data/examples/onix/stream_reader.rb +13 -0
- data/examples/titlepage.rb +1 -1
- data/lib/rbook/bisac.rb +21 -167
- data/lib/rbook/bisac/message.rb +99 -0
- data/lib/rbook/bisac/product.rb +176 -0
- data/lib/rbook/gbip.rb +19 -0
- data/lib/rbook/gbip/pos.rb +40 -0
- data/lib/rbook/onix.rb +2 -0
- data/lib/rbook/onix/message.rb +91 -86
- data/lib/rbook/onix/product.rb +179 -178
- data/lib/rbook/onix/stream_reader.rb +120 -0
- data/lib/rbook/onix/stream_writer.rb +40 -0
- data/lib/rbook/onix/supply_detail.rb +1 -1
- data/lib/rbook/titlepage.rb +5 -65
- data/lib/rbook/titlepage/client.rb +81 -0
- data/lib/rbook/titlepage/titlepage_driver.rb +122 -119
- data/lib/rbook/titlepage/titlepage_utils.rb +375 -370
- data/test/data/valid_bisac.txt +213 -0
- data/test/mocks/titlepage_driver.rb +99 -95
- data/test/unit/bisac_test.rb +68 -29
- data/test/unit/onix/stream_reader_test.rb +22 -0
- data/test/unit/onix/stream_writer_test.rb +32 -0
- data/test/unit/titlepage_test.rb +5 -5
- metadata +41 -26
- data/lib/rbook/titlepage/TitleQueryClient.rb +0 -62
data/README
CHANGED
@@ -6,6 +6,7 @@ There are currently 5 key components in the library. Please refer to their
|
|
6
6
|
respective documentation for information on usage.
|
7
7
|
|
8
8
|
- RBook::Bisac - Support for reading and writing BISAC files.
|
9
|
+
- RBook::GBIP - Very rudimentary support for using the globalbooksinprint.com TCP API.
|
9
10
|
- RBook::ISBN - Convenience methods for validating and converting ISBNs.
|
10
11
|
- RBook::Onix - Support for reading and writing ONIX files.
|
11
12
|
- RBook::TitlePage - A wrapper for the titlepage.com SOAP API.
|
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.
|
8
|
+
PKG_VERSION = "0.2"
|
9
9
|
PKG_NAME = "rbook"
|
10
10
|
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
11
11
|
RUBYFORGE_PROJECT = 'rbook'
|
@@ -77,7 +77,8 @@ end
|
|
77
77
|
desc "Report code statistics (KLOCs, etc) from the application"
|
78
78
|
task :stats do
|
79
79
|
require 'vendor/code_statistics'
|
80
|
-
dirs = [["Library", "lib"],["Functional tests", "test/functional"],["Unit tests", "test/unit"]]
|
80
|
+
#dirs = [["Library", "lib"],["Functional tests", "test/functional"],["Unit tests", "test/unit"]]
|
81
|
+
dirs = [["Library", "lib"],["Unit tests", "test/unit"]]
|
81
82
|
CodeStatistics.new(*dirs).to_s
|
82
83
|
end
|
83
84
|
|
data/examples/gbip.rb
ADDED
@@ -0,0 +1,12 @@
|
|
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/gbip'
|
6
|
+
require File.dirname(__FILE__) + '/../lib/rbook/gbip'
|
7
|
+
|
8
|
+
gbip = RBook::GBIP::POS.new("username", "password")
|
9
|
+
|
10
|
+
puts gbip.find("0091835135").inspect
|
11
|
+
#puts tp.find("1741146712").inspect
|
12
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
|
2
|
+
|
3
|
+
require 'rbook/onix'
|
4
|
+
|
5
|
+
reader = RBook::Onix::StreamReader.new(File.dirname(__FILE__)+"/../../test/data/chalice.xml")
|
6
|
+
counter = 0
|
7
|
+
|
8
|
+
reader.each do |product|
|
9
|
+
puts product.product_identifier
|
10
|
+
counter += 1
|
11
|
+
end
|
12
|
+
|
13
|
+
puts "total of ##{counter.to_s} products"
|
data/examples/titlepage.rb
CHANGED
data/lib/rbook/bisac.rb
CHANGED
@@ -1,175 +1,29 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + "/../")
|
2
|
+
|
3
|
+
require 'rbook/bisac/message'
|
4
|
+
require 'rbook/bisac/product'
|
5
|
+
require 'rbook/isbn'
|
6
|
+
|
1
7
|
module RBook
|
2
8
|
|
3
|
-
# Ruby
|
9
|
+
# Ruby module for reading and writing BISAC files.
|
4
10
|
# BISAC is a really bad format for electronic exchange of data - ONIX should be
|
5
11
|
# used where possible. Here be dragons.
|
6
12
|
#
|
7
|
-
# Basic Usage
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
|
21
|
-
# :volumes => "1",
|
22
|
-
# :status => "O/O"
|
23
|
-
# }
|
24
|
-
# bisac.add_item(item)
|
25
|
-
# bisac.write("/tmp/jan06.txt")
|
26
|
-
class Bisac
|
27
|
-
|
28
|
-
# creates a new bisac file in memory
|
29
|
-
# company = company name (10 chars)
|
30
|
-
# san = company SAN number (12 chars)
|
31
|
-
# batch = batch name for this file (6 chars)
|
32
|
-
# code = 1 for new titles, 2 for updated titles (1 char)
|
33
|
-
def initialize(company, san, batch, code)
|
34
|
-
@company = company
|
35
|
-
@san = san
|
36
|
-
@batch = batch
|
37
|
-
@code = code
|
38
|
-
@data = []
|
39
|
-
end
|
40
|
-
|
41
|
-
# TODO: Not Yet Implemented.
|
42
|
-
# loads the requested BISAC file into memory. Returns an array of hashes
|
43
|
-
def self.load(filename)
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
# adds a new title to the bisic file. Expects a hash with the required data.
|
48
|
-
#
|
49
|
-
# Required hash indexes:
|
50
|
-
# - :isbn
|
51
|
-
# - :title
|
52
|
-
# - :author
|
53
|
-
# - :price
|
54
|
-
# - :pubdate
|
55
|
-
# - :publisher
|
56
|
-
# - :imprint
|
57
|
-
# - :edition
|
58
|
-
# - :binding
|
59
|
-
# - :volume
|
60
|
-
# - :volumes
|
61
|
-
# - :status
|
62
|
-
def add_item(item)
|
63
|
-
raise ArgumentError, 'item must be a hash' unless item.kind_of?(Hash)
|
64
|
-
raise ArgumentError, 'Hash needs an :isbn index' if item[:isbn].nil?
|
65
|
-
raise ArgumentError, 'Hash needs an :title index' if item[:title].nil?
|
66
|
-
raise ArgumentError, 'Hash needs an :author index' if item[:author].nil?
|
67
|
-
raise ArgumentError, 'Hash needs an :price index' if item[:price].nil?
|
68
|
-
raise ArgumentError, 'Hash needs an :pubdate index' if item[:pubdate].nil?
|
69
|
-
raise ArgumentError, 'Hash needs an :publisher index' if item[:publisher].nil?
|
70
|
-
raise ArgumentError, 'Hash needs an :imprint index' if item[:imprint].nil?
|
71
|
-
raise ArgumentError, 'Hash needs an :volumes index' if item[:volumes].nil?
|
72
|
-
raise ArgumentError, 'Hash needs an :edition index' if item[:edition].nil?
|
73
|
-
raise ArgumentError, 'Hash needs an :binding index' if item[:binding].nil?
|
74
|
-
raise ArgumentError, 'Hash needs an :volume index' if item[:volume].nil?
|
75
|
-
raise ArgumentError, 'Hash needs an :status index' if item[:status].nil?
|
76
|
-
@data << item
|
77
|
-
end
|
78
|
-
|
79
|
-
# converts this bisac file into a string
|
80
|
-
def to_s
|
81
|
-
# File Header
|
82
|
-
content = "**HEADER**"
|
83
|
-
content << Time.now.strftime("%y%m%d")
|
84
|
-
content << @company[0,10].ljust(10)
|
85
|
-
content << @san[0,12].ljust(12)
|
86
|
-
content << @batch[0,6].ljust(6)
|
87
|
-
content << @code[0,1].ljust(1)
|
88
|
-
content << "**PUBSTAT*"
|
89
|
-
content << "040"
|
90
|
-
content << "".ljust(201)
|
91
|
-
content << "\n"
|
92
|
-
|
93
|
-
# File Content
|
94
|
-
counter = 0
|
95
|
-
@data.each do |item|
|
96
|
-
content << item[:isbn][0,10].ljust(10) # 10 digit isbn
|
97
|
-
content << "1"
|
98
|
-
content << "N"
|
99
|
-
content << "N"
|
100
|
-
content << "B"
|
101
|
-
content << "N"
|
102
|
-
content << item[:title][0,30].ljust(30)
|
103
|
-
content << "N"
|
104
|
-
content << item[:author][0,30].ljust(30)
|
105
|
-
content << "N"
|
106
|
-
content << "A" # author role
|
107
|
-
content << "N"
|
108
|
-
content << item[:price][0,7].rjust(7,"0") # current price
|
109
|
-
content << "N"
|
110
|
-
content << item[:pubdate][0,6].ljust(6) # published date
|
111
|
-
content << "N"
|
112
|
-
content << item[:publisher][0,10].ljust(10) # publisher
|
113
|
-
content << "N"
|
114
|
-
content << item[:imprint][0,14].ljust(14) #imprint
|
115
|
-
content << "N"
|
116
|
-
content << item[:volumes][0,3].rjust(3,"0") # volumes included in this isbn
|
117
|
-
content << "N"
|
118
|
-
content << item[:edition][0,2].rjust(2,"0") # edition
|
119
|
-
content << "N"
|
120
|
-
content << item[:binding][0,2].rjust(2) # binding
|
121
|
-
content << "N"
|
122
|
-
content << item[:volume][0,3].rjust(3,"0") # volume number
|
123
|
-
content << "N"
|
124
|
-
content << "0000000" # new price
|
125
|
-
content << "N"
|
126
|
-
content << "000000" # new price effective date
|
127
|
-
content << "N"
|
128
|
-
content << " " # audience type
|
129
|
-
content << "N"
|
130
|
-
content << item[:status][0,3].rjust(3) # status
|
131
|
-
content << "N"
|
132
|
-
content << " " # available date. only use for status' like NYP
|
133
|
-
content << "N"
|
134
|
-
content << " " # alternate isbn
|
135
|
-
content << "N"
|
136
|
-
content << "999999" # out of print date. only use for status == OP
|
137
|
-
content << "N"
|
138
|
-
content << " " # geographic restrictions
|
139
|
-
content << "N"
|
140
|
-
content << " " # library of congress catalogue number
|
141
|
-
content << "N"
|
142
|
-
content << "".ljust(40) # series title
|
143
|
-
content << "N"
|
144
|
-
content << "0" # price code for current price
|
145
|
-
content << "N"
|
146
|
-
content << "0" # price code for new price
|
147
|
-
content << "N"
|
148
|
-
content << "0000000" # freight pass through price
|
149
|
-
content << "N"
|
150
|
-
content << "000000" # new freight pass through price
|
151
|
-
content << "00000" # last changed date
|
152
|
-
content << "\n"
|
153
|
-
|
154
|
-
|
155
|
-
counter = counter + 1
|
156
|
-
end
|
157
|
-
|
158
|
-
# File Footer
|
159
|
-
content << "**TRAILER*"
|
160
|
-
content << Time.now.strftime("%y%m%d")
|
161
|
-
content << @batch[0,6].ljust(6)
|
162
|
-
content << counter.to_s[0,6].ljust(6)
|
163
|
-
content << "**PUBSTAT*"
|
164
|
-
content << "".ljust(221)
|
165
|
-
|
166
|
-
|
167
|
-
return content
|
168
|
-
end
|
13
|
+
# = Basic Usage
|
14
|
+
# require 'rubygems'
|
15
|
+
# require 'rbook/bisac'
|
16
|
+
# include Rbook
|
17
|
+
# msg = Bisac::Message.new('Company', '1234567', '111111', '1'))
|
18
|
+
# item = Bisac::Product.new('0123456789')
|
19
|
+
# item.title = "A Book"
|
20
|
+
# item.author = "Healy, James"
|
21
|
+
# item.price = "1995"
|
22
|
+
# item.binding = "PB"
|
23
|
+
# item.status = "AVL"
|
24
|
+
# msg << item
|
25
|
+
# puts msg.to_s
|
26
|
+
module Bisac
|
169
27
|
|
170
|
-
# writes the content of this bisac file out to the specified file
|
171
|
-
def write(filename)
|
172
|
-
File.open(filename, "w") { |f| f.puts to_s }
|
173
|
-
end
|
174
28
|
end
|
175
29
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module RBook
|
4
|
+
module Bisac
|
5
|
+
|
6
|
+
# Represents a single Bisac File. See RBook::Bisac for a basic
|
7
|
+
# usage example.
|
8
|
+
class Message
|
9
|
+
|
10
|
+
attr_accessor :company, :san, :batch, :code, :products
|
11
|
+
|
12
|
+
# creates a new bisac file in memory
|
13
|
+
# params:
|
14
|
+
# - company = company name (10 chars)
|
15
|
+
# - san = company SAN number (12 chars)
|
16
|
+
# - batch = batch name for this file (6 chars)
|
17
|
+
# - code = 1 for new titles, 2 for updated titles (1 char)
|
18
|
+
def initialize(company, san, batch, code)
|
19
|
+
@company = company
|
20
|
+
@san = san
|
21
|
+
@batch = batch
|
22
|
+
@code = code
|
23
|
+
@products = []
|
24
|
+
end
|
25
|
+
|
26
|
+
# loads the requested BISAC file into memory.
|
27
|
+
# returns a Message object or nil if the file is not
|
28
|
+
# a BISAC file
|
29
|
+
def self.load(filename)
|
30
|
+
msg = self.new(nil,nil,nil,nil)
|
31
|
+
|
32
|
+
File.open(filename, "r") do |f|
|
33
|
+
f.each_line do |l|
|
34
|
+
if l[0,10].eql?("**HEADER**")
|
35
|
+
msg.company = l[16,10].strip
|
36
|
+
msg.san = l[26,12].strip
|
37
|
+
msg.batch = l[38,6].strip
|
38
|
+
msg.code = l[44,1].strip
|
39
|
+
elsif !l[0,11].eql?("**TRAILER**")
|
40
|
+
product = RBook::Bisac::Product.from_string(l)
|
41
|
+
msg << product unless product.nil?
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
if msg.company.nil? || msg.san.nil? || msg.batch.nil? || msg.code.nil?
|
47
|
+
return nil
|
48
|
+
else
|
49
|
+
return msg
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# adds a new title to the bisic file. Expects a Rbook::Bisac::Product object.
|
54
|
+
def << (item)
|
55
|
+
unless item.class == RBook::Bisac::Product
|
56
|
+
raise ArgumentError, 'item must be a RBook::Bisac::Product object'
|
57
|
+
end
|
58
|
+
@products << item
|
59
|
+
end
|
60
|
+
|
61
|
+
# converts this bisac file into a string
|
62
|
+
def to_s
|
63
|
+
# File Header
|
64
|
+
content = "**HEADER**"
|
65
|
+
content << Time.now.strftime("%y%m%d")
|
66
|
+
content << @company[0,10].ljust(10)
|
67
|
+
content << @san[0,12].ljust(12)
|
68
|
+
content << @batch[0,6].ljust(6)
|
69
|
+
content << @code[0,1].ljust(1)
|
70
|
+
content << "**PUBSTAT*"
|
71
|
+
content << "040"
|
72
|
+
content << "".ljust(201)
|
73
|
+
content << "\n"
|
74
|
+
|
75
|
+
# File Content
|
76
|
+
counter = 0
|
77
|
+
@products.each do |item|
|
78
|
+
content << item.to_s + "\n"
|
79
|
+
counter = counter + 1
|
80
|
+
end
|
81
|
+
|
82
|
+
# File Footer
|
83
|
+
content << "**TRAILER*"
|
84
|
+
content << Time.now.strftime("%y%m%d")
|
85
|
+
content << @batch[0,6].ljust(6)
|
86
|
+
content << counter.to_s[0,6].ljust(6)
|
87
|
+
content << "**PUBSTAT*"
|
88
|
+
content << "".ljust(221)
|
89
|
+
|
90
|
+
return content
|
91
|
+
end
|
92
|
+
|
93
|
+
# writes the content of this bisac file out to the specified file
|
94
|
+
def write(filename)
|
95
|
+
File.open(filename, "w") { |f| f.puts to_s }
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,176 @@
|
|
1
|
+
module RBook
|
2
|
+
module Bisac
|
3
|
+
|
4
|
+
# Class to represent a single product line in a Bisac File. See
|
5
|
+
# RBook::Bisac for basic usage instructions.
|
6
|
+
class Product
|
7
|
+
|
8
|
+
attr_reader :isbn, :title, :author, :price, :pubdate, :publisher
|
9
|
+
attr_reader :imprint, :volumes, :edition, :binding, :volume, :status
|
10
|
+
|
11
|
+
# Creates a new product object with the requested ISBN. Must be a 10 digit ISBN.
|
12
|
+
def initialize(isbn)
|
13
|
+
raise ArgumentError, 'isbn must 10 chars or less' if isbn.to_s.length > 10
|
14
|
+
|
15
|
+
@isbn = isbn.to_s
|
16
|
+
@title = ""
|
17
|
+
@author = ""
|
18
|
+
@price = ""
|
19
|
+
@pubdate = ""
|
20
|
+
@publisher = ""
|
21
|
+
@imprint = ""
|
22
|
+
@volumes = ""
|
23
|
+
@edition = ""
|
24
|
+
@binding = ""
|
25
|
+
@volume = ""
|
26
|
+
@status = ""
|
27
|
+
end
|
28
|
+
|
29
|
+
# sets the products author. Maximum of 30 chars.
|
30
|
+
def author=(author)
|
31
|
+
@author = author.to_s
|
32
|
+
end
|
33
|
+
|
34
|
+
# sets the products binding. Maximum of 2 chars.
|
35
|
+
def binding=(binding)
|
36
|
+
@binding = binding.to_s
|
37
|
+
end
|
38
|
+
|
39
|
+
# sets the products edition number. Maximum of 3 chars.
|
40
|
+
def edition=(edition)
|
41
|
+
@edition = edition.to_s
|
42
|
+
end
|
43
|
+
|
44
|
+
# takes a single line from a BISAC file and attempts to convert
|
45
|
+
# it to a Product object
|
46
|
+
def self.from_string(s)
|
47
|
+
s = s.to_s
|
48
|
+
return nil if s.length < 259
|
49
|
+
product = self.new(s[0,10])
|
50
|
+
product.title = s[15,30].strip
|
51
|
+
product.author = s[46,30].strip
|
52
|
+
product.price = s[79,7].strip if s[79,7].strip.match(/\A\d{0,7}\Z/)
|
53
|
+
product.pubdate = s[87,6].strip if s[87,6].strip.match(/\A\d{6}\Z/)
|
54
|
+
product.publisher = s[94,10].strip
|
55
|
+
product.imprint = s[105,14].strip
|
56
|
+
product.volumes = s[120,3].strip
|
57
|
+
product.edition = s[124,2].strip
|
58
|
+
product.binding = s[127,2].strip
|
59
|
+
product.volume = s[130,3].strip
|
60
|
+
product.status = s[153,3].strip
|
61
|
+
return product
|
62
|
+
end
|
63
|
+
|
64
|
+
# Sets the products imprint. Maximum of 14 chars.
|
65
|
+
def imprint=(imprint)
|
66
|
+
@imprint = imprint.to_s
|
67
|
+
end
|
68
|
+
|
69
|
+
# Sets the price imprint. Maximum of 7 chars. Must by a whole
|
70
|
+
# number (represent price in cents).
|
71
|
+
def price=(price)
|
72
|
+
unless price.to_s.match(/\A\d{0,7}\Z/)
|
73
|
+
raise ArgumentError, 'price should be a whole number with no more than 7 digits. (price in cents)'
|
74
|
+
end
|
75
|
+
@price = price.to_s
|
76
|
+
end
|
77
|
+
|
78
|
+
# Sets the products pubdate. Must be in the form YYMMDD
|
79
|
+
def pubdate=(pubdate)
|
80
|
+
unless pubdate.to_s.match(/\A\d{6}\Z/)
|
81
|
+
raise ArgumentError, 'pubdate should be a date in the form YYMMDD.'
|
82
|
+
end
|
83
|
+
@pubdate = pubdate.to_s
|
84
|
+
end
|
85
|
+
|
86
|
+
# sets the products publisher. Maximum of 10 chars.
|
87
|
+
def publisher=(publisher)
|
88
|
+
@publisher = publisher.to_s
|
89
|
+
end
|
90
|
+
|
91
|
+
# sets the products status code. Maximum of 3 chars.
|
92
|
+
def status=(status)
|
93
|
+
@status = status.to_s
|
94
|
+
end
|
95
|
+
|
96
|
+
# sets the products title. Maximum of 30 chars.
|
97
|
+
def title=(title)
|
98
|
+
@title = title.to_s
|
99
|
+
end
|
100
|
+
|
101
|
+
# Returns the product as a single line ready for inserting into a BISAC file.
|
102
|
+
# Doesn't have a \n on the end
|
103
|
+
def to_s
|
104
|
+
content = ""
|
105
|
+
content << @isbn[0,10].ljust(10) # 10 digit isbn
|
106
|
+
content << "1"
|
107
|
+
content << "N"
|
108
|
+
content << "N"
|
109
|
+
content << "B"
|
110
|
+
content << "N"
|
111
|
+
content << @title[0,30].ljust(30)
|
112
|
+
content << "N"
|
113
|
+
content << @author[0,30].ljust(30)
|
114
|
+
content << "N"
|
115
|
+
content << "A" # author role
|
116
|
+
content << "N"
|
117
|
+
content << @price[0,7].rjust(7,"0") # current price
|
118
|
+
content << "N"
|
119
|
+
content << @pubdate[0,6].ljust(6) # published date
|
120
|
+
content << "N"
|
121
|
+
content << @publisher[0,10].ljust(10) # publisher
|
122
|
+
content << "N"
|
123
|
+
content << @imprint[0,14].ljust(14) #imprint
|
124
|
+
content << "N"
|
125
|
+
content << @volumes[0,3].rjust(3,"0") # volumes included in this isbn
|
126
|
+
content << "N"
|
127
|
+
content << @edition[0,2].rjust(2,"0") # edition
|
128
|
+
content << "N"
|
129
|
+
content << @binding[0,2].rjust(2,"0") # binding
|
130
|
+
content << "N"
|
131
|
+
content << @volume[0,3].rjust(3,"0") # volume number
|
132
|
+
content << "N"
|
133
|
+
content << "0000000" # new price
|
134
|
+
content << "N"
|
135
|
+
content << "000000" # new price effective date
|
136
|
+
content << "N"
|
137
|
+
content << " " # audience type
|
138
|
+
content << "N"
|
139
|
+
content << @status[0,3].rjust(3) # status
|
140
|
+
content << "N"
|
141
|
+
content << " " # available date. only use for status' like NYP
|
142
|
+
content << "N"
|
143
|
+
content << " " # alternate isbn
|
144
|
+
content << "N"
|
145
|
+
content << "999999" # out of print date. only use for status == OP
|
146
|
+
content << "N"
|
147
|
+
content << " " # geographic restrictions
|
148
|
+
content << "N"
|
149
|
+
content << " " # library of congress catalogue number
|
150
|
+
content << "N"
|
151
|
+
content << "".ljust(40) # series title
|
152
|
+
content << "N"
|
153
|
+
content << "0" # price code for current price
|
154
|
+
content << "N"
|
155
|
+
content << "0" # price code for new price
|
156
|
+
content << "N"
|
157
|
+
content << "0000000" # freight pass through price
|
158
|
+
content << "N"
|
159
|
+
content << "000000" # new freight pass through price
|
160
|
+
content << "00000" # last changed date
|
161
|
+
|
162
|
+
return content
|
163
|
+
end
|
164
|
+
|
165
|
+
# sets the products volume number. Maximum of 3 chars.
|
166
|
+
def volume=(volume)
|
167
|
+
@volume = volume.to_s
|
168
|
+
end
|
169
|
+
|
170
|
+
# sets the number of volumes in the set this product belongs to. Maximum of 3 chars.
|
171
|
+
def volumes=(volumes)
|
172
|
+
@volumes = volumes.to_s
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|