booklist 0.0.1 → 0.0.7

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: aa6eb403053898f7677b45118fb2ae78fe33c6fe
4
+ data.tar.gz: 3c3a141cbb261f36115e67b51253ccf597534445
5
+ SHA512:
6
+ metadata.gz: 6f765a2a23c68fefe682ccae5c9665879f4a68fc44f7a28a46961e6cb5f263e024d4f2c84ee8e180072778658ab31a1065acaa90417def68ca4aea5af3ecac97
7
+ data.tar.gz: f4cbc5aa0b7cac9be2f71bc174f8a0b29e8140c37ee6de592ecb5dfa45cd2c98b1be42069ab7f2fca2ca23bcf32c49f48cd3c5e029d6e1baa841a965059f5753
data/bin/booklist CHANGED
@@ -23,15 +23,17 @@
23
23
  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
24
 
25
25
  require 'optparse'
26
+ require 'optparse/date'
26
27
  require 'ostruct'
27
28
  require 'rubygems'
28
29
  require 'active_record'
29
30
  require 'yaml'
30
31
  require 'pathname'
32
+ require 'booklist'
33
+ require 'date'
31
34
 
32
35
  module Booklist
33
36
  options = OpenStruct.new
34
- STATES = { "read" => "Mark as read", "reading" => "Mark as currently reading", "toread" => "Mark as to-read" }
35
37
  options.act_num = 0
36
38
  usage = nil
37
39
  OptionParser.new do |opts|
@@ -95,6 +97,10 @@ module Booklist
95
97
  options.tags = tags
96
98
  end
97
99
 
100
+ opts.on("--date_read DATE", Date, "Date read (eg 2014-02-14)") do |dr|
101
+ options.date_read = dr
102
+ end
103
+
98
104
  opts.on("--id ID", Integer, "Book ID number") do |id|
99
105
  options.id = id
100
106
  end
@@ -107,7 +113,7 @@ module Booklist
107
113
  # options.config_file = file
108
114
  #end
109
115
 
110
- opts.on("--debug", "Debug node") do
116
+ opts.on("--debug", "Debug mode") do
111
117
  options.debug = true
112
118
  end
113
119
 
@@ -116,7 +122,7 @@ module Booklist
116
122
  end
117
123
 
118
124
  opts.on_tail("--version", "Get the booklist version") do
119
- puts Booklist::version
125
+ puts Booklist::VERSION
120
126
  exit
121
127
  end
122
128
 
@@ -149,43 +155,6 @@ module Booklist
149
155
  ActiveRecord::Migrator.migrate('db/migrate')
150
156
  end
151
157
 
152
- class Book < ActiveRecord::Base
153
- has_many :taggings
154
- has_many :tags, through: :taggings #, source: "book_id"
155
- validates :title, presence: true
156
-
157
- def cli_display
158
- puts "ID: #{id}\n"
159
- puts "Title: #{title}\n"
160
- puts "Author: #{author}\n" if author
161
- puts "Additional authors: #{addn_authors}" if addn_authors
162
- puts "State: #{state}" if state
163
- puts "Tags: #{tag_list}\n" if tags.count > 0
164
- puts "\n"
165
- end
166
-
167
- def tag_list
168
- #put tags
169
- tags.map(&:name).join(", ")
170
- end
171
-
172
- def tag_list=(names)
173
- self.tags = names.map do |n|
174
- Tag.where(name: n.strip).first_or_create!
175
- end
176
- end
177
- end
178
-
179
- class Tag < ActiveRecord::Base
180
- has_many :taggings
181
- has_many :books, through: :taggings #, source: "tag_id"
182
- end
183
-
184
- class Tagging < ActiveRecord::Base
185
- belongs_to :tag
186
- belongs_to :book
187
- end
188
-
189
158
  if options.act_num = 1
190
159
  if options.action == :add
191
160
  if !options.title || options.title == ""
@@ -196,8 +165,9 @@ module Booklist
196
165
  book = Book.new do |b|
197
166
  b.title = options.title
198
167
  b.author = options.author if options.author
199
- b.addn_authors if options.addn_authors
168
+ b.addn_authors = options.addn_authors if options.addn_authors
200
169
  b.state = options.state if options.state
170
+ b.date_read = options.date_read if options.date_read
201
171
  b.tag_list = options.tags if options.tags
202
172
  end
203
173
  book.save
@@ -209,6 +179,7 @@ module Booklist
209
179
  book.author = options.author if options.author
