ost 0.1.6 → 1.0.0.rc1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7d56949a251817fd42e7b1c1ea085185512f1567
4
- data.tar.gz: e4a06723f0629316b924db731ce1d2521e18eccf
3
+ metadata.gz: d0c37dcb37d2a4a8083505a4cda90d414ae46ba4
4
+ data.tar.gz: 5fb22633c7b154355b487a764227b2566a5925a2
5
5
  SHA512:
6
- metadata.gz: a284c35a61569f0cbffb1ef1dc13d71e61c841c582eeda66a2b9e44d6f7d6a76db4ce36a08d2c669b063648ee5a3f70e607cfa6899d684e14e6aba24a0884cb3
7
- data.tar.gz: 65d1e5942ff81729e87e9ca30bc163483e7768cfd27daedd3a0bcd6a2b0bf63b8cd06f9240f49180f38173994027034650191fa38880706bec6f1bdab63557f2
6
+ metadata.gz: f58ea6507fd16c105124a5fcfd5d8865b81154e23a8d2f111b8e92824e71cdeeb3ab0968d97c6bae5ef82f79e0eb6dbcde6ed054cd0bc52db677d7b0a4898bb5
7
+ data.tar.gz: 6e1184ac0c347eff90229108f384e561248b90636bb0f408e53eb21d0c4670863d5d2298c174077ffa618678f4bfeded253746a3c5347cb388113f849df4e6ec
data/.gems ADDED
@@ -0,0 +1,3 @@
1
+ cutest -v 1.2.1
2
+ nido -v 0.0.1
3
+ redic -v 1.1.0
@@ -0,0 +1 @@
1
+ /pkg
@@ -0,0 +1,67 @@
1
+ ## 1.0.0.rc1
2
+
3
+ * Use [redic][redic] instead of `redis-rb` as the Redis client. This changes
4
+ how to connect to a Redis database:
5
+
6
+ Before:
7
+
8
+ ```ruby
9
+ Ost.connect(localhost: 6379, port: 6380, db: 2)
10
+ ```
11
+
12
+ Now:
13
+
14
+ ```ruby
15
+ Ost.redis = Redic.new("redis://127.0.0.1:6379/2")
16
+ ```
17
+
18
+ ## 0.1.6
19
+
20
+ * Fix bug with non-integer timeouts
21
+
22
+ * Add `Ost::Queue#size` method. Returns the current size of the queue.
23
+
24
+ Example:
25
+
26
+ ```ruby
27
+ Ost[:events].size # => 0
28
+ Ost[:events].push(1)
29
+ Ost[:events].size # => 1
30
+ ```
31
+
32
+ ## 0.1.5
33
+
34
+ * Fix bug with redis connection handling. Previously, it was just using the default connection
35
+ of `localhost:6379`, regardless if you setup your app with an `Ost.connect`.
36
+
37
+ ## 0.1.4
38
+
39
+ * No changes.
40
+
41
+ ## 0.1.3
42
+
43
+ * Don't yield the block on timeouts.
44
+
45
+ ## 0.1.2
46
+
47
+ * Change default timeout to 2 seconds.
48
+
49
+ ## 0.1.1
50
+
51
+ * Use `backup.lpop` instead of `backup.del`.
52
+
53
+ ## 0.1.0
54
+
55
+ * `Ost#each` no longer rescues exceptions for you.
56
+
57
+ You are in charge of rescuing and deciding what to do.
58
+
59
+ * You can inspect the status of the queue by calling `Ost::Queue#items`.
60
+
61
+ * If you need access to the underlying Redis key, it's in `Ost::Queue#key`.
62
+
63
+ * Ost now uses `BRPOPLPUSH` and maintains a backup queue while working.
64
+
65
+ You can access this queue using `Ost::Queue#backup`.
66
+
67
+ [redic]: https://github.com/amakawa/redic
data/README.md CHANGED
@@ -31,18 +31,34 @@ end
31
31
  Usage
32
32
  -----
33
33
 
34
- **Ost** connects to Redis automatically with the default options
35
- (localhost:6379, database 0).
34
+ Ost uses a lightweight Redis client called [Redic][redic]. To connect to
35
+ a Redis database, you will need to set an instance of `Redic`, with a URL
36
+ of the form `redis://:<passwd>@<host>:<port>/<db>`.
36
37
 
