crab 0.2.4 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/bin/crab-it +18 -0
  2. data/bin/crab-it-help +12 -0
  3. data/bin/crab-it-list +28 -0
  4. data/bin/crab-iteration-help +1 -0
  5. data/bin/crab-rel +18 -0
  6. data/bin/crab-rel-help +12 -0
  7. data/bin/crab-rel-list +28 -0
  8. data/bin/crab-st +18 -0
  9. data/bin/crab-st-add +19 -0
  10. data/bin/crab-st-change +62 -0
  11. data/bin/crab-st-create +19 -0
  12. data/bin/crab-st-del +21 -0
  13. data/bin/crab-st-delete +21 -0
  14. data/bin/crab-st-find +34 -0
  15. data/bin/crab-st-help +19 -0
  16. data/bin/crab-st-list +34 -0
  17. data/bin/crab-st-ls +34 -0
  18. data/bin/crab-st-move +26 -0
  19. data/bin/crab-st-mv +26 -0
  20. data/bin/crab-st-new +19 -0
  21. data/bin/crab-st-pull +37 -0
  22. data/bin/crab-st-ren +27 -0
  23. data/bin/crab-st-rename +27 -0
  24. data/bin/crab-st-rm +21 -0
  25. data/bin/crab-st-show +19 -0
  26. data/bin/crab-st-up +62 -0
  27. data/bin/crab-st-update +62 -0
  28. data/bin/crab-story-change +1 -1
  29. data/bin/crab-story-help +9 -1
  30. data/bin/crab-story-up +1 -1
  31. data/bin/crab-story-update +1 -1
  32. data/bin/crab-tc +18 -0
  33. data/bin/crab-tc-add +29 -0
  34. data/bin/crab-tc-change +18 -0
  35. data/bin/crab-tc-create +29 -0
  36. data/bin/crab-tc-del +18 -0
  37. data/bin/crab-tc-delete +18 -0
  38. data/bin/crab-tc-find +34 -0
  39. data/bin/crab-tc-help +16 -0
  40. data/bin/crab-tc-list +34 -0
  41. data/bin/crab-tc-ls +34 -0
  42. data/bin/crab-tc-new +29 -0
  43. data/bin/crab-tc-rm +18 -0
  44. data/bin/crab-tc-show +24 -0
  45. data/bin/crab-tc-up +18 -0
  46. data/bin/crab-tc-update +18 -0
  47. data/bin/crab-testcase-find +1 -5
  48. data/bin/crab-testcase-list +21 -12
  49. data/bin/crab-testcase-ls +1 -5
  50. data/lib/crab/rally.rb +14 -14
  51. data/lib/crab/version.rb +1 -1
  52. metadata +85 -3
