tps_reporter 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/GUIDE.md +11 -12
- data/HISTORY.md +5 -0
- data/README.md +59 -27
- data/bin/tps +8 -4
- data/data/sample.taskpaper +25 -0
- data/lib/tps.rb +2 -0
- data/lib/tps/task_list.rb +2 -0
- data/lib/tps/taskpaper.rb +171 -0
- data/lib/tps/taskpaper_shim.rb +66 -0
- data/lib/tps/version.rb +1 -1
- data/tasks.taskpaper +23 -0
- data/test/fixtures/hello.taskpaper +48 -0
- data/test/settings_test.rb +11 -0
- data/test/taskpaper_test.rb +30 -0
- metadata +8 -2
- data/data/sample.yml +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ca34432146f58fced0ce7797a8ee1a50a842c3b
|
4
|
+
data.tar.gz: 78b442712fd0a2d687586d174c82cc758f4bbec8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 699b6087e62fe5e154f5797bee9cd349580a774a0ea27cccd90d0cc56eff15e4842378d6115a64a0325720ddb51e16d08cc20f817e30c1aacbe906537be37113
|
7
|
+
data.tar.gz: 49dfb6eaf9fe7dff6540dc5371ff7ee4bf69a268f71fcceb738095f5327394d1ffb992793fd3610dd5ba4e17c6c01fa4150c3c28eb17665cd36fb25545cbc030
|
data/GUIDE.md
CHANGED
@@ -11,26 +11,25 @@ List down the sprints.
|
|
11
11
|
|
12
12
|
Then simply add the sprint ID to your tasks.
|
13
13
|
|
14
|
-
# tasks.
|
14
|
+
# tasks.taskpaper
|
15
15
|
Sprints:
|
16
16
|
s1: Sprint 1 (Nov 1-15)
|
17
17
|
s2: Sprint 2 (Nov 16-30)
|
18
18
|
s3: Sprint 3 (Dec 1-15)
|
19
19
|
|
20
20
|
Beta release:
|
21
|
-
Account
|
22
|
-
Login
|
23
|
-
Logout
|
24
|
-
Signup
|
21
|
+
- Account
|
22
|
+
- Login @s1
|
23
|
+
- Logout @s1 @done
|
24
|
+
- Signup @s2
|
25
25
|
|
26
26
|
It's also recursive--you can put sprints in your parent tasks under `_`:
|
27
27
|
|
28
28
|
Beta release:
|
29
|
-
Blog
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
Delete posts:
|
29
|
+
- Blog @s3
|
30
|
+
- Create posts
|
31
|
+
- Read posts
|
32
|
+
- Delete posts
|
34
33
|
|
35
34
|
Trello card linking support
|
36
35
|
---------------------------
|
@@ -40,8 +39,8 @@ the short URL ID for the Trello card. You can see the short ID in Trello by
|
|
40
39
|
clicking "more..." inside the card popup.
|
41
40
|
|
42
41
|
Beta release:
|
43
|
-
Blog
|
44
|
-
Account management
|
42
|
+
- Blog @tr/Xh3pAGp1
|
43
|
+
- Account management
|
45
44
|
|
46
45
|
You can also link the card numbers, but you have to define the main Trello board
|
47
46
|
URL. Simply add `Trello URL: ____` to the top of the file.
|
data/HISTORY.md
CHANGED
data/README.md
CHANGED
@@ -14,7 +14,7 @@ Install TPS (Ruby):
|
|
14
14
|
$ gem install tps_reporter
|
15
15
|
|
16
16
|
...then generate a sample file. (or create `tasks.yml` based on [this sample
|
17
|
-
file.][
|
17
|
+
file.][sample])
|
18
18
|
|
19
19
|
$ tps sample
|
20
20
|
|
@@ -22,52 +22,48 @@ Edit it, then generate the report:
|
|
22
22
|
|
23
23
|
$ tps open
|
24
24
|
|
25
|
-
[
|
25
|
+
[sample]: https://github.com/rstacruz/tps_reporter/blob/master/data/sample.taskpaper
|
26
26
|
|
27
27
|
Format
|
28
28
|
------
|
29
29
|
|
30
|
-
The tasks file, usually `tasks.
|
30
|
+
The tasks file, usually `tasks.taskpaper`, is in [TaskPaper] format.
|
31
31
|
|
32
|
-
|
33
|
-
as you like.
|
32
|
+
They're simply a hierarchy of projects and tasks.
|
34
33
|
|
35
34
|
``` yaml
|
36
35
|
Edit users:
|
37
|
-
Register and signup
|
38
|
-
Login and logout
|
36
|
+
- Register and signup
|
37
|
+
- Login and logout
|
39
38
|
```
|
40
39
|
|
41
|
-
|
40
|
+
You can tag some projects or tasks.
|
42
41
|
|
43
42
|
``` yaml
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
Or for *branch* tasks, add it under the `_` task:
|
43
|
+
Facebook connect:
|
44
|
+
- Register via Facebook @done
|
45
|
+
- Capture email
|
48
46
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
Creating employees:
|
53
|
-
Editing employees:
|
47
|
+
Manage employees: @done
|
48
|
+
- Create user
|
49
|
+
- Edit user
|
54
50
|
```
|
55
51
|
|
56
|
-
The
|
57
|
-
`[tag1, tag2, etc]`. Allowed metadata are:
|
52
|
+
The following tags are recognized:
|
58
53
|
|
59
|
-
-
|
60
|
-
- `
|
61
|
-
-
|
62
|
-
-
|
63
|
-
-
|
64
|
-
-
|
54
|
+
- `@done`
|
55
|
+
- `@in_progress`
|
56
|
+
- `@pt/2839478` *(Pivotal tracker ID. Links to a Pivotal tracker story.)*
|
57
|
+
- `@tr/LabxGP3` *(Trello card short name. Links to a Trello card.)*
|
58
|
+
- `@0pt` *(points; influences percentage. needs to end in __pt__ or __pts__.)*
|
59
|
+
- `@10%` *(task progress. implies __in progress__.)*
|
65
60
|
|
66
61
|
Example:
|
67
62
|
|
68
63
|
``` yaml
|
69
|
-
|
70
|
-
|
64
|
+
Employee management:
|
65
|
+
- Creating employees @40%
|
66
|
+
- Editing employees @done @2pts
|
71
67
|
```
|
72
68
|
|
73
69
|
Exporting to PDF or image
|
@@ -86,3 +82,39 @@ looks like this:
|
|
86
82
|
![Comamnd line reporter][cli]
|
87
83
|
|
88
84
|
[cli]: https://img.skitch.com/20120204-ccb2guerhrjmj3rht3e4ies4ur.png
|
85
|
+
|
86
|
+
Sprints
|
87
|
+
-------
|
88
|
+
|
89
|
+
You can define sprints to help you see the workload of each sprint. First,
|
90
|
+
define your sprints on top of your file like so (this is a TaskPaper project
|
91
|
+
with notes):
|
92
|
+
|
93
|
+
``` yaml
|
94
|
+
Sprints:
|
95
|
+
s1: Sprint 1 (May 1)
|
96
|
+
s2: Sprint 2 (May 8)
|
97
|
+
s3: Sprint 3 (May 15)
|
98
|
+
```
|
99
|
+
|
100
|
+
The names are all arbitrary; `s1`..`s3` is just used here for convention; feel
|
101
|
+
free to use any string you like. (say, `week1`..`week7` works well for some
|
102
|
+
projects.)
|
103
|
+
|
104
|
+
Then use the names as tags (in this case, `@s1`, `@s2`):
|
105
|
+
|
106
|
+
``` yaml
|
107
|
+
Blog:
|
108
|
+
- Writing articles @s1
|
109
|
+
- Publishing @s2
|
110
|
+
```
|
111
|
+
|
112
|
+
|
113
|
+
Old YAML syntax
|
114
|
+
---------------
|
115
|
+
|
116
|
+
The old (v0.3.0) YAML syntax is still supported, see the [v0.3.0 readme] for
|
117
|
+
more info.
|
118
|
+
|
119
|
+
[v0.3.0 readme]: http://github.com/rstacruz/tps_reporter/blob/v0.3.0/README.md
|
120
|
+
[TaskPaper]: http://www.hogbaysoftware.com/products/taskpaper
|
data/bin/tps
CHANGED
@@ -62,7 +62,7 @@ module TPS::Command
|
|
62
62
|
exit 130
|
63
63
|
end
|
64
64
|
|
65
|
-
FileUtils.cp TPS.root('data', 'sample.
|
65
|
+
FileUtils.cp TPS.root('data', 'sample.taskpaper'), fn
|
66
66
|
info "Created '#{fn}'."
|
67
67
|
info "Edit it, then use `tps html` to generate HTML from it."
|
68
68
|
end
|
@@ -102,8 +102,8 @@ private
|
|
102
102
|
def tasks_filename
|
103
103
|
ARGV.extract('-f') ||
|
104
104
|
ENV['TPS_FILE'] ||
|
105
|
-
Dir['./{Tasksfile,tasks.yml}'].first ||
|
106
|
-
"tasks.
|
105
|
+
Dir['./{Tasksfile,tasks.yml,tasks.taskpaper}'].first ||
|
106
|
+
"tasks.taskpaper"
|
107
107
|
end
|
108
108
|
|
109
109
|
def output(&blk)
|
@@ -122,7 +122,11 @@ private
|
|
122
122
|
end
|
123
123
|
|
124
124
|
begin
|
125
|
-
|
125
|
+
if fn.match(/\.taskpaper/)
|
126
|
+
TPS::TaskList.new taskpaper: fn
|
127
|
+
else
|
128
|
+
TPS::TaskList.new yaml: fn
|
129
|
+
end
|
126
130
|
rescue Psych::SyntaxError => e
|
127
131
|
err "Parse error: #{e.message}"
|
128
132
|
exit 256
|
@@ -0,0 +1,25 @@
|
|
1
|
+
Version 1:
|
2
|
+
|
3
|
+
This file is in TaskPaper format.
|
4
|
+
Tabs are used to indent.
|
5
|
+
Each task begins with a "- ".
|
6
|
+
Projects end with a ":".
|
7
|
+
Tags are in the format "@tag_name".
|
8
|
+
All other lines (such as these) are considered as notes,
|
9
|
+
and are to be ignored.
|
10
|
+
|
11
|
+
- User signup
|
12
|
+
- Register for an account
|
13
|
+
- Log in @done
|
14
|
+
- Forget password
|
15
|
+
|
16
|
+
- Manage users @in_progress
|
17
|
+
- Create users @in_progress
|
18
|
+
- Delete users
|
19
|
+
- User profile page
|
20
|
+
|
21
|
+
- Blog
|
22
|
+
- Creating new posts @done
|
23
|
+
- Comments @done
|
24
|
+
- Moderating comments @done
|
25
|
+
|
data/lib/tps.rb
CHANGED
@@ -26,7 +26,9 @@ module TPS
|
|
26
26
|
autoload :TaskList, 'tps/task_list'
|
27
27
|
autoload :CliReporter, 'tps/cli_reporter'
|
28
28
|
autoload :Sprint, 'tps/sprint'
|
29
|
+
autoload :TaskPaper, 'tps/taskpaper'
|
29
30
|
autoload :BarFormatter, 'tps/bar_formatter'
|
31
|
+
autoload :TaskPaperShim, 'tps/taskpaper_shim'
|
30
32
|
|
31
33
|
require 'tps/version'
|
32
34
|
|
data/lib/tps/task_list.rb
CHANGED
@@ -0,0 +1,171 @@
|
|
1
|
+
# TaskPaper parser
|
2
|
+
#
|
3
|
+
# node = TaskPaper.parse("Project:\n\t- Hello\n\t- Hi")
|
4
|
+
#
|
5
|
+
# node.children #=> Array of <Node>
|
6
|
+
# node.level #=> 1 (depth)
|
7
|
+
#
|
8
|
+
# node.text #=> 'do things @done'
|
9
|
+
# node.plain_text #=> 'do things'
|
10
|
+
# node.tags #=> ['@done']
|
11
|
+
#
|
12
|
+
# node.node_type
|
13
|
+
# node.project?
|
14
|
+
# node.task?
|
15
|
+
# node.note?
|
16
|
+
#
|
17
|
+
module TPS::TaskPaper
|
18
|
+
class Node
|
19
|
+
attr_accessor :level
|
20
|
+
attr_accessor :node_type
|
21
|
+
attr_accessor :text
|
22
|
+
attr_reader :children
|
23
|
+
attr_reader :parent
|
24
|
+
|
25
|
+
DEFAULTS = {
|
26
|
+
:level => 0,
|
27
|
+
:node_type => :root,
|
28
|
+
:text => ''
|
29
|
+
}
|
30
|
+
|
31
|
+
def initialize(options)
|
32
|
+
options = DEFAULTS.merge(options)
|
33
|
+
options.each { |k, v| instance_variable_set :"@#{k}", v }
|
34
|
+
@children = options[:children].map { |data| Node.new data.merge(:parent => self) }
|
35
|
+
end
|
36
|
+
|
37
|
+
def project?
|
38
|
+
node_type == :project
|
39
|
+
end
|
40
|
+
|
41
|
+
def task?
|
42
|
+
node_type == :task
|
43
|
+
end
|
44
|
+
|
45
|
+
def note?
|
46
|
+
node_type == :note
|
47
|
+
end
|
48
|
+
|
49
|
+
def root?
|
50
|
+
level == 0
|
51
|
+
end
|
52
|
+
|
53
|
+
def parent?
|
54
|
+
!! parent
|
55
|
+
end
|
56
|
+
|
57
|
+
def breadcrumbs
|
58
|
+
(parent? ? parent.breadcrumbs : []) + [self]
|
59
|
+
end
|
60
|
+
|
61
|
+
TAG_REGEX = %r[(?:^|\s*)@[^\s]*(?:\([^\)]*\))?]
|
62
|
+
|
63
|
+
# Returns text without tags
|
64
|
+
def plain_text
|
65
|
+
text
|
66
|
+
.gsub(TAG_REGEX, '')
|
67
|
+
.gsub(/\s*:\s*$/, '')
|
68
|
+
.strip
|
69
|
+
end
|
70
|
+
|
71
|
+
def tags
|
72
|
+
text.scan(TAG_REGEX).map(&:strip)
|
73
|
+
end
|
74
|
+
|
75
|
+
def description
|
76
|
+
if children.length > 0
|
77
|
+
first_child = children[0]
|
78
|
+
return first_child.text if first_child.note?
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# Returns a TaskPaper document.
|
83
|
+
def to_s
|
84
|
+
indent = root? ? "" : "\t"
|
85
|
+
lines = ""
|
86
|
+
lines << to_line_s + "\n" unless root?
|
87
|
+
children.each { |node| lines << node.to_s.gsub(/^/, indent) }
|
88
|
+
lines
|
89
|
+
end
|
90
|
+
|
91
|
+
def to_line_s
|
92
|
+
if project?
|
93
|
+
"#{text}:"
|
94
|
+
elsif task?
|
95
|
+
"- #{text}"
|
96
|
+
else
|
97
|
+
"#{text}"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Returns a hash from a line
|
102
|
+
#
|
103
|
+
# parse_line("\t- Hello")
|
104
|
+
# #=> { node_type: :task, level: 2, text: "Hello" }
|
105
|
+
#
|
106
|
+
def self.parse_line(line)
|
107
|
+
node = {}
|
108
|
+
|
109
|
+
node[:level] = line.match(/^(\t*)/) && ($1.length + 1)
|
110
|
+
|
111
|
+
line = line.strip
|
112
|
+
if line =~ /^\- +(.*)$/
|
113
|
+
node[:node_type] = :task
|
114
|
+
node[:text] = $1
|
115
|
+
elsif line =~ /^(.*):((?:\s*#{TAG_REGEX})+)?$/m
|
116
|
+
node[:node_type] = :project
|
117
|
+
node[:text] = "#{$1}#{$2}"
|
118
|
+
else
|
119
|
+
node[:node_type] = :note
|
120
|
+
node[:text] = line
|
121
|
+
end
|
122
|
+
|
123
|
+
node[:children] = Array.new
|
124
|
+
node
|
125
|
+
end
|
126
|
+
|
127
|
+
def walk(&blk)
|
128
|
+
results = []
|
129
|
+
results << self if yield(self)
|
130
|
+
children.each { |node| results += node.walk(&blk) }
|
131
|
+
results
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
# Parses a string into a node tree.
|
136
|
+
# Returns a node.
|
137
|
+
#
|
138
|
+
# node = TaskPaper.parse("Project:\n\t- Hello\n\t- Hi")
|
139
|
+
#
|
140
|
+
def self.parse(string)
|
141
|
+
lines = string.split("\n")
|
142
|
+
|
143
|
+
root = { :node_type => :root, :level => 0, :children => [] }
|
144
|
+
ancestry = [root]
|
145
|
+
level = 0
|
146
|
+
|
147
|
+
lines.each_with_index do |line, i|
|
148
|
+
next if line.strip == ""
|
149
|
+
|
150
|
+
node = Node.parse_line(line)
|
151
|
+
|
152
|
+
if node[:level] <= level # Sibling
|
153
|
+
ancestry[node[:level]-1][:children] << node
|
154
|
+
elsif node[:level] == level + 1 # Child
|
155
|
+
ancestry[level][:children] << node
|
156
|
+
ancestry[level+1] = node
|
157
|
+
else
|
158
|
+
raise "Line #{i}: indentation mismatch (#{node[:level]} tabs found, expected 0..#{level+1})"
|
159
|
+
end
|
160
|
+
|
161
|
+
level = node[:level]
|
162
|
+
ancestry[level] = node
|
163
|
+
end
|
164
|
+
|
165
|
+
Node.new(root)
|
166
|
+
end
|
167
|
+
|
168
|
+
def self.load_file(file)
|
169
|
+
parse File.read(file)
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# Converts a TaskPaper document to the internal format (as represented by
|
2
|
+
# YAML).
|
3
|
+
#
|
4
|
+
# hash = TaskPaperShim.load('file.taskpaper')
|
5
|
+
# hash = TaskPaperShim.parse("Version 1:\n\t- Login")
|
6
|
+
#
|
7
|
+
module TPS::TaskPaperShim
|
8
|
+
extend self
|
9
|
+
|
10
|
+
SETTINGS = ['Trello URL']
|
11
|
+
|
12
|
+
def parse(source)
|
13
|
+
node = TPS::TaskPaper.parse(source)
|
14
|
+
|
15
|
+
hash = work(node)
|
16
|
+
hash
|
17
|
+
end
|
18
|
+
|
19
|
+
def work(node)
|
20
|
+
return nil if node.tags.empty? && node.children.empty?
|
21
|
+
hash = {}
|
22
|
+
|
23
|
+
# Load tags
|
24
|
+
tags = node.tags.map { |s| s.gsub(/^@/, '').gsub(/_/, ' ') }
|
25
|
+
if tags.any?
|
26
|
+
if node.children.any?
|
27
|
+
hash['_'] = tags
|
28
|
+
else
|
29
|
+
return tags
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Load children
|
34
|
+
node.children.each do |child|
|
35
|
+
text = child.plain_text
|
36
|
+
|
37
|
+
# For "Trello URL: xxx" settings
|
38
|
+
if is_setting?(child)
|
39
|
+
child.plain_text =~ /^(.*?): (.*)$/
|
40
|
+
hash[$1] = $2
|
41
|
+
|
42
|
+
# For "s1: Sprint 1" notes
|
43
|
+
elsif node.plain_text == "Sprints"
|
44
|
+
text.match(/^(.*?): (.*)$/) && hash[$1] = $2
|
45
|
+
|
46
|
+
# For everything else
|
47
|
+
elsif !child.note?
|
48
|
+
hash[text] = work(child)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
hash
|
53
|
+
end
|
54
|
+
|
55
|
+
# Checks if a given node is a settings node
|
56
|
+
def is_setting?(node)
|
57
|
+
if node.note?
|
58
|
+
SETTINGS.any? { |tag| node.plain_text =~ /^#{tag}:/ }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def load(file)
|
63
|
+
data = File.read(file)
|
64
|
+
parse data
|
65
|
+
end
|
66
|
+
end
|
data/lib/tps/version.rb
CHANGED
data/tasks.taskpaper
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
Sprints:
|
2
|
+
s1: Sprint 1 (November)
|
3
|
+
s2: Sprint 2 (Jan)
|
4
|
+
s3: Sprint 3 (December)
|
5
|
+
|
6
|
+
Version 1:
|
7
|
+
This is a note. It will be ignored.
|
8
|
+
|
9
|
+
User signup: @s1
|
10
|
+
- Register for an account
|
11
|
+
- Log in @done
|
12
|
+
- Forget password
|
13
|
+
|
14
|
+
- Manage users @in_progress @s1
|
15
|
+
- Create users @in_progress @s3
|
16
|
+
- Delete users
|
17
|
+
- User profile page
|
18
|
+
|
19
|
+
- Blog
|
20
|
+
- Creating new posts @done
|
21
|
+
- Comments @done
|
22
|
+
- Moderating comments
|
23
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
Milestone 1:
|
2
|
+
- First task @25%
|
3
|
+
|
4
|
+
User login:
|
5
|
+
- Login
|
6
|
+
- Signup
|
7
|
+
|
8
|
+
Overridden percent: @50%
|
9
|
+
- one @done
|
10
|
+
- two @done
|
11
|
+
- three @done
|
12
|
+
|
13
|
+
Explicit points: @15pt
|
14
|
+
- one @done
|
15
|
+
- two @done
|
16
|
+
- three @done
|
17
|
+
- four
|
18
|
+
|
19
|
+
Compound points:
|
20
|
+
- one
|
21
|
+
- two
|
22
|
+
three:
|
23
|
+
- sub1 @3pts @done
|
24
|
+
- sub2
|
25
|
+
|
26
|
+
Point rescaling:
|
27
|
+
Has 6 sub points, but will be rescaled to 8.
|
28
|
+
That is, the done "3" point task is actually worth 4 points.
|
29
|
+
|
30
|
+
one: @8pts
|
31
|
+
- sub1 @3pts @done
|
32
|
+
- sub2 @1pt
|
33
|
+
- sub3 @1pt
|
34
|
+
- sub4 @1pt
|
35
|
+
|
36
|
+
In progress:
|
37
|
+
- one
|
38
|
+
- two @in_progress
|
39
|
+
|
40
|
+
Progress override: @50%
|
41
|
+
#7
|
42
|
+
It's supposed to be 50% done because of it's subtasks, but
|
43
|
+
Defining our own percentage overrides that.
|
44
|
+
|
45
|
+
- one @done
|
46
|
+
- two
|
47
|
+
|
48
|
+
Milestone 2:
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
class SettingsTest < UnitTest
|
4
|
+
setup do
|
5
|
+
@hash = TPS::TaskPaperShim.parse("Trello URL: http://xyz\nVersion 1:\n\t- Hello")
|
6
|
+
end
|
7
|
+
|
8
|
+
test "use setting" do
|
9
|
+
assert_equal "http://xyz", @hash["Trello URL"]
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
class TaskpaperTest < UnitTest
|
4
|
+
test "parseable" do
|
5
|
+
data = File.read('tasks.taskpaper')
|
6
|
+
root = TPS::TaskPaper.parse(data)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "basic doc" do
|
10
|
+
setup do
|
11
|
+
@source = "Version 1:\n\t- Log in @done"
|
12
|
+
@node = TPS::TaskPaper.parse(@source)
|
13
|
+
end
|
14
|
+
|
15
|
+
test "should work" do
|
16
|
+
assert_equal @node.to_s.strip, @source
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "shim" do
|
21
|
+
setup do
|
22
|
+
@hash = TPS::TaskPaperShim.load('tasks.taskpaper')
|
23
|
+
end
|
24
|
+
|
25
|
+
test "should work" do
|
26
|
+
expected = {"Sprints"=>{"s1"=>"Sprint 1 (November)", "s2"=>"Sprint 2 (Jan)", "s3"=>"Sprint 3 (December)"}, "Version 1"=>{"User signup"=>{"_"=>["s1"], "Register for an account"=>nil, "Log in"=>["done"], "Forget password"=>nil}, "Manage users"=>{"_"=>["in progress", "s1"], "Create users"=>["in progress", "s3"], "Delete users"=>nil, "User profile page"=>nil}, "Blog"=>{"Creating new posts"=>["done"], "Comments"=>["done"], "Moderating comments"=>["done"]}}}
|
27
|
+
assert_equal expected, @hash
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tps_reporter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rico Sta. Cruz
|
@@ -54,7 +54,7 @@ files:
|
|
54
54
|
- Rakefile
|
55
55
|
- bin/tps
|
56
56
|
- data/index.haml
|
57
|
-
- data/sample.
|
57
|
+
- data/sample.taskpaper
|
58
58
|
- lib/tps.rb
|
59
59
|
- lib/tps/bar_formatter.rb
|
60
60
|
- lib/tps/cli_reporter.rb
|
@@ -62,8 +62,12 @@ files:
|
|
62
62
|
- lib/tps/sprint.rb
|
63
63
|
- lib/tps/task.rb
|
64
64
|
- lib/tps/task_list.rb
|
65
|
+
- lib/tps/taskpaper.rb
|
66
|
+
- lib/tps/taskpaper_shim.rb
|
65
67
|
- lib/tps/version.rb
|
68
|
+
- tasks.taskpaper
|
66
69
|
- test/bar_test.rb
|
70
|
+
- test/fixtures/hello.taskpaper
|
67
71
|
- test/fixtures/hello.yml
|
68
72
|
- test/fixtures/markers.yml
|
69
73
|
- test/fixtures/multi_sprints.yml
|
@@ -71,8 +75,10 @@ files:
|
|
71
75
|
- test/fixtures/sprints.yml
|
72
76
|
- test/html_test.rb
|
73
77
|
- test/multi_sprints_test.rb
|
78
|
+
- test/settings_test.rb
|
74
79
|
- test/sprint_points_test.rb
|
75
80
|
- test/sprint_test.rb
|
81
|
+
- test/taskpaper_test.rb
|
76
82
|
- test/test_helper.rb
|
77
83
|
- test/tps_test.rb
|
78
84
|
- tps_reporter.gemspec
|
data/data/sample.yml
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
Version 1:
|
2
|
-
|
3
|
-
User signup:
|
4
|
-
Register for an account:
|
5
|
-
Log in: [done]
|
6
|
-
Forget password:
|
7
|
-
|
8
|
-
Manage users:
|
9
|
-
_: [in progress]
|
10
|
-
Create users: [in progress]
|
11
|
-
Delete users:
|
12
|
-
User profile page:
|
13
|
-
|
14
|
-
Blog:
|
15
|
-
Creating new posts: [done]
|
16
|
-
Comments: [done]
|
17
|
-
Moderating comments: [done]
|
18
|
-
|