IsbnUtils 0.0.0 → 0.0.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.
- data/lib/Isbn10DigitValidator.rb +31 -0
- data/lib/Isbn10To13DigitConverter.rb +56 -0
- data/lib/Isbn13DigitValidator.rb +28 -0
- data/lib/Isbn13To10DigitConverter.rb +44 -0
- data/lib/IsbnConverter.rb +22 -0
- data/lib/IsbnValidator.rb +19 -0
- data/lib/IsbnValidatorFactory.rb +27 -0
- metadata +16 -9
- data/lib/IsbnUtils.rb +0 -77
@@ -0,0 +1,31 @@
|
|
1
|
+
require './IsbnValidator'
|
2
|
+
class Isbn10DigitValidator < IsbnValidator
|
3
|
+
|
4
|
+
def initialize(isbn10)
|
5
|
+
@isbn = isbn10
|
6
|
+
end
|
7
|
+
|
8
|
+
def checkDigit
|
9
|
+
@strippedIsbn = @isbn.gsub(/[^0-9a-z]/i,'')
|
10
|
+
if @strippedIsbn.length != 10
|
11
|
+
raise "error not an isbn"
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
def validateIsbn
|
18
|
+
a = 0
|
19
|
+
for i in 0..9
|
20
|
+
if (@strippedIsbn[i] == "X" || @strippedIsbn[i] == "x")
|
21
|
+
a += 10 *(10-i)
|
22
|
+
elsif @strippedIsbn[i].match(/^(\d)+$/)
|
23
|
+
a += @strippedIsbn[i].to_i * (10-i)
|
24
|
+
else
|
25
|
+
return false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
return ( a%11 == 0 )
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require './Isbn13To10DigitConverter'
|
2
|
+
|
3
|
+
class Isbn10To13DigitConverter
|
4
|
+
|
5
|
+
def initialize(isbn)
|
6
|
+
@isbn = isbn
|
7
|
+
end
|
8
|
+
|
9
|
+
def set13To10DigitConverter(isbn13To10Converter)
|
10
|
+
@isbn13To10Converter = isbn13To10Converter
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def process
|
15
|
+
|
16
|
+
@strippedIsbn = @isbn.gsub(/[^0-9a-z]/i,'')
|
17
|
+
|
18
|
+
if( @strippedIsbn.length() == 10 )
|
19
|
+
return convert(@strippedIsbn)
|
20
|
+
else (@strippedIsbn.length() == 13 )
|
21
|
+
@isbn13To10Converter.process
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
def convert (isbn10)
|
28
|
+
isbn10ToIsbn13(isbn10)
|
29
|
+
end
|
30
|
+
|
31
|
+
# The method to convert an 10 digit ISBN to 13 digit
|
32
|
+
# The method takes a 10 digit isbn and append "978" to the first 9 characters of the isbn and generate the 13 digit
|
33
|
+
|
34
|
+
def isbn10ToIsbn13(isbn10)
|
35
|
+
|
36
|
+
if isbn10.length() !=10
|
37
|
+
raise "The argument length should be 10"
|
38
|
+
end
|
39
|
+
|
40
|
+
isbn13 = "978" + isbn10.chomp("-");
|
41
|
+
return isbn13.slice(0, isbn13.length()-1) + getIsbn13CheckSum(isbn13).to_s;
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
def getIsbn13CheckSum(isbn13)
|
46
|
+
sum = 0
|
47
|
+
isbnFactorPattern = [1,3,1,3,1,3,1,3,1,3,1,3]
|
48
|
+
for i in 0..11
|
49
|
+
sum = sum + isbnFactorPattern[i] * isbn13[i].to_i
|
50
|
+
end
|
51
|
+
value = sum % 10
|
52
|
+
lastDigitIsbn = 10 - value
|
53
|
+
return lastDigitIsbn
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require './IsbnValidator'
|
2
|
+
|
3
|
+
class Isbn13DigitValidator < IsbnValidator
|
4
|
+
|
5
|
+
def initialize(isbn13)
|
6
|
+
@isbn = isbn13
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
def isIsbn13Valid
|
11
|
+
check = 0
|
12
|
+
i = 0
|
13
|
+
while i < 12 do
|
14
|
+
check = check + @isbn[i].to_i
|
15
|
+
i = i + 2
|
16
|
+
end
|
17
|
+
|
18
|
+
i = 1
|
19
|
+
while i < 12 do
|
20
|
+
check = check + 3* @isbn[i].to_i
|
21
|
+
i = i + 2
|
22
|
+
end
|
23
|
+
check = check + @isbn[12].to_i
|
24
|
+
return check % 10 == 0;
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require './Isbn10To13DigitConverter'
|
2
|
+
|
3
|
+
class Isbn13To10DigitConverter
|
4
|
+
|
5
|
+
def initialize(isbn)
|
6
|
+
@isbn = isbn
|
7
|
+
end
|
8
|
+
|
9
|
+
def set10To13DigitConverter(isbn10To13Converter)
|
10
|
+
@isbn10To13Converter = isbn10To13Converter
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def process
|
15
|
+
@strippedIsbn = @isbn.gsub(/[^0-9a-z]/i,'')
|
16
|
+
if( @strippedIsbn.length() == 13 )
|
17
|
+
return convert(@strippedIsbn)
|
18
|
+
else (@strippedIsbn.length() == 10 )
|
19
|
+
@isbn10To13Converter.process
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def convert(isbn13)
|
25
|
+
isbn10 = isbn13[3,9]
|
26
|
+
checksum = 0
|
27
|
+
weight = 10
|
28
|
+
isbn10.each_char do |c|
|
29
|
+
checksum += (c.to_i * weight)
|
30
|
+
weight -= 1
|
31
|
+
end
|
32
|
+
checksum = 11-(checksum % 11)
|
33
|
+
if (checksum == 10)
|
34
|
+
isbn10 += "X"
|
35
|
+
elsif (checksum == 11)
|
36
|
+
isbn10 += "0"
|
37
|
+
else
|
38
|
+
isbn10 += checksum.to_s
|
39
|
+
end
|
40
|
+
isbn10
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require './Isbn13To10DigitConverter'
|
2
|
+
require './Isbn10To13DigitConverter'
|
3
|
+
|
4
|
+
#
|
5
|
+
# The IsbnConverter class has a toggle method that returns 13 digit isbn if 10 digit is input
|
6
|
+
# and vice versa
|
7
|
+
# IsbnConverter.toggle("1402894627") returns "9781402894626"
|
8
|
+
# IsbnConverter.toggle("9781402894626") returns "1402894627"
|
9
|
+
# This Class uses the concept of Chain of Responsibility.
|
10
|
+
#
|
11
|
+
class IsbnConverter
|
12
|
+
|
13
|
+
def self.toggle(isbn)
|
14
|
+
isbn10To13Converter = Isbn10To13DigitConverter.new(isbn)
|
15
|
+
isbn13To10Converter = Isbn13To10DigitConverter.new(isbn)
|
16
|
+
isbn10To13Converter.set13To10DigitConverter(isbn13To10Converter)
|
17
|
+
isbn13To10Converter.set10To13DigitConverter(isbn10To13Converter)
|
18
|
+
return isbn10To13Converter.process()
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# The IsbnValidator class defines a template method called validate , which represent
|
3
|
+
# a workflow to follow. The validate method calls checkDigit and validateIsbn methods
|
4
|
+
# which have its custom implementation in the subclasses.
|
5
|
+
#
|
6
|
+
|
7
|
+
class IsbnValidator
|
8
|
+
|
9
|
+
METHOD_MISSING = "IsbnConverter SYSTEM ERROR: method missing"
|
10
|
+
def checkDigit; raise METHOD_MISSING; end
|
11
|
+
def validateIsbn; raise METHOD_MISSING; end
|
12
|
+
|
13
|
+
def validate
|
14
|
+
checkDigit()
|
15
|
+
result = validateIsbn()
|
16
|
+
return result
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require './IsbnValidator'
|
2
|
+
require './Isbn10DigitValidator'
|
3
|
+
require './Isbn13DigitValidator'
|
4
|
+
|
5
|
+
#
|
6
|
+
# The IsbnValidatorFactory is a validator factory class that returns either an object of Isbn10DigitValidator or Isbn13DigitValidator
|
7
|
+
#
|
8
|
+
|
9
|
+
class IsbnValidatorFactory
|
10
|
+
|
11
|
+
def self.getIsbnValidator(isbn)
|
12
|
+
|
13
|
+
strippedIsbn = isbn.gsub(/[^0-9a-z]/i,'')
|
14
|
+
|
15
|
+
if strippedIsbn.length == 10
|
16
|
+
return Isbn10DigitValidator.new(strippedIsbn)
|
17
|
+
elsif strippedIsbn.length == 14
|
18
|
+
return Isbn13DigitValidator.new(strippedIsbn)
|
19
|
+
else
|
20
|
+
raise "error Invalid Isbn"
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
|
metadata
CHANGED
@@ -1,25 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: IsbnUtils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.0
|
4
|
+
version: 0.0.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
|
-
-
|
8
|
+
- PrasanthMP
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-12-15 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
|
-
description:
|
15
|
-
email: prasanthmp500@
|
14
|
+
description: Gem Utilities for ISBN validation and Isbn Conversion
|
15
|
+
email: prasanthmp500@gmail.com
|
16
16
|
executables: []
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
-
- lib/
|
21
|
-
|
22
|
-
|
20
|
+
- lib/Isbn10DigitValidator.rb
|
21
|
+
- lib/Isbn10To13DigitConverter.rb
|
22
|
+
- lib/Isbn13DigitValidator.rb
|
23
|
+
- lib/Isbn13To10DigitConverter.rb
|
24
|
+
- lib/IsbnConverter.rb
|
25
|
+
- lib/IsbnValidator.rb
|
26
|
+
- lib/IsbnValidatorFactory.rb
|
27
|
+
homepage: http://rubygems.org/gems
|
28
|
+
licenses:
|
29
|
+
- NCIRL
|
23
30
|
post_install_message:
|
24
31
|
rdoc_options: []
|
25
32
|
require_paths:
|
@@ -41,5 +48,5 @@ rubyforge_project:
|
|
41
48
|
rubygems_version: 1.8.24
|
42
49
|
signing_key:
|
43
50
|
specification_version: 3
|
44
|
-
summary:
|
51
|
+
summary: The Gemfile containing Utilities for ISBN
|
45
52
|
test_files: []
|
data/lib/IsbnUtils.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
class IsbnUtils
|
2
|
-
|
3
|
-
|
4
|
-
def self.isIsbnValid(isbn)
|
5
|
-
|
6
|
-
if isbn.length() == 10
|
7
|
-
return isIsbn10Valid(isbn)
|
8
|
-
elsif isbn.length() == 13
|
9
|
-
return isIsbn13Valid(isbn)
|
10
|
-
end
|
11
|
-
|
12
|
-
return false
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.isIsbn10Valid(isbn10)
|
16
|
-
a = 0
|
17
|
-
for i in 0..9
|
18
|
-
if (isbn10[i] == "X" || isbn10[i] == "x")
|
19
|
-
a += 10 *(10-i)
|
20
|
-
elsif isbn10[i].match(/^(\d)+$/)
|
21
|
-
a += isbn10[i].to_i * (10-i)
|
22
|
-
else
|
23
|
-
return false
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
return ( a%11 == 0 )
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.isIsbn13Valid(isbn13)
|
31
|
-
|
32
|
-
check = 0
|
33
|
-
i = 0
|
34
|
-
while i < 12 do
|
35
|
-
check = check + isbn13[i].to_i
|
36
|
-
i = i + 2
|
37
|
-
end
|
38
|
-
|
39
|
-
i = 1
|
40
|
-
while i < 12 do
|
41
|
-
check = check + 3*isbn13[i].to_i
|
42
|
-
i = i + 2
|
43
|
-
end
|
44
|
-
check = check + isbn13[12].to_i
|
45
|
-
return check % 10 == 0;
|
46
|
-
end
|
47
|
-
|
48
|
-
# The method to convert an 10 digit ISBN to 13 digit
|
49
|
-
# The method takes a 10 digit isbn and append "978" to the first 9 characters of the isbn and generate the 13 digit
|
50
|
-
|
51
|
-
def self.isbn10ToIsbn13(isbn10)
|
52
|
-
|
53
|
-
if isbn10.length() !=10
|
54
|
-
raise "The argument length should be 10"
|
55
|
-
end
|
56
|
-
|
57
|
-
isbn13 = "978" + isbn10.chomp("-");
|
58
|
-
return isbn13.slice(0, isbn13.length()-1) + getIsbn13CheckSum(isbn13).to_s;
|
59
|
-
end
|
60
|
-
|
61
|
-
|
62
|
-
def self.getIsbn13CheckSum(isbn13)
|
63
|
-
sum = 0
|
64
|
-
isbnFactorPattern = [1,3,1,3,1,3,1,3,1,3,1,3]
|
65
|
-
for i in 0..11
|
66
|
-
sum = sum + isbnFactorPattern[i] * isbn13[i].to_i
|
67
|
-
end
|
68
|
-
value = sum % 10
|
69
|
-
lastDigitIsbn = 10 - value
|
70
|
-
return lastDigitIsbn
|
71
|
-
end
|
72
|
-
|
73
|
-
end
|
74
|
-
|
75
|
-
|
76
|
-
# puts IsbnUtils.isIsbnValid("9783161484190")
|
77
|
-
|