khronos 0.0.0 → 0.0.1.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/.gitignore +1 -0
  2. data/.travis.yml +4 -0
  3. data/Gemfile +18 -7
  4. data/Rakefile +36 -0
  5. data/bin/khronos +2 -1
  6. data/config.ru +9 -1
  7. data/config/environment.yml +27 -5
  8. data/{lib/khronos/storage/adapter/mongo/.schedule_log.rb.un~ → db/test.db} +0 -0
  9. data/khronos.gemspec +10 -7
  10. data/lib/khronos.rb +4 -7
  11. data/lib/khronos/config.rb +0 -2
  12. data/lib/khronos/logger.rb +16 -0
  13. data/lib/khronos/scheduler.rb +17 -3
  14. data/lib/khronos/server.rb +4 -31
  15. data/lib/khronos/server/controller.rb +31 -0
  16. data/lib/khronos/server/runner.rb +50 -0
  17. data/lib/khronos/server/scheduler.rb +110 -0
  18. data/lib/khronos/storage.rb +34 -13
  19. data/lib/khronos/storage/adapter.rb +44 -0
  20. data/lib/khronos/storage/adapter/activerecord.rb +39 -0
  21. data/lib/khronos/storage/adapter/activerecord/migrations/schedule.rb +29 -0
  22. data/lib/khronos/storage/adapter/activerecord/migrations/schedule_log.rb +23 -0
  23. data/lib/khronos/storage/adapter/activerecord/schedule.rb +24 -0
  24. data/lib/khronos/storage/adapter/activerecord/schedule_log.rb +14 -0
  25. data/lib/khronos/storage/adapter/mongoid.rb +37 -0
  26. data/lib/khronos/storage/adapter/{mongo → mongoid}/schedule.rb +6 -4
  27. data/lib/khronos/storage/adapter/{mongo → mongoid}/schedule_log.rb +3 -4
  28. data/lib/khronos/tasks/db.rake +25 -0
  29. data/lib/khronos/version.rb +1 -1
  30. data/server.rb +29 -0
  31. data/spec/functional/adapters_spec.rb +61 -0
  32. data/spec/functional/controller_spec.rb +11 -0
  33. data/spec/functional/scheduler_spec.rb +30 -0
  34. data/spec/integration/runner_server_spec.rb +26 -0
  35. data/spec/integration/scheduler_server_spec.rb +70 -0
  36. data/spec/spec_helper.rb +17 -1
  37. data/spec/support/factories.rb +12 -0
  38. data/spec/support/mocks.rb +23 -0
  39. data/{lib/khronos/storage/adapter/postgres/.schedule.rb.un~ → spec/tmp/scheduler.db} +0 -0
  40. data/{lib/khronos/.version.rb.swp → spec/tmp/sqlite3.db} +0 -0
  41. metadata +92 -55
  42. data/config/.config.yml.un~ +0 -0
  43. data/config/.environment.yml.un~ +0 -0
  44. data/config/.redis.yml.un~ +0 -0
  45. data/config/.storage.yml.un~ +0 -0
  46. data/lib/.khronos.rb.un~ +0 -0
  47. data/lib/.scheduler.rb.un~ +0 -0
  48. data/lib/khronos/.config.rb.un~ +0 -0
  49. data/lib/khronos/.controller.rb.un~ +0 -0
  50. data/lib/khronos/.runner.rb.un~ +0 -0
  51. data/lib/khronos/.schedule.rb.un~ +0 -0
  52. data/lib/khronos/.scheduler.rb.un~ +0 -0
  53. data/lib/khronos/.server.rb.un~ +0 -0
  54. data/lib/khronos/.storage.rb.un~ +0 -0
  55. data/lib/khronos/.task.rb.un~ +0 -0
  56. data/lib/khronos/.version.rb.un~ +0 -0
  57. data/lib/khronos/controller.rb +0 -26
  58. data/lib/khronos/runner.rb +0 -11
  59. data/lib/khronos/storage/adapter/.client.rb.un~ +0 -0
  60. data/lib/khronos/storage/adapter/.memcached.rb.un~ +0 -0
  61. data/lib/khronos/storage/adapter/.mongo.rb.un~ +0 -0
  62. data/lib/khronos/storage/adapter/.mongodb.rb.un~ +0 -0
  63. data/lib/khronos/storage/adapter/.postgres.rb.un~ +0 -0
  64. data/lib/khronos/storage/adapter/.redis.rb.un~ +0 -0
  65. data/lib/khronos/storage/adapter/mongo.rb +0 -13
  66. data/lib/khronos/storage/adapter/mongo/.mongo.rb.un~ +0 -0
  67. data/lib/khronos/storage/adapter/mongo/.schedule.rb.un~ +0 -0
  68. data/lib/khronos/storage/adapter/postgres.rb +0 -15
  69. data/lib/khronos/storage/adapter/postgres/.schedule_log.rb.un~ +0 -0
  70. data/lib/khronos/storage/adapter/postgres/schedule.rb +0 -13
  71. data/lib/khronos/storage/adapter/postgres/schedule_log.rb +0 -13
  72. data/lib/khronos/storage/db/migrate/.schedule.rb.un~ +0 -0
  73. data/lib/khronos/storage/db/migrate/.schedule_log.rb.un~ +0 -0
  74. data/lib/khronos/storage/db/migrate/schedule.rb +0 -15
  75. data/lib/khronos/storage/db/migrate/schedule_log.rb +0 -16
  76. data/spec/.spec_helper.rb.un~ +0 -0
  77. data/spec/functional/.client_spec.rb.un~ +0 -0
  78. data/spec/functional/client_spec.rb +0 -24
  79. data/spec/integration/.server_spec.rb.un~ +0 -0
  80. data/spec/integration/server_spec.rb +0 -31
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe Khronos::Scheduler do
4
+ subject { Khronos::Scheduler }
5
+ let(:scheduler) { subject.new }
6
+
7
+ before(:all) do
8
+ ENV['KHRONOS_STORAGE'] = 'sqlite3://localhost/spec/tmp/scheduler.db'
9
+
10
+ @storage = Khronos::Storage.new
11
+ @storage.truncate!
12
+
13
+ load_factory_girl!
14
+ FactoryGirl.create(:schedule, :at => 1.minutes.from_now)
15
+ FactoryGirl.create(:schedule, :at => 5.minutes.from_now)
16
+ FactoryGirl.create(:schedule, :at => 10.minutes.from_now)
17
+ FactoryGirl.create(:schedule, :at => 30.minutes.from_now)
18
+ FactoryGirl.create(:schedule, :at => 60.minutes.from_now)
19
+ end
20
+
21
+ it "fetch schedules by time" do
22
+ scheduler.fetch(1.minutes.from_now).length.should == 1
23
+ scheduler.fetch(5.minutes.from_now).length.should == 2
24
+ scheduler.fetch(10.minutes.from_now).length.should == 3
25
+ scheduler.fetch(30.minutes.from_now).length.should == 4
26
+ scheduler.fetch(60.minutes.from_now).length.should == 5
27
+ end
28
+
29
+ end
30
+
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Khronos::Server::Runner do
4
+ subject { Khronos::Server::Runner }
5
+ let(:recurrency_check_url) { "http://localhost:8080/task?id=1" }
6
+ let(:task_url) { 'http://test.com' }
7
+
8
+ before(:each) do
9
+ Khronos::Server::Runner.any_instance.stub(:new)
10
+ Khronos::Server::Runner.any_instance.stub(:send_data)
11
+ Khronos::Server::Runner.any_instance.stub(:close_connection)
12
+
13
+ stub_request(:get, task_url).to_return(:body => 'it works!', :status => 200)
14
+ stub_request(:patch, recurrency_check_url).to_return(:status => 200, :body => "", :headers => {})
15
+ end
16
+
17
+ it "should run a task" do
18
+ runner = subject.new(nil)
19
+ EM.run_block do
20
+ runner.receive_data({:id => 1, :task_url => task_url, :recurrency => 0}.to_json)
21
+ end
22
+ a_request(:get, task_url).should have_been_made
23
+ a_request(:patch, recurrency_check_url).should have_been_made
24
+ end
25
+
26
+ end
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe Khronos::Server::Scheduler do
4
+ include Rack::Test::Methods
5
+
6
+ def app
7
+ Khronos::Server::Scheduler
8
+ end
9
+
10
+ it "should return 404 for invalid task requests" do
11
+ get('/task')
12
+ last_response.status.should == 404
13
+
14
+ get('/task', {:context => "invalid"})
15
+ last_response.status.should == 404
16
+
17
+ get('/task', {:id => 99})
18
+ last_response.status.should == 404
19
+ end
20
+
21
+ it "should schedule context to 1 week" do
22
+ post('/task', {
23
+ :context => "1-week-test",
24
+ :schedule => 1.week,
25
+ :at => Time.now,
26
+ :recurrency => 1.week,
27
+ :task_url => "http://fake"
28
+ })
29
+ last_response.status.should == 200
30
+ Khronos::Storage::Schedule.where(:context => "1-week-test").count.should == 1
31
+ end
32
+
33
+ it "should enqueue schedule to run immediatelly" do
34
+ mock_tcp_next_request("")
35
+ dummy_schedule = FactoryGirl.create(:schedule)
36
+ post('/task/run', :id => dummy_schedule.id)
37
+ last_response.status.should == 200
38
+ JSON.parse(last_response.body).should == {'queued' => true}
39
+ end
40
+
41
+ it "should update recurring time" do
42
+ dummy_schedule = FactoryGirl.create(:schedule, {
43
+ :at => Time.now,
44
+ :active => false,
45
+ :recurrency => 1.day
46
+ })
47
+ request('/task', :method => 'PATCH', :params => {:id => dummy_schedule.id})
48
+ schedule = Khronos::Storage::Schedule.find(dummy_schedule.id)
49
+ schedule.active.should == true
50
+ schedule.at.to_i.should == 1.day.from_now.to_i
51
+ end
52
+
53
+ it "should retrieve a list of schedules by context pattern" do
54
+ FactoryGirl.create(:schedule, {:context => "namespaced"})
55
+ FactoryGirl.create(:schedule, {:context => "namespaced:1"})
56
+ FactoryGirl.create(:schedule, {:context => "namespaced:2"})
57
+ FactoryGirl.create(:schedule, {:context => "namespaced:3"})
58
+ FactoryGirl.create(:schedule, {:context => "namespaced:4"})
59
+ FactoryGirl.create(:schedule, {:context => "namespaced:5"})
60
+
61
+ get('/tasks', {:context => "namespaced%"})
62
+ last_response.status.should == 200
63
+ JSON.parse(last_response.body).length.should == 6
64
+
65
+ get('/tasks', {:context => "namespaced"})
66
+ last_response.status.should == 200
67
+ JSON.parse(last_response.body).length.should == 1
68
+ end
69
+
70
+ end
@@ -13,6 +13,22 @@ require 'bundler/setup'
13
13
  require 'active_support/all'
