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.
- data/README.md +0 -1
- data/bin/crab +27 -14
- data/bin/crab-help +10 -2
- data/bin/crab-it +25 -11
- data/bin/crab-it-help +11 -2
- data/bin/crab-it-list +25 -15
- data/bin/crab-iteration +25 -11
- data/bin/crab-iteration-help +11 -2
- data/bin/crab-iteration-list +25 -15
- data/bin/crab-login +24 -13
- data/bin/crab-logout +22 -9
- data/bin/crab-project +42 -32
- data/bin/crab-rel +25 -11
- data/bin/crab-rel-help +12 -3
- data/bin/crab-rel-list +23 -15
- data/bin/crab-release +25 -11
- data/bin/crab-release-help +12 -3
- data/bin/crab-release-list +23 -15
- data/bin/crab-st +24 -11
- data/bin/crab-st-add +18 -10
- data/bin/crab-st-change +53 -39
- data/bin/crab-st-create +18 -10
- data/bin/crab-st-del +19 -11
- data/bin/crab-st-delete +19 -11
- data/bin/crab-st-find +32 -21
- data/bin/crab-st-help +11 -2
- data/bin/crab-st-list +32 -21
- data/bin/crab-st-ls +32 -21
- data/bin/crab-st-move +26 -14
- data/bin/crab-st-mv +26 -14
- data/bin/crab-st-new +18 -10
- data/bin/crab-st-pull +28 -20
- data/bin/crab-st-ren +26 -14
- data/bin/crab-st-rename +26 -14
- data/bin/crab-st-rm +19 -11
- data/bin/crab-st-show +19 -11
- data/bin/crab-st-up +53 -39
- data/bin/crab-st-update +53 -39
- data/bin/crab-story +24 -11
- data/bin/crab-story-add +18 -10
- data/bin/crab-story-change +53 -39
- data/bin/crab-story-create +18 -10
- data/bin/crab-story-del +19 -11
- data/bin/crab-story-delete +19 -11
- data/bin/crab-story-diff +54 -0
- data/bin/crab-story-find +32 -21
- data/bin/crab-story-help +11 -2
- data/bin/crab-story-list +32 -21
- data/bin/crab-story-ls +32 -21
- data/bin/crab-story-move +26 -14
- data/bin/crab-story-mv +26 -14
- data/bin/crab-story-new +18 -10
- data/bin/crab-story-pull +28 -20
- data/bin/crab-story-ren +26 -14
- data/bin/crab-story-rename +26 -14
- data/bin/crab-story-rm +19 -11
- data/bin/crab-story-show +19 -11
- data/bin/crab-story-up +53 -39
- data/bin/crab-story-update +53 -39
- data/bin/crab-tc +24 -11
- data/bin/crab-tc-add +32 -20
- data/bin/crab-tc-change +18 -8
- data/bin/crab-tc-create +32 -20
- data/bin/crab-tc-del +18 -10
- data/bin/crab-tc-delete +18 -10
- data/bin/crab-tc-find +32 -21
- data/bin/crab-tc-help +11 -2
- data/bin/crab-tc-list +32 -21
- data/bin/crab-tc-ls +32 -21
- data/bin/crab-tc-new +32 -20
- data/bin/crab-tc-rm +18 -10
- data/bin/crab-tc-show +28 -15
- data/bin/crab-tc-up +18 -8
- data/bin/crab-tc-update +18 -8
- data/bin/crab-testcase +24 -11
- data/bin/crab-testcase-add +32 -20
- data/bin/crab-testcase-change +18 -8
- data/bin/crab-testcase-create +32 -20
- data/bin/crab-testcase-del +18 -10
- data/bin/crab-testcase-delete +18 -10
- data/bin/crab-testcase-find +32 -21
- data/bin/crab-testcase-help +11 -2
- data/bin/crab-testcase-list +32 -21
- data/bin/crab-testcase-ls +32 -21
- data/bin/crab-testcase-new +32 -20
- data/bin/crab-testcase-rm +18 -10
- data/bin/crab-testcase-show +28 -15
- data/bin/crab-testcase-up +18 -8
- data/bin/crab-testcase-update +18 -8
- data/bin/crab-truncate +1 -0
- data/bin/crab-version +2 -1
- data/features/subcommand-help.feature +1 -0
- data/lib/crab.rb +2 -0
- data/lib/crab/cucumber_to_rally_adapter.rb +48 -0
- data/lib/crab/rally.rb +21 -1
- data/lib/crab/utilities.rb +10 -2
- data/lib/crab/version.rb +1 -1
- metadata +7 -4
data/bin/crab-st-pull
CHANGED
@@ -1,37 +1,45 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
1
2
|
# vim: set ft=ruby :
|
2
3
|
require 'crab'
|
3
4
|
|
4
|
-
|
5
|
-
|
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
|
-
|
10
|
-
|
11
|
-
|
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
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
24
|
+
puts "#{story.formatted_id}: #{story.full_file_name}"
|
21
25
|
|
22
|
-
|
26
|
+
fileutils_opts = opts[:dry] ? { :noop => true, :verbose => true } : {}
|
23
27
|
|
24
|
-
|
25
|
-
|
28
|
+
FileUtils.mkdir_p File.dirname(story.full_file_name), fileutils_opts
|
29
|
+
FileUtils.touch story.full_file_name, fileutils_opts
|
26
30
|
|
27
|
-
|
31
|
+
output = Crab::CucumberFeature.new(opts[:language]).generate_from(story, true)
|
28
32
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
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
|
data/bin/crab-st-ren
CHANGED
@@ -1,27 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
1
2
|
# vim: set ft=ruby :
|
2
3
|
require 'crab'
|
3
4
|
|
4
|
-
|
5
|
+
class Crab::StoryRename
|
5
6
|
|
6
|
-
|
7
|
-
|
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
|
-
|
12
|
-
|
13
|
-
end
|
18
|
+
BANNER
|
19
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
20
|
+
end
|
14
21
|
|
15
|
-
id =
|
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 =
|
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
|
-
|
28
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
29
|
+
story = rally.find_story_with_id id
|
23
30
|
|
24
|
-
|
31
|
+
story.update :name => name
|
25
32
|
|
26
|
-
|
33
|
+
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
27
37
|
end
|
38
|
+
|
39
|
+
Crab::StoryRename.run
|
data/bin/crab-st-rename
CHANGED
@@ -1,27 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
1
2
|
# vim: set ft=ruby :
|
2
3
|
require 'crab'
|
3
4
|
|
4
|
-
|
5
|
+
class Crab::StoryRename
|
5
6
|
|
6
|
-
|
7
|
-
|
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
|
-
|
12
|
-
|
13
|
-
end
|
18
|
+
BANNER
|
19
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
20
|
+
end
|
14
21
|
|
15
|
-
id =
|
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 =
|
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
|
-
|
28
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
29
|
+
story = rally.find_story_with_id id
|
23
30
|
|
24
|
-
|
31
|
+
story.update :name => name
|
25
32
|
|
26
|
-
|
33
|
+
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
27
37
|
end
|
38
|
+
|
39
|
+
Crab::StoryRename.run
|
data/bin/crab-st-rm
CHANGED
@@ -1,21 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
1
2
|
# vim: set ft=ruby :
|
2
3
|
require 'crab'
|
3
4
|
|
4
|
-
|
5
|
-
|
5
|
+
class Crab::StoryDelete
|
6
|
+
|
7
|
+
def self.run(args=ARGV)
|
8
|
+
opts = Trollop::options(args) do
|
9
|
+
banner <<-BANNER
|
6
10
|
crab story delete: delete an existing story in Rally
|
7
11
|
|
8
12
|
Usage: crab story delete <id> [options*]
|
9
|
-
|
10
|
-
|
11
|
-
end
|
13
|
+
BANNER
|
14
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
15
|
+
end
|
12
16
|
|
13
|
-
id =
|
14
|
-
Trollop::die "Story ID must be specified" if id.blank?
|
17
|
+
id = args.join(" ")
|
18
|
+
Trollop::die "Story ID must be specified" if id.blank?
|
15
19
|
|
16
|
-
Crab::Rally.new(opts[:dry]) do |rally|
|
17
|
-
|
18
|
-
|
20
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
21
|
+
story = rally.find_story_with_id id
|
22
|
+
story.delete
|
19
23
|
|
20
|
-
|
24
|
+
puts "Story #{id} deleted."
|
25
|
+
end
|
26
|
+
end
|
21
27
|
end
|
28
|
+
|
29
|
+
Crab::StoryDelete.run
|
data/bin/crab-st-show
CHANGED
@@ -1,20 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
1
2
|
# vim: set ft=ruby :
|
2
3
|
require 'crab'
|
3
4
|
|
4
|
-
|
5
|
-
|
5
|
+
class Crab::StoryShow
|
6
|
+
|
7
|
+
def self.run(args=ARGV)
|
8
|
+
opts = Trollop::options(args) do
|
9
|
+
banner <<-BANNER
|
6
10
|
crab story show: displays a story in Rally as a Cucumber feature
|
7
11
|
|
8
12
|
Usage: crab story show <id> [options*]"
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
13
|
+
BANNER
|
14
|
+
opt :language, "Language to display Cucumber features in (ISO code)", :default => "en", :short => "-l"
|
15
|
+
opt :testcases, "Also convert test cases to scenarios (similar to crab testcase show)", :short => "-t", :default => true
|
16
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
17
|
+
end
|
14
18
|
|
15
|
-
id =
|
16
|
-
Crab::Rally.new(opts[:dry]) do |rally|
|
17
|
-
|
19
|
+
id = args.first
|
20
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
21
|
+
story = rally.find_story_with_id(id)
|
18
22
|
|
19
|
-
|
23
|
+
puts Crab::CucumberFeature.new(opts[:language]).generate_from(story, opts[:testcases])
|
24
|
+
end
|
25
|
+
end
|
20
26
|
end
|
27
|
+
|
28
|
+
Crab::StoryShow.run
|
data/bin/crab-st-up
CHANGED
@@ -1,59 +1,73 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
1
2
|
# vim: set ft=ruby :
|
2
3
|
require 'crab'
|
3
4
|
|
4
|
-
|
5
|
+
class Crab::StoryUpdate
|
5
6
|
|
6
|
-
|
7
|
-
|
7
|
+
class << self
|
8
|
+
|
9
|
+
include Crab::Utilities
|
10
|
+
|
11
|
+
def run(args=ARGV)
|
12
|
+
|
13
|
+
cmd_opts = Trollop::options(args) do
|
14
|
+
banner <<-BANNER
|
8
15
|
crab story update: update a story in Rally
|
9
16
|
|
10
17
|
Usage: crab story update <id> [options*]
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
BANNER
|
19
|
+
opt :name, "Name (title)", :type => String, :short => "-n"
|
20
|
+
opt :description, "Description", :type => String, :short => "-d"
|
21
|
+
opt :state, "State (one of: #{Crab::Story::VALID_STATES.join(" ")})", :type => String, :short => "-t"
|
22
|
+
opt :estimate, "Estimate", :type => :int, :short => "-e"
|
23
|
+
opt :iteration, "Iteration", :type => String, :short => "-i"
|
24
|
+
opt :release, "Release", :type => String, :short => "-r"
|
25
|
+
opt :blocked, "Blocked", :short => "-b"
|
26
|
+
opt :unblocked, "Unblocked", :short => "-u"
|
27
|
+
opt :parent, "Parent", :type => String, :short => "-p"
|
28
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
29
|
+
end
|
22
30
|
|
23
|
-
Trollop::die "No story given" if
|
24
|
-
Trollop::die "Nothing to update. Please provide some options" unless cmd_opts.any? {|k, v| k.to_s =~ /_given$/ }
|
31
|
+
Trollop::die "No story given" if args.empty?
|
32
|
+
Trollop::die "Nothing to update. Please provide some options" unless cmd_opts.any? {|k, v| k.to_s =~ /_given$/ }
|
25
33
|
|
26
|
-
opts = {}
|
27
|
-
opts[:name] = cmd_opts[:name] if cmd_opts[:name_given]
|
28
|
-
opts[:
|
34
|
+
opts = {}
|
35
|
+
opts[:name] = cmd_opts[:name] if cmd_opts[:name_given]
|
36
|
+
opts[:description] = cmd_opts[:description] if cmd_opts[:description_given]
|
37
|
+
opts[:schedule_state] = state_from(cmd_opts[:state]) if cmd_opts[:state_given]
|
29
38
|
|
30
|
-
if cmd_opts[:estimate_given]
|
31
|
-
|
32
|
-
end
|
39
|
+
if cmd_opts[:estimate_given]
|
40
|
+
opts[:plan_estimate] = cmd_opts[:estimate] # nobody is going to remember "Plan Estimate", really
|
41
|
+
end
|
33
42
|
|
34
|
-
opts[:blocked] = cmd_opts[:blocked] if cmd_opts[:blocked_given]
|
35
|
-
opts[:blocked] = !cmd_opts[:unblocked] if cmd_opts[:unblocked_given]
|
43
|
+
opts[:blocked] = cmd_opts[:blocked] if cmd_opts[:blocked_given]
|
44
|
+
opts[:blocked] = !cmd_opts[:unblocked] if cmd_opts[:unblocked_given]
|
36
45
|
|
37
|
-
Crab::Rally.new(opts[:dry]) do |rally|
|
38
|
-
rally.connect
|
46
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
39
47
|
|
40
|
-
|
48
|
+
story = rally.find_story_with_id args.first
|
41
49
|
|
42
|
-
|
43
|
-
|
44
|
-
|
50
|
+
if cmd_opts[:iteration_given]
|
51
|
+
opts[:iteration] = rally.find_iteration_by_name cmd_opts[:iteration], story.rally_object.project
|
52
|
+
end
|
45
53
|
|
46
|
-
|
47
|
-
|
48
|
-
|
54
|
+
if cmd_opts[:release_given]
|
55
|
+
opts[:release] = rally.find_release_by_name cmd_opts[:release], story.rally_object.project
|
56
|
+
end
|
49
57
|
|
50
|
-
|
51
|
-
|
52
|
-
|
58
|
+
if cmd_opts[:parent_given]
|
59
|
+
opts[:parent] = rally.find_story_with_id(cmd_opts[:parent]).rally_object
|
60
|
+
end
|
61
|
+
|
62
|
+
opts[:name] = story.name if opts[:name].blank?
|
53
63
|
|
54
|
-
|
64
|
+
story.update opts
|
55
65
|
|
56
|
-
|
66
|
+
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
67
|
+
end
|
57
68
|
|
58
|
-
|
69
|
+
end
|
70
|
+
end
|
59
71
|
end
|
72
|
+
|
73
|
+
Crab::StoryUpdate.run
|
data/bin/crab-st-update
CHANGED
@@ -1,59 +1,73 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
1
2
|
# vim: set ft=ruby :
|
2
3
|
require 'crab'
|
3
4
|
|
4
|
-
|
5
|
+
class Crab::StoryUpdate
|
5
6
|
|
6
|
-
|
7
|
-
|
7
|
+
class << self
|
8
|
+
|
9
|
+
include Crab::Utilities
|
10
|
+
|
11
|
+
def run(args=ARGV)
|
12
|
+
|
13
|
+
cmd_opts = Trollop::options(args) do
|
14
|
+
banner <<-BANNER
|
8
15
|
crab story update: update a story in Rally
|
9
16
|
|
10
17
|
Usage: crab story update <id> [options*]
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
BANNER
|
19
|
+
opt :name, "Name (title)", :type => String, :short => "-n"
|
20
|
+
opt :description, "Description", :type => String, :short => "-d"
|
21
|
+
opt :state, "State (one of: #{Crab::Story::VALID_STATES.join(" ")})", :type => String, :short => "-t"
|
22
|
+
opt :estimate, "Estimate", :type => :int, :short => "-e"
|
23
|
+
opt :iteration, "Iteration", :type => String, :short => "-i"
|
24
|
+
opt :release, "Release", :type => String, :short => "-r"
|
25
|
+
opt :blocked, "Blocked", :short => "-b"
|
26
|
+
opt :unblocked, "Unblocked", :short => "-u"
|
27
|
+
opt :parent, "Parent", :type => String, :short => "-p"
|
28
|
+
opt :dry, "Dry-run (don't change anything)", :short => "-D", :default => false
|
29
|
+
end
|
22
30
|
|
23
|
-
Trollop::die "No story given" if
|
24
|
-
Trollop::die "Nothing to update. Please provide some options" unless cmd_opts.any? {|k, v| k.to_s =~ /_given$/ }
|
31
|
+
Trollop::die "No story given" if args.empty?
|
32
|
+
Trollop::die "Nothing to update. Please provide some options" unless cmd_opts.any? {|k, v| k.to_s =~ /_given$/ }
|
25
33
|
|
26
|
-
opts = {}
|
27
|
-
opts[:name] = cmd_opts[:name] if cmd_opts[:name_given]
|
28
|
-
opts[:
|
34
|
+
opts = {}
|
35
|
+
opts[:name] = cmd_opts[:name] if cmd_opts[:name_given]
|
36
|
+
opts[:description] = cmd_opts[:description] if cmd_opts[:description_given]
|
37
|
+
opts[:schedule_state] = state_from(cmd_opts[:state]) if cmd_opts[:state_given]
|
29
38
|
|
30
|
-
if cmd_opts[:estimate_given]
|
31
|
-
|
32
|
-
end
|
39
|
+
if cmd_opts[:estimate_given]
|
40
|
+
opts[:plan_estimate] = cmd_opts[:estimate] # nobody is going to remember "Plan Estimate", really
|
41
|
+
end
|
33
42
|
|
34
|
-
opts[:blocked] = cmd_opts[:blocked] if cmd_opts[:blocked_given]
|
35
|
-
opts[:blocked] = !cmd_opts[:unblocked] if cmd_opts[:unblocked_given]
|
43
|
+
opts[:blocked] = cmd_opts[:blocked] if cmd_opts[:blocked_given]
|
44
|
+
opts[:blocked] = !cmd_opts[:unblocked] if cmd_opts[:unblocked_given]
|
36
45
|
|
37
|
-
Crab::Rally.new(opts[:dry]) do |rally|
|
38
|
-
rally.connect
|
46
|
+
Crab::Rally.new(opts[:dry]) do |rally|
|
39
47
|
|
40
|
-
|
48
|
+
story = rally.find_story_with_id args.first
|
41
49
|
|
42
|
-
|
43
|
-
|
44
|
-
|
50
|
+
if cmd_opts[:iteration_given]
|
51
|
+
opts[:iteration] = rally.find_iteration_by_name cmd_opts[:iteration], story.rally_object.project
|
52
|
+
end
|
45
53
|
|
46
|
-
|
47
|
-
|
48
|
-
|
54
|
+
if cmd_opts[:release_given]
|
55
|
+
opts[:release] = rally.find_release_by_name cmd_opts[:release], story.rally_object.project
|
56
|
+
end
|
49
57
|
|
50
|
-
|
51
|
-
|
52
|
-
|
58
|
+
if cmd_opts[:parent_given]
|
59
|
+
opts[:parent] = rally.find_story_with_id(cmd_opts[:parent]).rally_object
|
60
|
+
end
|
61
|
+
|
62
|
+
opts[:name] = story.name if opts[:name].blank?
|
53
63
|
|
54
|
-
|
64
|
+
story.update opts
|
55
65
|
|
56
|
-
|
66
|
+
puts "#{story.formatted_id}: #{story.name} (#{story.state})"
|
67
|
+
end
|
57
68
|
|
58
|
-
|
69
|
+
end
|
70
|
+
end
|
59
71
|
end
|
72
|
+
|
73
|
+
Crab::StoryUpdate.run
|