library_stdnums 1.0.2 → 1.1.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.
- data/README.markdown +3 -0
- data/VERSION +1 -1
- data/lib/library_stdnums.rb +82 -79
- data/spec/library_stdnums_spec.rb +42 -34
- metadata +30 -38
data/README.markdown
CHANGED
@@ -63,6 +63,9 @@ LCCNs are normalized according to the algorithm at http://www.loc.gov/marc/lccn-
|
|
63
63
|
````
|
64
64
|
|
65
65
|
## CHANGES
|
66
|
+
* 1.1.0 (2012.02.06)
|
67
|
+
* Changed the ISBN/ISSN regex to make sure string of digits/dashes is at least 6 chars long
|
68
|
+
* Cleaned up LCCN validation code
|
66
69
|
* 1.0.2
|
67
70
|
* Made docs clearer.
|
68
71
|
* 1.0.0
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0
|
1
|
+
1.1.0
|
data/lib/library_stdnums.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
# Static Module functions to work with library "standard numbers" ISSN, ISBN, and LCCN
|
2
2
|
module StdNum
|
3
|
-
|
3
|
+
|
4
4
|
# Helper methods common to ISBN/ISSN
|
5
5
|
module Helpers
|
6
|
-
|
6
|
+
|
7
7
|
# The pattern we use to try and find an ISBN/ISSN. Ditch everthing before the first
|
8
8
|
# digit, then take all the digits/hyphens, optionally followed by an 'X'
|
9
|
-
|
9
|
+
# Since the shortest possible string is 7 digits followed by a checksum digit
|
10
|
+
# for an ISSN, we'll make sure they're at least that long. Still imperfect
|
11
|
+
# (would fine "5------", for example) but should work in most cases.
|
12
|
+
STDNUMPAT = /^.*?(\d[\d\-]{6,}+[xX]?)/
|
10
13
|
|
11
14
|
# Extract the most likely looking number from the string. This will be the first
|
12
15
|
# string of digits-and-hyphens-and-maybe-a-trailing-X, with the hypens removed
|
@@ -17,7 +20,7 @@ module StdNum
|
|
17
20
|
return nil unless match
|
18
21
|
return match[1].gsub(/\-/, '').upcase
|
19
22
|
end
|
20
|
-
|
23
|
+
|
21
24
|
# Given any string, extract what looks like the most likely ISBN/ISSN
|
22
25
|
# of the given size(s), or nil if nothing matches at the correct size.
|
23
26
|
# @param [String] rawnum The raw string containing (hopefully) an ISSN/ISBN
|
@@ -26,29 +29,29 @@ module StdNum
|
|
26
29
|
# @return [String,nil] the reduced and verified number, or nil if there's no match at the right size
|
27
30
|
def reduce_to_basics rawnum, valid_sizes = nil
|
28
31
|
return nil if rawnum.nil?
|
29
|
-
|
32
|
+
|
30
33
|
num = extractNumber rawnum
|
31
|
-
|
34
|
+
|
32
35
|
# Does it even look like a number?
|
33
36
|
return nil unless num
|
34
|
-
|
37
|
+
|
35
38
|
# Return what we've got if we don't care about the size
|
36
39
|
return num unless valid_sizes
|
37
|
-
|
40
|
+
|
38
41
|
# Check for valid size(s)
|
39
42
|
[valid_sizes].flatten.each do |s|
|
40
43
|
return num if num.size == s
|
41
44
|
end
|
42
|
-
|
45
|
+
|
43
46
|
# Didn't check out size-wise. Return nil
|
44
47
|
return nil
|
45
48
|
end
|
46
49
|
end
|
47
|
-
|
50
|
+
|
48
51
|
# Validate, convert, and normalize ISBNs (10-digit or 13-digit)
|
49
52
|
module ISBN
|
50
53
|
extend Helpers
|
51
|
-
|
54
|
+
|
52
55
|
# Compute check digits for 10 or 13-digit ISBNs. See algorithm at
|
53
56
|
# http://en.wikipedia.org/wiki/International_Standard_Book_Number
|
54
57
|
# @param [String] isbn The ISBN (we'll try to clean it up if possible)
|
@@ -79,7 +82,7 @@ module StdNum
|
|
79
82
|
return check.to_s
|
80
83
|
end
|
81
84
|
end
|
82
|
-
|
85
|
+
|
83
86
|
# Check to see if the checkdigit is correct
|
84
87
|
# @param [String] isbn The ISBN (we'll try to clean it up if possible)
|
85
88
|
# @param [Boolean] preprocessed Set to true if the ISBN has already been through reduce_to_basics
|
@@ -91,8 +94,8 @@ module StdNum
|
|
91
94
|
return false unless isbn[-1..-1] == self.checkdigit(isbn, true)
|
92
95
|
return true
|
93
96
|
end
|
94
|
-
|
95
|
-
|
97
|
+
|
98
|
+
|
96
99
|
# For an ISBN normalizing it is the same as converting to ISBN 13
|
97
100
|
# and making sure it's valid
|
98
101
|
# @param [String] isbn The ISBN to normalize
|
@@ -105,8 +108,8 @@ module StdNum
|
|
105
108
|
return nil
|
106
109
|
end
|
107
110
|
end
|
108
|
-
|
109
|
-
# To convert to an ISBN13, throw a '978' on the front and
|
111
|
+
|
112
|
+
# To convert to an ISBN13, throw a '978' on the front and
|
110
113
|
# compute the checkdigit
|
111
114
|
# We leave 13-digit numbers alone, figuring they're already ok. NO CHECKSUM CHECK IS DONE FOR 13-DIGIT ISBNS!
|
112
115
|
# and return nil on anything that's not the right length
|
@@ -130,14 +133,14 @@ module StdNum
|
|
130
133
|
|
131
134
|
# Already 10 digits? Just return
|
132
135
|
return isbn if isbn.size == 10
|
133
|
-
|
136
|
+
|
134
137
|
# Can't be converted to ISBN-10? Bail
|
135
138
|
return nil unless isbn[0..2] == '978'
|
136
|
-
|
139
|
+
|
137
140
|
prefix = isbn[3..11]
|
138
141
|
return prefix + self.checkdigit(prefix + '0')
|
139
142
|
end
|
140
|
-
|
143
|
+
|
141
144
|
# Return an array of the ISBN13 and ISBN10 (in that order) for the passed in value. You'll
|
142
145
|
# only get one value back if it's a 13-digit
|
143
146
|
# ISBN that can't be converted to an ISBN10.
|
@@ -158,19 +161,19 @@ module StdNum
|
|
158
161
|
return [isbn, self.convert_to_10(isbn)].compact
|
159
162
|
end
|
160
163
|
end
|
161
|
-
|
162
|
-
|
164
|
+
|
165
|
+
|
163
166
|
end
|
164
|
-
|
167
|
+
|
165
168
|
# Validate and and normalize ISSNs
|
166
169
|
module ISSN
|
167
170
|
extend Helpers
|
168
|
-
|
171
|
+
|
169
172
|
# Compute the checkdigit of an ISSN
|
170
173
|
# @param [String] issn The ISSN (we'll try to clean it up if possible)
|
171
|
-
# @param [Boolean] preprocessed Set to true if the number has already been through reduce_to_basic
|
174
|
+
# @param [Boolean] preprocessed Set to true if the number has already been through reduce_to_basic
|
172
175
|
# @return [String] the one-character checkdigit
|
173
|
-
|
176
|
+
|
174
177
|
def self.checkdigit issn, preprocessed = false
|
175
178
|
issn = reduce_to_basics issn, 8 unless preprocessed
|
176
179
|
return nil unless issn
|
@@ -178,7 +181,7 @@ module StdNum
|
|
178
181
|
digits = issn[0..6].split(//).map {|i| i.to_i}
|
179
182
|
checkdigit = 0
|
180
183
|
(0..6).each do |i|
|
181
|
-
checkdigit += digits[i] * (8 - i)
|
184
|
+
checkdigit += digits[i] * (8 - i)
|
182
185
|
end
|
183
186
|
checkdigit = checkdigit % 11
|
184
187
|
return '0' if checkdigit == 0
|
@@ -186,10 +189,10 @@ module StdNum
|
|
186
189
|
return 'X' if checkdigit == 10
|
187
190
|
return checkdigit.to_s
|
188
191
|
end
|
189
|
-
|
192
|
+
|
190
193
|
# Check to see if the checkdigit is correct
|
191
194
|
# @param [String] isbn The ISSN (we'll try to clean it up if possible)
|
192
|
-
# @param [Boolean] preprocessed Set to true if the number has already been through reduce_to_basic
|
195
|
+
# @param [Boolean] preprocessed Set to true if the number has already been through reduce_to_basic
|
193
196
|
# @return [Boolean] Whether or not the checkdigit is correct
|
194
197
|
|
195
198
|
def self.valid? issn, preprocessed = false
|
@@ -197,9 +200,9 @@ module StdNum
|
|
197
200
|
return false unless issn
|
198
201
|
return issn[-1..-1] == self.checkdigit(issn, true)
|
199
202
|
end
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
+
|
204
|
+
|
205
|
+
|
203
206
|
# Make sure it's valid, remove the dashes, uppercase the X, and return
|
204
207
|
# @param [String] isbn The ISBN to normalize
|
205
208
|
# @return [String, nil] the normalized (to 13 digit) ISBN, or nil on failure
|
@@ -211,81 +214,81 @@ module StdNum
|
|
211
214
|
return nil
|
212
215
|
end
|
213
216
|
end
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
+
|
218
|
+
|
219
|
+
|
217
220
|
end
|
218
|
-
|
221
|
+
|
219
222
|
# Validate and and normalize LCCNs
|
220
223
|
module LCCN
|
221
|
-
|
224
|
+
|
225
|
+
|
226
|
+
# Get a string ready for processing as an LCCN
|
227
|
+
# @param [String] str The possible lccn
|
228
|
+
# @return [String] The munged string, ready for normalization
|
229
|
+
|
230
|
+
def self.reduce_to_basic str
|
231
|
+
rv = str.gsub(/\s/, '') # ditch spaces
|
232
|
+
rv.gsub!(/\/.*$/, '') # ditch everything after the first '/' (including the slash)
|
233
|
+
return rv
|
234
|
+
end
|
235
|
+
|
236
|
+
# Normalize based on data at http://www.loc.gov/marc/lccn-namespace.html#syntax
|
237
|
+
# @param [String] str The possible LCCN to normalize
|
238
|
+
# @return [String, nil] the normalized LCCN, or nil if it looks malformed
|
239
|
+
def self.normalize rawlccn
|
240
|
+
lccn = reduce_to_basic(rawlccn)
|
241
|
+
# If there's a dash in it, deal with that.
|
242
|
+
if lccn =~ /^(.*?)\-(.+)/
|
243
|
+
pre = $1
|
244
|
+
post = $2
|
245
|
+
return nil unless post =~ /^\d+$/ # must be all digits
|
246
|
+
lccn = "%s%06d" % [pre, post.to_i]
|
247
|
+
end
|
248
|
+
|
249
|
+
if valid?(lccn, true)
|
250
|
+
return lccn
|
251
|
+
else
|
252
|
+
return nil
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
222
256
|
# The rules for validity according to http://www.loc.gov/marc/lccn-namespace.html#syntax:
|
223
257
|
#
|
224
258
|
# A normalized LCCN is a character string eight to twelve characters in length. (For purposes of this description characters are ordered from left to right -- "first" means "leftmost".)
|
225
|
-
# The rightmost eight characters are always digits.
|
259
|
+
# The rightmost eight characters are always digits.
|
226
260
|
# If the length is 9, then the first character must be alphabetic.
|
227
261
|
# If the length is 10, then the first two characters must be either both digits or both alphabetic.
|
228
262
|
# If the length is 11, then the first character must be alphabetic and the next two characters must be either both digits or both alphabetic.
|
229
263
|
# If the length is 12, then the first two characters must be alphabetic and the remaining characters digits.
|
230
264
|
#
|
231
265
|
# @param [String] lccn The lccn to attempt to validate
|
232
|
-
# @param [Boolean] preprocessed Set to true if the number has already been normalized
|
266
|
+
# @param [Boolean] preprocessed Set to true if the number has already been normalized
|
233
267
|
# @return [Boolean] Whether or not the syntax seems ok
|
234
268
|
|
235
|
-
def self.reduce_to_basic str
|
236
|
-
str.gsub!(/\s/, '') # ditch leading spaces
|
237
|
-
str.gsub!(/\/.*$/, '') # ditch everything after the first '/' (including the slash)
|
238
|
-
return str
|
239
|
-
end
|
240
|
-
|
241
|
-
|
242
269
|
def self.valid? lccn, preprocessed = false
|
243
270
|
lccn = normalize(lccn) unless preprocessed
|
244
|
-
return false unless (8..12).include? lccn.size
|
245
271
|
clean = lccn.gsub(/\-/, '')
|
246
|
-
suffix = clean[-8..-1]
|
247
|
-
|
248
|
-
|
249
|
-
case clean.size
|
272
|
+
suffix = clean[-8..-1] # "the rightmost eight characters are always digits"
|
273
|
+
return false unless suffix and suffix =~ /^\d+$/
|
274
|
+
case clean.size # "...is a character string eight to twelve digits in length"
|
250
275
|
when 8
|
251
276
|
return true
|
252
277
|
when 9
|
253
|
-
return true if
|
278
|
+
return true if clean =~ /^[A-Za-z]/
|
254
279
|
when 10
|
255
|
-
return true if
|
280
|
+
return true if clean =~ /^\d{2}/ or clean =~ /^[A-Za-z]{2}/
|
256
281
|
when 11
|
257
|
-
return true if
|
282
|
+
return true if clean =~ /^[A-Za-z](\d{2}|[A-Za-z]{2})/
|
258
283
|
when 12
|
259
|
-
return true if
|
284
|
+
return true if clean =~ /^[A-Za-z]{2}\d{2}/
|
260
285
|
else
|
261
286
|
return false
|
262
287
|
end
|
263
288
|
end
|
264
289
|
|
265
|
-
|
266
|
-
|
267
|
-
# Normalize based on data at http://www.loc.gov/marc/lccn-namespace.html#syntax
|
268
|
-
# @param [String] str The LCCN to normalize
|
269
|
-
# @return [String] the normalized LCCN, or nil if it looks malformed
|
270
|
-
def self.normalize rawlccn
|
271
|
-
lccn = reduce_to_basic(rawlccn)
|
272
|
-
# If there's a dash in it, deal with that.
|
273
|
-
if lccn =~ /^(.*?)\-(.+)/
|
274
|
-
pre = $1
|
275
|
-
post = $2
|
276
|
-
return nil unless post =~ /^\d+$/ # must be all digits
|
277
|
-
lccn = "%s%06d" % [pre, post.to_i]
|
278
|
-
end
|
279
|
-
|
280
|
-
if valid?(lccn, true)
|
281
|
-
return lccn
|
282
|
-
else
|
283
|
-
return nil
|
284
|
-
end
|
285
|
-
end
|
286
|
-
end
|
287
|
-
|
288
|
-
|
290
|
+
end
|
291
|
+
|
289
292
|
end
|
290
|
-
|
293
|
+
|
291
294
|
|
@@ -2,33 +2,41 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe "Extract" do
|
4
4
|
it "should leave a number alone" do
|
5
|
-
StdNum::ISBN.extractNumber('
|
5
|
+
StdNum::ISBN.extractNumber('1234567').must_equal '1234567'
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
it "should skip leading and trailing crap" do
|
9
|
-
StdNum::ISBN.extractNumber('
|
9
|
+
StdNum::ISBN.extractNumber(' 1234567 (online)').must_equal '1234567'
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
it "should allow hyphens" do
|
13
13
|
StdNum::ISBN.extractNumber(' 1-234-5').must_equal '12345'
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
it "should return nil on a non-match" do
|
17
17
|
StdNum::ISBN.extractNumber('bill dueber').must_equal nil
|
18
18
|
end
|
19
|
-
|
20
|
-
it "should allow a trailing X" do
|
19
|
+
|
20
|
+
it "should allow a trailing X" do
|
21
21
|
StdNum::ISBN.extractNumber('1-234-5-X').must_equal '12345X'
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
it "should upcase any trailing X" do
|
25
|
-
StdNum::ISBN.extractNumber('1-234-x').must_equal '
|
25
|
+
StdNum::ISBN.extractNumber('1-234-56-x').must_equal '123456X'
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
it "only allows a single trailing X" do
|
29
|
-
StdNum::ISBN.extractNumber('
|
29
|
+
StdNum::ISBN.extractNumber('123456-X-X').must_equal '123456X'
|
30
|
+
end
|
31
|
+
|
32
|
+
it "doesn't allow numbers that are too short" do
|
33
|
+
StdNum::ISBN.extractNumber('12345').must_equal nil
|
30
34
|
end
|
31
|
-
|
35
|
+
|
36
|
+
it "skips over short prefixing numbers" do
|
37
|
+
StdNum::ISBN.extractNumber('ISBN13: 1234567890123').must_equal '1234567890123'
|
38
|
+
end
|
39
|
+
|
32
40
|
end
|
33
41
|
|
34
42
|
|
@@ -36,63 +44,63 @@ describe "ISBN" do
|
|
36
44
|
it "computes 10-digit checksum" do
|
37
45
|
StdNum::ISBN.checkdigit('0-306-40615-X').must_equal '2'
|
38
46
|
end
|
39
|
-
|
47
|
+
|
40
48
|
it "correctly uses X for checksum" do
|
41
49
|
StdNum::ISBN.checkdigit('061871460X').must_equal 'X'
|
42
50
|
end
|
43
|
-
|
51
|
+
|
44
52
|
it "finds a zero checkdigit" do
|
45
53
|
StdNum::ISBN.checkdigit('0139381430').must_equal '0'
|
46
54
|
end
|
47
|
-
|
55
|
+
|
48
56
|
it "computes 13-digit checksum" do
|
49
57
|
StdNum::ISBN.checkdigit('9780306406157').must_equal '7'
|
50
58
|
end
|
51
|
-
|
59
|
+
|
52
60
|
it "computes a 13-digit checksum that is 0" do
|
53
61
|
StdNum::ISBN.checkdigit('9783837612950').must_equal '0'
|
54
62
|
end
|
55
|
-
|
63
|
+
|
56
64
|
it "finds a good number valid" do
|
57
65
|
StdNum::ISBN.valid?('9780306406157').must_equal true
|
58
66
|
end
|
59
|
-
|
67
|
+
|
60
68
|
it "finds a bad number invalid" do
|
61
69
|
StdNum::ISBN.valid?('9780306406154').must_equal false
|
62
70
|
end
|
63
|
-
|
71
|
+
|
64
72
|
it "returns nil when computing checksum for bad ISBN" do
|
65
73
|
StdNum::ISBN.checkdigit('12345').must_equal nil
|
66
74
|
end
|
67
|
-
|
75
|
+
|
68
76
|
it "converts 10 to 13" do
|
69
77
|
StdNum::ISBN.convert_to_13('0-306-40615-2').must_equal '9780306406157'
|
70
78
|
end
|
71
|
-
|
79
|
+
|
72
80
|
it "passes through 13 digit number instead of converting to 13" do
|
73
81
|
StdNum::ISBN.convert_to_13('9780306406157').must_equal '9780306406157'
|
74
82
|
end
|
75
|
-
|
76
|
-
it "converts 13 to 10" do
|
83
|
+
|
84
|
+
it "converts 13 to 10" do
|
77
85
|
StdNum::ISBN.convert_to_10('978-0-306-40615-7').must_equal '0306406152'
|
78
86
|
end
|
79
|
-
|
87
|
+
|
80
88
|
it "gets both normalized values" do
|
81
89
|
a = StdNum::ISBN.allNormalizedValues('978-0-306-40615-7')
|
82
90
|
a.sort.must_equal ['9780306406157', '0306406152' ].sort
|
83
91
|
end
|
84
|
-
|
85
|
-
|
86
|
-
|
92
|
+
|
93
|
+
|
94
|
+
|
87
95
|
end
|
88
96
|
|
89
97
|
|
90
98
|
|
91
99
|
describe 'ISSN' do
|
92
|
-
it "computes checksum" do
|
100
|
+
it "computes checksum" do
|
93
101
|
StdNum::ISSN.checkdigit('0378-5955').must_equal '5'
|
94
102
|
end
|
95
|
-
|
103
|
+
|
96
104
|
it "normalizes" do
|
97
105
|
StdNum::ISSN.normalize('0378-5955').must_equal '03785955'
|
98
106
|
end
|
@@ -100,7 +108,7 @@ end
|
|
100
108
|
|
101
109
|
|
102
110
|
describe 'LCCN' do
|
103
|
-
|
111
|
+
|
104
112
|
# Tests take from http://www.loc.gov/marc/lccn-namespace.html#syntax
|
105
113
|
test = {
|
106
114
|
"n78-890351" => "n78890351",
|
@@ -110,14 +118,14 @@ describe 'LCCN' do
|
|
110
118
|
"85-2 " => "85000002",
|
111
119
|
"2001-000002" => "2001000002",
|
112
120
|
"75-425165//r75" => "75425165",
|
113
|
-
" 79139101 /AC/r932" => "79139101",
|
121
|
+
" 79139101 /AC/r932" => "79139101",
|
114
122
|
}
|
115
|
-
|
123
|
+
|
116
124
|
test.each do |k, v|
|
117
125
|
it "normalizes #{k}" do
|
118
126
|
StdNum::LCCN.normalize(k.dup).must_equal v
|
119
127
|
end
|
120
128
|
end
|
121
|
-
|
122
|
-
|
129
|
+
|
130
|
+
|
123
131
|
end
|
metadata
CHANGED
@@ -1,39 +1,36 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: library_stdnums
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.1.0
|
4
5
|
prerelease:
|
5
|
-
version: 1.0.2
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Bill Dueber
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-02-16 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
17
15
|
name: yard
|
18
|
-
|
19
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2153722800 !ruby/object:Gem::Requirement
|
20
17
|
none: false
|
21
|
-
requirements:
|
22
|
-
- -
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version:
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
25
22
|
type: :development
|
26
|
-
|
27
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2153722800
|
25
|
+
description: Normalization and checksum computation for ISBN (10 and 13), ISSN, and
|
26
|
+
LCCN
|
28
27
|
email: bill@dueber.com
|
29
28
|
executables: []
|
30
|
-
|
31
29
|
extensions: []
|
32
|
-
|
33
|
-
extra_rdoc_files:
|
30
|
+
extra_rdoc_files:
|
34
31
|
- LICENSE
|
35
32
|
- README.markdown
|
36
|
-
files:
|
33
|
+
files:
|
37
34
|
- .document
|
38
35
|
- LICENSE
|
39
36
|
- README.markdown
|
@@ -42,33 +39,28 @@ files:
|
|
42
39
|
- lib/library_stdnums.rb
|
43
40
|
- spec/library_stdnums_spec.rb
|
44
41
|
- spec/spec_helper.rb
|
45
|
-
has_rdoc: true
|
46
42
|
homepage: http://github.com/billdueber/library_stdnums
|
47
43
|
licenses: []
|
48
|
-
|
49
44
|
post_install_message:
|
50
45
|
rdoc_options: []
|
51
|
-
|
52
|
-
require_paths:
|
46
|
+
require_paths:
|
53
47
|
- lib
|
54
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
49
|
none: false
|
56
|
-
requirements:
|
57
|
-
- -
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version:
|
60
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
55
|
none: false
|
62
|
-
requirements:
|
63
|
-
- -
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
version:
|
56
|
+
requirements:
|
57
|
+
- - ! '>='
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
66
60
|
requirements: []
|
67
|
-
|
68
61
|
rubyforge_project:
|
69
|
-
rubygems_version: 1.
|
62
|
+
rubygems_version: 1.8.15
|
70
63
|
signing_key:
|
71
64
|
specification_version: 3
|
72
65
|
summary: Normalize and compute checkdigits for ISBN, ISSN, and LCCN
|
73
66
|
test_files: []
|
74
|
-
|