37
- You can customize the connection by calling `connect`:
38
+ You can customize the connection by calling `Ost.redis=`:
38
39
 
39
40
  ``` ruby
40
- Ost.connect port: 6380, db: 2
41
+ require "ost"
42
+
43
+ Ost.redis = Redic.new("redis://127.0.0.1:6379")
41
44
  ```
42
45
 
43
46
  Then you only need to refer to a queue for it to pop into existence:
44
47
 
45
48
  ``` ruby
49
+ require "ost"
50
+
51
+ Ost.redis = Redic.new("redis://127.0.0.1:6379")
52
+
53
+ Ost[:rss_feeds] << @feed.id
54
+ ```
55
+
56
+ Ost defaults to a Redic connection to `redis://127.0.0.1:6379`. The example
57
+ above could be rewritten as:
58
+
59
+ ``` ruby
60
+ require "ost"
61
+
46
62
  Ost[:rss_feeds] << @feed.id
47
63
  ```
48
64
 
@@ -57,7 +73,7 @@ end
57
73
  ```
58
74
 
59
75
  It will pop items from the queue as soon as they become available. It
60
- uses BRPOPLPUSH with a timeout that can be specified with the
76
+ uses `BRPOPLPUSH` with a timeout that can be specified with the
61
77
  `OST_TIMEOUT` environment variable.
62
78
 
63
79
  Note that in these examples we are pushing numbers to the queue. As
@@ -68,12 +84,6 @@ pop.
68
84
  Available methods
69
85
  =================
70
86
 
71
- `Ost.connect`: configure the connection to Redis. By default, it
72
- connects to localhost in port 6379 and uses the database 0. It accepts
73
- the same options as [redis-rb](https://github.com/redis/redis-rb).
74
-
75
- `Ost.stop`: halt processing for all queues.
76
-
77
87
  `Ost[:example].push item`, `Ost[:some_queue] << item`: add `item` to
78
88
  the `:example` queue.
79
89
 
@@ -81,6 +91,8 @@ the `:example` queue.
81
91
  }`: consume `item` from the `:example` queue. If the block doesn't
82
92
  complete successfully, the item will be left at a backup queue.
83
93
 
94
+ `Ost.stop`: halt processing for all queues.
95
+
84
96
  `Ost[:example].stop`: halt processing for the `example` queue.
85
97
 
86
98
  Failures
@@ -131,28 +143,4 @@ Installation
131
143
 
132
144
  $ gem install ost
133
145
 
134
- License
135
- -------
136
-
137
- Copyright (c) 2010, 2011, 2012 Michel Martens
138
-
139
- Permission is hereby granted, free of charge, to any person
140
- obtaining a copy of this software and associated documentation
141
- files (the "Software"), to deal in the Software without
142
- restriction, including without limitation the rights to use,
143
- copy, modify, merge, publish, distribute, sublicense, and/or sell
144
- copies of the Software, and to permit persons to whom the
145
- Software is furnished to do so, subject to the following
146
- conditions:
147
-
148
- The above copyright notice and this permission notice shall be
149
- included in all copies or substantial portions of the Software.
150
-
151
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
152
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
153
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
154
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
155
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
156
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
157
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
158
- OTHER DEALINGS IN THE SOFTWARE.
146
+ [redic]: https://github.com/amakawa/redic
data/lib/ost.rb CHANGED
@@ -1,34 +1,33 @@
1
- require "nest"
1
+ require "nido"
2
+ require "redic"
2
3
 
3
4
  module Ost
4
- TIMEOUT = (ENV["OST_TIMEOUT"] || 2).to_i
5
+ TIMEOUT = ENV["OST_TIMEOUT"] || "2"
5
6
 
6
7
  class Queue
7
8
  attr :key
8
9
  attr :backup
9
10
 
10
11
  def initialize(name)
11
- @key = Nest.new(:ost, redis)[name]
12
+ @key = Nido.new(:ost)[name]
12
13
  @backup = @key[Socket.gethostname][Process.pid]
14
+ @stopping = false
13
15
  end
14
16
 
15
17
  def push(value)
16
- key.lpush(value)
18
+ redis.call("LPUSH", @key, value)
17
19
  end
18
20
 
19
21
  def each(&block)
20
- @stopping = false
21
-
22
22
  loop do
