isbn_validation 0.1.2 → 1.0.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/MIT-LICENSE +1 -1
- data/README.md +36 -0
- data/Rakefile +3 -39
- data/lib/isbn_validation.rb +74 -64
- data/lib/isbn_validation/version.rb +3 -0
- data/test/isbn_validation_test.rb +1 -1
- data/test/test_helper.rb +3 -1
- metadata +38 -40
- data/README +0 -27
data/MIT-LICENSE
CHANGED
data/README.md
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# IsbnValidation
|
2
|
+
|
3
|
+
Custom ActiveRecord Validation for International Standard Book Number (ISBN)
|
4
|
+
fields. Supports both ISBN-10 and ISBN-13. Will guarantee that validated fields
|
5
|
+
contain valid ISBNs.
|
6
|
+
|
7
|
+
Default behaviour is to allow either ISBN-10 or ISBN-13, but this can be
|
8
|
+
altered by specifying the :with option as shown in the example below.
|
9
|
+
|
10
|
+
For more information on ISBN, see http://en.wikipedia.org/wiki/Isbn
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
To use it, add it to your Gemfile:
|
15
|
+
|
16
|
+
gem 'isbn_validation'
|
17
|
+
|
18
|
+
The current version of isbn_validation only supports Rails 3. For Rails 2.x
|
19
|
+
support, please use v0.1.2.
|
20
|
+
|
21
|
+
## Example
|
22
|
+
|
23
|
+
class Book < ActiveRecord::Base
|
24
|
+
validates_isbn :isbn
|
25
|
+
validates_isbn :isbn10, :with => isbn10
|
26
|
+
validates_isbn :isbn13, :with => isbn13
|
27
|
+
end
|
28
|
+
|
29
|
+
------
|
30
|
+
|
31
|
+
## Contributors
|
32
|
+
|
33
|
+
* Nick Plante
|
34
|
+
* Omer Jakobinsky - Rails 3.0 compatibility
|
35
|
+
|
36
|
+
Copyright © 2011 Nick Plante, released under the MIT license
|
data/Rakefile
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
require 'bundler'
|
1
2
|
require 'rake'
|
2
3
|
require 'rake/testtask'
|
3
|
-
|
4
|
+
|
5
|
+
Bundler::GemHelper.install_tasks
|
4
6
|
|
5
7
|
desc 'Default: run unit tests.'
|
6
8
|
task :default => :test
|
@@ -11,41 +13,3 @@ Rake::TestTask.new(:test) do |t|
|
|
11
13
|
t.pattern = 'test/**/*_test.rb'
|
12
14
|
t.verbose = true
|
13
15
|
end
|
14
|
-
|
15
|
-
desc 'Generate documentation for the isbn_validation plugin.'
|
16
|
-
Rake::RDocTask.new(:rdoc) do |rdoc|
|
17
|
-
rdoc.rdoc_dir = 'rdoc'
|
18
|
-
rdoc.title = 'IsbnValidation'
|
19
|
-
rdoc.options << '--line-numbers' << '--inline-source'
|
20
|
-
rdoc.rdoc_files.include('README')
|
21
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
22
|
-
end
|
23
|
-
|
24
|
-
spec = Gem::Specification.new do |s|
|
25
|
-
s.name = %q{isbn_validation}
|
26
|
-
s.name = %q{isbn_validation}
|
27
|
-
s.version = "0.1.2"
|
28
|
-
s.summary = %q{isbn_validation adds an isbn validation routine to active record models.}
|
29
|
-
s.description = %q{isbn_validation adds an isbn validation routine to active record models.}
|
30
|
-
|
31
|
-
s.files = FileList['[A-Z]*', '{lib,test}/**/*.rb']
|
32
|
-
s.require_path = 'lib'
|
33
|
-
s.test_files = Dir[*['test/**/*_test.rb']]
|
34
|
-
|
35
|
-
s.has_rdoc = true
|
36
|
-
s.extra_rdoc_files = ["README"]
|
37
|
-
s.rdoc_options = ['--line-numbers', '--inline-source', "--main", "README"]
|
38
|
-
|
39
|
-
s.authors = ["Nick Plante"]
|
40
|
-
s.email = %q{nap@zerosum.org}
|
41
|
-
|
42
|
-
s.platform = Gem::Platform::RUBY
|
43
|
-
s.add_dependency(%q<activerecord>, [">= 2.1.2"])
|
44
|
-
end
|
45
|
-
|
46
|
-
desc "Generate a gemspec file"
|
47
|
-
task :gemspec do
|
48
|
-
File.open("#{spec.name}.gemspec", 'w') do |f|
|
49
|
-
f.write spec.to_ruby
|
50
|
-
end
|
51
|
-
end
|
data/lib/isbn_validation.rb
CHANGED
@@ -1,87 +1,97 @@
|
|
1
|
+
require "isbn_validation/version"
|
2
|
+
|
3
|
+
# The base module that gets included in ActiveRecord::Base.
|
4
|
+
# Validates whether the value of the specified attribute is a proper ISBN number.
|
5
|
+
# Defaults to verifying that the value is either a valid ISBN-10 or ISBN-13 number
|
6
|
+
# but this behavior can be modified using configuration options (as shown below).
|
7
|
+
#
|
8
|
+
# class Book < ActiveRecord::Base
|
9
|
+
# validates_isbn :isbn
|
10
|
+
# #validates_isbn :isbn10, :with => :isbn10
|
11
|
+
# #validates_isbn :isbn13, :with => :isbn13
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# Configuration options:
|
15
|
+
# * <tt>:message</tt> - A custom error message (default is: "is not a valid ISBN")
|
16
|
+
# * <tt>:with</tt> - A symbol referencing the type of ISBN to validate (:isbn10 or :isbn13)
|
17
|
+
# * <tt>:allow_nil</tt> - If set to true, skips this validation if the attribute is +nil+ (default is +false+).
|
18
|
+
# * <tt>:allow_blank</tt> - If set to true, skips this validation if the attribute is blank (default is +false+).
|
19
|
+
# * <tt>:on</tt> - Specifies when this validation is active (default is <tt>:save</tt>, other options <tt>:create</tt>, <tt>:update</tt>).
|
20
|
+
# * <tt>:if</tt> - Specifies a method, proc or string to call to determine if the validation should
|
21
|
+
# occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
22
|
+
# method, proc or string should return or evaluate to a true or false value.
|
23
|
+
# * <tt>:unless</tt> - Specifies a method, proc or string to call to determine if the validation should
|
24
|
+
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
25
|
+
# method, proc or string should return or evaluate to a true or false value.
|
1
26
|
module Zerosum
|
2
27
|
module ValidationExtensions
|
3
28
|
module IsbnValidation
|
4
29
|
ISBN10_REGEX = /^(?:\d[\ |-]?){9}[\d|X]$/
|
5
30
|
ISBN13_REGEX = /^(?:\d[\ |-]?){13}$/
|
6
31
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
#
|
11
|
-
# class Book < ActiveRecord::Base
|
12
|
-
# validates_isbn :isbn
|
13
|
-
# #validates_isbn :isbn10, :with => :isbn10
|
14
|
-
# #validates_isbn :isbn13, :with => :isbn13
|
15
|
-
# end
|
16
|
-
#
|
17
|
-
# Configuration options:
|
18
|
-
# * <tt>:message</tt> - A custom error message (default is: "is not a valid ISBN")
|
19
|
-
# * <tt>:with</tt> - A symbol referencing the type of ISBN to validate (:isbn10 or :isbn13)
|
20
|
-
# * <tt>:allow_nil</tt> - If set to true, skips this validation if the attribute is +nil+ (default is +false+).
|
21
|
-
# * <tt>:allow_blank</tt> - If set to true, skips this validation if the attribute is blank (default is +false+).
|
22
|
-
# * <tt>:on</tt> - Specifies when this validation is active (default is <tt>:save</tt>, other options <tt>:create</tt>, <tt>:update</tt>).
|
23
|
-
# * <tt>:if</tt> - Specifies a method, proc or string to call to determine if the validation should
|
24
|
-
# occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
25
|
-
# method, proc or string should return or evaluate to a true or false value.
|
26
|
-
# * <tt>:unless</tt> - Specifies a method, proc or string to call to determine if the validation should
|
27
|
-
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
28
|
-
# method, proc or string should return or evaluate to a true or false value.
|
29
|
-
def validates_isbn(*attr_names)
|
30
|
-
configuration = {
|
31
|
-
:message => "is not a valid ISBN code"
|
32
|
-
}
|
32
|
+
def self.included(base)
|
33
|
+
base.extend(ClassMethods)
|
34
|
+
end
|
33
35
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
36
|
+
module ClassMethods
|
37
|
+
def validates_isbn(*attr_names)
|
38
|
+
configuration = {
|
39
|
+
:message => "is not a valid ISBN code"
|
40
|
+
}
|
41
|
+
|
42
|
+
configuration.update(attr_names.extract_options!)
|
43
|
+
validates_each(attr_names, configuration) do |record, attr_name, value|
|
44
|
+
valid = case configuration[:with]
|
45
|
+
when :isbn10
|
46
|
+
validate_with_isbn10(value)
|
47
|
+
when :isbn13
|
48
|
+
validate_with_isbn13(value)
|
49
|
+
else
|
50
|
+
validate_with_isbn10(value) || validate_with_isbn13(value)
|
51
|
+
end
|
52
|
+
record.errors.add(attr_name, configuration[:message]) unless valid
|
43
53
|
end
|
44
|
-
record.errors.add(attr_name, configuration[:message]) unless valid
|
45
54
|
end
|
46
|
-
end
|
47
55
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
56
|
+
def validate_with_isbn10(isbn) #:nodoc:
|
57
|
+
if (isbn || '').match(ISBN10_REGEX)
|
58
|
+
isbn_values = isbn.upcase.gsub(/\ |-/, '').split('')
|
59
|
+
check_digit = isbn_values.pop # last digit is check digit
|
60
|
+
check_digit = (check_digit == 'X') ? 10 : check_digit.to_i
|
53
61
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
62
|
+
sum = 0
|
63
|
+
isbn_values.each_with_index do |value, index|
|
64
|
+
sum += (index + 1) * value.to_i
|
65
|
+
end
|
58
66
|
|
59
|
-
|
60
|
-
|
61
|
-
|
67
|
+
(sum % 11) == check_digit
|
68
|
+
else
|
69
|
+
false
|
70
|
+
end
|
62
71
|
end
|
63
|
-
end
|
64
72
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
73
|
+
def validate_with_isbn13(isbn) #:nodoc:
|
74
|
+
if (isbn || '').match(ISBN13_REGEX)
|
75
|
+
isbn_values = isbn.upcase.gsub(/\ |-/, '').split('')
|
76
|
+
check_digit = isbn_values.pop.to_i # last digit is check digit
|
69
77
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
78
|
+
sum = 0
|
79
|
+
isbn_values.each_with_index do |value, index|
|
80
|
+
multiplier = (index % 2 == 0) ? 1 : 3
|
81
|
+
sum += multiplier * value.to_i
|
82
|
+
end
|
75
83
|
|
76
|
-
|
77
|
-
|
84
|
+
result = (10 - (sum % 10))
|
85
|
+
result = 0 if result == 10
|
78
86
|
|
79
|
-
|
80
|
-
|
81
|
-
|
87
|
+
result == check_digit
|
88
|
+
else
|
89
|
+
false
|
90
|
+
end
|
82
91
|
end
|
83
92
|
end
|
84
93
|
end
|
85
94
|
end
|
86
95
|
end
|
87
96
|
|
97
|
+
ActiveRecord::Base.send(:include, Zerosum::ValidationExtensions::IsbnValidation)
|
@@ -87,7 +87,7 @@ class IsbnValidationTest < Test::Unit::TestCase
|
|
87
87
|
def test_should_have_custom_error_message
|
88
88
|
@book.isbn = '978-159059AAAAAA'
|
89
89
|
@book.valid?
|
90
|
-
assert_equal 'is too fantastical!', @book.errors
|
90
|
+
assert_equal 'is too fantastical!', @book.errors[:isbn].first
|
91
91
|
end
|
92
92
|
|
93
93
|
def test_isbn13_with_zero_check_digit_should_validate
|
data/test/test_helper.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
2
2
|
RAILS_ROOT = File.dirname(__FILE__)
|
3
3
|
|
4
|
+
require 'logger'
|
4
5
|
require 'rubygems'
|
5
6
|
require 'test/unit'
|
6
7
|
require 'active_record'
|
8
|
+
require "active_record/test_case"
|
7
9
|
require "#{File.dirname(__FILE__)}/../init"
|
8
10
|
|
9
11
|
config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
|
10
|
-
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) +
|
12
|
+
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + '/debug.log')
|
11
13
|
ActiveRecord::Base.establish_connection(config[ENV['DB'] || 'sqlite3'])
|
12
14
|
|
13
15
|
load(File.dirname(__FILE__) + "/schema.rb") if File.exist?(File.dirname(__FILE__) + "/schema.rb")
|
metadata
CHANGED
@@ -1,39 +1,39 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: isbn_validation
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
|
-
authors:
|
7
|
+
authors:
|
7
8
|
- Nick Plante
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
|
12
|
-
date: 2009-09-10 00:00:00 -04:00
|
12
|
+
date: 2009-09-10 00:00:00.000000000 -04:00
|
13
13
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
17
|
+
requirement: &2153555480 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '3'
|
17
23
|
type: :runtime
|
18
|
-
|
19
|
-
version_requirements:
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 2.1.2
|
24
|
-
version:
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *2153555480
|
25
26
|
description: isbn_validation adds an isbn validation routine to active record models.
|
26
27
|
email: nap@zerosum.org
|
27
28
|
executables: []
|
28
|
-
|
29
29
|
extensions: []
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
files:
|
30
|
+
extra_rdoc_files:
|
31
|
+
- README.md
|
32
|
+
files:
|
34
33
|
- MIT-LICENSE
|
35
34
|
- Rakefile
|
36
|
-
- README
|
35
|
+
- README.md
|
36
|
+
- lib/isbn_validation/version.rb
|
37
37
|
- lib/isbn_validation.rb
|
38
38
|
- test/isbn_validation_test.rb
|
39
39
|
- test/models.rb
|
@@ -42,33 +42,31 @@ files:
|
|
42
42
|
has_rdoc: true
|
43
43
|
homepage:
|
44
44
|
licenses: []
|
45
|
-
|
46
45
|
post_install_message:
|
47
|
-
rdoc_options:
|
46
|
+
rdoc_options:
|
48
47
|
- --line-numbers
|
49
48
|
- --inline-source
|
50
49
|
- --main
|
51
|
-
- README
|
52
|
-
require_paths:
|
50
|
+
- README.md
|
51
|
+
require_paths:
|
53
52
|
- lib
|
54
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ! '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
66
65
|
requirements: []
|
67
|
-
|
68
66
|
rubyforge_project:
|
69
|
-
rubygems_version: 1.
|
67
|
+
rubygems_version: 1.6.2
|
70
68
|
signing_key:
|
71
69
|
specification_version: 3
|
72
70
|
summary: isbn_validation adds an isbn validation routine to active record models.
|
73
|
-
test_files:
|
71
|
+
test_files:
|
74
72
|
- test/isbn_validation_test.rb
|
data/README
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
IsbnValidation
|
2
|
-
==============
|
3
|
-
|
4
|
-
Custom ActiveRecord Validation for International Standard Book Number (ISBN) fields.
|
5
|
-
Supports both ISBN-10 and ISBN-13. Will guarantee that validated fields contain valid
|
6
|
-
ISBNs.
|
7
|
-
|
8
|
-
Default behavior is to allow either ISBN-10 or ISBN-13, but this can be altered by
|
9
|
-
specifying the :with option as shown in the example below.
|
10
|
-
|
11
|
-
For more information on ISBN, see http://en.wikipedia.org/wiki/Isbn
|
12
|
-
|
13
|
-
Installation
|
14
|
-
============
|
15
|
-
|
16
|
-
ruby script/plugin install git://github.com/zapnap/isbn_validation
|
17
|
-
|
18
|
-
Example
|
19
|
-
=======
|
20
|
-
|
21
|
-
class Book < ActiveRecord::Base
|
22
|
-
validates_isbn :isbn
|
23
|
-
validates_isbn :isbn10, :with => :isbn10
|
24
|
-
validates_isbn :isbn13, :with => :isbn13
|
25
|
-
end
|
26
|
-
|
27
|
-
Copyright (c) 2008 Nick Plante, released under the MIT license
|