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
@@ -1,26 +1,47 @@
1
- require 'delegate'
2
1
  require 'uri'
3
2
 
4
3
  module Khronos
5
- class Storage < Delegator
6
- attr_reader :uri, :adapter
4
+ class Storage
5
+ autoload :Adapter, 'khronos/storage/adapter'
7
6
 
8
- def initialize(url=ENV['KHRONOS_STORAGE'])
9
- unless url.nil?
10
- @uri = URI.parse(url)
7
+ def initialize(uri=ENV['KHRONOS_STORAGE'])
8
+ raise RuntimeError.new("Please configure 'KHRONOS_STORAGE' on your environment variables.") if uri.nil?
11
9
 
12
- require "khronos/adapter/#{@uri.scheme}"
13
- __setobj__(Adapter.const_get(@uri.scheme.capitalize).new(@uri))
14
- end
10
+ @adapter = Adapter.get(uri)
11
+ self.migrate! if @adapter.name =~ /ActiveRecord/
12
+ self.class.send(:include, @adapter)
15
13
  end
16
14
 
17
- def __getobj__
18
- @adapter
15
+ def logger=(logger)
16
+ #
17
+ # Change logger current adapter's logger
18
+ #
19
+ raise NotImplementedMethod
19
20
  end
20
21
 
21
- def __setobj__(adapter)
22
- @adapter = adapter
22
+ def truncate!
23
+ Schedule.delete_all
24
+ ScheduleLog.delete_all
23
25
  end
24
26
 
27
+ protected
28
+
29
+ def migrate!
30
+ require 'khronos/storage/adapter/activerecord/migrations/schedule'
31
+ require 'khronos/storage/adapter/activerecord/migrations/schedule_log'
32
+
33
+ unless ActiveRecord::Base.connection.table_exists?(:schedules)
34
+ Adapter::ActiveRecord::CreateSchedule.up
35
+ else
36
+ Logger.debug "Schedules table already exists."
37
+ end
38
+
39
+ unless ActiveRecord::Base.connection.table_exists?(:schedule_logs)
40
+ Adapter::ActiveRecord::CreateScheduleLog.up
41
+ else
42
+ Logger.debug "ScheduleLog table already exists."
43
+ end
44
+ end
45
+
25
46
  end
26
47
  end
