crab 0.2.7 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. data/README.md +0 -1
  2. data/bin/crab +27 -14
  3. data/bin/crab-help +10 -2
  4. data/bin/crab-it +25 -11
  5. data/bin/crab-it-help +11 -2
  6. data/bin/crab-it-list +25 -15
  7. data/bin/crab-iteration +25 -11
  8. data/bin/crab-iteration-help +11 -2
  9. data/bin/crab-iteration-list +25 -15
  10. data/bin/crab-login +24 -13
  11. data/bin/crab-logout +22 -9
  12. data/bin/crab-project +42 -32
  13. data/bin/crab-rel +25 -11
  14. data/bin/crab-rel-help +12 -3
  15. data/bin/crab-rel-list +23 -15
  16. data/bin/crab-release +25 -11
  17. data/bin/crab-release-help +12 -3
  18. data/bin/crab-release-list +23 -15
  19. data/bin/crab-st +24 -11
  20. data/bin/crab-st-add +18 -10
  21. data/bin/crab-st-change +53 -39
  22. data/bin/crab-st-create +18 -10
  23. data/bin/crab-st-del +19 -11
  24. data/bin/crab-st-delete +19 -11
  25. data/bin/crab-st-find +32 -21
  26. data/bin/crab-st-help +11 -2
  27. data/bin/crab-st-list +32 -21
  28. data/bin/crab-st-ls +32 -21
  29. data/bin/crab-st-move +26 -14
  30. data/bin/crab-st-mv +26 -14
  31. data/bin/crab-st-new +18 -10
  32. data/bin/crab-st-pull +28 -20
  33. data/bin/crab-st-ren +26 -14
  34. data/bin/crab-st-rename +26 -14
  35. data/bin/crab-st-rm +19 -11
  36. data/bin/crab-st-show +19 -11
  37. data/bin/crab-st-up +53 -39
  38. data/bin/crab-st-update +53 -39
  39. data/bin/crab-story +24 -11
  40. data/bin/crab-story-add +18 -10
  41. data/bin/crab-story-change +53 -39
  42. data/bin/crab-story-create +18 -10
  43. data/bin/crab-story-del +19 -11
  44. data/bin/crab-story-delete +19 -11
  45. data/bin/crab-story-diff +54 -0
  46. data/bin/crab-story-find +32 -21
  47. data/bin/crab-story-help +11 -2
  48. data/bin/crab-story-list +32 -21
  49. data/bin/crab-story-ls +32 -21
  50. data/bin/crab-story-move +26 -14
  51. data/bin/crab-story-mv +26 -14
  52. data/bin/crab-story-new +18 -10
  53. data/bin/crab-story-pull +28 -20
  54. data/bin/crab-story-ren +26 -14
  55. data/bin/crab-story-rename +26 -14
  56. data/bin/crab-story-rm +19 -11
  57. data/bin/crab-story-show +19 -11
  58. data/bin/crab-story-up +53 -39
  59. data/bin/crab-story-update +53 -39
  60. data/bin/crab-tc +24 -11
  61. data/bin/crab-tc-add +32 -20
  62. data/bin/crab-tc-change +18 -8
  63. data/bin/crab-tc-create +32 -20
  64. data/bin/crab-tc-del +18 -10
  65. data/bin/crab-tc-delete +18 -10
  66. data/bin/crab-tc-find +32 -21
  67. data/bin/crab-tc-help +11 -2
  68. data/bin/crab-tc-list +32 -21
  69. data/bin/crab-tc-ls +32 -21
  70. data/bin/crab-tc-new +32 -20
  71. data/bin/crab-tc-rm +18 -10
  72. data/bin/crab-tc-show +28 -15
  73. data/bin/crab-tc-up +18 -8
  74. data/bin/crab-tc-update +18 -8
  75. data/bin/crab-testcase +24 -11
  76. data/bin/crab-testcase-add +32 -20
  77. data/bin/crab-testcase-change +18 -8
  78. data/bin/crab-testcase-create +32 -20
  79. data/bin/crab-testcase-del +18 -10
  80. data/bin/crab-testcase-delete +18 -10
  81. data/bin/crab-testcase-find +32 -21
  82. data/bin/crab-testcase-help +11 -2
  83. data/bin/crab-testcase-list +32 -21
  84. data/bin/crab-testcase-ls +32 -21
  85. data/bin/crab-testcase-new +32 -20
  86. data/bin/crab-testcase-rm +18 -10
  87. data/bin/crab-testcase-show +28 -15
  88. data/bin/crab-testcase-up +18 -8
  89. data/bin/crab-testcase-update +18 -8
  90. data/bin/crab-truncate +1 -0
  91. data/bin/crab-version +2 -1
  92. data/features/subcommand-help.feature +1 -0
  93. data/lib/crab.rb +2 -0
  94. data/lib/crab/cucumber_to_rally_adapter.rb +48 -0
  95. data/lib/crab/rally.rb +21 -1
  96. data/lib/crab/utilities.rb +10 -2
  97. data/lib/crab/version.rb +1 -1
  98. metadata +7 -4
