iron_cuke 0.0.1

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/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ iron_cuke.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --debug
data/.rvmrc ADDED
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # This is an RVM Project .rvmrc file, used to automatically load the ruby
4
+ # development environment upon cd'ing into the directory
5
+
6
+ # First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
7
+ environment_id="ruby-1.9.2-p290@iron_cuke"
8
+
9
+ #
10
+ # First we attempt to load the desired environment directly from the environment
11
+ # file. This is very fast and efficient compared to running through the entire
12
+ # CLI and selector. If you want feedback on which environment was used then
13
+ # insert the word 'use' after --create as this triggers verbose mode.
14
+ #
15
+ if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
16
+ && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
17
+ then
18
+ \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
19
+
20
+ if [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]]
21
+ then
22
+ . "${rvm_path:-$HOME/.rvm}/hooks/after_use"
23
+ fi
24
+ else
25
+ # If the environment file has not yet been created, use the RVM CLI to select.
26
+ if ! rvm --create "$environment_id"
27
+ then
28
+ echo "Failed to create RVM environment '${environment_id}'."
29
+ fi
30
+ fi
31
+
32
+ #
33
+ # If you use an RVM gemset file to install a list of gems (*.gems), you can have
34
+ # it be automatically loaded. Uncomment the following and adjust the filename if
35
+ # necessary.
36
+ #
37
+ # filename=".gems"
38
+ # if [[ -s "$filename" ]] ; then
39
+ # rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
40
+ # fi
41
+
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "http://rubygems.org"
2
+
3
+ #workaround for not being able to specify a require in my gemspec
4
+ gem 'ruby-debug19', :require => 'ruby-debug'
5
+
6
+ # Specify your gem's dependencies in cuke-iron-worker.gemspec
7
+ gemspec
data/License.txt ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (C) 2012 Yosem Sweet
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
data/README ADDED
@@ -0,0 +1,34 @@
1
+ Development Notes and Todos:
2
+
3
+ Needs to work with cucumber and rspec
4
+
5
+ Notes
6
+ Run jobs locally
7
+ We don't need to run them asynchronously although it is awesome if they are.
8
+ Scheduled events should fire when the timecop time says they should
9
+ Initial pass can have a cucumber step for all jobs complete - this should not stick around for long though. ALternative is to have the ScheduledWorkerQueue run after every step
10
+ Rspec integration test not needed, just unit test
11
+
12
+ Basic model
13
+
14
+ IronCuke module encapsulates access to ScheduledWorkerQueue
15
+
16
+ Scheduled Workers:
17
+ ScheduledWorkerQueue - A hash where each worker is keyed by the time they run.
18
+ Functions
19
+ run - runs all workers before current time (should this be run_with_time?)
20
+ schedule - takes a worker and schedule parameters (equivalent to IronWorker service). Adds the worker into the hash at time. returns an array response equivalent to posting to iron worker. The response includes a scheduled_task_id identifying the scheduled worker
21
+ cancel - takes scheduled_task_id and removes from schedule
22
+
23
+ Workers
24
+ stub worker.schedule to write to scheduled workers
25
+ stub IronWorker.service.cancel_schedule to delegate to ScheduledWorkerQueue
26
+
27
+ ## Contribute
28
+ * Fork the project.
29
+ * Test drive your feature addition or bug fix. Specs make all the difference here.
30
+ * Commit, do not mess with Rakefile, version, or ChangeLog.
31
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
32
+ * Send me a pull request. Bonus points for topic branches.
33
+
34
+ Gem developed by Yosem Sweet and released (whenever that is) under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task default: :spec
data/TODO.md ADDED
@@ -0,0 +1,7 @@
1
+ * Create specs for QueueItems - easy
2
+ * Create specs for ScheduledQueue - easy
3
+ * Support schedule options of: - medium
4
+ ** run_times > 1
5
+ ** every x period
6
+ * Instead of creating a bunch of mixins we should implement an IronWorker::TestService and have IronWorker.service return that. - hard
7
+ * Create a more dynamic response system. Right now it is basically just hardcoded. - easy
data/iron_cuke.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "iron_cuke/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "iron_cuke"
7
+ s.version = IronCuke::VERSION
8
+ s.authors = ["Yosem Sweet"]
9
+ s.email = ["yosem.sweet@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{A small engine to help you mock out iron worker while using cucumber}
12
+ s.description = %q{iron_cuke provides a set of steps and Cucumber world objects you can use to simulate IronWorker while running cucumber tests.}
13
+
14
+ s.rubyforge_project = "iron_cuke"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_dependency "iron_worker"
23
+ s.add_dependency "cucumber", ">=0.8"
24
+ s.add_dependency "json"
25
+
26
+ s.add_development_dependency "require_all"
27
+ s.add_development_dependency "rack"
28
+ s.add_development_dependency "bundler"
29
+ s.add_development_dependency "git"
30
+ s.add_development_dependency "rspec-rails", "~>2.8.0"
31
+ s.add_development_dependency "rails", "~>3.1.0"
32
+ s.add_development_dependency "cucumber-rails"
33
+ s.add_development_dependency "ruby-debug19"
34
+ end
@@ -0,0 +1,10 @@
1
+ require 'digest/md5'
2
+
3
+ class QueueItem
4
+ attr_reader :worker, :options, :id
5
+ def initialize(worker, options)
6
+ @worker = worker
7
+ @options = options
8
+ @id = Digest::MD5.hexdigest(self.worker.inspect + self.options.inspect)
9
+ end
10
+ end
@@ -0,0 +1,43 @@
1
+ require "iron_cuke/queue_item"
2
+
3
+ module ScheduledQueue
4
+
5
+ def schedules
6
+ scheduled_queue.values.map { |scheduled| scheduled.map { |data| data.worker } }.flatten
7
+ end
8
+
9
+ def schedule(worker, schedule_options)
10
+ Raise NotImplementedError if schedule_options[:run_times] > 1
11
+
12
+ scheduled_queue[schedule_options[:start_at]] ||= []
13
+ item = QueueItem.new(worker, schedule_options)
14
+ scheduled_queue[schedule_options[:start_at]] << item
15
+ response = create_response(item)
16
+ end
17
+
18
+ def cancel_schedule(scheduled_task_id)
19
+ Raise NotImplementedError
20
+ end
21
+
22
+ def clear
23
+ scheduled_queue.clear
24
+ end
25
+
26
+ protected
27
+
28
+ def scheduled_queue
29
+ @scheduled_queue ||= Hash.new
30
+ end
31
+
32
+ def create_response(item)
33
+ {
34
+ "msg" => "Scheduled",
35
+ "schedules" => [
36
+ {
37
+ "id" => item.id
38
+ }
39
+ ],
40
+ "status_code" => 200
41
+ }
42
+ end
43
+ end
@@ -0,0 +1,22 @@
1
+ require "iron_cuke"
2
+ require "base64"
3
+ require "json"
4
+
5
+ module IronWorker
6
+ class Base
7
+ def upload_if_needed(options) :uploaded_successfully end
8
+ end
9
+
10
+ module TestService
11
+ module Schedule
12
+ def schedule(name, data, options)
13
+ worker = name.classify.constantize.new
14
+ variables = JSON.parse(Base64.decode64(data[:attr_encoded])) if data[:attr_encoded].present?
15
+ variables.each do |k, v|
16
+ worker.instance_variable_set(k.to_sym, v)
17
+ end
18
+ IronCuke.schedule(worker, options)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,3 @@
1
+ module IronCuke
2
+ VERSION = "0.0.1"
3
+ end
data/lib/iron_cuke.rb ADDED
@@ -0,0 +1,21 @@
1
+ require "iron_cuke/version"
2
+ require "iron_cuke/scheduled_queue"
3
+ require "iron_cuke/test_service"
4
+
5
+
6
+ module IronCuke
7
+ extend ScheduledQueue
8
+
9
+ def self.run(time = nil)
10
+ time ||= Time.now
11
+ to_execute = scheduled_queue.keys.select { |run_at| run_at <= time }
12
+ to_execute.each do |k|
13
+ begin
14
+ scheduled_queue[k].each { |data| data.worker.run_local }
15
+ scheduled_queue.delete(k)
16
+ rescue Exception => e
17
+ puts e
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+
3
+ describe IronCuke do
4
+ it { should respond_to(:run) }
5
+
6
+ it { should respond_to(:schedule).with(2).arguments }
7
+ it { should respond_to(:schedules) }
8
+ it { should respond_to(:cancel_schedule).with(1).argument }
9
+
10
+ context "::schedule" do
11
+ after(:each) do
12
+ IronCuke.clear
13
+ end
14
+
15
+ context "with start_at and run_once schedule options" do
16
+ it "should add a worker to schedules" do
17
+ worker = TestWorker.new
18
+
19
+ expect {
20
+ IronCuke.schedule(worker, {:start_at => Time.now + 1.year, :run_times => 1})
21
+ }.to change{IronCuke.schedules.count}.by(1)
22
+ end
23
+
24
+ it "should return a response hash include status_code and list of scheduled_ids" do
25
+ worker = TestWorker.new
26
+ response = IronCuke.schedule(worker, {:start_at => Time.now, :run_times => 1})
27
+ response.should have_key "status_code"
28
+ response.should have_key "schedules"
29
+ response["schedules"].each do |s| s.should have_key "id" end
30
+ end
31
+ end
32
+
33
+ context "scheduling two workers at the same time" do
34
+ it "should schedule them both" do
35
+ worker_one, worker_two = [TestWorker.new, TestWorker.new]
36
+ time = Time.now
37
+ expect {
38
+ IronCuke.schedule(worker_one, {:start_at => time, :run_times => 1})
39
+ IronCuke.schedule(worker_two, {:start_at => time, :run_times => 1})
40
+ }.to change{IronCuke.schedules.count}.by(2)
41
+ end
42
+ end
43
+ end
44
+
45
+ context "::schedules" do
46
+ after(:each) do
47
+ IronCuke.clear
48
+ end
49
+
50
+ it "should return all scheduled workers" do
51
+ workers = [TestWorker.new, TestWorker.new, TestWorker.new]
52
+ workers.each do |w|
53
+ IronCuke.schedule(w, {:start_at => Time.now + 1.year, :run_times => 1})
54
+ end
55
+
56
+ scheduled = IronCuke.schedules
57
+ workers.each do |w|
58
+ scheduled.should include w
59
+ end
60
+ end
61
+ end
62
+
63
+ context "::run" do
64
+ let(:current_time) { Time.now }
65
+ before(:each) do
66
+ @past_worker = TestWorker.new
67
+ @present_worker = TestWorker.new
68
+ @future_worker = TestWorker.new
69
+
70
+ IronCuke.schedule(@past_worker, {:start_at => current_time - 1.second, :run_times => 1})
71
+ IronCuke.schedule(@present_worker, {:start_at => current_time, :run_times => 1})
72
+ IronCuke.schedule(@future_worker, {:start_at => current_time + 1.second, :run_times => 1})
73
+ end
74
+
75
+ after(:each) do
76
+ IronCuke.clear
77
+ end
78
+
79
+ it "should call run for each worker with a start at time before Time.now" do
80
+ @past_worker.should_receive(:run_local)
81
+ @present_worker.should_receive(:run_local)
82
+ IronCuke.run(current_time)
83
+ end
84
+
85
+ it "should call run for each worker with a start at time before Time.now" do
86
+ @future_worker.should_not_receive(:run_local)
87
+ IronCuke.run(current_time)
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,8 @@
1
+ require 'rubygems'
2
+ require 'active_support/core_ext'
3
+ require 'ruby-debug' unless ENV["CI"]
4
+
5
+ Dir[File.dirname(__FILE__) + ("/support/**/*.rb")].each {|f| require f}
6
+
7
+ require "require_all"
8
+ require_all "lib"
@@ -0,0 +1,15 @@
1
+ require "iron_worker"
2
+
3
+ class TestWorker < IronWorker::Base
4
+ attr_reader :foo
5
+
6
+ def initialize()
7
+ @foo = "bar"
8
+ end
9
+
10
+ def run
11
+ log = Logger.new("iron_cuke.log", 1, 10240)
12
+ log.info "Test worker run " + self.inspect
13
+ end
14
+
15
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ IronWorker.configure do |config|
4
+ config.token = 'IRON_WORKER_TOKEN'
5
+ config.project_id = 'IRON_WORKER_PROJECT_ID'
6
+ end
7
+
8
+ IronWorker.service.instance_eval do
9
+ extend IronWorker::TestService::Schedule
10
+ end
11
+
12
+ describe "IronWorker::Base.schedule" do
13
+ let!(:worker) { TestWorker.new }
14
+
15
+ it "should add the worker to IronCuke.schedules" do
16
+ expect {
17
+ worker.schedule(:start_at => Time.now, :run_times => 1)
18
+ }.to change{IronCuke.schedules.count}.by(1)
19
+ end
20
+
21
+ it "should set worker.response" do
22
+ pending "There is a bug in IronWorker::Base where the response isn't set"
23
+ expect {
24
+ worker.schedule(:start_at => Time.now, :run_times => 1)
25
+ }.to change{worker.response}
26
+ end
27
+
28
+ it "should set worker.schedule_id" do
29
+ expect {
30
+ worker.schedule(:start_at => Time.now, :run_times => 1)
31
+ }.to change{worker.schedule_id}
32
+ end
33
+
34
+ end
metadata ADDED
@@ -0,0 +1,189 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: iron_cuke
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Yosem Sweet
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-02 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: iron_worker
16
+ requirement: &2156828920 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2156828920
25
+ - !ruby/object:Gem::Dependency
26
+ name: cucumber
27
+ requirement: &2156828120 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0.8'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *2156828120
36
+ - !ruby/object:Gem::Dependency
37
+ name: json
38
+ requirement: &2156827300 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *2156827300
47
+ - !ruby/object:Gem::Dependency
48
+ name: require_all
49
+ requirement: &2156826840 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *2156826840
58
+ - !ruby/object:Gem::Dependency
59
+ name: rack
60
+ requirement: &2156826320 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *2156826320
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: &2156825600 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *2156825600
80
+ - !ruby/object:Gem::Dependency
81
+ name: git
82
+ requirement: &2156824700 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *2156824700
91
+ - !ruby/object:Gem::Dependency
92
+ name: rspec-rails
93
+ requirement: &2156823500 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ~>
97
+ - !ruby/object:Gem::Version
98
+ version: 2.8.0
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *2156823500
102
+ - !ruby/object:Gem::Dependency
103
+ name: rails
104
+ requirement: &2156823000 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 3.1.0
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *2156823000
113
+ - !ruby/object:Gem::Dependency
114
+ name: cucumber-rails
115
+ requirement: &2156822620 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: *2156822620
124
+ - !ruby/object:Gem::Dependency
125
+ name: ruby-debug19
126
+ requirement: &2156808760 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: *2156808760
135
+ description: iron_cuke provides a set of steps and Cucumber world objects you can
136
+ use to simulate IronWorker while running cucumber tests.
137
+ email:
138
+ - yosem.sweet@gmail.com
139
+ executables: []
140
+ extensions: []
141
+ extra_rdoc_files: []
142
+ files:
143
+ - .gitignore
144
+ - .rspec
145
+ - .rvmrc
146
+ - Gemfile
147
+ - License.txt
148
+ - README
149
+ - Rakefile
150
+ - TODO.md
151
+ - iron_cuke.gemspec
152
+ - lib/iron_cuke.rb
153
+ - lib/iron_cuke/queue_item.rb
154
+ - lib/iron_cuke/scheduled_queue.rb
155
+ - lib/iron_cuke/test_service.rb
156
+ - lib/iron_cuke/version.rb
157
+ - spec/lib/iron_cuke_spec.rb
158
+ - spec/spec_helper.rb
159
+ - spec/support/test_worker.rb
160
+ - spec/worker_integration/schedule_spec.rb
161
+ homepage: ''
162
+ licenses: []
163
+ post_install_message:
164
+ rdoc_options: []
165
+ require_paths:
166
+ - lib
167
+ required_ruby_version: !ruby/object:Gem::Requirement
168
+ none: false
169
+ requirements:
170
+ - - ! '>='
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ required_rubygems_version: !ruby/object:Gem::Requirement
174
+ none: false
175
+ requirements:
176
+ - - ! '>='
177
+ - !ruby/object:Gem::Version
178
+ version: '0'
179
+ requirements: []
180
+ rubyforge_project: iron_cuke
181
+ rubygems_version: 1.8.11
182
+ signing_key:
183
+ specification_version: 3
184
+ summary: A small engine to help you mock out iron worker while using cucumber
185
+ test_files:
186
+ - spec/lib/iron_cuke_spec.rb
187
+ - spec/spec_helper.rb
188
+ - spec/support/test_worker.rb
189
+ - spec/worker_integration/schedule_spec.rb