iron_cuke 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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