data/bin/crab-st-mv ADDED
@@ -0,0 +1,26 @@
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 move: move a story from one status to the next (or previous)
9
+
10
+ Usage: crab story move <id> [options*]
11
+ BANNER
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
14
+ end
15
+
16
+ id = ARGV.join(" ")
17
+ Trollop::die "No story given" if id.empty?
18
+
19
+ Crab::Rally.new(opts[:dry]) do |rally|
20
+ story = rally.find_story_with_id id
21
+ state = state_from(story.state)
22
+
23
+ story.update :schedule_state => (opts[:back] ? state_before(state) : state_after(state))
24
+
25
+ puts "#{story.formatted_id}: #{story.name} (#{story.state})"
26
+ end
data/bin/crab-st-new ADDED
@@ -0,0 +1,19 @@
1
+ # vim: set ft=ruby :
2
+ require 'crab'
3
+
4
+ opts = Trollop::options do
5
+ banner <<-BANNER
6
+ crab story create: create a new story in Rally
7
+
8
+ Usage: crab story create <name> [options*]
9
+ BANNER
10
+ opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
11
+ end
12
+
13
+ name = ARGV.join(" ")
14
+ Trollop::die "Please specify a name for the story" if name.blank?
15
+
16
+ Crab::Rally.new(opts[:dry]) do |rally|
17
+ story = rally.create_story :name => name
18
+ puts "#{story.formatted_id}: #{story.name} (#{story.state})"
19
+ end
data/bin/crab-st-pull ADDED
@@ -0,0 +1,37 @@
1
+ # vim: set ft=ruby :
2
+ require 'crab'
3
+
4
+ opts = Trollop::options do
5
+ banner <<-BANNER
6
+ crab story pull: pulls stories from Rally and writes them out as Cucumber features
7
+
8
+ Usage: crab story pull <id> [id*] [options*]
9
+ BANNER
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
12
+ end
13
+
14
+ Crab::Rally.new(opts[:dry]) do |rally|
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_opts = opts[:dry] ? { :noop => true, :verbose => true } : {}
23
+
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
35
+ end
36
+ end
37
+ end
data/bin/crab-st-ren ADDED
@@ -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
@@ -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
data/bin/crab-st-rm ADDED
@@ -0,0 +1,21 @@
1
+ # vim: set ft=ruby :
2
+ require 'crab'
3
+
4
+ opts = Trollop::options do
5
+ banner <<-BANNER
6
+ crab story delete: delete an existing story in Rally
7
+
8
+ Usage: crab story delete <id> [options*]
9
+ BANNER
10
+ opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
11
+ end
12
+
13
+ id = ARGV.join(" ")
14
+ Trollop::die "Story ID must be specified" if id.blank?
15
+
16
+ Crab::Rally.new(opts[:dry]) do |rally|
17
+ story = rally.find_story_with_id id
18
+ story.delete
19
+
20
+ puts "Story #{id} deleted."
21
+ end
data/bin/crab-st-show ADDED
@@ -0,0 +1,19 @@
1
+ # vim: set ft=ruby :
2
+ require 'crab'
3
+
4
+ opts = Trollop::options do
5
+ banner <<-BANNER
6
+ crab story show: displays a story in Rally as a Cucumber feature
7
+
8
+ Usage: crab story show <id> [options*]"
9
+ BANNER
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
12
+ end
13
+
14
+ id = ARGV.first
15
+ Crab::Rally.new(opts[:dry]) do |rally|
16
+ story = rally.find_story_with_id(id)
17
+
18
+ puts Crab::CucumberFeature.new(opts[:language]).generate_from story
19
+ end
data/bin/crab-st-up ADDED
@@ -0,0 +1,62 @@
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 story update: update a story in Rally
9
+
10
+ Usage: crab story update <id> [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
+ opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
21
+ end
22
+
23
+ Trollop::die "No story given" if ARGV.empty?
24
+ Trollop::die "Nothing to update. Please provide some options" unless cmd_opts.any? {|k, v| k.to_s =~ /_given$/ }
25
+
26
+ opts = {}
27
+ opts[:name] = cmd_opts[:name] if cmd_opts[:name_given]
28
+ opts[:schedule_state] = state_from(cmd_opts[:state]) if cmd_opts[:state_given]
29
+
30
+ if cmd_opts[:estimate_given]
31
+ opts[:plan_estimate] = cmd_opts[:estimate] # nobody is going to remember "Plan Estimate", really
32
+ end
33
+
34
+ opts[:blocked] = cmd_opts[:blocked] if cmd_opts[:blocked_given]
35
+ opts[:blocked] = !cmd_opts[:unblocked] if cmd_opts[:unblocked_given]
36
+
37
+ Crab::Rally.new(opts[:dry]) do |rally|
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], story.rally_object.project
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], story.rally_object.project
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})"
62
+ end
@@ -0,0 +1,62 @@
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 story update: update a story in Rally
9
+
10
+ Usage: crab story update <id> [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
+ opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
21
+ end
22
+
23
+ Trollop::die "No story given" if ARGV.empty?
24
+ Trollop::die "Nothing to update. Please provide some options" unless cmd_opts.any? {|k, v| k.to_s =~ /_given$/ }
25
+
26
+ opts = {}
27
+ opts[:name] = cmd_opts[:name] if cmd_opts[:name_given]
28
+ opts[:schedule_state] = state_from(cmd_opts[:state]) if cmd_opts[:state_given]
29
+
30
+ if cmd_opts[:estimate_given]
31
+ opts[:plan_estimate] = cmd_opts[:estimate] # nobody is going to remember "Plan Estimate", really
32
+ end
33
+
34
+ opts[:blocked] = cmd_opts[:blocked] if cmd_opts[:blocked_given]
35
+ opts[:blocked] = !cmd_opts[:unblocked] if cmd_opts[:unblocked_given]
36
+
37
+ Crab::Rally.new(opts[:dry]) do |rally|
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], story.rally_object.project
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], story.rally_object.project
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})"
62
+ end
@@ -45,7 +45,7 @@ Crab::Rally.new(opts[:dry]) do |rally|
45
45
  end
46
46
 
47
47
  if cmd_opts[:release_given]
48
- opts[:release] = rally.find_release_by_name cmd_opts[:release], story.project
48
+ opts[:release] = rally.find_release_by_name cmd_opts[:release], story.rally_object.project
49
49
  Trollop::die "Unknown release \"#{cmd_opts[:release]}\"" if opts[:release].nil?
50
50
  end
51
51
 
data/bin/crab-story-help CHANGED
@@ -5,7 +5,15 @@ Usage: crab story <command> [options*]
5
5
 
6
6
  Available commands:
7
7
 
