bookland 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,3 +1,5 @@
1
1
  .DS_Store
2
2
  pkg
3
3
  .bundle
4
+ Gemfile.lock
5
+ docs
data/README.md CHANGED
@@ -1,12 +1,13 @@
1
1
  Bookland
2
2
  ========
3
3
 
4
- [Bookland](http://en.wikipedia.org/wiki/Bookland) provides an ISBN class in Ruby.
4
+ [Bookland](http://en.wikipedia.org/wiki/Bookland) provides an ISBN class in
5
+ Ruby.
5
6
 
6
- Examples
7
- --------
7
+ Usage
8
+ -----
8
9
 
9
- include Bookland
10
+ require 'bookland'
10
11
 
11
12
  isbn10 = ISBN.new('0262011530')
12
13
  isbn10.to_isbn13
@@ -18,17 +19,15 @@ Examples
18
19
  isbn13 == ISBN.new('9780262011532')
19
20
  => true
20
21
 
21
- # An invalid ISBN
22
- not_an_isbn = ISBN.new('0262011531')
23
- not_an_isbn.valid?
22
+ # Does an invalid ISBN quack like an ISBN?
23
+ bad_isbn = ISBN.new('0262011531')
24
+ bad_isbn.valid?
24
25
  => false
25
- not_an_isbn.to_isbn13
26
+ bad_isbn.to_isbn13
26
27
  => Bookland::ISBNError: Invalid ISBN
27
28
 
28
29
  Some utility methods defined in the class level:
29
30
 
30
- include Bookland
31
-
32
31
  ISBN.to_13('0262011530')
33
32
  => "9780262011532"
34
33
 
data/Rakefile CHANGED
@@ -9,3 +9,15 @@ RSpec::Core::RakeTask.new(:spec) do |spec|
9
9
  end
10
10
 
11
11
  task :default => :spec
12
+
13
+ require 'rocco/tasks'
14
+ Rocco::make 'docs/'
15
+
16
+ desc 'Build rocco docs'
17
+ task :docs => :rocco
18
+ directory 'docs/'
19
+
20
+ desc 'Build docs and open in browser for the reading'
21
+ task :read => :docs do
22
+ sh 'open docs/lib/bookland/isbn.html'
23
+ end
data/bookland.gemspec CHANGED
@@ -20,4 +20,5 @@ Gem::Specification.new do |s|
20
20
  s.require_paths = ['lib']
21
21
 
22
22
  s.add_development_dependency('rspec', '~> 2.5.0')
23
+ s.add_development_dependency('rocco', '~> 0.6.0')
23
24
  end
data/lib/bookland.rb CHANGED
@@ -1 +1,5 @@
1
1
  require 'bookland/isbn'
2
+
3
+ # Include Bookland in global namespace.
4
+ #
5
+ Object.send(:include, Bookland)
data/lib/bookland/isbn.rb CHANGED
@@ -1,16 +1,37 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # [Bookland][bl] is a simple ISBN class in Ruby.
4
+ #
5
+ # [bl]: http://en.wikipedia.org/wiki/Bookland
1
6
  module Bookland
2
7
 
3
- # A simple ISBN class
8
+ #### Public Interface
9
+ #
10
+ # `ISBN.new` takes an optional string. The string should look like an ISBN
11
+ # and may contain extra characters that are traditionally used to format
12
+ # ISBNs.
13
+ #
14
+ # The following are valid instantiations:
15
+ #
16
+ # isbn13 = ISBN.new('9780826476951')
17
+ # isbn10 = ISBN.new('0-8264-7695-3')
18
+ #
19
+ # isbn10 == isbn13
20
+ # => true
4
21
  class ISBN
5
22
  class << self
23
+
24
+ # Casts a specified string to a 10-digit ISBN.
6
25
  def to_10(isbn)
7
26
  new(isbn).to_isbn10.to_s
8
27
  end
9
28
 
29
+ # Casts a specified string to a 13-digit ISBN.
10
30
  def to_13(isbn)
11
31
  new(isbn).to_isbn13.to_s
12
32
  end
13
33
 
34
+ # Returns `true` if the specified string is a valid ISBN.
14
35
  def valid?(isbn)
15
36
  new(isbn).valid?
16
37
  end
@@ -20,19 +41,24 @@ module Bookland
20
41
  self.seed = seed
21
42
  end
22
43
 
44
+ # Returns `true` if the ISBN is equal to another specified ISBN.
23
45
  def ==(other)
24
46
  to_isbn13.to_s == other.to_isbn13.to_s
25
47
  end
26
48
 
49
+ # Inspecting an ISBN object will return its string representation.
27
50
  def inspect
28
51
  to_s
29
52
  end
30
53
 
54
+ # Sets the seed of the ISBN based on a specified string.
31
55
  def seed=(seed)
32
56
  @raw = seed.gsub(/[^Xx0-9]/, '').split(//) rescue @raw = []
33
57
  end
34
58
 
59
+ # Casts the ISBN to a ten-digit ISBN.
35
60
  def to_isbn10
61
+
36
62
  raise ISBNError unless valid?
37
63
 
38
64
  if isbn13?
@@ -54,13 +80,27 @@ module Bookland
54
80
  end
55
81
  end
56
82
 
83
+ # Casts ISBN to a string.
84
+ #
85
+ # Takes an optional list of integers, which it then uses to dashify the
86
+ # ISBN like so:
87
+ #
88
+ # isbn = ISBN.new('0826476953')
89
+ # isbn.to_s(1,4,4,1)
90
+ # => "0-8264-7695-3"
91
+ #
57
92
  def to_s(*blocks)
58
93
  return false unless valid?
59
94
 
60
95
  raw = @raw.dup
61
- blocks.any? ? (blocks.map { |i| raw.shift(i).join } << raw.join).delete_if(&:empty?).join('-') : raw.join
96
+ if blocks.any?
97
+ (blocks.map { |i| raw.shift(i).join } << raw.join).delete_if(&:empty?).join('-')
98
+ else
99
+ raw.join
100
+ end
62
101
  end
63
102
 
103
+ # Returns `true` if the ISBN is valid.
64
104
  def valid?
65
105
  if isbn10?
66
106
  @raw[9] == check_digit_10(@raw)
@@ -102,3 +142,5 @@ module Bookland
102
142
  end
103
143
  end
104
144
  end
145
+
146
+ # C'est ça.
@@ -1,3 +1,3 @@
1
1
  module Bookland
2
- VERSION = '1.0.0'
2
+ VERSION = '1.0.1'
3
3
  end
@@ -1,137 +1,164 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  module Bookland
4
- describe Bookland::ISBN do
5
- context ".to_10" do
6
- it "converts to ISBN-10" do
4
+ describe ISBN do
5
+ describe ".to_10" do
6
+ it "casts a specified string to a ten-digit ISBN" do
7
7
  isbns do |isbn10, isbn13|
8
- Bookland::ISBN.to_10(isbn10).should eql isbn10
9
- Bookland::ISBN.to_10(isbn13).should eql isbn10
8
+ ISBN.to_10(isbn10).should eql isbn10
9
+ ISBN.to_10(isbn13).should eql isbn10
10
10
  end
11
11
  end
12
12
 
13
- it "raises an ISBNError if an invalid ISBN is converted" do
13
+ it "raises an ISBNError if the specified string is not a valid ISBN" do
14
14
  ['foo', 1, '', nil].each do |isbn|
15
15
  expect do
16
- Bookland::ISBN.to_10(isbn)
17
- end.to raise_error Bookland::ISBNError
16
+ ISBN.to_10(isbn)
17
+ end.to raise_error ISBNError
18
18
  end
19
19
  end
20
20
  end
21
21
 
22
- context ".to_13" do
23
- it "converts to ISBN-13" do
22
+ describe ".to_13" do
23
+ it "casts a specified string to a 13-digit ISBN" do
24
24
  isbns do |isbn10, isbn13|
25
- Bookland::ISBN.to_13(isbn10).should eql isbn13
26
- Bookland::ISBN.to_13(isbn13).should eql isbn13
25
+ ISBN.to_13(isbn10).should eql isbn13
26
+ ISBN.to_13(isbn13).should eql isbn13
27
27
  end
28
28
  end
29
29
 
30
- it "raises an ISBNError if an invalid ISBN is converted" do
30
+ it "raises an ISBNError if the specified string is not a valid ISBN" do
31
31
  ['foo', 1, '', nil].each do |isbn|
32
32
  expect do
33
- Bookland::ISBN.to_13(isbn)
34
- end.to raise_error Bookland::ISBNError
33
+ ISBN.to_13(isbn)
34
+ end.to raise_error ISBNError
35
35
  end
36
36
  end
37
37
  end
38
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
39
+ describe ".valid?" do
40
+ it "returns true if a specified string is a valid ISBN" do
41
+ ISBN.valid?('9780485113358').should be_true
42
+ end
43
+
44
+ it "returns false if a specified string is not a valid ISBN" do
45
+ ISBN.valid?('9780485113359').should be_false
43
46
  end
44
47
  end
45
48
 
46
- context "#to_isbn13" do
47
- it "converts an ISBN-10 to ISBN-13" do
49
+ describe "#to_isbn10" do
50
+ it "casts a 10-digit ISBN to a 10-digit ISBN" do
48
51
  isbns do |isbn10, isbn13|
49
- Bookland::ISBN.new(isbn10).to_isbn13.should == Bookland::ISBN.new(isbn13)
52
+ ISBN.new(isbn10).to_isbn10.should == ISBN.new(isbn10)
50
53
  end
51
54
  end
52
55
 
53
- it "raises an ISBNError if an invalid ISBN-10 is converted to ISBN-13" do
56
+ it "casts a 13-digit ISBN to a 10-digit ISBN" do
54
57
  isbns do |isbn10, isbn13|
55
- invalid = isbn10.gsub(/(.)$/, "#{(isbn10.split(//).last.to_i - 2) % 10}")
58
+ ISBN.new(isbn13).to_isbn10.should == ISBN.new(isbn10)
59
+ end
60
+ end
61
+
62
+ it "raises an ISBNError if self is not a valid ISBN" do
63
+ isbns do |isbn10, isbn13|
64
+ invalid = isbn13.gsub(/(.)$/, "#{(isbn13.split(//).last.to_i - 2) % 10}")
56
65
  expect do
57
- Bookland::ISBN.new(invalid).to_isbn13
58
- end.to raise_error Bookland::ISBNError
66
+ ISBN.new(invalid).to_isbn10
67
+ end.to raise_error ISBNError
59
68
  end
60
69
  end
61
70
  end
62
71
 
63
- context "#to_isbn10" do
64
- it "converts an ISBN-13 to ISBN-10" do
72
+ describe "#to_isbn13" do
73
+ it "casts a 10-digit ISBN to a 13-digit ISBN" do
65
74
  isbns do |isbn10, isbn13|
66
- Bookland::ISBN.new(isbn13).to_isbn10.should == Bookland::ISBN.new(isbn10)
75
+ ISBN.new(isbn10).to_isbn13.should == ISBN.new(isbn13)
67
76
  end
68
77
  end
69
78
 
70
- it "raises an ISBNError if an invalid ISBN-13 is converted to ISBN-10" do
79
+ it "casts a 13-digit ISBN to a 13-digit ISBN" do
71
80
  isbns do |isbn10, isbn13|
72
- invalid = isbn13.gsub(/(.)$/, "#{(isbn13.split(//).last.to_i - 2) % 10}")
81
+ ISBN.new(isbn13).to_isbn13.should == ISBN.new(isbn13)
82
+ end
83
+ end
84
+
85
+ it "raises an ISBNError if self is not a valid ISBN" do
86
+ isbns do |isbn10, isbn13|
87
+ invalid = isbn10.gsub(/(.)$/, "#{(isbn10.split(//).last.to_i - 2) % 10}")
73
88
  expect do
74
- Bookland::ISBN.new(invalid).to_isbn10
75
- end.to raise_error Bookland::ISBNError
89
+ ISBN.new(invalid).to_isbn13
90
+ end.to raise_error ISBNError
76
91
  end
77
92
  end
78
93
  end
79
94
 
80
- context "#==" do
81
- it "equates ISBN-10 and ISBN-13" do
95
+ describe "#==" do
96
+ it "equates a ten- and a thirteen-digit ISBN" do
97
+ isbns do |isbn10, isbn13|
98
+ (ISBN.new(isbn10) == ISBN.new(isbn13)).should be_true
99
+ end
100
+ end
101
+
102
+ it "equates a ten- and a ten-digit ISBN" do
103
+ isbns do |isbn10, isbn13|
104
+ (ISBN.new(isbn10) == ISBN.new(isbn10)).should be_true
105
+ end
106
+ end
107
+
108
+ it "equates a thirteen- and a thirteen-digit ISBN" do
82
109
  isbns do |isbn10, isbn13|
83
- (Bookland::ISBN.new(isbn10) == Bookland::ISBN.new(isbn13)).should be_true
110
+ (ISBN.new(isbn13) == ISBN.new(isbn13)).should be_true
84
111
  end
85
112
  end
86
113
  end
87
114
 
88
- context "#valid?" do
89
- it "validates ISBN-10s" do
115
+ describe "#valid?" do
116
+ it "validates a ten-digit ISBN" do
90
117
  isbns do |isbn10, isbn13|
91
- Bookland::ISBN.new(isbn10).valid?.should be_true
118
+ ISBN.new(isbn10).valid?.should be_true
92
119
  end
93
120
  end
94
121
 
95
- it "validates ISBN-13s" do
122
+ it "validates a thirteen-digit ISBN" do
96
123
  isbns do |isbn10, isbn13|
97
- Bookland::ISBN.new(isbn13).valid?.should be_true
124
+ ISBN.new(isbn13).valid?.should be_true
98
125
  end
99
126
  end
100
127
 
101
- it "does not validate if seed looks like an ISBN-13 but has an invalid check digit" do
128
+ it "does not validate if the 13-digit seed has an invalid check digit" do
102
129
  isbns do |isbn10, isbn13|
103
130
  invalid = isbn13.gsub(/(.)$/, "#{(isbn13.split(//).last.to_i - 2) % 10}")
104
- Bookland::ISBN.new(invalid).valid?.should be_false
131
+ ISBN.new(invalid).valid?.should be_false
105
132
  end
106
133
  end
107
134
 
108
- it "does not validate if seed looks like an ISBN-10 but has an invalid check digit" do
135
+ it "does not validate if the 10-digit seed has an invalid check digit" do
109
136
  isbns do |isbn10, isbn13|
110
137
  invalid = isbn10.gsub(/(.)$/, "#{(isbn10.split(//).last.to_i - 2) % 10}")
111
- Bookland::ISBN.new(invalid).valid?.should be_false
138
+ ISBN.new(invalid).valid?.should be_false
112
139
  end
113
140
  end
114
141
 
115
142
  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 }
143
+ ['foo', 1, '', nil].each { |seed| ISBN.new(seed).valid?.should be_false }
117
144
  end
118
145
  end
119
146
 
120
- context "#to_s" do
121
- it "casts as string" do
122
- Bookland::ISBN.new('0262011530').to_s.should eql '0262011530'
147
+ describe "#to_s" do
148
+ it "casts to string" do
149
+ ISBN.new('0262011530').to_s.should eql '0262011530'
123
150
  end
124
151
 
125
- it "casts as string and hyphenate an ISBN-13" do
126
- Bookland::ISBN.new("9780485113358").to_s(3, 10).should eql '978-0485113358'
152
+ it "casts to string and hyphenates a thirteen-digit ISBN" do
153
+ ISBN.new('9780485113358').to_s(3, 10).should eql '978-0485113358'
127
154
  end
128
155
 
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'
156
+ it "casts to string and hyphenate a ten-digit ISBN" do
157
+ ISBN.new('048511335X').to_s(1, 3, 5, 1).should eql '0-485-11335-X'
131
158
  end
132
159
 
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 }
160
+ it "returns false if ISBN is not valid" do
161
+ ['foo', 1, '', nil].each { |seed| ISBN.new(seed).to_s.should be_false }
135
162
  end
136
163
  end
137
164
  end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bookland do
4
+ it "includes itself in the global namespace" do
5
+ defined?(ISBN).should eql 'constant'
6
+ end
7
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bookland
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 0
10
- version: 1.0.0
9
+ - 1
10
+ version: 1.0.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Paper Cavalier
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-03 00:00:00 +00:00
18
+ date: 2011-03-17 00:00:00 +00:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -34,6 +34,22 @@ dependencies:
34
34
  version: 2.5.0
35
35
  type: :development
36
36
  version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rocco
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 7
46
+ segments:
47
+ - 0
48
+ - 6
49
+ - 0
50
+ version: 0.6.0
51
+ type: :development
52
+ version_requirements: *id002
37
53
  description: Bookland is an ISBN class in Ruby.
38
54
  email: code@papercavalier.com
39
55
  executables: []
@@ -47,17 +63,16 @@ files:
47
63
  - .rspec
48
64
  - .rvmrc
49
65
  - Gemfile
50
- - Gemfile.lock
51
66
  - History.md
52
67
  - LICENSE
53
68
  - README.md
54
69
  - Rakefile
55
- - VERSION
56
70
  - bookland.gemspec
57
71
  - lib/bookland.rb
58
72
  - lib/bookland/isbn.rb
59
73
  - lib/bookland/version.rb
60
74
  - spec/bookland/isbn_spec.rb
75
+ - spec/bookland_spec.rb
61
76
  - spec/fixtures/isbn
62
77
  - spec/spec_helper.rb
63
78
  has_rdoc: true
@@ -96,5 +111,6 @@ specification_version: 3
96
111
  summary: An ISBN class in Ruby
97
112
  test_files:
98
113
  - spec/bookland/isbn_spec.rb
114
+ - spec/bookland_spec.rb
99
115
  - spec/fixtures/isbn
100
116
  - spec/spec_helper.rb
data/Gemfile.lock DELETED
@@ -1,24 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- bookland (1.0.0)
5
-
6
- GEM
7
- remote: http://rubygems.org/
8
- specs:
9
- diff-lcs (1.1.2)
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)
18
-
19
- PLATFORMS
20
- ruby
21
-
22
- DEPENDENCIES
23
- bookland!
24
- rspec (~> 2.5.0)
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.3.1