karait 0.0.6 → 0.0.7

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.
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: karait
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
5
- prerelease:
4
+ hash: 17
5
+ prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 6
10
- version: 0.0.6
9
+ - 7
10
+ segments_generated: true
11
+ version: 0.0.7
11
12
  platform: ruby
12
13
  authors:
13
14
  - bcoe
@@ -15,10 +16,90 @@ autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2011-09-10 00:00:00 -04:00
19
+ date: 2011-11-12 00:00:00 +00:00
19
20
  default_executable:
20
- dependencies: []
21
-
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
23
+ type: :runtime
24
+ prerelease: false
25
+ name: mongo
26
+ version_requirements: &id001 !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ~>
30
+ - !ruby/object:Gem::Version
31
+ hash: 25
32
+ segments:
33
+ - 1
34
+ - 3
35
+ - 1
36
+ segments_generated: true
37
+ version: 1.3.1
38
+ requirement: *id001
39
+ - !ruby/object:Gem::Dependency
40
+ type: :development
41
+ prerelease: false
42
+ name: shoulda
43
+ version_requirements: &id002 !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ hash: 3
49
+ segments:
50
+ - 0
51
+ segments_generated: true
52
+ version: "0"
53
+ requirement: *id002
54
+ - !ruby/object:Gem::Dependency
55
+ type: :development
56
+ prerelease: false
57
+ name: bundler
58
+ version_requirements: &id003 !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ hash: 23
64
+ segments:
65
+ - 1
66
+ - 0
67
+ - 0
68
+ segments_generated: true
69
+ version: 1.0.0
70
+ requirement: *id003
71
+ - !ruby/object:Gem::Dependency
72
+ type: :development
73
+ prerelease: false
74
+ name: jeweler
75
+ version_requirements: &id004 !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ~>
79
+ - !ruby/object:Gem::Version
80
+ hash: 7
81
+ segments:
82
+ - 1
83
+ - 6
84
+ - 4
85
+ segments_generated: true
86
+ version: 1.6.4
87
+ requirement: *id004
88
+ - !ruby/object:Gem::Dependency
89
+ type: :development
90
+ prerelease: false
91
+ name: rcov
92
+ version_requirements: &id005 !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ hash: 3
98
+ segments:
99
+ - 0
100
+ segments_generated: true
101
+ version: "0"
102
+ requirement: *id005
22
103
  description: A ridiculously simple cross-language queuing system, built on top of MongoDB.
23
104
  email: bencoe@gmail.com
24
105
  executables: []
@@ -29,20 +110,8 @@ extra_rdoc_files:
29
110
  - LICENSE.txt
30
111
  - README.markdown
31
112
  files:
32
- - .gitignore
33
- - Gemfile
34
- - Gemfile.lock
35
113
  - LICENSE.txt
36
114
  - README.markdown
37
- - Rakefile
38
- - VERSION
39
- - karait.gemspec
40
- - lib/karait.rb
41
- - lib/message.rb
42
- - lib/queue.rb
43
- - test/helper.rb
44
- - test/test_message.rb
45
- - test/test_queue.rb
46
115
  has_rdoc: true
47
116
  homepage: http://github.com/bcoe/karait
48
117
  licenses:
@@ -60,6 +129,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
60
129
  hash: 3
61
130
  segments:
62
131
  - 0
132
+ segments_generated: true
63
133
  version: "0"
64
134
  required_rubygems_version: !ruby/object:Gem::Requirement
65
135
  none: false
@@ -69,11 +139,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
139
  hash: 3
70
140
  segments:
71
141
  - 0
142
+ segments_generated: true
72
143
  version: "0"
73
144
  requirements: []
74
145
 
75
146
  rubyforge_project:
76
- rubygems_version: 1.4.2
147
+ rubygems_version: 1.3.7
77
148
  signing_key:
78
149
  specification_version: 3
79
150
  summary: A ridiculously simple cross-language queuing system, built on top of MongoDB.