23
- break if @stopping
24
-
25
- item = @key.brpoplpush(@backup, TIMEOUT)
23
+ item = redis.call("BRPOPLPUSH", @key, @backup, TIMEOUT)
26
24
 
27
- next unless item
25
+ if item
26
+ block.call(item)
27
+ redis.call("LPOP", @backup)
28
+ end
28
29
 
29
- block.call(item)
30
-
31
- @backup.lpop
30
+ break if @stopping
32
31
  end
33
32
  end
34
33
 
@@ -37,18 +36,22 @@ module Ost
37
36
  end
38
37
 
39
38
  def items
40
- key.lrange(0, -1)
39
+ redis.call("LRANGE", @key, 0, -1)
41
40
  end
42
41
 
43
42
  alias << push
44
43
  alias pop each
45
44
 
46
45
  def size
47
- key.llen
46
+ redis.call("LLEN", @key)
48
47
  end
49
48
 
50
49
  def redis
51
- @redis ||= Redis.connect(Ost.options)
50
+ defined?(@redis) ? @redis : Ost.redis
51
+ end
52
+
53
+ def redis=(redis)
54
+ @redis = redis
52
55
  end
53
56
  end
54
57
 
@@ -64,13 +67,11 @@ module Ost
64
67
  @queues.each { |_, queue| queue.stop }
65
68
  end
66
69
 
67
- @options = nil
68
-
69
- def self.connect(options = {})
70
- @options = options
70
+ def self.redis
71
+ @redis ||= Redic.new
71
72
  end
72
73
 
73
- def self.options
74
- @options || {}
74
+ def self.redis=(redis)
75
+ @redis = redis
75
76
  end
76
77
  end
@@ -0,0 +1,4 @@
1
+ .PHONY: test
2
+
3
+ test:
4
+ cutest ./test/*.rb
@@ -1,21 +1,16 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "ost"
3
- s.version = "0.1.6"
3
+ s.version = "1.0.0.rc1"
4
4
  s.summary = "Redis based queues and workers."
5
5
  s.description = "Ost lets you manage queues and workers with Redis."
6
6
  s.authors = ["Michel Martens"]
7
7
  s.email = ["michel@soveran.com"]
8
8
  s.homepage = "http://github.com/soveran/ost"
9
+ s.license = "MIT"
9
10
 
10
- s.files = Dir[
11
- "LICENSE",
12
- "README.md",
13
- "Rakefile",
14
- "lib/**/*.rb",
15
- "*.gemspec",
16
- "test/*.*"
17
- ]
11
+ s.files = `git ls-files`.split("\n")
18
12
 
19
- s.add_dependency "nest", "~> 1.0"
20
- s.add_development_dependency "cutest", "~> 1.0"
13
+ s.add_dependency "redic"
14
+ s.add_dependency "nido"
15
+ s.add_development_dependency "cutest"
21
16
  end
