khronos 0.0.0 → 0.0.1.pre1

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