toro 0.0.1 → 0.0.2

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.
@@ -0,0 +1,9 @@
1
+ require 'rails/railtie'
2
+
3
+ module Toro
4
+ class Railtie < ::Rails::Railtie
5
+ rake_tasks do
6
+ load 'tasks/tasks.rb'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ DROP TABLE IF EXISTS toro_jobs CASCADE;
2
+
3
+ DROP FUNCTION IF EXISTS toro_notify() CASCADE;
4
+ DROP FUNCTION IF EXISTS toro_pop() CASCADE;
@@ -0,0 +1,68 @@
1
+ DO $$ BEGIN
2
+
3
+ CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
4
+ CREATE EXTENSION IF NOT EXISTS "hstore";
5
+
6
+ CREATE TABLE toro_jobs (
7
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
8
+ queue TEXT NOT NULL CHECK (LENGTH(queue) > 0),
9
+ class_name TEXT NOT NULL CHECK (LENGTH(class_name) > 0),
10
+ args TEXT NOT NULL,
11
+ name TEXT,
12
+ created_at TIMESTAMPTZ DEFAULT NOW(),
13
+ scheduled_at TIMESTAMPTZ,
14
+ started_at TIMESTAMPTZ,
15
+ finished_at TIMESTAMPTZ,
16
+ status TEXT NOT NULL CHECK (LENGTH(status) > 0),
17
+ started_by TEXT,
18
+ properties HSTORE
19
+ );
20
+
21
+ END $$ LANGUAGE plpgsql;
22
+
23
+ CREATE FUNCTION toro_notify() RETURNS TRIGGER AS $$ BEGIN
24
+ PERFORM pg_notify('toro_' || new.queue, '');
25
+ RETURN NULL;
26
+ END $$ LANGUAGE plpgsql;
27
+
28
+ CREATE TRIGGER toro_notify
29
+ AFTER INSERT ON toro_jobs
30
+ FOR EACH ROW
31
+ EXECUTE PROCEDURE toro_notify();
32
+
33
+ CREATE FUNCTION toro_pop(queues TEXT[], process_name TEXT) RETURNS toro_jobs AS $$
34
+ DECLARE
35
+ result toro_jobs;
36
+ BEGIN
37
+ WITH next_job AS (
38
+ SELECT
39
+ *
40
+ FROM
41
+ toro_jobs
42
+ WHERE
43
+ queue = ANY(queues)
44
+ AND (
45
+ status = 'queued'
46
+ OR
47
+ (status = 'scheduled' AND scheduled_at <= NOW())
48
+ )
49
+ ORDER BY
50
+ created_at ASC
51
+ LIMIT 1
52
+ )
53
+ UPDATE
54
+ toro_jobs
55
+ SET
56
+ status = 'running',
57
+ started_at = NOW(),
58
+ started_by = process_name
59
+ FROM
60
+ next_job
61
+ WHERE
62
+ toro_jobs.id = next_job.id
63
+ RETURNING
64
+ next_job.* INTO result;
65
+ RETURN result;
66
+ END $$ LANGUAGE plpgsql;
67
+
68
+ CREATE INDEX toro_jobs_queue_created_at_index ON toro_jobs (queue, created_at) WHERE status = 'queued' OR status = 'scheduled';
data/lib/toro/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Toro
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
@@ -0,0 +1,44 @@
1
+ module Toro
2
+ module Worker
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ end
6
+
7
+ module ClassMethods
8
+ def perform_async(*args)
9
+ create_job(args: args, queue: queue)
10
+ end
11
+
12
+ def perform_at(time, *args)
13
+ create_job(args: args, queue: queue, scheduled_at: time, status: 'scheduled')
14
+ end
15
+
16
+ def perform_in(interval, *args)
17
+ time = Time.now + interval
18
+ perform_at(time, *args)
19
+ end
20
+
21
+ def create_job(item)
22
+ Toro::Client.create_job(normalize_job(item))
23
+ end
24
+
25
+ def normalize_job(item)
26
+ name = respond_to?(:job_name) ? send(:job_name, *(item[:args])) : nil
27
+ { class_name: self.name, name: name }.merge(item)
28
+ end
29
+
30
+ def queue
31
+ toro_options[:queue]
32
+ end
33
+
34
+ def toro_options(options={})
35
+ @toro_options ||= {
36
+ queue: Toro.options[:default_queue],
37
+ retry_interval: nil
38
+ }
39
+ @toro_options.merge!(options)
40
+ @toro_options
41
+ end
42
+ end
43
+ end
44
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,16 +9,16 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-04-17 00:00:00.000000000 Z
12
+ date: 2014-04-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: activerecord
15
+ name: celluloid
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: '0'
21
+ version: 0.15.2
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,15 +26,15 @@ dependencies:
26
26
  requirements:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
- version: '0'
29
+ version: 0.15.2
30
30
  - !ruby/object:Gem::Dependency
31
- name: activesupport
31
+ name: rails
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  none: false
34
34
  requirements:
