crab 0.1.7 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/README.md +0 -1
- data/Rakefile +19 -4
- data/bin/crab-add +19 -0
- data/bin/crab-change +61 -0
- data/bin/crab-create +19 -0
- data/bin/crab-del +22 -0
- data/bin/crab-delete +22 -0
- data/bin/crab-find +27 -0
- data/bin/crab-login +25 -0
- data/bin/crab-move +26 -0
- data/bin/crab-mv +26 -0
- data/bin/crab-project +35 -0
- data/bin/crab-pull +28 -0
- data/bin/crab-remove +22 -0
- data/bin/crab-rm +22 -0
- data/bin/crab-show +20 -0
- data/bin/crab-tc +79 -0
- data/bin/crab-testcase +79 -0
- data/bin/crab-truncate +8 -0
- data/bin/crab-up +61 -0
- data/bin/crab-update +61 -0
- data/crab.gemspec +2 -0
- data/features/move-in-rally.feature +15 -0
- data/features/steps/rally_steps.rb +13 -5
- data/features/subcommand-help.feature +10 -10
- data/lib/crab.rb +0 -12
- data/lib/crab/cli.rb +7 -3
- data/lib/crab/utilities.rb +18 -1
- data/lib/crab/version.rb +1 -1
- metadata +43 -14
- data/lib/crab/commands/create.rb +0 -27
- data/lib/crab/commands/delete.rb +0 -31
- data/lib/crab/commands/find.rb +0 -36
- data/lib/crab/commands/login.rb +0 -30
- data/lib/crab/commands/move.rb +0 -46
- data/lib/crab/commands/project.rb +0 -46
- data/lib/crab/commands/pull.rb +0 -37
- data/lib/crab/commands/show.rb +0 -25
- data/lib/crab/commands/testcase.rb +0 -101
- data/lib/crab/commands/update.rb +0 -80
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -144,7 +144,6 @@ To do / Roadmap
|
|
144
144
|
|
145
145
|
### 0.2.0
|
146
146
|
|
147
|
-
- Add a `move` subcommand which moves the story from one state to the next (potentially, `move --back`)
|
148
147
|
- `pull` is not very smart and could detect feature files being moved from one dir to another
|
149
148
|
- Recursively look for a `.crab` directory like Git does with `.git`
|
150
149
|
- Verbose logging (especially before any change or destructive operations in Rally)
|
data/Rakefile
CHANGED
@@ -12,12 +12,27 @@ namespace :cucumber do
|
|
12
12
|
desc "Basic test suite set-up"
|
13
13
|
task :setup do
|
14
14
|
require 'highline/import'
|
15
|
-
test_project = ask("Name of the project in Rally to be used for tests: ")
|
16
15
|
|
17
|
-
|
16
|
+
puts """
|
17
|
+
In order to run the Cucumber tests for crab itself, we need a few
|
18
|
+
details from you. These are stored in ~/.crab/tests/ and do not affect
|
19
|
+
normal usage.
|
20
|
+
"""
|
21
|
+
|
22
|
+
username = ask("Username: ")
|
23
|
+
password = ask("Password: ") {|q| q.echo = false }
|
24
|
+
project = ask("Project to test against: ")
|
25
|
+
|
26
|
+
dot_crab = File.expand_path("~/.crab/tests")
|
18
27
|
FileUtils.mkdir_p dot_crab
|
19
|
-
|
20
|
-
|
28
|
+
|
29
|
+
File.open(File.join(dot_crab, 'credentials'), 'w') do |file|
|
30
|
+
file.puts username
|
31
|
+
file.puts password
|
32
|
+
end
|
33
|
+
|
34
|
+
File.open(File.join(dot_crab, 'project'), 'w') do |file|
|
35
|
+
file.puts project
|
21
36
|
end
|
22
37
|
end
|
23
38
|
|
data/bin/crab-add
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
cmd_opts = Trollop::options do
|
5
|
+
banner <<-BANNER
|
6
|
+
crab create: create a new story in Rally
|
7
|
+
|
8
|
+
Usage: crab create name [options]
|
9
|
+
BANNER
|
10
|
+
end
|
11
|
+
|
12
|
+
rally = Crab::Rally.new
|
13
|
+
name = ARGV.join(" ")
|
14
|
+
Trollop::die "Please specify a name for the story" if name.blank?
|
15
|
+
|
16
|
+
rally.connect
|
17
|
+
story = rally.create_story :name => name
|
18
|
+
|
19
|
+
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
data/bin/crab-change
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
include Crab::Utilities
|
5
|
+
|
6
|
+
cmd_opts = Trollop::options do
|
7
|
+
banner <<-BANNER
|
8
|
+
crab update: update a story in Rally
|
9
|
+
|
10
|
+
Usage: crab update story [options]
|
11
|
+
BANNER
|
12
|
+
opt :name, "Name (title)", :type => String, :short => "-n"
|
13
|
+
opt :state, "State (one of: #{Crab::Story::VALID_STATES.join(" ")})", :type => String, :short => "-t"
|
14
|
+
opt :estimate, "Estimate", :type => :int, :short => "-e"
|
15
|
+
opt :iteration, "Iteration", :type => String, :short => "-i"
|
16
|
+
opt :release, "Release", :type => String, :short => "-r"
|
17
|
+
opt :blocked, "Blocked", :short => "-b"
|
18
|
+
opt :unblocked, "Unblocked", :short => "-u"
|
19
|
+
opt :parent, "Parent", :type => String, :short => "-p"
|
20
|
+
end
|
21
|
+
|
22
|
+
rally = Crab::Rally.new
|
23
|
+
|
24
|
+
Trollop::die "No story given" if ARGV.empty?
|
25
|
+
Trollop::die "Nothing to update. Please provide some options" unless cmd_opts.any? {|k, v| k.to_s =~ /_given$/ }
|
26
|
+
|
27
|
+
opts = {}
|
28
|
+
opts[:name] = cmd_opts[:name] if cmd_opts[:name_given]
|
29
|
+
opts[:schedule_state] = state_from(cmd_opts[:state]) if cmd_opts[:state_given]
|
30
|
+
|
31
|
+
if cmd_opts[:estimate_given]
|
32
|
+
opts[:plan_estimate] = cmd_opts[:estimate] # nobody is going to remember "Plan Estimate", really
|
33
|
+
end
|
34
|
+
|
35
|
+
opts[:blocked] = cmd_opts[:blocked] if cmd_opts[:blocked_given]
|
36
|
+
opts[:blocked] = !cmd_opts[:unblocked] if cmd_opts[:unblocked_given]
|
37
|
+
|
38
|
+
rally.connect
|
39
|
+
|
40
|
+
story = rally.find_story_with_id ARGV.first
|
41
|
+
|
42
|
+
if cmd_opts[:iteration_given]
|
43
|
+
opts[:iteration] = rally.find_iteration_by_name cmd_opts[:iteration]
|
44
|
+
Trollop::die "Unknown iteration \"#{cmd_opts[:iteration]}\"" if opts[:iteration].nil?
|
45
|
+
end
|
46
|
+
|
47
|
+
if cmd_opts[:release_given]
|
48
|
+
opts[:release] = rally.find_release_by_name cmd_opts[:release]
|
49
|
+
Trollop::die "Unknown release \"#{cmd_opts[:release]}\"" if opts[:release].nil?
|
50
|
+
end
|
51
|
+
|
52
|
+
if cmd_opts[:parent_given]
|
53
|
+
opts[:parent] = rally.find_story_with_id(cmd_opts[:parent]).rally_object
|
54
|
+
Trollop::die "Unknown story \"#{cmd_opts[:parent]}\"" if opts[:parent].nil?
|
55
|
+
end
|
56
|
+
|
57
|
+
opts[:name] = story.name if opts[:name].blank?
|
58
|
+
|
59
|
+
story.update opts
|
60
|
+
|
61
|
+
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
data/bin/crab-create
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
cmd_opts = Trollop::options do
|
5
|
+
banner <<-BANNER
|
6
|
+
crab create: create a new story in Rally
|
7
|
+
|
8
|
+
Usage: crab create name [options]
|
9
|
+
BANNER
|
10
|
+
end
|
11
|
+
|
12
|
+
rally = Crab::Rally.new
|
13
|
+
name = ARGV.join(" ")
|
14
|
+
Trollop::die "Please specify a name for the story" if name.blank?
|
15
|
+
|
16
|
+
rally.connect
|
17
|
+
story = rally.create_story :name => name
|
18
|
+
|
19
|
+
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
data/bin/crab-del
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
cmd_opts = Trollop::options do
|
5
|
+
banner <<-BANNER
|
6
|
+
crab delete: delete an existing story in Rally
|
7
|
+
|
8
|
+
Usage: crab delete story [options]
|
9
|
+
BANNER
|
10
|
+
end
|
11
|
+
|
12
|
+
rally = Crab::Rally.new
|
13
|
+
|
14
|
+
story_id = ARGV.join(" ")
|
15
|
+
Trollop::die "Story ID must be specified" if story_id.blank?
|
16
|
+
|
17
|
+
rally.connect
|
18
|
+
story = rally.find_story_with_id story_id
|
19
|
+
|
20
|
+
story.delete
|
21
|
+
|
22
|
+
puts "Story #{story_id} deleted."
|
data/bin/crab-delete
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
cmd_opts = Trollop::options do
|
5
|
+
banner <<-BANNER
|
6
|
+
crab delete: delete an existing story in Rally
|
7
|
+
|
8
|
+
Usage: crab delete story [options]
|
9
|
+
BANNER
|
10
|
+
end
|
11
|
+
|
12
|
+
rally = Crab::Rally.new
|
13
|
+
|
14
|
+
story_id = ARGV.join(" ")
|
15
|
+
Trollop::die "Story ID must be specified" if story_id.blank?
|
16
|
+
|
17
|
+
rally.connect
|
18
|
+
story = rally.find_story_with_id story_id
|
19
|
+
|
20
|
+
story.delete
|
21
|
+
|
22
|
+
puts "Story #{story_id} deleted."
|
data/bin/crab-find
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
include Crab::Utilities
|
5
|
+
|
6
|
+
cmd_opts = Trollop::options do
|
7
|
+
banner <<-BANNER
|
8
|
+
crab find: find a story in Rally
|
9
|
+
|
10
|
+
Usage: crab find [options] [text]
|
11
|
+
BANNER
|
12
|
+
opt :project, "Project to use (required unless set by 'crab project')", :short => "-p", :type => String
|
13
|
+
end
|
14
|
+
|
15
|
+
rally = Crab::Rally.new
|
16
|
+
pattern = ARGV.map(&:strip).reject(&:empty?)
|
17
|
+
project_name = valid_project_name(cmd_opts)
|
18
|
+
|
19
|
+
rally.connect
|
20
|
+
|
21
|
+
project = rally.find_project(project_name)
|
22
|
+
|
23
|
+
Trollop::die "Project #{cmd_opts[:project].inspect} not found" if project.nil?
|
24
|
+
|
25
|
+
rally.find_stories(project, pattern).each do |story|
|
26
|
+
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
27
|
+
end
|
data/bin/crab-login
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
include Crab::Utilities
|
5
|
+
|
6
|
+
opts = Trollop::options do
|
7
|
+
banner <<-BANNER
|
8
|
+
Usage: crab login [options]
|
9
|
+
|
10
|
+
Log into Rally. Your credentials will be written to ~/.crab/credentials.
|
11
|
+
BANNER
|
12
|
+
|
13
|
+
opt :username, "Username", :type => String, :short => "-u"
|
14
|
+
opt :password, "Password", :type => String, :short => "-p"
|
15
|
+
end
|
16
|
+
|
17
|
+
username = opts[:username_given] ? opts[:username] : ask("Username: ")
|
18
|
+
password = opts[:password_given] ? opts[:password] : ask("Password: ") {|q| q.echo = false }
|
19
|
+
|
20
|
+
File.open(credentials_file, 'w') do |file|
|
21
|
+
file.puts username
|
22
|
+
file.puts password
|
23
|
+
end
|
24
|
+
|
25
|
+
puts "Logged in as #{username}"
|
data/bin/crab-move
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
include Crab::Utilities
|
5
|
+
|
6
|
+
cmd_opts = Trollop::options do
|
7
|
+
banner <<-BANNER
|
8
|
+
crab move: move a story from one status to the next (or previous)
|
9
|
+
|
10
|
+
Usage: crab move story [options]
|
11
|
+
BANNER
|
12
|
+
opt :back, "Move story backwards (from accepted to completed, for example)"
|
13
|
+
end
|
14
|
+
|
15
|
+
rally = Crab::Rally.new
|
16
|
+
story_id = ARGV.join(" ")
|
17
|
+
Trollop::die "No story given" if story_id.empty?
|
18
|
+
|
19
|
+
rally.connect
|
20
|
+
|
21
|
+
story = rally.find_story_with_id story_id
|
22
|
+
state = state_from(story.state)
|
23
|
+
|
24
|
+
story.update :schedule_state => (cmd_opts[:back] ? state_before(state) : state_after(state))
|
25
|
+
|
26
|
+
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
data/bin/crab-mv
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
include Crab::Utilities
|
5
|
+
|
6
|
+
cmd_opts = Trollop::options do
|
7
|
+
banner <<-BANNER
|
8
|
+
crab move: move a story from one status to the next (or previous)
|
9
|
+
|
10
|
+
Usage: crab move story [options]
|
11
|
+
BANNER
|
12
|
+
opt :back, "Move story backwards (from accepted to completed, for example)"
|
13
|
+
end
|
14
|
+
|
15
|
+
rally = Crab::Rally.new
|
16
|
+
story_id = ARGV.join(" ")
|
17
|
+
Trollop::die "No story given" if story_id.empty?
|
18
|
+
|
19
|
+
rally.connect
|
20
|
+
|
21
|
+
story = rally.find_story_with_id story_id
|
22
|
+
state = state_from(story.state)
|
23
|
+
|
24
|
+
story.update :schedule_state => (cmd_opts[:back] ? state_before(state) : state_after(state))
|
25
|
+
|
26
|
+
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
data/bin/crab-project
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
include Crab::Utilities
|
5
|
+
|
6
|
+
cmd_opts = Trollop::options do
|
7
|
+
banner <<-BANNER
|
8
|
+
crab project: show or persistently select project to work with in Rally
|
9
|
+
|
10
|
+
Usage: crab project [name]
|
11
|
+
BANNER
|
12
|
+
end
|
13
|
+
|
14
|
+
rally = Crab::Rally.new
|
15
|
+
|
16
|
+
current_project_name = self.class.current_project_name
|
17
|
+
if current_project_name.present?
|
18
|
+
puts current_project_name
|
19
|
+
|
20
|
+
elsif ARGV.reject {|arg| arg.blank? }.empty?
|
21
|
+
puts "No project currently selected."
|
22
|
+
|
23
|
+
else
|
24
|
+
name = ARGV.join(" ").strip
|
25
|
+
|
26
|
+
rally.connect
|
27
|
+
|
28
|
+
project = rally.find_project name
|
29
|
+
Trollop::die "#{name.inspect} is not a valid project" if project.nil?
|
30
|
+
|
31
|
+
FileUtils.mkdir_p ".crab"
|
32
|
+
File.open(".crab/project", "w") do |file|
|
33
|
+
file.puts project.name
|
34
|
+
end
|
35
|
+
end
|
data/bin/crab-pull
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
cmd_opts = Trollop::options do
|
5
|
+
banner <<-BANNER
|
6
|
+
crab pull: pulls stories from Rally and writes them out as Cucumber features
|
7
|
+
|
8
|
+
Usage: crab pull [options] story1 [story2 ...]
|
9
|
+
BANNER
|
10
|
+
opt :language, "Language to generate Cucumber features in (ISO code)", :default => "en", :short => "-l"
|
11
|
+
end
|
12
|
+
|
13
|
+
rally = Crab::Rally.new
|
14
|
+
rally.connect
|
15
|
+
|
16
|
+
ARGV.each do |story_number|
|
17
|
+
story = rally.find_story_with_id story_number
|
18
|
+
Trollop::die "Could not find story with ID #{story_number}" if story.nil?
|
19
|
+
|
20
|
+
puts "#{story.formatted_id}: #{story.full_file_name}"
|
21
|
+
|
22
|
+
FileUtils.mkdir_p File.dirname(story.full_file_name)
|
23
|
+
FileUtils.touch story.full_file_name
|
24
|
+
|
25
|
+
File.open(story.full_file_name, "w") do |file|
|
26
|
+
file.write Crab::CucumberFeature.new(cmd_opts[:language]).generate_from story
|
27
|
+
end
|
28
|
+
end
|
data/bin/crab-remove
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
cmd_opts = Trollop::options do
|
5
|
+
banner <<-BANNER
|
6
|
+
crab delete: delete an existing story in Rally
|
7
|
+
|
8
|
+
Usage: crab delete story [options]
|
9
|
+
BANNER
|
10
|
+
end
|
11
|
+
|
12
|
+
rally = Crab::Rally.new
|
13
|
+
|
14
|
+
story_id = ARGV.join(" ")
|
15
|
+
Trollop::die "Story ID must be specified" if story_id.blank?
|
16
|
+
|
17
|
+
rally.connect
|
18
|
+
story = rally.find_story_with_id story_id
|
19
|
+
|
20
|
+
story.delete
|
21
|
+
|
22
|
+
puts "Story #{story_id} deleted."
|
data/bin/crab-rm
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
cmd_opts = Trollop::options do
|
5
|
+
banner <<-BANNER
|
6
|
+
crab delete: delete an existing story in Rally
|
7
|
+
|
8
|
+
Usage: crab delete story [options]
|
9
|
+
BANNER
|
10
|
+
end
|
11
|
+
|
12
|
+
rally = Crab::Rally.new
|
13
|
+
|
14
|
+
story_id = ARGV.join(" ")
|
15
|
+
Trollop::die "Story ID must be specified" if story_id.blank?
|
16
|
+
|
17
|
+
rally.connect
|
18
|
+
story = rally.find_story_with_id story_id
|
19
|
+
|
20
|
+
story.delete
|
21
|
+
|
22
|
+
puts "Story #{story_id} deleted."
|
data/bin/crab-show
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
cmd_opts = Trollop::options do
|
5
|
+
banner <<-BANNER
|
6
|
+
crab show: displays a story in Rally as a Cucumber feature
|
7
|
+
|
8
|
+
Usage: crab show story"
|
9
|
+
BANNER
|
10
|
+
opt :language, "Language to display Cucumber features in (ISO code)", :default => "en", :short => "-l"
|
11
|
+
end
|
12
|
+
|
13
|
+
story_id = ARGV.first
|
14
|
+
rally = Crab::Rally.new
|
15
|
+
|
16
|
+
rally.connect
|
17
|
+
|
18
|
+
story = rally.find_story_with_id story_id
|
19
|
+
|
20
|
+
puts Crab::CucumberFeature.new(cmd_opts[:language]).generate_from story
|
data/bin/crab-tc
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
def add_or_update_options(banner)
|
5
|
+
Trollop::options do
|
6
|
+
banner banner
|
7
|
+
opt :priority, "Priority (one of: #{Crab::TestCase::PRIORITIES.join(" ")}", :default => "important", :short => '-p'
|
8
|
+
opt :risk, "Risk (one of: #{Crab::TestCase::RISKS.join(" ")})", :default => "medium", :short => '-r'
|
9
|
+
opt :method, "Method (one of: #{Crab::TestCase::METHODS.join(" ")})", :default => "automated", :short => '-m'
|
10
|
+
opt :type, "Type (one of: #{Crab::TestCase::TYPES.join(" ")})", :default => "acceptance", :short => '-t'
|
11
|
+
opt :pre, "Pre-conditions", :default => "N/A"
|
12
|
+
opt :post, "Post-conditions", :default => "N/A"
|
13
|
+
opt :desc, "Description", :default => "N/A", :short => '-d'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def sanitize_options(opts, creating=true)
|
18
|
+
result = {}
|
19
|
+
result[:priority] = opts[:priority].capitalize if creating || opts[:priority_given]
|
20
|
+
result[:risk] = opts[:risk].capitalize if creating || opts[:risk_given]
|
21
|
+
result[:method] = opts[:method].capitalize if creating || opts[:method_given]
|
22
|
+
result[:type] = opts[:type].capitalize if creating || opts[:type_given]
|
23
|
+
result[:pre_conditions] = opts[:pre] if creating || opts[:pre_given]
|
24
|
+
result[:post_conditions] = opts[:post] if creating || opts[:post_given]
|
25
|
+
result[:description] = opts[:desc] if creating || opts[:desc_given]
|
26
|
+
result
|
27
|
+
end
|
28
|
+
|
29
|
+
rally = Crab::Rally.new
|
30
|
+
|
31
|
+
Trollop::options do
|
32
|
+
banner <<-BANNER
|
33
|
+
crab testcase: manage test cases in a story (add, update, delete)
|
34
|
+
|
35
|
+
Usage: crab testcase add story name [options]
|
36
|
+
crab testcase update testcase [options]
|
37
|
+
crab testcase delete testcase [options]
|
38
|
+
BANNER
|
39
|
+
stop_on %w{add update delete}
|
40
|
+
end
|
41
|
+
|
42
|
+
sub = ARGV.shift
|
43
|
+
case sub
|
44
|
+
when "add"
|
45
|
+
opts = add_or_update_options "crab testcase add: add a test case to a story in Rally"
|
46
|
+
|
47
|
+
story_id = ARGV.shift
|
48
|
+
name = ARGV.join(" ")
|
49
|
+
add(story_id, name, opts)
|
50
|
+
|
51
|
+
rally.connect
|
52
|
+
tc = rally.create_test_case(story_id, name, sanitize_options(opts))
|
53
|
+
|
54
|
+
puts "#{tc.story.formatted_id}/#{tc.formatted_id}: #{tc.name} (#{tc.tags.join(" ")})"
|
55
|
+
|
56
|
+
when "update"
|
57
|
+
opts = add_or_update_options "crab testcase update: update a test case in Rally"
|
58
|
+
|
59
|
+
tc_id = ARGV.shift
|
60
|
+
|
61
|
+
rally.connect
|
62
|
+
tc = rally.find_test_case(tc_id)
|
63
|
+
tc.update(sanitize_options(opts))
|
64
|
+
puts "#{tc.story.formatted_id}/#{tc.formatted_id}: #{tc.name} (#{tc.tags.join(" ")})"
|
65
|
+
|
66
|
+
when "delete"
|
67
|
+
Trollop::options do
|
68
|
+
banner "crab testcase delete: delete a test case in Rally"
|
69
|
+
end
|
70
|
+
|
71
|
+
tc_id = ARGV.shift
|
72
|
+
rally.connect
|
73
|
+
tc = rally.find_test_case(tc_id)
|
74
|
+
tc.delete
|
75
|
+
puts "Test case #{tc_id} deleted."
|
76
|
+
|
77
|
+
else
|
78
|
+
Trollop::die "Unknown subcommand#{' ' + sub.inspect if sub}"
|
79
|
+
end
|