twdeps 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +0 -1
- data/README.md +6 -6
- data/bin/twdeps +2 -1
- data/examples/party.png +0 -0
- data/lib/twdeps/graph.rb +13 -16
- data/lib/twdeps/null_presenter.rb +11 -0
- data/lib/twdeps/presenter.rb +25 -0
- data/lib/twdeps/project_presenter.rb +3 -10
- data/lib/twdeps/task_presenter.rb +9 -17
- data/lib/twdeps/version.rb +1 -1
- data/lib/twdeps.rb +5 -9
- data/test/unit/test_graph.rb +7 -7
- data/test/unit/test_presenters.rb +41 -0
- data/twdeps.gemspec +2 -5
- metadata +17 -79
- data/lib/twdeps/priority_mapper.rb +0 -9
- data/lib/twdeps/project.rb +0 -33
- data/lib/twdeps/tag.rb +0 -48
- data/lib/twdeps/task.rb +0 -52
- data/lib/twdeps/task_mapper.rb +0 -30
- data/lib/twdeps/task_repository.rb +0 -77
- data/test/unit/test_priority_mapper.rb +0 -27
- data/test/unit/test_project.rb +0 -55
- data/test/unit/test_repository.rb +0 -64
- data/test/unit/test_tag.rb +0 -57
- data/test/unit/test_tag_habtm.rb +0 -69
- data/test/unit/test_task.rb +0 -121
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 65c4a0831441f978b94e806b7492a4cfb34ce0f7
|
4
|
+
data.tar.gz: c2ea1deb638801eac176a4c70663aef572c994fc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c034226377e9a2707b0225729dbe3ca383e321ced8e4cfdc7d63a786ddf712783b20fa0a3b371985a9c4c7dff29fe398ae60708893c5189b570d24304d982bad
|
7
|
+
data.tar.gz: 5bd6d1f659ef348eeb503f69cdc1278432036116474a5bc349c39b0b529576cb92b0fb142c0ad17db8ba619c84efca0dee42015d8717a8a478410fe0d8bce30d
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -14,7 +14,7 @@ Given a set of interdependent tasks described in the TaskWarrior [tutorial](http
|
|
14
14
|
|
15
15
|
Result:
|
16
16
|
|
17
|
-
![party](/nerab/twdeps/
|
17
|
+
![party](https://raw.github.com/nerab/twdeps/master/examples/party.png)
|
18
18
|
|
19
19
|
## Installation
|
20
20
|
|
@@ -26,16 +26,16 @@ Result:
|
|
26
26
|
# See [Limitations](Limitations) below for why we need the extra task parms
|
27
27
|
task export rc.json.array=on rc.verbose=nothing | twdeps > deps.png
|
28
28
|
|
29
|
-
# Same but
|
30
|
-
task export | twdeps --format svg > deps.svg
|
29
|
+
# Same but specify output format
|
30
|
+
task export rc.json.array=on rc.verbose=nothing | twdeps --format svg > deps.svg
|
31
31
|
|
32
32
|
# Create a graph from a previously exported file
|
33
|
-
task export > tasks.json
|
33
|
+
task export rc.json.array=on rc.verbose=nothing > tasks.json
|
34
34
|
cat tasks.json | twdeps > deps.png
|
35
35
|
|
36
36
|
# Display graph in browser without creating an intermediate file
|
37
37
|
# Requires bcat to be installed
|
38
|
-
task export | twdeps --format svg | bcat
|
38
|
+
task export rc.json.array=on rc.verbose=nothing | twdeps --format svg | bcat
|
39
39
|
|
40
40
|
## Dependencies
|
41
41
|
|
@@ -45,7 +45,7 @@ The graph is generated with [ruby-graphviz](https://github.com/glejeune/Ruby-Gra
|
|
45
45
|
|
46
46
|
## Limitations
|
47
47
|
|
48
|
-
Due to [two](http://taskwarrior.org/issues/1017) [bugs](http://taskwarrior.org/issues/1013) in JSON export, TaskWarrior 2.
|
48
|
+
Due to [two](http://taskwarrior.org/issues/1017) [bugs](http://taskwarrior.org/issues/1013) in JSON export, TaskWarrior versions before 2.1 need the additional command line options `rc.json.array=on` and `rc.verbose=nothing`.
|
49
49
|
|
50
50
|
## Contributing
|
51
51
|
|
data/bin/twdeps
CHANGED
@@ -26,6 +26,7 @@ where [options] are:
|
|
26
26
|
|
27
27
|
EOS
|
28
28
|
opt :format, "Specify output format", :default => 'svg'
|
29
|
+
opt :title, "Specify title", :default => 'Task Dependencies'
|
29
30
|
opt :trace, "Enable trace output", :default => false
|
30
31
|
end
|
31
32
|
|
@@ -36,7 +37,7 @@ Trollop::die :format, "must be one of #{Graph.formats.join(', ')}" unless Graph.
|
|
36
37
|
|
37
38
|
begin
|
38
39
|
repo = Repository.new(ARGF.read)
|
39
|
-
master = Graph.new(
|
40
|
+
master = Graph.new(Presenter.new(opts[:title]))
|
40
41
|
|
41
42
|
# Add all projects (will add their tasks and dependencies recursively)
|
42
43
|
repo.projects.each do |project|
|
data/examples/party.png
CHANGED
Binary file
|
data/lib/twdeps/graph.rb
CHANGED
@@ -1,15 +1,5 @@
|
|
1
1
|
module TaskWarrior
|
2
2
|
module Dependencies
|
3
|
-
class NullPresenter
|
4
|
-
def attributes
|
5
|
-
{:label => 'Unknown', :fontcolor => 'red'}
|
6
|
-
end
|
7
|
-
|
8
|
-
def id
|
9
|
-
'null'
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
3
|
# Builds a dependency graph
|
14
4
|
#
|
15
5
|
# +thing+ is added as node with all of its dependencies. A presenter is used to present the task as node label.
|
@@ -29,9 +19,14 @@ module TaskWarrior
|
|
29
19
|
|
30
20
|
#
|
31
21
|
# Build a new Graph for +thing+
|
32
|
-
#
|
33
|
-
def initialize(
|
34
|
-
|
22
|
+
#
|
23
|
+
def initialize(presenter_or_id)
|
24
|
+
if presenter_or_id.respond_to?(:attributes)
|
25
|
+
@graph = GraphViz::new(presenter_or_id.id, presenter_or_id.attributes)
|
26
|
+
else
|
27
|
+
@graph = GraphViz::new(presenter_or_id)
|
28
|
+
end
|
29
|
+
|
35
30
|
@dependencies = []
|
36
31
|
@edges = []
|
37
32
|
end
|
@@ -52,7 +47,7 @@ module TaskWarrior
|
|
52
47
|
else
|
53
48
|
# it's a project
|
54
49
|
project = task_or_project
|
55
|
-
cluster = Graph.new(presenter(project)
|
50
|
+
cluster = Graph.new(presenter(project))
|
56
51
|
|
57
52
|
project.tasks.each do |task|
|
58
53
|
cluster << task
|
@@ -74,7 +69,7 @@ module TaskWarrior
|
|
74
69
|
def create_edges(nodeA, nodes)
|
75
70
|
nodes.each do |node|
|
76
71
|
nodeB = find_or_create_node(node)
|
77
|
-
create_edge(
|
72
|
+
create_edge(nodeB, nodeA)
|
78
73
|
end
|
79
74
|
end
|
80
75
|
|
@@ -90,7 +85,9 @@ module TaskWarrior
|
|
90
85
|
edge = [nodeA, nodeB]
|
91
86
|
unless @edges.include?(edge) # GraphViz lacks get_edge, so we need to track existing edges ourselfes
|
92
87
|
@edges << edge
|
93
|
-
|
88
|
+
|
89
|
+
# We present the edges in the sense of "nodeB depends on nodeA"
|
90
|
+
@graph.add_edges(nodeA, nodeB, :dir => 'back', :tooltip => "#{nodeB['label']} depends on #{nodeA['label']}")
|
94
91
|
end
|
95
92
|
end
|
96
93
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module TaskWarrior
|
2
|
+
module Dependencies
|
3
|
+
#
|
4
|
+
# Presents a thing to the graph
|
5
|
+
#
|
6
|
+
class Presenter
|
7
|
+
def initialize(id)
|
8
|
+
@id = id
|
9
|
+
@attributes = {:label => id, :labelloc => 'top'}
|
10
|
+
end
|
11
|
+
|
12
|
+
def attributes
|
13
|
+
@attributes
|
14
|
+
end
|
15
|
+
|
16
|
+
def id
|
17
|
+
@id
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
attr_writer :id, :attributes
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
@@ -3,17 +3,10 @@ module TaskWarrior
|
|
3
3
|
#
|
4
4
|
# Presents a project's attributes suitable for a GraphViz cluster
|
5
5
|
#
|
6
|
-
class ProjectPresenter
|
6
|
+
class ProjectPresenter < Presenter
|
7
7
|
def initialize(project)
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def attributes
|
12
|
-
{:label => @project.name}
|
13
|
-
end
|
14
|
-
|
15
|
-
def id
|
16
|
-
"cluster_#{@project.name}"
|
8
|
+
self.id = "cluster_#{project.name}"
|
9
|
+
self.attributes = {:label => project.name}
|
17
10
|
end
|
18
11
|
end
|
19
12
|
end
|
@@ -3,25 +3,17 @@ module TaskWarrior
|
|
3
3
|
#
|
4
4
|
# Presents a task's attributes suitable for a GraphViz node
|
5
5
|
#
|
6
|
-
class TaskPresenter
|
6
|
+
class TaskPresenter < Presenter
|
7
7
|
def initialize(task)
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
attrs.merge!({:tooltip => "Status: #{@task.status}"})
|
14
|
-
|
15
|
-
# TODO Once we see the urgency in the JSON export, we can color-code the nodes
|
16
|
-
# http://taskwarrior.org/issues/973
|
17
|
-
# attrs.merge!({:fillcolor => 'red', :style => 'filled'})
|
8
|
+
self.id = task.uuid
|
9
|
+
self.attributes = {
|
10
|
+
:label => task.description,
|
11
|
+
:tooltip => "Status: #{task.status}"
|
12
|
+
}
|
18
13
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
def id
|
24
|
-
@task.uuid
|
14
|
+
if :completed == task.status
|
15
|
+
self.attributes.merge!({:fontcolor => 'gray', :color => 'gray'})
|
16
|
+
end
|
25
17
|
end
|
26
18
|
end
|
27
19
|
end
|
data/lib/twdeps/version.rb
CHANGED
data/lib/twdeps.rb
CHANGED
@@ -1,17 +1,13 @@
|
|
1
|
-
require "
|
2
|
-
|
3
|
-
require "twdeps/task"
|
4
|
-
require "twdeps/project"
|
5
|
-
require "twdeps/tag"
|
6
|
-
|
7
|
-
require "twdeps/task_mapper"
|
8
|
-
require "twdeps/priority_mapper"
|
9
|
-
require "twdeps/task_repository"
|
1
|
+
require "taskwarrior"
|
10
2
|
|
3
|
+
require "twdeps/version"
|
11
4
|
require "twdeps/graph"
|
5
|
+
require "twdeps/presenter"
|
12
6
|
require "twdeps/task_presenter"
|
13
7
|
require "twdeps/project_presenter"
|
8
|
+
require "twdeps/null_presenter"
|
14
9
|
|
10
|
+
# dependencies
|
15
11
|
require "graphviz"
|
16
12
|
require "json"
|
17
13
|
|
data/test/unit/test_graph.rb
CHANGED
@@ -8,7 +8,7 @@ module TaskWarrior
|
|
8
8
|
def setup
|
9
9
|
repo = TaskWarrior::Repository.new(File.read(fixture('party_taxes.json')))
|
10
10
|
|
11
|
-
plain = TaskWarrior::Dependencies::Graph.new
|
11
|
+
plain = TaskWarrior::Dependencies::Graph.new(self.class.name)
|
12
12
|
|
13
13
|
repo.tasks.each do |task|
|
14
14
|
plain << task
|
@@ -31,12 +31,12 @@ module TaskWarrior
|
|
31
31
|
|
32
32
|
def test_edges
|
33
33
|
assert_equal(6, @graph.edges.size)
|
34
|
-
assert_not_nil(@graph.edge('
|
35
|
-
assert_not_nil(@graph.edge('
|
36
|
-
assert_not_nil(@graph.edge('
|
37
|
-
assert_not_nil(@graph.edge('
|
38
|
-
assert_not_nil(@graph.edge('
|
39
|
-
assert_not_nil(@graph.edge('
|
34
|
+
assert_not_nil(@graph.edge('6fd0ba4a-ab67-49cd-ac69-64aa999aff8a', 'c992448a-f1ea-4982-8461-47f0705ff509'))
|
35
|
+
assert_not_nil(@graph.edge('9f6f3738-1c08-4f45-8eb4-1e90864c7588', '3b53178e-d5a4-45e0-afc2-1292db58a59a'))
|
36
|
+
assert_not_nil(@graph.edge('e5a867b7-0116-457d-ba43-9ac2bee6ad2a', '9f6f3738-1c08-4f45-8eb4-1e90864c7588'))
|
37
|
+
assert_not_nil(@graph.edge('c992448a-f1ea-4982-8461-47f0705ff509', 'e5a867b7-0116-457d-ba43-9ac2bee6ad2a'))
|
38
|
+
assert_not_nil(@graph.edge('6fd0ba4a-ab67-49cd-ac69-64aa999aff8a', 'c590941b-eb10-4569-bdc9-0e339f79305e'))
|
39
|
+
assert_not_nil(@graph.edge('c992448a-f1ea-4982-8461-47f0705ff509', 'c590941b-eb10-4569-bdc9-0e339f79305e'))
|
40
40
|
end
|
41
41
|
|
42
42
|
private
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module TaskWarrior
|
4
|
+
module Test
|
5
|
+
class TestPresenters < ::Test::Unit::TestCase
|
6
|
+
include TaskWarrior::Dependencies
|
7
|
+
include TaskWarrior::Test::Fixtures
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@repo = TaskWarrior::Repository.new(File.read(fixture('party_taxes.json')))
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_string_presentation
|
14
|
+
foo = 'foo'
|
15
|
+
p = Presenter.new(foo)
|
16
|
+
assert_equal(foo, p.id)
|
17
|
+
assert_not_nil(p.attributes)
|
18
|
+
assert_equal({:label=>"foo", :labelloc=>"top"}, p.attributes)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_null_presentation
|
22
|
+
p = NullPresenter.new
|
23
|
+
assert_equal('null', p.id)
|
24
|
+
assert_equal({:label => 'Unknown', :fontcolor => 'red'}, p.attributes)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_project_presentation
|
28
|
+
p = ProjectPresenter.new(@repo.project('party'))
|
29
|
+
assert_equal('cluster_party', p.id)
|
30
|
+
assert_equal({:label => 'party'}, p.attributes)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_task_presentation
|
34
|
+
uuid = '67aafe0b-ddd7-482b-9cfa-ac42c43e7559'
|
35
|
+
p = TaskPresenter.new(@repo[uuid])
|
36
|
+
assert_equal(uuid, p.id)
|
37
|
+
assert_equal({:label => 'Get cash from ATM', :tooltip => 'Status: pending'}, p.attributes)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/twdeps.gemspec
CHANGED
@@ -16,13 +16,10 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.version = TaskWarrior::Dependencies::VERSION
|
17
17
|
|
18
18
|
gem.add_dependency 'ruby-graphviz', '~> 1.0.7'
|
19
|
-
gem.add_dependency 'activemodel', '~> 3.2'
|
20
19
|
gem.add_dependency 'trollop', '~> 1'
|
21
|
-
gem.
|
22
|
-
gem.add_development_dependency 'twtest', '~> 0.0.
|
20
|
+
gem.add_dependency 'taskwarrior', '~> 0.0.6'
|
21
|
+
gem.add_development_dependency 'twtest', '~> 0.0.6'
|
23
22
|
gem.add_development_dependency 'guard-test', '~> 0.5'
|
24
23
|
gem.add_development_dependency 'guard-bundler', '~> 1.0'
|
25
24
|
gem.add_development_dependency 'rake', '~> 0.9'
|
26
|
-
|
27
|
-
gem.add_development_dependency 'pry'
|
28
25
|
end
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twdeps
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Nicholas E. Rabenau
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-07-21 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: ruby-graphviz
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,31 +20,13 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: 1.0.7
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: activemodel
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - ~>
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '3.2'
|
38
|
-
type: :runtime
|
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
27
|
- !ruby/object:Gem::Dependency
|
47
28
|
name: trollop
|
48
29
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
30
|
requirements:
|
51
31
|
- - ~>
|
52
32
|
- !ruby/object:Gem::Version
|
@@ -54,47 +34,41 @@ dependencies:
|
|
54
34
|
type: :runtime
|
55
35
|
prerelease: false
|
56
36
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
37
|
requirements:
|
59
38
|
- - ~>
|
60
39
|
- !ruby/object:Gem::Version
|
61
40
|
version: '1'
|
62
41
|
- !ruby/object:Gem::Dependency
|
63
|
-
name:
|
42
|
+
name: taskwarrior
|
64
43
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
44
|
requirements:
|
67
45
|
- - ~>
|
68
46
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
70
|
-
type: :
|
47
|
+
version: 0.0.6
|
48
|
+
type: :runtime
|
71
49
|
prerelease: false
|
72
50
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
51
|
requirements:
|
75
52
|
- - ~>
|
76
53
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
54
|
+
version: 0.0.6
|
78
55
|
- !ruby/object:Gem::Dependency
|
79
56
|
name: twtest
|
80
57
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
58
|
requirements:
|
83
59
|
- - ~>
|
84
60
|
- !ruby/object:Gem::Version
|
85
|
-
version: 0.0.
|
61
|
+
version: 0.0.6
|
86
62
|
type: :development
|
87
63
|
prerelease: false
|
88
64
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
65
|
requirements:
|
91
66
|
- - ~>
|
92
67
|
- !ruby/object:Gem::Version
|
93
|
-
version: 0.0.
|
68
|
+
version: 0.0.6
|
94
69
|
- !ruby/object:Gem::Dependency
|
95
70
|
name: guard-test
|
96
71
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
72
|
requirements:
|
99
73
|
- - ~>
|
100
74
|
- !ruby/object:Gem::Version
|
@@ -102,7 +76,6 @@ dependencies:
|
|
102
76
|
type: :development
|
103
77
|
prerelease: false
|
104
78
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
79
|
requirements:
|
107
80
|
- - ~>
|
108
81
|
- !ruby/object:Gem::Version
|
@@ -110,7 +83,6 @@ dependencies:
|
|
110
83
|
- !ruby/object:Gem::Dependency
|
111
84
|
name: guard-bundler
|
112
85
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
86
|
requirements:
|
115
87
|
- - ~>
|
116
88
|
- !ruby/object:Gem::Version
|
@@ -118,7 +90,6 @@ dependencies:
|
|
118
90
|
type: :development
|
119
91
|
prerelease: false
|
120
92
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
93
|
requirements:
|
123
94
|
- - ~>
|
124
95
|
- !ruby/object:Gem::Version
|
@@ -126,7 +97,6 @@ dependencies:
|
|
126
97
|
- !ruby/object:Gem::Dependency
|
127
98
|
name: rake
|
128
99
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
100
|
requirements:
|
131
101
|
- - ~>
|
132
102
|
- !ruby/object:Gem::Version
|
@@ -134,27 +104,10 @@ dependencies:
|
|
134
104
|
type: :development
|
135
105
|
prerelease: false
|
136
106
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
107
|
requirements:
|
139
108
|
- - ~>
|
140
109
|
- !ruby/object:Gem::Version
|
141
110
|
version: '0.9'
|
142
|
-
- !ruby/object:Gem::Dependency
|
143
|
-
name: pry
|
144
|
-
requirement: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
|
-
requirements:
|
147
|
-
- - ! '>='
|
148
|
-
- !ruby/object:Gem::Version
|
149
|
-
version: '0'
|
150
|
-
type: :development
|
151
|
-
prerelease: false
|
152
|
-
version_requirements: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
|
-
requirements:
|
155
|
-
- - ! '>='
|
156
|
-
- !ruby/object:Gem::Version
|
157
|
-
version: '0'
|
158
111
|
description: Takes a TaskWarrior export and emits a graph that visualizes the dependencies
|
159
112
|
between tasks.
|
160
113
|
email:
|
@@ -175,14 +128,10 @@ files:
|
|
175
128
|
- examples/party.png
|
176
129
|
- lib/twdeps.rb
|
177
130
|
- lib/twdeps/graph.rb
|
178
|
-
- lib/twdeps/
|
179
|
-
- lib/twdeps/
|
131
|
+
- lib/twdeps/null_presenter.rb
|
132
|
+
- lib/twdeps/presenter.rb
|
180
133
|
- lib/twdeps/project_presenter.rb
|
181
|
-
- lib/twdeps/tag.rb
|
182
|
-
- lib/twdeps/task.rb
|
183
|
-
- lib/twdeps/task_mapper.rb
|
184
134
|
- lib/twdeps/task_presenter.rb
|
185
|
-
- lib/twdeps/task_repository.rb
|
186
135
|
- lib/twdeps/version.rb
|
187
136
|
- test/fixtures/no_deps.json
|
188
137
|
- test/fixtures/party.json
|
@@ -192,36 +141,30 @@ files:
|
|
192
141
|
- test/integration/test_dependencies.rb
|
193
142
|
- test/test_helper.rb
|
194
143
|
- test/unit/test_graph.rb
|
195
|
-
- test/unit/
|
196
|
-
- test/unit/test_project.rb
|
197
|
-
- test/unit/test_repository.rb
|
198
|
-
- test/unit/test_tag.rb
|
199
|
-
- test/unit/test_tag_habtm.rb
|
200
|
-
- test/unit/test_task.rb
|
144
|
+
- test/unit/test_presenters.rb
|
201
145
|
- twdeps.gemspec
|
202
146
|
homepage: ''
|
203
147
|
licenses: []
|
148
|
+
metadata: {}
|
204
149
|
post_install_message:
|
205
150
|
rdoc_options: []
|
206
151
|
require_paths:
|
207
152
|
- lib
|
208
153
|
required_ruby_version: !ruby/object:Gem::Requirement
|
209
|
-
none: false
|
210
154
|
requirements:
|
211
|
-
- -
|
155
|
+
- - '>='
|
212
156
|
- !ruby/object:Gem::Version
|
213
157
|
version: '0'
|
214
158
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
215
|
-
none: false
|
216
159
|
requirements:
|
217
|
-
- -
|
160
|
+
- - '>='
|
218
161
|
- !ruby/object:Gem::Version
|
219
162
|
version: '0'
|
220
163
|
requirements: []
|
221
164
|
rubyforge_project:
|
222
|
-
rubygems_version:
|
165
|
+
rubygems_version: 2.0.3
|
223
166
|
signing_key:
|
224
|
-
specification_version:
|
167
|
+
specification_version: 4
|
225
168
|
summary: Visualizes dependencies between TaskWarrior tasks.
|
226
169
|
test_files:
|
227
170
|
- test/fixtures/no_deps.json
|
@@ -232,9 +175,4 @@ test_files:
|
|
232
175
|
- test/integration/test_dependencies.rb
|
233
176
|
- test/test_helper.rb
|
234
177
|
- test/unit/test_graph.rb
|
235
|
-
- test/unit/
|
236
|
-
- test/unit/test_project.rb
|
237
|
-
- test/unit/test_repository.rb
|
238
|
-
- test/unit/test_tag.rb
|
239
|
-
- test/unit/test_tag_habtm.rb
|
240
|
-
- test/unit/test_task.rb
|
178
|
+
- test/unit/test_presenters.rb
|
data/lib/twdeps/project.rb
DELETED
@@ -1,33 +0,0 @@
|
|
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
|
data/lib/twdeps/tag.rb
DELETED
@@ -1,48 +0,0 @@
|
|
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
|
data/lib/twdeps/task.rb
DELETED
@@ -1,52 +0,0 @@
|
|
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
|
data/lib/twdeps/task_mapper.rb
DELETED
@@ -1,30 +0,0 @@
|
|
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
|
@@ -1,77 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
|
3
|
-
module TaskWarrior
|
4
|
-
class SimpleTag
|
5
|
-
attr_reader :name, :tasks
|
6
|
-
|
7
|
-
def initialize(name)
|
8
|
-
@name = name
|
9
|
-
@tasks = []
|
10
|
-
end
|
11
|
-
|
12
|
-
def <<(task)
|
13
|
-
@tasks << task unless @tasks.include?(task)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class Repository
|
18
|
-
def initialize(input)
|
19
|
-
@tasks = {}
|
20
|
-
@projects = Hash.new{|hash, key| hash[key] = Project.new(key)}
|
21
|
-
@tags = Hash.new{|hash, key| hash[key] = Tag.new(key)}
|
22
|
-
|
23
|
-
JSON.parse(input).each{|json|
|
24
|
-
task = TaskWarrior::TaskMapper.map(json)
|
25
|
-
@tasks[task.uuid] = task
|
26
|
-
@projects[task.project].tasks << task if task.project
|
27
|
-
|
28
|
-
# Create a new Tag object in @tags that is the value for each tag name
|
29
|
-
task.tags.each{|tag_name| @tags[tag_name] << task}
|
30
|
-
}
|
31
|
-
|
32
|
-
# Replace the uuid of each dependency with the real task
|
33
|
-
@tasks.each_value{|task| task.dependencies.map!{|uuid| @tasks[uuid]}}
|
34
|
-
|
35
|
-
# Replace the project property of each task with a proper Project object carrying a name and all of the project's tasks
|
36
|
-
@tasks.each_value{|task| task.project = @projects[task.project] if task.project}
|
37
|
-
|
38
|
-
# Add child tasks to their parent, but keep them in the global index
|
39
|
-
@tasks.each_value do |task|
|
40
|
-
if task.parent
|
41
|
-
parent = @tasks[task.parent]
|
42
|
-
|
43
|
-
if parent # we know the parent
|
44
|
-
parent.children << task
|
45
|
-
task.parent = parent
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def tasks
|
52
|
-
# Do not expose child tasks directly
|
53
|
-
@tasks.values.reject{|t| t.parent}
|
54
|
-
end
|
55
|
-
|
56
|
-
# direct lookup by uuid
|
57
|
-
def [](uuid)
|
58
|
-
@tasks[uuid]
|
59
|
-
end
|
60
|
-
|
61
|
-
def projects
|
62
|
-
@projects.values
|
63
|
-
end
|
64
|
-
|
65
|
-
def project(name)
|
66
|
-
@projects[name] if @projects.has_key?(name)
|
67
|
-
end
|
68
|
-
|
69
|
-
def tags
|
70
|
-
@tags.values
|
71
|
-
end
|
72
|
-
|
73
|
-
def tag(name)
|
74
|
-
@tags[name] if @tags.has_key?(name)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
@@ -1,27 +0,0 @@
|
|
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
|
data/test/unit/test_project.rb
DELETED
@@ -1,55 +0,0 @@
|
|
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
|
@@ -1,64 +0,0 @@
|
|
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
|
data/test/unit/test_tag.rb
DELETED
@@ -1,57 +0,0 @@
|
|
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
|
data/test/unit/test_tag_habtm.rb
DELETED
@@ -1,69 +0,0 @@
|
|
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
|
data/test/unit/test_task.rb
DELETED
@@ -1,121 +0,0 @@
|
|
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
|