8
- help Show this help text
8
+ create Create stories
9
+ delete Delete stories
10
+ find Find stories
11
+ help This help message
12
+ move Move story status (from completed to accepted, etc)
13
+ pull Pull stories as Cucumber features
14
+ rename Rename stories
15
+ show Show stories as Cucumber features
16
+ update Update stories
9
17
 
10
18
  --help, -h: Show this message
11
19
  HELP
data/bin/crab-story-up CHANGED
@@ -45,7 +45,7 @@ Crab::Rally.new(opts[:dry]) do |rally|
45
45
  end
46
46
 
47
47
  if cmd_opts[:release_given]
48
- opts[:release] = rally.find_release_by_name cmd_opts[:release], story.project
48
+ opts[:release] = rally.find_release_by_name cmd_opts[:release], story.rally_object.project
49
49
  Trollop::die "Unknown release \"#{cmd_opts[:release]}\"" if opts[:release].nil?
50
50
  end
51
51
 
@@ -45,7 +45,7 @@ Crab::Rally.new(opts[:dry]) do |rally|
45
45
  end
46
46
 
47
47
  if cmd_opts[:release_given]
48
- opts[:release] = rally.find_release_by_name cmd_opts[:release], story.project
48
+ opts[:release] = rally.find_release_by_name cmd_opts[:release], story.rally_object.project
49
49
  Trollop::die "Unknown release \"#{cmd_opts[:release]}\"" if opts[:release].nil?
50
50
  end
51
51
 
data/bin/crab-tc 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-testcase-help"
9
+ exit 0
10
+ end
11
+
12
+ unless system("crab-testcase-#{cmd}", *ARGV)
13
+ if $?.exitstatus == 127 # bash 'command not found'
14
+ $stderr.puts "Unknown subcommand \"testcase #{cmd}\""
15
+ system "crab-testcase-help"
16
+ exit 127
17
+ end
18
+ end
data/bin/crab-tc-add ADDED
@@ -0,0 +1,29 @@
1
+ # vim: set ft=ruby :
2
+ require 'crab'
3
+
4
+ include Crab::Utilities
5
+
6
+ opts = add_or_update_options <<-BANNER
7
+ crab testcase create: add a test case to a story in Rally
8
+
9
+ Usage: crab testcase create <story> <name> [options*]
10
+ BANNER
11
+
12
+ story_id = ARGV.shift
13
+ unless story_id
14
+ $stderr.puts "Error: Story ID not provided."
15
+ system "crab-testcase-help"
16
+ exit 1
17
+ end
18
+
19
+ name = ARGV.join(" ")
20
+ unless name
21
+ $stderr.puts "Error: Test case name not provided."
22
+ system "crab-testcase-help"
23
+ exit 1
24
+ end
25
+
26
+ Crab::Rally.new(opts[:dry]) do |rally|
27
+ tc = rally.create_test_case(story_id, name, sanitize_options(opts))
28
+ puts "#{tc.story.formatted_id}/#{tc.formatted_id}: #{tc.name} (#{tc.tags.join(" ")})"
29
+ end
@@ -0,0 +1,18 @@
1
+ # vim: set ft=ruby :
2
+ require 'crab'
3
+
4
+ include Crab::Utilities
5
+
6
+ opts = add_or_update_options <<-BANNER
7
+ crab testcase update: update a test case in Rally
8
+
9
+ Usage: crab testcase update <id> [options*]
10
+ BANNER
11
+
12
+ tc_id = ARGV.shift
13
+
14
+ Crab::Rally.new(opts[:dry]) do |rally|
15
+ tc = rally.find_test_case(tc_id)
16
+ tc.update(sanitize_options(opts))
17
+ puts "#{tc.story.formatted_id}/#{tc.formatted_id}: #{tc.name} (#{tc.tags.join(" ")})"
18
+ end
@@ -0,0 +1,29 @@
1
+ # vim: set ft=ruby :
2
+ require 'crab'
3
+
4
+ include Crab::Utilities
5
+
6
+ opts = add_or_update_options <<-BANNER
7
+ crab testcase create: add a test case to a story in Rally
8
+
9
+ Usage: crab testcase create <story> <name> [options*]
10
+ BANNER
11
+
12
+ story_id = ARGV.shift
13
+ unless story_id
14
+ $stderr.puts "Error: Story ID not provided."
15
+ system "crab-testcase-help"
16
+ exit 1
17
+ end
18
+
19
+ name = ARGV.join(" ")
20
+ unless name
21
+ $stderr.puts "Error: Test case name not provided."
22
+ system "crab-testcase-help"
23
+ exit 1
24
+ end
25
+
26
+ Crab::Rally.new(opts[:dry]) do |rally|
27
+ tc = rally.create_test_case(story_id, name, sanitize_options(opts))
28
+ puts "#{tc.story.formatted_id}/#{tc.formatted_id}: #{tc.name} (#{tc.tags.join(" ")})"
29
+ end