morale 0.1.1 → 0.1.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/features/tickets.feature +49 -1
- data/lib/morale/account.rb +1 -0
- data/lib/morale/client.rb +5 -0
- data/lib/morale/command.rb +3 -7
- data/lib/morale/commands/ticket.rb +48 -15
- data/lib/morale.rb +1 -1
- data/morale.gemspec +2 -2
- data/spec/morale/client_spec.rb +27 -0
- metadata +3 -3
data/features/tickets.feature
CHANGED
@@ -4,7 +4,7 @@ Feature: Running the tickets command
|
|
4
4
|
I should be able to run tickets to view, create, update, and delete tickets
|
5
5
|
|
6
6
|
@interactive
|
7
|
-
Scenario:
|
7
|
+
Scenario: Posting a ticket should return the ticket results
|
8
8
|
Given a file named "credentials" with:
|
9
9
|
"""
|
10
10
|
spartan
|
@@ -23,4 +23,52 @@ Feature: Running the tickets command
|
|
23
23
|
And the output should contain:
|
24
24
|
"""
|
25
25
|
Jimmy P.
|
26
|
+
"""
|
27
|
+
|
28
|
+
@interactive
|
29
|
+
Scenario: Posting a ticket without a project should ask for a project
|
30
|
+
Given a file named "credentials" with:
|
31
|
+
"""
|
32
|
+
spartan
|
33
|
+
12345
|
34
|
+
"""
|
35
|
+
When I run `morale ticket "task: This is a new task as: Jimmy"` interactively
|
36
|
+
Then the output should contain:
|
37
|
+
"""
|
38
|
+
No project specified.
|
39
|
+
"""
|
40
|
+
|
41
|
+
@interactive
|
42
|
+
Scenario: Running tickets should return a list of all active tickets
|
43
|
+
Given a file named "credentials" with:
|
44
|
+
"""
|
45
|
+
spartan
|
46
|
+
12345
|
47
|
+
1
|
48
|
+
"""
|
49
|
+
When I run `morale tickets` interactively
|
50
|
+
Then the output should contain:
|
51
|
+
"""
|
52
|
+
Task
|
53
|
+
"""
|
54
|
+
And the output should contain:
|
55
|
+
"""
|
56
|
+
Refactor user signup code
|
57
|
+
"""
|
58
|
+
And the output should contain:
|
59
|
+
"""
|
60
|
+
Create icon for list view
|
61
|
+
"""
|
62
|
+
|
63
|
+
@interactive
|
64
|
+
Scenario: Running tickets without a project should ask for a project
|
65
|
+
Given a file named "credentials" with:
|
66
|
+
"""
|
67
|
+
spartan
|
68
|
+
12345
|
69
|
+
"""
|
70
|
+
When I run `morale tickets` interactively
|
71
|
+
Then the output should contain:
|
72
|
+
"""
|
73
|
+
No project specified.
|
26
74
|
"""
|
data/lib/morale/account.rb
CHANGED
data/lib/morale/client.rb
CHANGED
@@ -57,6 +57,11 @@ module Morale
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def tickets(options={})
|
60
|
+
authorize
|
61
|
+
response = self.class.get("/projects/#{options[:project_id]}/tickets")
|
62
|
+
raise Unauthorized if response.code == 401
|
63
|
+
raise NotFound if response.code == 404
|
64
|
+
response
|
60
65
|
end
|
61
66
|
|
62
67
|
def ticket(project_id, command)
|
data/lib/morale/command.rb
CHANGED
@@ -45,13 +45,9 @@ module Morale
|
|
45
45
|
Morale::Commands::Ticket.command command
|
46
46
|
end
|
47
47
|
|
48
|
-
desc "
|
49
|
-
def
|
50
|
-
|
51
|
-
say "| id | type | title | created by | due date | assigned to | priority |"
|
52
|
-
say "+-----+------+-----------------------------------------------------------------------------------------+----------------+----------+----------------+----------+"
|
53
|
-
say "| 123 | task | hbsdbjhsdjhfdsjfhsdjfhsdjfhsdjfhsdf | Jimmy P. | 08/08/11 | Robert P. | 1 |"
|
54
|
-
say "+-----+------+-----------------------------------------------------------------------------------------+----------------+----------+----------------+----------+"
|
48
|
+
desc "tickets", "Lists all the projects tickets."
|
49
|
+
def tickets
|
50
|
+
Morale::Commands::Ticket.list
|
55
51
|
end
|
56
52
|
|
57
53
|
class << self
|
@@ -1,36 +1,69 @@
|
|
1
1
|
require 'morale/client'
|
2
2
|
require 'morale/command'
|
3
3
|
require 'morale/authorization'
|
4
|
+
require 'morale/flow'
|
4
5
|
require 'hirb'
|
5
6
|
|
6
7
|
module Morale::Commands
|
7
8
|
class Ticket
|
8
9
|
class << self
|
9
10
|
include Morale::Platform
|
11
|
+
include Morale::Flow
|
10
12
|
|
11
13
|
def command(command)
|
12
|
-
|
13
|
-
print ticket
|
14
|
+
ask_for_project
|
15
|
+
print Morale::Command.client.ticket(Morale::Account.project, command) unless Morale::Account.project.nil?
|
16
|
+
end
|
17
|
+
|
18
|
+
def list
|
19
|
+
ask_for_project
|
20
|
+
print Morale::Command.client.tickets({ :project_id => Morale::Account.project }) unless Morale::Account.project.nil?
|
14
21
|
end
|
15
22
|
|
16
23
|
private
|
17
24
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
:priority => ticket['priority']
|
30
|
-
}],
|
25
|
+
def ask_for_project
|
26
|
+
if Morale::Account.project.nil?
|
27
|
+
say "No project specified."
|
28
|
+
retryable(:retries => 1) do
|
29
|
+
Morale::Commands::Project.list true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def print(tickets)
|
35
|
+
say Hirb::Helpers::Table.render fetch(tickets),
|
31
36
|
:fields => [:id, :type, :title, :created_by, :due_date, :assigned_to, :priority],
|
32
37
|
:headers => { :created_by => "created by", :due_date => "due date", :assigned_to => "assigned to" }
|
33
38
|
end
|
39
|
+
|
40
|
+
def fetch(tickets)
|
41
|
+
tickets = tickets.kind_of?(Array) ? tickets : Array.new(1, tickets)
|
42
|
+
data = []
|
43
|
+
tickets.each { |t|
|
44
|
+
ticket = t['task'] unless t['task'].nil?
|
45
|
+
ticket = t['bug'] unless t['bug'].nil?
|
46
|
+
ticket = t if ticket.nil?
|
47
|
+
|
48
|
+
due_date = ticket['due_date']
|
49
|
+
unless due_date.nil?
|
50
|
+
due_date = Date.parse(due_date) unless due_date.kind_of?(Time)
|
51
|
+
due_date = due_date.strftime("%b. %d")
|
52
|
+
end
|
53
|
+
assigned_to = "#{ticket['assigned_to']['user']['first_name']} #{(ticket['assigned_to']['user']['last_name']).to_s[0,1]}." unless ticket['assigned_to'].nil?
|
54
|
+
|
55
|
+
data << {
|
56
|
+
:id => ticket['identifier'],
|
57
|
+
:type => ticket['type'],
|
58
|
+
:title => ticket['title'],
|
59
|
+
:created_by => "#{ticket['created_by']['user']['first_name']} #{(ticket['created_by']['user']['last_name']).to_s[0,1]}.",
|
60
|
+
:due_date => due_date,
|
61
|
+
:assigned_to => assigned_to,
|
62
|
+
:priority => ticket['priority']
|
63
|
+
}
|
64
|
+
}
|
65
|
+
data
|
66
|
+
end
|
34
67
|
end
|
35
68
|
end
|
36
69
|
end
|
data/lib/morale.rb
CHANGED
data/morale.gemspec
CHANGED
@@ -5,8 +5,8 @@ Gem::Specification.new do |s|
|
|
5
5
|
s.rubygems_version = '1.3.5'
|
6
6
|
|
7
7
|
s.name = 'morale'
|
8
|
-
s.version = '0.1.
|
9
|
-
s.date = '2011-
|
8
|
+
s.version = '0.1.2'
|
9
|
+
s.date = '2011-10-01'
|
10
10
|
s.rubyforge_project = 'morale'
|
11
11
|
|
12
12
|
s.summary = "Command line interface to create & manage tickets on Morale."
|
data/spec/morale/client_spec.rb
CHANGED
@@ -89,4 +89,31 @@ describe Morale::Client do
|
|
89
89
|
lambda { client.ticket('1', "This is a test that should create a new task as: Lester") }.should raise_error(Morale::Client::NotFound)
|
90
90
|
end
|
91
91
|
end
|
92
|
+
|
93
|
+
describe "#tickets" do
|
94
|
+
it "should return all active tickets when no options are specified" do
|
95
|
+
stub_request(:get, "http://blah:123456@blah.lvh.me:3000/api/v1/projects/1/tickets").to_return(:body =>
|
96
|
+
[{"ticket" => {"title" => "This is test #1","created_at" => "2011-07-31T21:40:24Z","updated_at" => "2011-07-31T21:40:24Z","project_id" => 1,"id" => 1,"identifier" => "1","type" => "Task","due_date" => "2011-10-15 16:00:00.000000","priority" => nil,"archived" => "f"}},
|
97
|
+
{"ticket" => {"title" => "This is test #2","created_at" => "2011-07-31T21:28:53Z","updated_at" => "2011-07-31T21:28:53Z","project_id" => 1,"id" => 2, "identifier" => "2","type" => "Bug","due_date" => nil,"priority" => "2","archived" => "f"}}].to_json)
|
98
|
+
client = Morale::Client.new('blah', '123456')
|
99
|
+
response = client.tickets({:project_id => 1})
|
100
|
+
response.count.should == 2
|
101
|
+
response[0]["ticket"]["title"].should == "This is test #1"
|
102
|
+
response[1]["ticket"]["title"].should == "This is test #2"
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should raise unauthorized if a 401 is received" do
|
106
|
+
stub_request(:get, "http://blah:123456@blah.lvh.me:3000/api/v1/projects/1/tickets").
|
107
|
+
to_return(:status => 401)
|
108
|
+
client = Morale::Client.new('blah', '123456')
|
109
|
+
lambda { client.tickets({:project_id => 1}) }.should raise_error(Morale::Client::Unauthorized)
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should raise notfound if a 404 is received" do
|
113
|
+
stub_request(:get, "http://blah:123456@blah.lvh.me:3000/api/v1/projects/1/tickets").
|
114
|
+
to_return(:status => 404)
|
115
|
+
client = Morale::Client.new('blah', '123456')
|
116
|
+
lambda { client.tickets({ :project_id => 1 }) }.should raise_error(Morale::Client::NotFound)
|
117
|
+
end
|
118
|
+
end
|
92
119
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 2
|
9
|
+
version: 0.1.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Brilliant Fantastic
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-10-01 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|