my_todo 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/db/migrate/20161003121448_create_notes.rb +9 -0
- data/lib/db/schema.rb +9 -1
- data/lib/db/todos_development.sqlite3 +0 -0
- data/lib/db/todos_test.sqlite3 +0 -0
- data/lib/item.rb +4 -0
- data/lib/my_todo/templates/output.erb +6 -0
- data/lib/my_todo/version.rb +1 -1
- data/lib/my_todo.rb +33 -5
- data/lib/note.rb +6 -0
- data/spec/actions/create_spec.rb +3 -3
- data/spec/actions/note_spec.rb +27 -0
- data/spec/actions/rm_note_spec.rb +26 -0
- data/spec/actions/search_spec.rb +2 -2
- data/spec/actions/{add_tag_spec.rb → tag_spec.rb} +3 -3
- data/spec/models/item_spec.rb +4 -3
- data/spec/models/note_spec.rb +6 -0
- metadata +13 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d43fa975defc5843e115f0d8258086d03bebf62
|
4
|
+
data.tar.gz: 8f8d18f7d47fcceade42a7d8bd22fcfce99e81f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed29e73bb98c43586922c64f549607d8fcff148a708cb5a91c3e5e74e6b7d5fa442d8300138b65ad4d598c1e22684983ea6ce851d21d48c2a6d62c5e10b14347
|
7
|
+
data.tar.gz: 5258f53446840229714aec2d8d394753e2587353f56e324978977373d8193efd822fea920d2a68b72b1a75e8baf464a8411c83bab81521e294a9867806ee4ca4
|
data/lib/db/schema.rb
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
#
|
11
11
|
# It's strongly recommended that you check this file into your version control system.
|
12
12
|
|
13
|
-
ActiveRecord::Schema.define(version:
|
13
|
+
ActiveRecord::Schema.define(version: 20161003121448) do
|
14
14
|
|
15
15
|
create_table "items", force: :cascade do |t|
|
16
16
|
t.string "body"
|
@@ -19,6 +19,14 @@ ActiveRecord::Schema.define(version: 20160913134610) do
|
|
19
19
|
t.datetime "updated_at", null: false
|
20
20
|
end
|
21
21
|
|
22
|
+
create_table "notes", force: :cascade do |t|
|
23
|
+
t.integer "item_id"
|
24
|
+
t.text "body"
|
25
|
+
t.datetime "created_at", null: false
|
26
|
+
t.datetime "updated_at", null: false
|
27
|
+
t.index ["item_id"], name: "index_notes_on_item_id"
|
28
|
+
end
|
29
|
+
|
22
30
|
create_table "stubs", force: :cascade do |t|
|
23
31
|
t.integer "item_id"
|
24
32
|
t.integer "tag_id"
|
Binary file
|
data/lib/db/todos_test.sqlite3
CHANGED
Binary file
|
data/lib/item.rb
CHANGED
@@ -8,6 +8,10 @@ class Item < ActiveRecord::Base
|
|
8
8
|
# @note Item.first.tags
|
9
9
|
# @note destroys associated stubs/tags when deleted
|
10
10
|
has_many :tags, through: :stubs, dependent: :destroy
|
11
|
+
# ActiveRecord association to notes
|
12
|
+
# @note Item.first.notes
|
13
|
+
# @note destroys associated notes when deleted
|
14
|
+
has_many :notes, dependent: :destroy
|
11
15
|
# ActiveModel validation to ensure body is present
|
12
16
|
validates :body, presence: true
|
13
17
|
end
|
data/lib/my_todo/version.rb
CHANGED
data/lib/my_todo.rb
CHANGED
@@ -11,6 +11,7 @@ require_relative 'ar_base'
|
|
11
11
|
require_relative 'item'
|
12
12
|
require_relative 'stub'
|
13
13
|
require_relative 'tag'
|
14
|
+
require_relative 'note'
|
14
15
|
|
15
16
|
module MyTodo
|
16
17
|
# Todo tasks using thor gem
|
@@ -58,7 +59,7 @@ module MyTodo
|
|
58
59
|
end
|
59
60
|
end
|
60
61
|
|
61
|
-
desc "update --id=
|
62
|
+
desc "update --id=TODO_ID --body='some text' [--done=true]", 'update an existing todo'
|
62
63
|
option :id
|
63
64
|
option :body
|
64
65
|
option :done
|
@@ -74,7 +75,7 @@ module MyTodo
|
|
74
75
|
end
|
75
76
|
end
|
76
77
|
|
77
|
-
desc 'delete(
|
78
|
+
desc 'delete(TODO_ID)', 'destroy a todo'
|
78
79
|
def delete(id)
|
79
80
|
begin
|
80
81
|
item = Item.find_by_id(id)
|
@@ -93,10 +94,10 @@ module MyTodo
|
|
93
94
|
items.each {|i| output i}
|
94
95
|
end
|
95
96
|
|
96
|
-
desc "
|
97
|
+
desc "tag --id=TODO_ID --tag=TAG_NAME", 'add a tag to an existing todo'
|
97
98
|
option :id
|
98
99
|
option :tag
|
99
|
-
def
|
100
|
+
def tag
|
100
101
|
begin
|
101
102
|
item = Item.where(id: options[:id]).first
|
102
103
|
item.tags.create!(name: options[:tag])
|
@@ -105,7 +106,7 @@ module MyTodo
|
|
105
106
|
end
|
106
107
|
end
|
107
108
|
|
108
|
-
desc 'rm_tag --
|
109
|
+
desc 'rm_tag --id=TODO_ID --tag=TAG_NAME', 'remove tag from an existing todo'
|
109
110
|
option :id
|
110
111
|
option :tag
|
111
112
|
def rm_tag
|
@@ -117,6 +118,33 @@ module MyTodo
|
|
117
118
|
say e.message
|
118
119
|
end
|
119
120
|
end
|
121
|
+
|
122
|
+
desc "note --id=TODO_ID --body='text'", 'adds note to existing item'
|
123
|
+
option :id
|
124
|
+
option :body
|
125
|
+
def note
|
126
|
+
begin
|
127
|
+
item = Item.where(id: options[:id]).first
|
128
|
+
item.notes.create(body: options[:body])
|
129
|
+
output item.reload
|
130
|
+
rescue Exception => e
|
131
|
+
say e.message
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
desc 'rm_note --id=TODO_ID --noteid=NOTE_ID', 'remove note for exsiting item'
|
136
|
+
option :id
|
137
|
+
option :noteid
|
138
|
+
def rm_note
|
139
|
+
begin
|
140
|
+
item = Item.where(id: options[:id]).first
|
141
|
+
item.notes.where(id: options[:noteid]).first.destroy!
|
142
|
+
output item.reload
|
143
|
+
rescue Exception => e
|
144
|
+
say e.message
|
145
|
+
end
|
146
|
+
end
|
120
147
|
end
|
121
148
|
end
|
149
|
+
|
122
150
|
MyTodo::Todo.start(ARGV)
|
data/lib/note.rb
ADDED
data/spec/actions/create_spec.rb
CHANGED
@@ -21,7 +21,7 @@ describe MyTodo do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'displays the created todo item' do
|
24
|
-
expect{MyTodo::Todo.start(%w(create --body=wierdness_of_text))}.to output("ToDo CREATED!\n\nID: 1\nToDo: wierdness_of_text\nTags: default\nComplete: false\n").to_stdout
|
24
|
+
expect{MyTodo::Todo.start(%w(create --body=wierdness_of_text))}.to output("ToDo CREATED!\n\nID: 1\nToDo: wierdness_of_text\nTags: default\nComplete: false\n\n").to_stdout
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -31,7 +31,7 @@ describe MyTodo do
|
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'displays the created todo item with tag' do
|
34
|
-
expect{MyTodo::Todo.start(%w(create --body=wierdness_of_text --tags=tag1))}.to output("ToDo CREATED!\n\nID: 1\nToDo: wierdness_of_text\nTags: tag1\nComplete: false\n").to_stdout
|
34
|
+
expect{MyTodo::Todo.start(%w(create --body=wierdness_of_text --tags=tag1))}.to output("ToDo CREATED!\n\nID: 1\nToDo: wierdness_of_text\nTags: tag1\nComplete: false\n\n").to_stdout
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -44,7 +44,7 @@ describe MyTodo do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'displays the created to item with complete set to true' do
|
47
|
-
expect{MyTodo::Todo.start(%w[create --body=wierdness_of_text --done=true])}.to output("ToDo CREATED!\n\nID: 1\nToDo: wierdness_of_text\nTags: default\nComplete: true\n").to_stdout
|
47
|
+
expect{MyTodo::Todo.start(%w[create --body=wierdness_of_text --done=true])}.to output("ToDo CREATED!\n\nID: 1\nToDo: wierdness_of_text\nTags: default\nComplete: true\n\n").to_stdout
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MyTodo do
|
4
|
+
describe 'note' do
|
5
|
+
before {@todo = FactoryGirl.create(:item)}
|
6
|
+
context 'successful creation' do
|
7
|
+
it 'creates a note' do
|
8
|
+
expect{MyTodo::Todo.start(%W[note --id=#{@todo.id} --body=note_text])}.to change{Note.count}.by(1)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'associates note to item' do
|
12
|
+
MyTodo::Todo.start(%W[note --id=#{@todo.id} --body=note_text])
|
13
|
+
expect(@todo.notes.size).to eq 1
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'displays item with notes' do
|
17
|
+
expect{MyTodo::Todo.start(%W[note --id=#{@todo.id} --body=note_text])}.to output("\nID: 1\nToDo: Some Body\nTags: \nComplete: \n\nNotes:\n\n1: note_text\n\n\n").to_stdout
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'unsuccessful creation' do
|
22
|
+
it 'returns exception if note is not found' do
|
23
|
+
expect{MyTodo::Todo.start(%W[note --id=#{@todo.id + 1}])}.to output("undefined method `notes' for nil:NilClass\n").to_stdout
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MyTodo do
|
4
|
+
describe 'rm_note' do
|
5
|
+
before do
|
6
|
+
@todo = FactoryGirl.create :item
|
7
|
+
@todo.notes.create(body: 'Body of text')
|
8
|
+
end
|
9
|
+
|
10
|
+
context 'a successful delete' do
|
11
|
+
before {MyTodo::Todo.start(%W[rm_note --id=#{@todo.id} --noteid=#{@todo.notes.first.id}])}
|
12
|
+
subject {@todo.reload.notes}
|
13
|
+
it {is_expected.to eq []}
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'an unsuccessful delete' do
|
17
|
+
it 'returns exception if item is not found' do
|
18
|
+
expect {MyTodo::Todo.start(%W[rm_note --id=#{@todo.id + 1} --noteid=#{@todo.notes.first.id}])}.to output("undefined method `notes' for nil:NilClass\n").to_stdout
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'returns exception if note is not found' do
|
22
|
+
expect {MyTodo::Todo.start(%W[rm_note --id=#{@todo.id} --noteid=#{@todo.notes.first.id + 1}])}.to output("undefined method `destroy!' for nil:NilClass\n").to_stdout
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/spec/actions/search_spec.rb
CHANGED
@@ -10,11 +10,11 @@ describe MyTodo do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'finds todo item by id' do
|
13
|
-
expect{MyTodo::Todo.start( %W(search #{@todo3.id} ))}.to output("ToDos FOUND: 1\n\nID: 3\nToDo: always\nTags: \nComplete: \n").to_stdout
|
13
|
+
expect{MyTodo::Todo.start( %W(search #{@todo3.id} ))}.to output("ToDos FOUND: 1\n\nID: 3\nToDo: always\nTags: \nComplete: \n\n").to_stdout
|
14
14
|
end
|
15
15
|
|
16
16
|
it 'finds todo item by body' do
|
17
|
-
expect{MyTodo::Todo.start( %w[search nfl])}.to output("ToDos FOUND: 1\n\nID: 1\nToDo: nfl\nTags: \nComplete: \n").to_stdout
|
17
|
+
expect{MyTodo::Todo.start( %w[search nfl])}.to output("ToDos FOUND: 1\n\nID: 1\nToDo: nfl\nTags: \nComplete: \n\n").to_stdout
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -5,7 +5,7 @@ describe MyTodo do
|
|
5
5
|
context 'a successful add' do
|
6
6
|
before do
|
7
7
|
@todo = FactoryGirl.create(:item)
|
8
|
-
MyTodo::Todo.start(%W[
|
8
|
+
MyTodo::Todo.start(%W[tag --id=#{@todo.id} --tag=tag1])
|
9
9
|
end
|
10
10
|
subject {@todo.tags}
|
11
11
|
it {is_expected.to include(Tag.first)}
|
@@ -15,11 +15,11 @@ describe MyTodo do
|
|
15
15
|
before {@todo = FactoryGirl.create(:item)}
|
16
16
|
|
17
17
|
it 'returns a validation error when tag name is missing' do
|
18
|
-
expect{MyTodo::Todo.start(%W[
|
18
|
+
expect{MyTodo::Todo.start(%W[tag --id=#{@todo.id} --tag=])}.to output("Validation failed: Name can't be blank\n").to_stdout
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'returns nil exception' do
|
22
|
-
expect{MyTodo::Todo.start(%W[
|
22
|
+
expect{MyTodo::Todo.start(%W[tag --id=#{@todo.id + 1} --tag=tag1])}.to output("undefined method `tags' for nil:NilClass\n").to_stdout
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
data/spec/models/item_spec.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Item, type: :model do
|
4
|
-
it {should have_many
|
5
|
-
it {should have_many
|
6
|
-
it {should
|
4
|
+
it {should have_many :stubs}
|
5
|
+
it {should have_many :tags}
|
6
|
+
it {should have_many :notes}
|
7
|
+
it {should validate_presence_of :body}
|
7
8
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: my_todo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-10-
|
11
|
+
date: 2016-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -214,7 +214,9 @@ files:
|
|
214
214
|
- lib/db/migrate/20160912172429_create_items.rb
|
215
215
|
- lib/db/migrate/20160913134552_create_tags.rb
|
216
216
|
- lib/db/migrate/20160913134610_create_stubs.rb
|
217
|
+
- lib/db/migrate/20161003121448_create_notes.rb
|
217
218
|
- lib/db/schema.rb
|
219
|
+
- lib/db/todos_development.sqlite3
|
218
220
|
- lib/db/todos_test.sqlite3
|
219
221
|
- lib/item.rb
|
220
222
|
- lib/my_todo.rb
|
@@ -222,17 +224,21 @@ files:
|
|
222
224
|
- lib/my_todo/templates/output.erb
|
223
225
|
- lib/my_todo/templates/standalone_migrations.yml.erb
|
224
226
|
- lib/my_todo/version.rb
|
227
|
+
- lib/note.rb
|
225
228
|
- lib/setup.rb
|
226
229
|
- lib/stub.rb
|
227
230
|
- lib/tag.rb
|
228
231
|
- my_todo.gemspec
|
229
|
-
- spec/actions/add_tag_spec.rb
|
230
232
|
- spec/actions/create_spec.rb
|
231
233
|
- spec/actions/delete_spec.rb
|
234
|
+
- spec/actions/note_spec.rb
|
235
|
+
- spec/actions/rm_note_spec.rb
|
232
236
|
- spec/actions/rm_tag_spec.rb
|
233
237
|
- spec/actions/search_spec.rb
|
238
|
+
- spec/actions/tag_spec.rb
|
234
239
|
- spec/actions/update_spec.rb
|
235
240
|
- spec/models/item_spec.rb
|
241
|
+
- spec/models/note_spec.rb
|
236
242
|
- spec/models/stub_spec.rb
|
237
243
|
- spec/models/tag_spec.rb
|
238
244
|
- spec/spec_helper.rb
|
@@ -263,13 +269,16 @@ signing_key:
|
|
263
269
|
specification_version: 4
|
264
270
|
summary: A basic todo application with tags.
|
265
271
|
test_files:
|
266
|
-
- spec/actions/add_tag_spec.rb
|
267
272
|
- spec/actions/create_spec.rb
|
268
273
|
- spec/actions/delete_spec.rb
|
274
|
+
- spec/actions/note_spec.rb
|
275
|
+
- spec/actions/rm_note_spec.rb
|
269
276
|
- spec/actions/rm_tag_spec.rb
|
270
277
|
- spec/actions/search_spec.rb
|
278
|
+
- spec/actions/tag_spec.rb
|
271
279
|
- spec/actions/update_spec.rb
|
272
280
|
- spec/models/item_spec.rb
|
281
|
+
- spec/models/note_spec.rb
|
273
282
|
- spec/models/stub_spec.rb
|
274
283
|
- spec/models/tag_spec.rb
|
275
284
|
- spec/spec_helper.rb
|