data/.gitignore DELETED
@@ -1,14 +0,0 @@
1
- html
2
- pkg
3
- doc
4
- *.gem
5
- nbproject
6
- *.bundle
7
- *.o
8
- *~
9
- *#*
10
- *.class
11
- *.swp
12
- *.pid
13
- *.log
14
- =*
data/Gemfile DELETED
@@ -1,12 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gem "mongo", "~> 1.3.1"
4
-
5
- # Add dependencies to develop your gem here.
6
- # Include everything needed to run rake, tests, features, etc.
7
- group :development do
8
- gem "shoulda", ">= 0"
9
- gem "bundler", "~> 1.0.0"
10
- gem "jeweler", "~> 1.6.4"
11
- gem "rcov", ">= 0"
12
- end
@@ -1,24 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- bson (1.3.1)
5
- git (1.2.5)
6
- jeweler (1.6.4)
7
- bundler (~> 1.0)
8
- git (>= 1.2.5)
9
- rake
10
- mongo (1.3.1)
11
- bson (>= 1.3.1)
12
- rake (0.9.2)
13
- rcov (0.9.10)
14
- shoulda (2.11.3)
15
-
16
- PLATFORMS
17
- ruby
18
-
19
- DEPENDENCIES
20
- bundler (~> 1.0.0)
21
- jeweler (~> 1.6.4)
22
- mongo (~> 1.3.1)
23
- rcov
24
- shoulda
data/Rakefile DELETED
@@ -1,53 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'rubygems'
4
- require 'bundler'
5
- begin
6
- Bundler.setup(:default, :development)
7
- rescue Bundler::BundlerError => e
8
- $stderr.puts e.message
9
- $stderr.puts "Run `bundle install` to install missing gems"
10
- exit e.status_code
11
- end
12
- require 'rake'
13
-
14
- require 'jeweler'
15
- Jeweler::Tasks.new do |gem|
16
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
- gem.name = "karait"
18
- gem.homepage = "http://github.com/bcoe/karait"
19
- gem.license = "MIT"
20
- gem.summary = %Q{A ridiculously simple cross-language queuing system, built on top of MongoDB.}
21
- gem.description = %Q{A ridiculously simple cross-language queuing system, built on top of MongoDB.}
22
- gem.email = "bencoe@gmail.com"
23
- gem.authors = ["bcoe"]
24
- # dependencies defined in Gemfile
25
- end
26
- Jeweler::RubygemsDotOrgTasks.new
27
-
28
- require 'rake/testtask'
29
- Rake::TestTask.new(:test) do |test|
30
- test.libs << 'lib' << 'test'
31
- test.pattern = 'test/**/test_*.rb'
32
- test.verbose = true
33
- end
34
-
35
- require 'rcov/rcovtask'
36
- Rcov::RcovTask.new do |test|
37
- test.libs << 'test'
38
- test.pattern = 'test/**/test_*.rb'
39
- test.verbose = true
40
- test.rcov_opts << '--exclude "gems/*"'
41
- end
42
-
43
- task :default => :test
44
-
45
- require 'rake/rdoctask'
46
- Rake::RDocTask.new do |rdoc|
47
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
-
49
- rdoc.rdoc_dir = 'rdoc'
50
- rdoc.title = "karait #{version}"
51
- rdoc.rdoc_files.include('README*')
52
- rdoc.rdoc_files.include('lib/**/*.rb')
53
- end
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.0.6
@@ -1,50 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = %q{karait}
8
- s.version = "0.0.6"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["bcoe"]
12
- s.date = %q{2011-09-10}
13
- s.description = %q{A ridiculously simple cross-language queuing system, built on top of MongoDB.}
14
- s.email = %q{bencoe@gmail.com}
15
- s.extra_rdoc_files = [
16
- "LICENSE.txt",
17
- "README.markdown"
18
- ]
19
- s.files = [
20
- ".gitignore",
21
- "Gemfile",
22
- "Gemfile.lock",
23
- "LICENSE.txt",
24
- "README.markdown",
25
- "Rakefile",
26
- "VERSION",
27
- "karait.gemspec",
28
- "lib/karait.rb",
29
- "lib/message.rb",
30
- "lib/queue.rb",
31
- "test/helper.rb",
32
- "test/test_message.rb",
33
- "test/test_queue.rb"
34
- ]
35
- s.homepage = %q{http://github.com/bcoe/karait}
36
- s.licenses = ["MIT"]
37
- s.require_paths = ["lib"]
38
- s.rubygems_version = %q{1.4.2}
39
- s.summary = %q{A ridiculously simple cross-language queuing system, built on top of MongoDB.}
40
-
41
- if s.respond_to? :specification_version then
42
- s.specification_version = 3
43
-
44
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
45
- else
46
- end
47
- else
48
- end
49
- end
50
-
@@ -1,5 +0,0 @@
1
- require 'message'
2
- require 'queue'
3
-
4
- module Karait
5
- end
@@ -1,86 +0,0 @@
1
- module Karait
2
- class Message
3
-
4
- include Karait
5
-
6
- ASSIGN_VARIABLE_REGEX = /^([a-z_][a-zA-Z_0-9]*)=$/
7
- VARIABLE_REGEX = /^([a-z_][a-zA-Z_0-9]*)$/
8
- BLACKLIST = {
9
- '_meta' => true,
10
- '_id' => true,
11
- '_expired' => true
12
- }
13
-
14
- def initialize(raw_message={}, queue_collection=nil)
15
- @source = raw_message
16
- @queue_collection = queue_collection
17
- @variables_to_serialize = {}
18
- set_expired
19
- add_accessors raw_message
20
- end
21
-
22
- def to_hash
23
- return @variables_to_serialize
24
- end
25
-
26
- def delete
27
- @queue_collection.update(
28
- {
29
- '_id' => @source['_id']
30
- },
31
- {
32
- '$set' => {
33
- '_meta.expired' => true
34
- }
35
- }
36
- )
37
- end
38
-
39
- def expired?
40
- return @expired
41
- end
42
-
43
- def get(key)
44
- return @variables_to_serialize[key.to_s]
45
- end
46
-
47
- def _get_id
48
- return @source['_id']
49
- end
50
-
51
- private
52
-
53
- def set_expired
54
- @expired = false
55
-
56
- current_time = Time.now().to_f
57
- meta = @source.fetch('_meta', {})
58
-
59
- return if meta.fetch('expire', -1.0) <= -1.0
60
-
61
- if current_time - meta.fetch('timestamp', 0.0) > meta.fetch('expire', -1.0)
62
- @expired = true
63
- delete
64
- end
65
- end
66
-
67
- def add_accessors(hash)
68
- hash.each do |k, v|
69
- if not Message::BLACKLIST.has_key? k
70
- @variables_to_serialize[k.to_s] = v
71
- end
72
- end
73
- end
74
-
75
- def method_missing(sym, *args, &block)
76
- if matches = sym.to_s.match(Message::ASSIGN_VARIABLE_REGEX) and args.count == 1
77
- @variables_to_serialize[matches[1]] = args[0]
78
- elsif matches = sym.to_s.match(Message::VARIABLE_REGEX) and args.count == 0
79
- return @variables_to_serialize[matches[1]]
80
- else
81
- super(sym, *args, &block)
82
- end
83
- end
84
-
85
- end
86
- end
@@ -1,169 +0,0 @@
1
- require 'mongo'
2
-
3
- module Karait
4
- class Queue
5
-
6
- include Karait
7
-
8
- MESSAGES_READ = 10
9
- NO_OBJECT_FOUND_ERROR = 'No matching object found'
10
-
11
- def initialize(opts={})
12
- set_instance_variables opts
13
- create_mongo_connection
14
- end
15
-
16
- def write(message, opts={})
17
- if message.class == Hash
18
- message_dict = message
19
- else
20
- message_dict = message.to_hash
21
- end
22
-
23
- message_dict[:_meta] = {
24
- :expire => opts.fetch(:expire, -1.0),
25
- :timestamp => Time.now().to_f,
26
- :expired => false,
27
- :visible_after => -1.0
28
- }
29
-
30
- message_dict[:_meta][:routing_key] = opts.fetch(:routing_key) if opts[:routing_key]
31
-
32
- @queue_collection.insert(message_dict, :safe => true)
33
- end
34
-
35
- def read(opts={})
36
- opts = {
37
- :messages_read => 10,
38
- :visibility_timeout => -1.0,
39
- :routing_key => nil
40
- }.update(opts)
41
-
42
- current_time = Time.new.to_f
43
- messages = []
44
-
45
- query = {
46
- '_meta.expired' => false,
47
- '_meta.visible_after' => {
48
- '$lt' => current_time
49
- }
50
- }
51
- if opts[:routing_key] != nil
52
- query['_meta.routing_key'] = opts[:routing_key]
53
- else
54
- query['_meta.routing_key'] = {
55
- '$exists' => false
56
- }
57
- end
58
-
59
- update = false
60
- if opts[:visibility_timeout] > -1.0
61
- update = {
62
- '$set' => {
63
- '_meta.visible_after' => current_time + opts[:visibility_timeout]
64
- }
65
- }
66
- end
67
-
68
- raw_messages = []
69
-
70
- if update
71
- (0..opts[:messages_read]).each do
72
- begin
73
-
74
- raw_message = @queue_collection.find_and_modify(:query => query, :update => update)
75
-
76
- if raw_message
77
- raw_messages << raw_message
78
- else
79
- break
80
- end
81
-
82
- rescue Mongo::OperationFailure => operation_failure
83
- if not operation_failure.to_s.match(Queue::NO_OBJECT_FOUND_ERROR)
84
- raise operation_failure
85
- end
86
- end
87
-
88
- end
89
- else
90
- @queue_collection.find(query).limit(opts[:messages_read]).each do |raw_message|
91
- raw_messages << raw_message
92
- end
93
- end
94
-
95
- raw_messages.each do |raw_message|
96
- message = Karait::Message.new(raw_message=raw_message, queue_collection=@queue_collection)
97
- if not message.expired?
98
- messages << message
99
- end
100
- end
101
-
102
- return messages
103
- end
104
-
105
- def delete_messages(messages)
106
- ids = []
107
- messages.each {|message| ids << message._get_id}
108
- @queue_collection.update(
109
- {
110
- '_id' => {
111
- '$in' => ids
112
- }
113
- },
114
- {
115
- '$set' => {
116
- '_meta.expired' => true
117
- }
118
- },
119
- :multi => true,
120
- :safe => true
121
- )
122
- end
123
-
124
- private
125
-
126
- def set_instance_variables(opts)
127
-
128
- defaults = {
129
- :host => 'localhost',
130
- :port => 27017,
131
- :database => 'karait',
132
- :queue => 'messages',
133
- :average_message_size => 8192,
134
- :queue_size => 4096
135
- }.merge(opts)
136
-
137
- @host = defaults[:host]
138
- @port = defaults[:port]
139
- @database = defaults[:database]
140
- @queue = defaults[:queue]
141
- @average_message_size = defaults[:average_message_size]
142
- @queue_size = defaults[:queue_size]
143
-
144
- end
145
-
146
- def create_mongo_connection
147
- @connection = Mongo::Connection.new(
148
- @host,
149
- @port
150
- )
151
- @database = @connection[@database]
152
- create_capped_collection
153
- @queue_collection = @database[@queue]
154
- @queue_collection.create_index('_id')
155
- @queue_collection.create_index('_meta.routing_key')
156
- @queue_collection.create_index('_meta.expired')
157
- @queue_collection.create_index('_meta.visible_after')
158
- end
159
-
160
- def create_capped_collection
161
- @database.create_collection(
162
- @queue,
163
- :size => (@average_message_size * @queue_size),
164
- :capped => true,
165
- :max => @queue_size
166
- )
167
- end
168
- end
169
- end
@@ -1,18 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
10
- require 'test/unit'
11
- require 'shoulda'
12
-
13
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
- $LOAD_PATH.unshift(File.dirname(__FILE__))
15
- require 'karait'
16
-
17
- class Test::Unit::TestCase
18
- end
@@ -1,92 +0,0 @@
1
- require 'helper'
2
- require 'karait'
3
- require 'yaml'
4
-
5
- class TestMessage < Test::Unit::TestCase
6
-
7
- def setup
8
- Mongo::Connection.new()['karait_test']['queue_test'].drop()
9
- end
10
-
11
- should "should add attribute accessors when initialized with a raw message" do
12
- message = Karait::Message.new(
13
- raw_message={
14
- :apple => 5,
15
- :banana => 3
16
- }
17
- )
18
-
19
- message.apple = 6
20
- assert_equal 6, message.apple
21
- assert_equal 3, message.banana
22
- end
23
-
24
- should "add new attribute accessors for missing methods" do
25
- message = Karait::Message.new
26
- message.foo = 9
27
- assert_equal 9, message.foo
28
- end
29
-
30
- should "return a hash of appropriate instance variables when to_hash is called" do
31
- message = Karait::Message.new(
32
- raw_message={
33
- :apple => 5,
34
- :banana => 3
35
- }
36
- )
37
- message.apple = 6
38
- message.foo = {'bar' => 9}
39
- message.bar = [27]
40
-
41
- hash = message.to_hash
42
-
43
- assert_equal 6, hash['apple']
44
- assert_equal 3, hash['banana']
45
- assert_equal 9, hash['foo']['bar']
46
- assert_equal 27, hash['bar'][0]
47
- assert_equal 4, hash.keys.count
48
- end
49
-
50
- should "not copy blacklisted keys when to_hash called" do
51
- raw_message = {
52
- '_id' => 'foobar',
53
- '_meta' => {
54
- 'foo' => 2
55
- }
56
- }
57
- message = Karait::Message.new(raw_message=raw_message)
58
- hash = message.to_hash
59
-
60
- assert_equal 0, hash.keys.count
61
- end
62
-
63
- should "set expired to true when delete is called on a message" do
64
- collection = Mongo::Connection.new()['karait_test']['queue_test']
65
- collection.insert({
66
- 'routing_key' => 'foobar',
67
- 'apple' => 3,
68
- 'banana' => 5,
69
- '_meta' => {
70
- 'timestamp' => 2523939,
71
- 'expire' => 20393,
72
- 'expired' => false
73
- }
74
- })
75
- raw_message = collection.find_one({'_meta.expired' => false})
76
- assert_equal 3, raw_message['apple']
77
- message = Karait::Message.new(raw_message=raw_message, queue_collection=collection)
78
- message.delete()
79
- assert_equal 0, collection.find({'_meta.expired' => false}).count
80
- end
81
-
82
- should "allow a get method to be called to retrieve keys that conflict with class variables, e.g., send" do
83
- message = Karait::Message.new(
84
- raw_message={
85
- :send => 5,
86
- :banana => 3
87
- }
88
- )
89
- assert_equal 3, message.get(:banana)
90
- assert_equal 5, message.get(:send)
91
- end
92
- end
@@ -1,237 +0,0 @@
1
- require 'helper'
2
- require 'mongo'
3
- require 'karait'
4
-
5
- class TestQueue < Test::Unit::TestCase
6
-
7
- def setup
8
- Mongo::Connection.new()['karait_test']['queue_test'].drop()
9
- end
10
-
11
- should "initialize a capped collection when a queue is created" do
12
- queue = Karait::Queue.new(
13
- :database => 'karait_test',
14
- :queue => 'queue_test',
15
- :average_message_size => 8192,
16
- :queue_size => 4096
17
- )
18
-
19
- options = Mongo::Connection.new()['karait_test']['queue_test'].options
20
-
21
- assert_equal true, options['capped']
22
- assert_equal 4096, options['max']
23
- assert_equal (8192 * 4096), options['size']
24
- end
25
-
26
- should "attach to a mongo queue collection that already exists" do
27
- collection = Mongo::Connection.new()['karait_test']['queue_test']
28
- collection.insert({
29
- :message => {
30
- :apple => 3,
31
- :banana => 5
32
- },
33
- :_meta => {
34
- :timestamp => 2523939,
35
- :expire => 20393,
36
- :routing_key => 'foo_key'
37
- }
38
- })
39
- assert_equal 1, collection.count()
40
-
41
- queue = Karait::Queue.new(
42
- :database => 'karait_test',
43
- :queue => 'queue_test'
44
- )
45
-
46
- collection = Mongo::Connection.new()['karait_test']['queue_test']
47
- assert_equal 1, collection.count()
48
- assert_equal nil, collection.options()
49
- end
50
-
51
- should "write a dictionary into the mongo queue collection" do
52
- queue = Karait::Queue.new(
53
- :database => 'karait_test',
54
- :queue => 'queue_test',
55
- :average_message_size => 8192,
56
- :queue_size => 4096
57
- )
58
-
59
- queue.write({
60
- :apple => 5,
61
- :banana => 6,
62
- :inner_object => {
63
- :foo => 1,
64
- :bar => 2
65
- }
66
- })
67
-
68
- collection = Mongo::Connection.new()['karait_test']['queue_test']
69
- obj = collection.find_one()
70
- assert_equal 6, obj['banana']
71
- assert_equal 2, obj['inner_object']['bar']
72
- assert obj['_meta']['expire']
73
- assert obj['_meta']['timestamp']
74
- end
75
-
76
- should "write a message object into the mongo queue collection" do
77
- queue = Karait::Queue.new(
78
- :database => 'karait_test',
79
- :queue => 'queue_test'
80
- )
81
- message = Karait::Message.new
82
- message.apple = 5
83
- message.banana = {
84
- :foo => 2
85
- }
86
- queue.write message
87
-
88
- collection = Mongo::Connection.new()['karait_test']['queue_test']
89
- obj = collection.find_one
90
- assert_equal 5, obj['apple']
91
- assert_equal 2, obj['banana']['foo']
92
- end
93
-
94
- should "read a message object from the mongo queue collection" do
95
- queue = Karait::Queue.new(
96
- :database => 'karait_test',
97
- :queue => 'queue_test'
98
- )
99
-
100
- write_message = Karait::Message.new
101
- write_message.apple = 5
102
- write_message.banana = 6
103
- write_message.inner_object = {
104
- 'foo' => 1,
105
- 'bar' => 2
106
- }
107
- queue.write write_message
108
-
109
- read_message = queue.read()[0]
110
- assert_equal 5, read_message.apple
111
- assert_equal 2, read_message.inner_object['bar']
112
- assert_equal 3, read_message.to_hash.keys.count
113
- end
114
-
115
- should "return messages in fifo order" do
116
- queue = Karait::Queue.new(
117
- :database => 'karait_test',
118
- :queue => 'queue_test'
119
- )
120
-
121
- queue.write Karait::Message.new({'foo' => 1})
122
- queue.write Karait::Message.new({:foo => 2})
123
- queue.write Karait::Message.new({'foo' => 3})
124
- messages = queue.read()
125
-
126
- assert_equal 1, messages[0].foo
127
- assert_equal 2, messages[1].foo
128
- assert_equal 3, messages[2].foo
129
- end
130
-
131
- should "only return messages with the appropriate routing key when it's provided" do
132
- queue = Karait::Queue.new(
133
- :database => 'karait_test',
134
- :queue => 'queue_test'
135
- )
136
-
137
- queue.write(Karait::Message.new({:foo => 1}), :routing_key => 'foobar')
138
- queue.write Karait::Message.new({:foo => 2})
139
-
140
- messages = queue.read(:routing_key => 'foobar')
141
- assert_equal 1, messages.count
142
- assert_equal 1, messages[0].foo
143
- end
144
-
145
- should "only return messages with no routing key when none is provided" do
146
- queue = Karait::Queue.new(
147
- :database => 'karait_test',
148
- :queue => 'queue_test'
149
- )
150
-
151
- queue.write(Karait::Message.new({:foo => 1}), :routing_key => 'foobar')
152
- queue.write Karait::Message.new({:foo => 2})
153
-
154
- messages = queue.read()
155
- assert_equal 1, messages.count
156
- assert_equal 2, messages[0].foo
157
- end
158
-
159
- should "should no longer return a message when delete is called on it" do
160
- queue = Karait::Queue.new(
161
- :database => 'karait_test',
162
- :queue => 'queue_test'
163
- )
164
-
165
- queue.write Karait::Message.new({:foo => 1})
166
- messages = queue.read()
167
- assert_equal 1, messages.count
168
- assert_equal 1, messages[0].foo
169
-
170
- messages[0].delete
171
- messages = queue.read()
172
- assert_equal 0, messages.count
173
- end
174
-
175
- should "not remove message immediately with expire set" do
176
- queue = Karait::Queue.new(
177
- :database => 'karait_test',
178
- :queue => 'queue_test'
179
- )
180
-
181
- queue.write(Karait::Message.new({:foo => 1}), :expire => 0.5)
182
- sleep(0.1)
183
- messages = queue.read()
184
- assert_equal 1, messages.count
185
- end
186
-
187
- should "remove message once expire time is passed" do
188
- queue = Karait::Queue.new(
189
- :database => 'karait_test',
190
- :queue => 'queue_test'
191
- )
192
-
193
- queue.write(Karait::Message.new({:foo => 1}), :expire => 0.1)
194
- sleep(0.2)
195
- messages = queue.read()
196
- assert_equal 0, messages.count
197
-
198
- # Make sure the meta._expired key is actually set.
199
- collection = Mongo::Connection.new()['karait_test']['queue_test']
200
- raw_message = collection.find_one
201
- assert_equal true, raw_message['_meta']['expired']
202
- end
203
-
204
-
205
- should "remove all messages in array when delete messages called" do
206
- queue = Karait::Queue.new(
207
- :database => 'karait_test',
208
- :queue => 'queue_test'
209
- )
210
-
211
- queue.write Karait::Message.new({'foo' => 1})
212
- queue.write Karait::Message.new({:foo => 2})
213
- queue.write Karait::Message.new({'foo' => 3})
214
- messages = queue.read()
215
- queue.delete_messages messages
216
- messages = queue.read()
217
- assert_equal 0, messages.count
218
- end
219
-
220
- should "not see message in queue again until visibility timeout has passed" do
221
- queue = Karait::Queue.new(
222
- :database => 'karait_test',
223
- :queue => 'queue_test'
224
- )
225
-
226
- queue.write Karait::Message.new({'foo' => 1})
227
- queue.write Karait::Message.new({:foo => 2})
228
- queue.write Karait::Message.new({'foo' => 3})
229
- messages = queue.read(:visibility_timeout => 0.4)
230
- assert_equal 3, messages.count
231
- messages = queue.read(:visibility_timeout => 0.4)
232
- assert_equal 0, messages.count
233
- sleep(0.5)
234
- messages = queue.read(:visibility_timeout => 0.4)
235
- assert_equal 3, messages.count
236
- end
237
- end