14
14
  require 'rack/test'
15
15
  require 'delorean'
16
- require 'rspec'
16
+ require 'webmock/rspec'
17
17
 
18
+ require 'rspec'
18
19
  require 'khronos'
20
+
21
+ require 'factory_girl'
22
+ def load_factory_girl!
23
+ require File.expand_path('spec/support/factories')
24
+ end
25
+
26
+ # Support mocks
27
+ require File.expand_path('spec/support/mocks')
28
+
29
+ RSpec.configure do |config|
30
+ config.include FactoryGirl::Syntax::Methods
31
+ config.mock_with :rspec
32
+ end
33
+
34
+ Dir['spec/tmp/**'].each {|f| File.unlink(f) }
@@ -0,0 +1,12 @@
1
+ FactoryGirl.define do
2
+ factory :schedule, :class => Khronos::Storage::Schedule do
3
+ sequence(:context) { |i| "context#{i}" }
4
+ at { Time.now }
5
+ task_url "https://github.com/endel/khronos"
6
+ recurrency 0
7
+ end
8
+
9
+ factory :schedule_log, :class => Khronos::Storage::ScheduleLog do
10
+ association :schedule
11
+ end
12
+ end
@@ -0,0 +1,23 @@
1
+ require 'socket'
2
+ TCP_NEW = TCPSocket.method(:new) unless defined? TCP_NEW
3
+
4
+ #
5
+ # Example:
6
+ # mock_tcp_next_request("<xml>junk</xml>")
7
+ #
8
+ class FakeTCPSocket
9
+ def puts(*args); end
10
+ def closed?; true; end
11
+ def write(some_text = nil); end
12
+ end
13
+
14
+ def mock_tcp_next_request(string)
15
+ TCPSocket.stub!(:new).and_return {
16
+ cm = FakeTCPSocket.new
17
+ cm
18
+ }
19
+ end
20
+
21
+ def unmock_tcp
22
+ TCPSocket.stub!(:new).and_return { TCP_NEW.call }
23
+ end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: khronos
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
5
- prerelease:
4
+ version: 0.0.1.pre1
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Endel Dreyer
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-04 00:00:00.000000000 Z
12
+ date: 2012-09-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
@@ -43,6 +43,22 @@ dependencies:
43
43
  - - ~>
