bookland 0.3.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,6 +1,3 @@
1
- source "http://rubygems.org"
1
+ source 'http://rubygems.org'
2
2
 
3
- gem "bundler", "~>1.0.0.rc.3"
4
- gem "jeweler"
5
- gem "rake"
6
- gem "rspec", "~>2.0.0.beta.19"
3
+ gemspec
@@ -1,31 +1,24 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ bookland (1.0.0)
5
+
1
6
  GEM
2
7
  remote: http://rubygems.org/
3
8
  specs:
4
9
  diff-lcs (1.1.2)
5
- gemcutter (0.6.1)
6
- git (1.2.5)
7
- jeweler (1.4.0)
8
- gemcutter (>= 0.1.0)
9
- git (>= 1.2.5)
10
- rubyforge (>= 2.0.0)
11
- json_pure (1.4.6)
12
- rake (0.8.7)
13
- rspec (2.0.0.beta.19)
14
- rspec-core (= 2.0.0.beta.19)
15
- rspec-expectations (= 2.0.0.beta.19)
16
- rspec-mocks (= 2.0.0.beta.19)
17
- rspec-core (2.0.0.beta.19)
18
- rspec-expectations (2.0.0.beta.19)
19
- diff-lcs (>= 1.1.2)
20
- rspec-mocks (2.0.0.beta.19)
21
- rubyforge (2.0.4)
22
- json_pure (>= 1.1.7)
10
+ rspec (2.5.0)
11
+ rspec-core (~> 2.5.0)
12
+ rspec-expectations (~> 2.5.0)
13
+ rspec-mocks (~> 2.5.0)
14
+ rspec-core (2.5.1)
15
+ rspec-expectations (2.5.0)
16
+ diff-lcs (~> 1.1.2)
17
+ rspec-mocks (2.5.0)
23
18
 
24
19
  PLATFORMS
25
20
  ruby
26
21
 
27
22
  DEPENDENCIES
28
- bundler (~> 1.0.0.rc.3)
29
- jeweler
30
- rake
31
- rspec (~> 2.0.0.beta.19)
23
+ bookland!
24
+ rspec (~> 2.5.0)
data/README.md CHANGED
@@ -1,46 +1,39 @@
1
1
  Bookland
2
2
  ========
3
3
 