@@ -0,0 +1,44 @@
1
+ module Khronos
2
+ class Storage
3
+ module Adapter
4
+ @frameworks = {
5
+ 'mongodb' => 'mongoid',
6
+ 'postgresql' => 'activerecord',
7
+ 'mysql2' => 'activerecord',
8
+ 'sqlite3' => 'activerecord'
9
+ }
10
+ @classes = {
11
+ 'activerecord' => 'ActiveRecord',
12
+ 'mongoid' => 'Mongoid'
13
+ }
14
+ @adapters = {
15
+ 'mongodb' => 'mongoid'
16
+ }
17
+
18
+ def self.parse_uri(uri)
19
+ data = URI.parse(uri)
20
+ {
21
+ :scheme => data.scheme,
22
+ :host => data.host,
23
+ :user => data.user,
24
+ :password => data.password,
25
+ :path => data.path
26
+ }
27
+ end
28
+
29
+ def self.get(url)
30
+ uri = parse_uri(url)
31
+ framework = @frameworks[uri[:scheme]]
32
+
33
+ require "khronos/storage/adapter/#{framework}"
34
+
35
+ # Get and connect with the adapter class.
36
+ adapter = const_get(@classes[framework])
37
+
38
+ # uri.merge(:adapter => @adapters[uri[:scheme]] || uri[:scheme])
39
+ adapter.connect!(url)
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,39 @@
1
+ require 'active_record'
2
+
3
+ module Khronos
4
+ class Storage
5
+ module Adapter
6
+
7
+ module ActiveRecord
8
+ autoload :Schedule, 'khronos/storage/adapter/activerecord/schedule'
9
+ autoload :ScheduleLog, 'khronos/storage/adapter/activerecord/schedule_log'
10
+
11
+ def self.connect!(url)
12
+ puts "Connect! => #{url.inspect}"
13
+ if File.exists?("config/database.yml")
14
+ ::ActiveRecord::Base.establish_connection(YAML.load_file("config/database.yml")[ENV['RACK_ENV']])
15
+ else
16
+ ::ActiveRecord::Base.establish_connection(url)
17
+ end
18
+
19
+ #
20
+ # ::ActiveRecord::Base.logger = ::Logger.new(STDOUT)
21
+ #
22
+ self
23
+ end
24
+
25
+ def self.included(base)
26
+ #puts "included in #{base}"
27
+ end
28
+
29
+ def self.extended(base)
30
+ #puts "extended in #{base.inspect}"
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+
39
+
@@ -0,0 +1,29 @@
1
+ module Khronos
2
+ class Storage
3
+ module Adapter
4
+ module ActiveRecord
5
+
6
+ class CreateSchedule < ::ActiveRecord::Migration
7
+ def self.up
8
+ create_table :schedules do |t|
9
+ t.string :context, :null => false, :limit => 100
10
+ t.datetime :at, :null => false
11
+ t.string :task_url, :null => false
12
+ t.integer :recurrency, :null => false
13
+ t.string :callbacks, :null => true, :limit => 500
14
+ t.boolean :active, :null => false, :default => true
15
+ end
16
+
17
+ add_index :schedules, :at
18
+ add_index :schedules, :context
19
+ end
20
+
21
+ def self.down
22
+ drop_table :schedules
23
+ end
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ module Khronos
2
+ class Storage
3
+ module Adapter
4
+ module ActiveRecord
5
+
6
+ class CreateScheduleLog < ::ActiveRecord::Migration
7
+ def self.up
8
+ create_table :schedule_logs do |t|
9
+ t.integer :schedule_id, :null => false
10
+ t.datetime :started_at, :null => false
11
+ t.datetime :finished_at, :null => true
12
+ end
13
+ end
14
+
15
+ def self.down
16
+ drop_table :schedule_logs
17
+ end
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ require 'json'
2
+
3
+ module Khronos
4
+ class Storage
5
+ module Adapter
6
+
7
+ module ActiveRecord
8
+ class Schedule < ::ActiveRecord::Base
9
+ attr_accessible :context, :at, :recurrency, :task_url, :callbacks, :active
10
+ has_many :logs, :class_name => ScheduleLog
11
+
12
+ def callbacks=(options)
13
+ write_attribute(:callbacks, options.to_json)
14
+ end
15
+
16
+ def callbacks
17
+ JSON.parse(read_attribute(:callbacks) || '{}')
18
+ end
19
+ end
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ module Khronos
2
+ class Storage
3
+ module Adapter
4
+
5
+ module ActiveRecord
6
+ class ScheduleLog < ::ActiveRecord::Base
7
+ attr_accessible :schedule_id, :started_at, :finished_at
8
+ belongs_to :schedule
9
+ end
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,37 @@
1
+ require 'mongoid'
2
+ require 'mongo'
3
+
4
+ module Khronos
5
+ class Storage
6
+ module Adapter
7
+
8
+ module Mongoid
9
+ autoload :Schedule, 'khronos/storage/adapter/mongoid/schedule'
10
+ autoload :ScheduleLog, 'khronos/storage/adapter/mongoid/schedule_log'
11
+
12
+ def self.connect!(uri)
13
+ if File.exists?("config/mongoid.yml")
14
+ ::Mongoid.load!("config/mongoid.yml")
15
+ else
16
+ ::Mongoid.configure do |config|
17
+ config.connect_to uri[:host][1..-1]
18
+ end
19
+ end
20
+
21
+ self
22
+ end
23
+
24
+ def self.included(base)
25
+ #puts "included in #{base}"
26
+ end
27
+
28
+ def self.extended(base)
29
+ #puts "extended in #{base.inspect}"
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+ end
36
+ end
37
+
@@ -1,15 +1,17 @@
1
1
  module Khronos
2
- module Storage
2
+ class Storage
3
3
  module Adapter
4
4
 
5
- module Mongo
5
+ module Mongoid
6
6
  class Schedule
7
- include Mongoid::Document
7
+ include ::Mongoid::Document
8
8
 
9
9
  field :namespace, :type => String
10
10
  field :context, :type => String
11
11
  field :at, :type => DateTime
12
- field :recurring, :type => Integer
12
+ field :recurrency, :type => Integer
13
+ field :callbacks, :type => Hash
14
+ field :active, :type => Boolean
13
15
 
14
16
  has_many :logs, :class_name => ScheduleLog
15
17
  end
@@ -1,11 +1,10 @@
1
-
2
1
  module Khronos
3
- module Storage
2
+ class Storage
4
3
  module Adapter
5
4
 
6
- module Mongo
5
+ module Mongoid
7
6
  class ScheduleLog
8
- include Mongoid::Document
7
+ include ::Mongoid::Document
9
8
 
10
9
  field :started_at, :type => DateTime
11
10
  field :finished_at, :type => DateTime
@@ -0,0 +1,25 @@
1
+ require 'khronos/storage/adapter/activerecord/migrations/schedule'
2
+ require 'khronos/storage/adapter/activerecord/migrations/schedule_log'
3
+
4
+ namespace :db do
5
+
6
+ desc 'Create the database.'
7
+ task :create do
8
+ adapter = Khronos::Storage::Adapter.get(ENV['KHRONOS_STORAGE'])
9
+ if adapter.name =~ /ActiveRecord/
10
+ CreateSchedule.up
11
+ CreateScheduleLog.up
12
+ end
13
+ end
14
+
15
+ desc 'Destroy entire database.'
16
+ task :drop do
17
+ adapter = Khronos::Storage::Adapter.get(ENV['KHRONOS_STORAGE'])
18
+ if adapter.name =~ /ActiveRecord/
19
+ CreateSchedule.down
20
+ CreateScheduleLog.down
21
+ end
22
+ end
23
+
24
+ end
25
+
@@ -1,3 +1,3 @@
1
1
  module Khronos
