cascadence 0.3.0 → 0.4.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.
- checksums.yaml +4 -4
- data/Gemfile +5 -5
- data/Gemfile.lock +12 -10
- data/VERSION +1 -1
- data/bin/cascadence +1 -5
- data/cascadence.gemspec +18 -17
- data/lib/cascadence.rb +5 -0
- data/lib/cascadence/commander.rb +27 -4
- data/lib/cascadence/commander/flow.rb +27 -9
- data/lib/cascadence/runner.rb +13 -5
- data/lib/cascadence/stateful.rb +1 -1
- data/lib/cascadence/writer.rb +14 -0
- data/spec/cascadence/commander/flow_spec.rb +1 -1
- data/spec/cascadence/commander/version_spec.rb +10 -0
- data/spec/cascadence/commander_spec.rb +34 -14
- data/spec/cascadence/runner_spec.rb +56 -15
- metadata +19 -18
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 75b18f4ad7c3ed38714640e2d2a8a59afd42e0b2
|
|
4
|
+
data.tar.gz: 8234a4f5dd614b3ae1445fb7ad71f2d3e56e295a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e943d1c67f1586159d1a24987c32dc07910d2499f3c4918840484b2b81832f756f942a7aff4484dc05fa886c647309ee658bd7aaa7064edbb03035624d0cce24
|
|
7
|
+
data.tar.gz: 38ccd794478be80b096b0b6a90f90fed78ca68c325bc887bf1961cb6838b6a45c92c8e11acd3816c250eee8d9fc76050486127c75bb17baa24609cbe4ecfcee3
|
data/Gemfile
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
source "http://rubygems.org"
|
|
2
2
|
|
|
3
|
-
gem "thor"
|
|
4
|
-
gem "activesupport"
|
|
3
|
+
gem "thor", ">= 0.18.1"
|
|
4
|
+
gem "activesupport", ">= 3.0.0"
|
|
5
5
|
|
|
6
6
|
group :development do
|
|
7
|
-
gem "jeweler"
|
|
7
|
+
gem "jeweler", "~> 1.8.0"
|
|
8
8
|
gem "rdoc"
|
|
9
|
-
gem "rspec"
|
|
10
|
-
gem "simplecov"
|
|
9
|
+
gem "rspec", "~> 2.13.0"
|
|
10
|
+
gem "simplecov", "~> 0.7.0"
|
|
11
11
|
end
|
data/Gemfile.lock
CHANGED
|
@@ -4,7 +4,7 @@ GEM
|
|
|
4
4
|
activesupport (3.2.13)
|
|
5
5
|
i18n (= 0.6.1)
|
|
6
6
|
multi_json (~> 1.0)
|
|
7
|
-
diff-lcs (1.2.
|
|
7
|
+
diff-lcs (1.2.4)
|
|
8
8
|
git (1.2.5)
|
|
9
9
|
i18n (0.6.1)
|
|
10
10
|
jeweler (1.8.4)
|
|
@@ -12,9 +12,11 @@ GEM
|
|
|
12
12
|
git (>= 1.2.5)
|
|
13
13
|
rake
|
|
14
14
|
rdoc
|
|
15
|
-
|
|
15
|
+
json (1.7.7)
|
|
16
|
+
multi_json (1.7.3)
|
|
16
17
|
rake (10.0.4)
|
|
17
|
-
rdoc (4.0.
|
|
18
|
+
rdoc (4.0.1)
|
|
19
|
+
json (~> 1.4)
|
|
18
20
|
rspec (2.13.0)
|
|
19
21
|
rspec-core (~> 2.13.0)
|
|
20
22
|
rspec-expectations (~> 2.13.0)
|
|
@@ -22,20 +24,20 @@ GEM
|
|
|
22
24
|
rspec-core (2.13.1)
|
|
23
25
|
rspec-expectations (2.13.0)
|
|
24
26
|
diff-lcs (>= 1.1.3, < 2.0)
|
|
25
|
-
rspec-mocks (2.13.
|
|
27
|
+
rspec-mocks (2.13.1)
|
|
26
28
|
simplecov (0.7.1)
|
|
27
29
|
multi_json (~> 1.0)
|
|
28
30
|
simplecov-html (~> 0.7.1)
|
|
29
31
|
simplecov-html (0.7.1)
|
|
30
|
-
thor (0.
|
|
32
|
+
thor (0.18.1)
|
|
31
33
|
|
|
32
34
|
PLATFORMS
|
|
33
35
|
ruby
|
|
34
36
|
|
|
35
37
|
DEPENDENCIES
|
|
36
|
-
activesupport
|
|
37
|
-
jeweler
|
|
38
|
+
activesupport (>= 3.0.0)
|
|
39
|
+
jeweler (~> 1.8.0)
|
|
38
40
|
rdoc
|
|
39
|
-
rspec
|
|
40
|
-
simplecov
|
|
41
|
-
thor
|
|
41
|
+
rspec (~> 2.13.0)
|
|
42
|
+
simplecov (~> 0.7.0)
|
|
43
|
+
thor (>= 0.18.1)
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.3
|
|
1
|
+
0.4.3
|
data/bin/cascadence
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
|
|
3
3
|
require File.expand_path("../../lib/cascadence", __FILE__)
|
|
4
|
-
|
|
5
|
-
Cascadence::Commander.start ARGV
|
|
6
|
-
else
|
|
7
|
-
Cascadence::Commander.start ARGV.unshift("flow")
|
|
8
|
-
end
|
|
4
|
+
Cascadence::Commander.start ARGV
|
data/cascadence.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = "cascadence"
|
|
8
|
-
s.version = "0.3
|
|
8
|
+
s.version = "0.4.3"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Thomas Chen"]
|
|
12
|
-
s.date = "2013-05-
|
|
12
|
+
s.date = "2013-05-08"
|
|
13
13
|
s.description = "Organizational helper for writing serializations for use with threading. The biggest use case of this would be in selenium / capybara based integration testing as this allows you to run flows in parallel."
|
|
14
14
|
s.email = "foxnewsnetwork@gmail.com"
|
|
15
15
|
s.executables = ["cascadence"]
|
|
@@ -55,6 +55,7 @@ Gem::Specification.new do |s|
|
|
|
55
55
|
"lib/cascadence/templates/%project_name%.rb.tt",
|
|
56
56
|
"lib/cascadence/templates/%project_name%/base_flow.rb.tt",
|
|
57
57
|
"lib/cascadence/templates/flow_helper.rb.tt",
|
|
58
|
+
"lib/cascadence/writer.rb",
|
|
58
59
|
"spec/cascadence/advanced_fork_merge_spec.rb",
|
|
59
60
|
"spec/cascadence/class_methods_spec.rb",
|
|
60
61
|
"spec/cascadence/commander/flow_spec.rb",
|
|
@@ -80,27 +81,27 @@ Gem::Specification.new do |s|
|
|
|
80
81
|
s.specification_version = 4
|
|
81
82
|
|
|
82
83
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
|
83
|
-
s.add_runtime_dependency(%q<thor>, [">= 0"])
|
|
84
|
-
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
|
85
|
-
s.add_development_dependency(%q<jeweler>, ["
|
|
84
|
+
s.add_runtime_dependency(%q<thor>, [">= 0.18.1"])
|
|
85
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 3.0.0"])
|
|
86
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.8.0"])
|
|
86
87
|
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
|
87
|
-
s.add_development_dependency(%q<rspec>, ["
|
|
88
|
-
s.add_development_dependency(%q<simplecov>, ["
|
|
88
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.13.0"])
|
|
89
|
+
s.add_development_dependency(%q<simplecov>, ["~> 0.7.0"])
|
|
89
90
|
else
|
|
90
|
-
s.add_dependency(%q<thor>, [">= 0"])
|
|
91
|
-
s.add_dependency(%q<activesupport>, [">= 0"])
|
|
92
|
-
s.add_dependency(%q<jeweler>, ["
|
|
91
|
+
s.add_dependency(%q<thor>, [">= 0.18.1"])
|
|
92
|
+
s.add_dependency(%q<activesupport>, [">= 3.0.0"])
|
|
93
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.0"])
|
|
93
94
|
s.add_dependency(%q<rdoc>, [">= 0"])
|
|
94
|
-
s.add_dependency(%q<rspec>, ["
|
|
95
|
-
s.add_dependency(%q<simplecov>, ["
|
|
95
|
+
s.add_dependency(%q<rspec>, ["~> 2.13.0"])
|
|
96
|
+
s.add_dependency(%q<simplecov>, ["~> 0.7.0"])
|
|
96
97
|
end
|
|
97
98
|
else
|
|
98
|
-
s.add_dependency(%q<thor>, [">= 0"])
|
|
99
|
-
s.add_dependency(%q<activesupport>, [">= 0"])
|
|
100
|
-
s.add_dependency(%q<jeweler>, ["
|
|
99
|
+
s.add_dependency(%q<thor>, [">= 0.18.1"])
|
|
100
|
+
s.add_dependency(%q<activesupport>, [">= 3.0.0"])
|
|
101
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.0"])
|
|
101
102
|
s.add_dependency(%q<rdoc>, [">= 0"])
|
|
102
|
-
s.add_dependency(%q<rspec>, ["
|
|
103
|
-
s.add_dependency(%q<simplecov>, ["
|
|
103
|
+
s.add_dependency(%q<rspec>, ["~> 2.13.0"])
|
|
104
|
+
s.add_dependency(%q<simplecov>, ["~> 0.7.0"])
|
|
104
105
|
end
|
|
105
106
|
end
|
|
106
107
|
|
data/lib/cascadence.rb
CHANGED
|
@@ -12,6 +12,7 @@ module Cascadence
|
|
|
12
12
|
autoload :Runner, File.join( File.dirname(__FILE__), "cascadence", "runner")
|
|
13
13
|
autoload :Config, File.join( File.dirname(__FILE__), "cascadence", "config")
|
|
14
14
|
autoload :Task, File.join( File.dirname(__FILE__), "cascadence", "task")
|
|
15
|
+
autoload :Writer, File.join( File.dirname(__FILE__), "cascadence", "writer")
|
|
15
16
|
def self.config(&block)
|
|
16
17
|
if block_given?
|
|
17
18
|
yield Config.instance
|
|
@@ -23,4 +24,8 @@ module Cascadence
|
|
|
23
24
|
def self.runner
|
|
24
25
|
Runner.instance
|
|
25
26
|
end
|
|
27
|
+
|
|
28
|
+
def self.say(text)
|
|
29
|
+
Writer.instance.say text
|
|
30
|
+
end
|
|
26
31
|
end
|
data/lib/cascadence/commander.rb
CHANGED
|
@@ -1,16 +1,39 @@
|
|
|
1
1
|
module Cascadence
|
|
2
2
|
class Commander < Thor
|
|
3
|
+
self.default_task(:flow)
|
|
3
4
|
|
|
4
|
-
desc "version", "
|
|
5
|
+
desc "version", "Cascadence version."
|
|
5
6
|
def version
|
|
7
|
+
say Cascadence::Commander::Version.instance.run
|
|
6
8
|
Cascadence::Commander::Version.instance.run
|
|
7
9
|
end
|
|
8
10
|
|
|
9
11
|
desc "flow [FILEPATH]", "Runs the flow specified in the given file. If given a directory, runs all the flows in the directory."
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
long_desc <<-LONGDESC
|
|
13
|
+
Runs all the flow specified if <filepath> is a file. If <filepath> is a directory,
|
|
14
|
+
cascadence will run all the flows in that directory.
|
|
15
|
+
|
|
16
|
+
With the -f option, cascadence will loop back after it finishes with its given flows
|
|
17
|
+
and continue to run continously for all eternity (or until it dies)
|
|
13
18
|
|
|
19
|
+
With the -p option, specify the path to the file or folder that holds yours
|
|
20
|
+
|
|
21
|
+
With the -t option, specify the number of times to run the flows. If -f is specify,
|
|
22
|
+
this value is treated as infinity regardless of what you actually put
|
|
23
|
+
LONGDESC
|
|
24
|
+
method_option :forever, :type => :boolean, :desc => "Runs all the flows continously", :default => false, :aliases => "-f"
|
|
25
|
+
method_option :path, :type => :string, :desc => "Specify the filepaths you wish to run", :default => Dir.pwd, :aliases => "-p"
|
|
26
|
+
method_option :times, :type => :numeric, :desc => "Specify the number of times to run", :default => 1, :aliases => "-t"
|
|
27
|
+
method_option :verbose, :type => :boolean, :desc => "Turn on verbose mode", :default => false, :aliases => "-v"
|
|
28
|
+
def flow
|
|
29
|
+
Cascadence::Writer.instance.verbose_mode = options.verbose?
|
|
30
|
+
Cascadence.say "Starting up flow"
|
|
31
|
+
if options.forever?
|
|
32
|
+
Cascadence::Commander::Flow.instance.run(options.path)
|
|
33
|
+
else
|
|
34
|
+
Cascadence::Commander::Flow.instance.run(options.path, options.times.to_i)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
14
37
|
end
|
|
15
38
|
end
|
|
16
39
|
|
|
@@ -3,27 +3,37 @@ module Cascadence
|
|
|
3
3
|
class Flow
|
|
4
4
|
include Singleton
|
|
5
5
|
|
|
6
|
-
def run(filepath)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
tasks
|
|
11
|
-
_run_tasks tasks
|
|
6
|
+
def run(filepath, times=nil)
|
|
7
|
+
Cascadence.say "Attempting to run #{times.nil? ? 'infinite' : times.to_s} times given filepath: #{filepath}"
|
|
8
|
+
tasks = _setup_environment_and_get_tasks!(filepath)
|
|
9
|
+
Cascadence.say "Retrieved all tasks"
|
|
10
|
+
_run_tasks tasks.lazy.cycle(times)
|
|
12
11
|
end
|
|
13
12
|
|
|
14
13
|
private
|
|
15
|
-
|
|
16
14
|
def _run_tasks(tasks)
|
|
15
|
+
Cascadence.say "Attempting to run_tasks all your tasks"
|
|
17
16
|
Cascadence.runner.run_tasks tasks
|
|
18
17
|
end
|
|
19
18
|
|
|
19
|
+
def _setup_environment_and_get_tasks!(filepath)
|
|
20
|
+
Cascadence.say "Attempting to _setup_environment_and_get_tasks! given filepath: #{filepath}"
|
|
21
|
+
abs_file_path = _absolutize_filepath filepath
|
|
22
|
+
files = _get_files_from_filepath abs_file_path
|
|
23
|
+
_setup_environment_from_filepath!(_absolutize_filepath filepath)
|
|
24
|
+
tasks = files.map { |file| _get_task_from_file file }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
|
|
20
28
|
def _absolutize_filepath(filepath)
|
|
29
|
+
Cascadence.say "Attempting to _absolutize_filepath given filepath: #{filepath}"
|
|
21
30
|
return filepath if filepath =~ /^\//
|
|
22
31
|
return File.expand_path(filepath) if filepath =~ /^~/
|
|
23
32
|
return File.join(Dir.pwd, filepath)
|
|
24
33
|
end
|
|
25
34
|
|
|
26
35
|
def _get_files_from_filepath(filepath)
|
|
36
|
+
Cascadence.say "Attempting to _get_files_from_filepath given filepath: #{filepath}"
|
|
27
37
|
return [filepath] if _flow_file? filepath
|
|
28
38
|
return [] unless File.exists? filepath
|
|
29
39
|
Dir[File.join(filepath, "*")].map { |file_or_dir| _get_files_from_filepath file_or_dir }.flatten
|
|
@@ -34,12 +44,14 @@ module Cascadence
|
|
|
34
44
|
end
|
|
35
45
|
|
|
36
46
|
def _setup_environment_from_filepath!(filepath)
|
|
47
|
+
Cascadence.say "Attemping to _setup_environment_from_filepath!: #{filepath}"
|
|
37
48
|
require _find_flow_helper_from_filepath filepath
|
|
38
49
|
end
|
|
39
50
|
|
|
40
51
|
def _find_flow_helper_from_filepath( filepath )
|
|
52
|
+
Cascadence.say "Attemping to _setup_environment_from_filepath!: #{filepath}"
|
|
41
53
|
_find_flow_helper_from_filepath File.expand_path("..", filepath) unless File.directory? filepath
|
|
42
|
-
|
|
54
|
+
raise NameError.new("No flow_helper.rb file found. Be sure you have a flow_helper.rb file in your flows folder!") if filepath == "/"
|
|
43
55
|
Dir[File.join(filepath, "*")].select { |file| _flow_helper? file }.first || _find_flow_helper_from_filepath( File.expand_path("..", filepath) )
|
|
44
56
|
end
|
|
45
57
|
|
|
@@ -48,20 +60,26 @@ module Cascadence
|
|
|
48
60
|
end
|
|
49
61
|
|
|
50
62
|
def _get_task_from_file(file)
|
|
63
|
+
Cascadence.say "Attemping to _get_task_from_file: #{file}"
|
|
51
64
|
flow = _get_flow_from_file file
|
|
52
|
-
|
|
65
|
+
raise NameError.new("Bad flow from #{file}.
|
|
66
|
+
Remember, all flow class MUST end in Flow and MUST be referenced your flow_helper.rb file.
|
|
67
|
+
Detected flows: #{Cascadence::Flow.subclasses.to_s}") if flow.nil?
|
|
53
68
|
Cascadence::Task.new(_get_zero_state_generator_from_flow flow) do |state=nil|
|
|
69
|
+
Cascadence.say "Attempting run #{flow} with state: #{state}"
|
|
54
70
|
flow.new(state).run_states
|
|
55
71
|
end
|
|
56
72
|
end
|
|
57
73
|
|
|
58
74
|
def _get_zero_state_generator_from_flow(flow)
|
|
75
|
+
Cascadence.say "Attemping to _get_zero_state_generator_from_flow: #{flow}"
|
|
59
76
|
return flow.zero_state_generator if flow.respond_to? :zero_state_generator
|
|
60
77
|
return Cascadence.config.zero_state_generator if flow == Object || !flow.respond_to?(:parent)
|
|
61
78
|
_get_zero_state_generator_from_flow(flow.parent)
|
|
62
79
|
end
|
|
63
80
|
|
|
64
81
|
def _get_flow_from_file(file)
|
|
82
|
+
Cascadence.say "Attemping to _get_flow_from_file: #{file}"
|
|
65
83
|
Cascadence::Flow.subclasses.select { |subclass| _reasonably_matched?(subclass.to_s, file.chomp(".rb")) }.first
|
|
66
84
|
end
|
|
67
85
|
|
data/lib/cascadence/runner.rb
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
module Cascadence
|
|
2
2
|
class Runner
|
|
3
3
|
include Singleton
|
|
4
|
-
|
|
5
4
|
def run_tasks(tasks)
|
|
5
|
+
tasks = tasks.to_enum unless _implements_enumerable?(tasks)
|
|
6
6
|
if Cascadence.config.parallel
|
|
7
7
|
_run_parallel tasks
|
|
8
8
|
else
|
|
@@ -12,8 +12,15 @@ module Cascadence
|
|
|
12
12
|
|
|
13
13
|
private
|
|
14
14
|
|
|
15
|
+
def _implements_enumerable?(tasks)
|
|
16
|
+
return true if tasks.is_a? Enumerator
|
|
17
|
+
return true if tasks.is_a? Enumerator::Lazy
|
|
18
|
+
return true if [:next, :peek].inject(false) { |status, method| status || tasks.respond_to?(method) }
|
|
19
|
+
return false
|
|
20
|
+
end
|
|
21
|
+
|
|
15
22
|
def _run_parallel(tasks, threads=[])
|
|
16
|
-
return if tasks.
|
|
23
|
+
return tasks.rewind if tasks.peek.nil? && threads.empty?
|
|
17
24
|
package = _maybe_spin_up_thread(tasks, threads)
|
|
18
25
|
new_tasks = package.first
|
|
19
26
|
new_threads = package.last
|
|
@@ -22,7 +29,7 @@ module Cascadence
|
|
|
22
29
|
|
|
23
30
|
def _maybe_spin_up_thread(tasks, threads=nil)
|
|
24
31
|
threads ||= []
|
|
25
|
-
threads = _spin_up_task(tasks.
|
|
32
|
+
threads = _spin_up_task(tasks.next, threads) if _still_have_room_for_more_threads?(threads)
|
|
26
33
|
return [tasks, threads.select(&:alive?)]
|
|
27
34
|
end
|
|
28
35
|
|
|
@@ -33,14 +40,15 @@ module Cascadence
|
|
|
33
40
|
def _spin_up_task(task, threads=nil)
|
|
34
41
|
sleep 0.5
|
|
35
42
|
threads ||= []
|
|
36
|
-
puts "Spinning up thread no.#{threads.count} out of #{Cascadence.config.max_thread_count}"
|
|
37
43
|
thread = Thread.new { task.call } unless task.nil?
|
|
38
44
|
threads.push thread unless thread.nil?
|
|
39
45
|
return threads
|
|
40
46
|
end
|
|
41
47
|
|
|
42
48
|
def _run_sequential(tasks)
|
|
43
|
-
tasks.
|
|
49
|
+
while task = tasks.next
|
|
50
|
+
task.call
|
|
51
|
+
end
|
|
44
52
|
end
|
|
45
53
|
end
|
|
46
54
|
end
|
data/lib/cascadence/stateful.rb
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
module Cascadence
|
|
3
2
|
|
|
4
3
|
module Stateful
|
|
@@ -72,6 +71,7 @@ module Cascadence
|
|
|
72
71
|
end
|
|
73
72
|
|
|
74
73
|
def _debug_helper
|
|
74
|
+
Cascadence.say "Current _debug_helper: #{@debug_counter}"
|
|
75
75
|
@debug_counter ||= 0
|
|
76
76
|
@debug_counter += 1
|
|
77
77
|
throw "Recursion Limit Reached! cascadence_position: #{cascadence_position} --> #{next_step_name}" if 100 < @debug_counter
|
|
@@ -128,7 +128,7 @@ describe Cascadence::Commander::Flow do
|
|
|
128
128
|
@starting = File.expand_path __FILE__
|
|
129
129
|
end
|
|
130
130
|
it "should throw an symbol as it cannot find the flow helper" do
|
|
131
|
-
expect { path }.to
|
|
131
|
+
expect { path }.to raise_error(NameError)
|
|
132
132
|
end
|
|
133
133
|
end
|
|
134
134
|
context "dumb case" do
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Cascadence::Commander::Version do
|
|
4
|
+
let(:api) { Cascadence::Commander::Version.instance }
|
|
5
|
+
let(:expected) { File.read File.expand_path("../../../../VERSION", __FILE__) }
|
|
6
|
+
it "should not be retarded" do
|
|
7
|
+
expected.should =~ /\d\.\d\.\d/
|
|
8
|
+
end
|
|
9
|
+
specify { api.run.should eq expected }
|
|
10
|
+
end
|
|
@@ -1,26 +1,46 @@
|
|
|
1
1
|
require "spec_helper"
|
|
2
2
|
|
|
3
3
|
describe Cascadence::Commander do
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
describe "::start" do
|
|
5
|
+
before :each do
|
|
6
|
+
@argv = "-p #{File.join(RSpec::FixturePath, "amazon", "madeira_flow.rb")}".split(" ")
|
|
7
|
+
@thorify = lambda { |argv| Cascadence::Commander.start argv }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
context "flow -p" do
|
|
8
11
|
it "should run the flow stated" do
|
|
9
|
-
|
|
12
|
+
expect {@thorify.call @argv}.to raise_error StopIteration
|
|
10
13
|
end
|
|
11
14
|
end
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
it "should get the version as specified in the VERSION file" do
|
|
16
|
-
actual.should eq expected
|
|
15
|
+
context "flow -t 2 -p" do
|
|
16
|
+
it "should run the flow twice" do
|
|
17
|
+
expect {@thorify.call @argv}.to raise_error StopIteration
|
|
17
18
|
end
|
|
18
19
|
end
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
context "flow -f -p" do
|
|
21
|
+
before :each do
|
|
22
|
+
@argv.unshift " -f "
|
|
23
|
+
end
|
|
24
|
+
it "should run the flow forever" do
|
|
25
|
+
pending "Testing this involves solving Turing's Halting Problem, which I can't do. Sorry"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
context "instance" do
|
|
30
|
+
let(:lolcat) { Cascadence::Commander.new }
|
|
31
|
+
context "public api" do
|
|
32
|
+
describe "#version" do
|
|
33
|
+
let(:expected) { File.read File.expand_path("../../../VERSION", __FILE__) }
|
|
34
|
+
let(:actual) { lolcat.version }
|
|
35
|
+
it "should get the version as specified in the VERSION file" do
|
|
36
|
+
actual.should eq expected
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
describe "#generate" do
|
|
40
|
+
it "should have tests" do
|
|
41
|
+
pending "write tests here!"
|
|
42
|
+
end
|
|
22
43
|
end
|
|
23
44
|
end
|
|
24
45
|
end
|
|
25
|
-
|
|
26
46
|
end
|
|
@@ -6,29 +6,70 @@ describe Cascadence::Runner do
|
|
|
6
6
|
Class.new do
|
|
7
7
|
def call
|
|
8
8
|
sleep 2
|
|
9
|
+
make_sure_this_gets_called!
|
|
9
10
|
puts "thread exiting"
|
|
10
11
|
return 13
|
|
11
12
|
end
|
|
12
13
|
end
|
|
13
14
|
end
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
|
|
16
|
+
context "running tasks" do
|
|
17
|
+
before :each do
|
|
18
|
+
task.any_instance.should_receive(:make_sure_this_gets_called!)
|
|
19
|
+
@tasks = 1.upto(7).map { |a| task.new }.to_enum
|
|
20
|
+
end
|
|
21
|
+
context "public api" do
|
|
22
|
+
describe "#run_tasks" do
|
|
23
|
+
let(:run_my_junk) { runner.run_tasks @tasks }
|
|
24
|
+
before(:each) { Cascadence.config.parallel = true }
|
|
25
|
+
it "should be okay" do
|
|
26
|
+
expect { run_my_junk }.to raise_error StopIteration
|
|
27
|
+
end
|
|
28
|
+
after(:each) { Cascadence.config.parallel = false }
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
context "private" do
|
|
32
|
+
describe "#_run_parallel" do
|
|
33
|
+
let(:run_my_junk) { runner.send("_run_parallel", @tasks ) }
|
|
34
|
+
it "should be okay" do
|
|
35
|
+
expect { run_my_junk }.to raise_error StopIteration
|
|
36
|
+
end
|
|
23
37
|
end
|
|
24
|
-
after(:each) { Cascadence.config.parallel = false }
|
|
25
38
|
end
|
|
26
39
|
end
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
40
|
+
|
|
41
|
+
context "private utility functions" do
|
|
42
|
+
describe "#_implements_enumerable?" do
|
|
43
|
+
let(:result) { runner.send("_implements_enumerable?", @something) }
|
|
44
|
+
context "enumerator" do
|
|
45
|
+
before(:each) { @something = [].to_enum }
|
|
46
|
+
it "should be trivially true for things that are enumerable" do
|
|
47
|
+
result.should be_true
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
context "lazy enumerator" do
|
|
51
|
+
before(:each) { @something = [].lazy }
|
|
52
|
+
it "should also be true for lazy enumerators" do
|
|
53
|
+
result.should be_true
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
context "custom half-ass objects" do
|
|
57
|
+
before(:each) do
|
|
58
|
+
halfass = Class.new do
|
|
59
|
+
def next; end
|
|
60
|
+
def peek; end
|
|
61
|
+
end
|
|
62
|
+
@something = halfass.new
|
|
63
|
+
end
|
|
64
|
+
it "should be true for objects as long as it implements next and peek" do
|
|
65
|
+
result.should be_true
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
context "false" do
|
|
69
|
+
before(:each) { @something = Object.new }
|
|
70
|
+
it "should not be true for just random objects" do
|
|
71
|
+
result.should be_false
|
|
72
|
+
end
|
|
32
73
|
end
|
|
33
74
|
end
|
|
34
75
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: cascadence
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3
|
|
4
|
+
version: 0.4.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Thomas Chen
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2013-05-
|
|
11
|
+
date: 2013-05-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: thor
|
|
@@ -16,42 +16,42 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - '>='
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
19
|
+
version: 0.18.1
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - '>='
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
26
|
+
version: 0.18.1
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: activesupport
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - '>='
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
33
|
+
version: 3.0.0
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - '>='
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
40
|
+
version: 3.0.0
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: jeweler
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
|
-
- -
|
|
45
|
+
- - ~>
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version:
|
|
47
|
+
version: 1.8.0
|
|
48
48
|
type: :development
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
|
-
- -
|
|
52
|
+
- - ~>
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version:
|
|
54
|
+
version: 1.8.0
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: rdoc
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -70,30 +70,30 @@ dependencies:
|
|
|
70
70
|
name: rspec
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
72
72
|
requirements:
|
|
73
|
-
- -
|
|
73
|
+
- - ~>
|
|
74
74
|
- !ruby/object:Gem::Version
|
|
75
|
-
version:
|
|
75
|
+
version: 2.13.0
|
|
76
76
|
type: :development
|
|
77
77
|
prerelease: false
|
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
79
|
requirements:
|
|
80
|
-
- -
|
|
80
|
+
- - ~>
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
|
-
version:
|
|
82
|
+
version: 2.13.0
|
|
83
83
|
- !ruby/object:Gem::Dependency
|
|
84
84
|
name: simplecov
|
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
|
86
86
|
requirements:
|
|
87
|
-
- -
|
|
87
|
+
- - ~>
|
|
88
88
|
- !ruby/object:Gem::Version
|
|
89
|
-
version:
|
|
89
|
+
version: 0.7.0
|
|
90
90
|
type: :development
|
|
91
91
|
prerelease: false
|
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements:
|
|
94
|
-
- -
|
|
94
|
+
- - ~>
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
|
-
version:
|
|
96
|
+
version: 0.7.0
|
|
97
97
|
description: Organizational helper for writing serializations for use with threading.
|
|
98
98
|
The biggest use case of this would be in selenium / capybara based integration testing
|
|
99
99
|
as this allows you to run flows in parallel.
|
|
@@ -142,6 +142,7 @@ files:
|
|
|
142
142
|
- lib/cascadence/templates/%project_name%.rb.tt
|
|
143
143
|
- lib/cascadence/templates/%project_name%/base_flow.rb.tt
|
|
144
144
|
- lib/cascadence/templates/flow_helper.rb.tt
|
|
145
|
+
- lib/cascadence/writer.rb
|
|
145
146
|
- spec/cascadence/advanced_fork_merge_spec.rb
|
|
146
147
|
- spec/cascadence/class_methods_spec.rb
|
|
147
148
|
- spec/cascadence/commander/flow_spec.rb
|