asana-cli 0.0.1 → 0.0.2
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/asana-cli.gemspec +1 -1
- data/bin/asana +23 -40
- data/lib/asana-cli.rb +118 -2
- data/lib/asana-cli/version.rb +2 -2
- metadata +1 -1
data/asana-cli.gemspec
CHANGED
@@ -5,7 +5,7 @@ require 'asana-cli/version'
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |gem|
|
7
7
|
gem.name = "asana-cli"
|
8
|
-
gem.version = Asana::
|
8
|
+
gem.version = Asana::CLI::VERSION
|
9
9
|
gem.authors = ["Chris Heald"]
|
10
10
|
gem.email = ["cheald@gmail.com"]
|
11
11
|
gem.description = %q{Command-line client for Asana}
|
data/bin/asana
CHANGED
@@ -3,6 +3,10 @@ require 'trollop'
|
|
3
3
|
require 'asana'
|
4
4
|
require 'colorize'
|
5
5
|
|
6
|
+
lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
|
7
|
+
$LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
|
8
|
+
require 'asana-cli'
|
9
|
+
|
6
10
|
parser = Trollop::Parser.new do
|
7
11
|
opt :list, "List all workspaces"
|
8
12
|
opt :workspace, "Workspace", :type => :string
|
@@ -11,7 +15,7 @@ parser = Trollop::Parser.new do
|
|
11
15
|
opt :close, "Complete a task", :type => :integer
|
12
16
|
opt :create, "Create new task", :type => :string
|
13
17
|
opt :message, "Comment on a task", :type => :string
|
14
|
-
opt :task, "Task to operate on", :type => :
|
18
|
+
opt :task, "Task to operate on", :type => :string
|
15
19
|
opt :key, "API key to use", :type => :string
|
16
20
|
opt :keyfile, "API keyfile to use", :default => "~/.asana_key"
|
17
21
|
end
|
@@ -35,44 +39,23 @@ Asana.configure do |client|
|
|
35
39
|
end
|
36
40
|
end
|
37
41
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
puts ("-" * 60).light_white
|
55
|
-
project.tasks.each do |task|
|
56
|
-
puts "%s\t%s" % [task.id.to_s.light_yellow, task.name.light_white]
|
57
|
-
end
|
58
|
-
puts "\n"
|
59
|
-
elsif opts[:workspace]
|
60
|
-
workspace = Asana::Workspace.all.detect {|p| p.name.downcase == opts[:workspace].downcase }
|
61
|
-
Trollop::die "Unable to find a workspace named #{opts[:workspace]}" unless workspace
|
62
|
-
puts "\n"
|
63
|
-
puts "%s\tProjects" % workspace.name.light_green
|
64
|
-
puts ("-" * 60).light_white
|
65
|
-
workspace.projects.each do |project|
|
66
|
-
puts "%s\t%s" % [project.id.to_s.light_yellow, project.name.light_white]
|
42
|
+
begin
|
43
|
+
if opts[:complete] or opts[:close]
|
44
|
+
task_id = opts[:complete] || opts[:close] || opts[:task]
|
45
|
+
raise Asana::CLIError.new "Task ID required to complete" unless task_id
|
46
|
+
Asana::CLI.close task_id
|
47
|
+
elsif opts[:message]
|
48
|
+
raise Asana::CLIError.new "Task ID required to complete" unless opts[:task]
|
49
|
+
Asana::CLI.comment opts[:task], opts[:message]
|
50
|
+
elsif opts[:task]
|
51
|
+
Asana::CLI.show_task opts[:task], opts[:project], opts[:workspace]
|
52
|
+
elsif opts[:project]
|
53
|
+
Asana::CLI.project_tasks opts[:project], opts[:workspace]
|
54
|
+
elsif opts[:workspace]
|
55
|
+
Asana::CLI.workspace_tasks opts[:workspace]
|
56
|
+
elsif opts[:list]
|
57
|
+
Asana::CLI.list_workspaces
|
67
58
|
end
|
68
|
-
|
69
|
-
|
70
|
-
puts "\n"
|
71
|
-
puts "Workspaces".light_green
|
72
|
-
puts ("-" * 60).light_white
|
73
|
-
Asana::Workspace.all.each do |workspace|
|
74
|
-
puts "%s\t%s" % [workspace.id.to_s.light_yellow, workspace.name.light_white]
|
75
|
-
end
|
76
|
-
else
|
77
|
-
|
59
|
+
rescue Asana::CLIError => e
|
60
|
+
$stderr.puts e.message.light_red
|
78
61
|
end
|
data/lib/asana-cli.rb
CHANGED
@@ -1,7 +1,123 @@
|
|
1
1
|
require "asana-cli/version"
|
2
|
+
require 'colorize'
|
3
|
+
require 'asana'
|
2
4
|
|
3
5
|
module Asana
|
4
|
-
|
5
|
-
|
6
|
+
class CLIError < StandardError; end
|
7
|
+
module CLI
|
8
|
+
class << self
|
9
|
+
def close(task_id)
|
10
|
+
task = Asana::Task.find(task_id)
|
11
|
+
task.create_story :text => opts[:message] if opts[:message]
|
12
|
+
task.modify(:completed => true)
|
13
|
+
puts "Task %s closed!".light_green % task_id
|
14
|
+
end
|
15
|
+
|
16
|
+
def comment(task_id, message)
|
17
|
+
task = Asana::Task.find(task_id)
|
18
|
+
task.create_story :text => message
|
19
|
+
end
|
20
|
+
|
21
|
+
def project_tasks(project_id, workspace_id = nil)
|
22
|
+
projects = resolve workspace_id, project_id, nil
|
23
|
+
raise CLIError.new "Unable to find a project named #{project_id}" if projects.empty?
|
24
|
+
|
25
|
+
projects.each do |project|
|
26
|
+
puts "\n"
|
27
|
+
puts "%s\t Tasks" % project.name.light_green
|
28
|
+
puts ("-" * 60).light_white
|
29
|
+
project.tasks.each do |task|
|
30
|
+
puts "%s\t%s" % [task.id.to_s.light_yellow, task.name.light_white]
|
31
|
+
end
|
32
|
+
puts "\n"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def workspace_tasks(workspace_id)
|
37
|
+
workspaces = resolve workspace_id, nil, nil
|
38
|
+
|
39
|
+
raise CLIError.new "Unable to find a workspace named #{workspace_id}" if workspaces.empty?
|
40
|
+
workspaces.each do |workspace|
|
41
|
+
puts "\n"
|
42
|
+
puts "%s\tProjects" % workspace.name.light_green
|
43
|
+
puts ("-" * 60).light_white
|
44
|
+
workspace.projects.each do |project|
|
45
|
+
puts "%s\t%s" % [project.id.to_s.light_yellow, project.name.light_white]
|
46
|
+
end
|
47
|
+
puts "\n"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def list_workspaces
|
52
|
+
puts "\n"
|
53
|
+
puts "Workspaces".light_green
|
54
|
+
puts ("-" * 60).light_white
|
55
|
+
Asana::Workspace.all.each do |workspace|
|
56
|
+
puts "%s\t%s" % [workspace.id.to_s.light_yellow, workspace.name.light_white]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def show_task(task_id, project_id = nil, workspace_id = nil)
|
61
|
+
tasks = resolve workspace_id, project_id, task_id
|
62
|
+
tasks.each do |task|
|
63
|
+
puts task.name.light_green
|
64
|
+
puts "-" * 60
|
65
|
+
task.attributes.each do |key, val|
|
66
|
+
vals = val
|
67
|
+
if val.is_a? Array
|
68
|
+
vals = val.map {|v| v.respond_to?(:name) ? v.name : v.inspect }
|
69
|
+
elsif val.is_a? Asana::Workspace or val.is_a? Asana::Task::Assignee
|
70
|
+
vals = val.name
|
71
|
+
end
|
72
|
+
|
73
|
+
vals = vals.join(", ") if vals.is_a? Array
|
74
|
+
puts "%20s\t%s" % [key, vals.to_s.light_white]
|
75
|
+
end
|
76
|
+
puts "\n"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def resolve(w, p, t)
|
81
|
+
w_id = w.to_i if w and w.match(/^\d+$/)
|
82
|
+
p_id = p.to_i if p and p.match(/^\d+$/)
|
83
|
+
t_id = t.to_i if t and t.match(/^\d+$/)
|
84
|
+
|
85
|
+
if t
|
86
|
+
if t_id
|
87
|
+
return [Asana::Task.find(t_id)]
|
88
|
+
elsif p_id
|
89
|
+
Asana::Project.find(p_id).tasks.select {|_t| _t.name.downcase[t.downcase] }
|
90
|
+
else
|
91
|
+
if w_id
|
92
|
+
projects = Asana::Workspace.find(w_id).projects
|
93
|
+
else
|
94
|
+
projects = Asana::Workspace.all.flat_map &:projects
|
95
|
+
end
|
96
|
+
projects = projects.select {|_p| _p.name.downcase[p.downcase] } if p
|
97
|
+
return projects.flat_map do |project|
|
98
|
+
puts project.name
|
99
|
+
project.tasks.select {|_t| _t.name.downcase[t.downcase] }
|
100
|
+
end
|
101
|
+
end
|
102
|
+
elsif p
|
103
|
+
if p_id
|
104
|
+
return [Asana::Project.find(p_id)]
|
105
|
+
else
|
106
|
+
if w_id
|
107
|
+
projects = Asana::Workspace.find(w_id).projects
|
108
|
+
else
|
109
|
+
projects = Asana::Workspace.all.flat_map &:projects
|
110
|
+
end
|
111
|
+
return projects.select {|_p| _p.name.downcase[p.downcase] }
|
112
|
+
end
|
113
|
+
elsif w
|
114
|
+
if w_id
|
115
|
+
return [Asana::Workspace.find(w_id)]
|
116
|
+
else
|
117
|
+
Asana::Workspace.all.select {|_w| _w.name.downcase[w.downcase] }
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
6
122
|
end
|
7
123
|
end
|
data/lib/asana-cli/version.rb
CHANGED