crab 0.2.0 → 0.2.1
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/README.md +0 -1
- data/bin/crab-add +3 -2
- data/bin/crab-change +2 -1
- data/bin/crab-create +3 -2
- data/bin/crab-del +3 -2
- data/bin/crab-delete +3 -2
- data/bin/crab-find +5 -4
- data/bin/crab-help +0 -1
- data/bin/crab-list +5 -4
- data/bin/crab-ls +5 -4
- data/bin/crab-move +4 -3
- data/bin/crab-mv +4 -3
- data/bin/crab-new +3 -2
- data/bin/crab-project +13 -5
- data/bin/crab-pull +15 -7
- data/bin/crab-remove +3 -2
- data/bin/crab-rm +3 -2
- data/bin/crab-show +2 -1
- data/bin/crab-testcase-add +1 -1
- data/bin/crab-testcase-create +1 -1
- data/bin/crab-testcase-delete +2 -1
- data/bin/crab-testcase-list +2 -1
- data/bin/crab-testcase-ls +2 -1
- data/bin/crab-testcase-new +1 -1
- data/bin/crab-testcase-rm +2 -1
- data/bin/crab-testcase-show +2 -1
- data/bin/crab-testcase-update +1 -1
- data/bin/crab-truncate +0 -5
- data/bin/crab-up +2 -1
- data/bin/crab-update +2 -1
- data/features/steps/rally_steps.rb +0 -1
- data/lib/crab/rally.rb +28 -10
- data/lib/crab/story.rb +44 -4
- data/lib/crab/testcase.rb +13 -4
- data/lib/crab/utilities.rb +2 -0
- data/lib/crab/version.rb +1 -1
- metadata +3 -3
data/README.md
CHANGED
data/bin/crab-add
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
# vim: set ft=ruby :
|
2
2
|
require 'crab'
|
3
3
|
|
4
|
-
|
4
|
+
opts = Trollop::options do
|
5
5
|
banner <<-BANNER
|
6
6
|
crab create: create a new story in Rally
|
7
7
|
|
8
8
|
Usage: crab create name [options]
|
9
9
|
BANNER
|
10
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
10
11
|
end
|
11
12
|
|
12
13
|
name = ARGV.join(" ")
|
13
14
|
Trollop::die "Please specify a name for the story" if name.blank?
|
14
15
|
|
15
|
-
Crab::Rally.new do |rally|
|
16
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
16
17
|
story = rally.create_story :name => name
|
17
18
|
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
18
19
|
end
|
data/bin/crab-change
CHANGED
@@ -17,6 +17,7 @@ Usage: crab update story [options]
|
|
17
17
|
opt :blocked, "Blocked", :short => "-b"
|
18
18
|
opt :unblocked, "Unblocked", :short => "-u"
|
19
19
|
opt :parent, "Parent", :type => String, :short => "-p"
|
20
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
20
21
|
end
|
21
22
|
|
22
23
|
Trollop::die "No story given" if ARGV.empty?
|
@@ -33,7 +34,7 @@ end
|
|
33
34
|
opts[:blocked] = cmd_opts[:blocked] if cmd_opts[:blocked_given]
|
34
35
|
opts[:blocked] = !cmd_opts[:unblocked] if cmd_opts[:unblocked_given]
|
35
36
|
|
36
|
-
Crab::Rally.new do |rally|
|
37
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
37
38
|
rally.connect
|
38
39
|
|
39
40
|
story = rally.find_story_with_id ARGV.first
|
data/bin/crab-create
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
# vim: set ft=ruby :
|
2
2
|
require 'crab'
|
3
3
|
|
4
|
-
|
4
|
+
opts = Trollop::options do
|
5
5
|
banner <<-BANNER
|
6
6
|
crab create: create a new story in Rally
|
7
7
|
|
8
8
|
Usage: crab create name [options]
|
9
9
|
BANNER
|
10
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
10
11
|
end
|
11
12
|
|
12
13
|
name = ARGV.join(" ")
|
13
14
|
Trollop::die "Please specify a name for the story" if name.blank?
|
14
15
|
|
15
|
-
Crab::Rally.new do |rally|
|
16
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
16
17
|
story = rally.create_story :name => name
|
17
18
|
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
18
19
|
end
|
data/bin/crab-del
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
# vim: set ft=ruby :
|
2
2
|
require 'crab'
|
3
3
|
|
4
|
-
|
4
|
+
opts = Trollop::options do
|
5
5
|
banner <<-BANNER
|
6
6
|
crab delete: delete an existing story in Rally
|
7
7
|
|
8
8
|
Usage: crab delete story [options]
|
9
9
|
BANNER
|
10
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
10
11
|
end
|
11
12
|
|
12
13
|
id = ARGV.join(" ")
|
13
14
|
Trollop::die "Story ID must be specified" if story_id.blank?
|
14
15
|
|
15
|
-
Crab::Rally.new do |rally|
|
16
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
16
17
|
story = rally.find_story_with_id id
|
17
18
|
story.delete
|
18
19
|
|
data/bin/crab-delete
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
# vim: set ft=ruby :
|
2
2
|
require 'crab'
|
3
3
|
|
4
|
-
|
4
|
+
opts = Trollop::options do
|
5
5
|
banner <<-BANNER
|
6
6
|
crab delete: delete an existing story in Rally
|
7
7
|
|
8
8
|
Usage: crab delete story [options]
|
9
9
|
BANNER
|
10
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
10
11
|
end
|
11
12
|
|
12
13
|
id = ARGV.join(" ")
|
13
14
|
Trollop::die "Story ID must be specified" if story_id.blank?
|
14
15
|
|
15
|
-
Crab::Rally.new do |rally|
|
16
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
16
17
|
story = rally.find_story_with_id id
|
17
18
|
story.delete
|
18
19
|
|
data/bin/crab-find
CHANGED
@@ -3,21 +3,22 @@ require 'crab'
|
|
3
3
|
|
4
4
|
include Crab::Utilities
|
5
5
|
|
6
|
-
|
6
|
+
opts = Trollop::options do
|
7
7
|
banner <<-BANNER
|
8
8
|
crab find: find a story in Rally
|
9
9
|
|
10
10
|
Usage: crab find [options] [text]
|
11
11
|
BANNER
|
12
12
|
opt :project, "Project to use (required unless set by 'crab project')", :short => "-p", :type => String
|
13
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
13
14
|
end
|
14
15
|
|
15
16
|
pattern = ARGV.map(&:strip).reject(&:empty?)
|
16
|
-
project_name = valid_project_name(
|
17
|
+
project_name = valid_project_name(opts)
|
17
18
|
|
18
|
-
Crab::Rally.new do |rally|
|
19
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
19
20
|
project = rally.find_project(project_name)
|
20
|
-
Trollop::die "Project #{
|
21
|
+
Trollop::die "Project #{opts[:project].inspect} not found" if project.nil?
|
21
22
|
|
22
23
|
rally.find_stories(project, pattern).each do |story|
|
23
24
|
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
data/bin/crab-help
CHANGED
@@ -17,7 +17,6 @@ crab version #{Crab::VERSION}: A Cucumber-Rally bridge
|
|
17
17
|
pull Downloads stories (and its test cases) as Cucumber feature files
|
18
18
|
show Show a story (and its test cases) as a Cucumber feature
|
19
19
|
testcase Manage test cases in a story (add, update, delete)
|
20
|
-
truncate Make sphor happy!
|
21
20
|
update Update a story (name, estimate, etc)
|
22
21
|
|
23
22
|
|
data/bin/crab-list
CHANGED
@@ -3,21 +3,22 @@ require 'crab'
|
|
3
3
|
|
4
4
|
include Crab::Utilities
|
5
5
|
|
6
|
-
|
6
|
+
opts = Trollop::options do
|
7
7
|
banner <<-BANNER
|
8
8
|
crab find: find a story in Rally
|
9
9
|
|
10
10
|
Usage: crab find [options] [text]
|
11
11
|
BANNER
|
12
12
|
opt :project, "Project to use (required unless set by 'crab project')", :short => "-p", :type => String
|
13
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
13
14
|
end
|
14
15
|
|
15
16
|
pattern = ARGV.map(&:strip).reject(&:empty?)
|
16
|
-
project_name = valid_project_name(
|
17
|
+
project_name = valid_project_name(opts)
|
17
18
|
|
18
|
-
Crab::Rally.new do |rally|
|
19
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
19
20
|
project = rally.find_project(project_name)
|
20
|
-
Trollop::die "Project #{
|
21
|
+
Trollop::die "Project #{opts[:project].inspect} not found" if project.nil?
|
21
22
|
|
22
23
|
rally.find_stories(project, pattern).each do |story|
|
23
24
|
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
data/bin/crab-ls
CHANGED
@@ -3,21 +3,22 @@ require 'crab'
|
|
3
3
|
|
4
4
|
include Crab::Utilities
|
5
5
|
|
6
|
-
|
6
|
+
opts = Trollop::options do
|
7
7
|
banner <<-BANNER
|
8
8
|
crab find: find a story in Rally
|
9
9
|
|
10
10
|
Usage: crab find [options] [text]
|
11
11
|
BANNER
|
12
12
|
opt :project, "Project to use (required unless set by 'crab project')", :short => "-p", :type => String
|
13
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
13
14
|
end
|
14
15
|
|
15
16
|
pattern = ARGV.map(&:strip).reject(&:empty?)
|
16
|
-
project_name = valid_project_name(
|
17
|
+
project_name = valid_project_name(opts)
|
17
18
|
|
18
|
-
Crab::Rally.new do |rally|
|
19
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
19
20
|
project = rally.find_project(project_name)
|
20
|
-
Trollop::die "Project #{
|
21
|
+
Trollop::die "Project #{opts[:project].inspect} not found" if project.nil?
|
21
22
|
|
22
23
|
rally.find_stories(project, pattern).each do |story|
|
23
24
|
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
data/bin/crab-move
CHANGED
@@ -3,23 +3,24 @@ require 'crab'
|
|
3
3
|
|
4
4
|
include Crab::Utilities
|
5
5
|
|
6
|
-
|
6
|
+
opts = Trollop::options do
|
7
7
|
banner <<-BANNER
|
8
8
|
crab move: move a story from one status to the next (or previous)
|
9
9
|
|
10
10
|
Usage: crab move story [options]
|
11
11
|
BANNER
|
12
12
|
opt :back, "Move story backwards (from accepted to completed, for example)"
|
13
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
13
14
|
end
|
14
15
|
|
15
16
|
id = ARGV.join(" ")
|
16
17
|
Trollop::die "No story given" if id.empty?
|
17
18
|
|
18
|
-
Crab::Rally.new do |rally|
|
19
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
19
20
|
story = rally.find_story_with_id id
|
20
21
|
state = state_from(story.state)
|
21
22
|
|
22
|
-
story.update :schedule_state => (
|
23
|
+
story.update :schedule_state => (opts[:back] ? state_before(state) : state_after(state))
|
23
24
|
|
24
25
|
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
25
26
|
end
|
data/bin/crab-mv
CHANGED
@@ -3,23 +3,24 @@ require 'crab'
|
|
3
3
|
|
4
4
|
include Crab::Utilities
|
5
5
|
|
6
|
-
|
6
|
+
opts = Trollop::options do
|
7
7
|
banner <<-BANNER
|
8
8
|
crab move: move a story from one status to the next (or previous)
|
9
9
|
|
10
10
|
Usage: crab move story [options]
|
11
11
|
BANNER
|
12
12
|
opt :back, "Move story backwards (from accepted to completed, for example)"
|
13
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
13
14
|
end
|
14
15
|
|
15
16
|
id = ARGV.join(" ")
|
16
17
|
Trollop::die "No story given" if id.empty?
|
17
18
|
|
18
|
-
Crab::Rally.new do |rally|
|
19
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
19
20
|
story = rally.find_story_with_id id
|
20
21
|
state = state_from(story.state)
|
21
22
|
|
22
|
-
story.update :schedule_state => (
|
23
|
+
story.update :schedule_state => (opts[:back] ? state_before(state) : state_after(state))
|
23
24
|
|
24
25
|
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
25
26
|
end
|
data/bin/crab-new
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
# vim: set ft=ruby :
|
2
2
|
require 'crab'
|
3
3
|
|
4
|
-
|
4
|
+
opts = Trollop::options do
|
5
5
|
banner <<-BANNER
|
6
6
|
crab create: create a new story in Rally
|
7
7
|
|
8
8
|
Usage: crab create name [options]
|
9
9
|
BANNER
|
10
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
10
11
|
end
|
11
12
|
|
12
13
|
name = ARGV.join(" ")
|
13
14
|
Trollop::die "Please specify a name for the story" if name.blank?
|
14
15
|
|
15
|
-
Crab::Rally.new do |rally|
|
16
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
16
17
|
story = rally.create_story :name => name
|
17
18
|
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
18
19
|
end
|
data/bin/crab-project
CHANGED
@@ -3,12 +3,13 @@ require 'crab'
|
|
3
3
|
|
4
4
|
include Crab::Utilities
|
5
5
|
|
6
|
-
|
6
|
+
opts = Trollop::options do
|
7
7
|
banner <<-BANNER
|
8
8
|
crab project: show or persistently select project to work with in Rally
|
9
9
|
|
10
10
|
Usage: crab project [name]
|
11
11
|
BANNER
|
12
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
12
13
|
end
|
13
14
|
|
14
15
|
current_project_name = self.class.current_project_name
|
@@ -23,12 +24,19 @@ end
|
|
23
24
|
|
24
25
|
name = ARGV.join(" ").strip
|
25
26
|
|
26
|
-
Crab::Rally.new do |rally|
|
27
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
27
28
|
project = rally.find_project name
|
28
29
|
Trollop::die "#{name.inspect} is not a valid project" if project.nil?
|
29
30
|
|
30
|
-
FileUtils.mkdir_p ".crab"
|
31
|
-
|
32
|
-
|
31
|
+
FileUtils.mkdir_p ".crab", opts[:dry] ? { :noop => true, :verbose => true } : {}
|
32
|
+
file = ".crab/project"
|
33
|
+
output = project.name
|
34
|
+
|
35
|
+
if opts[:dry]
|
36
|
+
puts "Would write to #{file}:\n\n#{output}"
|
37
|
+
else
|
38
|
+
File.open(file, "w") do |file|
|
39
|
+
file.puts project.name
|
40
|
+
end
|
33
41
|
end
|
34
42
|
end
|
data/bin/crab-pull
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
# vim: set ft=ruby :
|
2
2
|
require 'crab'
|
3
3
|
|
4
|
-
|
4
|
+
opts = Trollop::options do
|
5
5
|
banner <<-BANNER
|
6
6
|
crab pull: pulls stories from Rally and writes them out as Cucumber features
|
7
7
|
|
8
8
|
Usage: crab pull [options] story1 [story2 ...]
|
9
9
|
BANNER
|
10
10
|
opt :language, "Language to generate Cucumber features in (ISO code)", :default => "en", :short => "-l"
|
11
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
11
12
|
end
|
12
13
|
|
13
|
-
Crab::Rally.new do |rally|
|
14
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
14
15
|
|
15
16
|
ARGV.each do |story_number|
|
16
17
|
story = rally.find_story_with_id story_number
|
@@ -18,12 +19,19 @@ Crab::Rally.new do |rally|
|
|
18
19
|
|
19
20
|
puts "#{story.formatted_id}: #{story.full_file_name}"
|
20
21
|
|
21
|
-
|
22
|
-
FileUtils.touch story.full_file_name
|
22
|
+
fileutils_opts = opts[:dry] ? { :noop => true, :verbose => true } : {}
|
23
23
|
|
24
|
-
File.
|
25
|
-
|
24
|
+
FileUtils.mkdir_p File.dirname(story.full_file_name), fileutils_opts
|
25
|
+
FileUtils.touch story.full_file_name, fileutils_opts
|
26
|
+
|
27
|
+
output = Crab::CucumberFeature.new(opts[:language]).generate_from story
|
28
|
+
|
29
|
+
if opts[:dry]
|
30
|
+
puts "Would write to #{story.full_file_name}:\n\n#{output}"
|
31
|
+
else
|
32
|
+
File.open(story.full_file_name, "w") do |file|
|
33
|
+
file.write output
|
34
|
+
end
|
26
35
|
end
|
27
36
|
end
|
28
|
-
|
29
37
|
end
|
data/bin/crab-remove
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
# vim: set ft=ruby :
|
2
2
|
require 'crab'
|
3
3
|
|
4
|
-
|
4
|
+
opts = Trollop::options do
|
5
5
|
banner <<-BANNER
|
6
6
|
crab delete: delete an existing story in Rally
|
7
7
|
|
8
8
|
Usage: crab delete story [options]
|
9
9
|
BANNER
|
10
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
10
11
|
end
|
11
12
|
|
12
13
|
id = ARGV.join(" ")
|
13
14
|
Trollop::die "Story ID must be specified" if story_id.blank?
|
14
15
|
|
15
|
-
Crab::Rally.new do |rally|
|
16
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
16
17
|
story = rally.find_story_with_id id
|
17
18
|
story.delete
|
18
19
|
|
data/bin/crab-rm
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
# vim: set ft=ruby :
|
2
2
|
require 'crab'
|
3
3
|
|
4
|
-
|
4
|
+
opts = Trollop::options do
|
5
5
|
banner <<-BANNER
|
6
6
|
crab delete: delete an existing story in Rally
|
7
7
|
|
8
8
|
Usage: crab delete story [options]
|
9
9
|
BANNER
|
10
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
10
11
|
end
|
11
12
|
|
12
13
|
id = ARGV.join(" ")
|
13
14
|
Trollop::die "Story ID must be specified" if story_id.blank?
|
14
15
|
|
15
|
-
Crab::Rally.new do |rally|
|
16
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
16
17
|
story = rally.find_story_with_id id
|
17
18
|
story.delete
|
18
19
|
|
data/bin/crab-show
CHANGED
@@ -8,10 +8,11 @@ crab show: displays a story in Rally as a Cucumber feature
|
|
8
8
|
Usage: crab show story"
|
9
9
|
BANNER
|
10
10
|
opt :language, "Language to display Cucumber features in (ISO code)", :default => "en", :short => "-l"
|
11
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
11
12
|
end
|
12
13
|
|
13
14
|
id = ARGV.first
|
14
|
-
Crab::Rally.new do |rally|
|
15
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
15
16
|
story = rally.find_story_with_id(id)
|
16
17
|
|
17
18
|
puts Crab::CucumberFeature.new(opts[:language]).generate_from story
|
data/bin/crab-testcase-add
CHANGED
@@ -19,7 +19,7 @@ unless name
|
|
19
19
|
exit 1
|
20
20
|
end
|
21
21
|
|
22
|
-
Crab::Rally.new do |rally|
|
22
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
23
23
|
tc = rally.create_test_case(story_id, name, sanitize_options(opts))
|
24
24
|
puts "#{tc.story.formatted_id}/#{tc.formatted_id}: #{tc.name} (#{tc.tags.join(" ")})"
|
25
25
|
end
|
data/bin/crab-testcase-create
CHANGED
@@ -19,7 +19,7 @@ unless name
|
|
19
19
|
exit 1
|
20
20
|
end
|
21
21
|
|
22
|
-
Crab::Rally.new do |rally|
|
22
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
23
23
|
tc = rally.create_test_case(story_id, name, sanitize_options(opts))
|
24
24
|
puts "#{tc.story.formatted_id}/#{tc.formatted_id}: #{tc.name} (#{tc.tags.join(" ")})"
|
25
25
|
end
|
data/bin/crab-testcase-delete
CHANGED
@@ -3,10 +3,11 @@ require 'crab'
|
|
3
3
|
|
4
4
|
Trollop::options do
|
5
5
|
banner "crab testcase delete: delete a test case in Rally"
|
6
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
6
7
|
end
|
7
8
|
|
8
9
|
tc_id = ARGV.shift
|
9
|
-
Crab::Rally.new do |rally|
|
10
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
10
11
|
tc = rally.find_test_case(tc_id)
|
11
12
|
tc.delete
|
12
13
|
puts "Test case #{tc_id} deleted."
|
data/bin/crab-testcase-list
CHANGED
@@ -8,6 +8,7 @@ crab testcase list: displays all testcases in Rally in a story as Cucumber scena
|
|
8
8
|
Usage: crab testcase list <story> [options]"
|
9
9
|
BANNER
|
10
10
|
opt :language, "Language to display Cucumber features in (ISO code)", :default => "en", :short => "-l"
|
11
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
11
12
|
end
|
12
13
|
|
13
14
|
id = ARGV.shift
|
@@ -17,7 +18,7 @@ unless id
|
|
17
18
|
exit 1
|
18
19
|
end
|
19
20
|
|
20
|
-
Crab::Rally.new do |rally|
|
21
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
21
22
|
story = rally.find_story_with_id id
|
22
23
|
|
23
24
|
puts Array(story.scenarios).map {|scenario| Crab::CucumberScenario.new(opts[:language]).generate_from scenario }.join.strip
|
data/bin/crab-testcase-ls
CHANGED
@@ -8,6 +8,7 @@ crab testcase list: displays all testcases in Rally in a story as Cucumber scena
|
|
8
8
|
Usage: crab testcase list <story> [options]"
|
9
9
|
BANNER
|
10
10
|
opt :language, "Language to display Cucumber features in (ISO code)", :default => "en", :short => "-l"
|
11
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
11
12
|
end
|
12
13
|
|
13
14
|
id = ARGV.shift
|
@@ -17,7 +18,7 @@ unless id
|
|
17
18
|
exit 1
|
18
19
|
end
|
19
20
|
|
20
|
-
Crab::Rally.new do |rally|
|
21
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
21
22
|
story = rally.find_story_with_id id
|
22
23
|
|
23
24
|
puts Array(story.scenarios).map {|scenario| Crab::CucumberScenario.new(opts[:language]).generate_from scenario }.join.strip
|
data/bin/crab-testcase-new
CHANGED
@@ -19,7 +19,7 @@ unless name
|
|
19
19
|
exit 1
|
20
20
|
end
|
21
21
|
|
22
|
-
Crab::Rally.new do |rally|
|
22
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
23
23
|
tc = rally.create_test_case(story_id, name, sanitize_options(opts))
|
24
24
|
puts "#{tc.story.formatted_id}/#{tc.formatted_id}: #{tc.name} (#{tc.tags.join(" ")})"
|
25
25
|
end
|
data/bin/crab-testcase-rm
CHANGED
@@ -3,10 +3,11 @@ require 'crab'
|
|
3
3
|
|
4
4
|
Trollop::options do
|
5
5
|
banner "crab testcase delete: delete a test case in Rally"
|
6
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
6
7
|
end
|
7
8
|
|
8
9
|
tc_id = ARGV.shift
|
9
|
-
Crab::Rally.new do |rally|
|
10
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
10
11
|
tc = rally.find_test_case(tc_id)
|
11
12
|
tc.delete
|
12
13
|
puts "Test case #{tc_id} deleted."
|
data/bin/crab-testcase-show
CHANGED
@@ -8,6 +8,7 @@ crab testcase show: displays a testcase in Rally as a Cucumber scenario
|
|
8
8
|
Usage: crab testcase show <testcase> [options]"
|
9
9
|
BANNER
|
10
10
|
opt :language, "Language to display Cucumber features in (ISO code)", :default => "en", :short => "-l"
|
11
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
11
12
|
end
|
12
13
|
|
13
14
|
id = ARGV.shift
|
@@ -17,7 +18,7 @@ unless id
|
|
17
18
|
exit 1
|
18
19
|
end
|
19
20
|
|
20
|
-
Crab::Rally.new do |rally|
|
21
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
21
22
|
tc = rally.find_test_case id
|
22
23
|
puts Crab::CucumberScenario.new(opts[:language]).generate_from(tc).strip
|
23
24
|
end
|
data/bin/crab-testcase-update
CHANGED
@@ -7,7 +7,7 @@ opts = add_or_update_options "crab testcase update: update a test case in Rally"
|
|
7
7
|
|
8
8
|
tc_id = ARGV.shift
|
9
9
|
|
10
|
-
Crab::Rally.new do |rally|
|
10
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
11
11
|
tc = rally.find_test_case(tc_id)
|
12
12
|
tc.update(sanitize_options(opts))
|
13
13
|
puts "#{tc.story.formatted_id}/#{tc.formatted_id}: #{tc.name} (#{tc.tags.join(" ")})"
|
data/bin/crab-truncate
CHANGED
data/bin/crab-up
CHANGED
@@ -17,6 +17,7 @@ Usage: crab update story [options]
|
|
17
17
|
opt :blocked, "Blocked", :short => "-b"
|
18
18
|
opt :unblocked, "Unblocked", :short => "-u"
|
19
19
|
opt :parent, "Parent", :type => String, :short => "-p"
|
20
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
20
21
|
end
|
21
22
|
|
22
23
|
Trollop::die "No story given" if ARGV.empty?
|
@@ -33,7 +34,7 @@ end
|
|
33
34
|
opts[:blocked] = cmd_opts[:blocked] if cmd_opts[:blocked_given]
|
34
35
|
opts[:blocked] = !cmd_opts[:unblocked] if cmd_opts[:unblocked_given]
|
35
36
|
|
36
|
-
Crab::Rally.new do |rally|
|
37
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
37
38
|
rally.connect
|
38
39
|
|
39
40
|
story = rally.find_story_with_id ARGV.first
|
data/bin/crab-update
CHANGED
@@ -17,6 +17,7 @@ Usage: crab update story [options]
|
|
17
17
|
opt :blocked, "Blocked", :short => "-b"
|
18
18
|
opt :unblocked, "Unblocked", :short => "-u"
|
19
19
|
opt :parent, "Parent", :type => String, :short => "-p"
|
20
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
20
21
|
end
|
21
22
|
|
22
23
|
Trollop::die "No story given" if ARGV.empty?
|
@@ -33,7 +34,7 @@ end
|
|
33
34
|
opts[:blocked] = cmd_opts[:blocked] if cmd_opts[:blocked_given]
|
34
35
|
opts[:blocked] = !cmd_opts[:unblocked] if cmd_opts[:unblocked_given]
|
35
36
|
|
36
|
-
Crab::Rally.new do |rally|
|
37
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
37
38
|
rally.connect
|
38
39
|
|
39
40
|
story = rally.find_story_with_id ARGV.first
|
@@ -17,7 +17,6 @@ crab version #{Crab::VERSION}: A Cucumber-Rally bridge
|
|
17
17
|
pull Downloads stories (and its test cases) as Cucumber feature files
|
18
18
|
show Show a story (and its test cases) as a Cucumber feature
|
19
19
|
testcase Manage test cases in a story (add, update, delete)
|
20
|
-
truncate Make sphor happy!
|
21
20
|
update Update a story (name, estimate, etc)
|
22
21
|
|
23
22
|
|
data/lib/crab/rally.rb
CHANGED
@@ -3,7 +3,9 @@ module Crab
|
|
3
3
|
|
4
4
|
include Crab::Utilities
|
5
5
|
|
6
|
-
def initialize
|
6
|
+
def initialize(dry_run)
|
7
|
+
@dry_run = dry_run
|
8
|
+
|
7
9
|
if block_given?
|
8
10
|
connect
|
9
11
|
yield self
|
@@ -20,25 +22,30 @@ module Crab
|
|
20
22
|
end
|
21
23
|
|
22
24
|
def find_story_with_id story_id
|
23
|
-
|
25
|
+
story = @rally.find(:hierarchical_requirement) { equal :formatted_i_d, story_id }.first
|
26
|
+
Crab::Story.new(story, @dry_run)
|
24
27
|
end
|
25
28
|
|
26
29
|
def find_all_stories(opts={})
|
27
|
-
@rally.find_all(:hierarchical_requirement, {:fetch => true}.merge(opts)).map
|
30
|
+
@rally.find_all(:hierarchical_requirement, {:fetch => true}.merge(opts)).map do |story|
|
31
|
+
Crab::Story.new(story, @dry_run)
|
32
|
+
end
|
28
33
|
end
|
29
34
|
|
30
35
|
def find_stories(project, pattern=[])
|
31
36
|
return find_all_stories :project => project if pattern.empty?
|
32
37
|
|
33
|
-
@rally.find(:hierarchical_requirement, :fetch => true, :project => project)
|
38
|
+
rally_stories = @rally.find(:hierarchical_requirement, :fetch => true, :project => project) do
|
34
39
|
pattern.each do |word|
|
35
|
-
_or_
|
40
|
+
_or_ do
|
36
41
|
contains :name, word
|
37
42
|
contains :description, word
|
38
43
|
contains :notes, word
|
39
|
-
|
44
|
+
end
|
40
45
|
end
|
41
|
-
|
46
|
+
end
|
47
|
+
|
48
|
+
rally_stories.map {|story| Crab::Story.new(story, @dry_run) }
|
42
49
|
end
|
43
50
|
|
44
51
|
def find_project(name)
|
@@ -54,16 +61,27 @@ module Crab
|
|
54
61
|
end
|
55
62
|
|
56
63
|
def create_story(opts)
|
57
|
-
|
64
|
+
if @dry_run
|
65
|
+
Crab::DryRun::Story.new opts
|
66
|
+
else
|
67
|
+
Crab::Story.new(@rally.create(:hierarchical_requirement, opts), @dry_run)
|
68
|
+
end
|
58
69
|
end
|
59
70
|
|
60
71
|
def create_test_case(story_id, name, opts)
|
61
72
|
story = find_story_with_id story_id
|
62
|
-
|
73
|
+
opts = {:name => name, :work_product => story.rally_object, :project => story.rally_object.project}.merge(opts)
|
74
|
+
|
75
|
+
if @dry_run
|
76
|
+
puts "Would create test case for story with ID #{story_id} with #{opts.inspect}"
|
77
|
+
else
|
78
|
+
tc = @rally.create(:test_case, opts)
|
79
|
+
Crab::TestCase.new(tc, @dry_run)
|
80
|
+
end
|
63
81
|
end
|
64
82
|
|
65
83
|
def find_test_case(tc_id)
|
66
|
-
Crab::TestCase.new
|
84
|
+
Crab::TestCase.new(@rally.find(:test_case) { equal :formatted_i_d, tc_id }.first, @dry_run)
|
67
85
|
end
|
68
86
|
|
69
87
|
end
|
data/lib/crab/story.rb
CHANGED
@@ -4,8 +4,9 @@ module Crab
|
|
4
4
|
|
5
5
|
VALID_STATES = %w{Grooming Defined In-Progress Completed Accepted Released}
|
6
6
|
|
7
|
-
def initialize(rally_story)
|
7
|
+
def initialize(rally_story, dry_run)
|
8
8
|
@rally_story = rally_story
|
9
|
+
@dry_run = dry_run
|
9
10
|
end
|
10
11
|
|
11
12
|
def name
|
@@ -37,15 +38,23 @@ module Crab
|
|
37
38
|
end
|
38
39
|
|
39
40
|
def scenarios
|
40
|
-
Array(@rally_story.test_cases).map {|tc| Crab::TestCase.new
|
41
|
+
Array(@rally_story.test_cases).map {|tc| Crab::TestCase.new(tc, @dry_run) }
|
41
42
|
end
|
42
43
|
|
43
44
|
def update(opts)
|
44
|
-
@
|
45
|
+
if @dry_run
|
46
|
+
puts "Would update story #{formatted_id} with #{opts.inspect}"
|
47
|
+
else
|
48
|
+
@rally_story.update opts
|
49
|
+
end
|
45
50
|
end
|
46
51
|
|
47
52
|
def delete
|
48
|
-
@
|
53
|
+
if @dry_run
|
54
|
+
puts "Would delete story #{formatted_id}"
|
55
|
+
else
|
56
|
+
@rally_story.delete
|
57
|
+
end
|
49
58
|
end
|
50
59
|
|
51
60
|
def rally_object
|
@@ -62,4 +71,35 @@ module Crab
|
|
62
71
|
|
63
72
|
end
|
64
73
|
|
74
|
+
module DryRun
|
75
|
+
class Story
|
76
|
+
def initialize(opts)
|
77
|
+
puts "Would create story with #{opts.inspect}"
|
78
|
+
|
79
|
+
@name = opts[:name]
|
80
|
+
end
|
81
|
+
|
82
|
+
def name
|
83
|
+
@name
|
84
|
+
end
|
85
|
+
|
86
|
+
def formatted_id
|
87
|
+
"USXXXX"
|
88
|
+
end
|
89
|
+
|
90
|
+
def state
|
91
|
+
"grooming"
|
92
|
+
end
|
93
|
+
|
94
|
+
def description
|
95
|
+
""
|
96
|
+
end
|
97
|
+
|
98
|
+
def scenarios
|
99
|
+
[]
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
65
104
|
end
|
105
|
+
|
data/lib/crab/testcase.rb
CHANGED
@@ -7,8 +7,9 @@ module Crab
|
|
7
7
|
METHODS = %w{automated manual}
|
8
8
|
TYPES = %w{acceptance functional non-functional performance regression usability}
|
9
9
|
|
10
|
-
def initialize(rally_test_case)
|
10
|
+
def initialize(rally_test_case, dry_run)
|
11
11
|
@rally_test_case = rally_test_case
|
12
|
+
@dry_run
|
12
13
|
end
|
13
14
|
|
14
15
|
def formatted_id
|
@@ -40,15 +41,23 @@ module Crab
|
|
40
41
|
end
|
41
42
|
|
42
43
|
def story
|
43
|
-
Crab::Story.new
|
44
|
+
Crab::Story.new(@rally_test_case.work_product, @dry_run)
|
44
45
|
end
|
45
46
|
|
46
47
|
def delete
|
47
|
-
@
|
48
|
+
if @dry_run
|
49
|
+
puts "Would delete test case #{formatted_id}"
|
50
|
+
else
|
51
|
+
@rally_test_case.delete
|
52
|
+
end
|
48
53
|
end
|
49
54
|
|
50
55
|
def update(options)
|
51
|
-
@
|
56
|
+
if @dry_run
|
57
|
+
puts "Would update test case #{formatted_id} with #{options.inspect}"
|
58
|
+
else
|
59
|
+
@rally_test_case.update options
|
60
|
+
end
|
52
61
|
end
|
53
62
|
|
54
63
|
def steps
|
data/lib/crab/utilities.rb
CHANGED
@@ -51,6 +51,8 @@ module Crab
|
|
51
51
|
opt :pre, "Pre-conditions", :default => "N/A"
|
52
52
|
opt :post, "Post-conditions", :default => "N/A"
|
53
53
|
opt :desc, "Description", :default => "N/A", :short => '-d'
|
54
|
+
|
55
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
54
56
|
end
|
55
57
|
end
|
56
58
|
|
data/lib/crab/version.rb
CHANGED
metadata
CHANGED