35
35
  - - ! '>='
36
36
  - !ruby/object:Gem::Version
37
- version: '0'
37
+ version: '3.0'
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,15 +42,15 @@ dependencies:
42
42
  requirements:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
- version: '0'
45
+ version: '3.0'
46
46
  - !ruby/object:Gem::Dependency
47
- name: celluloid
47
+ name: pg
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
51
51
  - - ! '>='
52
52
  - !ruby/object:Gem::Version
53
- version: 0.15.2
53
+ version: '0'
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,15 +58,15 @@ dependencies:
58
58
  requirements:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
- version: 0.15.2
61
+ version: '0'
62
62
  - !ruby/object:Gem::Dependency
63
- name: rails
63
+ name: nested-hstore
64
64
  requirement: !ruby/object:Gem::Requirement
65
65
  none: false
66
66
  requirements:
67
67
  - - ! '>='
68
68
  - !ruby/object:Gem::Version
69
- version: '3.0'
69
+ version: '0'
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -74,9 +74,9 @@ dependencies:
74
74
  requirements:
75
75
  - - ! '>='
76
76
  - !ruby/object:Gem::Version
77
- version: '3.0'
77
+ version: '0'
78
78
  - !ruby/object:Gem::Dependency
79
- name: pg
79
+ name: slim
80
80
  requirement: !ruby/object:Gem::Requirement
81
81
  none: false
82
82
  requirements:
@@ -92,7 +92,7 @@ dependencies:
92
92
  - !ruby/object:Gem::Version
93
93
  version: '0'
94
94
  - !ruby/object:Gem::Dependency
95
- name: nested-hstore
95
+ name: jquery-datatables-rails
96
96
  requirement: !ruby/object:Gem::Requirement
97
97
  none: false
98
98
  requirements:
@@ -108,14 +108,14 @@ dependencies:
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0'
110
110
  - !ruby/object:Gem::Dependency
111
- name: appraisal
111
+ name: rails-datatables
112
112
  requirement: !ruby/object:Gem::Requirement
113
113
  none: false
114
114
  requirements:
115
115
  - - ! '>='
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
- type: :development
118
+ type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  none: false
@@ -124,7 +124,7 @@ dependencies:
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
126
  - !ruby/object:Gem::Dependency
127
- name: rspec
127
+ name: appraisal
128
128
  requirement: !ruby/object:Gem::Requirement
129
129
  none: false
130
130
  requirements:
@@ -140,7 +140,7 @@ dependencies:
140
140
  - !ruby/object:Gem::Version
141
141
  version: '0'
142
142
  - !ruby/object:Gem::Dependency
143
- name: pry
143
+ name: rspec
144
144
  requirement: !ruby/object:Gem::Requirement
145
145
  none: false
146
146
  requirements:
@@ -155,14 +155,41 @@ dependencies:
155
155
  - - ! '>='
156
156
  - !ruby/object:Gem::Version
157
157
  version: '0'
158
- description: A robust queueing system
158
+ description: Full-featured background processing for Ruby & PostgreSQL
159
159
  email:
160
160
  - tombenner@gmail.com
161
161
  executables: []
162
162
  extensions: []
163
163
  extra_rdoc_files: []
164
164
  files:
165
+ - lib/generators/toro/install/install_generator.rb
166
+ - lib/generators/toro/install/templates/create_toro_jobs.rb
167
+ - lib/tasks/tasks.rb
168
+ - lib/toro/actor.rb
169
+ - lib/toro/actor_manager.rb
170
+ - lib/toro/cli.rb
171
+ - lib/toro/client.rb
172
+ - lib/toro/database.rb
173
+ - lib/toro/fetcher.rb
174
+ - lib/toro/job.rb
175
+ - lib/toro/listener.rb
176
+ - lib/toro/logging.rb
177
+ - lib/toro/manager.rb
178
+ - lib/toro/middleware/chain.rb
179
+ - lib/toro/middleware/server/error.rb
180
+ - lib/toro/middleware/server/error_storage.rb
181
+ - lib/toro/middleware/server/properties.rb
182
+ - lib/toro/middleware/server/retry.rb
183
+ - lib/toro/monitor/custom_views.rb
184
+ - lib/toro/monitor/engine.rb
185
+ - lib/toro/monitor/time_formatter.rb
186
+ - lib/toro/monitor.rb
187
+ - lib/toro/processor.rb
188
+ - lib/toro/railtie.rb
189
+ - lib/toro/sql/down.sql
190
+ - lib/toro/sql/up.sql
165
191
  - lib/toro/version.rb
192
+ - lib/toro/worker.rb
166
193
  - lib/toro.rb
167
194
  - MIT-LICENSE
168
195
  - Rakefile
@@ -191,5 +218,5 @@ rubyforge_project:
191
218
  rubygems_version: 1.8.24
192
219
  signing_key:
193
220
  specification_version: 3
194
- summary: A robust queueing system
221
+ summary: Full-featured background processing for Ruby & PostgreSQL
195
222
  test_files: []