library_stdnums 1.4.1 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +13 -7
- data/ChangeLog.md +2 -0
- data/Rakefile +1 -22
- data/lib/library_stdnums.rb +30 -7
- data/lib/library_stdnums/version.rb +1 -1
- data/library_stdnums.gemspec +3 -3
- data/spec/library_stdnums_spec.rb +28 -10
- data/spec/spec_helper.rb +16 -2
- metadata +24 -41
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6e0b3b13d325d0819bac0d053fc76b394e7d5086
|
4
|
+
data.tar.gz: a858dc5935fd3ac806b5dd76d0f6539af1942af7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bf93f42ec0da3a9cd1d055e6fe3c734811631b0624c92598bed9ea63203a0e9ecce14de18a97e2dc40a5435b6d9a72391114c23a6646e9e36f55647e37ebeb2f
|
7
|
+
data.tar.gz: 7accbad483c800551e25a2d40be93c7926151aa5dbb72d5568bc0fda2898ae8c9d08cc9ae1de8630629c26fe4be9939153476e1e858451280b75a51b23aff290
|
data/.travis.yml
CHANGED
@@ -1,10 +1,16 @@
|
|
1
1
|
language: ruby
|
2
|
-
|
2
|
+
cache: bundler
|
3
|
+
sudo: false
|
3
4
|
rvm:
|
4
|
-
- 1.8.7
|
5
|
-
- 1.9.2
|
6
|
-
- 1.9.3
|
7
5
|
- jruby-19mode
|
8
|
-
-
|
9
|
-
-
|
10
|
-
-
|
6
|
+
- jruby-9.0.4.0
|
7
|
+
- 1.9
|
8
|
+
- 2.2
|
9
|
+
- 2.3.3
|
10
|
+
- 2.4.0
|
11
|
+
before_install:
|
12
|
+
- gem update --system
|
13
|
+
- gem uninstall bundler
|
14
|
+
- gem update bundler
|
15
|
+
jdk:
|
16
|
+
- oraclejdk8
|
data/ChangeLog.md
CHANGED
data/Rakefile
CHANGED
@@ -1,25 +1,4 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
|
5
|
-
begin
|
6
|
-
require 'bundler'
|
7
|
-
rescue LoadError => e
|
8
|
-
warn e.message
|
9
|
-
warn "Run `gem install bundler` to install Bundler."
|
10
|
-
exit e.status_code
|
11
|
-
end
|
12
|
-
|
13
|
-
begin
|
14
|
-
Bundler.setup(:development)
|
15
|
-
rescue Bundler::BundlerError => e
|
16
|
-
warn e.message
|
17
|
-
warn "Run `bundle install` to install missing gems."
|
18
|
-
exit e.status_code
|
19
|
-
end
|
20
|
-
|
21
|
-
require 'rake'
|
22
|
-
|
23
2
|
require "bundler/gem_tasks"
|
24
3
|
|
25
4
|
require 'yard'
|
@@ -34,4 +13,4 @@ Rake::TestTask.new do |test|
|
|
34
13
|
end
|
35
14
|
|
36
15
|
task :default => :test
|
37
|
-
task :spec => :test
|
16
|
+
task :spec => :test
|
data/lib/library_stdnums.rb
CHANGED
@@ -21,6 +21,18 @@ module StdNum
|
|
21
21
|
return (match[1].gsub(/\-/, '')).upcase
|
22
22
|
end
|
23
23
|
|
24
|
+
# Same as STDNUMPAT but allowing for all numbers in the provided string
|
25
|
+
STDNUMPAT_MULTIPLE = /.*?(\d[\d\-]{6,}[xX]?)/
|
26
|
+
|
27
|
+
# Extract the most likely looking numbers from the string. This will be each
|
28
|
+
# string with digits-and-hyphens-and-maybe-a-trailing-X, with the hypens removed
|
29
|
+
# @param [String] str The string from which to extract the ISBN/ISSNs
|
30
|
+
# @return [Array] An array of extracted identifiers
|
31
|
+
def extract_multiple_numbers(str)
|
32
|
+
return [] if str == '' || str.nil?
|
33
|
+
str.scan(STDNUMPAT_MULTIPLE).flatten.map{ |i| i.gsub(/\-/, '').upcase }
|
34
|
+
end
|
35
|
+
|
24
36
|
# Given any string, extract what looks like the most likely ISBN/ISSN
|
25
37
|
# of the given size(s), or nil if nothing matches at the correct size.
|
26
38
|
# @param [String] rawnum The raw string containing (hopefully) an ISSN/ISBN
|
@@ -51,12 +63,15 @@ module StdNum
|
|
51
63
|
# Validate, convert, and normalize ISBNs (10-digit or 13-digit)
|
52
64
|
module ISBN
|
53
65
|
extend Helpers
|
54
|
-
|
66
|
+
|
67
|
+
TEN_TO_THIRTEEN_PREFIX = '978'.freeze
|
68
|
+
VALID_THIRTEEN_PREFIX = /\A97[89]/
|
69
|
+
|
55
70
|
# Does it even look like an ISBN?
|
56
71
|
def self.at_least_trying? isbn
|
57
72
|
reduce_to_basics(isbn, [10,13]) ? true : false
|
58
73
|
end
|
59
|
-
|
74
|
+
|
60
75
|
|
61
76
|
# Compute check digits for 10 or 13-digit ISBNs. See algorithm at
|
62
77
|
# http://en.wikipedia.org/wiki/International_Standard_Book_Number
|
@@ -92,7 +107,7 @@ module StdNum
|
|
92
107
|
# Check to see if the checkdigit is correct
|
93
108
|
# @param [String] isbn The ISBN (we'll try to clean it up if possible)
|
94
109
|
# @param [Boolean] preprocessed Set to true if the ISBN has already been through reduce_to_basics
|
95
|
-
# @return [Boolean] Whether or not the checkdigit is correct. Sneakily, return 'nil' for
|
110
|
+
# @return [Boolean] Whether or not the checkdigit is correct. Sneakily, return 'nil' for
|
96
111
|
# values that don't even look like ISBNs, and 'false' for those that look possible but
|
97
112
|
# don't normalize / have bad checkdigits
|
98
113
|
def self.valid? isbn, preprocessed = false
|
@@ -100,6 +115,7 @@ module StdNum
|
|
100
115
|
isbn = reduce_to_basics(isbn, [10,13]) unless preprocessed
|
101
116
|
return nil unless isbn
|
102
117
|
return false unless isbn[-1..-1] == self.checkdigit(isbn, true)
|
118
|
+
return false unless isbn.size == 10 || valid_isbn13_prefix?(isbn)
|
103
119
|
return true
|
104
120
|
end
|
105
121
|
|
@@ -129,7 +145,7 @@ module StdNum
|
|
129
145
|
return nil unless isbn
|
130
146
|
return nil unless valid?(isbn, true)
|
131
147
|
return isbn if isbn.size == 13
|
132
|
-
prefix =
|
148
|
+
prefix = TEN_TO_THIRTEEN_PREFIX + isbn[0..8]
|
133
149
|
return prefix + self.checkdigit(prefix + '0', true)
|
134
150
|
end
|
135
151
|
|
@@ -145,7 +161,7 @@ module StdNum
|
|
145
161
|
return isbn if isbn.size == 10
|
146
162
|
|
147
163
|
# Can't be converted to ISBN-10? Bail
|
148
|
-
return nil unless isbn[0..2] ==
|
164
|
+
return nil unless isbn[0..2] == TEN_TO_THIRTEEN_PREFIX
|
149
165
|
|
150
166
|
prefix = isbn[3..11]
|
151
167
|
return prefix + self.checkdigit(prefix + '0')
|
@@ -172,7 +188,14 @@ module StdNum
|
|
172
188
|
end
|
173
189
|
end
|
174
190
|
|
175
|
-
|
191
|
+
# Checks for a valid ISBN13 prefix
|
192
|
+
# ISBN13 always starts with 978 or 979. For example: 1000000000012 has a valid check digit, but
|
193
|
+
# is not a valid ISBN13.
|
194
|
+
# @param [String] isbn13 The ISBN13 to be checked.
|
195
|
+
# @return [Boolean] If true then the prefix is valid
|
196
|
+
def self.valid_isbn13_prefix?(isbn13)
|
197
|
+
isbn13.size == 13 and !!VALID_THIRTEEN_PREFIX.match(isbn13)
|
198
|
+
end
|
176
199
|
end
|
177
200
|
|
178
201
|
# Validate and and normalize ISSNs
|
@@ -210,7 +233,7 @@ module StdNum
|
|
210
233
|
# Check to see if the checkdigit is correct
|
211
234
|
# @param [String] issn The ISSN (we'll try to clean it up if possible)
|
212
235
|
# @param [Boolean] preprocessed Set to true if the number has already been through reduce_to_basic
|
213
|
-
# @return [Boolean] Whether or not the checkdigit is correct. Sneakily, return 'nil' for
|
236
|
+
# @return [Boolean] Whether or not the checkdigit is correct. Sneakily, return 'nil' for
|
214
237
|
# values that don't even look like ISBNs, and 'false' for those that look possible but
|
215
238
|
# don't normalize / have bad checkdigits
|
216
239
|
|
data/library_stdnums.gemspec
CHANGED
@@ -21,9 +21,9 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.extra_rdoc_files = spec.files.grep(%r{^doc/})
|
22
22
|
|
23
23
|
spec.add_development_dependency "bundler", "~> 1.3"
|
24
|
-
spec.add_development_dependency "rake"
|
25
|
-
spec.add_development_dependency "minitest"
|
26
|
-
spec.add_development_dependency "yard"
|
24
|
+
spec.add_development_dependency "rake", "~>11.0"
|
25
|
+
spec.add_development_dependency "minitest", "~> 5.0"
|
26
|
+
spec.add_development_dependency "yard", ">= 0.9.5"
|
27
27
|
end
|
28
28
|
|
29
29
|
|
@@ -14,7 +14,7 @@ describe "Extract" do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should return nil on a non-match" do
|
17
|
-
StdNum::ISBN.extractNumber('bill dueber').
|
17
|
+
StdNum::ISBN.extractNumber('bill dueber').must_be_nil
|
18
18
|
end
|
19
19
|
|
20
20
|
it "should allow a trailing X" do
|
@@ -30,9 +30,25 @@ describe "Extract" do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
it "doesn't allow numbers that are too short" do
|
33
|
-
StdNum::ISBN.extractNumber('12345').
|
33
|
+
StdNum::ISBN.extractNumber('12345').must_be_nil
|
34
34
|
end
|
35
35
|
|
36
|
+
let(:identifiers_string) { '9780987115423 (print ed) 9780987115430 (web ed)' }
|
37
|
+
it "will extract multiple identifiers" do
|
38
|
+
StdNum::ISBN.extract_multiple_numbers(identifiers_string).must_be_kind_of Array
|
39
|
+
StdNum::ISBN.extract_multiple_numbers(identifiers_string).count.must_equal 2
|
40
|
+
StdNum::ISBN.extract_multiple_numbers(identifiers_string)[0].must_equal '9780987115423'
|
41
|
+
StdNum::ISBN.extract_multiple_numbers(identifiers_string)[1].must_equal '9780987115430'
|
42
|
+
end
|
43
|
+
|
44
|
+
let(:string_with_no_identifiers) { 'This has no identifiers' }
|
45
|
+
it "will return an empty array when no identifiers are in the supplied string " do
|
46
|
+
StdNum::ISBN.extract_multiple_numbers(string_with_no_identifiers).must_be_kind_of Array
|
47
|
+
StdNum::ISBN.extract_multiple_numbers(string_with_no_identifiers).count.must_equal 0
|
48
|
+
|
49
|
+
StdNum::ISBN.extract_multiple_numbers('').must_be_kind_of Array
|
50
|
+
StdNum::ISBN.extract_multiple_numbers('').count.must_equal 0
|
51
|
+
end
|
36
52
|
it "skips over short prefixing numbers" do
|
37
53
|
StdNum::ISBN.extractNumber('ISBN13: 1234567890123').must_equal '1234567890123'
|
38
54
|
end
|
@@ -64,25 +80,25 @@ describe "ISBN" do
|
|
64
80
|
it "finds a good number valid" do
|
65
81
|
StdNum::ISBN.valid?('9780306406157').must_equal true
|
66
82
|
end
|
67
|
-
|
83
|
+
|
68
84
|
it "says a good number is trying" do
|
69
85
|
StdNum::ISBN.at_least_trying?('9780306406157').must_equal true
|
70
86
|
end
|
71
|
-
|
87
|
+
|
72
88
|
it "says bad data is not trying" do
|
73
89
|
StdNum::ISBN.at_least_trying?('978006406157').must_equal false
|
74
90
|
StdNum::ISBN.at_least_trying?('406157').must_equal false
|
75
91
|
StdNum::ISBN.at_least_trying?('$22').must_equal false
|
76
92
|
StdNum::ISBN.at_least_trying?('hello').must_equal false
|
77
93
|
end
|
78
|
-
|
94
|
+
|
79
95
|
|
80
96
|
it "finds a bad number invalid" do
|
81
97
|
StdNum::ISBN.valid?('9780306406154').must_equal false
|
82
98
|
end
|
83
99
|
|
84
100
|
it "returns nil when computing checksum for bad ISBN" do
|
85
|
-
StdNum::ISBN.checkdigit('12345').
|
101
|
+
StdNum::ISBN.checkdigit('12345').must_be_nil
|
86
102
|
end
|
87
103
|
|
88
104
|
it "converts 10 to 13" do
|
@@ -99,9 +115,9 @@ describe "ISBN" do
|
|
99
115
|
|
100
116
|
it "normalizes" do
|
101
117
|
StdNum::ISBN.normalize('0-306-40615-2').must_equal '9780306406157'
|
102
|
-
StdNum::ISBN.normalize('0-306-40615-X').
|
118
|
+
StdNum::ISBN.normalize('0-306-40615-X').must_be_nil
|
103
119
|
StdNum::ISBN.normalize('ISBN: 978-0-306-40615-7').must_equal '9780306406157'
|
104
|
-
StdNum::ISBN.normalize('ISBN: 978-0-306-40615-3').
|
120
|
+
StdNum::ISBN.normalize('ISBN: 978-0-306-40615-3').must_be_nil
|
105
121
|
end
|
106
122
|
|
107
123
|
it "gets both normalized values" do
|
@@ -112,7 +128,10 @@ describe "ISBN" do
|
|
112
128
|
a.sort.must_equal ['9780306406157', '0306406152' ].sort
|
113
129
|
end
|
114
130
|
|
115
|
-
|
131
|
+
it "identifies an invalid ISBN13 due to the prefix" do
|
132
|
+
StdNum::ISBN.valid_isbn13_prefix?('9780000000002').must_equal true
|
133
|
+
StdNum::ISBN.valid?('1000000000012').must_equal false
|
134
|
+
end
|
116
135
|
|
117
136
|
end
|
118
137
|
|
@@ -451,7 +470,6 @@ describe "LCCN tests from Business::LCCN perl module" do
|
|
451
470
|
:serial => '001234',
|
452
471
|
:prefix => 'a',
|
453
472
|
:year_cataloged => 1989,
|
454
|
-
:serial => '001234',
|
455
473
|
},
|
456
474
|
{ :orig => 'http://lccn.loc.gov/ab89001234',
|
457
475
|
:canonical => 'ab 89001234 ',
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,19 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# minitest has a circular reference somewhere
|
2
|
+
# drives me crazy
|
3
|
+
def silence_warnings(&block)
|
4
|
+
warn_level = $VERBOSE
|
5
|
+
$VERBOSE = nil
|
6
|
+
result = block.call
|
7
|
+
$VERBOSE = warn_level
|
8
|
+
result
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
silence_warnings do
|
13
|
+
require 'minitest/spec'
|
14
|
+
require 'minitest/autorun'
|
15
|
+
end
|
16
|
+
|
3
17
|
|
4
18
|
require 'library_stdnums'
|
5
19
|
|
metadata
CHANGED
@@ -1,80 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: library_stdnums
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.6.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Bill Dueber
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2017-05-04 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: bundler
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- - ~>
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '1.3'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- - ~>
|
24
|
+
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '1.3'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version: '0'
|
33
|
+
version: '11.0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - "~>"
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version: '0'
|
40
|
+
version: '11.0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: minitest
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - "~>"
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version: '0'
|
47
|
+
version: '5.0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - "~>"
|
60
53
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
54
|
+
version: '5.0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: yard
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - ">="
|
68
60
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
61
|
+
version: 0.9.5
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - ">="
|
76
67
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
68
|
+
version: 0.9.5
|
78
69
|
description:
|
79
70
|
email:
|
80
71
|
- none@nowhere.org
|
@@ -82,9 +73,9 @@ executables: []
|
|
82
73
|
extensions: []
|
83
74
|
extra_rdoc_files: []
|
84
75
|
files:
|
85
|
-
- .gitignore
|
86
|
-
- .travis.yml
|
87
|
-
- .yardopts
|
76
|
+
- ".gitignore"
|
77
|
+
- ".travis.yml"
|
78
|
+
- ".yardopts"
|
88
79
|
- ChangeLog.md
|
89
80
|
- Gemfile
|
90
81
|
- LICENSE.txt
|
@@ -98,36 +89,28 @@ files:
|
|
98
89
|
homepage: https://github.com/billdueber/library_stdnums
|
99
90
|
licenses:
|
100
91
|
- MIT
|
92
|
+
metadata: {}
|
101
93
|
post_install_message:
|
102
94
|
rdoc_options: []
|
103
95
|
require_paths:
|
104
96
|
- lib
|
105
97
|
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
98
|
requirements:
|
108
|
-
- -
|
99
|
+
- - ">="
|
109
100
|
- !ruby/object:Gem::Version
|
110
101
|
version: '0'
|
111
|
-
segments:
|
112
|
-
- 0
|
113
|
-
hash: -3816894525355175923
|
114
102
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
|
-
none: false
|
116
103
|
requirements:
|
117
|
-
- -
|
104
|
+
- - ">="
|
118
105
|
- !ruby/object:Gem::Version
|
119
106
|
version: '0'
|
120
|
-
segments:
|
121
|
-
- 0
|
122
|
-
hash: -3816894525355175923
|
123
107
|
requirements: []
|
124
108
|
rubyforge_project:
|
125
|
-
rubygems_version:
|
109
|
+
rubygems_version: 2.6.8
|
126
110
|
signing_key:
|
127
|
-
specification_version:
|
111
|
+
specification_version: 4
|
128
112
|
summary: A simple set of module functions to normalize, validate, and convert common
|
129
113
|
library standard numbers
|
130
114
|
test_files:
|
131
115
|
- spec/library_stdnums_spec.rb
|
132
116
|
- spec/spec_helper.rb
|
133
|
-
has_rdoc:
|