@@ -1,34 +1,45 @@
1
+ #!/usr/bin/env ruby
1
2
  # vim: set ft=ruby :
2
3
  require 'crab'
3
4
 
4
- include Crab::Utilities
5
+ class Crab::StoryFind
5
6
 
6
- opts = Trollop::options do
7
- banner <<-BANNER
7
+ class << self
8
+
9
+ include Crab::Utilities
10
+
11
+ def run(args=ARGV)
12
+ opts = Trollop::options(args) do
13
+ banner <<-BANNER
8
14
  crab story find: find a story in Rally
9
15
 
10
16
  Usage: crab story find [options*] [text]
11
- BANNER
12
- opt :project, "Project to use (required unless set by 'crab project')", :short => "-p", :type => String
13
- opt :iteration, "Limit search to this iteration", :short => "-i", :type => String
14
- opt :release, "Limit search to this release", :short => "-r", :type => String
15
- opt :parent, "Limit search to children of this story", :short => "-P", :type => String
16
- opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
17
- end
17
+ BANNER
18
+ opt :project, "Project to use (required unless set by 'crab project')", :short => "-p", :type => String
19
+ opt :iteration, "Limit search to this iteration", :short => "-i", :type => String
20
+ opt :release, "Limit search to this release", :short => "-r", :type => String
21
+ opt :parent, "Limit search to children of this story", :short => "-P", :type => String
22
+ opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
23
+ end
18
24
 
19
- pattern = ARGV.map(&:strip).reject(&:empty?)
20
- project_name = valid_project_name(opts)
25
+ pattern = args.map(&:strip).reject(&:empty?)
26
+ project_name = valid_project_name(opts)
21
27
 
22
- Crab::Rally.new(opts[:dry]) do |rally|
23
- project = rally.find_project(project_name)
24
- Trollop::die "Project #{opts[:project].inspect} not found" if project.nil?
28
+ Crab::Rally.new(opts[:dry]) do |rally|
29
+ project = rally.find_project(project_name)
30
+ Trollop::die "Project #{opts[:project].inspect} not found" if project.nil?
25
31
 
26
- find_opts = {}
27
- find_opts[:iteration] = rally.find_iteration_by_name opts[:iteration], project if opts[:iteration_given]
28
- find_opts[:release] = rally.find_release_by_name opts[:release], project if opts[:release_given]
29
- find_opts[:parent] = rally.find_story_with_id opts[:parent] if opts[:parent_given]
32
+ find_opts = {}
33
+ find_opts[:iteration] = rally.find_iteration_by_name opts[:iteration], project if opts[:iteration_given]
34
+ find_opts[:release] = rally.find_release_by_name opts[:release], project if opts[:release_given]
35
+ find_opts[:parent] = rally.find_story_with_id opts[:parent] if opts[:parent_given]
30
36
 
31
- rally.find_stories(project, pattern, find_opts).each do |story|
32
- puts "#{story.formatted_id}: #{story.name} (#{story.state})"
37
+ rally.find_stories(project, pattern, find_opts).each do |story|
38
+ puts "#{story.formatted_id}: #{story.name} (#{story.state})"
39
+ end
40
+ end
41
+ end
33
42
  end
34
43
  end
44
+
45
+ Crab::StoryFind.run
@@ -1,34 +1,45 @@
1
+ #!/usr/bin/env ruby
1
2
  # vim: set ft=ruby :
2
3
  require 'crab'
3
4
 
4
- include Crab::Utilities
5
+ class Crab::StoryFind
5
6
 
6
- opts = Trollop::options do
7
- banner <<-BANNER
7
+ class << self
8
+
9
+ include Crab::Utilities
10
+
11
+ def run(args=ARGV)
12
+ opts = Trollop::options(args) do
13
+ banner <<-BANNER
8
14
  crab story find: find a story in Rally
9
15
 