4
- Bookland provides a simple ISBN class in Ruby.
5
-
6
- ![ISBN](http://upload.wikimedia.org/wikipedia/commons/thumb/2/28/EAN-13-ISBN-13.svg/540px-EAN-13-ISBN-13.svg.png)
4
+ [Bookland](http://en.wikipedia.org/wiki/Bookland) provides an ISBN class in Ruby.
7
5
 
8
6
  Examples
9
7
  --------
10
8
 
11
9
  include Bookland
12
-
13
- book = ISBN.new("0262011530")
14
- book.to_isbn13
10
+
11
+ isbn10 = ISBN.new('0262011530')
12
+ isbn10.to_isbn13
15
13
  => "9780262011532"
16
-
17
- book.to_s(1, 3, 5)
14
+
15
+ isbn10.to_s(1, 3, 5)
18
16
  => "0-262-01153-0"
19
-
20
- book == ISBN.new("9780262011532")
17
+
18
+ isbn13 == ISBN.new('9780262011532')
21
19
  => true
22
-
20
+
23
21
  # An invalid ISBN
24
- book = ISBN.new("0262011531")
25
- book.valid?
22
+ not_an_isbn = ISBN.new('0262011531')
23
+ not_an_isbn.valid?
26
24
  => false
27
-
28
- book.to_isbn13
29
- => Bookland::ISBNError: ISBN not valid
25
+ not_an_isbn.to_isbn13
26
+ => Bookland::ISBNError: Invalid ISBN
30
27
 
31
- Or use some class methods:
28
+ Some utility methods defined in the class level:
32
29
 
33
30
  include Bookland
34
- ISBN.to_13("0262011530")
31
+
32
+ ISBN.to_13('0262011530')
35
33
  => "9780262011532"
36
-
37
- ISBN.to_10("9780262011532")
34
+
35
+ ISBN.to_10('9780262011532')
38
36
  => "0262011530"
39
37
 
40
- ISBN.valid?("9780262011532")
38
+ ISBN.valid?('9780262011532')
41
39
  => true
42
-
43
- Compatibility
44
- -------------
45
-
46
- Specs pass against all usual suspects, including Ruby 1.8.7, 1.9.1, and 1.9.2.
data/Rakefile CHANGED
@@ -1,22 +1,11 @@
1
- require "rubygems"
2
- require "bundler/setup"
3
- require "jeweler"
4
- require "rspec/core/rake_task"
1
+ require 'bundler'
2
+ require 'rspec/core/rake_task'
5
3
 
6
- desc "Run all specs in spec directory"
7
- RSpec::Core::RakeTask.new(:spec) do |spec|
8
- spec.pattern = "spec/**/*_spec.rb"
9
- end
4
+ Bundler::GemHelper.install_tasks
10
5
 
11
- Jeweler::Tasks.new do |gemspec|
12
- gemspec.name = "bookland"
13
- gemspec.summary = "A simple ISBN class in Ruby"
14
- gemspec.description = "A simple ISBN class in Ruby"
15
- gemspec.email = "code@papercavalier.com"
16
- gemspec.homepage = "http://github.com/papercavalier/bookland"
17
- gemspec.authors = ["Hakan Ensari", "Piotr Laszewski"]
6
+ desc 'Run all specs in spec directory'
7
+ RSpec::Core::RakeTask.new(:spec) do |spec|
8
+ spec.pattern = 'spec/**/*_spec.rb'
18
9
  end
19
10
 
20
- Jeweler::GemcutterTasks.new
21
-
22
11
  task :default => :spec
@@ -1,56 +1,23 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
1
  # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'bookland/version'
5
4
 
6
5
  Gem::Specification.new do |s|
7
- s.name = %q{bookland}
8
- s.version = "0.3.1"
6
+ s.name = 'bookland'
7
+ s.version = Bookland::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ['Paper Cavalier']
10
+ s.email = 'code@papercavalier.com'
11
+ s.homepage = 'https://rubygems.org/gems/bookland'
12
+ s.summary = %q{An ISBN class in Ruby}
13
+ s.description = %q{Bookland is an ISBN class in Ruby.}
9
14
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Hakan Ensari", "Piotr Laszewski"]
12
- s.date = %q{2010-09-09}
13
- s.description = %q{A simple ISBN class in Ruby}
14
- s.email = %q{code@papercavalier.com}
15
- s.extra_rdoc_files = [
16
- "LICENSE",
17
- "README.md"
18
- ]
19
- s.files = [
20
- ".gitignore",
21
- ".rspec",
22
- ".rvmrc",
23
- "Gemfile",
24
- "Gemfile.lock",
25
- "History.md",
26
- "LICENSE",
27
- "README.md",
28
- "Rakefile",
29
- "VERSION",
30
- "bookland.gemspec",
31
- "lib/bookland.rb",
32
- "spec/bookland_spec.rb",
33
- "spec/fixtures/isbn",
34
- "spec/spec_helper.rb"
35
- ]
36
- s.homepage = %q{http://github.com/papercavalier/bookland}
37
- s.rdoc_options = ["--charset=UTF-8"]
38
- s.require_paths = ["lib"]
39
- s.rubygems_version = %q{1.3.7}
40
- s.summary = %q{A simple ISBN class in Ruby}
41
- s.test_files = [
42
- "spec/bookland_spec.rb",
43
- "spec/spec_helper.rb"
44
- ]
15
+ s.rubyforge_project = 'bookland'
45
16
 
46
- if s.respond_to? :specification_version then
47
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
48
- s.specification_version = 3
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ['lib']
49
21
 
50
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
51
- else
52
- end
53
- else
54
- end
22
+ s.add_development_dependency('rspec', '~> 2.5.0')
55
23
  end
56
-
@@ -1,105 +1 @@
1
- module Bookland
2
-
3
- # A simple ISBN class
4
- class ISBN
5
- class << self
6
- def to_10(isbn)
7
- new(isbn).to_isbn10.to_s
8
- end
9
-
10
- def to_13(isbn)
11
- new(isbn).to_isbn13.to_s
12
- end
13
-
14
- def valid?(isbn)
15
- new(isbn).valid?
16
- end
17
- end
18
-
19
- def initialize(seed=nil)
20
- self.seed = seed
21
- end
22
-
23
- def ==(other)
24
- to_isbn13.to_s == other.to_isbn13.to_s
25
- end
26
-
27
- def inspect
28
- to_s
29
- end
30
-
31
- def seed=(seed)
32
- @raw = seed.gsub(/[^Xx0-9]/, '').split(//) rescue @raw = []
33
- end
34
-
35
- def to_isbn10
36
- raise ISBNError unless valid?
37
-
38
- if isbn13?
39
- raw = @raw[3..11]
40
- ISBN.new((raw << check_digit_10(raw)).to_s)
41
- else
42
- dup
43
- end
44
- end
45
-
46
- def to_isbn13
47
- raise ISBNError unless valid?
48
-
49
- if isbn10?
50
- raw = @raw[0..8].unshift('9', '7', '8')
51
- ISBN.new((raw << check_digit_13(raw)).to_s)
52
- else
53
- dup
54
- end
55
- end
56
-
57
- def to_s(*blocks)
58
- return false unless valid?
59
-
60
- raw = @raw.dup
61
- blocks.any? ? (blocks.map { |i| raw.shift(i).join } << raw.join).delete_if(&:empty?).join('-') : raw.join
62
- end
63
-
64
- def valid?
65
- if isbn10?
66
- @raw[9] == check_digit_10(@raw)
67
- elsif isbn13?
68
- @raw[12] == check_digit_13(@raw)
69
- else
70
- false
71
- end
72
- end
73
-
74
- private
75
-
76
- def check_digit_10(raw)
77
- cd = 11 - 10.downto(2).to_a.zip(raw[0..8].map(&:to_i)).map { |n,m| n * m }.inject(0) { |i,j| i + j } % 11
78
-
79
- case cd
80
- when 0..9 then cd.to_s
81
- when 10 then 'X'
82
- when 11 then '0'
83
- end
84
- end
85
-
86
- def check_digit_13(raw)
87
- ((10 - ([1, 3] * 6).zip(raw[0..11].map(&:to_i)).map { |n,m| n * m }.inject(0) { |i,j| i + j } % 10) % 10).to_s
88
- end
89
-
90
- def isbn10?
91
- @raw.length == 10
92
- end
93
-
94
- def isbn13?
95
- @raw.length == 13
96
- end
97
- end
98
-
99
- # A simple error wrapper for a simple ISBN class
100
- class ISBNError < StandardError
101
- def initialize(msg='ISBN not valid')
102
- super
103
- end
104
- end
105
- end
1
+ require 'bookland/isbn'
@@ -0,0 +1,104 @@
1
+ module Bookland
2
+
3
+ # A simple ISBN class
4
+ class ISBN
5
+ class << self
6
+ def to_10(isbn)
7
+ new(isbn).to_isbn10.to_s
8
+ end
9
+
10
+ def to_13(isbn)
11
+ new(isbn).to_isbn13.to_s
12
+ end
13
+
14
+ def valid?(isbn)
15
+ new(isbn).valid?
16
+ end
17
+ end
18
+
19
+ def initialize(seed=nil)
20
+ self.seed = seed
21
+ end
22
+
23
+ def ==(other)
24
+ to_isbn13.to_s == other.to_isbn13.to_s
25
+ end
26
+
27
+ def inspect
28
+ to_s
29
+ end
30
+
31
+ def seed=(seed)
32
+ @raw = seed.gsub(/[^Xx0-9]/, '').split(//) rescue @raw = []
33
+ end
34
+
35
+ def to_isbn10
36
+ raise ISBNError unless valid?
37
+
38
+ if isbn13?
39
+ raw = @raw[3..11]
40
+ ISBN.new((raw << check_digit_10(raw)).to_s)
41
+ else
42
+ dup
43
+ end
44
+ end
45
+
46
+ def to_isbn13
47
+ raise ISBNError unless valid?
48
+
49
+ if isbn10?
50
+ raw = @raw[0..8].unshift('9', '7', '8')
51
+ ISBN.new((raw << check_digit_13(raw)).to_s)
52
+ else
53
+ dup
54
+ end
55
+ end
56
+
57
+ def to_s(*blocks)
58
+ return false unless valid?
59
+
60
+ raw = @raw.dup
61
+ blocks.any? ? (blocks.map { |i| raw.shift(i).join } << raw.join).delete_if(&:empty?).join('-') : raw.join
62
+ end
63
+
64
+ def valid?
65
+ if isbn10?
66
+ @raw[9] == check_digit_10(@raw)
67
+ elsif isbn13?
68
+ @raw[12] == check_digit_13(@raw)
69
+ else
70
+ false
71
+ end
72
+ end
73
+
74
+ private
75
+
76
+ def check_digit_10(raw)
77
+ cd = 11 - 10.downto(2).to_a.zip(raw[0..8].map(&:to_i)).map { |n,m| n * m }.inject(0) { |i,j| i + j } % 11
78
+
79
+ case cd
80
+ when 0..9 then cd.to_s
81
+ when 10 then 'X'
82
+ when 11 then '0'
83
+ end
84
+ end
85
+
86
+ def check_digit_13(raw)
87
+ ((10 - ([1, 3] * 6).zip(raw[0..11].map(&:to_i)).map { |n,m| n * m }.inject(0) { |i,j| i + j } % 10) % 10).to_s
88
+ end
89
+
90
+ def isbn10?
91
+ @raw.length == 10
92
+ end
93
+
94
+ def isbn13?
95
+ @raw.length == 13
96
+ end
97
+ end
98
+
99
+ class ISBNError < StandardError
100
+ def initialize(msg='Invalid ISBN')
101
+ super
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,3 @@
1
+ module Bookland
2
+ VERSION = '1.0.0'
3
+ end
@@ -0,0 +1,138 @@
1
+ require "spec_helper"
2
+
3
+ module Bookland
4
+ describe Bookland::ISBN do
5
+ context ".to_10" do
6
+ it "converts to ISBN-10" do
7
+ isbns do |isbn10, isbn13|
8
+ Bookland::ISBN.to_10(isbn10).should eql isbn10
9
+ Bookland::ISBN.to_10(isbn13).should eql isbn10
10
+ end
11
+ end
12
+
13
+ it "raises an ISBNError if an invalid ISBN is converted" do
14
+ ['foo', 1, '', nil].each do |isbn|
15
+ expect do
16
+ Bookland::ISBN.to_10(isbn)
17
+ end.to raise_error Bookland::ISBNError
18
+ end
19
+ end
20
+ end
21
+
22
+ context ".to_13" do
23
+ it "converts to ISBN-13" do
24
+ isbns do |isbn10, isbn13|
25
+ Bookland::ISBN.to_13(isbn10).should eql isbn13
26
+ Bookland::ISBN.to_13(isbn13).should eql isbn13
27
+ end
28
+ end
29
+
30
+ it "raises an ISBNError if an invalid ISBN is converted" do
31
+ ['foo', 1, '', nil].each do |isbn|
32
+ expect do
33
+ Bookland::ISBN.to_13(isbn)
34
+ end.to raise_error Bookland::ISBNError
35
+ end
36
+ end
37
+ end
38
+
39
+ context ".valid?" do
40
+ it "validates an ISBN" do
41
+ Bookland::ISBN.valid?("9780485113358").should be_true
42
+ Bookland::ISBN.valid?("9780485113359").should be_false
43
+ end
44
+ end
45
+
46
+ context "#to_isbn13" do
47
+ it "converts an ISBN-10 to ISBN-13" do
48
+ isbns do |isbn10, isbn13|
49
+ Bookland::ISBN.new(isbn10).to_isbn13.should == Bookland::ISBN.new(isbn13)
50
+ end
51
+ end
52
+
53
+ it "raises an ISBNError if an invalid ISBN-10 is converted to ISBN-13" do
54
+ isbns do |isbn10, isbn13|
55
+ invalid = isbn10.gsub(/(.)$/, "#{(isbn10.split(//).last.to_i - 2) % 10}")
56
+ expect do
57
+ Bookland::ISBN.new(invalid).to_isbn13
58
+ end.to raise_error Bookland::ISBNError
59
+ end
60
+ end
61
+ end
62
+
63
+ context "#to_isbn10" do
64
+ it "converts an ISBN-13 to ISBN-10" do
65
+ isbns do |isbn10, isbn13|
66
+ Bookland::ISBN.new(isbn13).to_isbn10.should == Bookland::ISBN.new(isbn10)
67
+ end
68
+ end
69
+
70
+ it "raises an ISBNError if an invalid ISBN-13 is converted to ISBN-10" do
71
+ isbns do |isbn10, isbn13|
72
+ invalid = isbn13.gsub(/(.)$/, "#{(isbn13.split(//).last.to_i - 2) % 10}")
73
+ expect do
74
+ Bookland::ISBN.new(invalid).to_isbn10
75
+ end.to raise_error Bookland::ISBNError
76
+ end
77
+ end
78
+ end
79
+
80
+ context "#==" do
81
+ it "equates ISBN-10 and ISBN-13" do
82
+ isbns do |isbn10, isbn13|
83
+ (Bookland::ISBN.new(isbn10) == Bookland::ISBN.new(isbn13)).should be_true
84
+ end
85
+ end
86
+ end
87
+
88
+ context "#valid?" do
89
+ it "validates ISBN-10s" do
90
+ isbns do |isbn10, isbn13|
91
+ Bookland::ISBN.new(isbn10).valid?.should be_true
92
+ end
93
+ end
94
+
95
+ it "validates ISBN-13s" do
96
+ isbns do |isbn10, isbn13|
97
+ Bookland::ISBN.new(isbn13).valid?.should be_true
98
+ end
99
+ end
100
+
101
+ it "does not validate if seed looks like an ISBN-13 but has an invalid check digit" do
102
+ isbns do |isbn10, isbn13|
103
+ invalid = isbn13.gsub(/(.)$/, "#{(isbn13.split(//).last.to_i - 2) % 10}")
104
+ Bookland::ISBN.new(invalid).valid?.should be_false
105
+ end
106
+ end
107
+
108
+ it "does not validate if seed looks like an ISBN-10 but has an invalid check digit" do
109
+ isbns do |isbn10, isbn13|
110
+ invalid = isbn10.gsub(/(.)$/, "#{(isbn10.split(//).last.to_i - 2) % 10}")
111
+ Bookland::ISBN.new(invalid).valid?.should be_false
112
+ end
113
+ end
114
+
115
+ it "does not validate if seed is not an ISBN" do
116
+ ['foo', 1, '', nil].each { |seed| Bookland::ISBN.new(seed).valid?.should be_false }
117
+ end
118
+ end
119
+
120
+ context "#to_s" do
121
+ it "casts as string" do
122
+ Bookland::ISBN.new('0262011530').to_s.should eql '0262011530'
123
+ end
124
+
125
+ it "casts as string and hyphenate an ISBN-13" do
126
+ Bookland::ISBN.new("9780485113358").to_s(3, 10).should eql '978-0485113358'
127
+ end
128
+
129
+ it "casts as string and hyphenate an ISBN-10" do
130
+ Bookland::ISBN.new("048511335X").to_s(1, 3, 5, 1).should eql '0-485-11335-X'
131
+ end
132
+
133
+ it "returns false if an invalid ISBN is cast as string" do
134
+ ['foo', 1, '', nil].each { |seed| Bookland::ISBN.new(seed).to_s.should be_false }
135
+ end
136
+ end
137
+ end
138
+ end
metadata CHANGED
@@ -1,34 +1,47 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bookland
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
5
- prerelease: false
4
+ hash: 23
5
+ prerelease:
6
6
  segments:
7
- - 0
8
- - 3
9
7
  - 1
10
- version: 0.3.1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
11
11
  platform: ruby
12
12
  authors:
13
- - Hakan Ensari
14
- - Piotr Laszewski
13
+ - Paper Cavalier
15
14
  autorequire:
16
15
  bindir: bin
17
16
  cert_chain: []
18
17
 
19
- date: 2010-09-09 00:00:00 +01:00
18
+ date: 2011-03-03 00:00:00 +00:00
20
19
  default_executable:
21
- dependencies: []
22
-
23
- description: A simple ISBN class in Ruby
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rspec
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ hash: 27
30
+ segments:
31
+ - 2
32
+ - 5
33
+ - 0
34
+ version: 2.5.0
35
+ type: :development
36
+ version_requirements: *id001
37
+ description: Bookland is an ISBN class in Ruby.
24
38
  email: code@papercavalier.com
25
39
  executables: []
26
40
 
27
41
  extensions: []
28
42
 
29
- extra_rdoc_files:
30
- - LICENSE
31
- - README.md
43
+ extra_rdoc_files: []
44
+
32
45
  files:
33
46
  - .gitignore
34
47
  - .rspec
@@ -42,16 +55,18 @@ files:
42
55
  - VERSION
43
56
  - bookland.gemspec
44
57
  - lib/bookland.rb
45
- - spec/bookland_spec.rb
58
+ - lib/bookland/isbn.rb
59
+ - lib/bookland/version.rb
60
+ - spec/bookland/isbn_spec.rb
46
61
  - spec/fixtures/isbn
47
62
  - spec/spec_helper.rb
48
63
  has_rdoc: true
49
- homepage: http://github.com/papercavalier/bookland
64
+ homepage: https://rubygems.org/gems/bookland
50
65
  licenses: []
51
66
 
52
67
  post_install_message:
53
- rdoc_options:
54
- - --charset=UTF-8
68
+ rdoc_options: []
69
+
55
70
  require_paths:
56
71
  - lib
57
72
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -74,11 +89,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
74
89
  version: "0"
75
90
  requirements: []
76
91
 
77
- rubyforge_project:
78
- rubygems_version: 1.3.7
92
+ rubyforge_project: bookland
93
+ rubygems_version: 1.5.2
79
94
  signing_key:
80
95
  specification_version: 3
81
- summary: A simple ISBN class in Ruby
96
+ summary: An ISBN class in Ruby
82
97
  test_files:
83
- - spec/bookland_spec.rb
98
+ - spec/bookland/isbn_spec.rb
99
+ - spec/fixtures/isbn
84
100
  - spec/spec_helper.rb
@@ -1,111 +0,0 @@
1
- require "spec_helper"
2
-
3
- module Bookland
4
- describe Bookland::ISBN do
5
- context "class methods" do
6
- it "converts to ISBN-10" do
7
- isbns do |isbn10, isbn13|
8
- Bookland::ISBN.to_10(isbn10).should eql isbn10
9
- Bookland::ISBN.to_10(isbn13).should eql isbn10
10
- end
11
- end
12
-
13
- it "converts to ISBN-13" do
14
- isbns do |isbn10, isbn13|
15
- Bookland::ISBN.to_13(isbn10).should eql isbn13
16
- Bookland::ISBN.to_13(isbn13).should eql isbn13
17
- end
18
- end
19
-
20
- it "raises an ISBNError if an invalid ISBN is converted" do
21
- ['foo', 1, '', nil].each do |isbn|
22
- lambda { Bookland::ISBN.to_10(isbn)}.should raise_error Bookland::ISBNError
23
- lambda { Bookland::ISBN.to_13(isbn)}.should raise_error Bookland::ISBNError
24
- end
25
- end
26
-
27
- it "validates an ISBN" do
28
- Bookland::ISBN.valid?("9780485113358").should be_true
29
- Bookland::ISBN.valid?("9780485113359").should be_false
30
- end
31
- end
32
-
33
- it "converts an ISBN-10 to ISBN-13" do
34
- isbns do |isbn10, isbn13|
35
- Bookland::ISBN.new(isbn10).to_isbn13.should == Bookland::ISBN.new(isbn13)
36
- end
37
- end
38
-
39
- it "converts an ISBN-13 to ISBN-10" do
40
- isbns do |isbn10, isbn13|
41
- Bookland::ISBN.new(isbn13).to_isbn10.should == Bookland::ISBN.new(isbn10)
42
- end
43
- end
44
-
45
- it "equates ISBN-10 and ISBN-13" do
46
- isbns do |isbn10, isbn13|
47
- (Bookland::ISBN.new(isbn10) == Bookland::ISBN.new(isbn13)).should be_true
48
- end
49
- end
50
-
51
- it "validates ISBN-10s" do
52
- isbns do |isbn10, isbn13|
53
- Bookland::ISBN.new(isbn10).valid?.should be_true
54
- end
55
- end
56
-
57
- it "validates ISBN-13s" do
58
- isbns do |isbn10, isbn13|
59
- Bookland::ISBN.new(isbn13).valid?.should be_true
60
- end
61
- end
62
-
63
- it "does not validate if seed looks like an ISBN-13 but has an invalid check digit" do
64
- isbns do |isbn10, isbn13|
65
- invalid = isbn13.gsub(/(.)$/, "#{(isbn13.split(//).last.to_i - 2) % 10}")
66
- Bookland::ISBN.new(invalid).valid?.should be_false
67
- end
68
- end
69
-
70
- it "does not validate if seed looks like an ISBN-10 but has an invalid check digit" do
71
- isbns do |isbn10, isbn13|
72
- invalid = isbn10.gsub(/(.)$/, "#{(isbn10.split(//).last.to_i - 2) % 10}")
73
- Bookland::ISBN.new(invalid).valid?.should be_false
74
- end
75
- end
76
-
77
- it "does not validate if seed is not an ISBN" do
78
- ['foo', 1, '', nil].each { |seed| Bookland::ISBN.new(seed).valid?.should be_false }
79
- end
80
-
81
- it "casts as string" do
82
- Bookland::ISBN.new('0262011530').to_s.should eql '0262011530'
83
- end
84
-
85
- it "casts as string and hyphenate an ISBN-13" do
86
- Bookland::ISBN.new("9780485113358").to_s(3, 10).should eql '978-0485113358'
87
- end
88
-
89
- it "casts as string and hyphenate an ISBN-10" do
90
- Bookland::ISBN.new("048511335X").to_s(1, 3, 5, 1).should eql '0-485-11335-X'
91
- end
92
-
93
- it "returns false if an invalid ISBN is cast as string" do
94
- ['foo', 1, '', nil].each { |seed| Bookland::ISBN.new(seed).to_s.should be_false }
95
- end
96
-
97
- it "raises an ISBNError if an invalid ISBN-13 is converted to ISBN-10" do
98
- isbns do |isbn10, isbn13|
99
- invalid = isbn13.gsub(/(.)$/, "#{(isbn13.split(//).last.to_i - 2) % 10}")
100
- lambda { Bookland::ISBN.new(invalid).to_isbn10 }.should raise_error Bookland::ISBNError
101
- end
102
- end
103
-
104
- it "raises an ISBNError if an invalid ISBN-10 is converted to ISBN-13" do
105
- isbns do |isbn10, isbn13|
106
- invalid = isbn10.gsub(/(.)$/, "#{(isbn10.split(//).last.to_i - 2) % 10}")
107
- lambda { Bookland::ISBN.new(invalid).to_isbn13 }.should raise_error Bookland::ISBNError
108
- end
109
- end
110
- end
111
- end