taskwarrior 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 +17 -0
- data/.travis.yml +12 -0
- data/Gemfile +4 -0
- data/Guardfile +12 -0
- data/LICENSE +22 -0
- data/README.md +31 -0
- data/Rakefile +10 -0
- data/lib/taskwarrior.rb +12 -0
- data/lib/taskwarrior/priority_mapper.rb +9 -0
- data/lib/taskwarrior/project.rb +33 -0
- data/lib/taskwarrior/repository.rb +64 -0
- data/lib/taskwarrior/tag.rb +48 -0
- data/lib/taskwarrior/task.rb +52 -0
- data/lib/taskwarrior/task_mapper.rb +30 -0
- data/lib/taskwarrior/version.rb +3 -0
- data/taskwarrior.gemspec +26 -0
- data/test/fixtures/no_deps.json +7 -0
- data/test/fixtures/party.json +7 -0
- data/test/fixtures/party2.json +7 -0
- data/test/fixtures/party_taxes.json +10 -0
- data/test/test_helper.rb +28 -0
- data/test/unit/test_priority_mapper.rb +27 -0
- data/test/unit/test_project.rb +55 -0
- data/test/unit/test_repository.rb +64 -0
- data/test/unit/test_tag.rb +57 -0
- data/test/unit/test_tag_habtm.rb +69 -0
- data/test/unit/test_task.rb +121 -0
- metadata +196 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
guard 'bundler' do
|
2
|
+
watch('Gemfile')
|
3
|
+
watch(/^.+\.gemspec/)
|
4
|
+
end
|
5
|
+
|
6
|
+
guard :test, :test_paths => ['test/unit', 'test/integration'] do
|
7
|
+
watch('lib/twdeps.rb'){"test"}
|
8
|
+
watch(%r{^lib/twdeps/(.+)\.rb$}){|m| "test/unit/test_#{m[1]}.rb"}
|
9
|
+
watch(%r{^test/unit/test_(.+)\.rb$})
|
10
|
+
watch('test/test_helper.rb'){"test"}
|
11
|
+
watch('test/helpers/**/*'){"test"}
|
12
|
+
end
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Nicholas E. Rabenau
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# taskwarrior
|
2
|
+
|
3
|
+
Ruby bindings for [TaskWarrior](http://taskwarrior.org)
|
4
|
+
|
5
|
+
[](http://travis-ci.org/nerab/taskwarrior)
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'taskwarrior'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install taskwarrior
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
TODO: Write usage instructions here
|
24
|
+
|
25
|
+
## Contributing
|
26
|
+
|
27
|
+
1. Fork it
|
28
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
29
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
30
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
31
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/lib/taskwarrior.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require "taskwarrior/version"
|
2
|
+
|
3
|
+
require "taskwarrior/task"
|
4
|
+
require "taskwarrior/project"
|
5
|
+
require "taskwarrior/tag"
|
6
|
+
require "taskwarrior/repository"
|
7
|
+
require "taskwarrior/task_mapper"
|
8
|
+
require "taskwarrior/priority_mapper"
|
9
|
+
|
10
|
+
module TaskWarrior
|
11
|
+
# Your code goes here...
|
12
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
|
3
|
+
module TaskWarrior
|
4
|
+
class Project
|
5
|
+
attr_reader :name, :tasks
|
6
|
+
|
7
|
+
include ActiveModel::Validations
|
8
|
+
validates :name, :presence => true
|
9
|
+
validate :name_may_not_contain_spaces
|
10
|
+
|
11
|
+
def initialize(name, tasks = [])
|
12
|
+
@name = name
|
13
|
+
@tasks = tasks
|
14
|
+
@tasks.each{|t| t.project = self}
|
15
|
+
end
|
16
|
+
|
17
|
+
def <<(task)
|
18
|
+
@tasks << task
|
19
|
+
task.project = self
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
"Project #{name} (#{@tasks.size} tasks)"
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def name_may_not_contain_spaces
|
28
|
+
if !name.blank? and name[/\s/]
|
29
|
+
errors.add(:name, "may not contain spaces")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module TaskWarrior
|
4
|
+
class Repository
|
5
|
+
def initialize(input)
|
6
|
+
@tasks = {}
|
7
|
+
@projects = Hash.new{|hash, key| hash[key] = Project.new(key)}
|
8
|
+
@tags = Hash.new{|hash, key| hash[key] = Tag.new(key)}
|
9
|
+
|
10
|
+
JSON.parse(input).each{|json|
|
11
|
+
task = TaskWarrior::TaskMapper.map(json)
|
12
|
+
@tasks[task.uuid] = task
|
13
|
+
@projects[task.project].tasks << task if task.project
|
14
|
+
|
15
|
+
# Create a new Tag object in @tags that is the value for each tag name
|
16
|
+
task.tags.each{|tag_name| @tags[tag_name] << task}
|
17
|
+
}
|
18
|
+
|
19
|
+
# Replace the uuid of each dependency with the real task
|
20
|
+
@tasks.each_value{|task| task.dependencies.map!{|uuid| @tasks[uuid]}}
|
21
|
+
|
22
|
+
# Replace the project property of each task with a proper Project object carrying a name and all of the project's tasks
|
23
|
+
@tasks.each_value{|task| task.project = @projects[task.project] if task.project}
|
24
|
+
|
25
|
+
# Add child tasks to their parent, but keep them in the global index
|
26
|
+
@tasks.each_value do |task|
|
27
|
+
if task.parent
|
28
|
+
parent = @tasks[task.parent]
|
29
|
+
|
30
|
+
if parent # we know the parent
|
31
|
+
parent.children << task
|
32
|
+
task.parent = parent
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def tasks
|
39
|
+
# Do not expose child tasks directly
|
40
|
+
@tasks.values.reject{|t| t.parent}
|
41
|
+
end
|
42
|
+
|
43
|
+
# direct lookup by uuid
|
44
|
+
def [](uuid)
|
45
|
+
@tasks[uuid]
|
46
|
+
end
|
47
|
+
|
48
|
+
def projects
|
49
|
+
@projects.values
|
50
|
+
end
|
51
|
+
|
52
|
+
def project(name)
|
53
|
+
@projects[name] if @projects.has_key?(name)
|
54
|
+
end
|
55
|
+
|
56
|
+
def tags
|
57
|
+
@tags.values
|
58
|
+
end
|
59
|
+
|
60
|
+
def tag(name)
|
61
|
+
@tags[name] if @tags.has_key?(name)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
|
3
|
+
module TaskWarrior
|
4
|
+
class Tag
|
5
|
+
attr_reader :name
|
6
|
+
|
7
|
+
include ActiveModel::Validations
|
8
|
+
validates :name, :presence => true
|
9
|
+
validate :name_may_not_contain_spaces
|
10
|
+
|
11
|
+
def initialize(tag_or_name, tasks = [])
|
12
|
+
if tag_or_name.respond_to?(:name)
|
13
|
+
@name = tag_or_name.name
|
14
|
+
@tasks = tag_or_name.tasks
|
15
|
+
else
|
16
|
+
@name = tag_or_name
|
17
|
+
@tasks = []
|
18
|
+
end
|
19
|
+
|
20
|
+
tasks.each{|task|
|
21
|
+
self << task
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def <<(task)
|
26
|
+
@tasks << task unless @tasks.include?(task)
|
27
|
+
end
|
28
|
+
|
29
|
+
def tasks
|
30
|
+
@tasks #.dup
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_s
|
34
|
+
"Tag: #{name} (#{@tasks.size} tasks)"
|
35
|
+
end
|
36
|
+
|
37
|
+
def ==(other)
|
38
|
+
name == other.name
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
def name_may_not_contain_spaces
|
43
|
+
if !name.blank? and name[/\s/]
|
44
|
+
errors.add(:name, "may not contain spaces")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
|
3
|
+
module TaskWarrior
|
4
|
+
class Task
|
5
|
+
attr_accessor :description, :id, :entry, :status, :uuid, :project, :dependencies, :parent, :children, :priority
|
6
|
+
|
7
|
+
include ActiveModel::Validations
|
8
|
+
validates :description, :id, :entry, :status, :uuid, :presence => true
|
9
|
+
|
10
|
+
validates :id, :numericality => { :only_integer => true, :greater_than => 0}
|
11
|
+
|
12
|
+
validates :uuid, :format => {:with => /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/,
|
13
|
+
:message => "'%{value}' does not match the expected format of a UUID"}
|
14
|
+
|
15
|
+
validates :status, :inclusion => {:in => [:pending, :waiting, :complete], :message => "%{value} is not a valid status"}
|
16
|
+
|
17
|
+
validates :priority, :inclusion => {
|
18
|
+
:in => [:high, :medium, :low],
|
19
|
+
:allow_nil => true,
|
20
|
+
:allow_blank => true,
|
21
|
+
:message => "%{value} is not a valid priority"
|
22
|
+
}
|
23
|
+
|
24
|
+
validate :entry_cannot_be_in_the_future
|
25
|
+
|
26
|
+
def initialize(description)
|
27
|
+
@description = description
|
28
|
+
@dependencies = []
|
29
|
+
@children = []
|
30
|
+
@tags = []
|
31
|
+
end
|
32
|
+
|
33
|
+
def tags
|
34
|
+
@tags
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_s
|
38
|
+
"Task '#{description}'".tap{|result| result << " <#{uuid}>" if uuid}
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
def entry_cannot_be_in_the_future
|
43
|
+
begin
|
44
|
+
if !entry.blank? and entry > DateTime.now
|
45
|
+
errors.add(:entry, "can't be in the future")
|
46
|
+
end
|
47
|
+
rescue
|
48
|
+
errors.add(:entry, "must be comparable to DateTime")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module TaskWarrior
|
2
|
+
#
|
3
|
+
# A DataMapper that makes new Tasks from a JSON representation
|
4
|
+
#
|
5
|
+
class TaskMapper
|
6
|
+
class << self
|
7
|
+
def map(json)
|
8
|
+
Task.new(json['description']).tap{|t|
|
9
|
+
t.id = json['id'].to_i
|
10
|
+
t.uuid = json['uuid']
|
11
|
+
t.entry = DateTime.parse(json['entry'])
|
12
|
+
t.status = json['status'].to_sym
|
13
|
+
t.project = json['project']
|
14
|
+
|
15
|
+
if json['depends']
|
16
|
+
if json['depends'].respond_to?(:split)
|
17
|
+
t.dependencies = json['depends'].split(',')
|
18
|
+
else
|
19
|
+
t.dependencies = json['depends']
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
t.parent = json['parent'] # Children will be cross-indexed in the repository
|
24
|
+
t.priority = PriorityMapper.map(json['priority'])
|
25
|
+
json['tags'].each{|tag| t.tags << tag} if json['tags']
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/taskwarrior.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/taskwarrior/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Nicholas E. Rabenau"]
|
6
|
+
gem.email = ["nerab@gmx.net"]
|
7
|
+
gem.summary = %q{Ruby wrapper for TaskWarrior}
|
8
|
+
gem.description = %q{Wraps access to TaskWarrior, the command-line task manager, in a Ruby gem.}
|
9
|
+
|
10
|
+
gem.files = `git ls-files`.split($\)
|
11
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
12
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
13
|
+
gem.name = "taskwarrior"
|
14
|
+
gem.require_paths = ["lib"]
|
15
|
+
gem.version = TaskWarrior::VERSION
|
16
|
+
|
17
|
+
gem.add_dependency 'activemodel', '~> 3.2'
|
18
|
+
|
19
|
+
gem.add_development_dependency 'activesupport', '~> 3.2'
|
20
|
+
gem.add_development_dependency 'twtest', '~> 0.0.5'
|
21
|
+
gem.add_development_dependency 'guard-test', '~> 0.5'
|
22
|
+
gem.add_development_dependency 'guard-bundler', '~> 1.0'
|
23
|
+
gem.add_development_dependency 'rake', '~> 0.9'
|
24
|
+
|
25
|
+
gem.add_development_dependency 'pry'
|
26
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
[{"id":1,"description":"Select a free weekend in November","entry":"20120629T191421Z","priority":"H","project":"party","status":"pending","uuid":"6fd0ba4a-ab67-49cd-ac69-64aa999aff8a","annotations":[{"entry":"20120629T191534Z","description":"the 13th looks good"}]},
|
2
|
+
{"id":2,"description":"Select and book a venue","entry":"20120629T191634Z","priority":"H","project":"party","status":"pending","uuid":"c992448a-f1ea-4982-8461-47f0705ff509"},
|
3
|
+
{"id":3,"description":"Mail invitations","entry":"20120629T191919Z","project":"party","status":"pending","uuid":"3b53178e-d5a4-45e0-afc2-1292db58a59a"},
|
4
|
+
{"id":4,"description":"Select a caterer","entry":"20120629T191919Z","project":"party","status":"pending","uuid":"c590941b-eb10-4569-bdc9-0e339f79305e"},
|
5
|
+
{"id":5,"description":"Design invitations","entry":"20120629T191919Z","priority":"H","project":"party","status":"pending","tags":["mall"],"uuid":"e5a867b7-0116-457d-ba43-9ac2bee6ad2a"},
|
6
|
+
{"id":6,"description":"Print invitations","entry":"20120629T191920Z","project":"party","status":"pending","tags":["mall"],"uuid":"9f6f3738-1c08-4f45-8eb4-1e90864c7588"}
|
7
|
+
]
|
@@ -0,0 +1,7 @@
|
|
1
|
+
[{"id":1,"description":"Select a free weekend in November","entry":"20120629T191421Z","priority":"H","project":"party","status":"pending","uuid":"6fd0ba4a-ab67-49cd-ac69-64aa999aff8a","annotations":[{"entry":"20120629T191534Z","description":"the 13th looks good"}]},
|
2
|
+
{"id":2,"depends":"6fd0ba4a-ab67-49cd-ac69-64aa999aff8a","description":"Select and book a venue","entry":"20120629T191634Z","priority":"H","project":"party","status":"pending","uuid":"c992448a-f1ea-4982-8461-47f0705ff509"},
|
3
|
+
{"id":3,"depends":"9f6f3738-1c08-4f45-8eb4-1e90864c7588","description":"Mail invitations","entry":"20120629T191919Z","project":"party","status":"pending","uuid":"3b53178e-d5a4-45e0-afc2-1292db58a59a"},
|
4
|
+
{"id":4,"depends":"6fd0ba4a-ab67-49cd-ac69-64aa999aff8a,c992448a-f1ea-4982-8461-47f0705ff509","description":"Select a caterer","entry":"20120629T191919Z","project":"party","status":"pending","uuid":"c590941b-eb10-4569-bdc9-0e339f79305e"},
|
5
|
+
{"id":5,"depends":"c992448a-f1ea-4982-8461-47f0705ff509","description":"Design invitations","entry":"20120629T191919Z","priority":"H","project":"party","status":"pending","tags":["mall"],"uuid":"e5a867b7-0116-457d-ba43-9ac2bee6ad2a"},
|
6
|
+
{"id":6,"depends":"e5a867b7-0116-457d-ba43-9ac2bee6ad2a","description":"Print invitations","entry":"20120629T191920Z","project":"party","status":"pending","tags":["mall"],"uuid":"9f6f3738-1c08-4f45-8eb4-1e90864c7588"}
|
7
|
+
]
|
@@ -0,0 +1,7 @@
|
|
1
|
+
[{"id":1,"description":"Select a free weekend in November","entry":"20120629T191421Z","priority":"H","project":"party","status":"pending","uuid":"6fd0ba4a-ab67-49cd-ac69-64aa999aff8a","annotations":[{"entry":"20120629T191534Z","description":"the 13th looks good"}]},
|
2
|
+
{"id":2,"depends":["6fd0ba4a-ab67-49cd-ac69-64aa999aff8a"],"description":"Select and book a venue","entry":"20120629T191634Z","priority":"H","project":"party","status":"pending","uuid":"c992448a-f1ea-4982-8461-47f0705ff509"},
|
3
|
+
{"id":3,"depends":["9f6f3738-1c08-4f45-8eb4-1e90864c7588"],"description":"Mail invitations","entry":"20120629T191919Z","project":"party","status":"pending","uuid":"3b53178e-d5a4-45e0-afc2-1292db58a59a"},
|
4
|
+
{"id":4,"depends":["6fd0ba4a-ab67-49cd-ac69-64aa999aff8a","c992448a-f1ea-4982-8461-47f0705ff509"],"description":"Select a caterer","entry":"20120629T191919Z","project":"party","status":"pending","uuid":"c590941b-eb10-4569-bdc9-0e339f79305e"},
|
5
|
+
{"id":5,"depends":["c992448a-f1ea-4982-8461-47f0705ff509"],"description":"Design invitations","entry":"20120629T191919Z","priority":"H","project":"party","status":"pending","tags":["mall"],"uuid":"e5a867b7-0116-457d-ba43-9ac2bee6ad2a"},
|
6
|
+
{"id":6,"depends":["e5a867b7-0116-457d-ba43-9ac2bee6ad2a"],"description":"Print invitations","entry":"20120629T191920Z","project":"party","status":"pending","tags":["mall"],"uuid":"9f6f3738-1c08-4f45-8eb4-1e90864c7588"}
|
7
|
+
]
|
@@ -0,0 +1,10 @@
|
|
1
|
+
[{"id":1,"description":"Select a free weekend in November","entry":"20120629T191421Z","priority":"H","project":"party","status":"pending","uuid":"6fd0ba4a-ab67-49cd-ac69-64aa999aff8a","annotations":[{"entry":"20120629T191534Z","description":"the 13th looks good"}]},
|
2
|
+
{"id":2,"depends":"6fd0ba4a-ab67-49cd-ac69-64aa999aff8a","description":"Select and book a venue","entry":"20120629T191634Z","priority":"H","project":"party","status":"pending","uuid":"c992448a-f1ea-4982-8461-47f0705ff509"},
|
3
|
+
{"id":3,"depends":"9f6f3738-1c08-4f45-8eb4-1e90864c7588","description":"Mail invitations","entry":"20120629T191919Z","project":"party","status":"pending","uuid":"3b53178e-d5a4-45e0-afc2-1292db58a59a"},
|
4
|
+
{"id":4,"depends":"6fd0ba4a-ab67-49cd-ac69-64aa999aff8a,c992448a-f1ea-4982-8461-47f0705ff509","description":"Select a caterer","entry":"20120629T191919Z","project":"party","status":"pending","uuid":"c590941b-eb10-4569-bdc9-0e339f79305e"},
|
5
|
+
{"id":5,"depends":"c992448a-f1ea-4982-8461-47f0705ff509","description":"Design invitations","entry":"20120629T191919Z","priority":"H","project":"party","status":"pending","tags":["mall"],"uuid":"e5a867b7-0116-457d-ba43-9ac2bee6ad2a"},
|
6
|
+
{"id":6,"depends":"e5a867b7-0116-457d-ba43-9ac2bee6ad2a","description":"Print invitations","entry":"20120629T191920Z","project":"party","status":"pending","tags":["mall"],"uuid":"9f6f3738-1c08-4f45-8eb4-1e90864c7588"},
|
7
|
+
{"id":7,"description":"Pay taxes","due":"20130429T220000Z","entry":"20120630T092759Z","mask":"-","recur":"yearly","status":"recurring","uuid":"b587f364-c68e-4438-b4d6-f2af6ad62518"},
|
8
|
+
{"id":8,"description":"Pay taxes","due":"20130429T220000Z","entry":"20120630T092800Z","imask":"0","parent":"b587f364-c68e-4438-b4d6-f2af6ad62518","recur":"yearly","status":"pending","tags":["finance"],"uuid":"99c9e1bb-ed75-4525-b05d-cf153a7ee1a1"},
|
9
|
+
{"id":9,"description":"Get cash from ATM","entry":"20120702T130056Z","status":"pending","tags":["finance","mall"],"uuid":"67aafe0b-ddd7-482b-9cfa-ac42c43e7559"}
|
10
|
+
]
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'twtest'
|
2
|
+
require 'taskwarrior'
|
3
|
+
|
4
|
+
module TaskWarrior
|
5
|
+
module Test
|
6
|
+
module Fixtures
|
7
|
+
def fixture(name)
|
8
|
+
File.join(File.dirname(__FILE__), 'fixtures', name)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module Validations
|
13
|
+
def assert_valid(task)
|
14
|
+
assert(task.valid?, error_message(task.errors))
|
15
|
+
end
|
16
|
+
|
17
|
+
def assert_invalid(task)
|
18
|
+
assert(task.invalid?, 'Expect validation to fail')
|
19
|
+
end
|
20
|
+
|
21
|
+
def error_message(errors)
|
22
|
+
errors.each_with_object([]){|e, result|
|
23
|
+
result << e.join(' ')
|
24
|
+
}.join("\n")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestPriorityMapper < Test::Unit::TestCase
|
4
|
+
def test_nil
|
5
|
+
assert_nil(TaskWarrior::PriorityMapper.map(nil))
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_empty
|
9
|
+
assert_nil(TaskWarrior::PriorityMapper.map(''))
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_low
|
13
|
+
assert_equal(:low, TaskWarrior::PriorityMapper.map('L'))
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_medium
|
17
|
+
assert_equal(:medium, TaskWarrior::PriorityMapper.map('M'))
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_high
|
21
|
+
assert_equal(:high, TaskWarrior::PriorityMapper.map('H'))
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_unknown
|
25
|
+
assert_nil(TaskWarrior::PriorityMapper.map('crap'))
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestProject < Test::Unit::TestCase
|
4
|
+
include TaskWarrior::Test::Validations
|
5
|
+
|
6
|
+
def test_name
|
7
|
+
project = TaskWarrior::Project.new('foo')
|
8
|
+
assert_valid(project)
|
9
|
+
assert_empty(project.tasks)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_empty_tasks
|
13
|
+
project = TaskWarrior::Project.new('foo', [])
|
14
|
+
assert_valid(project)
|
15
|
+
assert_empty(project.tasks)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_with_tasks
|
19
|
+
project = TaskWarrior::Project.new('foo', [TaskWarrior::Task.new('foobar')])
|
20
|
+
assert_valid(project)
|
21
|
+
assert_equal(1, project.tasks.size)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_name_nil
|
25
|
+
project = TaskWarrior::Project.new(nil)
|
26
|
+
assert_invalid(project)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_name_empty
|
30
|
+
project = TaskWarrior::Project.new('')
|
31
|
+
assert_invalid(project)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_name_with_space
|
35
|
+
project = TaskWarrior::Project.new('foo bar')
|
36
|
+
assert_invalid(project)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_name_just_space
|
40
|
+
project = TaskWarrior::Project.new(' ')
|
41
|
+
assert_invalid(project)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_add_task
|
45
|
+
project = TaskWarrior::Project.new('foo')
|
46
|
+
assert_empty(project.tasks)
|
47
|
+
t1 = TaskWarrior::Task.new('foobar')
|
48
|
+
t2 = TaskWarrior::Task.new('foobaz')
|
49
|
+
project << t1
|
50
|
+
project << t2
|
51
|
+
assert_equal(2, project.tasks.size)
|
52
|
+
assert_equal(project, t1.project)
|
53
|
+
assert_equal(project, t2.project)
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestRepository < Test::Unit::TestCase
|
4
|
+
include TaskWarrior
|
5
|
+
include TaskWarrior::Test::Fixtures
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@repo = Repository.new(File.read(fixture('party_taxes.json')))
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_tags_of_task
|
12
|
+
atm = @repo['67aafe0b-ddd7-482b-9cfa-ac42c43e7559']
|
13
|
+
assert_not_nil(atm)
|
14
|
+
assert_equal(2, atm.tags.size)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_all
|
18
|
+
assert_equal(8, @repo.tasks.size)
|
19
|
+
|
20
|
+
one = @repo['6fd0ba4a-ab67-49cd-ac69-64aa999aff8a']
|
21
|
+
assert_equal('Select a free weekend in November', one.description)
|
22
|
+
assert_equal(:high, one.priority)
|
23
|
+
assert_equal('party', one.project.name)
|
24
|
+
assert_equal(:pending, one.status)
|
25
|
+
|
26
|
+
# assert_equal(1, one.annotations.size)
|
27
|
+
# assert_equal(DateTime.new('20120629T191534Z'), one.annotations.first.entry)
|
28
|
+
# assert_equal('the 13th looks good', one.annotations.first.entry.description)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_child
|
32
|
+
assert_equal(1, @repo['b587f364-c68e-4438-b4d6-f2af6ad62518'].children.size)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_parent
|
36
|
+
assert_equal(@repo['b587f364-c68e-4438-b4d6-f2af6ad62518'], @repo['99c9e1bb-ed75-4525-b05d-cf153a7ee1a1'].parent)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_projects
|
40
|
+
party = @repo.project('party')
|
41
|
+
assert_not_nil(party)
|
42
|
+
assert_equal(6, party.tasks.size)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_tags
|
46
|
+
tags = @repo.tags
|
47
|
+
assert_not_nil(tags)
|
48
|
+
assert_equal(2, tags.size)
|
49
|
+
assert(tags.include?(Tag.new('finance')))
|
50
|
+
assert(tags.include?(Tag.new('mall')))
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_tasks_of_tag_finance
|
54
|
+
finance = @repo.tag('finance')
|
55
|
+
assert_not_nil(finance)
|
56
|
+
assert_equal(2, finance.tasks.size)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_tasks_of_tag_mall
|
60
|
+
mall = @repo.tag('mall')
|
61
|
+
assert_not_nil(mall)
|
62
|
+
assert_equal(3, mall.tasks.size)
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestTag < Test::Unit::TestCase
|
4
|
+
include TaskWarrior
|
5
|
+
include TaskWarrior::Test::Validations
|
6
|
+
|
7
|
+
def test_name
|
8
|
+
tag = Tag.new('foo')
|
9
|
+
assert_valid(tag)
|
10
|
+
assert_empty(tag.tasks)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_empty_tasks
|
14
|
+
tag = Tag.new('foo', [])
|
15
|
+
assert_valid(tag)
|
16
|
+
assert_empty(tag.tasks)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_with_tasks
|
20
|
+
tag = Tag.new('foo', [Task.new('foobar')])
|
21
|
+
assert_valid(tag)
|
22
|
+
assert_equal(1, tag.tasks.size)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_name_nil
|
26
|
+
tag = Tag.new(nil)
|
27
|
+
assert_invalid(tag)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_name_empty
|
31
|
+
tag = Tag.new('')
|
32
|
+
assert_invalid(tag)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_name_with_space
|
36
|
+
tag = Tag.new('foo bar')
|
37
|
+
assert_invalid(tag)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_name_just_space
|
41
|
+
tag = Tag.new(' ')
|
42
|
+
assert_invalid(tag)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_construction
|
46
|
+
foo = Tag.new('foo')
|
47
|
+
assert_equal(foo, Tag.new(foo))
|
48
|
+
assert_equal(Tag.new(foo), foo)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_value_object
|
52
|
+
f1 = Tag.new('foo')
|
53
|
+
f2 = Tag.new('foo')
|
54
|
+
assert_not_equal(f1.object_id, f2.object_id)
|
55
|
+
assert_equal(f1, f2)
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestTagHasAndBelongsToMany < Test::Unit::TestCase
|
4
|
+
include TaskWarrior::Test::Validations
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@lookup_foo = TaskWarrior::Task.new('Lookup foo in Wikipedia')
|
8
|
+
@lookup_deadbeef = TaskWarrior::Task.new('Lookup deadbeef in Wikipedia')
|
9
|
+
|
10
|
+
@foo = TaskWarrior::Tag.new('foo')
|
11
|
+
@deadbeef = TaskWarrior::Tag.new('deadbeef')
|
12
|
+
@metasyntactic = TaskWarrior::Tag.new('metasyntactic')
|
13
|
+
|
14
|
+
# We need to do what the repo does - cross-reference manually.
|
15
|
+
@foo << @lookup_foo
|
16
|
+
@lookup_foo.tags << @foo
|
17
|
+
@lookup_foo.tags << @metasyntactic
|
18
|
+
|
19
|
+
@deadbeef << @lookup_deadbeef
|
20
|
+
@lookup_deadbeef.tags << @deadbeef
|
21
|
+
@lookup_deadbeef.tags << @metasyntactic
|
22
|
+
|
23
|
+
@metasyntactic << @lookup_foo
|
24
|
+
@metasyntactic << @lookup_deadbeef
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_task_tagged
|
28
|
+
assert_equal(2, @lookup_foo.tags.size)
|
29
|
+
assert_equal(2, @lookup_deadbeef.tags.size)
|
30
|
+
|
31
|
+
assert_tagged_with(@lookup_foo, @foo)
|
32
|
+
assert_tagged_with(@lookup_foo, @metasyntactic)
|
33
|
+
assert_not_tagged_with(@lookup_foo, @deadbeef)
|
34
|
+
|
35
|
+
assert_not_tagged_with(@lookup_deadbeef, @foo)
|
36
|
+
assert_tagged_with(@lookup_deadbeef, @metasyntactic)
|
37
|
+
assert_tagged_with(@lookup_deadbeef, @deadbeef)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_tag_has_tasks
|
41
|
+
assert_equal(1, @foo.tasks.size)
|
42
|
+
assert_equal(1, @deadbeef.tasks.size)
|
43
|
+
assert_equal(2, @metasyntactic.tasks.size)
|
44
|
+
|
45
|
+
assert_contains_task(@deadbeef, @lookup_deadbeef)
|
46
|
+
assert_not_contains_task(@deadbeef, @lookup_foo)
|
47
|
+
assert_not_contains_task(@foo, @lookup_deadbeef)
|
48
|
+
assert_contains_task(@foo, @lookup_foo)
|
49
|
+
|
50
|
+
assert_contains_task(@metasyntactic, @lookup_deadbeef)
|
51
|
+
assert_contains_task(@metasyntactic, @lookup_foo)
|
52
|
+
end
|
53
|
+
|
54
|
+
def assert_tagged_with(task, tag)
|
55
|
+
assert(task.tags.include?(tag), "#{task} expected to be tagged with #{tag}, but it isn't.'")
|
56
|
+
end
|
57
|
+
|
58
|
+
def assert_not_tagged_with(task, tag)
|
59
|
+
assert(!task.tags.include?(tag), "#{task} expected not to be tagged with #{tag}, but it actually is.")
|
60
|
+
end
|
61
|
+
|
62
|
+
def assert_contains_task(tag, task)
|
63
|
+
assert(tag.tasks.include?(task), "#{tag} expected to contain #{task}, but it doesn't.")
|
64
|
+
end
|
65
|
+
|
66
|
+
def assert_not_contains_task(tag, task)
|
67
|
+
assert(!tag.tasks.include?(task), "#{tag} expected to not contain #{task}, but it actually does.")
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'date'
|
3
|
+
require 'active_support/core_ext'
|
4
|
+
|
5
|
+
# TODO Add tests for dependencies
|
6
|
+
|
7
|
+
class TestTask < Test::Unit::TestCase
|
8
|
+
include TaskWarrior::Test::Validations
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@task = TaskWarrior::Task.new('foobar')
|
12
|
+
@task.id = 1
|
13
|
+
@task.uuid = '66465716-b08d-41ea-8567-91b988a2bcbf'
|
14
|
+
@task.entry = DateTime.now
|
15
|
+
@task.status = :pending
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_task_id_nil
|
19
|
+
@task.id = nil
|
20
|
+
assert_invalid(@task)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_task_id_0
|
24
|
+
@task.id = 0
|
25
|
+
assert_invalid(@task)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_task_uuid_nil
|
29
|
+
@task.uuid = nil
|
30
|
+
assert_invalid(@task)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_task_uuid_empty
|
34
|
+
@task.uuid = ''
|
35
|
+
assert_invalid(@task)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_task_uuid_wrong_format
|
39
|
+
@task.uuid = 'abcdefg'
|
40
|
+
assert_invalid(@task)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_task_entry_nil
|
44
|
+
@task.entry = nil
|
45
|
+
assert_invalid(@task)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_task_entry_empty
|
49
|
+
@task.entry = ''
|
50
|
+
assert_invalid(@task)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_task_entry_wrong_format
|
54
|
+
@task.entry = "foobar"
|
55
|
+
assert_invalid(@task)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_task_entry_future
|
59
|
+
@task.entry = DateTime.now.advance(:days => 1)
|
60
|
+
assert_invalid(@task)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_task_status_nil
|
64
|
+
@task.status = nil
|
65
|
+
assert_invalid(@task)
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_task_status_empty
|
69
|
+
@task.status = ''
|
70
|
+
assert_invalid(@task)
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_task_status_unknown_string
|
74
|
+
@task.status = "foobar"
|
75
|
+
assert_invalid(@task)
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_task_status_unknown_symbol
|
79
|
+
@task.status = :foobar
|
80
|
+
assert_invalid(@task)
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_task_priority_nil
|
84
|
+
@task.priority = nil
|
85
|
+
assert_valid(@task)
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_task_priority_empty
|
89
|
+
@task.priority = ''
|
90
|
+
assert_valid(@task)
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_task_priority_unknown_string
|
94
|
+
@task.priority = "foobar"
|
95
|
+
assert_invalid(@task)
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_task_priority_unknown_symbol
|
99
|
+
@task.priority = :foobar
|
100
|
+
assert_invalid(@task)
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_task_priority_high
|
104
|
+
@task.priority = :high
|
105
|
+
assert_valid(@task)
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_task_priority_medium
|
109
|
+
@task.priority = :medium
|
110
|
+
assert_valid(@task)
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_task_priority_low
|
114
|
+
@task.priority = :low
|
115
|
+
assert_valid(@task)
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_task_valid
|
119
|
+
assert_valid(@task)
|
120
|
+
end
|
121
|
+
end
|
metadata
ADDED
@@ -0,0 +1,196 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: taskwarrior
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Nicholas E. Rabenau
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-07-08 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activemodel
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.2'
|
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: '3.2'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: activesupport
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '3.2'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '3.2'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: twtest
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.0.5
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.0.5
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: guard-test
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0.5'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0.5'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: guard-bundler
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '1.0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '1.0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: rake
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0.9'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0.9'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: pry
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
description: Wraps access to TaskWarrior, the command-line task manager, in a Ruby
|
127
|
+
gem.
|
128
|
+
email:
|
129
|
+
- nerab@gmx.net
|
130
|
+
executables: []
|
131
|
+
extensions: []
|
132
|
+
extra_rdoc_files: []
|
133
|
+
files:
|
134
|
+
- .gitignore
|
135
|
+
- .travis.yml
|
136
|
+
- Gemfile
|
137
|
+
- Guardfile
|
138
|
+
- LICENSE
|
139
|
+
- README.md
|
140
|
+
- Rakefile
|
141
|
+
- lib/taskwarrior.rb
|
142
|
+
- lib/taskwarrior/priority_mapper.rb
|
143
|
+
- lib/taskwarrior/project.rb
|
144
|
+
- lib/taskwarrior/repository.rb
|
145
|
+
- lib/taskwarrior/tag.rb
|
146
|
+
- lib/taskwarrior/task.rb
|
147
|
+
- lib/taskwarrior/task_mapper.rb
|
148
|
+
- lib/taskwarrior/version.rb
|
149
|
+
- taskwarrior.gemspec
|
150
|
+
- test/fixtures/no_deps.json
|
151
|
+
- test/fixtures/party.json
|
152
|
+
- test/fixtures/party2.json
|
153
|
+
- test/fixtures/party_taxes.json
|
154
|
+
- test/test_helper.rb
|
155
|
+
- test/unit/test_priority_mapper.rb
|
156
|
+
- test/unit/test_project.rb
|
157
|
+
- test/unit/test_repository.rb
|
158
|
+
- test/unit/test_tag.rb
|
159
|
+
- test/unit/test_tag_habtm.rb
|
160
|
+
- test/unit/test_task.rb
|
161
|
+
homepage:
|
162
|
+
licenses: []
|
163
|
+
post_install_message:
|
164
|
+
rdoc_options: []
|
165
|
+
require_paths:
|
166
|
+
- lib
|
167
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
168
|
+
none: false
|
169
|
+
requirements:
|
170
|
+
- - ! '>='
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0'
|
173
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
174
|
+
none: false
|
175
|
+
requirements:
|
176
|
+
- - ! '>='
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
version: '0'
|
179
|
+
requirements: []
|
180
|
+
rubyforge_project:
|
181
|
+
rubygems_version: 1.8.24
|
182
|
+
signing_key:
|
183
|
+
specification_version: 3
|
184
|
+
summary: Ruby wrapper for TaskWarrior
|
185
|
+
test_files:
|
186
|
+
- test/fixtures/no_deps.json
|
187
|
+
- test/fixtures/party.json
|
188
|
+
- test/fixtures/party2.json
|
189
|
+
- test/fixtures/party_taxes.json
|
190
|
+
- test/test_helper.rb
|
191
|
+
- test/unit/test_priority_mapper.rb
|
192
|
+
- test/unit/test_project.rb
|
193
|
+
- test/unit/test_repository.rb
|
194
|
+
- test/unit/test_tag.rb
|
195
|
+
- test/unit/test_tag_habtm.rb
|
196
|
+
- test/unit/test_task.rb
|