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