2
- VERSION = '0.0.0'
2
+ VERSION = '0.0.1.pre1'
3
3
  end
@@ -0,0 +1,29 @@
1
+ $: << 'lib'
2
+ ENV['RACK_ENV'] = 'development'
3
+
4
+ require 'rubygems'
5
+ require 'bundler/setup'
6
+ require 'active_support/all'
7
+ require 'khronos'
8
+
9
+ #controller = Khronos::Controller.new
10
+ #controller.start!
11
+
12
+ case ARGV[0]
13
+ when 'runner'
14
+ puts "Running: Runner."
15
+
16
+ require 'khronos/server/runner'
17
+ EventMachine.run {
18
+ EventMachine.start_server Khronos::Config.instance.runner['host'], Khronos::Config.instance.runner['port'], Khronos::Server::Runner
19
+ }
20
+
21
+ when 'scheduler'
22
+ puts "Running: Scheduler."
23
+ run Khronos::Server::Scheduler
24
+
25
+ when 'controller'
26
+ controller = Khronos::Controller.new
27
+ controller.start!
28
+
29
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe Khronos::Storage do
4
+ subject { Khronos::Storage }
5
+
6
+ describe Khronos::Storage::Adapter do
7
+
8
+ it "should identify activerecord adapter for postgres" do
9
+ client = subject.new('postgresql://localhost:5432/khronos')
10
+ Khronos::Storage::Schedule.should == Khronos::Storage::Adapter::ActiveRecord::Schedule
11
+ Khronos::Storage::ScheduleLog.should == Khronos::Storage::Adapter::ActiveRecord::ScheduleLog
12
+ Khronos::Storage::Schedule.create({
13
+ :context => "test:dummy",
14
+ :task_url => "http://some-service.com/task",
15
+ :at => Time.now,
16
+ :recurrency => 1.day
17
+ })
18
+ Khronos::Storage::Schedule.last.task_url.should == "http://some-service.com/task"
19
+ end
20
+
21
+ xit "should identify activerecord adapter for mysql" do
22
+ client = subject.new('mysql2://localhost:3306/khronos')
23
+ Khronos::Storage::Schedule.should == Khronos::Storage::Adapter::ActiveRecord::Schedule
24
+ Khronos::Storage::ScheduleLog.should == Khronos::Storage::Adapter::ActiveRecord::ScheduleLog
25
+ Khronos::Storage::Schedule.create({
26
+ :context => "test:dummy",
27
+ :task_url => "http://some-service.com/task",
28
+ :at => Time.now,
29
+ :recurrency => 1.day
30
+ })
31
+ Khronos::Storage::Schedule.last.task_url.should == "http://some-service.com/task"
32
+ end
33
+
34
+ it "should identify activerecord adapter for sqlite3" do
35
+ client = subject.new('sqlite3://localhost/spec/tmp/sqlite3.db')
36
+ Khronos::Storage::Schedule.should == Khronos::Storage::Adapter::ActiveRecord::Schedule
37
+ Khronos::Storage::ScheduleLog.should == Khronos::Storage::Adapter::ActiveRecord::ScheduleLog
38
+ Khronos::Storage::Schedule.create({
39
+ :context => "test:dummy",
40
+ :task_url => "http://some-service.com/task",
41
+ :at => Time.now,
42
+ :recurrency => 1.day
43
+ })
44
+ Khronos::Storage::Schedule.last.task_url.should == "http://some-service.com/task"
45
+ end
46
+
47
+ xit "should identify mongodb adapter" do
48
+ client = subject.new('mongodb://127.0.0.1:6379/test')
49
+ Khronos::Storage::Schedule.should == Khronos::Storage::Adapter::Mongoid::Schedule
50
+ Khronos::Storage::ScheduleLog.should == Khronos::Storage::Adapter::Mongoid::ScheduleLog
51
+ Khronos::Storage::Schedule.create({
52
+ :context => "test:dummy",
53
+ :task_url => "http://some-service.com/task",
54
+ :at => Time.now,
55
+ :recurrency => 1.day
56
+ })
57
+ Khronos::Storage::Schedule.last.task_url.should == "http://some-service.com/task"
58
+ end
59
+
60
+ end
61
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Khronos::Server::Controller do
4
+ let(:controller) { Khronos::Server::Controller.new }
5
+
6
+ it "should retrieve" do
7
+ #controller.
8
+ end
9
+
10
+ end
11
+