10
16
  Usage: crab story find [options*] [text]
11
- BANNER
12
- opt :project, "Project to use (required unless set by 'crab project')", :short => "-p", :type => String
13
- opt :iteration, "Limit search to this iteration", :short => "-i", :type => String
14
- opt :release, "Limit search to this release", :short => "-r", :type => String
15
- opt :parent, "Limit search to children of this story", :short => "-P", :type => String
16
- opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
17
- end
17
+ BANNER
18
+ opt :project, "Project to use (required unless set by 'crab project')", :short => "-p", :type => String
19
+ opt :iteration, "Limit search to this iteration", :short => "-i", :type => String
20
+ opt :release, "Limit search to this release", :short => "-r", :type => String
21
+ opt :parent, "Limit search to children of this story", :short => "-P", :type => String
22
+ opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
23
+ end
18
24
 
19
- pattern = ARGV.map(&:strip).reject(&:empty?)
20
- project_name = valid_project_name(opts)
25
+ pattern = args.map(&:strip).reject(&:empty?)
26
+ project_name = valid_project_name(opts)
21
27
 
22
- Crab::Rally.new(opts[:dry]) do |rally|
23
- project = rally.find_project(project_name)
24
- Trollop::die "Project #{opts[:project].inspect} not found" if project.nil?
28
+ Crab::Rally.new(opts[:dry]) do |rally|
29
+ project = rally.find_project(project_name)
30
+ Trollop::die "Project #{opts[:project].inspect} not found" if project.nil?
25
31
 
26
- find_opts = {}
27
- find_opts[:iteration] = rally.find_iteration_by_name opts[:iteration], project if opts[:iteration_given]
28
- find_opts[:release] = rally.find_release_by_name opts[:release], project if opts[:release_given]
29
- find_opts[:parent] = rally.find_story_with_id opts[:parent] if opts[:parent_given]
32
+ find_opts = {}
33
+ find_opts[:iteration] = rally.find_iteration_by_name opts[:iteration], project if opts[:iteration_given]
34
+ find_opts[:release] = rally.find_release_by_name opts[:release], project if opts[:release_given]
35
+ find_opts[:parent] = rally.find_story_with_id opts[:parent] if opts[:parent_given]
30
36
 
31
- rally.find_stories(project, pattern, find_opts).each do |story|
32
- puts "#{story.formatted_id}: #{story.name} (#{story.state})"
37
+ rally.find_stories(project, pattern, find_opts).each do |story|
38
+ puts "#{story.formatted_id}: #{story.name} (#{story.state})"
39
+ end
40
+ end
41
+ end
33
42
  end
34
43
  end
44
+
45
+ Crab::StoryFind.run
@@ -1,26 +1,38 @@
1
+ #!/usr/bin/env ruby
1
2
  # vim: set ft=ruby :
2
3
  require 'crab'
3
4
 
4
- include Crab::Utilities
5
+ class Crab::StoryMove
5
6
 
6
- opts = Trollop::options do
7
- banner <<-BANNER
7
+ class << self
8
+
9
+ include Crab::Utilities
10
+
11
+ def run(args=ARGV)
12
+
13
+ opts = Trollop::options(args) do
14
+ banner <<-BANNER
8
15
  crab story move: move a story from one status to the next (or previous)
9
16
 
10
17
  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
18
+ BANNER
19
+ opt :back, "Move story backwards (from accepted to completed, for example)"
20
+ opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
21
+ end
15
22
 
16
- id = ARGV.join(" ")
17
- Trollop::die "No story given" if id.empty?
23
+ id = args.join(" ")
24
+ Trollop::die "No story given" if id.empty?
18
25
 
19
- Crab::Rally.new(opts[:dry]) do |rally|
20
- story = rally.find_story_with_id id
21
- state = state_from(story.state)
26
+ Crab::Rally.new(opts[:dry]) do |rally|
27
+ story = rally.find_story_with_id id
28
+ state = state_from(story.state)
22
29
 
23
- story.update :schedule_state => (opts[:back] ? state_before(state) : state_after(state))
30
+ story.update :schedule_state => (opts[:back] ? state_before(state) : state_after(state))
24
31
 
25
- puts "#{story.formatted_id}: #{story.name} (#{story.state})"
32
+ puts "#{story.formatted_id}: #{story.name} (#{story.state})"
33
+ end
34
+ end
35
+ end
26
36
  end