@@ -0,0 +1,25 @@
1
+ require_relative "helper"
2
+
3
+ scope do
4
+ test "access to underlying key" do
5
+ assert_equal "ost:events", Ost[:events].key
6
+ end
7
+
8
+ test "access to queued items" do
9
+ Ost[:events].push(1)
10
+
11
+ assert_equal ["1"], Ost[:events].items
12
+ end
13
+
14
+ test "access to queue size" do
15
+ queue = Ost[:events]
16
+ assert_equal 0, queue.size
17
+
18
+ queue.push(1)
19
+ assert_equal 1, queue.size
20
+
21
+ queue.stop
22
+ queue.each { }
23
+ assert_equal 0, queue.size
24
+ end
25
+ end
@@ -0,0 +1,38 @@
1
+ require_relative "helper"
2
+
3
+ scope do
4
+ test "returns backup key" do
5
+ hostname = Socket.gethostname
6
+ pid = Process.pid
7
+
8
+ assert_equal "ost:events:#{hostname}:#{pid}", Ost[:events].backup
9
+ end
10
+
11
+ test "maintains a backup queue for when worker dies" do
12
+ queue = Ost[:events]
13
+
14
+ queue.push(1)
15
+
16
+ assert_equal 0, queue.redis.call("LLEN", queue.backup)
17
+
18
+ begin
19
+ queue.stop
20
+ queue.each { |item| item.some_error }
21
+ rescue
22
+ end
23
+
24
+ assert_equal ["1"], queue.redis.call("LRANGE", queue.backup, 0, -1)
25
+ end
26
+
27
+ test "cleans up the backup queue on success" do
28
+ queue = Ost[:events]
29
+ queue.push(1)
30
+
31
+ queue.stop
32
+ queue.each do |item|
33
+ assert_equal [item], queue.redis.call("LRANGE", queue.backup, 0, -1)
34
+ end
35
+
36
+ assert_equal [], queue.redis.call("LRANGE", queue.backup, 0, -1)
37
+ end
38
+ end
@@ -0,0 +1,16 @@
1
+ require_relative "helper"
2
+
3
+ scope do
4
+ test "inherits ost redis connection by default" do
5
+ queue = Ost[:events]
6
+
7
+ assert_equal Ost.redis.url, queue.redis.url
8
+ end
9
+
10
+ test "queue can define its own connection" do
11
+ queue = Ost[:people]
12
+ queue.redis = Redic.new("redis://localhost:6379/1")
13
+
14
+ assert Ost.redis.url != queue.redis.url
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ require_relative "helper"
2
+
3
+ scope do
4
+ test "process items from the queue" do
5
+ Ost[:events].push(1)
6
+
7
+ results = []
8
+
9
+ Ost[:events].stop
10
+ Ost[:events].each do |item|
11
+ results << item
12
+ end
13
+
14
+ assert_equal [], Ost[:events].items
15
+ assert_equal ["1"], results
16
+ end
17
+ end
@@ -0,0 +1,8 @@
1
+ require "cutest"
2
+ require_relative "../lib/ost"
3
+
4
+ Ost.redis = Redic.new("redis://127.0.0.1:6379")
5
+
6
+ prepare do
7
+ Ost.redis.call("FLUSHALL")
8
+ end
@@ -0,0 +1,22 @@
1
+ require_relative "helper"
2
+
3
+ scope do
4
+ test "stop processing a queue" do
5
+ Ost[:events].push(1)
6
+ Ost[:events].stop
7
+ Ost[:events].each { }
8
+
9
+ assert(true)
10
+ end
11
+
12
+ test "stop processing all queues" do
13
+ Ost[:events].push(1)
14
+ Ost[:people].push(1)
15
+
16
+ Ost.stop
17
+ Ost[:events].each { }
18
+ Ost[:people].each { }
19
+
20
+ assert(true)
21
+ end
22
+ end
metadata CHANGED
@@ -1,43 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ost
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 1.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michel Martens
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-06 00:00:00.000000000 Z
11
+ date: 2014-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: nest
14
+ name: redic
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: '1.0'
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
- version: '1.0'
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nido
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'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: cutest
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - ~>
45
+ - - '>='
32
46
  - !ruby/object:Gem::Version
33
- version: '1.0'
47
+ version: '0'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - ~>
52
+ - - '>='
39
53
  - !ruby/object:Gem::Version
40
- version: '1.0'
54
+ version: '0'
41
55
  description: Ost lets you manage queues and workers with Redis.
42
56
  email:
43
57
  - michel@soveran.com
@@ -45,15 +59,23 @@ executables: []
45
59
  extensions: []
46
60
  extra_rdoc_files: []
47
61
  files:
62
+ - .gems
63
+ - .gitignore
64
+ - CHANGELOG.md
48
65
  - LICENSE
49
66
  - README.md
50
- - Rakefile
51
67
  - lib/ost.rb
68
+ - makefile
52
69
  - ost.gemspec
53
- - test/ost_test.rb
54
- - test/test_helper.rb
70
+ - test/access.rb
71
+ - test/backup.rb
72
+ - test/connection.rb
73
+ - test/core.rb
74
+ - test/helper.rb
75
+ - test/stop.rb
55
76
  homepage: http://github.com/soveran/ost
56
- licenses: []
77
+ licenses:
78
+ - MIT
57
79
  metadata: {}
58
80
  post_install_message:
59
81
  rdoc_options: []
@@ -66,9 +88,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
66
88
  version: '0'
67
89
  required_rubygems_version: !ruby/object:Gem::Requirement
68
90
  requirements:
69
- - - '>='
91
+ - - '>'
70
92
  - !ruby/object:Gem::Version
71
- version: '0'
93
+ version: 1.3.1
72
94
  requirements: []
73
95
  rubyforge_project:
74
96
  rubygems_version: 2.0.3