44
44
  - !ruby/object:Gem::Version
45
45
  version: 3.0.5
46
+ - !ruby/object:Gem::Dependency
47
+ name: bson_ext
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 1.6.4
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.6.4
46
62
  - !ruby/object:Gem::Dependency
47
63
  name: activerecord
48
64
  requirement: !ruby/object:Gem::Requirement
@@ -91,76 +107,92 @@ dependencies:
91
107
  - - ~>
92
108
  - !ruby/object:Gem::Version
93
109
  version: 3.2.8
94
- description: Advanced Cron replacement for the cloud.
110
+ - !ruby/object:Gem::Dependency
111
+ name: eventmachine
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 1.0.0.beta.4
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 1.0.0.beta.4
126
+ - !ruby/object:Gem::Dependency
127
+ name: em-http-request
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 1.0.3
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 1.0.3
142
+ description: Ruby HTTP Job Scheduler Interface. An advanced Cron replacement for the
143
+ cloud.
95
144
  email:
96
145
  - endel@ocapi.com.br
97
146
  executables: []
98
147
  extensions: []
99
148
  extra_rdoc_files: []
100
149
  files:
150
+ - .gitignore
101
151
  - .rspec
152
+ - .travis.yml
102
153
  - Gemfile
154
+ - Rakefile
103
155
  - bin/khronos
