pt 0.7.1 → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Changelog.md +4 -0
- data/Gemfile +1 -1
- data/README.md +4 -0
- data/lib/pt.rb +1 -1
- data/lib/pt/client.rb +10 -0
- data/lib/pt/data_row.rb +2 -1
- data/lib/pt/data_table.rb +16 -2
- data/lib/pt/ui.rb +82 -5
- metadata +15 -25
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d1b573d176005dc23c47c78858f9e282dfeda02c
|
4
|
+
data.tar.gz: 1acf12b9d197dfdfa164553258ede709a6c53e34
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a7eb5322d4009887006d0c03815844cf25ac0642c02ccdaa3e465491cd188d7ae420bc6367eb3f7340fb4d4dfcd39695b5e8ffe90fad0c0008c90412e18fb409
|
7
|
+
data.tar.gz: 3b5b3775fbbd340c0145e8d065ddf1886bed88e86848ee41cf9d03648791366c3ad8e32ab6cce19c621d62c276be9d48d62ec8c861d092bebb881302cfb0ecea
|
data/Changelog.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -30,6 +30,8 @@ Run `pt` from the root folder of your project.
|
|
30
30
|
|
31
31
|
pt comment [id] [comment] # add a comment
|
32
32
|
|
33
|
+
pt label [id] [label] # add a label
|
34
|
+
|
33
35
|
pt estimate [id] [0-3] # estimate a task in points scale
|
34
36
|
|
35
37
|
pt start [id] # mark a task as started
|
@@ -52,6 +54,8 @@ Run `pt` from the root folder of your project.
|
|
52
54
|
|
53
55
|
pt updates [number] # shows number recent activity from your current project
|
54
56
|
|
57
|
+
pt recent # shows stories you've recently shown or commented on with pt
|
58
|
+
|
55
59
|
All commands can be run entirely without arguments for a wizard based UI. Otherwise [required] <optional>.
|
56
60
|
Anything that takes an id will also take the num (index) from the pt command.
|
57
61
|
|
data/lib/pt.rb
CHANGED
data/lib/pt/client.rb
CHANGED
@@ -110,6 +110,16 @@ class PT::Client
|
|
110
110
|
task.update(:owned_by => owner)
|
111
111
|
end
|
112
112
|
|
113
|
+
def add_label(project, task, label)
|
114
|
+
task = PivotalTracker::Story.find(task.id, project.id)
|
115
|
+
if task.labels
|
116
|
+
task.labels += "," + label;
|
117
|
+
task.update(:labels => task.labels)
|
118
|
+
else
|
119
|
+
task.update(:labels => label)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
113
123
|
def comment_task(project, task, comment)
|
114
124
|
task = PivotalTracker::Story.find(task.id, project.id)
|
115
125
|
task.notes.create(:text => comment)
|
data/lib/pt/data_row.rb
CHANGED
@@ -2,11 +2,12 @@ require 'iconv' unless "older_ruby?".respond_to?(:force_encoding)
|
|
2
2
|
|
3
3
|
class PT::DataRow
|
4
4
|
|
5
|
-
attr_accessor :num, :record
|
5
|
+
attr_accessor :num, :record, :state
|
6
6
|
|
7
7
|
def initialize(orig, dataset)
|
8
8
|
@record = orig
|
9
9
|
@num = dataset.index(orig) + 1
|
10
|
+
@state = orig.current_state
|
10
11
|
end
|
11
12
|
|
12
13
|
def method_missing(method)
|
data/lib/pt/data_table.rb
CHANGED
@@ -14,10 +14,16 @@ module PT
|
|
14
14
|
if @rows.empty?
|
15
15
|
puts "\n#{'-- empty list --'.center(36)}\n"
|
16
16
|
else
|
17
|
+
|
18
|
+
max_width = Hirb::Util.detect_terminal_size()[0]
|
19
|
+
if config[:max_width] && config[:max_width] < max_width
|
20
|
+
max_width = config[:max_width]
|
21
|
+
end
|
22
|
+
|
17
23
|
self.class.table @rows, :fields => [:num] + self.class.fields,
|
18
24
|
:change_fields => %w{num pt_id},
|
19
25
|
:unicode => true, :description => false,
|
20
|
-
:max_width =>
|
26
|
+
:max_width => max_width
|
21
27
|
end
|
22
28
|
end
|
23
29
|
|
@@ -49,7 +55,15 @@ module PT
|
|
49
55
|
class TasksTable < DataTable
|
50
56
|
|
51
57
|
def self.fields
|
52
|
-
[:name, :
|
58
|
+
[:name, :state, :id]
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
class MultiUserTasksTable < DataTable
|
64
|
+
|
65
|
+
def self.fields
|
66
|
+
[:owned_by, :name, :state, :id]
|
53
67
|
end
|
54
68
|
|
55
69
|
end
|
data/lib/pt/ui.rb
CHANGED
@@ -71,6 +71,30 @@ class PT::UI
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
+
def recent
|
75
|
+
title("Your recent stories from #{project_to_s}")
|
76
|
+
stories = @project.stories.all( :id => @local_config[:recent_tasks] )
|
77
|
+
PT::MultiUserTasksTable.new(stories).print @global_config
|
78
|
+
end
|
79
|
+
|
80
|
+
def label
|
81
|
+
|
82
|
+
task = get_task_from_params "Please select a story to show"
|
83
|
+
unless task
|
84
|
+
message("No matches found for '#{@params[0]}', please use a valid pivotal story Id")
|
85
|
+
return
|
86
|
+
end
|
87
|
+
|
88
|
+
if @params[1]
|
89
|
+
label = @params[1]
|
90
|
+
else
|
91
|
+
label = ask("Which label?")
|
92
|
+
end
|
93
|
+
|
94
|
+
@client.add_label( @project, task, label );
|
95
|
+
|
96
|
+
end
|
97
|
+
|
74
98
|
def create
|
75
99
|
if @params[0]
|
76
100
|
name = @params[0]
|
@@ -153,6 +177,7 @@ class PT::UI
|
|
153
177
|
end
|
154
178
|
if @client.comment_task(@project, task, comment)
|
155
179
|
congrats("Comment sent, thanks!")
|
180
|
+
save_recent_task( task.id )
|
156
181
|
else
|
157
182
|
error("Ummm, something went wrong.")
|
158
183
|
end
|
@@ -462,6 +487,7 @@ class PT::UI
|
|
462
487
|
puts("pt open [id] # open a task in the browser")
|
463
488
|
puts("pt assign [id] <owner> # assign owner")
|
464
489
|
puts("pt comment [id] [comment] # add a comment")
|
490
|
+
puts("pt label [id] [label] # add a label")
|
465
491
|
puts("pt estimate [id] [0-3] # estimate a task in points scale")
|
466
492
|
puts("pt start [id] # mark a task as started")
|
467
493
|
puts("pt finish [id] # indicate you've finished a task")
|
@@ -472,6 +498,7 @@ class PT::UI
|
|
472
498
|
puts("pt find [query] # looks in your tasks by title and presents it")
|
473
499
|
puts("pt list [owner] or all # list all tasks for another pt user")
|
474
500
|
puts("pt updates [number] # shows number recent activity from your current project")
|
501
|
+
puts("pt recent # shows stories you've recently shown or commented on with pt")
|
475
502
|
puts("")
|
476
503
|
puts("All commands can be run entirely without arguments for a wizard based UI. Otherwise [required] <optional>.")
|
477
504
|
puts("Anything that takes an id will also take the num (index) from the pt command.")
|
@@ -636,16 +663,53 @@ class PT::UI
|
|
636
663
|
end
|
637
664
|
|
638
665
|
def show_task(task)
|
639
|
-
title task.name
|
666
|
+
title task.name.green
|
640
667
|
estimation = [-1, nil].include?(task.estimate) ? "Unestimated" : "#{task.estimate} points"
|
641
668
|
message "#{task.current_state.capitalize} #{task.story_type} | #{estimation} | Req: #{task.requested_by} | Owns: #{task.owned_by} | Id: #{task.id}"
|
669
|
+
|
670
|
+
if (task.labels)
|
671
|
+
message "Labels: " + task.labels.split(',').join(', ')
|
672
|
+
end
|
642
673
|
message task.description unless task.description.nil? || task.description.empty?
|
643
|
-
|
644
|
-
|
645
|
-
task.
|
646
|
-
|
674
|
+
message "View on pivotal: #{task.url}"
|
675
|
+
|
676
|
+
if task.tasks
|
677
|
+
task.tasks.all.each{ |t| compact_message "- #{t.complete ? "(done) " : "(pend)"} #{t.description}" }
|
678
|
+
end
|
679
|
+
|
680
|
+
# attachments on a note come through with the same description as the note
|
681
|
+
# to prevent the same update from showing multiple times, arrange by description for later lookup
|
682
|
+
attachment_match = Hash.new()
|
683
|
+
task.attachments.each do |a|
|
684
|
+
unless attachment_match[ a.description ]
|
685
|
+
attachment_match[ a.description ] = Array.new()
|
686
|
+
end
|
687
|
+
|
688
|
+
attachment_match[ a.description ].push( a );
|
689
|
+
end
|
690
|
+
|
691
|
+
task.notes.all.each do |n|
|
692
|
+
message "#{n.author.yellow}: #{n.text}"
|
693
|
+
# print attachements for this note
|
694
|
+
if attachment_match[ n.text ]
|
695
|
+
message "Attachments".bold
|
696
|
+
attachment_match[ n.text ].each{ |a| message "#{a.filename} #{a.url}" }
|
697
|
+
attachment_match.delete(n.text)
|
698
|
+
end
|
699
|
+
end
|
700
|
+
|
701
|
+
task.attachments.each do |a|
|
702
|
+
# skip attachments already printed as part of a note
|
703
|
+
if attachment_match[ a.description ]
|
704
|
+
message "#{a.uploaded_by.yellow} uploaded: \"#{a.description && a.description.empty? ? "#{a.filename}" : "#{a.description} (#{a.filename})" }\" #{a.url}"
|
705
|
+
end
|
706
|
+
end
|
707
|
+
|
708
|
+
save_recent_task( task.id )
|
709
|
+
|
647
710
|
end
|
648
711
|
|
712
|
+
|
649
713
|
def show_activity(activity, tasks)
|
650
714
|
story_id = activity.stories.first.id
|
651
715
|
task_id = nil
|
@@ -705,4 +769,17 @@ class PT::UI
|
|
705
769
|
end
|
706
770
|
end
|
707
771
|
|
772
|
+
def save_recent_task( task_id )
|
773
|
+
# save list of recently accessed tasks
|
774
|
+
unless (@local_config[:recent_tasks])
|
775
|
+
@local_config[:recent_tasks] = Array.new();
|
776
|
+
end
|
777
|
+
@local_config[:recent_tasks].unshift( task_id )
|
778
|
+
@local_config[:recent_tasks] = @local_config[:recent_tasks].uniq()
|
779
|
+
if @local_config[:recent_tasks].length > 10
|
780
|
+
@local_config[:recent_tasks].pop()
|
781
|
+
end
|
782
|
+
save_config( @local_config, LOCAL_CONFIG_PATH )
|
783
|
+
end
|
784
|
+
|
708
785
|
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
5
|
-
prerelease:
|
4
|
+
version: 0.7.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Raul Murciano
|
@@ -11,70 +10,62 @@ authors:
|
|
11
10
|
autorequire:
|
12
11
|
bindir: bin
|
13
12
|
cert_chain: []
|
14
|
-
date:
|
13
|
+
date: 2014-03-01 00:00:00.000000000 Z
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
17
16
|
name: pivotal-tracker
|
18
17
|
requirement: !ruby/object:Gem::Requirement
|
19
|
-
none: false
|
20
18
|
requirements:
|
21
|
-
- -
|
19
|
+
- - '>='
|
22
20
|
- !ruby/object:Gem::Version
|
23
21
|
version: 0.4.1
|
24
22
|
type: :runtime
|
25
23
|
prerelease: false
|
26
24
|
version_requirements: !ruby/object:Gem::Requirement
|
27
|
-
none: false
|
28
25
|
requirements:
|
29
|
-
- -
|
26
|
+
- - '>='
|
30
27
|
- !ruby/object:Gem::Version
|
31
28
|
version: 0.4.1
|
32
29
|
- !ruby/object:Gem::Dependency
|
33
30
|
name: hirb
|
34
31
|
requirement: !ruby/object:Gem::Requirement
|
35
|
-
none: false
|
36
32
|
requirements:
|
37
|
-
- -
|
33
|
+
- - '>='
|
38
34
|
- !ruby/object:Gem::Version
|
39
35
|
version: 0.4.5
|
40
36
|
type: :runtime
|
41
37
|
prerelease: false
|
42
38
|
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
none: false
|
44
39
|
requirements:
|
45
|
-
- -
|
40
|
+
- - '>='
|
46
41
|
- !ruby/object:Gem::Version
|
47
42
|
version: 0.4.5
|
48
43
|
- !ruby/object:Gem::Dependency
|
49
44
|
name: colored
|
50
45
|
requirement: !ruby/object:Gem::Requirement
|
51
|
-
none: false
|
52
46
|
requirements:
|
53
|
-
- -
|
47
|
+
- - '>='
|
54
48
|
- !ruby/object:Gem::Version
|
55
49
|
version: '1.2'
|
56
50
|
type: :runtime
|
57
51
|
prerelease: false
|
58
52
|
version_requirements: !ruby/object:Gem::Requirement
|
59
|
-
none: false
|
60
53
|
requirements:
|
61
|
-
- -
|
54
|
+
- - '>='
|
62
55
|
- !ruby/object:Gem::Version
|
63
56
|
version: '1.2'
|
64
57
|
- !ruby/object:Gem::Dependency
|
65
58
|
name: highline
|
66
59
|
requirement: !ruby/object:Gem::Requirement
|
67
|
-
none: false
|
68
60
|
requirements:
|
69
|
-
- -
|
61
|
+
- - '>='
|
70
62
|
- !ruby/object:Gem::Version
|
71
63
|
version: 1.6.1
|
72
64
|
type: :runtime
|
73
65
|
prerelease: false
|
74
66
|
version_requirements: !ruby/object:Gem::Requirement
|
75
|
-
none: false
|
76
67
|
requirements:
|
77
|
-
- -
|
68
|
+
- - '>='
|
78
69
|
- !ruby/object:Gem::Version
|
79
70
|
version: 1.6.1
|
80
71
|
description: Minimalist, opinionated client to manage your Pivotal Tracker tasks from
|
@@ -102,27 +93,26 @@ files:
|
|
102
93
|
- bin/pt
|
103
94
|
homepage: http://www.github.com/raul/pt
|
104
95
|
licenses: []
|
96
|
+
metadata: {}
|
105
97
|
post_install_message:
|
106
98
|
rdoc_options: []
|
107
99
|
require_paths:
|
108
100
|
- lib
|
109
101
|
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
-
none: false
|
111
102
|
requirements:
|
112
|
-
- -
|
103
|
+
- - '>='
|
113
104
|
- !ruby/object:Gem::Version
|
114
105
|
version: '0'
|
115
106
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
-
none: false
|
117
107
|
requirements:
|
118
|
-
- -
|
108
|
+
- - '>='
|
119
109
|
- !ruby/object:Gem::Version
|
120
110
|
version: '0'
|
121
111
|
requirements: []
|
122
112
|
rubyforge_project: pt
|
123
|
-
rubygems_version:
|
113
|
+
rubygems_version: 2.0.6
|
124
114
|
signing_key:
|
125
|
-
specification_version:
|
115
|
+
specification_version: 4
|
126
116
|
summary: Client to use Pivotal Tracker from the console.
|
127
117
|
test_files: []
|
128
118
|
has_rdoc:
|