taskish 0.0.1
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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/HISTORY +3 -0
- data/README.rdoc +25 -0
- data/Rakefile +15 -0
- data/bin/taskish +28 -0
- data/lib/taskish.rb +85 -0
- data/lib/taskish/task.rb +63 -0
- data/lib/taskish/version.rb +3 -0
- data/taskish.gemspec +23 -0
- data/test/task_test.rb +29 -0
- data/test/taskish.txt +4 -0
- data/test/taskish_test.rb +35 -0
- data/test/test_helper.rb +7 -0
- data/test/version_test.rb +10 -0
- metadata +112 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/HISTORY
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
= Taskish - Pending
|
2
|
+
|
3
|
+
== USAGE
|
4
|
+
|
5
|
+
Taskish.new do |taskish|
|
6
|
+
|
7
|
+
# Read task file
|
8
|
+
taskish.readlines('todo.txt')
|
9
|
+
|
10
|
+
# Find tasks due today
|
11
|
+
taskish.due(:today)
|
12
|
+
|
13
|
+
# Find tasks due within the next week
|
14
|
+
taskish.due(:week)
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
== HOME PAGE
|
19
|
+
|
20
|
+
https://github.com/blairc/taskish
|
21
|
+
|
22
|
+
== AUTHOR
|
23
|
+
|
24
|
+
Blair Christensen, <blair.christensen@gmail.com>
|
25
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rdoc-readme/rake_task'
|
4
|
+
|
5
|
+
RDoc::Readme::RakeTask.new 'lib/taskish.rb', 'README.rdoc'
|
6
|
+
|
7
|
+
task :default => :test
|
8
|
+
|
9
|
+
Rake::TestTask.new { |t|
|
10
|
+
t.libs = [ 'test' ]
|
11
|
+
t.pattern = 'test/*_test.rb'
|
12
|
+
t.verbose = true
|
13
|
+
t.warning = true
|
14
|
+
}
|
15
|
+
|
data/bin/taskish
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'taskish'
|
4
|
+
|
5
|
+
if __FILE__ == $0
|
6
|
+
# TODO Extract to class?
|
7
|
+
cmd, file = ARGV.shift, ARGV.shift
|
8
|
+
unless cmd && file
|
9
|
+
warn "USAGE: #{ File.basename(__FILE__) } { today | week } <file>"
|
10
|
+
exit
|
11
|
+
end
|
12
|
+
Taskish.new do |taskish|
|
13
|
+
case cmd
|
14
|
+
when 'today'
|
15
|
+
taskish.readlines(file)
|
16
|
+
puts "TODAY\n~~~~~"
|
17
|
+
taskish.due(:today).each { |task| puts task }
|
18
|
+
when 'week'
|
19
|
+
taskish.readlines(file)
|
20
|
+
puts "WEEK\n~~~~"
|
21
|
+
taskish.due(:week).each { |task| puts task }
|
22
|
+
else
|
23
|
+
warn "unknown command: #{cmd}"
|
24
|
+
exit 1
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
data/lib/taskish.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'taskish/task'
|
2
|
+
require 'taskish/version'
|
3
|
+
|
4
|
+
# = Taskish - Pending
|
5
|
+
#
|
6
|
+
# == USAGE
|
7
|
+
#
|
8
|
+
# Taskish.new do |taskish|
|
9
|
+
#
|
10
|
+
# # Read task file
|
11
|
+
# taskish.readlines('todo.txt')
|
12
|
+
#
|
13
|
+
# # Find tasks due today
|
14
|
+
# taskish.due(:today)
|
15
|
+
#
|
16
|
+
# # Find tasks due within the next week
|
17
|
+
# taskish.due(:week)
|
18
|
+
#
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# == HOME PAGE
|
22
|
+
#
|
23
|
+
# https://github.com/blairc/taskish
|
24
|
+
#
|
25
|
+
# == AUTHOR
|
26
|
+
#
|
27
|
+
# Blair Christensen, <blair.christensen@gmail.com>
|
28
|
+
#
|
29
|
+
class Taskish
|
30
|
+
def initialize
|
31
|
+
@data = {}
|
32
|
+
yield self if block_given?
|
33
|
+
end
|
34
|
+
|
35
|
+
def due( due = :today )
|
36
|
+
task_list = []
|
37
|
+
@data.each_pair do |project, tasks|
|
38
|
+
tasks.each { |task| task_list << task if task.due?(due) }
|
39
|
+
end
|
40
|
+
task_list.sort_by { |t| t.due }
|
41
|
+
end
|
42
|
+
|
43
|
+
def key?(key)
|
44
|
+
@data.key? key
|
45
|
+
end
|
46
|
+
|
47
|
+
def parse(lines)
|
48
|
+
project = nil
|
49
|
+
lines.each_with_index do |l, idx|
|
50
|
+
idx += 1
|
51
|
+
l.chomp!
|
52
|
+
if l =~ /^(\S.+):$/
|
53
|
+
#warn "PROJECT => #{ $1 }"
|
54
|
+
if key? $1
|
55
|
+
warn "line ##{idx} - project '#{ $1 }' already exists; skipping"
|
56
|
+
project = nil
|
57
|
+
else
|
58
|
+
@data[ $1 ] = []
|
59
|
+
project = $1
|
60
|
+
end
|
61
|
+
elsif l =~ /^\s+\-\s+(.*)$/
|
62
|
+
#warn "TASK => #{ $1 }"
|
63
|
+
if project
|
64
|
+
@data[project] << Task.new(project, $1)
|
65
|
+
else
|
66
|
+
warn "line ##{idx} - no project for task; skipping (#{l})"
|
67
|
+
end
|
68
|
+
elsif l =~ /^\S*$/
|
69
|
+
#warn "SKIP! (#{l})"
|
70
|
+
next
|
71
|
+
else
|
72
|
+
warn "invalid line ##{idx} - (#{l})"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def readlines(fn)
|
78
|
+
raise(ArgumentError, 'file does not exist') if ( fn.nil? || !File.exist?(fn) )
|
79
|
+
parse( File.open(fn).readlines )
|
80
|
+
self
|
81
|
+
end
|
82
|
+
|
83
|
+
end # class Taskish
|
84
|
+
|
85
|
+
|
data/lib/taskish/task.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
class Taskish # :nodoc:
|
4
|
+
|
5
|
+
# = Taskish::Task - A single task
|
6
|
+
#
|
7
|
+
# == USAGE
|
8
|
+
#
|
9
|
+
# Taskish::Task.new(project, task) do |task|
|
10
|
+
# ...
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
class Task
|
14
|
+
def initialize(project, task)
|
15
|
+
raise(ArgumentError, 'invalid project') if ( project.nil? || project.empty? )
|
16
|
+
raise(ArgumentError, 'invalid task') if ( task.nil? || task.empty? )
|
17
|
+
@data = { :project => project, :task => task }
|
18
|
+
if task =~ /^(.+?)\s+\@due(.*?)\s*$/
|
19
|
+
@data[:task] = $1
|
20
|
+
@data[:due] = $2.empty? ? Date.today : Date.parse( $2.gsub(/^\(/, '').gsub(/\)$/, '') )
|
21
|
+
else
|
22
|
+
end
|
23
|
+
yield self if block_given?
|
24
|
+
end
|
25
|
+
|
26
|
+
def due
|
27
|
+
@data[:due] || nil
|
28
|
+
end
|
29
|
+
|
30
|
+
def due?(date)
|
31
|
+
return false unless key? :due
|
32
|
+
case date
|
33
|
+
when :today
|
34
|
+
return @data[:due] <= Date.today
|
35
|
+
when :week
|
36
|
+
d = Date.today + 7
|
37
|
+
week = DateTime.new( d.year, d.mon, d.mday, 23, 59 )
|
38
|
+
return @data[:due] <= week
|
39
|
+
else
|
40
|
+
warn "invalid due date specification - '#{date}'"
|
41
|
+
end
|
42
|
+
false
|
43
|
+
end
|
44
|
+
|
45
|
+
def key?(key)
|
46
|
+
@data.key? key
|
47
|
+
end
|
48
|
+
|
49
|
+
def task
|
50
|
+
@data[:task]
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_s
|
54
|
+
s = sprintf( "%-20s\t%s" % [ @data[:project], @data[:task] ] )
|
55
|
+
if key? :due
|
56
|
+
s = sprintf( "%s @due(%s)" % [ s, @data[:due] ] )
|
57
|
+
end
|
58
|
+
s
|
59
|
+
end
|
60
|
+
end # class Taskish::Task
|
61
|
+
|
62
|
+
end # class Taskish
|
63
|
+
|
data/taskish.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require 'taskish/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'taskish'
|
7
|
+
s.version = Taskish::VERSION
|
8
|
+
s.authors = ['blair christensen.']
|
9
|
+
s.email = ['blair.christensen@gmail.com']
|
10
|
+
s.homepage = 'https://github.com/blairc/taskish'
|
11
|
+
s.summary = %q{Pending}
|
12
|
+
s.description = %q{Pending}
|
13
|
+
|
14
|
+
s.rubyforge_project = 'taskish'
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_development_dependency( %q<rdoc-readme>, [ '>=0.1.1' ] )
|
22
|
+
s.add_development_dependency( %q<shoulda>, [ '>=2.11.3' ] )
|
23
|
+
end
|
data/test/task_test.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TaskTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context '#initialize()' do
|
6
|
+
should 'raise ArgumentError if nil project' do
|
7
|
+
assert_raise(ArgumentError, 'invalid project') { Taskish::Task.new(nil, "t") }
|
8
|
+
end
|
9
|
+
should 'raise ArgumentError if empty project' do
|
10
|
+
assert_raise(ArgumentError, 'invalid project') { Taskish::Task.new('', "t") }
|
11
|
+
end
|
12
|
+
should 'raise ArgumentError if nil task' do
|
13
|
+
assert_raise(ArgumentError, 'invalid task') { Taskish::Task.new("p", nil) }
|
14
|
+
end
|
15
|
+
should 'raise ArgumentError if empty task' do
|
16
|
+
assert_raise(ArgumentError, 'invalid task') { Taskish::Task.new("p", '') }
|
17
|
+
end
|
18
|
+
should 'return object if no block given' do
|
19
|
+
assert_instance_of Taskish::Task, Taskish::Task.new("p", "t")
|
20
|
+
end
|
21
|
+
should 'work as a block' do
|
22
|
+
Taskish::Task.new("p", "t") do |task|
|
23
|
+
assert_instance_of Taskish::Task, task
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end # class TaskTest
|
29
|
+
|
data/test/taskish.txt
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TaskishTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context '#initialize()' do
|
6
|
+
should 'return object if no block given' do
|
7
|
+
assert_instance_of Taskish, Taskish.new
|
8
|
+
end
|
9
|
+
should 'work as a block' do
|
10
|
+
Taskish.new do |taskish|
|
11
|
+
assert_instance_of Taskish, taskish
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context '#readlines()' do
|
17
|
+
setup do
|
18
|
+
@taskish = Taskish.new
|
19
|
+
@bad_file = File.join( File.dirname(__FILE__), 'no_such_file.txt' )
|
20
|
+
@good_file = File.join( File.dirname(__FILE__), 'taskish.txt' )
|
21
|
+
end
|
22
|
+
|
23
|
+
should 'raise ArgumentError if file does not exist' do
|
24
|
+
assert_raise(ArgumentError, 'no such file') { @taskish.readlines(nil) }
|
25
|
+
assert_raise(ArgumentError, 'no such file') { @taskish.readlines('') }
|
26
|
+
assert_raise(ArgumentError, 'no such file') { @taskish.readlines(@bad_file) }
|
27
|
+
end
|
28
|
+
|
29
|
+
should 'not return self after reading file' do
|
30
|
+
assert_equal @taskish, @taskish.readlines(@good_file)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end # class TaskishTest
|
35
|
+
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: taskish
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- blair christensen.
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-06-23 00:00:00 -05:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rdoc-readme
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
- 1
|
31
|
+
- 1
|
32
|
+
version: 0.1.1
|
33
|
+
type: :development
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: shoulda
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
segments:
|
44
|
+
- 2
|
45
|
+
- 11
|
46
|
+
- 3
|
47
|
+
version: 2.11.3
|
48
|
+
type: :development
|
49
|
+
version_requirements: *id002
|
50
|
+
description: Pending
|
51
|
+
email:
|
52
|
+
- blair.christensen@gmail.com
|
53
|
+
executables:
|
54
|
+
- taskish
|
55
|
+
extensions: []
|
56
|
+
|
57
|
+
extra_rdoc_files: []
|
58
|
+
|
59
|
+
files:
|
60
|
+
- .gitignore
|
61
|
+
- Gemfile
|
62
|
+
- HISTORY
|
63
|
+
- README.rdoc
|
64
|
+
- Rakefile
|
65
|
+
- bin/taskish
|
66
|
+
- lib/taskish.rb
|
67
|
+
- lib/taskish/task.rb
|
68
|
+
- lib/taskish/version.rb
|
69
|
+
- taskish.gemspec
|
70
|
+
- test/task_test.rb
|
71
|
+
- test/taskish.txt
|
72
|
+
- test/taskish_test.rb
|
73
|
+
- test/test_helper.rb
|
74
|
+
- test/version_test.rb
|
75
|
+
has_rdoc: true
|
76
|
+
homepage: https://github.com/blairc/taskish
|
77
|
+
licenses: []
|
78
|
+
|
79
|
+
post_install_message:
|
80
|
+
rdoc_options: []
|
81
|
+
|
82
|
+
require_paths:
|
83
|
+
- lib
|
84
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
segments:
|
90
|
+
- 0
|
91
|
+
version: "0"
|
92
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
segments:
|
98
|
+
- 0
|
99
|
+
version: "0"
|
100
|
+
requirements: []
|
101
|
+
|
102
|
+
rubyforge_project: taskish
|
103
|
+
rubygems_version: 1.3.7
|
104
|
+
signing_key:
|
105
|
+
specification_version: 3
|
106
|
+
summary: Pending
|
107
|
+
test_files:
|
108
|
+
- test/task_test.rb
|
109
|
+
- test/taskish.txt
|
110
|
+
- test/taskish_test.rb
|
111
|
+
- test/test_helper.rb
|
112
|
+
- test/version_test.rb
|