data/Rakefile DELETED
@@ -1,6 +0,0 @@
1
- task :test do
2
- require "cutest"
3
- Cutest.run(Dir["test/ost*"])
4
- end
5
-
6
- task :default => :test
@@ -1,160 +0,0 @@
1
- ENV["OST_TIMEOUT"] = "1"
2
-
3
- require File.expand_path("test_helper", File.dirname(__FILE__))
4
-
5
- scope do
6
- def ost(&job)
7
- thread = Thread.new do
8
- Ost[:events].each do |item|
9
- begin
10
- yield(item)
11
- ensure
12
- thread.kill
13
- end
14
- end
15
- end
16
-
17
- thread.join
18
- end
19
-
20
- def enqueue(id)
21
- Ost[:events].push(id)
22
- end
23
-
24
- prepare do
25
- Redis.current.flushall
26
- end
27
-
28
- setup do
29
- Ost[:events].redis.quit
30
- Redis.new
31
- end
32
-
33
- test "allows access to the queued items" do
34
- enqueue(1)
35
-
36
- assert_equal ["1"], Ost[:events].items
37
- end
38
-
39
- test "allows access to the underlying key" do
40
- assert_equal 0, Ost[:events].key.llen
41
- end
42
-
43
- test "process items from the queue" do |redis|
44
- enqueue(1)
45
-
46
- results = []
47
-
48
- ost do |item|
49
- results << item
50
- end
51
-
52
- assert_equal [], Ost[:events].items
53
- assert_equal ["1"], results
54
- end
55
-
56
- test "doesn't yield the block on timeout" do |redis|
57
- results = []
58
-
59
- Thread.new do
60
- sleep 2
61
- redis.lpush(Ost[:events].key, 1)
62
- end
63
-
64
- ost do |item|
65
- results << item
66
- end
67
-
68
- assert_equal [], Ost[:events].items
69
- assert_equal ["1"], results
70
- end
71
-
72
- test "halt processing a queue" do
73
- Thread.new do
74
- sleep 0.5
75
- Ost[:always_empty].stop
76
- end
77
-
78
- Ost[:always_empty].each { }
79
-
80
- assert true
81
- end
82
-
83
- test "halt processing all queues" do
84
- Thread.new do
85
- sleep 0.5
86
- Ost.stop
87
- end
88
-
89
- t1 = Thread.new { Ost[:always_empty].each { } }
90
- t2 = Thread.new { Ost[:always_empty_too].each { } }
91
-
92
- t1.join
93
- t2.join
94
-
95
- assert true
96
- end
97
-
98
- test "maintains a backup queue for when worker dies" do
99
- enqueue(1)
100
-
101
- assert_equal 0, Ost[:events].backup.llen
102
-
103
- begin
104
- Ost[:events].each do |item|
105
- item.some_error
106
- end
107
- rescue
108
- end
109
-
110
- assert_equal ["1"], Ost[:events].backup.lrange(0, -1)
111
- end
112
-
113
- test "cleans up the backup queue on success" do
114
- enqueue(1)
115
-
116
- done = false
117
-
118
- Thread.new do
119
- Ost[:events].each do |item|
120
- assert_equal ["1"], Ost[:events].backup.lrange(0, -1)
121
- done = true
122
- end
123
- end
124
-
125
- until done; end
126
-
127
- Ost[:events].stop
128
-
129
- assert_equal 0, Ost[:events].backup.llen
130
- assert_equal false, Ost[:events].backup.exists
131
- end
132
-
133
- test "uses same redis instance" do
134
- queue = Ost['foo']
135
-
136
- assert_equal queue.key.redis, queue.redis
137
- end
138
-
139
- test "report the queue size" do
140
- queue = Ost[:size]
141
-
142
- assert_equal 0, queue.size
143
-
144
- queue << 1
145
-
146
- assert_equal 1, queue.size
147
-
148
- done = false
149
-
150
- Thread.new do
151
- Ost[:size].each do |item|
152
- done = true
153
- end
154
- end
155
-
156
- until done; end
157
-
158
- assert_equal 0, queue.size
159
- end
160
- end
@@ -1,6 +0,0 @@
1
- require "rubygems"
2
- require "cutest"
3
-
4
- $VERBOSE = 1
5
-
6
- require File.join(File.dirname(__FILE__), "..", "lib", "ost")