210
180
  book.addn_authors = options.addn_authors if options.addn_authors
211
181
  book.state = options.state if options.state
182
+ book.date_read = options.date_read if options.date_read
212
183
  book.tag_list = options.tags if options.tags
213
184
  book.save
214
185
  book.cli_display
@@ -226,17 +197,18 @@ module Booklist
226
197
  puts "No book with ID of #{options.id} was found"
227
198
  end
228
199
  elsif options.action == :search
229
- books = Book.where(["title LIKE ?", "%#{options.title}%"]) if options.title
230
- # TODO - books << Book.where(["author LIKE ? or addn_authors LIKE ?", "%#{options.author}%", "%#{options.author}%"]) if options.author
231
- # TODO show unique records
232
- books.each { |b|
233
- b.cli_display
234
- }
200
+ books = []
201
+ books += Book.where(["title LIKE ?", "%#{options.title}%"]).to_a if options.title
202
+ books += Book.where(["author LIKE ? or addn_authors LIKE ?", "%#{options.author}%", "%#{options.author}%"]).to_a if options.author
203
+ books += Book.where(["author LIKE ? or addn_authors LIKE ?", "%#{options.addn_authors}%", "%#{options.addn_authors}%"]).to_a if options.addn_authors
204
+ books += Book.where(["state = ?", "%#{options.state}%"]).to_a if options.state
205
+ books.uniq!
206
+ books.sort!{ |a, b| a.id <=> b.id}
207
+ books.select!{ |b| b.state == options.state} if options.state
208
+ books.each { |b| b.cli_display }
235
209
  elsif options.action == :list
236
210
  books = Book.all
237
- books.each{ |b|
238
- b.cli_display
239
- }
211
+ books.each{ |b| b.cli_display }
240
212
  end
241
213
  elsif options.act_num > 1
242
214
  puts "Please only use one action."
data/booklist.gemspec CHANGED
@@ -20,4 +20,5 @@ Gem::Specification.new do |gem|
20
20
  gem.required_ruby_version = '>= 1.9'
21
21
  gem.add_dependency 'sqlite3'
22
22
  gem.add_dependency 'activerecord', '~> 4.0.0'
23
+ gem.add_development_dependency 'rspec'
23
24
  end
@@ -0,0 +1,29 @@
1
+ module Booklist
2
+ class Book < ActiveRecord::Base
3
+ has_many :taggings
4
+ has_many :tags, through: :taggings #, source: "book_id"
5
+ validates :title, presence: true
6
+
7
+ def cli_display
8
+ puts "ID: #{id}\n"
9
+ puts "Title: #{title}\n"
10
+ puts "Author: #{author}\n" if author
11
+ puts "Additional authors: #{addn_authors}" if addn_authors
12
+ puts "State: #{state}" if state
13
+ puts "Date Read: #{date_read.to_date.to_s}" if date_read
14
+ puts "Tags: #{tag_list}\n" if tags.count > 0
15
+ puts "\n"
16
+ end
17
+
18
+ def tag_list
19
+ #put tags
20
+ tags.map(&:name).join(", ")
21
+ end
22
+
23
+ def tag_list=(names)
24
+ self.tags = names.map do |n|
25
+ Tag.where(name: n.strip).first_or_create!
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ module Booklist
2
+ class Tag < ActiveRecord::Base
3
+ has_many :taggings
4
+ has_many :books, through: :taggings #, source: "tag_id"
5
+ end
6
+
7
+ class Tagging < ActiveRecord::Base
8
+ belongs_to :tag
9
+ belongs_to :book
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module Booklist
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.7"
3
3
  end