37
+
38
+ Crab::StoryMove.run
@@ -1,26 +1,38 @@
1
+ #!/usr/bin/env ruby
1
2
  # vim: set ft=ruby :
2
3
  require 'crab'
3
4
 
4
- include Crab::Utilities
5
+ class Crab::StoryMove
5
6
 
6
- opts = Trollop::options do
7
- banner <<-BANNER
7
+ class << self
8
+
9
+ include Crab::Utilities
10
+
11
+ def run(args=ARGV)
12
+
13
+ opts = Trollop::options(args) do
14
+ banner <<-BANNER
8
15
  crab story move: move a story from one status to the next (or previous)
9
16
 
10
17
  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
18
+ BANNER
19
+ opt :back, "Move story backwards (from accepted to completed, for example)"
20
+ opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
21
+ end
15
22
 
16
- id = ARGV.join(" ")
17
- Trollop::die "No story given" if id.empty?
23
+ id = args.join(" ")
24
+ Trollop::die "No story given" if id.empty?
18
25
 
19
- Crab::Rally.new(opts[:dry]) do |rally|
20
- story = rally.find_story_with_id id
21
- state = state_from(story.state)
26
+ Crab::Rally.new(opts[:dry]) do |rally|
27
+ story = rally.find_story_with_id id
28
+ state = state_from(story.state)
22
29
 
23
- story.update :schedule_state => (opts[:back] ? state_before(state) : state_after(state))
30
+ story.update :schedule_state => (opts[:back] ? state_before(state) : state_after(state))
24
31
 
25
- puts "#{story.formatted_id}: #{story.name} (#{story.state})"
32
+ puts "#{story.formatted_id}: #{story.name} (#{story.state})"
33
+ end
34
+ end
35
+ end
26
36
  end
37
+
38
+ Crab::StoryMove.run
@@ -1,19 +1,27 @@
1
+ #!/usr/bin/env ruby
1
2
  # vim: set ft=ruby :
2
3
  require 'crab'
3
4
 
4
- opts = Trollop::options do
5
- banner <<-BANNER
5
+ class Crab::StoryCreate
6
+
7
+ def self.run(args=ARGV)
8
+ opts = Trollop::options(args) do
9
+ banner <<-BANNER
6
10
  crab story create: create a new story in Rally
7
11
 
8
12
  Usage: crab story create <name> [options*]
9
- BANNER
10
- opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
11
- end
13
+ BANNER
14
+ opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
15
+ end
12
16
 
13
- name = ARGV.join(" ")
14
- Trollop::die "Please specify a name for the story" if name.blank?
17
+ name = args.join(" ")
18
+ Trollop::die "Please specify a name for the story" if name.blank?
15
19
 
16
- Crab::Rally.new(opts[:dry]) do |rally|
17
- story = rally.create_story :name => name
18
- puts "#{story.formatted_id}: #{story.name} (#{story.state})"
20
+ Crab::Rally.new(opts[:dry]) do |rally|
21
+ story = rally.create_story :name => name
22
+ puts "#{story.formatted_id}: #{story.name} (#{story.state})"
23
+ end
24
+ end
19
25
  end
26
+
27
+ Crab::StoryCreate.run
@@ -1,37 +1,45 @@
1
+ #!/usr/bin/env ruby
1
2
  # vim: set ft=ruby :
2
3
  require 'crab'
3
4
 
4
- opts = Trollop::options do
5
- banner <<-BANNER
5
+ class Crab::StoryPull
6
+
7
+ def self.run(args=ARGV)
8
+ opts = Trollop::options(args) do
9
+ banner <<-BANNER
6
10
  crab story pull: pulls stories from Rally and writes them out as Cucumber features
7
11
 
8
12
  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
+ BANNER
14
+ opt :language, "Language to generate Cucumber features in (ISO code)", :default => "en", :short => "-l"
15
+ opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
16
+ end
13
17
 
14
- Crab::Rally.new(opts[:dry]) do |rally|
18
+ Crab::Rally.new(opts[:dry]) do |rally|
15
19
 
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?
20
+ args.each do |story_number|
21
+ story = rally.find_story_with_id story_number
22
+ Trollop::die "Could not find story with ID #{story_number}" if story.nil?
19
23
 
20
- puts "#{story.formatted_id}: #{story.full_file_name}"
24
+ puts "#{story.formatted_id}: #{story.full_file_name}"
21
25
 
22
- fileutils_opts = opts[:dry] ? { :noop => true, :verbose => true } : {}
26
+ fileutils_opts = opts[:dry] ? { :noop => true, :verbose => true } : {}
23
27
 
