rallycat 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +1 -1
- data/Gemfile.lock +1 -1
- data/TODO +3 -9
- data/lib/rallycat/cat.rb +4 -1
- data/lib/rallycat/cli.rb +54 -22
- data/lib/rallycat/help.rb +9 -5
- data/lib/rallycat/update.rb +65 -15
- data/lib/rallycat/version.rb +1 -1
- data/spec/integration_spec.rb +69 -2
- data/spec/lib/rallycat/cat_spec.rb +25 -0
- data/spec/lib/rallycat/cli_spec.rb +2 -2
- data/spec/lib/rallycat/update_spec.rb +27 -1
- data/spec/support/rally_no_results_responder.rb +28 -0
- data/spec/support/rally_task_update_responder.rb +1 -1
- metadata +11 -9
data/.rspec
CHANGED
data/Gemfile.lock
CHANGED
data/TODO
CHANGED
@@ -1,14 +1,8 @@
|
|
1
1
|
# Rallycat TODO
|
2
2
|
|
3
|
-
*
|
4
|
-
* add update behavior for
|
5
|
-
* add
|
6
|
-
* give user friendly error messages
|
7
|
-
* when you don't pass in a task
|
8
|
-
* when task does not exist
|
9
|
-
* when owner cannot be found
|
10
|
-
* update help
|
11
|
-
* make "help" default output
|
3
|
+
* update help (use option_parser help or custom help)
|
4
|
+
* add update behavior for stories (maybe)
|
5
|
+
* add update behavior for defects (maybe)
|
12
6
|
* Slow as balls? Make nice wait messages
|
13
7
|
* Add man page
|
14
8
|
|
data/lib/rallycat/cat.rb
CHANGED
@@ -2,6 +2,7 @@ require 'nokogiri'
|
|
2
2
|
|
3
3
|
module Rallycat
|
4
4
|
class Cat
|
5
|
+
class StoryNotFound < StandardError; end
|
5
6
|
|
6
7
|
def initialize(rally_api)
|
7
8
|
@rally_api = rally_api
|
@@ -14,7 +15,9 @@ module Rallycat
|
|
14
15
|
equal :formatted_id, story_number
|
15
16
|
end
|
16
17
|
|
17
|
-
|
18
|
+
if results.total_result_count == 0
|
19
|
+
raise StoryNotFound, "Story (#{ story_number }) does not exist."
|
20
|
+
end
|
18
21
|
|
19
22
|
consolidate_newlines parse_story(results.first)
|
20
23
|
end
|
data/lib/rallycat/cli.rb
CHANGED
@@ -9,7 +9,8 @@ module Rallycat
|
|
9
9
|
|
10
10
|
def run
|
11
11
|
options = {}
|
12
|
-
|
12
|
+
|
13
|
+
global = OptionParser.new do |opts|
|
13
14
|
opts.on('-u USERNAME', '--username') do |user|
|
14
15
|
options[:user] = user
|
15
16
|
end
|
@@ -18,40 +19,67 @@ module Rallycat
|
|
18
19
|
options[:password] = password
|
19
20
|
end
|
20
21
|
|
21
|
-
opts.on('-
|
22
|
-
|
22
|
+
opts.on('-h', '--help') do
|
23
|
+
@stdout.puts Rallycat::Help.new
|
24
|
+
exit
|
23
25
|
end
|
26
|
+
end
|
24
27
|
|
25
|
-
|
26
|
-
|
27
|
-
end
|
28
|
+
commands = {
|
29
|
+
'cat' => OptionParser.new,
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
end
|
31
|
+
'update' => OptionParser.new do |opts|
|
32
|
+
opts.banner = 'Usage: rallycat update <story number> [options]'
|
32
33
|
|
33
|
-
|
34
|
-
|
35
|
-
|
34
|
+
opts.on('-b', '--blocked') do |blocked|
|
35
|
+
options[:blocked] = true
|
36
|
+
end
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
opts.on('-p', '--in-progress') do |in_progress|
|
39
|
+
options[:in_progress] = true
|
40
|
+
end
|
41
|
+
|
42
|
+
opts.on('-c', '--completed') do |completed|
|
43
|
+
options[:completed] = true
|
44
|
+
end
|
45
|
+
|
46
|
+
opts.on('-d', '--defined') do |defined|
|
47
|
+
options[:defined] = true
|
48
|
+
end
|
41
49
|
|
42
|
-
|
50
|
+
opts.on('-o OWNER', '--owner') do |owner|
|
51
|
+
options[:owner] = owner
|
52
|
+
end
|
53
|
+
end,
|
43
54
|
|
44
|
-
|
55
|
+
'help' => OptionParser.new
|
56
|
+
}
|
57
|
+
|
58
|
+
global.order! @argv
|
59
|
+
|
60
|
+
command = @argv.shift
|
61
|
+
commands[command].order! @argv if commands.has_key? command
|
62
|
+
|
63
|
+
case command
|
45
64
|
when 'cat'
|
46
65
|
api = Rallycat::Connection.new(options[:user], options[:password]).api
|
47
66
|
|
48
|
-
|
67
|
+
story_number = @argv.shift
|
68
|
+
|
69
|
+
abort 'The "cat" command requires a story or defect number.' unless story_number
|
70
|
+
|
71
|
+
begin
|
72
|
+
@stdout.puts Rallycat::Cat.new(api).story(story_number)
|
73
|
+
rescue Rallycat::Cat::StoryNotFound => e
|
74
|
+
abort e.message
|
75
|
+
end
|
49
76
|
when 'update'
|
50
77
|
api = Rallycat::Connection.new(options[:user], options[:password]).api
|
51
78
|
|
52
|
-
|
53
79
|
task_number = @argv.shift
|
54
80
|
|
81
|
+
abort 'The "update" command requires a task number.' unless task_number
|
82
|
+
|
55
83
|
opts = {}
|
56
84
|
opts[:blocked] = true if options[:blocked]
|
57
85
|
opts[:state] = "In-Progress" if options[:in_progress]
|
@@ -59,12 +87,16 @@ module Rallycat
|
|
59
87
|
opts[:state] = "Defined" if options[:defined]
|
60
88
|
opts[:owner] = options[:owner] if options[:owner]
|
61
89
|
|
62
|
-
|
90
|
+
begin
|
91
|
+
@stdout.puts Rallycat::Update.new(api).task(task_number, opts)
|
92
|
+
rescue Rallycat::Update::UserNotFound, Rallycat::Update::TaskNotFound => e
|
93
|
+
abort e.message
|
94
|
+
end
|
63
95
|
when 'help'
|
64
96
|
# `puts` calls `to_s`
|
65
97
|
@stdout.puts Rallycat::Help.new
|
66
98
|
else
|
67
|
-
@stdout.puts '
|
99
|
+
@stdout.puts "'#{command}' is not a supported command. See 'rallycat help'."
|
68
100
|
end
|
69
101
|
end
|
70
102
|
end
|
data/lib/rallycat/help.rb
CHANGED
@@ -13,13 +13,17 @@ Configuration:
|
|
13
13
|
at runtime and will take higher precedence than the configuration file.
|
14
14
|
|
15
15
|
Global Options:
|
16
|
-
-u [USERNAME]
|
17
|
-
-p [PASSWORD]
|
18
|
-
-h, --help
|
16
|
+
-u [USERNAME] # The Rally user
|
17
|
+
-p [PASSWORD] # The password for the Rally user
|
18
|
+
-h, --help # Displays this help text
|
19
19
|
|
20
20
|
Commands:
|
21
|
-
rallycat cat
|
22
|
-
rallycat
|
21
|
+
rallycat cat <story number> # Displays the user story or defect
|
22
|
+
rallycat update <task number> # Displays the user story
|
23
|
+
[--blocked | -b] [--in-progress | -i]
|
24
|
+
[--completed | -c] [--defined | -d]
|
25
|
+
[--owner | -o <fullname>]
|
26
|
+
rallycat help # Displays this help text
|
23
27
|
|
24
28
|
|
25
29
|
HELP
|
data/lib/rallycat/update.rb
CHANGED
@@ -1,38 +1,88 @@
|
|
1
1
|
module Rallycat
|
2
2
|
class Update
|
3
|
+
class UserNotFound < StandardError; end
|
4
|
+
class TaskNotFound < StandardError; end
|
5
|
+
|
3
6
|
def initialize(api)
|
4
7
|
@api = api
|
5
8
|
end
|
6
9
|
|
7
10
|
def task(task_number, attributes)
|
8
|
-
|
9
|
-
equal :formatted_id, task_number
|
10
|
-
end
|
11
|
-
|
12
|
-
task = results.first
|
11
|
+
task = find_task(task_number)
|
13
12
|
|
13
|
+
# When we set the state of the task and we don't explicitly set it to
|
14
|
+
# blocked we want to remove the block. In our workflow, when you change
|
15
|
+
# the state of the task it is also unblocked.
|
14
16
|
if attributes[:state] && !attributes[:blocked]
|
15
17
|
attributes[:blocked] = false
|
16
18
|
end
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
# The value in attributes[:owner] should be equal to the desired owner's
|
21
|
+
# display name in Rally. We need to fetch the user in order to get their
|
22
|
+
# login_name. The login_name is needed in order to set the owner
|
23
|
+
# attribute of a task.
|
24
|
+
#
|
25
|
+
# We decided it would be easier for the user to enter 'John Smith'
|
26
|
+
# instead of 'john.smith@foobar.com'.
|
27
|
+
if display_name = attributes[:owner]
|
28
|
+
login_name = find_user(display_name)
|
29
|
+
attributes[:owner] = login_name
|
25
30
|
end
|
26
31
|
|
27
32
|
task.update(attributes)
|
28
33
|
|
29
34
|
messages = []
|
30
35
|
|
31
|
-
|
32
|
-
|
33
|
-
|
36
|
+
if attributes[:state]
|
37
|
+
messages << state_message(task_number, attributes[:state])
|
38
|
+
end
|
39
|
+
|
40
|
+
if attributes[:blocked]
|
41
|
+
messages << blocked_message(task_number)
|
42
|
+
end
|
43
|
+
|
44
|
+
if attributes[:owner]
|
45
|
+
messages << owner_message(task_number, display_name)
|
46
|
+
end
|
34
47
|
|
35
48
|
messages.join("\n")
|
36
49
|
end
|
50
|
+
|
51
|
+
private
|
52
|
+
def find_task(task_number)
|
53
|
+
results = @api.find(:task) do
|
54
|
+
equal :formatted_id, task_number
|
55
|
+
end
|
56
|
+
|
57
|
+
if results.total_result_count == 0
|
58
|
+
raise TaskNotFound, "Task (#{task_number}) does not exist."
|
59
|
+
end
|
60
|
+
|
61
|
+
results.first
|
62
|
+
end
|
63
|
+
|
64
|
+
def find_user(display_name)
|
65
|
+
user_results = @api.find(:user) do
|
66
|
+
equal :display_name, display_name
|
67
|
+
end
|
68
|
+
|
69
|
+
if user_results.total_result_count == 0
|
70
|
+
raise UserNotFound, "User (#{display_name}) does not exist."
|
71
|
+
end
|
72
|
+
|
73
|
+
user_results.first.login_name
|
74
|
+
end
|
75
|
+
|
76
|
+
def state_message(task_number, state)
|
77
|
+
%{Task (#{task_number}) was set to "#{state}".}
|
78
|
+
end
|
79
|
+
|
80
|
+
def blocked_message(task_number)
|
81
|
+
"Task (#{task_number}) was blocked."
|
82
|
+
end
|
83
|
+
|
84
|
+
def owner_message(task_number, owner)
|
85
|
+
%{Task (#{task_number}) was assigned to "#{owner}".}
|
86
|
+
end
|
37
87
|
end
|
38
88
|
end
|
data/lib/rallycat/version.rb
CHANGED
data/spec/integration_spec.rb
CHANGED
@@ -18,9 +18,34 @@ describe 'Rallycat' do
|
|
18
18
|
sout.rewind
|
19
19
|
sout.read.should include('# [US4567] - [Rework] Change link to button')
|
20
20
|
end
|
21
|
+
|
22
|
+
it 'aborts when a story number is not given' do
|
23
|
+
sout = StringIO.new
|
24
|
+
|
25
|
+
cli = Rallycat::CLI.new %w{ -u foo.bar@rallycat.com -p password cat }, sout
|
26
|
+
|
27
|
+
lambda {
|
28
|
+
Artifice.activate_with RallyStoryResponder.new do
|
29
|
+
cli.run
|
30
|
+
end
|
31
|
+
}.should raise_error(SystemExit, 'The "cat" command requires a story or defect number.')
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'aborts when the story does not exist' do
|
35
|
+
sout = StringIO.new
|
36
|
+
|
37
|
+
cli = Rallycat::CLI.new %w{ -u foo.bar@rallycat.com -p password cat US9999 }, sout
|
38
|
+
|
39
|
+
lambda {
|
40
|
+
Artifice.activate_with RallyNoResultsResponder.new do
|
41
|
+
cli.run
|
42
|
+
end
|
43
|
+
}.should raise_error(SystemExit, 'Story (US9999) does not exist.')
|
44
|
+
end
|
21
45
|
end
|
22
46
|
|
23
47
|
context 'help' do
|
48
|
+
|
24
49
|
it 'displays a help screen to the user' do
|
25
50
|
string_io = StringIO.new
|
26
51
|
|
@@ -31,7 +56,7 @@ describe 'Rallycat' do
|
|
31
56
|
string_io.rewind
|
32
57
|
expected = string_io.read
|
33
58
|
|
34
|
-
expected.should include("rallycat cat
|
59
|
+
expected.should include("rallycat cat <story number>")
|
35
60
|
expected.should include("Displays the user story")
|
36
61
|
end
|
37
62
|
end
|
@@ -43,7 +68,7 @@ describe 'Rallycat' do
|
|
43
68
|
it 'sets the state to in-progress' do
|
44
69
|
sout = StringIO.new
|
45
70
|
|
46
|
-
cli = Rallycat::CLI.new %w{ update -
|
71
|
+
cli = Rallycat::CLI.new %w{ update -p TA6666 -u foo.bar@rallycat.com -p password }, sout
|
47
72
|
|
48
73
|
task_responder = RallyTaskUpdateResponder.new
|
49
74
|
|
@@ -114,6 +139,48 @@ describe 'Rallycat' do
|
|
114
139
|
sout.rewind
|
115
140
|
sout.read.should include('Task (TA6666) was assigned to "Freddy Fender".')
|
116
141
|
end
|
142
|
+
|
143
|
+
it 'aborts when the owner does not exist' do
|
144
|
+
sout = StringIO.new
|
145
|
+
|
146
|
+
cli = Rallycat::CLI.new %w{ update -o Norman\ Notreal TA6666 -u foo.bar@rallycat.com -p password }, sout
|
147
|
+
|
148
|
+
task_responder = RallyTaskUpdateResponder.new
|
149
|
+
|
150
|
+
lambda {
|
151
|
+
Artifice.activate_with task_responder do
|
152
|
+
cli.run
|
153
|
+
end
|
154
|
+
}.should raise_error(SystemExit, 'User (Norman Notreal) does not exist.')
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'aborts when a task number is not given' do
|
158
|
+
sout = StringIO.new
|
159
|
+
|
160
|
+
cli = Rallycat::CLI.new %w{ -u foo.bar@rallycat.com -p password update }, sout
|
161
|
+
|
162
|
+
task_responder = RallyTaskUpdateResponder.new
|
163
|
+
|
164
|
+
lambda {
|
165
|
+
Artifice.activate_with task_responder do
|
166
|
+
cli.run
|
167
|
+
end
|
168
|
+
}.should raise_error(SystemExit, 'The "update" command requires a task number.')
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'aborts when a task does not exist' do
|
172
|
+
sout = StringIO.new
|
173
|
+
|
174
|
+
cli = Rallycat::CLI.new %w{ update -i TA9999 -u foo.bar@rallycat.com -p password }, sout
|
175
|
+
|
176
|
+
task_responder = RallyNoResultsResponder.new
|
177
|
+
|
178
|
+
lambda {
|
179
|
+
Artifice.activate_with task_responder do
|
180
|
+
cli.run
|
181
|
+
end
|
182
|
+
}.should raise_error(SystemExit, 'Task (TA9999) does not exist.')
|
183
|
+
end
|
117
184
|
end
|
118
185
|
end
|
119
186
|
end
|
@@ -129,5 +129,30 @@ STORY
|
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
132
|
+
it 'raises when the story does not exist' do
|
133
|
+
responder = lambda do |env|
|
134
|
+
[200, {}, [
|
135
|
+
<<-XML
|
136
|
+
<QueryResult rallyAPIMajor="1" rallyAPIMinor="17">
|
137
|
+
<Errors/>
|
138
|
+
<Warnings/>
|
139
|
+
<TotalResultCount>0</TotalResultCount>
|
140
|
+
<StartIndex>1</StartIndex>
|
141
|
+
<PageSize>20</PageSize>
|
142
|
+
<Results/>
|
143
|
+
</QueryResult>
|
144
|
+
XML
|
145
|
+
]]
|
146
|
+
end
|
147
|
+
|
148
|
+
Artifice.activate_with responder do
|
149
|
+
story_num = "US9999"
|
150
|
+
cat = Rallycat::Cat.new(@api)
|
151
|
+
|
152
|
+
lambda {
|
153
|
+
cat.story(story_num)
|
154
|
+
}.should raise_error(Rallycat::Cat::StoryNotFound, 'Story (US9999) does not exist.')
|
155
|
+
end
|
156
|
+
end
|
132
157
|
end
|
133
158
|
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Rallycat::CLI do
|
4
4
|
it 'should default to STDOUT' do
|
5
|
-
STDOUT.should_receive(:puts).with '
|
5
|
+
STDOUT.should_receive(:puts).with "'' is not a supported command. See 'rallycat help'."
|
6
6
|
cli = Rallycat::CLI.new []
|
7
7
|
cli.run
|
8
8
|
end
|
@@ -17,6 +17,6 @@ describe Rallycat::CLI, '#run' do
|
|
17
17
|
cli.run
|
18
18
|
|
19
19
|
sout.rewind
|
20
|
-
sout.read.should == "
|
20
|
+
sout.read.should == "'foo' is not a supported command. See 'rallycat help'.\n"
|
21
21
|
end
|
22
22
|
end
|
@@ -82,7 +82,6 @@ describe Rallycat::Update do
|
|
82
82
|
message.should include('Task (TA6666) was assigned to "Freddy Fender"')
|
83
83
|
end
|
84
84
|
|
85
|
-
# require "pry"; binding.pry
|
86
85
|
post_request = responder.requests[4] # this is the request that actually updates the task
|
87
86
|
post_request.should be_post
|
88
87
|
post_request.url.should == 'https://rally1.rallydev.com/slm/webservice/1.17/task/12345'
|
@@ -92,4 +91,31 @@ describe Rallycat::Update do
|
|
92
91
|
body.should include('<Owner>fred.fender@testing.com</Owner>')
|
93
92
|
end
|
94
93
|
end
|
94
|
+
|
95
|
+
it 'raises when the user could not be found' do
|
96
|
+
responder = RallyTaskUpdateResponder.new
|
97
|
+
|
98
|
+
Artifice.activate_with responder do
|
99
|
+
task_num = "TA6666"
|
100
|
+
update = Rallycat::Update.new(@api)
|
101
|
+
|
102
|
+
lambda {
|
103
|
+
update.task(task_num, state: 'Completed', owner: 'Norman Notreal')
|
104
|
+
}.should raise_error(Rallycat::Update::UserNotFound, 'User (Norman Notreal) does not exist.')
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'raises when the task could not be found' do
|
109
|
+
responder = RallyNoResultsResponder.new
|
110
|
+
|
111
|
+
Artifice.activate_with responder do
|
112
|
+
task_num = "TA6666"
|
113
|
+
update = Rallycat::Update.new(@api)
|
114
|
+
|
115
|
+
lambda {
|
116
|
+
update.task(task_num, state: 'Completed')
|
117
|
+
}.should raise_error(Rallycat::Update::TaskNotFound, 'Task (TA6666) does not exist.')
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
95
121
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class RallyNoResultsResponder
|
2
|
+
attr_reader :requests
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
@requests = []
|
6
|
+
end
|
7
|
+
|
8
|
+
def last_request
|
9
|
+
@requests.last
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(env)
|
13
|
+
@requests << request = Rack::Request.new(env)
|
14
|
+
|
15
|
+
[200, {}, [
|
16
|
+
<<-XML
|
17
|
+
<QueryResult rallyAPIMajor="1" rallyAPIMinor="17">
|
18
|
+
<Errors/>
|
19
|
+
<Warnings/>
|
20
|
+
<TotalResultCount>0</TotalResultCount>
|
21
|
+
<StartIndex>1</StartIndex>
|
22
|
+
<PageSize>20</PageSize>
|
23
|
+
<Results/>
|
24
|
+
</QueryResult>
|
25
|
+
XML
|
26
|
+
]]
|
27
|
+
end
|
28
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rallycat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -14,7 +14,7 @@ date: 2012-07-17 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: builder
|
17
|
-
requirement: &
|
17
|
+
requirement: &70303674111620 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70303674111620
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: rally_rest_api
|
28
|
-
requirement: &
|
28
|
+
requirement: &70303674111020 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70303674111020
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: nokogiri
|
39
|
-
requirement: &
|
39
|
+
requirement: &70303674110340 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,7 +44,7 @@ dependencies:
|
|
44
44
|
version: '0'
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *70303674110340
|
48
48
|
description: The Rally website sucks. CLI is better.
|
49
49
|
email:
|
50
50
|
- adam@adamtanner.org
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- spec/lib/rallycat/update_spec.rb
|
81
81
|
- spec/spec_helper.rb
|
82
82
|
- spec/support/rally_defect_responder.rb
|
83
|
+
- spec/support/rally_no_results_responder.rb
|
83
84
|
- spec/support/rally_story_responder.rb
|
84
85
|
- spec/support/rally_task_update_responder.rb
|
85
86
|
homepage: https://github.com/adamtanner/rallycat
|
@@ -96,7 +97,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
96
97
|
version: '0'
|
97
98
|
segments:
|
98
99
|
- 0
|
99
|
-
hash:
|
100
|
+
hash: 4474919884476792167
|
100
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
102
|
none: false
|
102
103
|
requirements:
|
@@ -105,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
105
106
|
version: '0'
|
106
107
|
segments:
|
107
108
|
- 0
|
108
|
-
hash:
|
109
|
+
hash: 4474919884476792167
|
109
110
|
requirements: []
|
110
111
|
rubyforge_project:
|
111
112
|
rubygems_version: 1.8.7
|
@@ -121,5 +122,6 @@ test_files:
|
|
121
122
|
- spec/lib/rallycat/update_spec.rb
|
122
123
|
- spec/spec_helper.rb
|
123
124
|
- spec/support/rally_defect_responder.rb
|
125
|
+
- spec/support/rally_no_results_responder.rb
|
124
126
|
- spec/support/rally_story_responder.rb
|
125
127
|
- spec/support/rally_task_update_responder.rb
|