rudoo 0.0.01

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # Rudoo
2
+
3
+ Rudoo is a command line tool written in ruby that allows you to manage local, project based todo lists.
4
+
5
+ ## Installation
6
+
7
+ Currently, I don't have a gem available for rudoo but that will change soon! I already have the structure ready, I just want to add a few more features before releasing.
8
+
9
+ ## Usage
10
+
11
+ TO BE ADDED
12
+
13
+ ## TODO LIST
14
+ *Items in bold are undone. Items in normal font are already completed*
15
+
16
+ * **Create function to allow bulk deletion.**
17
+ * **Think about ways to add remote hosting... Google Tasks?**
18
+ * **Create functions to allow holding and resuming of current projects**
19
+ * **Write tests.**
20
+ * **Add documentation.**
data/bin/rd ADDED
@@ -0,0 +1,179 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+
5
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'rudoo.rb'))
6
+
7
+ options = {}
8
+
9
+ opt_parser = OptionParser.new do |opt|
10
+ opt.banner = "Usage: rd COMMAND [OPTIONS]"
11
+ opt.separator ""
12
+ opt.separator "Commands"
13
+ opt.separator " init: initialize a new rudoo file architecture"
14
+ opt.separator ""
15
+ opt.separator "Options"
16
+
17
+ ## INIT SPECIFIC ##
18
+
19
+ opt.on("--reset","reset the file structure for rudoo") do |reset|
20
+ options[:reset] = true
21
+ end
22
+
23
+ opt.on("--destroy","remove the file structure for rudoo and do not initialize a new one.") do |destroy|
24
+ options[:destroy] = true
25
+ end
26
+
27
+ ## END ##
28
+
29
+ opt.on("-m", "--message MESSAGE", "message for a todo (what needs to be completed)") do |message|
30
+ options[:message] = message
31
+ end
32
+
33
+ opt.on("--id IDENTIFIER", "specify the id of a task") do |id|
34
+ options[:id] = id
35
+ end
36
+
37
+ opt.on("-p", "--priority PRIORITY", "specify the priority of a task") do |priority|
38
+ options[:priority] = priority
39
+ end
40
+
41
+ opt.on("-t", "--type TYPE", "specify the type of task (done, undone, or all)") do |type|
42
+ options[:type] = type
43
+ end
44
+
45
+ ## GIT SPECIFIC ##
46
+
47
+ opt.on("--commit", "make a new commit with the current task as the message") do |commit|
48
+ options[:commit] = true
49
+ end
50
+
51
+ ## To-MD SPECIFIC ##
52
+
53
+ opt.on("-f", "--file FILE", "destination to file you want to export .md list to") do |file|
54
+ options[:file] = file
55
+ end
56
+
57
+ ## END ##
58
+ end
59
+
60
+ opt_parser.parse!
61
+
62
+ reset = options[:reset] || false
63
+ destroy = options[:destroy] || false
64
+ message = options[:message] || nil
65
+ priority = options[:priority] || 0
66
+ id = options[:id] || nil
67
+ type = options[:type] || "undone"
68
+ commit = options[:commit] || false
69
+ file = options[:file] || false
70
+
71
+ case ARGV[0]
72
+ when "init"
73
+ Rd.new unless reset || destroy
74
+ Rd.reset if reset
75
+ Rd.destroy if destroy
76
+
77
+ when "add"
78
+ if message.nil?
79
+ puts "ERROR: Message required when adding a new task!"
80
+ puts ""
81
+ else
82
+ added = Rd.list.add(message, priority)
83
+
84
+ puts "Task successfully added!" if added.class == Rudoo::Task
85
+ end
86
+
87
+ when "edit"
88
+ puts "ERROR: At least one modification must be specified!" if message.nil? && priority.nil?
89
+
90
+ edit = Rd.list.edit(id, message, priority)
91
+
92
+ if edit.class == Rudoo::Task
93
+ puts "Task successfully edited!"
94
+ else
95
+ puts "Unable to find an objective with ID: #{id}"
96
+ end
97
+
98
+ when "list"
99
+ args = ARGV[1..-1] || []
100
+
101
+ Rd.list.gather(args, type)
102
+
103
+ when "tags"
104
+ Rd.list.tags(type)
105
+
106
+ when "people"
107
+ Rd.list.people(type)
108
+
109
+ when "promote"
110
+ if id.nil?
111
+ puts "ERROR: You must specify a task id to promote!"
112
+ else
113
+ puts "Task successfully promoted!" if Rd.list.promote(id)
114
+ end
115
+
116
+ when "demote"
117
+ if id.nil?
118
+ puts "ERROR: You must specify a task id to demote!"
119
+ else
120
+ puts "Task successfully demoted!" if Rd.list.demote(id)
121
+ end
122
+
123
+ when "projects"
124
+ Rd.list.projects(type)
125
+
126
+ when "complete"
127
+ if id.nil?
128
+ puts "ERROR: You must include a task id to mark as complete!"
129
+ else
130
+ puts "Task successfully marked as complete!" if Rd.list.complete(id)
131
+ end
132
+
133
+ when "open"
134
+ if id.nil?
135
+ puts "ERROR: You must specify a task id to open it!"
136
+ else
137
+ open = Rd.list.open(id)
138
+
139
+ if open
140
+ puts "Task successfully opened and marked incomplete!"
141
+ else
142
+ puts "ERROR: Unable to find task with id: #{id}!"
143
+ end
144
+ end
145
+
146
+ when "current"
147
+ if id.nil?
148
+ current = Rd.list.current
149
+
150
+ if current == false
151
+ puts "ERROR: You aren't currently working on anything!"
152
+ else
153
+ Rd.list.print_to_screen(current)
154
+ end
155
+ else
156
+ puts "Current task successfully changed!" if Rd.list.set_current(id)
157
+ end
158
+
159
+ when "delete"
160
+ if id.nil?
161
+ puts "ERROR: You must specify an id for the task you would like to delete!"
162
+ else
163
+ puts "Task successfully deleted!" if Rd.list.delete(id)
164
+ end
165
+
166
+ when "to-md"
167
+ if file
168
+ Rd.list.to_md(file, type)
169
+ else
170
+ puts "ERROR: No file specified to export to!"
171
+ end
172
+
173
+ when "git"
174
+ Rd.list.commit if commit
175
+ else
176
+ puts "Unknown command. See usage instructions:"
177
+ puts ""
178
+ puts opt_parser
179
+ end
data/lib/rudoo.rb ADDED
@@ -0,0 +1,27 @@
1
+ require "rubygems"
2
+ require "yaml"
3
+ require "fileutils"
4
+ require "digest/sha1"
5
+ require "chronic"
6
+
7
+ require File.expand_path(File.join(File.dirname(__FILE__), "rudoo", "storage.rb"))
8
+ require File.expand_path(File.join(File.dirname(__FILE__), "rudoo", "list.rb"))
9
+ require File.expand_path(File.join(File.dirname(__FILE__), "rudoo", "task.rb"))
10
+
11
+ class Rd
12
+ def initialize
13
+ Rudoo::Storage.new
14
+ end
15
+
16
+ def self.reset
17
+ Rudoo::Storage.reset
18
+ end
19
+
20
+ def self.destroy
21
+ Rudoo::Storage.destroy
22
+ end
23
+
24
+ def self.list
25
+ Rudoo::List.new
26
+ end
27
+ end
data/lib/rudoo/list.rb ADDED
@@ -0,0 +1,310 @@
1
+ module Rudoo
2
+ class List
3
+
4
+ # create a new list object by loading the yaml file
5
+ def initialize
6
+ @list = ".rudoo/list.yml"
7
+ @config = ".rudoo/config.yml"
8
+ @tasks = {}
9
+ load
10
+ end
11
+
12
+ # method for adding task objects to the list
13
+ def add(todo, priority = 0)
14
+ if todo.class == Rudoo::Task
15
+ task = todo
16
+ else
17
+ task = Rudoo::Task.new(todo, priority)
18
+ end
19
+
20
+ task = convert_date(task)
21
+ @tasks[task.id] = task
22
+ write
23
+
24
+ return task
25
+ end
26
+
27
+ # method for deleting task objects from the list
28
+ def delete(task_id)
29
+ if @tasks.delete(task_id)
30
+ write
31
+ else
32
+ raise StandardError.new("ERROR: Unable to delete objective from the hash!")
33
+ end
34
+ end
35
+
36
+ # method for editing existing tasks given their id
37
+ def edit(task_id, message = nil, priority = nil)
38
+ old = @tasks[task_id]
39
+
40
+ message = old.todo if message.nil?
41
+ priority = old.priority if priority.nil?
42
+
43
+ if old
44
+ new_task = Task.new(message, priority)
45
+ delete(task_id)
46
+ add(new_task)
47
+ else
48
+ return false
49
+ end
50
+ end
51
+
52
+ # complete an existing task
53
+ def complete(task_id)
54
+ previous = @tasks[task_id]
55
+ previous.todo = previous.todo.gsub(" :wkng", "")
56
+ previous.todo = previous.todo.gsub(" :done", "")
57
+
58
+ edit(task_id, "#{previous.todo} :done")
59
+
60
+ return true
61
+ end
62
+
63
+ # re-open a completed task (make it incomplete again)
64
+ def open(task_id)
65
+ previous = @tasks[task_id]
66
+
67
+ if previous
68
+ edit(task_id, previous.todo.gsub(" :done", ""))
69
+ return true
70
+ else
71
+ return false
72
+ end
73
+ end
74
+
75
+ # check if a task is finished or not
76
+ def done?(task)
77
+ task.todo.include?(":done")
78
+ end
79
+
80
+ # returns a list of tasks that match the given argument criteria
81
+ def gather(args = [], state = "undone")
82
+ list = {}
83
+
84
+ if @tasks.empty?
85
+ list = {}
86
+ else
87
+ case args
88
+ when []
89
+ deleteThese = []
90
+ addThese = []
91
+
92
+ @tasks.each do |id, task|
93
+ if (state == "undone" && !done?(task)) || (state == "done" && done?(task)) || (state == "all")
94
+ if task.todo.include?("{#{Time.now.strftime('%b/%d/%Y')}}")
95
+ replacedTask = task.dup
96
+ replacedTask.todo.gsub("{#{Time.now.strftime('%b/%d/%Y')}}", "#{@tag_token}today")
97
+
98
+ addThese << replacedTask
99
+ deleteThese << id
100
+ else
101
+ list[task.id] = task
102
+ end
103
+ end
104
+ end
105
+ deleteThese.each do |id|
106
+ delete(id)
107
+ end
108
+
109
+ addThese.each do |task|
110
+ add(task)
111
+ list[task.id] = task
112
+ end
113
+ when @person_token, @tag_token, @project_token
114
+ tags = Hash.new(0)
115
+
116
+ @tasks.each do |id, task|
117
+ if (state == "undone" && !done?(task)) || (state == "done" && done?(task)) || (state == "all")
118
+ task.todo.gsub(/(#{"\\" + args}\w+)/).each do |tag|
119
+ tags[tag] += 1
120
+ end
121
+ end
122
+ end
123
+
124
+ tags.each {|tag, number| puts "#{tag} (#{number})"}
125
+ else
126
+ if args.any? {|arg| arg.downcase.include?("tomorrow")}
127
+ args << Chronic.parse("tomorrow").strftime('%b/%d/%Y')
128
+ args.delete("tomorrow")
129
+ args.delete("#{@tag_token}tomorrow")
130
+ end
131
+
132
+ @tasks.each do |id, task|
133
+ if (state == "undone" && !done?(task)) || (state == "done" && done?(task)) || (state == "all")
134
+ args.each do |term|
135
+ list[task.id] = task if task.todo.downcase.include?(term.downcase)
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
141
+
142
+ print_to_screen list unless list == {}
143
+ end
144
+
145
+ # Method to increase the priority of a task
146
+ def promote(task_id)
147
+ previous = @tasks[task_id]
148
+ previous.priority = previous.priority.to_i + 1
149
+ write
150
+
151
+ return true
152
+ end
153
+
154
+ # Method to decrease the priority of a task
155
+ def demote(task_id)
156
+ previous = @tasks[task_id]
157
+ previous.priority = previous.priority.to_i - 1 unless previous.priority.to_i <= 0
158
+ write
159
+
160
+ return true
161
+ end
162
+
163
+ # returns all of the people mentioned
164
+ def people(type)
165
+ gather(@person_token, type)
166
+ end
167
+
168
+ # returns all of the tags
169
+ def tags(type)
170
+ gather(@tag_token, type)
171
+ end
172
+
173
+ # returns all of the projects
174
+ def projects(type)
175
+ gather(@project_token, type)
176
+ end
177
+
178
+ # returns the task (marked with :wkng)
179
+ def current
180
+ current = @tasks.dup.select do |id, task|
181
+ task.todo.include?(":wkng")
182
+ end
183
+
184
+ if current == {}
185
+ return false
186
+ else
187
+ return current
188
+ end
189
+ end
190
+
191
+ # Method to make a task current given its id
192
+ def set_current(task_id)
193
+ previous = @tasks[task_id]
194
+
195
+ previous.todo = previous.todo.gsub(" :wkng", "")
196
+ previous.todo = previous.todo.gsub(" :done", "")
197
+
198
+ edit(task_id, "#{previous.todo} :wkng")
199
+
200
+ return true
201
+ end
202
+
203
+ def to_md(file, state="undone")
204
+ file = File.open(File.expand_path(file), "a")
205
+
206
+ file.puts ""
207
+ file.puts ""
208
+ file.puts "## TODO LIST"
209
+ file.puts " *Items in bold are undone. Items in normal font are already completed*"
210
+ file.puts ""
211
+
212
+ @tasks.each do |id, task|
213
+ if (state == "undone" && !done?(task)) || (state == "done" && done?(task)) || (state == "all")
214
+ todo = strip_tags(task.todo)
215
+
216
+ if done?(task)
217
+ file.puts "* #{todo}"
218
+ else
219
+ file.puts "* **#{todo}**"
220
+ end
221
+ end
222
+ end
223
+ end
224
+
225
+ ## runs git commit with the current task as the
226
+ def commit
227
+ current_todo = strip_tags(current.values[0].todo)
228
+
229
+ `git commit -am "#{current_todo}"`
230
+ end
231
+
232
+ # method to order tasks by priority and arrange them in a table
233
+ def print_to_screen(init_hash)
234
+ priority_hash = {}
235
+ hash = {}
236
+
237
+ init_hash.values.each do |task|
238
+ priority_hash[task] = task.priority.to_i
239
+ end
240
+
241
+ priority_hash = priority_hash.sort_by {|k, v| v}.reverse
242
+
243
+ priority_hash.each do |task, priority|
244
+ hash[task.id] = task
245
+ end
246
+
247
+ longest_todo = hash.values.sort_by {|x| x.todo.to_s.length}.reverse[0].todo.length
248
+ longest_priority = hash.values.sort_by {|x| x.priority.to_s.length}.reverse[0].priority.to_s.length
249
+ array_length = hash.count
250
+
251
+ ids = hash.keys
252
+ tasks = hash.values
253
+
254
+ ((array_length*2)+1).times do |x|
255
+ if x%2 == 0
256
+ puts "+--------+-#{"-"*longest_todo}-+-#{"-"*longest_priority}-+"
257
+ else
258
+ task = tasks[(x-1)/2]
259
+ puts "| #{ids[(x-1)/2]} | #{task.todo}#{" "*(longest_todo - task.todo.length)} | #{task.priority}#{" "*(longest_priority - task.priority.to_s.length)} |"
260
+ end
261
+ end
262
+ end
263
+
264
+ private
265
+
266
+ def strip_tags(todo)
267
+ todo = todo.gsub(" :done", "")
268
+ todo = todo.gsub(" :wkng", "")
269
+ todo = todo.gsub(@tag_token, "")
270
+ todo = todo.gsub(@person_token, "")
271
+ todo = todo.gsub(@project_token, "")
272
+
273
+ return todo
274
+ end
275
+
276
+ # change tomorrow tags into actual dates
277
+ def convert_date(task)
278
+ if task.todo.include?("#{@tag_token}tomorrow")
279
+ task.todo.gsub!("#{@tag_token}tomorrow", "{#{Chronic.parse("tomorrow").strftime('%b/%d/%Y')}}")
280
+ task.todo.gsub!(/#{@tag_token}tomorrow/, '')
281
+ end
282
+ task
283
+ end
284
+
285
+ # load yaml file
286
+ def load
287
+ raise StandardException.new("Unable to find rudoo list storage file.") unless File.exists?(@list)
288
+ raise StandardException.new("Unable to find rudoo configuration file.") unless File.exists?(@config)
289
+
290
+ begin
291
+ @tasks = YAML.load_file(@list)
292
+ rescue
293
+ @tasks = {}
294
+ end
295
+
296
+ config = YAML.load_file(@config)
297
+
298
+ config.each do |name, value|
299
+ instance_variable_set("@#{name}",value)
300
+ end
301
+ end
302
+
303
+ # write to yaml file
304
+ def write
305
+ File.open(@list, "w") do |file|
306
+ file << @tasks.to_yaml
307
+ end
308
+ end
309
+ end
310
+ end
@@ -0,0 +1,99 @@
1
+ module Rudoo
2
+ class Storage
3
+ def initialize
4
+ if self.class.dir_initialized?(".rudoo")
5
+ puts "File architecture already initialized! Run 'rd init --destroy' to wipe rudoo file sysyem." if self.class.file_initialized?(".rudoo", "list.yml") && self.class.file_initialized?(".rudoo", "config.yml")
6
+ puts "Corrupted file architecture: Unable to find list file. Please run 'rd init --reset' to reset the file system." unless self.class.file_initialized?(".rudoo", "list.yml")
7
+ puts "Corrupted file architecture: Unable to find configuration file. Please run 'rd init --reset' to reset the file system." unless self.class.file_initialized?(".rudoo", "config.yml")
8
+ else
9
+ self.class.make_folder(".rudoo")
10
+
11
+ self.class.make_file(".rudoo", "list.yml")
12
+ self.class.make_file(".rudoo", "config.yml")
13
+
14
+ self.class.generate_config
15
+
16
+ puts "Rudoo file system successfully created! You can now run rudoo commands."
17
+ end
18
+ end
19
+
20
+ def self.reset
21
+ if dir_initialized?(".rudoo")
22
+ clear_files(".rudoo")
23
+
24
+ make_folder(".rudoo")
25
+
26
+ make_file(".rudoo", "list.yml")
27
+ make_file(".rudoo", "config.yml")
28
+
29
+ generate_config
30
+
31
+ puts "Rudoo file system successfully reset! You can now run rudoo commands."
32
+ else
33
+ puts "Rudoo file structure not found. Rudoo must be initialized to reset!"
34
+ puts ""
35
+ end
36
+ end
37
+
38
+ def self.destroy
39
+ if dir_initialized?(".rudoo")
40
+ clear_files(".rudoo")
41
+ else
42
+ puts "Rudoo file structure not found. Rudoo must be initialized to destroy!"
43
+ puts ""
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def self.write_file(contents, destination)
50
+ File.open(destination, "w") do |file|
51
+ file << contents.to_yaml
52
+ end
53
+ end
54
+
55
+ def self.generate_config
56
+ preferences = {
57
+ :person_token => "@",
58
+ :tag_token => "^",
59
+ :project_token => "*"
60
+ }
61
+
62
+ write_file(preferences, ".rudoo/config.yml")
63
+ end
64
+
65
+ def self.clear_files(dir)
66
+ raise StandardError.new("Unable to delete existing architechture.") unless FileUtils.rm_rf(dir)
67
+ end
68
+
69
+ def self.make_file(dir, file)
70
+ f = File.new(File.join(dir, file), "w+")
71
+
72
+ raise StandardError.new("Unable to create rudoo list storage file: #{file}") unless f
73
+
74
+ f.close
75
+ end
76
+
77
+ def self.make_folder(dir)
78
+ folder = FileUtils.mkdir(dir)
79
+
80
+ raise StandardError.new("Unable to create directory: #{dir}.") unless folder
81
+ end
82
+
83
+ def self.dir_initialized?(dir)
84
+ if File.directory?(dir)
85
+ return true
86
+ else
87
+ return false
88
+ end
89
+ end
90
+
91
+ def self.file_initialized?(dir, file)
92
+ if File.exists?(File.join(dir, file))
93
+ return true
94
+ else
95
+ return false
96
+ end
97
+ end
98
+ end
99
+ end
data/lib/rudoo/task.rb ADDED
@@ -0,0 +1,15 @@
1
+ module Rudoo
2
+ class Task
3
+ attr_accessor :todo, :priority
4
+
5
+ def initialize(todo, priority = 0)
6
+ @todo = todo
7
+ @priority = priority
8
+ end
9
+
10
+ def id
11
+ return Digest::SHA1.hexdigest(@todo)[0,6] unless @todo.nil?
12
+ return nil if @todo.nil?
13
+ end
14
+ end
15
+ end
data/lib/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ class Rudoo
2
+ VERSION = "0.0.01"
3
+ end
data/rudoo.gemspec ADDED
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Tommy Schaefer"]
6
+ gem.email = ["me@tommyschaefer.net"]
7
+ gem.description = %q{A ruby program for mannaging project based todo-lists in terminal.}
8
+ gem.summary = %q{Rudoo is a ruby program made primarilly for developers. It allows you to manage project based todo-lists from the command line. In addition to doing some cool things like tagging, rudoo also has a few features that optamize your workflow.}
9
+ gem.homepage = "https://github.com/tommyschaefer/rudoo"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "rudoo"
15
+ gem.version = Rudoo::VERSION
16
+ gem.add_dependency "chronic"
17
+ end
data/spec/list_spec.rb ADDED
@@ -0,0 +1 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper.rb"))
@@ -0,0 +1 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "rudoo.rb"))
@@ -0,0 +1 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper.rb"))
data/spec/task_spec.rb ADDED
@@ -0,0 +1,38 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper.rb"))
2
+
3
+ describe Rudoo::Task do
4
+ before :each do
5
+ @task = Rudoo::Task.new("This is my task")
6
+ end
7
+
8
+ describe "#initialize" do
9
+ it "returns a task object" do
10
+ @task.should be_an_instance_of Rudoo::Task
11
+ end
12
+
13
+ it "assigns the todo accessor" do
14
+ @task.todo.should == "This is my task"
15
+ end
16
+ end
17
+
18
+ describe "#id" do
19
+ it "returns nil if todo is nil" do
20
+ task = Rudoo::Task.new
21
+ task.id.should == nil
22
+ end
23
+
24
+ it "returns a string otherwise" do
25
+ @task.id.should be_a String
26
+ end
27
+
28
+ it "returns a 6 digit string" do
29
+ @task.id.length.should == 6
30
+ end
31
+ end
32
+
33
+ describe "#get" do
34
+ it "should return a specific string" do
35
+ @task.get.should == "(#{@task.id}) #{@task.todo}"
36
+ end
37
+ end
38
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rudoo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.01
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Tommy Schaefer
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: chronic
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 ruby program for mannaging project based todo-lists in terminal.
31
+ email:
32
+ - me@tommyschaefer.net
33
+ executables:
34
+ - rd
35
+ extensions: []
36
+ extra_rdoc_files: []
37
+ files:
38
+ - README.md
39
+ - bin/rd
40
+ - lib/rudoo.rb
41
+ - lib/rudoo/list.rb
42
+ - lib/rudoo/storage.rb
43
+ - lib/rudoo/task.rb
44
+ - lib/version.rb
45
+ - rudoo.gemspec
46
+ - spec/list_spec.rb
47
+ - spec/spec_helper.rb
48
+ - spec/storage_spec.rb
49
+ - spec/task_spec.rb
50
+ homepage: https://github.com/tommyschaefer/rudoo
51
+ licenses: []
52
+ post_install_message:
53
+ rdoc_options: []
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ requirements: []
69
+ rubyforge_project:
70
+ rubygems_version: 1.8.24
71
+ signing_key:
72
+ specification_version: 3
73
+ summary: Rudoo is a ruby program made primarilly for developers. It allows you to
74
+ manage project based todo-lists from the command line. In addition to doing some
75
+ cool things like tagging, rudoo also has a few features that optamize your workflow.
76
+ test_files:
77
+ - spec/list_spec.rb
78
+ - spec/spec_helper.rb
79
+ - spec/storage_spec.rb
80
+ - spec/task_spec.rb