my_todo 2.0.0 → 2.1.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.
- 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
|