104
156
  - config.ru
105
- - config/.config.yml.un~
106
- - config/.environment.yml.un~
107
- - config/.redis.yml.un~
108
- - config/.storage.yml.un~
109
157
  - config/environment.yml
158
+ - db/test.db
110
159
  - khronos.gemspec
111
- - lib/.khronos.rb.un~
112
160
  - lib/.scheduler.rb.swp
113
- - lib/.scheduler.rb.un~
114
161
  - lib/khronos.rb
115
- - lib/khronos/.config.rb.un~
116
- - lib/khronos/.controller.rb.un~
117
- - lib/khronos/.runner.rb.un~
118
- - lib/khronos/.schedule.rb.un~
119
- - lib/khronos/.scheduler.rb.un~
120
- - lib/khronos/.server.rb.un~
121
- - lib/khronos/.storage.rb.un~
122
- - lib/khronos/.task.rb.un~
123
- - lib/khronos/.version.rb.swp
124
- - lib/khronos/.version.rb.un~
125
162
  - lib/khronos/config.rb
126
- - lib/khronos/controller.rb
127
- - lib/khronos/runner.rb
163
+ - lib/khronos/logger.rb
128
164
  - lib/khronos/scheduler.rb
129
165
  - lib/khronos/server.rb
166
+ - lib/khronos/server/controller.rb
167
+ - lib/khronos/server/runner.rb
168
+ - lib/khronos/server/scheduler.rb
130
169
  - lib/khronos/storage.rb
131
170
  - lib/khronos/storage/adapter.rb
132
- - lib/khronos/storage/adapter/.client.rb.un~
133
171
  - lib/khronos/storage/adapter/.memcached.rb.swp
134
- - lib/khronos/storage/adapter/.memcached.rb.un~
135
- - lib/khronos/storage/adapter/.mongo.rb.un~
136
172
  - lib/khronos/storage/adapter/.mongodb.rb.swp
137
- - lib/khronos/storage/adapter/.mongodb.rb.un~
138
- - lib/khronos/storage/adapter/.postgres.rb.un~
139
173
  - lib/khronos/storage/adapter/.redis.rb.swp
