cascadence 0.3.0 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b0bc78d89b385d60870d89319dee48898086f1cf
4
- data.tar.gz: 814cef642a4d51ff4a11ca92a9c5587ef69246cb
3
+ metadata.gz: 75b18f4ad7c3ed38714640e2d2a8a59afd42e0b2
4
+ data.tar.gz: 8234a4f5dd614b3ae1445fb7ad71f2d3e56e295a
5
5
  SHA512:
6
- metadata.gz: 4deaee7535eabba1d35e3fbe759eaceb7da54c8821f76b71b612de4e3034daa4312dff443d7d33d4dc012582b228ba40fa99bcd472793ab1dec4d07295349533
7
- data.tar.gz: 736b1ad9ceb4e779fa993a648595c7f66d3d607815e1ea51bcceab9cf632fe3cf8edb24009c2053b744d1a8b78462e9803ca1cf3d9fc5f2003e85e99fb87563b
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.1)
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
- multi_json (1.7.2)
15
+ json (1.7.7)
16
+ multi_json (1.7.3)
16
17
  rake (10.0.4)
17
- rdoc (4.0.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.0)
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.17.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.0
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
- if ["help", "version", "flow", "generate"].include? ARGV.first
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.0"
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-06"
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>, [">= 0"])
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>, [">= 0"])
88
- s.add_development_dependency(%q<simplecov>, [">= 0"])
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>, [">= 0"])
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>, [">= 0"])
95
- s.add_dependency(%q<simplecov>, [">= 0"])
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>, [">= 0"])
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>, [">= 0"])
103
- s.add_dependency(%q<simplecov>, [">= 0"])
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
@@ -1,16 +1,39 @@
1
1
  module Cascadence
2
2
  class Commander < Thor
3
+ self.default_task(:flow)
3
4
 
4
- desc "version", "Not implemented yet. That's right, the command that tells you what version of cascadence you're running has not been implemented yet."
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
- def flow(filepath=Dir.pwd)
11
- Cascadence::Commander::Flow.instance.run(filepath)
12
- end
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
- abs_file_path = _absolutize_filepath filepath
8
- files = _get_files_from_filepath abs_file_path
9
- _setup_environment_from_filepath!(_absolutize_filepath filepath)
10
- tasks = files.map { |file| _get_task_from_file file }
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
- throw :NoFlowHelperFound if filepath == "/"
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
- throw "Bad flow from #{file}. Available flows: #{Cascadence::Flow.subclasses.to_s}" if flow.nil?
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
 
@@ -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.empty? && threads.empty?
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.pop, threads) if _still_have_room_for_more_threads?(threads)
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.map(&:call).map(&:state)
49
+ while task = tasks.next
50
+ task.call
51
+ end
44
52
  end
45
53
  end
46
54
  end
@@ -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
@@ -0,0 +1,14 @@
1
+ module Cascadence
2
+ class Writer
3
+ include Singleton
4
+ attr_accessor :verbose_mode
5
+ def say(text)
6
+ puts text if verbose?
7
+ end
8
+
9
+ def verbose?
10
+ @verbose_mode ||= false
11
+ end
12
+
13
+ end
14
+ end
@@ -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 throw_symbol :NoFlowHelperFound
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
- let(:lolcat) { Cascadence::Commander.new }
5
- context "public api" do
6
- describe "#flow" do
7
- let(:result) { lolcat.flow File.join(RSpec::FixturePath, "amazon", "madeira_flow.rb") }
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
- result.should_not be_empty
12
+ expect {@thorify.call @argv}.to raise_error StopIteration
10
13
  end
11
14
  end
12
- describe "#version" do
13
- let(:expected) { File.read File.expand_path("../../../VERSION", __FILE__) }
14
- let(:actual) { lolcat.version }
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
- describe "#generate" do
20
- it "should have tests" do
21
- pending "write tests here!"
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
- before :each do
15
- @tasks = 1.upto(7).map { |a| task.new }
16
- end
17
- context "public api" do
18
- describe "#run_tasks" do
19
- let(:doitfaggot) { runner.run_tasks @tasks }
20
- before(:each) { Cascadence.config.parallel = true }
21
- it "should be okay" do
22
- expect { doitfaggot }.not_to raise_error
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
- context "private" do
28
- describe "#_run_parallel" do
29
- let(:doitfaggot) { runner.send("_run_parallel", @tasks ) }
30
- it "should be okay" do
31
- expect { doitfaggot }.not_to raise_error
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.0
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-06 00:00:00.000000000 Z
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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