crab 0.2.7 → 0.2.8

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.
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