data/lib/booklist.rb ADDED
@@ -0,0 +1,3 @@
1
+ require 'booklist/version'
2
+ require 'booklist/book'
3
+ require 'booklist/tag'
data/spec/book_spec.rb ADDED
@@ -0,0 +1,61 @@
1
+ require 'support/active_record'
2
+ require 'booklist/book'
3
+
4
+ module Booklist
5
+ describe Book do
6
+ it "requires a name" do
7
+ subject.title = ""
8
+ expect(subject).to have_at_least(1).error_on(:title)
9
+ subject.title = "The Importance of Living"
10
+ expect(subject).to be_valid
11
+ end
12
+
13
+ context "simple book" do
14
+ let(:book) {
15
+ Book.new do |b|
16
+ b.title = "The Epic of Gilgamesh"
17
+ end
18
+ }
19
+
20
+ it "has no author" do
21
+ expect(book.author).to be_nil
22
+ end
23
+ it "has no additional authors" do
24
+ expect(book.addn_authors).to be_nil
25
+ end
26
+ it "has no state" do
27
+ expect(book.state).to be_nil
28
+ end
29
+ it "is a valid record" do
30
+ expect(book).to be_valid
31
+ end
32
+ end
33
+
34
+ context "complex book" do
35
+ let(:book) {
36
+ Book.new do |b|
37
+ b.title = "Kareem"
38
+ b.author = "Kareem Abdul-Jabbar"
39
+ b.addn_authors = "Mignon McCarthy"
40
+ b.state = "read"
41
+ b.date_read = '2001-01-01'
42
+ end
43
+ }
44
+ it "has an author" do
45
+ expect(book.author).to eq "Kareem Abdul-Jabbar"
46
+ end
47
+ it "has an additional author" do
48
+ expect(book.addn_authors).to eq "Mignon McCarthy"
49
+ end
50
+ it "has a state" do
51
+ expect(book.state).to eq "read"
52
+ end
53
+ it "has a custom read date" do
54
+ expect(book.date_read).to eq '2001-01-01'
55
+ end
56
+ it "is a valid record" do
57
+ expect(book).to be_valid
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,26 @@
1
+ require 'active_record'
2
+ ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
3
+
4
+ I18n.enforce_available_locales = false
5
+
6
+ ActiveRecord::Migrator.up "db/migrate"
7
+
8
+ module ActiveModel::Validations
9
+ # Extension to enhance `should have` on AR Model instances. Calls
10
+ # model.valid? in order to prepare the object's errors object.
11
+ #
12
+ # You can also use this to specify the content of the error messages.
13
+ #
14
+ # @example
15
+ #
16
+ # model.should have(:no).errors_on(:attribute)
17
+ # model.should have(1).error_on(:attribute)
18
+ # model.should have(n).errors_on(:attribute)
19
+ #
20
+ # model.errors_on(:attribute).should include("can't be blank")
21
+ def errors_on(attribute)
22
+ self.valid?
23
+ [self.errors[attribute]].flatten.compact
24
+ end
25
+ alias :error_on :errors_on
26
+ end
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: booklist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 0.0.7
6
5
  platform: ruby
7
6
  authors:
8
7
  - Dafydd Crosby
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-10-08 00:00:00.000000000 Z
11
+ date: 2014-02-23 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: sqlite3
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
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: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: activerecord
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,11 +34,24 @@ dependencies:
38
34
  type: :runtime
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
40
  version: 4.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
46
55
  description: A book collection program
47
56
  email: dafydd@dafyddcrosby.com
48
57
  executables:
@@ -56,30 +65,36 @@ files:
56
65
  - bin/booklist
57
66
  - booklist.gemspec
58
67
  - db/migrate/001_initial.rb
68
+ - lib/booklist.rb
69
+ - lib/booklist/book.rb
70
+ - lib/booklist/tag.rb
59
71
  - lib/booklist/version.rb
72
+ - spec/book_spec.rb
73
+ - spec/support/active_record.rb
60
74
  homepage: https://github.com/dafyddcrosby/booklist
61
75
  licenses:
62
76
  - bsd
77
+ metadata: {}
63
78
  post_install_message:
64
79
  rdoc_options: []
65
80
  require_paths:
66
81
  - lib
67
82
  required_ruby_version: !ruby/object:Gem::Requirement
68
- none: false
69
83
  requirements:
70
- - - ! '>='
84
+ - - '>='
71
85
  - !ruby/object:Gem::Version
72
86
  version: '1.9'
73
87
  required_rubygems_version: !ruby/object:Gem::Requirement
74
- none: false
75
88
  requirements:
76
- - - ! '>='
89
+ - - '>='
77
90
  - !ruby/object:Gem::Version
78
91
  version: '0'
79
92
  requirements: []
80
93
  rubyforge_project:
81
- rubygems_version: 1.8.24
94
+ rubygems_version: 2.0.14
82
95
  signing_key:
83
- specification_version: 3
96
+ specification_version: 4
84
97
  summary: Booklist helps you keep a list of books you've read or want to read.
85
- test_files: []
98
+ test_files:
99
+ - spec/book_spec.rb
100
+ - spec/support/active_record.rb