todo-void 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/bin/t ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../lib/todo_void'
3
+
4
+ puts TodoVoid.execute(ARGV)
@@ -0,0 +1,23 @@
1
+ class StatusChangesInteractor
2
+ def initialize(store = TodoStore.new)
3
+ @store = store
4
+ @list = @store.read
5
+ end
6
+
7
+ def finish_todo(hash)
8
+ change_todo_status(hash, :finished)
9
+ end
10
+
11
+ def start_todo(hash)
12
+ change_todo_status(hash, :started)
13
+ end
14
+
15
+ private
16
+ def change_todo_status(hash, status)
17
+ todo = @list.find(hash)
18
+ @list.remove(todo)
19
+ todo.status = status
20
+ @list.add(todo)
21
+ @store.save(@list)
22
+ end
23
+ end
@@ -0,0 +1,29 @@
1
+ require_relative '../lib/todo_store'
2
+
3
+ class TodoInteractor
4
+ def initialize(store = TodoStore.new)
5
+ @store = store
6
+ @list = @store.read
7
+ end
8
+
9
+ def add_todo(description)
10
+ @list.add(Todo.new(description))
11
+ save_list
12
+ end
13
+
14
+ def delete_todo(hash)
15
+ @list.remove(hash)
16
+ save_list
17
+ end
18
+
19
+ def list_all
20
+ todos = []
21
+ @list.todo.each do |id, todo| todos << todo end
22
+ todos
23
+ end
24
+
25
+ private
26
+ def save_list
27
+ @store.save(@list)
28
+ end
29
+ end
data/lib/todo.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'openssl'
2
+
3
+ class Todo
4
+ attr_reader :description
5
+ attr_accessor :status
6
+
7
+ def initialize(description)
8
+ @description = description
9
+ @status = :pending
10
+ end
11
+
12
+ def id
13
+ description_hash = OpenSSL::Digest::SHA1.new(@description)
14
+ description_hash = description_hash.hexdigest
15
+ description_hash.slice(0..5)
16
+ end
17
+ end
data/lib/todo_list.rb ADDED
@@ -0,0 +1,22 @@
1
+ class TodoList
2
+ attr_reader :todo
3
+
4
+ def initialize
5
+ @todo = {}
6
+ end
7
+
8
+ def add(todo)
9
+ @todo.store(todo.id, todo)
10
+ end
11
+
12
+ def find(search)
13
+ @todo.each do |id, todo|
14
+ return todo if /^#{search}/.match id
15
+ end
16
+ nil
17
+ end
18
+
19
+ def remove(hash)
20
+ @todo.delete(hash)
21
+ end
22
+ end
@@ -0,0 +1,30 @@
1
+ require_relative "../lib/todo_view"
2
+
3
+ class TodoListView
4
+ def initialize(todos)
5
+ @todos = todos
6
+ end
7
+
8
+ def render
9
+ @output = ""
10
+ render_todo_by_status(:started)
11
+ render_todo_by_status(:pending)
12
+ render_todo_by_status(:finished)
13
+ @output
14
+ end
15
+
16
+ private
17
+ def render_todo_by_status(status)
18
+ todos_by_status(status).each { |todo| render_todo(todo) }
19
+ end
20
+
21
+ def todos_by_status(status)
22
+ @todos.reject {|todo| todo.status != status}
23
+ end
24
+
25
+ def render_todo(todos)
26
+ @output += TodoView.new(todos).render
27
+ @output += "\n"
28
+ end
29
+ end
30
+
data/lib/todo_store.rb ADDED
@@ -0,0 +1,37 @@
1
+ require_relative "./todo_list"
2
+ require_relative './todo'
3
+ require 'fileutils'
4
+
5
+ class TodoStore
6
+ def read
7
+ todo_list = TodoList.new
8
+
9
+ FileUtils.touch(todo_file)
10
+ file_content = File.readlines(todo_file)
11
+
12
+ file_content.each do |line|
13
+ line = line.gsub("\n", "")
14
+ status, description = line.split "||"
15
+ todo = Todo.new(description)
16
+ todo.status = status.to_sym
17
+ todo_list.add todo
18
+ end
19
+
20
+ todo_list
21
+ end
22
+
23
+ def save(list)
24
+ seriaized_todos = ""
25
+ todos = list.todo
26
+ todos.each do |id, todo|
27
+ seriaized_todos += "#{todo.status}||#{todo.description}\n"
28
+ end
29
+
30
+ File.write(todo_file, seriaized_todos)
31
+ end
32
+
33
+ private
34
+ def todo_file
35
+ Dir.home + '/.todos'
36
+ end
37
+ end
data/lib/todo_view.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'rainbow'
2
+
3
+ class TodoView
4
+ def initialize(todo)
5
+ @todo = todo
6
+ end
7
+
8
+ def render
9
+ if @todo.status == :finished
10
+ "#{@todo.id} #{@todo.description}".foreground(:black)
11
+ elsif @todo.status == :started
12
+ "#{@todo.id.foreground(:green)} #{@todo.description}"
13
+ else
14
+ "#{@todo.id.foreground(:yellow)} #{@todo.description}"
15
+ end
16
+ end
17
+ end
data/lib/todo_void.rb ADDED
@@ -0,0 +1,26 @@
1
+ require_relative '../interactors/todo_interactor.rb'
2
+ require_relative '../interactors/status_changes_interactor.rb'
3
+
4
+ class TodoVoid
5
+ def self.execute(args)
6
+ output = ""
7
+
8
+ if args[0] == "-d"
9
+ TodoInteractor.new.delete_todo(args[1])
10
+ elsif args[0] == "-f"
11
+ StatusChangesInteractor.new.finish_todo(args[1])
12
+ elsif args[0] == "-s"
13
+ StatusChangesInteractor.new.start_todo(args[1])
14
+ elsif args[0] == "--help"
15
+ output = "Help:\nt 'Mowing the lawn' in order to create a todo\n-f ID to finish a todo\n-d ID to delete a todo"
16
+ elsif args[0]
17
+ TodoInteractor.new.add_todo(args[0])
18
+ else
19
+ require_relative './todo_list_view.rb'
20
+ todos = TodoInteractor.new.list_all
21
+ view = TodoListView.new(todos)
22
+ output = view.render
23
+ end
24
+ output
25
+ end
26
+ end
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: todo-void
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Robert Curth
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-07-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rainbow
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ description: A simple app to manage todos
31
+ email: robert@rocu.de
32
+ executables:
33
+ - t
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - lib/todo.rb
38
+ - lib/todo_list.rb
39
+ - lib/todo_list_view.rb
40
+ - lib/todo_store.rb
41
+ - lib/todo_view.rb
42
+ - lib/todo_void.rb
43
+ - bin/t
44
+ - interactors/status_changes_interactor.rb
45
+ - interactors/todo_interactor.rb
46
+ homepage: http://rubygems.org/gems/todo-void
47
+ licenses: []
48
+ post_install_message:
49
+ rdoc_options: []
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ requirements: []
65
+ rubyforge_project:
66
+ rubygems_version: 1.8.24
67
+ signing_key:
68
+ specification_version: 3
69
+ summary: Todo-Void!
70
+ test_files: []