maildir-queue 0.2.0 → 1.0.0
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.
- data/README.rdoc +93 -2
- data/Rakefile +0 -26
- data/lib/maildir/queue.rb +15 -25
- data/lib/maildir/web_queue.rb +31 -20
- data/test/helper.rb +1 -1
- data/test/test_maildir_queue.rb +19 -15
- data/test/test_maildir_web_queue.rb +44 -15
- metadata +92 -44
- data/.document +0 -5
- data/.gitignore +0 -21
- data/VERSION +0 -1
- data/examples/config.ru +0 -5
- data/maildir-queue.gemspec +0 -73
data/README.rdoc
CHANGED
@@ -1,9 +1,100 @@
|
|
1
1
|
= maildir-queue
|
2
2
|
|
3
|
-
|
3
|
+
A wrapper for the maildir library that gives it a queue-like interface.
|
4
|
+
|
5
|
+
== Install
|
6
|
+
|
7
|
+
gem install maildir-queue
|
8
|
+
|
9
|
+
== Usage
|
10
|
+
|
11
|
+
Create a queue in /home/aaron/queue
|
12
|
+
|
13
|
+
require 'maildir/queue'
|
14
|
+
queue = Maildir::Queue.new("/home/aaron/queue")
|
15
|
+
|
16
|
+
Push a new message onto the queue.
|
17
|
+
|
18
|
+
message = queue.push("Hello World!")
|
19
|
+
|
20
|
+
List new messages
|
21
|
+
|
22
|
+
queue.list(:new) # => [message]
|
23
|
+
|
24
|
+
List messages that are being processed
|
25
|
+
|
26
|
+
queue.list(:cur) # => []
|
27
|
+
|
28
|
+
Move the first new message to 'cur' for processing
|
29
|
+
|
30
|
+
message = queue.shift # Returns nil if no new messages
|
31
|
+
message.data # => 'Hello World!'
|
32
|
+
|
33
|
+
queue.list(:new) # => []
|
34
|
+
queue.list(:cur) # => [message]
|
35
|
+
|
36
|
+
Delete a message after it's processed
|
37
|
+
|
38
|
+
message.destroy
|
39
|
+
|
40
|
+
queue.list(:cur) # => []
|
41
|
+
|
42
|
+
=== Dealing with stalled messages
|
43
|
+
|
44
|
+
An exepected (but rare) behavior is for a client to fail while processing a message.
|
45
|
+
Such messages will stay in 'cur' until retried.
|
46
|
+
|
47
|
+
Get a list of messages in cur that have not been modified in 5 minutes
|
48
|
+
|
49
|
+
messages = queue.stalled_messages(Time.now - 300)
|
50
|
+
|
51
|
+
Requeue them
|
52
|
+
|
53
|
+
count = queue.requeue_stalled_messages(Time.now - 300)
|
54
|
+
|
55
|
+
Clients can update a message's timestamps to indicate it's still be processed.
|
56
|
+
Then the retry interval can be shorter than the time it takes to process a message.
|
57
|
+
|
58
|
+
message.utime(Time.now, Time.now)
|
59
|
+
|
60
|
+
== Maildir::WebQueue, the HTTP/JSON interface
|
61
|
+
|
62
|
+
maildir-queue includes a simple Sinatra app providing an HTTP/JSON interface to a queue.
|
63
|
+
|
64
|
+
Configure it like so:
|
65
|
+
|
66
|
+
require 'maildir/web_queue'
|
67
|
+
app = Maildir::WebQueue
|
68
|
+
app.path = '/home/aaron/queue'
|
69
|
+
|
70
|
+
Push a message
|
71
|
+
|
72
|
+
POST /message?data=Hello World!
|
73
|
+
|
74
|
+
Shift a message
|
75
|
+
|
76
|
+
GET /message
|
77
|
+
|
78
|
+
Response:
|
79
|
+
{"key": "cur/message_id", "data": "Hello world!"}
|
80
|
+
Or 404 Not Found if no new messages
|
81
|
+
|
82
|
+
Delete a message
|
83
|
+
|
84
|
+
DELETE /message/key
|
85
|
+
|
86
|
+
Update a message's timestamps
|
87
|
+
|
88
|
+
POST /touch/key
|
89
|
+
|
90
|
+
Show count of messages in new and cur
|
91
|
+
|
92
|
+
GET /status
|
93
|
+
Response:
|
94
|
+
{"new": 2, "cur": 10}
|
4
95
|
|
5
96
|
== Note on Patches/Pull Requests
|
6
|
-
|
97
|
+
|
7
98
|
* Fork the project.
|
8
99
|
* Make your feature addition or bug fix.
|
9
100
|
* Add tests for it. This is important so I don't break it in a
|
data/Rakefile
CHANGED
@@ -1,28 +1,4 @@
|
|
1
|
-
require 'rubygems'
|
2
1
|
require 'rake'
|
3
|
-
|
4
|
-
begin
|
5
|
-
require 'jeweler'
|
6
|
-
Jeweler::Tasks.new do |gem|
|
7
|
-
gem.name = "maildir-queue"
|
8
|
-
gem.summary = %Q{A simple queue API with a maildir backend.}
|
9
|
-
gem.description = %Q{A simple queue API with a maildir backend. Also includes an HTTP API}
|
10
|
-
gem.email = "aaron@ktheory.com"
|
11
|
-
gem.homepage = "http://github.com/ktheory/maildir-queue"
|
12
|
-
gem.authors = ["Aaron Suggs"]
|
13
|
-
gem.add_development_dependency "shoulda", ">= 0"
|
14
|
-
gem.add_development_dependency "rack-test", ">= 0"
|
15
|
-
gem.add_development_dependency "ktheory-fakefs", ">= 0"
|
16
|
-
gem.add_dependency "maildir", ">= 0.3.0"
|
17
|
-
gem.add_dependency "sinatra", ">= 0.0.0"
|
18
|
-
gem.add_dependency "json", ">= 0.0.0"
|
19
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
20
|
-
end
|
21
|
-
Jeweler::GemcutterTasks.new
|
22
|
-
rescue LoadError
|
23
|
-
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
24
|
-
end
|
25
|
-
|
26
2
|
require 'rake/testtask'
|
27
3
|
Rake::TestTask.new(:test) do |test|
|
28
4
|
test.libs << 'lib' << 'test'
|
@@ -43,8 +19,6 @@ rescue LoadError
|
|
43
19
|
end
|
44
20
|
end
|
45
21
|
|
46
|
-
task :test => :check_dependencies
|
47
|
-
|
48
22
|
task :default => :test
|
49
23
|
|
50
24
|
require 'rake/rdoctask'
|
data/lib/maildir/queue.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
require 'maildir'
|
2
2
|
class Maildir::Queue < Maildir
|
3
|
-
# How many times to retry getting a key.
|
4
|
-
# Default is -1 (infinite retries)
|
5
|
-
SHIFT_RETRIES = -1
|
6
3
|
|
7
4
|
# Adds a new message to the queue. Returns a Maildir::Message object
|
8
5
|
def push(data)
|
@@ -11,29 +8,11 @@ class Maildir::Queue < Maildir
|
|
11
8
|
|
12
9
|
# Finds a new message and marks it as being processed (i.e. moves message
|
13
10
|
# from new to cur). Returns message if successful; nil if there are no
|
14
|
-
#
|
11
|
+
# new messages.
|
15
12
|
def shift
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
message = list(:new, :limit => 1).first
|
20
|
-
return nil if message.nil?
|
21
|
-
|
22
|
-
# Move the message from new to cur
|
23
|
-
if message.process
|
24
|
-
return message
|
25
|
-
else
|
26
|
-
raise Errno::ENOENT
|
27
|
-
end
|
28
|
-
rescue Errno::ENOENT
|
29
|
-
# Either message.process failed. Retry.
|
30
|
-
if SHIFT_RETRIES < 0 || retries < SHIFT_RETRIES
|
31
|
-
retries += 1
|
32
|
-
retry
|
33
|
-
else
|
34
|
-
# After several failures, act as if there are no pending messages
|
35
|
-
return nil
|
36
|
-
end
|
13
|
+
loop do
|
14
|
+
message = do_shift
|
15
|
+
return message unless false == message
|
37
16
|
end
|
38
17
|
end
|
39
18
|
|
@@ -57,4 +36,15 @@ class Maildir::Queue < Maildir
|
|
57
36
|
end
|
58
37
|
end
|
59
38
|
end
|
39
|
+
|
40
|
+
protected
|
41
|
+
# Called by shift. Returns the first message in the queue; nil if no
|
42
|
+
# messages are in the queue; or false if unable to process the message.
|
43
|
+
def do_shift
|
44
|
+
message = list(:new, :limit => 1).first
|
45
|
+
return nil if message.nil?
|
46
|
+
|
47
|
+
# Try to move the message from new to cur
|
48
|
+
message.process ? message : false
|
49
|
+
end
|
60
50
|
end
|
data/lib/maildir/web_queue.rb
CHANGED
@@ -4,7 +4,10 @@ require "json"
|
|
4
4
|
|
5
5
|
class Maildir::WebQueue < Sinatra::Base
|
6
6
|
|
7
|
-
|
7
|
+
KEY_VALIDATORS = [
|
8
|
+
/^cur\/\d{10}\.\w+(\.\w+)+:2,(\w+)?$/, # cur keys, with info
|
9
|
+
/^new\/\d{10}\.\w+(\.\w+)+$/ # new keys, no info
|
10
|
+
]
|
8
11
|
|
9
12
|
def self.path=(path)
|
10
13
|
@@queue = Maildir::Queue.new(path)
|
@@ -17,7 +20,7 @@ class Maildir::WebQueue < Sinatra::Base
|
|
17
20
|
# Test that key is well-formed. If not, return 403 Forbidden error.
|
18
21
|
def sanitize(key)
|
19
22
|
# E.g. cur/1263444769.M975543P58179Q11.gnt.local:2,
|
20
|
-
unless key.match(
|
23
|
+
unless KEY_VALIDATORS.any?{|validator| key.match(validator) }
|
21
24
|
content_type "text/plain"
|
22
25
|
halt 403, "Malformed key: #{key}"
|
23
26
|
end
|
@@ -28,10 +31,16 @@ class Maildir::WebQueue < Sinatra::Base
|
|
28
31
|
halt 204, ""
|
29
32
|
end
|
30
33
|
|
34
|
+
# Set the content type to JSON and returns the body as JSON
|
35
|
+
def json(body)
|
36
|
+
content_type "application/json"
|
37
|
+
body.to_json
|
38
|
+
end
|
39
|
+
|
31
40
|
# Check the server status
|
32
41
|
get "/status" do
|
33
|
-
|
34
|
-
|
42
|
+
body = {"new" => queue.list(:new).size,"cur" => queue.list(:cur).size}
|
43
|
+
json(body)
|
35
44
|
end
|
36
45
|
|
37
46
|
# Create a new message. Requires params[:data]
|
@@ -39,36 +48,38 @@ class Maildir::WebQueue < Sinatra::Base
|
|
39
48
|
post "/message" do
|
40
49
|
halt 400, "Must specify data parameter" unless params[:data]
|
41
50
|
message = queue.push(params[:data])
|
42
|
-
|
43
|
-
message.key.to_json
|
51
|
+
json(message.key)
|
44
52
|
end
|
45
53
|
|
46
54
|
# Shift a new message off the queue
|
47
55
|
get "/message" do
|
48
56
|
message = queue.shift
|
49
|
-
|
57
|
+
|
50
58
|
if message
|
51
|
-
{"key" => message.key, "data" => message.data}
|
59
|
+
json({"key" => message.key, "data" => message.data})
|
52
60
|
else
|
53
|
-
not_found "No
|
61
|
+
not_found json("No new messages")
|
54
62
|
end
|
55
63
|
end
|
56
64
|
|
57
65
|
# Delete a message from the queue
|
58
66
|
delete "/message/*" do |key|
|
59
67
|
sanitize(key)
|
60
|
-
queue.delete(key)
|
61
|
-
|
68
|
+
if queue.delete(key)
|
69
|
+
no_content
|
70
|
+
else
|
71
|
+
not_found json("Key #{key} does not exist")
|
72
|
+
end
|
62
73
|
end
|
63
74
|
|
64
|
-
#
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
75
|
+
# Update the timestamps on a message
|
76
|
+
post "/touch/*" do |key|
|
77
|
+
sanitize(key)
|
78
|
+
if queue.get(key).utime(Time.now, Time.now)
|
79
|
+
no_content
|
80
|
+
else
|
81
|
+
not_found json("Key #{key} does not exist")
|
82
|
+
end
|
83
|
+
end
|
73
84
|
end
|
74
85
|
|
data/test/helper.rb
CHANGED
data/test/test_maildir_queue.rb
CHANGED
@@ -5,43 +5,47 @@ class TestMaildirQueue < Test::Unit::TestCase
|
|
5
5
|
|
6
6
|
setup { FakeFS::FileSystem.clear }
|
7
7
|
|
8
|
+
should "return nil if no messages to shift" do
|
9
|
+
assert_equal nil, queue.shift
|
10
|
+
end
|
11
|
+
|
8
12
|
should "shift messages" do
|
9
|
-
|
10
|
-
|
11
|
-
message =
|
13
|
+
queue.add("1")
|
14
|
+
queue.add("2")
|
15
|
+
message = queue.shift
|
12
16
|
assert_equal "1", message.data
|
13
17
|
end
|
14
18
|
|
15
19
|
should "put shifted messages in cur" do
|
16
|
-
|
17
|
-
message =
|
20
|
+
queue.add("")
|
21
|
+
message = queue.shift
|
18
22
|
assert_equal :cur, message.dir
|
19
23
|
end
|
20
24
|
|
21
25
|
should "list stalled messages" do
|
22
|
-
|
23
|
-
message =
|
26
|
+
queue.add("")
|
27
|
+
message = queue.shift
|
24
28
|
mtime = Time.now - 100
|
25
29
|
message.utime(mtime, mtime)
|
26
|
-
assert
|
30
|
+
assert queue.stalled_messages(Time.now - 50).include?(message)
|
27
31
|
end
|
28
32
|
|
29
33
|
should "requeue stalled messages" do
|
30
34
|
data = "my data"
|
31
|
-
|
32
|
-
stalled_message =
|
35
|
+
queue.add(data)
|
36
|
+
stalled_message = queue.shift
|
33
37
|
mtime = Time.now - 100
|
34
38
|
stalled_message.utime(mtime, mtime)
|
35
|
-
|
36
|
-
assert_equal data,
|
39
|
+
queue.requeue_stalled_messages(Time.now - 50)
|
40
|
+
assert_equal data, queue.list(:new).first.data
|
37
41
|
end
|
38
42
|
|
39
43
|
should "return the number of requeued stalled messages" do
|
40
|
-
|
41
|
-
stalled_message =
|
44
|
+
queue.add("")
|
45
|
+
stalled_message = queue.shift
|
42
46
|
mtime = Time.now - 100
|
43
47
|
stalled_message.utime(mtime, mtime)
|
44
|
-
assert_equal 1,
|
48
|
+
assert_equal 1, queue.requeue_stalled_messages(Time.now - 50)
|
45
49
|
end
|
46
50
|
end
|
47
51
|
end
|
@@ -3,11 +3,11 @@ class TestMaildirWebQueue < Test::Unit::TestCase
|
|
3
3
|
include Rack::Test::Methods
|
4
4
|
|
5
5
|
def app
|
6
|
-
Maildir::WebQueue.path =
|
6
|
+
Maildir::WebQueue.path = queue.path
|
7
7
|
Maildir::WebQueue
|
8
8
|
end
|
9
9
|
|
10
|
-
context "The
|
10
|
+
context "The WebQueue" do
|
11
11
|
|
12
12
|
setup do
|
13
13
|
FakeFS::FileSystem.clear
|
@@ -26,44 +26,71 @@ class TestMaildirWebQueue < Test::Unit::TestCase
|
|
26
26
|
|
27
27
|
should "add posted messages to the queue" do
|
28
28
|
post "/message", :data => @data
|
29
|
-
assert_equal 1,
|
29
|
+
assert_equal 1, queue.list(:new).size
|
30
30
|
end
|
31
31
|
|
32
32
|
should "save messages with the right data" do
|
33
33
|
post "/message", :data => @data
|
34
|
-
assert_equal @data,
|
34
|
+
assert_equal @data, queue.list(:new).first.data
|
35
35
|
end
|
36
36
|
|
37
|
-
should "return 404 when no
|
37
|
+
should "return 404 when there are no new messages" do
|
38
38
|
get "/message"
|
39
39
|
assert_equal 404, last_response.status
|
40
40
|
end
|
41
41
|
|
42
|
-
should "return successfully when
|
42
|
+
should "return successfully when a new message exists" do
|
43
43
|
post "/message", :data => @data
|
44
44
|
get "/message"
|
45
45
|
assert last_response.ok?
|
46
46
|
end
|
47
47
|
|
48
|
-
should "return a well-formed key when
|
48
|
+
should "return a well-formed key when new a message exists" do
|
49
49
|
post "/message", :data => @data
|
50
50
|
get "/message"
|
51
|
-
assert_match Maildir::WebQueue::
|
51
|
+
assert_match Maildir::WebQueue::KEY_VALIDATORS[0], JSON.parse(last_response.body)["key"]
|
52
52
|
end
|
53
53
|
|
54
|
-
should "return message data when
|
54
|
+
should "return message data when a new message exits" do
|
55
55
|
post "/message", :data => @data
|
56
56
|
get "/message"
|
57
57
|
assert_equal @data, JSON.parse(last_response.body)["data"]
|
58
58
|
end
|
59
59
|
|
60
|
+
should "return 404 when touching a missing message" do
|
61
|
+
key = "cur/1234567890.M975543P58179Q11.host:2,"
|
62
|
+
post "/touch/#{key}"
|
63
|
+
assert_equal 404, last_response.status
|
64
|
+
end
|
65
|
+
|
66
|
+
should "touch a message" do
|
67
|
+
message = queue.add(@data)
|
68
|
+
message.process
|
69
|
+
|
70
|
+
post "/touch/#{message.key}"
|
71
|
+
assert_equal 204, last_response.status
|
72
|
+
end
|
73
|
+
|
74
|
+
should "update a message's mtime when touched" do
|
75
|
+
message = queue.add(@data)
|
76
|
+
message.process
|
77
|
+
|
78
|
+
# Set mtime to 30 minutes ago
|
79
|
+
message.utime(Time.now, Time.now - 30*60)
|
80
|
+
|
81
|
+
post "/touch/#{message.key}"
|
82
|
+
assert_in_delta Time.now, message.mtime, 1
|
83
|
+
end
|
60
84
|
end
|
61
85
|
|
62
|
-
# Test
|
63
|
-
bad_keys = [
|
86
|
+
# Test Maildir::WebQueue::KEY_VALIDATORS
|
87
|
+
bad_keys = [
|
88
|
+
"/etc/passwd", "cur/../../etc/password", "..",
|
64
89
|
"cur/123456789.M975543P58179Q11.host:2,",
|
65
90
|
"cur/1234567890.M975543P58179Q11:2,",
|
66
|
-
"cur/1234567890.M975543P58179Q11.host"
|
91
|
+
"cur/1234567890.M975543P58179Q11.host",
|
92
|
+
"new/1234567890.M975543P58179Q11.host:2,",
|
93
|
+
"tmp/1234567890.M975543P58179Q11.host:2,FRS"
|
67
94
|
]
|
68
95
|
bad_keys.each_with_index do |key, i|
|
69
96
|
define_method "test_bad_key_#{i}" do
|
@@ -72,14 +99,16 @@ class TestMaildirWebQueue < Test::Unit::TestCase
|
|
72
99
|
end
|
73
100
|
end
|
74
101
|
|
75
|
-
good_keys = [
|
102
|
+
good_keys = [
|
103
|
+
"cur/1234567890.M975543P58179Q11.host:2,",
|
76
104
|
"cur/1234567890.abc123.really.long.domain.co.uk:2,",
|
77
|
-
"cur/1234567890.M975543P58179Q11.host:2,FRS"
|
105
|
+
"cur/1234567890.M975543P58179Q11.host:2,FRS",
|
106
|
+
"new/1234567890.M975543P58179Q11.host"
|
78
107
|
]
|
79
108
|
good_keys.each_with_index do |key, i|
|
80
109
|
define_method "test_good_key_#{i}" do
|
81
110
|
delete "/message/#{key}"
|
82
|
-
|
111
|
+
assert_not_equal 403, last_response.status, "Key: #{key}"
|
83
112
|
end
|
84
113
|
end
|
85
114
|
end
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: maildir-queue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Aaron Suggs
|
@@ -9,89 +15,123 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date: 2010-
|
18
|
+
date: 2010-12-19 00:00:00 -05:00
|
13
19
|
default_executable:
|
14
20
|
dependencies:
|
15
21
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
22
|
+
name: rake
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
17
33
|
type: :development
|
18
|
-
|
19
|
-
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: shoulda
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
20
40
|
requirements:
|
21
41
|
- - ">="
|
22
42
|
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
23
46
|
version: "0"
|
24
|
-
|
47
|
+
type: :development
|
48
|
+
version_requirements: *id002
|
25
49
|
- !ruby/object:Gem::Dependency
|
26
50
|
name: rack-test
|
27
|
-
|
28
|
-
|
29
|
-
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
30
54
|
requirements:
|
31
55
|
- - ">="
|
32
56
|
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
33
60
|
version: "0"
|
34
|
-
|
61
|
+
type: :development
|
62
|
+
version_requirements: *id003
|
35
63
|
- !ruby/object:Gem::Dependency
|
36
64
|
name: ktheory-fakefs
|
37
|
-
|
38
|
-
|
39
|
-
|
65
|
+
prerelease: false
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
40
68
|
requirements:
|
41
69
|
- - ">="
|
42
70
|
- !ruby/object:Gem::Version
|
71
|
+
hash: 3
|
72
|
+
segments:
|
73
|
+
- 0
|
43
74
|
version: "0"
|
44
|
-
|
75
|
+
type: :development
|
76
|
+
version_requirements: *id004
|
45
77
|
- !ruby/object:Gem::Dependency
|
46
78
|
name: maildir
|
47
|
-
|
48
|
-
|
49
|
-
|
79
|
+
prerelease: false
|
80
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
50
82
|
requirements:
|
51
|
-
- -
|
83
|
+
- - ~>
|
52
84
|
- !ruby/object:Gem::Version
|
53
|
-
|
54
|
-
|
85
|
+
hash: 23
|
86
|
+
segments:
|
87
|
+
- 1
|
88
|
+
- 0
|
89
|
+
- 0
|
90
|
+
version: 1.0.0
|
91
|
+
type: :runtime
|
92
|
+
version_requirements: *id005
|
55
93
|
- !ruby/object:Gem::Dependency
|
56
94
|
name: sinatra
|
57
|
-
|
58
|
-
|
59
|
-
|
95
|
+
prerelease: false
|
96
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
60
98
|
requirements:
|
61
99
|
- - ">="
|
62
100
|
- !ruby/object:Gem::Version
|
63
|
-
|
64
|
-
|
101
|
+
hash: 3
|
102
|
+
segments:
|
103
|
+
- 0
|
104
|
+
version: "0"
|
105
|
+
type: :runtime
|
106
|
+
version_requirements: *id006
|
65
107
|
- !ruby/object:Gem::Dependency
|
66
108
|
name: json
|
67
|
-
|
68
|
-
|
69
|
-
|
109
|
+
prerelease: false
|
110
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
70
112
|
requirements:
|
71
113
|
- - ">="
|
72
114
|
- !ruby/object:Gem::Version
|
73
|
-
|
74
|
-
|
115
|
+
hash: 3
|
116
|
+
segments:
|
117
|
+
- 0
|
118
|
+
version: "0"
|
119
|
+
type: :runtime
|
120
|
+
version_requirements: *id007
|
75
121
|
description: A simple queue API with a maildir backend. Also includes an HTTP API
|
76
122
|
email: aaron@ktheory.com
|
77
123
|
executables: []
|
78
124
|
|
79
125
|
extensions: []
|
80
126
|
|
81
|
-
extra_rdoc_files:
|
82
|
-
|
83
|
-
- README.rdoc
|
127
|
+
extra_rdoc_files: []
|
128
|
+
|
84
129
|
files:
|
85
|
-
- .
|
86
|
-
- .
|
130
|
+
- lib/maildir/queue.rb
|
131
|
+
- lib/maildir/web_queue.rb
|
87
132
|
- LICENSE
|
88
133
|
- README.rdoc
|
89
134
|
- Rakefile
|
90
|
-
- VERSION
|
91
|
-
- examples/config.ru
|
92
|
-
- lib/maildir/queue.rb
|
93
|
-
- lib/maildir/web_queue.rb
|
94
|
-
- maildir-queue.gemspec
|
95
135
|
- test/helper.rb
|
96
136
|
- test/test_maildir_queue.rb
|
97
137
|
- test/test_maildir_web_queue.rb
|
@@ -105,21 +145,29 @@ rdoc_options:
|
|
105
145
|
require_paths:
|
106
146
|
- lib
|
107
147
|
required_ruby_version: !ruby/object:Gem::Requirement
|
148
|
+
none: false
|
108
149
|
requirements:
|
109
150
|
- - ">="
|
110
151
|
- !ruby/object:Gem::Version
|
152
|
+
hash: 3
|
153
|
+
segments:
|
154
|
+
- 0
|
111
155
|
version: "0"
|
112
|
-
version:
|
113
156
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
|
+
none: false
|
114
158
|
requirements:
|
115
159
|
- - ">="
|
116
160
|
- !ruby/object:Gem::Version
|
117
|
-
|
118
|
-
|
161
|
+
hash: 17
|
162
|
+
segments:
|
163
|
+
- 1
|
164
|
+
- 3
|
165
|
+
- 5
|
166
|
+
version: 1.3.5
|
119
167
|
requirements: []
|
120
168
|
|
121
169
|
rubyforge_project:
|
122
|
-
rubygems_version: 1.3.
|
170
|
+
rubygems_version: 1.3.7
|
123
171
|
signing_key:
|
124
172
|
specification_version: 3
|
125
173
|
summary: A simple queue API with a maildir backend.
|
data/.document
DELETED
data/.gitignore
DELETED
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.2.0
|
data/examples/config.ru
DELETED
data/maildir-queue.gemspec
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.name = %q{maildir-queue}
|
8
|
-
s.version = "0.2.0"
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Aaron Suggs"]
|
12
|
-
s.date = %q{2010-01-15}
|
13
|
-
s.description = %q{A simple queue API with a maildir backend. Also includes an HTTP API}
|
14
|
-
s.email = %q{aaron@ktheory.com}
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"LICENSE",
|
17
|
-
"README.rdoc"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
".document",
|
21
|
-
".gitignore",
|
22
|
-
"LICENSE",
|
23
|
-
"README.rdoc",
|
24
|
-
"Rakefile",
|
25
|
-
"VERSION",
|
26
|
-
"examples/config.ru",
|
27
|
-
"lib/maildir/queue.rb",
|
28
|
-
"lib/maildir/web_queue.rb",
|
29
|
-
"maildir-queue.gemspec",
|
30
|
-
"test/helper.rb",
|
31
|
-
"test/test_maildir_queue.rb",
|
32
|
-
"test/test_maildir_web_queue.rb"
|
33
|
-
]
|
34
|
-
s.homepage = %q{http://github.com/ktheory/maildir-queue}
|
35
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
36
|
-
s.require_paths = ["lib"]
|
37
|
-
s.rubygems_version = %q{1.3.5}
|
38
|
-
s.summary = %q{A simple queue API with a maildir backend.}
|
39
|
-
s.test_files = [
|
40
|
-
"test/helper.rb",
|
41
|
-
"test/test_maildir_queue.rb",
|
42
|
-
"test/test_maildir_web_queue.rb"
|
43
|
-
]
|
44
|
-
|
45
|
-
if s.respond_to? :specification_version then
|
46
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
47
|
-
s.specification_version = 3
|
48
|
-
|
49
|
-
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
50
|
-
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
51
|
-
s.add_development_dependency(%q<rack-test>, [">= 0"])
|
52
|
-
s.add_development_dependency(%q<ktheory-fakefs>, [">= 0"])
|
53
|
-
s.add_runtime_dependency(%q<maildir>, [">= 0.3.0"])
|
54
|
-
s.add_runtime_dependency(%q<sinatra>, [">= 0.0.0"])
|
55
|
-
s.add_runtime_dependency(%q<json>, [">= 0.0.0"])
|
56
|
-
else
|
57
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
58
|
-
s.add_dependency(%q<rack-test>, [">= 0"])
|
59
|
-
s.add_dependency(%q<ktheory-fakefs>, [">= 0"])
|
60
|
-
s.add_dependency(%q<maildir>, [">= 0.3.0"])
|
61
|
-
s.add_dependency(%q<sinatra>, [">= 0.0.0"])
|
62
|
-
s.add_dependency(%q<json>, [">= 0.0.0"])
|
63
|
-
end
|
64
|
-
else
|
65
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
66
|
-
s.add_dependency(%q<rack-test>, [">= 0"])
|
67
|
-
s.add_dependency(%q<ktheory-fakefs>, [">= 0"])
|
68
|
-
s.add_dependency(%q<maildir>, [">= 0.3.0"])
|
69
|
-
s.add_dependency(%q<sinatra>, [">= 0.0.0"])
|
70
|
-
s.add_dependency(%q<json>, [">= 0.0.0"])
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|