24
- FileUtils.mkdir_p File.dirname(story.full_file_name), fileutils_opts
25
- FileUtils.touch story.full_file_name, fileutils_opts
28
+ FileUtils.mkdir_p File.dirname(story.full_file_name), fileutils_opts
29
+ FileUtils.touch story.full_file_name, fileutils_opts
26
30
 
27
- output = Crab::CucumberFeature.new(opts[:language]).generate_from story
31
+ output = Crab::CucumberFeature.new(opts[:language]).generate_from(story, true)
28
32
 
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
33
+ if opts[:dry]
34
+ puts "Would write to #{story.full_file_name}:\n\n#{output}"
35
+ else
36
+ File.open(story.full_file_name, "w") do |file|
37
+ file.write output
38
+ end
39
+ end
34
40
  end
35
41
  end
36
42
  end
37
43
  end
44
+
45
+ Crab::StoryPull.run
@@ -1,27 +1,39 @@
1
+ #!/usr/bin/env ruby
1
2
  # vim: set ft=ruby :
2
3
  require 'crab'
3
4
 
4
- include Crab::Utilities
5
+ class Crab::StoryRename
5
6
 
6
- opts = Trollop::options do
7
- banner <<-BANNER
7
+ class << self
8
+
9
+ def run(args=ARGV)
10
+
11
+ include Crab::Utilities
12
+
13
+ opts = Trollop::options(args) do
14
+ banner <<-BANNER
8
15
  crab story rename: rename a story
9
16
 
10
17
  Usage: crab story rename <id> <name> [options*]
11
- BANNER
12
- opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
13
- end
18
+ BANNER
19
+ opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
20
+ end
14
21
 
15
- id = ARGV.shift
16
- Trollop::die "No story given" if id.empty?
22
+ id = args.shift
23
+ Trollop::die "No story given" if id.empty?
17
24
 
18
- name = ARGV.join(" ").squish
19
- Trollop::die "No name given" if name.empty?
25
+ name = args.join(" ").squish
26
+ Trollop::die "No name given" if name.empty?
20
27
 
21
- Crab::Rally.new(opts[:dry]) do |rally|
22
- story = rally.find_story_with_id id
28
+ Crab::Rally.new(opts[:dry]) do |rally|
29
+ story = rally.find_story_with_id id
23
30
 
24
- story.update :name => name
31
+ story.update :name => name
25
32
 
26
- puts "#{story.formatted_id}: #{story.name} (#{story.state})"
33
+ puts "#{story.formatted_id}: #{story.name} (#{story.state})"
34
+ end
35
+ end
36
+ end
27
37
  end
38
+
39
+ Crab::StoryRename.run
@@ -1,27 +1,39 @@
1
+ #!/usr/bin/env ruby
1
2
  # vim: set ft=ruby :
2
3
  require 'crab'
3
4
 
4
- include Crab::Utilities
5
+ class Crab::StoryRename
5
6
 
6
- opts = Trollop::options do
7
- banner <<-BANNER
7
+ class << self
8
+
9
+ def run(args=ARGV)
10
+
11
+ include Crab::Utilities
12
+
13
+ opts = Trollop::options(args) do
14
+ banner <<-BANNER
8
15
  crab story rename: rename a story
9
16
 
10
17
  Usage: crab story rename <id> <name> [options*]
11
- BANNER
12
- opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
13
- end
18
+ BANNER
19
+ opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
20
+ end
14
21
 
15
- id = ARGV.shift
16
- Trollop::die "No story given" if id.empty?
22
+ id = args.shift
23
+ Trollop::die "No story given" if id.empty?
17
24
 
18
- name = ARGV.join(" ").squish
19
- Trollop::die "No name given" if name.empty?
25
+ name = args.join(" ").squish
26
+ Trollop::die "No name given" if name.empty?
20
27
 
21
- Crab::Rally.new(opts[:dry]) do |rally|
22
- story = rally.find_story_with_id id
28
+ Crab::Rally.new(opts[:dry]) do |rally|
29
+ story = rally.find_story_with_id id
23
30
 
24
- story.update :name => name
31
+ story.update :name => name
25
32
 
26
- puts "#{story.formatted_id}: #{story.name} (#{story.state})"
33
+ puts "#{story.formatted_id}: #{story.name} (#{story.state})"
34
+ end
35
+ end
36
+ end
27
37
  end
38
+
39
+ Crab::StoryRename.run