disc 0.0.1

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 (6) hide show
  1. checksums.yaml +7 -0
  2. data/Makefile +8 -0
  3. data/README.md +46 -0
  4. data/disc.gemspec +17 -0
  5. data/lib/disc.rb +108 -0
  6. metadata +104 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 212532c0e53da43e758379c93d9af4a619df7804
4
+ data.tar.gz: 1f9cb86e8408906a3cdb4a8488a8c48f9e33315f
5
+ SHA512:
6
+ metadata.gz: 95c97856b2ad9e78c1b49730d8dde8fd639abd969fdea4e3062bb5d177df3b98b441ba469aafa54c793dae8a8a9eeab12ba113bc5cc951d5f34e3eb5282a8a23
7
+ data.tar.gz: 1b2ec20719f8cb13631bf3eb3502b02fc7d2f77d73d8d79f97b01f504182523c8c023eeffebe86fe567b49a11b980081c982832f370b3e40c8cc69ba18a7a8aa
@@ -0,0 +1,8 @@
1
+
2
+ console:
3
+ @irb -r ./lib/disc
4
+
5
+ test:
6
+ @cutest -r ./test/*_test.rb #./test/*/*_test.rb
7
+
8
+ .PHONY: test
@@ -0,0 +1,46 @@
1
+ # Disc
2
+
3
+ Disc allows you to easily leverage [antirez](http://antirez.com/)'s wonderful [Disque](https://github.com/antirez/disque) from your Ruby applications, filling the gap between your service objects and Disque.
4
+
5
+ ## Usage
6
+
7
+ 1. Install the gem
8
+
9
+ ```bash
10
+ $ gem install disc
11
+ ```
12
+
13
+ 2. Write your jobs
14
+
15
+ ```ruby
16
+ requie 'disc'
17
+
18
+ class CreateGameGrid
19
+ include Disque::Job
20
+ queue :urgent
21
+
22
+ def perform(type)
23
+ # perform rather lengthy operations here.
24
+ end
25
+ end
26
+ ```
27
+
28
+ 3. Enqueue them to perform them asynchronously
29
+
30
+ ```ruby
31
+ CreateGameGrid.enqueue('ligth_cycle')
32
+ ```
33
+
34
+ 4. Or enqueue them to be performed at some time in the future.
35
+
36
+ ```ruby
37
+ CreateGameGrid.enqueue('disc_arena', at: DateTime.new(2015, 12, 31))
38
+ ```
39
+
40
+ 5. Run as many Disc Worker processes as you wish.
41
+
42
+ ```bash
43
+ $ DISQUE_QUEUES=urgent,default disc
44
+ ```
45
+
46
+ You're done!
@@ -0,0 +1,17 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'disc'
3
+ s.version = '0.0.1'
4
+ s.summary = 'A simple disque and powerful job implementation'
5
+ s.description = ''
6
+ s.authors = ['pote']
7
+ s.email = ['pote@tardis.com.uy']
8
+ s.homepage = 'https://github.com/pote/disque-job'
9
+ s.license = 'MIT'
10
+
11
+ s.files = `git ls-files`.split("\n")
12
+
13
+ s.add_dependency 'disque'
14
+ s.add_dependency 'msgpack'
15
+ s.add_dependency 'clap'
16
+ s.add_development_dependency 'cutest'
17
+ end
@@ -0,0 +1,108 @@
1
+ require 'disque'
2
+ require 'msgpack'
3
+
4
+ class Disc
5
+ attr_reader :disque,
6
+ :disque_timeout
7
+
8
+ def self.disque
9
+ @disque ||= Disque.new(
10
+ ENV.fetch('DISQUE_NODES', 'localhost:7711'),
11
+ auth: ENV.fetch('DISQUE_AUTH', nil),
12
+ cycle: ENV.fetch('DISQUE_CYCLE', '1000').to_i
13
+ )
14
+ end
15
+
16
+ def self.disque=(disque)
17
+ @disque = disque
18
+ end
19
+
20
+ def self.disque_timeout
21
+ @disque_timeout ||= 100
22
+ end
23
+
24
+ def self.disque_timeout=(timeout)
25
+ @disque_timeout = timeout
26
+ end
27
+
28
+ class Worker
29
+ attr_reader :disque,
30
+ :queues,
31
+ :timeout,
32
+ :count
33
+
34
+ def self.run
35
+ new.run
36
+ end
37
+
38
+ def initialize(disque: nil , queues: nil, count: 1, timeout: nil)
39
+ @disque = client || Disc.disque
40
+ @count, @timeout = count, timeout
41
+ @queues = case
42
+ when queues.is_a?(Array)
43
+ queues
44
+ when queues.is_a?(String)
45
+ queues.split(',')
46
+ when queues.nil?
47
+ ENV.fetch('QUEUES', 'default').split(',')
48
+ else
49
+ raise 'Invalid Disque Queues'
50
+ end
51
+
52
+ self
53
+ end
54
+
55
+
56
+ def run
57
+ loop do
58
+ disque.fetch(
59
+ from: queues,
60
+ timeout: timeout,
61
+ count: count
62
+ ) do |serialized_job, _|
63
+ klass = Object.const_get(job['class'])
64
+ klass.new.perform(job['arguments'])
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ module Job
71
+ attr_reader :arguments,
72
+ :queue
73
+
74
+ def self.disque=(disque)
75
+ @disque = disque
76
+ end
77
+
78
+ def self.disque
79
+ defined?(@disque) ? @disque : Disc.disque
80
+ end
81
+
82
+ def self.disc(options = {})
83
+ @queue ||= options.fetch(:queue, :default)
84
+ end
85
+
86
+ def self.enqueue(*args, at: nil)
87
+ job = new(args)
88
+
89
+ disque.push(
90
+ job.queue,
91
+ job.serializable.to_msgpack,
92
+ Disc.disque_timeout,
93
+ delay: at.nil? ? nil : (at.to_i - Time.now.to_i)
94
+ )
95
+ end
96
+
97
+ def initialize(arguments)
98
+ @arguments = arguments
99
+ end
100
+
101
+ def serializable
102
+ {
103
+ class: self.class.name,
104
+ arguments: self.arguments
105
+ }
106
+ end
107
+ end
108
+ end
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: disc
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - pote
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: disque
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: msgpack
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: clap
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: cutest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: ''
70
+ email:
71
+ - pote@tardis.com.uy
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - Makefile
77
+ - README.md
78
+ - disc.gemspec
79
+ - lib/disc.rb
80
+ homepage: https://github.com/pote/disque-job
81
+ licenses:
82
+ - MIT
83
+ metadata: {}
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ requirements: []
99
+ rubyforge_project:
100
+ rubygems_version: 2.4.5
101
+ signing_key:
102
+ specification_version: 4
103
+ summary: A simple disque and powerful job implementation
104
+ test_files: []