140
- - lib/khronos/storage/adapter/.redis.rb.un~
141
- - lib/khronos/storage/adapter/mongo.rb
142
- - lib/khronos/storage/adapter/mongo/.mongo.rb.un~
143
- - lib/khronos/storage/adapter/mongo/.schedule.rb.un~
144
- - lib/khronos/storage/adapter/mongo/.schedule_log.rb.un~
145
- - lib/khronos/storage/adapter/mongo/schedule.rb
146
- - lib/khronos/storage/adapter/mongo/schedule_log.rb
147
- - lib/khronos/storage/adapter/postgres.rb
148
- - lib/khronos/storage/adapter/postgres/.schedule.rb.un~
149
- - lib/khronos/storage/adapter/postgres/.schedule_log.rb.un~
150
- - lib/khronos/storage/adapter/postgres/schedule.rb
151
- - lib/khronos/storage/adapter/postgres/schedule_log.rb
152
- - lib/khronos/storage/db/migrate/.schedule.rb.un~
153
- - lib/khronos/storage/db/migrate/.schedule_log.rb.un~
154
- - lib/khronos/storage/db/migrate/schedule.rb
155
- - lib/khronos/storage/db/migrate/schedule_log.rb
174
+ - lib/khronos/storage/adapter/activerecord.rb
175
+ - lib/khronos/storage/adapter/activerecord/migrations/schedule.rb
176
+ - lib/khronos/storage/adapter/activerecord/migrations/schedule_log.rb
177
+ - lib/khronos/storage/adapter/activerecord/schedule.rb
178
+ - lib/khronos/storage/adapter/activerecord/schedule_log.rb
179
+ - lib/khronos/storage/adapter/mongoid.rb
180
+ - lib/khronos/storage/adapter/mongoid/schedule.rb
181
+ - lib/khronos/storage/adapter/mongoid/schedule_log.rb
182
+ - lib/khronos/tasks/db.rake
156
183
  - lib/khronos/version.rb
157
- - spec/.spec_helper.rb.un~
158
- - spec/functional/.client_spec.rb.un~
159
- - spec/functional/client_spec.rb
160
- - spec/integration/.server_spec.rb.un~
161
- - spec/integration/server_spec.rb
184
+ - server.rb
185
+ - spec/functional/adapters_spec.rb
186
+ - spec/functional/controller_spec.rb
187
+ - spec/functional/scheduler_spec.rb
188
+ - spec/integration/runner_server_spec.rb
189
+ - spec/integration/scheduler_server_spec.rb
162
190
  - spec/spec_helper.rb
163
- homepage: http://github.com/ocapi/scraper
191
+ - spec/support/factories.rb
192
+ - spec/support/mocks.rb
193
+ - spec/tmp/scheduler.db
194
+ - spec/tmp/sqlite3.db
195
+ homepage: http://github.com/ocapi/khronos
164
196
  licenses:
165
197
  - MIT
166
198
  post_install_message:
@@ -176,9 +208,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
176
208
  required_rubygems_version: !ruby/object:Gem::Requirement
177
209
  none: false
178
210
  requirements:
179
- - - ! '>='
211
+ - - ! '>'
180
212
  - !ruby/object:Gem::Version
181
- version: '0'
213
+ version: 1.3.1
182
214
  requirements: []
183
215
  rubyforge_project:
184
216
  rubygems_version: 1.8.24
@@ -186,9 +218,14 @@ signing_key:
186
218
  specification_version: 3
187
219
  summary: Ruby HTTP Job Scheduler Interface.
188
220
  test_files:
189
- - spec/functional/.client_spec.rb.un~
190
- - spec/functional/client_spec.rb
191
- - spec/integration/.server_spec.rb.un~
192
- - spec/integration/server_spec.rb
221
+ - spec/functional/adapters_spec.rb
222
+ - spec/functional/controller_spec.rb
223
+ - spec/functional/scheduler_spec.rb
224
+ - spec/integration/runner_server_spec.rb
225
+ - spec/integration/scheduler_server_spec.rb
193
226
  - spec/spec_helper.rb
227
+ - spec/support/factories.rb
228
+ - spec/support/mocks.rb
229
+ - spec/tmp/scheduler.db
230
+ - spec/tmp/sqlite3.db
194
231
  has_rdoc:
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,26 +0,0 @@
1
- module Khronos
2
- class Controller
3
- attr_reader :scheduler, :runner, :interval
4
-
5
- def initialize
6
- @runner = Runner.new
7
- @scheduler = Scheduler.new
8
- @scheduler.add_observer(@runner)
9
- end
10
-
11
- def start!
12
- loop do
13
- puts "Tick..."
14
-
15
- if rand(500) == 1
16
- puts "I'm so lucky!"
17
- end
18
-
19
- #
20
- # Sleep 'interval' seconds
21
- #
22
- sleep(Config.instance.interval)
23
- end
24
- end
25
- end
26
- end