fnf 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -3,6 +3,8 @@ source "http://rubygems.org"
3
3
  # Specify your gem's dependencies in fnf.gemspec
4
4
  gemspec
5
5
 
6
+ gem 'rake-compiler'
7
+
6
8
  group :test do
7
9
  gem 'rspec'
8
10
  end
data/Makefile ADDED
@@ -0,0 +1,213 @@
1
+
2
+ SHELL = /bin/sh
3
+
4
+ #### Start of system configuration section. ####
5
+
6
+ srcdir = .
7
+ topdir = /home/capotej/.rvm/rubies/ruby-1.9.2-p180/include/ruby-1.9.1
8
+ hdrdir = /home/capotej/.rvm/rubies/ruby-1.9.2-p180/include/ruby-1.9.1
9
+ arch_hdrdir = /home/capotej/.rvm/rubies/ruby-1.9.2-p180/include/ruby-1.9.1/$(arch)
10
+ VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby
11
+ prefix = $(DESTDIR)/home/capotej/.rvm/rubies/ruby-1.9.2-p180
12
+ rubylibprefix = $(libdir)/$(RUBY_BASE_NAME)
13
+ exec_prefix = $(prefix)
14
+ vendorhdrdir = $(rubyhdrdir)/vendor_ruby
15
+ sitehdrdir = $(rubyhdrdir)/site_ruby
16
+ rubyhdrdir = $(includedir)/$(RUBY_BASE_NAME)-$(ruby_version)
17
+ vendordir = $(rubylibprefix)/vendor_ruby
18
+ sitedir = $(rubylibprefix)/site_ruby
19
+ ridir = $(datarootdir)/$(RI_BASE_NAME)
20
+ mandir = $(datarootdir)/man
21
+ localedir = $(datarootdir)/locale
22
+ libdir = $(exec_prefix)/lib
23
+ psdir = $(docdir)
24
+ pdfdir = $(docdir)
25
+ dvidir = $(docdir)
26
+ htmldir = $(docdir)
27
+ infodir = $(datarootdir)/info
28
+ docdir = $(datarootdir)/doc/$(PACKAGE)
29
+ oldincludedir = $(DESTDIR)/usr/include
30
+ includedir = $(prefix)/include
31
+ localstatedir = $(prefix)/var
32
+ sharedstatedir = $(prefix)/com
33
+ sysconfdir = $(prefix)/etc
34
+ datadir = $(datarootdir)
35
+ datarootdir = $(prefix)/share
36
+ libexecdir = $(exec_prefix)/libexec
37
+ sbindir = $(exec_prefix)/sbin
38
+ bindir = $(exec_prefix)/bin
39
+ rubylibdir = $(rubylibprefix)/$(ruby_version)
40
+ archdir = $(rubylibdir)/$(arch)
41
+ sitelibdir = $(sitedir)/$(ruby_version)
42
+ sitearchdir = $(sitelibdir)/$(sitearch)
43
+ vendorlibdir = $(vendordir)/$(ruby_version)
44
+ vendorarchdir = $(vendorlibdir)/$(sitearch)
45
+
46
+ CC = gcc
47
+ CXX = g++
48
+ LIBRUBY = $(LIBRUBY_SO)
49
+ LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
50
+ LIBRUBYARG_SHARED = -Wl,-R -Wl,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)
51
+ LIBRUBYARG_STATIC = -Wl,-R -Wl,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)-static
52
+ OUTFLAG = -o
53
+ COUTFLAG = -o
54
+
55
+ RUBY_EXTCONF_H =
56
+ cflags = $(optflags) $(debugflags) $(warnflags)
57
+ optflags = -O3
58
+ debugflags = -ggdb
59
+ warnflags = -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long
60
+ CFLAGS = -fPIC $(cflags) -fPIC
61
+ INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir)
62
+ DEFS = -D_FILE_OFFSET_BITS=64
63
+ CPPFLAGS = $(DEFS) $(cppflags)
64
+ CXXFLAGS = $(CFLAGS) $(cxxflags)
65
+ ldflags = -L. -rdynamic -Wl,-export-dynamic
66
+ dldflags =
67
+ ARCH_FLAG =
68
+ DLDFLAGS = $(ldflags) $(dldflags)
69
+ LDSHARED = $(CC) -shared
70
+ LDSHAREDXX = $(CXX) -shared
71
+ AR = ar
72
+ EXEEXT =
73
+
74
+ RUBY_BASE_NAME = ruby
75
+ RUBY_INSTALL_NAME = ruby
76
+ RUBY_SO_NAME = ruby
77
+ arch = i686-linux
78
+ sitearch = $(arch)
79
+ ruby_version = 1.9.1
80
+ ruby = /home/capotej/.rvm/rubies/ruby-1.9.2-p180/bin/ruby
81
+ RUBY = $(ruby)
82
+ RM = rm -f
83
+ RM_RF = $(RUBY) -run -e rm -- -rf
84
+ RMDIRS = $(RUBY) -run -e rmdir -- -p
85
+ MAKEDIRS = /bin/mkdir -p
86
+ INSTALL = /usr/bin/install -c
87
+ INSTALL_PROG = $(INSTALL) -m 0755
88
+ INSTALL_DATA = $(INSTALL) -m 644
89
+ COPY = cp
90
+
91
+ #### End of system configuration section. ####
92
+
93
+ preload =
94
+
95
+ libpath = . $(libdir)
96
+ LIBPATH = -L. -L$(libdir) -Wl,-R$(libdir)
97
+ DEFFILE =
98
+
99
+ CLEANFILES = mkmf.log
100
+ DISTCLEANFILES =
101
+ DISTCLEANDIRS =
102
+
103
+ extout =
104
+ extout_prefix =
105
+ target_prefix =
106
+ LOCAL_LIBS =
107
+ LIBS = $(LIBRUBYARG_SHARED) -lpthread -lrt -ldl -lcrypt -lm -lc
108
+ SRCS = FifoWriter.c
109
+ OBJS = FifoWriter.o
110
+ TARGET = fifowriter
111
+ DLLIB = $(TARGET).so
112
+ EXTSTATIC =
113
+ STATIC_LIB =
114
+
115
+ BINDIR = $(bindir)
116
+ RUBYCOMMONDIR = $(sitedir)$(target_prefix)
117
+ RUBYLIBDIR = $(sitelibdir)$(target_prefix)
118
+ RUBYARCHDIR = $(sitearchdir)$(target_prefix)
119
+ HDRDIR = $(rubyhdrdir)/ruby$(target_prefix)
120
+ ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix)
121
+
122
+ TARGET_SO = $(DLLIB)
123
+ CLEANLIBS = $(TARGET).so
124
+ CLEANOBJS = *.o *.bak
125
+
126
+ all: $(DLLIB)
127
+ static: $(STATIC_LIB)
128
+ .PHONY: all install static install-so install-rb
129
+ .PHONY: clean clean-so clean-rb
130
+
131
+ clean-rb-default::
132
+ clean-rb::
133
+ clean-so::
134
+ clean: clean-so clean-rb-default clean-rb
135
+ @-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)
136
+
137
+ distclean-rb-default::
138
+ distclean-rb::
139
+ distclean-so::
140
+ distclean: clean distclean-so distclean-rb-default distclean-rb
141
+ @-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
142
+ @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
143
+ @-$(RMDIRS) $(DISTCLEANDIRS)
144
+
145
+ realclean: distclean
146
+ install: install-so install-rb
147
+
148
+ install-so: $(RUBYARCHDIR)
149
+ install-so: $(RUBYARCHDIR)/$(DLLIB)
150
+ $(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
151
+ @-$(MAKEDIRS) $(@D)
152
+ $(INSTALL_PROG) $(DLLIB) $(@D)
153
+ install-rb: pre-install-rb install-rb-default
154
+ install-rb-default: pre-install-rb-default
155
+ pre-install-rb: Makefile
156
+ pre-install-rb-default: Makefile
157
+ pre-install-rb-default: $(RUBYLIBDIR)/fnf
158
+ install-rb-default: $(RUBYLIBDIR)/fnf/connection.rb
159
+ $(RUBYLIBDIR)/fnf/connection.rb: $(srcdir)/lib/fnf/connection.rb
160
+ @-$(MAKEDIRS) $(@D)
161
+ $(INSTALL_DATA) $(srcdir)/lib/fnf/connection.rb $(@D)
162
+ install-rb-default: $(RUBYLIBDIR)/fnf/worker.rb
163
+ $(RUBYLIBDIR)/fnf/worker.rb: $(srcdir)/lib/fnf/worker.rb
164
+ @-$(MAKEDIRS) $(@D)
165
+ $(INSTALL_DATA) $(srcdir)/lib/fnf/worker.rb $(@D)
166
+ install-rb-default: $(RUBYLIBDIR)/fnf/client.rb
167
+ $(RUBYLIBDIR)/fnf/client.rb: $(srcdir)/lib/fnf/client.rb
168
+ @-$(MAKEDIRS) $(@D)
169
+ $(INSTALL_DATA) $(srcdir)/lib/fnf/client.rb $(@D)
170
+ install-rb-default: $(RUBYLIBDIR)/fnf/version.rb
171
+ $(RUBYLIBDIR)/fnf/version.rb: $(srcdir)/lib/fnf/version.rb
172
+ @-$(MAKEDIRS) $(@D)
173
+ $(INSTALL_DATA) $(srcdir)/lib/fnf/version.rb $(@D)
174
+ pre-install-rb-default: $(RUBYLIBDIR)
175
+ install-rb-default: $(RUBYLIBDIR)/fnf.rb
176
+ $(RUBYLIBDIR)/fnf.rb: $(srcdir)/lib/fnf.rb
177
+ @-$(MAKEDIRS) $(@D)
178
+ $(INSTALL_DATA) $(srcdir)/lib/fnf.rb $(@D)
179
+ $(RUBYARCHDIR):
180
+ $(MAKEDIRS) $@
181
+ $(RUBYLIBDIR)/fnf:
182
+ $(MAKEDIRS) $@
183
+ $(RUBYLIBDIR):
184
+ $(MAKEDIRS) $@
185
+
186
+ site-install: site-install-so site-install-rb
187
+ site-install-so: install-so
188
+ site-install-rb: install-rb
189
+
190
+ .SUFFIXES: .c .m .cc .cxx .cpp .C .o
191
+
192
+ .cc.o:
193
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
194
+
195
+ .cxx.o:
196
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
197
+
198
+ .cpp.o:
199
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
200
+
201
+ .C.o:
202
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
203
+
204
+ .c.o:
205
+ $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<
206
+
207
+ $(DLLIB): $(OBJS) Makefile
208
+ @-$(RM) $(@)
209
+ $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
210
+
211
+
212
+
213
+ $(OBJS): $(hdrdir)/ruby.h $(hdrdir)/ruby/defines.h $(arch_hdrdir)/ruby/config.h
data/README.markdown CHANGED
@@ -3,25 +3,66 @@
3
3
 
4
4
  ## Intro
5
5
 
6
- Fire and Forget replaces the need to write resque tasks or delayed jobs to fire off web requests (usually notification webhooks or a anti-spam service, like defensio or akismet). A single worker reads and executes web requests from a blocking named pipe, while clients queue up them up in a non blocking manner. It uses typhoeus internally to execute the web requests for maximum speed.
6
+ Fire and Forget replaces the need to write resque tasks or delayed jobs to fire off web requests (usually notification webhooks or a anti-spam service, like defensio or akismet). A single worker reads and executes web requests from a named pipe, while clients write to that pipe. It uses typhoeus internally to execute the web requests for maximum speed.
7
7
 
8
8
  ## Usage (worker)
9
9
 
10
10
  Start the server
11
11
 
12
- ```fnf```
12
+ ```
13
+ fnf
14
+ ```
13
15
 
14
- (add this to rc.local, or a startup script)
15
16
 
16
- ## Usage (client, rails)
17
+ ## Usage (client)
17
18
 
18
- Add to gemfile, or vendor the gem
19
+ Add to gemfile, vendor the gem, gem install, etc
19
20
 
20
- ```gem 'fnf'```
21
+ ```gem 'fnf'``` or ```gem install fnf```
21
22
 
22
- From a controller or model
23
+ From anywhere:
23
24
 
24
- ```Fnf::Client.queue({:post => "http://api.akismet.com/process", :params => { :thing => "2123" })```
25
+ ```
26
+ require 'fnf'
27
+ Fnf::Client.queue({:post => "http://api.akismet.com/process", :params => { :thing => "2123" })
28
+ ```
29
+
30
+
31
+ ## Kicking the tires
32
+
33
+ Start a rails project
34
+
35
+ ```
36
+ rails new foo
37
+ ```
38
+
39
+ Start the server
40
+
41
+ ```
42
+ cd foo
43
+ rails server
44
+ ```
45
+
46
+ Clone this project
47
+
48
+ ```
49
+ git clone git@github.com:capotej/fnf.git
50
+ cd fnf
51
+ ```
52
+
53
+ Start the fnf server
54
+
55
+ ```
56
+ bin/fnf
57
+ ```
58
+
59
+ Run the test
60
+
61
+ ```
62
+ ruby fnf_test.rb
63
+ ```
64
+
65
+ You should see a request for /asdd hit your rails logs
25
66
 
26
67
 
27
68
  ![Set and Forget It](http://naturallyalise.com/blog/wp-content/uploads/2011/03/set-it-and-forget-it-ronco-rotisserie.jpg)
data/Rakefile CHANGED
@@ -1,2 +1,9 @@
1
+ require 'rubygems'
1
2
  require 'bundler'
2
3
  Bundler::GemHelper.install_tasks
4
+
5
+ require 'rake/extensiontask'
6
+
7
+ Rake::ExtensionTask.new('fifowriter') do |ext|
8
+ ext.lib_dir = File.join('lib', 'fifowriter')
9
+ end
@@ -0,0 +1,2 @@
1
+ require 'mkmf'
2
+ create_makefile('fifowriter/fifowriter')
@@ -0,0 +1,21 @@
1
+ #include "ruby.h"
2
+ #include <stdio.h>
3
+ #include <stdlib.h>
4
+ #include <fcntl.h>
5
+ VALUE FifoWriter = Qnil;
6
+
7
+ void Init_fifowriter();
8
+
9
+ static void method_write_to_fifo(VALUE self, VALUE string);
10
+
11
+ void Init_fifowriter() {
12
+ FifoWriter = rb_define_module("FifoWriter");
13
+ rb_define_singleton_method(FifoWriter, "write_to_fifo", method_write_to_fifo, 1);
14
+ }
15
+
16
+ static void method_write_to_fifo(VALUE self, VALUE string) {
17
+ int fd;
18
+ fd = open("/tmp/fnfq", O_WRONLY | O_NONBLOCK);
19
+ write(fd, RSTRING_PTR(string), strlen(RSTRING_PTR(string)));
20
+ close(fd);
21
+ }
data/fnf.gemspec CHANGED
@@ -1,4 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
1
  $:.push File.expand_path("../lib", __FILE__)
3
2
  require "fnf/version"
4
3
 
@@ -14,11 +13,14 @@ Gem::Specification.new do |s|
14
13
 
15
14
  s.rubyforge_project = "fnf"
16
15
 
17
- s.add_dependency 'daemons'
18
16
  s.add_dependency 'mkfifo'
19
17
  s.add_dependency 'ruby-fifo'
20
- s.add_dependency 'typhoeus'
21
-
18
+ s.add_dependency 'eventmachine'
19
+ s.add_dependency 'msgpack'
20
+ s.platform = Gem::Platform::RUBY
21
+
22
+ s.extensions = Dir["ext/**/extconf.rb"]
23
+
22
24
  s.files = `git ls-files`.split("\n")
23
25
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
24
26
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
data/fnf_test.rb CHANGED
@@ -1,4 +1,11 @@
1
1
  $: << "./lib"
2
2
  require 'fnf'
3
3
 
4
- Fnf::Client.queue(:get => "http://127.0.0.1:3000/asdd")
4
+ start_dt = Time.now
5
+ 100000.times do |i|
6
+ Fnf::Client.queue(:get => "http://127.0.0.1:1337/#{i}")
7
+ end
8
+ end_dt = Time.now
9
+ puts (end_dt.to_f - start_dt.to_f)
10
+
11
+
Binary file
data/lib/fnf.rb CHANGED
@@ -1,7 +1,12 @@
1
- require 'typhoeus'
1
+ require 'rubygems'
2
2
  require 'daemons'
3
3
  require 'fifo'
4
4
  require 'json'
5
+ require 'eventmachine'
6
+ require 'typhoeus'
7
+ require 'em-http-request'
8
+ require 'msgpack'
9
+ require 'fifowriter/fifowriter'
5
10
 
6
11
  module Fnf
7
12
  autoload :Connection, 'fnf/connection'
data/lib/fnf/client.rb CHANGED
@@ -1,15 +1,17 @@
1
1
  module Fnf
2
+
2
3
  class Client
4
+
3
5
  attr_accessor :url, :verb, :params
4
6
 
5
7
  def self.queue(hsh)
6
8
  verb = get_verb(hsh)
7
9
  url = hsh[verb]
8
10
  params = hsh[:params]
9
- pipe = Fifo.new('/tmp/fnfq')
10
- pipe.puts [verb,url,params].to_json
11
+ FifoWriter.write_to_fifo "#{[verb,url,params].to_msgpack}\n"
11
12
  end
12
13
 
14
+
13
15
  def self.get_verb(hsh)
14
16
  [:delete, :get, :post, :put, :head].each do |verb|
15
17
  return verb if hsh[verb]
data/lib/fnf/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Fnf
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/fnf/worker.rb CHANGED
@@ -1,13 +1,28 @@
1
1
  module Fnf
2
- class Worker
3
2
 
3
+ module RequestWorker
4
+ def initialize(pipe)
5
+ @pipe = pipe
6
+ end
7
+
8
+ def notify_readable
9
+ data = @pipe.readline.chomp
10
+ fetch = proc {
11
+ payload = MessagePack.unpack(data)
12
+ Connection.send(payload[0], payload[1], payload[2])
13
+ }
14
+ noop = proc { }
15
+ EM.defer fetch, noop
16
+
17
+ end
18
+ end
19
+
20
+ class Worker
4
21
  def self.run
5
22
  pipe = Fifo.new('/tmp/fnfq')
6
- while contents = pipe.readline
7
- begin
8
- payload = JSON.parse(contents)
9
- Connection.send(payload[0], payload[1], payload[2])
10
- rescue
23
+ EventMachine::run do
24
+ EventMachine::watch(pipe.to_io, RequestWorker, pipe) do |c|
25
+ c.notify_readable = true
11
26
  end
12
27
  end
13
28
  end
metadata CHANGED
@@ -1,8 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fnf
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.0.1
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 2
10
+ version: 0.0.2
6
11
  platform: ruby
7
12
  authors:
8
13
  - Julio Capote
@@ -10,50 +15,62 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2011-05-20 00:00:00 -07:00
18
+ date: 2011-05-27 00:00:00 -07:00
14
19
  default_executable:
15
20
  dependencies:
16
21
  - !ruby/object:Gem::Dependency
17
- name: daemons
22
+ name: mkfifo
18
23
  prerelease: false
19
24
  requirement: &id001 !ruby/object:Gem::Requirement
20
25
  none: false
21
26
  requirements:
22
27
  - - ">="
23
28
  - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
24
32
  version: "0"
25
33
  type: :runtime
26
34
  version_requirements: *id001
27
35
  - !ruby/object:Gem::Dependency
28
- name: mkfifo
36
+ name: ruby-fifo
29
37
  prerelease: false
30
38
  requirement: &id002 !ruby/object:Gem::Requirement
31
39
  none: false
32
40
  requirements:
33
41
  - - ">="
34
42
  - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
35
46
  version: "0"
36
47
  type: :runtime
37
48
  version_requirements: *id002
38
49
  - !ruby/object:Gem::Dependency
39
- name: ruby-fifo
50
+ name: eventmachine
40
51
  prerelease: false
41
52
  requirement: &id003 !ruby/object:Gem::Requirement
42
53
  none: false
43
54
  requirements:
44
55
  - - ">="
45
56
  - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
46
60
  version: "0"
47
61
  type: :runtime
48
62
  version_requirements: *id003
49
63
  - !ruby/object:Gem::Dependency
50
- name: typhoeus
64
+ name: msgpack
51
65
  prerelease: false
52
66
  requirement: &id004 !ruby/object:Gem::Requirement
53
67
  none: false
54
68
  requirements:
55
69
  - - ">="
56
70
  - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
57
74
  version: "0"
58
75
  type: :runtime
59
76
  version_requirements: *id004
@@ -62,18 +79,22 @@ email:
62
79
  - jcapote@gmail.com
63
80
  executables:
64
81
  - fnf
65
- extensions: []
66
-
82
+ extensions:
83
+ - ext/fifowriter/extconf.rb
67
84
  extra_rdoc_files: []
68
85
 
69
86
  files:
70
87
  - .gitignore
71
88
  - Gemfile
89
+ - Makefile
72
90
  - README.markdown
73
91
  - Rakefile
74
92
  - bin/fnf
93
+ - ext/fifowriter/extconf.rb
94
+ - ext/fifowriter/fifowriter.c
75
95
  - fnf.gemspec
76
96
  - fnf_test.rb
97
+ - lib/fifowriter/fifowriter.bundle
77
98
  - lib/fnf.rb
78
99
  - lib/fnf/client.rb
79
100
  - lib/fnf/connection.rb
@@ -96,19 +117,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
96
117
  requirements:
97
118
  - - ">="
98
119
  - !ruby/object:Gem::Version
120
+ hash: 3
121
+ segments:
122
+ - 0
99
123
  version: "0"
100
124
  required_rubygems_version: !ruby/object:Gem::Requirement
101
125
  none: false
102
126
  requirements:
103
127
  - - ">="
104
128
  - !ruby/object:Gem::Version
129
+ hash: 3
130
+ segments:
131
+ - 0
105
132
  version: "0"
106
133
  requirements: []
107
134
 
108
135
  rubyforge_project: fnf
109
- rubygems_version: 1.6.1
136
+ rubygems_version: 1.3.7
110
137
  signing_key:
111
138
  specification_version: 3
112
139
  summary: Fire And Forget, a queue designed for disposable web requests
113
- test_files: []
114
-
140
+ test_files:
141
+ - spec/client_spec.rb
142
+ - spec/spec.opts
143
+ - spec/spec_helper.rb