crab 0.2.2 → 0.2.3
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 +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
|