crab 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +12 -12
- data/bin/crab-help +9 -13
- data/bin/crab-iteration +18 -0
- data/bin/crab-iteration-help +11 -0
- data/bin/crab-login +2 -2
- data/bin/crab-logout +18 -0
- data/bin/crab-project +1 -1
- data/bin/{crab-tc → crab-release} +4 -4
- data/bin/crab-release-help +11 -0
- data/bin/crab-story +18 -0
- data/bin/{crab-add → crab-story-add} +2 -2
- data/bin/{crab-change → crab-story-change} +4 -4
- data/bin/{crab-new → crab-story-create} +2 -2
- data/bin/{crab-remove → crab-story-del} +3 -3
- data/bin/{crab-delete → crab-story-delete} +3 -3
- data/bin/{crab-find → crab-story-find} +2 -2
- data/bin/crab-story-help +11 -0
- data/bin/{crab-ls → crab-story-list} +2 -2
- data/bin/{crab-list → crab-story-ls} +2 -2
- data/bin/{crab-move → crab-story-move} +2 -2
- data/bin/{crab-mv → crab-story-mv} +2 -2
- data/bin/{crab-create → crab-story-new} +2 -2
- data/bin/{crab-pull → crab-story-pull} +2 -2
- data/bin/{crab-rename → crab-story-ren} +2 -2
- data/bin/crab-story-rename +27 -0
- data/bin/{crab-rm → crab-story-rm} +3 -3
- data/bin/{crab-show → crab-story-show} +2 -2
- data/bin/{crab-up → crab-story-up} +4 -4
- data/bin/{crab-update → crab-story-update} +4 -4
- data/bin/crab-testcase +1 -1
- data/bin/crab-testcase-add +5 -1
- data/bin/crab-testcase-change +18 -0
- data/bin/crab-testcase-create +5 -1
- data/bin/crab-testcase-del +18 -0
- data/bin/crab-testcase-delete +5 -1
- data/bin/crab-testcase-find +10 -0
- data/bin/crab-testcase-help +11 -5
- data/bin/crab-testcase-list +1 -1
- data/bin/crab-testcase-ls +6 -21
- data/bin/crab-testcase-new +5 -1
- data/bin/crab-testcase-rm +5 -1
- data/bin/crab-testcase-show +1 -1
- data/bin/crab-testcase-up +18 -0
- data/bin/crab-testcase-update +5 -1
- data/features/find-text-in-stories.feature +3 -3
- data/features/login-and-out-of-rally.feature +1 -2
- data/features/move-in-rally.feature +2 -2
- data/features/pull-from-rally-into-cucumber.feature +4 -4
- data/features/show-from-rally.feature +3 -3
- data/features/steps/rally_steps.rb +45 -59
- data/features/subcommand-help.feature +28 -89
- data/features/update-story-in-rally.feature +8 -8
- data/lib/crab/rally.rb +4 -4
- data/lib/crab/version.rb +1 -1
- metadata +62 -42
- data/bin/crab-del +0 -21
data/README.md
CHANGED
@@ -38,20 +38,20 @@ Initially, there were concerns around migration of the existing data.
|
|
38
38
|
Thankfully, that part is easy:
|
39
39
|
|
40
40
|
$ crab login -u cv@lixo.org -p secr3t
|
41
|
-
|
41
|
+
Credentials stored for cv@lixo.org.
|
42
42
|
|
43
43
|
$ crab project "World Domination 3000"
|
44
|
-
$ crab find
|
44
|
+
$ crab story find
|
45
45
|
US1001: Arms Rockets Upon Successful Boot
|
46
46
|
US1002: Launches Rockets Upon Command from Evil Mastermind
|
47
47
|
US1003: Transfers $0.01 From All Bank Accounts
|
48
48
|
...
|
49
49
|
|
50
|
-
$ crab find Rockets
|
50
|
+
$ crab story find Rockets
|
51
51
|
US1001: Arms Rockets After Boot
|
52
52
|
US1002: Launches Rockets Upon Command from Evil Mastermind
|
53
53
|
|
54
|
-
$ crab show US1001
|
54
|
+
$ crab story show US1001
|
55
55
|
Feature: [US1001] Arms Rockets After Boot
|
56
56
|
|
57
57
|
In order to gain bargaining power with Super Hero
|
@@ -63,9 +63,9 @@ Thankfully, that part is easy:
|
|
63
63
|
If there are any test cases, their steps get converted into Cucumber
|
64
64
|
steps:
|
65
65
|
|
66
|
-
$ crab show US1001
|
66
|
+
$ crab story show US1001
|
67
67
|
...
|
68
|
-
|
68
|
+
@critical @automated @high
|
69
69
|
Scenario: [TC10001] Rocket Silo Is Unlocked
|
70
70
|
Given a silo where the rockets are stored
|
71
71
|
When I boot the system
|
@@ -78,19 +78,19 @@ In that sense, `crab` acts more like a command-line interface to Rally than a
|
|
78
78
|
bridge between Rally and Cucumber, but the team thought these were *very*
|
79
79
|
convenient features to have:
|
80
80
|
|
81
|
-
$ crab create "Secure Access to Flying Fortress Controls"
|
81
|
+
$ crab story create "Secure Access to Flying Fortress Controls"
|
82
82
|
US1004: Secure Access to Flying Fortress Controls (grooming)
|
83
83
|
|
84
|
-
$ crab update US1001 --name "Arms Rockets Upon Successful Boot" --state completed
|
84
|
+
$ crab story update US1001 --name "Arms Rockets Upon Successful Boot" --state completed
|
85
85
|
US1001: Arms Rockets Upon Successful Boot (completed)
|
86
86
|
|
87
|
-
$ crab delete US1004 # not in this movie :(
|
87
|
+
$ crab story delete US1004 # not in this movie :(
|
88
88
|
Story US1004 deleted.
|
89
89
|
|
90
|
-
It is also possible to
|
90
|
+
It is also possible to create, update and delete test cases inside Rally straight
|
91
91
|
from the command line:
|
92
92
|
|
93
|
-
$ crab testcase
|
93
|
+
$ crab testcase create US1001 "Rocket Silo Is Unlocked"
|
94
94
|
US1001/TC1501: Rocket Silo Is Unlocked (important medium automated acceptance)
|
95
95
|
|
96
96
|
$ crab testcase update TC1501 --priority critical --risk low
|
@@ -107,7 +107,7 @@ i18n Support
|
|
107
107
|
`crab` uses [Gherkin][3] internally, so all languages supported by Cucumber are also
|
108
108
|
included:
|
109
109
|
|
110
|
-
$ crab show US1001 -l ja
|
110
|
+
$ crab story show US1001 -l ja
|
111
111
|
機能: [US1001] Arms Rockets Upon Successful Boot
|
112
112
|
...
|
113
113
|
シナリオ: [TC1501] Rocket Silo Is Unlocked
|
data/bin/crab-help
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# vim: set ft=ruby :
|
2
|
-
require 'crab'
|
2
|
+
require 'crab/version'
|
3
3
|
|
4
4
|
puts <<-HELP
|
5
5
|
Usage: crab <command> [options*]
|
@@ -8,18 +8,14 @@ crab version #{Crab::VERSION}: A Cucumber-Rally bridge
|
|
8
8
|
|
9
9
|
Available commands:
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
show Show a story (and its test cases) as a Cucumber feature
|
20
|
-
testcase Manage test cases in a story (add, update, delete)
|
21
|
-
update Update a story (name, estimate, etc)
|
22
|
-
|
11
|
+
help Show this help text
|
12
|
+
iteration Manipulate iterations
|
13
|
+
login Persistently authenticate user with Rally
|
14
|
+
logout Remove stored Rally credentials
|
15
|
+
project Persistently select project to work with in Rally
|
16
|
+
release Manipulate releases
|
17
|
+
story Manipulate stories
|
18
|
+
testcase Manipulate test cases
|
23
19
|
|
24
20
|
--version, -v: Print version and exit
|
25
21
|
--help, -h: Show this message
|
data/bin/crab-iteration
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# vim: set ft=ruby:
|
3
|
+
|
4
|
+
cmd = ARGV.shift # get the subcommand
|
5
|
+
|
6
|
+
case cmd
|
7
|
+
when "-h", "--help", NilClass
|
8
|
+
system "crab-iteration-help"
|
9
|
+
exit 0
|
10
|
+
end
|
11
|
+
|
12
|
+
unless system("crab-iteration-#{cmd}", *ARGV)
|
13
|
+
if $?.exitstatus == 127 # bash 'command not found'
|
14
|
+
$stderr.puts "Unknown subcommand \"iteration #{cmd}\""
|
15
|
+
system "crab-iteration-help"
|
16
|
+
exit 127
|
17
|
+
end
|
18
|
+
end
|
data/bin/crab-login
CHANGED
@@ -5,7 +5,7 @@ include Crab::Utilities
|
|
5
5
|
|
6
6
|
opts = Trollop::options do
|
7
7
|
banner <<-BANNER
|
8
|
-
Usage: crab login [options]
|
8
|
+
Usage: crab login [options*]
|
9
9
|
|
10
10
|
Log into Rally. Your credentials will be written to ~/.crab/credentials.
|
11
11
|
BANNER
|
@@ -22,4 +22,4 @@ File.open(credentials_file, 'w') do |file|
|
|
22
22
|
file.puts password
|
23
23
|
end
|
24
24
|
|
25
|
-
puts "
|
25
|
+
puts "Credentials stored for #{username}"
|
data/bin/crab-logout
ADDED
@@ -0,0 +1,18 @@
|
|
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 logout [options*]
|
9
|
+
|
10
|
+
Log out of Rally. Your credentials will be removed from ~/.crab/credentials.
|
11
|
+
BANNER
|
12
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
13
|
+
end
|
14
|
+
|
15
|
+
fileutils_opts = opts[:dry] ? {:noop => true, :verbose => true} : {}
|
16
|
+
FileUtils.rm_rf(credentials_file, fileutils_opts)
|
17
|
+
|
18
|
+
puts "Credentials removed for #{username}"
|
data/bin/crab-project
CHANGED
@@ -7,7 +7,7 @@ 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
|
-
Usage: crab project [name]
|
10
|
+
Usage: crab project [name] [options*]
|
11
11
|
BANNER
|
12
12
|
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
13
13
|
end
|
@@ -5,14 +5,14 @@ cmd = ARGV.shift # get the subcommand
|
|
5
5
|
|
6
6
|
case cmd
|
7
7
|
when "-h", "--help", NilClass
|
8
|
-
system "crab-
|
8
|
+
system "crab-release-help"
|
9
9
|
exit 0
|
10
10
|
end
|
11
11
|
|
12
|
-
unless system("crab-
|
12
|
+
unless system("crab-release-#{cmd}", *ARGV)
|
13
13
|
if $?.exitstatus == 127 # bash 'command not found'
|
14
|
-
$stderr.puts "Unknown subcommand \"
|
15
|
-
system "crab-
|
14
|
+
$stderr.puts "Unknown subcommand \"release #{cmd}\""
|
15
|
+
system "crab-release-help"
|
16
16
|
exit 127
|
17
17
|
end
|
18
18
|
end
|
data/bin/crab-story
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# vim: set ft=ruby:
|
3
|
+
|
4
|
+
cmd = ARGV.shift # get the subcommand
|
5
|
+
|
6
|
+
case cmd
|
7
|
+
when "-h", "--help", NilClass
|
8
|
+
system "crab-story-help"
|
9
|
+
exit 0
|
10
|
+
end
|
11
|
+
|
12
|
+
unless system("crab-story-#{cmd}", *ARGV)
|
13
|
+
if $?.exitstatus == 127 # bash 'command not found'
|
14
|
+
$stderr.puts "Unknown subcommand \"story #{cmd}\""
|
15
|
+
system "crab-story-help"
|
16
|
+
exit 127
|
17
|
+
end
|
18
|
+
end
|
@@ -3,9 +3,9 @@ require 'crab'
|
|
3
3
|
|
4
4
|
opts = Trollop::options do
|
5
5
|
banner <<-BANNER
|
6
|
-
crab create: create a new story in Rally
|
6
|
+
crab story create: create a new story in Rally
|
7
7
|
|
8
|
-
Usage: crab create name [options]
|
8
|
+
Usage: crab story create <name> [options*]
|
9
9
|
BANNER
|
10
10
|
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
11
11
|
end
|
@@ -5,9 +5,9 @@ include Crab::Utilities
|
|
5
5
|
|
6
6
|
cmd_opts = Trollop::options do
|
7
7
|
banner <<-BANNER
|
8
|
-
crab update: update a story in Rally
|
8
|
+
crab story update: update a story in Rally
|
9
9
|
|
10
|
-
Usage: crab update
|
10
|
+
Usage: crab story update <id> [options*]
|
11
11
|
BANNER
|
12
12
|
opt :name, "Name (title)", :type => String, :short => "-n"
|
13
13
|
opt :state, "State (one of: #{Crab::Story::VALID_STATES.join(" ")})", :type => String, :short => "-t"
|
@@ -40,12 +40,12 @@ Crab::Rally.new(opts[:dry]) do |rally|
|
|
40
40
|
story = rally.find_story_with_id ARGV.first
|
41
41
|
|
42
42
|
if cmd_opts[:iteration_given]
|
43
|
-
opts[:iteration] = rally.find_iteration_by_name cmd_opts[:iteration]
|
43
|
+
opts[:iteration] = rally.find_iteration_by_name cmd_opts[:iteration], story.project
|
44
44
|
Trollop::die "Unknown iteration \"#{cmd_opts[:iteration]}\"" if opts[:iteration].nil?
|
45
45
|
end
|
46
46
|
|
47
47
|
if cmd_opts[:release_given]
|
48
|
-
opts[:release] = rally.find_release_by_name cmd_opts[:release]
|
48
|
+
opts[:release] = rally.find_release_by_name cmd_opts[:release], story.project
|
49
49
|
Trollop::die "Unknown release \"#{cmd_opts[:release]}\"" if opts[:release].nil?
|
50
50
|
end
|
51
51
|
|
@@ -3,9 +3,9 @@ require 'crab'
|
|
3
3
|
|
4
4
|
opts = Trollop::options do
|
5
5
|
banner <<-BANNER
|
6
|
-
crab create: create a new story in Rally
|
6
|
+
crab story create: create a new story in Rally
|
7
7
|
|
8
|
-
Usage: crab create name [options]
|
8
|
+
Usage: crab story create <name> [options*]
|
9
9
|
BANNER
|
10
10
|
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
11
11
|
end
|
@@ -3,15 +3,15 @@ require 'crab'
|
|
3
3
|
|
4
4
|
opts = Trollop::options do
|
5
5
|
banner <<-BANNER
|
6
|
-
crab delete: delete an existing story in Rally
|
6
|
+
crab story delete: delete an existing story in Rally
|
7
7
|
|
8
|
-
Usage: crab delete
|
8
|
+
Usage: crab story delete <id> [options*]
|
9
9
|
BANNER
|
10
10
|
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
11
11
|
end
|
12
12
|
|
13
13
|
id = ARGV.join(" ")
|
14
|
-
Trollop::die "Story ID must be specified" if
|
14
|
+
Trollop::die "Story ID must be specified" if id.blank?
|
15
15
|
|
16
16
|
Crab::Rally.new(opts[:dry]) do |rally|
|
17
17
|
story = rally.find_story_with_id id
|
@@ -3,15 +3,15 @@ require 'crab'
|
|
3
3
|
|
4
4
|
opts = Trollop::options do
|
5
5
|
banner <<-BANNER
|
6
|
-
crab delete: delete an existing story in Rally
|
6
|
+
crab story delete: delete an existing story in Rally
|
7
7
|
|
8
|
-
Usage: crab delete
|
8
|
+
Usage: crab story delete <id> [options*]
|
9
9
|
BANNER
|
10
10
|
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
11
11
|
end
|
12
12
|
|
13
13
|
id = ARGV.join(" ")
|
14
|
-
Trollop::die "Story ID must be specified" if
|
14
|
+
Trollop::die "Story ID must be specified" if id.blank?
|
15
15
|
|
16
16
|
Crab::Rally.new(opts[:dry]) do |rally|
|
17
17
|
story = rally.find_story_with_id id
|
@@ -5,9 +5,9 @@ include Crab::Utilities
|
|
5
5
|
|
6
6
|
opts = Trollop::options do
|
7
7
|
banner <<-BANNER
|
8
|
-
crab find: find a story in Rally
|
8
|
+
crab story find: find a story in Rally
|
9
9
|
|
10
|
-
Usage: crab find [options] [text]
|
10
|
+
Usage: crab story find [options*] [text]
|
11
11
|
BANNER
|
12
12
|
opt :project, "Project to use (required unless set by 'crab project')", :short => "-p", :type => String
|
13
13
|
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
data/bin/crab-story-help
ADDED
@@ -5,9 +5,9 @@ include Crab::Utilities
|
|
5
5
|
|
6
6
|
opts = Trollop::options do
|
7
7
|
banner <<-BANNER
|
8
|
-
crab find: find a story in Rally
|
8
|
+
crab story find: find a story in Rally
|
9
9
|
|
10
|
-
Usage: crab find [options] [text]
|
10
|
+
Usage: crab story find [options*] [text]
|
11
11
|
BANNER
|
12
12
|
opt :project, "Project to use (required unless set by 'crab project')", :short => "-p", :type => String
|
13
13
|
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
@@ -5,9 +5,9 @@ include Crab::Utilities
|
|
5
5
|
|
6
6
|
opts = Trollop::options do
|
7
7
|
banner <<-BANNER
|
8
|
-
crab find: find a story in Rally
|
8
|
+
crab story find: find a story in Rally
|
9
9
|
|
10
|
-
Usage: crab find [options] [text]
|
10
|
+
Usage: crab story find [options*] [text]
|
11
11
|
BANNER
|
12
12
|
opt :project, "Project to use (required unless set by 'crab project')", :short => "-p", :type => String
|
13
13
|
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
@@ -5,9 +5,9 @@ include Crab::Utilities
|
|
5
5
|
|
6
6
|
opts = Trollop::options do
|
7
7
|
banner <<-BANNER
|
8
|
-
crab move: move a story from one status to the next (or previous)
|
8
|
+
crab story move: move a story from one status to the next (or previous)
|
9
9
|
|
10
|
-
Usage: crab move
|
10
|
+
Usage: crab story move <id> [options*]
|
11
11
|
BANNER
|
12
12
|
opt :back, "Move story backwards (from accepted to completed, for example)"
|
13
13
|
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
@@ -5,9 +5,9 @@ include Crab::Utilities
|
|
5
5
|
|
6
6
|
opts = Trollop::options do
|
7
7
|
banner <<-BANNER
|
8
|
-
crab move: move a story from one status to the next (or previous)
|
8
|
+
crab story move: move a story from one status to the next (or previous)
|
9
9
|
|
10
|
-
Usage: crab move
|
10
|
+
Usage: crab story move <id> [options*]
|
11
11
|
BANNER
|
12
12
|
opt :back, "Move story backwards (from accepted to completed, for example)"
|
13
13
|
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
@@ -3,9 +3,9 @@ require 'crab'
|
|
3
3
|
|
4
4
|
opts = Trollop::options do
|
5
5
|
banner <<-BANNER
|
6
|
-
crab create: create a new story in Rally
|
6
|
+
crab story create: create a new story in Rally
|
7
7
|
|
8
|
-
Usage: crab create name [options]
|
8
|
+
Usage: crab story create <name> [options*]
|
9
9
|
BANNER
|
10
10
|
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
11
11
|
end
|
@@ -3,9 +3,9 @@ require 'crab'
|
|
3
3
|
|
4
4
|
opts = Trollop::options do
|
5
5
|
banner <<-BANNER
|
6
|
-
crab pull: pulls stories from Rally and writes them out as Cucumber features
|
6
|
+
crab story pull: pulls stories from Rally and writes them out as Cucumber features
|
7
7
|
|
8
|
-
Usage: crab pull [
|
8
|
+
Usage: crab story pull <id> [id*] [options*]
|
9
9
|
BANNER
|
10
10
|
opt :language, "Language to generate Cucumber features in (ISO code)", :default => "en", :short => "-l"
|
11
11
|
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
@@ -5,9 +5,9 @@ include Crab::Utilities
|
|
5
5
|
|
6
6
|
opts = Trollop::options do
|
7
7
|
banner <<-BANNER
|
8
|
-
crab rename: rename a story
|
8
|
+
crab story rename: rename a story
|
9
9
|
|
10
|
-
Usage: crab rename <
|
10
|
+
Usage: crab story rename <id> <name> [options*]
|
11
11
|
BANNER
|
12
12
|
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
13
13
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# vim: set ft=ruby :
|
2
|
+
require 'crab'
|
3
|
+
|
4
|
+
include Crab::Utilities
|
5
|
+
|
6
|
+
opts = Trollop::options do
|
7
|
+
banner <<-BANNER
|
8
|
+
crab story rename: rename a story
|
9
|
+
|
10
|
+
Usage: crab story rename <id> <name> [options*]
|
11
|
+
BANNER
|
12
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
13
|
+
end
|
14
|
+
|
15
|
+
id = ARGV.shift
|
16
|
+
Trollop::die "No story given" if id.empty?
|
17
|
+
|
18
|
+
name = ARGV.join(" ").squish
|
19
|
+
Trollop::die "No name given" if name.empty?
|
20
|
+
|
21
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
22
|
+
story = rally.find_story_with_id id
|
23
|
+
|
24
|
+
story.update :name => name
|
25
|
+
|
26
|
+
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
27
|
+
end
|