now_and_later 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +27 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +19 -0
- data/Rakefile +49 -0
- data/VERSION +1 -0
- data/lib/now_and_later.rb +36 -0
- data/lib/now_and_later/engine.rb +7 -0
- data/lib/now_and_later/enqueue.rb +4 -0
- data/lib/now_and_later/enqueue/with_delayed_job.rb +9 -0
- data/lib/now_and_later/enqueue/with_resque.rb +29 -0
- data/lib/now_and_later/queue.rb +25 -0
- data/lib/now_and_later/runner.rb +25 -0
- data/lib/now_and_later/service.rb +123 -0
- data/lib/now_and_later/service/with_resque.rb +29 -0
- data/now_and_later.gemspec +70 -0
- data/spec/now_and_later/engine_spec.rb +5 -0
- data/spec/now_and_later/enqueue_service_spec.rb +5 -0
- data/spec/now_and_later/queue/with_delayed_job_spec.rb +52 -0
- data/spec/now_and_later/queue_spec.rb +62 -0
- data/spec/now_and_later/service_spec.rb +44 -0
- data/spec/now_and_later_spec.rb +5 -0
- data/spec/spec_helper.rb +12 -0
- metadata +108 -0
data/.document
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/Gemfile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
# Add dependencies required to use your gem here.
|
3
|
+
# Example:
|
4
|
+
# gem "activesupport", ">= 2.3.5"
|
5
|
+
|
6
|
+
# gem 'rails', '>= 3.0.7'
|
7
|
+
|
8
|
+
# Add dependencies to develop your gem here.
|
9
|
+
# Include everything needed to run rake, tests, features, etc.
|
10
|
+
group :development do
|
11
|
+
gem "rspec", "~> 2.3.0"
|
12
|
+
# gem "bundler", "~> 1.0.0"
|
13
|
+
gem "jeweler", "~> 1.6.4"
|
14
|
+
gem "rcov", ">= 0"
|
15
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
diff-lcs (1.1.3)
|
5
|
+
git (1.2.5)
|
6
|
+
jeweler (1.6.4)
|
7
|
+
bundler (~> 1.0)
|
8
|
+
git (>= 1.2.5)
|
9
|
+
rake
|
10
|
+
rake (0.9.2.2)
|
11
|
+
rcov (0.9.11)
|
12
|
+
rspec (2.3.0)
|
13
|
+
rspec-core (~> 2.3.0)
|
14
|
+
rspec-expectations (~> 2.3.0)
|
15
|
+
rspec-mocks (~> 2.3.0)
|
16
|
+
rspec-core (2.3.1)
|
17
|
+
rspec-expectations (2.3.0)
|
18
|
+
diff-lcs (~> 1.1.2)
|
19
|
+
rspec-mocks (2.3.0)
|
20
|
+
|
21
|
+
PLATFORMS
|
22
|
+
ruby
|
23
|
+
|
24
|
+
DEPENDENCIES
|
25
|
+
jeweler (~> 1.6.4)
|
26
|
+
rcov
|
27
|
+
rspec (~> 2.3.0)
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 Jordan Glasner
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
= now_and_later
|
2
|
+
|
3
|
+
Description goes here.
|
4
|
+
|
5
|
+
== Contributing to now_and_later
|
6
|
+
|
7
|
+
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
8
|
+
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
|
9
|
+
* Fork the project
|
10
|
+
* Start a feature/bugfix branch
|
11
|
+
* Commit and push until you are happy with your contribution
|
12
|
+
* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
|
13
|
+
* Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
|
14
|
+
|
15
|
+
== Copyright
|
16
|
+
|
17
|
+
Copyright (c) 2012 Jordan Glasner. See LICENSE.txt for
|
18
|
+
further details.
|
19
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,49 @@
|
|
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 = "now_and_later"
|
18
|
+
gem.homepage = "http://github.com/glasner/now_and_later"
|
19
|
+
gem.license = "MIT"
|
20
|
+
gem.summary = 'new app/services can be ran now or later'
|
21
|
+
gem.description = 'app/services'
|
22
|
+
gem.email = "jordan@digitalignition.com"
|
23
|
+
gem.authors = ["Jordan Glasner"]
|
24
|
+
# dependencies defined in Gemfile
|
25
|
+
end
|
26
|
+
Jeweler::RubygemsDotOrgTasks.new
|
27
|
+
|
28
|
+
require 'rspec/core'
|
29
|
+
require 'rspec/core/rake_task'
|
30
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
31
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
32
|
+
end
|
33
|
+
|
34
|
+
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
35
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
36
|
+
spec.rcov = true
|
37
|
+
end
|
38
|
+
|
39
|
+
task :default => :spec
|
40
|
+
|
41
|
+
require 'rake/rdoctask'
|
42
|
+
Rake::RDocTask.new do |rdoc|
|
43
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
44
|
+
|
45
|
+
rdoc.rdoc_dir = 'rdoc'
|
46
|
+
rdoc.title = "now_and_later #{version}"
|
47
|
+
rdoc.rdoc_files.include('README*')
|
48
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
49
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.2.0
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module NowAndLater
|
2
|
+
VERSION = '0.0.1'
|
3
|
+
|
4
|
+
## Backend
|
5
|
+
# stores reference to backend class
|
6
|
+
def self.backend; @backend ||= find_backend; end
|
7
|
+
|
8
|
+
# returns symbol for current backend, e.g. :delayed_job
|
9
|
+
def self.find_backend
|
10
|
+
return :delayed_job if defined?(Delayed::Job)
|
11
|
+
return :resque if defined?(Resque)
|
12
|
+
raise LoadError, "NowAndLater::Queue requires delayed_job or resque gem"
|
13
|
+
end
|
14
|
+
|
15
|
+
### WithBackend
|
16
|
+
# all extensions take form Class::WithBackend, e.g. Enqueue::WithDelayedJob
|
17
|
+
def self.with_backend(namespace = nil)
|
18
|
+
mixin = "With#{backend.to_s.camelcase}"
|
19
|
+
namespace.nil? ? mixin : "NowAndLater::#{namespace}::#{mixin}".constantize
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
require 'rails'
|
25
|
+
|
26
|
+
require 'now_and_later/service'
|
27
|
+
require 'now_and_later/service/with_resque'
|
28
|
+
require 'now_and_later/queue'
|
29
|
+
require 'now_and_later/enqueue'
|
30
|
+
require 'now_and_later/enqueue/with_delayed_job'
|
31
|
+
require 'now_and_later/enqueue/with_resque'
|
32
|
+
require 'now_and_later/runner'
|
33
|
+
|
34
|
+
case NowAndLater.backend
|
35
|
+
when :resque then NowAndLater::Service.send :include, NowAndLater::Service::WithResque
|
36
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
## NowAndLater::Enqueue::WithResque
|
2
|
+
# service enqueues any service with Resque
|
3
|
+
# encodes any ActiveRecord args into a hash to work with Resque
|
4
|
+
|
5
|
+
class NowAndLater::Enqueue::WithResque < NowAndLater::Service
|
6
|
+
|
7
|
+
takes :service, :args
|
8
|
+
|
9
|
+
def run
|
10
|
+
Resque.enqueue @service, *encoded_args
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def encoded_args
|
16
|
+
@args.map do |arg|
|
17
|
+
active_record?(arg) ? encode_active_record(arg) : arg
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def active_record?(value)
|
22
|
+
value.is_a? ActiveRecord::Base
|
23
|
+
end
|
24
|
+
|
25
|
+
def encode_active_record(arg)
|
26
|
+
"nal:#{arg.class}|#{arg.id}"
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class NowAndLater::Queue
|
2
|
+
|
3
|
+
# current queue instance
|
4
|
+
def self.current
|
5
|
+
@@current ||= new
|
6
|
+
end
|
7
|
+
|
8
|
+
# public class method for enqueuing services
|
9
|
+
def self.add(service,*args)
|
10
|
+
current.send :add, service, *args
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
## Add
|
18
|
+
# proxies backend enqueue service e.g. Enqueue::WithDelayedJob
|
19
|
+
def add(service,*args)
|
20
|
+
NowAndLater.with_backend('Enqueue').now service, args
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
## NowAndLater::Runner Mixin
|
2
|
+
# shortcuts for running services namespaced under object
|
3
|
+
# e.g. account.run(:my_service, one: 1) = Account::MyService.now account, one: 1
|
4
|
+
|
5
|
+
module NowAndLater::Runner
|
6
|
+
|
7
|
+
# run given service now
|
8
|
+
def run(symbol,*args)
|
9
|
+
service(symbol).now self,*args
|
10
|
+
end
|
11
|
+
|
12
|
+
# run given service later
|
13
|
+
def later(symbol,*args)
|
14
|
+
service(symbol).later self,*args
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
# returns namesaced service class for given symbol
|
20
|
+
# e.g. account.service(:my_service) return Account::MyService
|
21
|
+
def service(symbol)
|
22
|
+
"#{self.class}::#{symbol.to_s.camelcase}".constantize
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
## NowAndLater::Service
|
2
|
+
# base class of all app services
|
3
|
+
|
4
|
+
## Setup for Subclasses
|
5
|
+
|
6
|
+
### Args
|
7
|
+
# pass one or more arg names to self.takes
|
8
|
+
# e.g. takes :name, :address
|
9
|
+
# each arch will be setup as an instance variable (@name,@address above)
|
10
|
+
|
11
|
+
## Subclass#run
|
12
|
+
# put your app logic inside a public run method
|
13
|
+
# all other helper methods should be private
|
14
|
+
|
15
|
+
## Running
|
16
|
+
### Now
|
17
|
+
# to run a service an return the results immediately use Service.now
|
18
|
+
# e.g. @user = UpdateUserAdress.now @name, @address
|
19
|
+
|
20
|
+
### Later with Delayed::Job
|
21
|
+
# you can also run your service later with delayed job later
|
22
|
+
# e.g. SendWelcomeEmail.later @user
|
23
|
+
|
24
|
+
class NowAndLater::Service
|
25
|
+
|
26
|
+
## Args
|
27
|
+
# setup args for runners
|
28
|
+
def self.takes(*names)
|
29
|
+
return @takes if names.empty?
|
30
|
+
@takes = names
|
31
|
+
end
|
32
|
+
|
33
|
+
## ActiveRecord Args
|
34
|
+
# setup an arg so that it be passed as ActiveRecord instance or integer
|
35
|
+
# calling sets up two instance methods #arg (instance) and #arg_id (int)
|
36
|
+
# which should be used to access arg instead of @arg
|
37
|
+
# e.g. can_find :account sets up:
|
38
|
+
# * Service#account #=> Account instance
|
39
|
+
# * Service#account_id #=> 1
|
40
|
+
### Override Class Name
|
41
|
+
# use opt[:class_name] to set ActiveRecord class name as a string when
|
42
|
+
# class can't be inferred from arg name
|
43
|
+
def self.can_find(arg,opt={})
|
44
|
+
@finders ||= {}
|
45
|
+
@finders[arg] = opt
|
46
|
+
define_record_getter arg
|
47
|
+
define_id_getter arg
|
48
|
+
end
|
49
|
+
|
50
|
+
## Runners
|
51
|
+
|
52
|
+
def self.now(*args)
|
53
|
+
new(*args).run
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.later(*args)
|
57
|
+
NowAndLater::Queue.add self, *args
|
58
|
+
end
|
59
|
+
|
60
|
+
## Initialize
|
61
|
+
# takes any number of args which are set as instance variables
|
62
|
+
def initialize(*args)
|
63
|
+
set_instance_variables args
|
64
|
+
end
|
65
|
+
|
66
|
+
## Run
|
67
|
+
# called by Service.now override with app logic
|
68
|
+
def run; raise NotImplementedError; end
|
69
|
+
# called by Delayed::Job after using Service.later
|
70
|
+
alias :perform :run
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
## Instance Variables
|
75
|
+
# creates an instance variable for each arg passed to initialize
|
76
|
+
# variable names pulled from self.class.takes
|
77
|
+
|
78
|
+
# Special Cases:
|
79
|
+
# @opt is set to hash when nil
|
80
|
+
|
81
|
+
# values - array of values passed to initialize
|
82
|
+
def set_instance_variables(values)
|
83
|
+
values.each_with_index do |value,i|
|
84
|
+
name = self.class.takes[i]
|
85
|
+
instance_variable_set "@#{name}",value
|
86
|
+
end
|
87
|
+
@opt = {} if self.class.takes.include?(:opt) and @opt.nil?
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
## ActiveRecord Args
|
92
|
+
|
93
|
+
def self.define_record_getter(arg)
|
94
|
+
define_method arg do
|
95
|
+
value = instance_variable_get "@#{arg}"
|
96
|
+
return value unless given_id_for? value
|
97
|
+
record = instance_variable_get "@#{arg}_record"
|
98
|
+
return record if record
|
99
|
+
opt = self.class.finders[arg]
|
100
|
+
class_name = opt[:class_name] || arg.to_s.camelcase
|
101
|
+
conditions = {id: value}
|
102
|
+
conditions["#{opt[:belongs_to]}_id".to_sym] = send opt[:belongs_to] if opt[:belongs_to]
|
103
|
+
record = class_name.constantize.where(conditions).first
|
104
|
+
instance_variable_set "@#{arg}_record", record
|
105
|
+
record
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def given_id_for?(value)
|
110
|
+
value.is_a?(Integer) or value.is_a?(String)
|
111
|
+
end
|
112
|
+
|
113
|
+
def self.define_id_getter(arg)
|
114
|
+
define_method "#{arg}_id".to_sym do
|
115
|
+
value = instance_variable_get "@#{arg}"
|
116
|
+
value.is_a?(Integer) ? value : value.id
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# hash of all findable args
|
121
|
+
def self.finders; @finders; end
|
122
|
+
|
123
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module NowAndLater::Service::WithResque
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
included do
|
5
|
+
cattr_accessor :queue
|
6
|
+
self.queue = :now_and_later
|
7
|
+
|
8
|
+
## Perform
|
9
|
+
# decodes args from redis and passes on to Service#now
|
10
|
+
def self.perform(*encoded)
|
11
|
+
decoded = encoded.map do |arg|
|
12
|
+
encoded_active_record?(arg) ? decode_active_record(arg) : arg
|
13
|
+
end
|
14
|
+
now *decoded
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.encoded_active_record?(arg)
|
18
|
+
arg.is_a?(String) and arg[0..2].eql?('nal')
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.decode_active_record(arg)
|
22
|
+
class_name,id = arg[4..-1].split '|'
|
23
|
+
class_name.constantize.find id
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,70 @@
|
|
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 = "now_and_later"
|
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 = ["Jordan Glasner"]
|
12
|
+
s.date = "2012-10-26"
|
13
|
+
s.description = "app/services"
|
14
|
+
s.email = "jordan@digitalignition.com"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".rspec",
|
22
|
+
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"LICENSE.txt",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"lib/now_and_later.rb",
|
29
|
+
"lib/now_and_later/engine.rb",
|
30
|
+
"lib/now_and_later/enqueue.rb",
|
31
|
+
"lib/now_and_later/enqueue/with_delayed_job.rb",
|
32
|
+
"lib/now_and_later/enqueue/with_resque.rb",
|
33
|
+
"lib/now_and_later/queue.rb",
|
34
|
+
"lib/now_and_later/runner.rb",
|
35
|
+
"lib/now_and_later/service.rb",
|
36
|
+
"lib/now_and_later/service/with_resque.rb",
|
37
|
+
"now_and_later.gemspec",
|
38
|
+
"spec/now_and_later/engine_spec.rb",
|
39
|
+
"spec/now_and_later/enqueue_service_spec.rb",
|
40
|
+
"spec/now_and_later/queue/with_delayed_job_spec.rb",
|
41
|
+
"spec/now_and_later/queue_spec.rb",
|
42
|
+
"spec/now_and_later/service_spec.rb",
|
43
|
+
"spec/now_and_later_spec.rb",
|
44
|
+
"spec/spec_helper.rb"
|
45
|
+
]
|
46
|
+
s.homepage = "http://github.com/glasner/now_and_later"
|
47
|
+
s.licenses = ["MIT"]
|
48
|
+
s.require_paths = ["lib"]
|
49
|
+
s.rubygems_version = "1.8.10"
|
50
|
+
s.summary = "new app/services can be ran now or later"
|
51
|
+
|
52
|
+
if s.respond_to? :specification_version then
|
53
|
+
s.specification_version = 3
|
54
|
+
|
55
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
56
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
57
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
58
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
59
|
+
else
|
60
|
+
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
61
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
62
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
63
|
+
end
|
64
|
+
else
|
65
|
+
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
66
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
67
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Delayed; end
|
2
|
+
class Delayed::Job; end
|
3
|
+
|
4
|
+
require_relative '../../spec_helper'
|
5
|
+
|
6
|
+
describe 'NowAndLater::Queue::WithDelayedJob' do
|
7
|
+
|
8
|
+
subject { NowAndLater::Queue.current }
|
9
|
+
|
10
|
+
it '.backend should return Delayed::Job' do
|
11
|
+
subject.send(:backend).should == Delayed::Job
|
12
|
+
end
|
13
|
+
|
14
|
+
it '.backend_instance_methods should return module for delayed job' do
|
15
|
+
subject.send(:backend_instance_methods).should == NowAndLater::Queue::WithDelayedJob
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#add' do
|
19
|
+
|
20
|
+
def add(service,*args)
|
21
|
+
subject.send :add, service, *args
|
22
|
+
end
|
23
|
+
|
24
|
+
before do
|
25
|
+
@service = mock 'NowAndLater::Service'
|
26
|
+
Delayed::Job.stub(:enqueue).and_return true
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should be implemented' do
|
30
|
+
lambda { add(@service) }.should_not raise_error(NotImplementedError)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should take service class and splat of args' do
|
34
|
+
lambda { add(@service) }.should_not raise_error(ArgumentError)
|
35
|
+
lambda { add(@service,:one) }.should_not raise_error(ArgumentError)
|
36
|
+
lambda { add(@service,:one,:two) }.should_not raise_error(ArgumentError)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should enqueue given service to Delayed::Job' do
|
40
|
+
args = [:one,:two]
|
41
|
+
service_instance = mock('NowAndLater::ServiceInstance')
|
42
|
+
@service.should_receive(:new).with(*args).and_return service_instance
|
43
|
+
Delayed::Job.should_receive(:enqueue).with(service_instance).and_return true
|
44
|
+
add @service, *args
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe NowAndLater::Queue do
|
4
|
+
|
5
|
+
subject { NowAndLater::Queue }
|
6
|
+
|
7
|
+
describe 'initialize' do
|
8
|
+
|
9
|
+
it 'should raise LoadError if delayed_job is missing' do
|
10
|
+
lambda { subject.send :new }.should raise_error(LoadError)
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'with Delayed::Job' do
|
14
|
+
before do
|
15
|
+
module Delayed; end
|
16
|
+
class Delayed::Job; end
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should not raise LoadError if Delayed::Job exists' do
|
20
|
+
lambda { subject.send :new }.should_not raise_error(LoadError)
|
21
|
+
end
|
22
|
+
it 'should extend instance with NowAndLater::Queue::WithDelayedJob' do
|
23
|
+
subject.send(:new).should be_kind_of(NowAndLater::Queue::WithDelayedJob)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '.current' do
|
30
|
+
|
31
|
+
it 'should exist' do
|
32
|
+
subject.should respond_to(:current)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should be instance of NowAndLater::Queue' do
|
36
|
+
subject.current.should be_kind_of(NowAndLater::Queue)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '.add' do
|
41
|
+
def add(*args)
|
42
|
+
subject.current.should_receive(:add).with(*args).and_return true
|
43
|
+
subject.add *args
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should exist' do
|
47
|
+
subject.should respond_to(:add)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should call self.current.add with given args' do
|
51
|
+
service = mock 'Service'
|
52
|
+
add service
|
53
|
+
add service, :one
|
54
|
+
add service, :one, :two
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe NowAndLater::Service do
|
4
|
+
|
5
|
+
describe '.takes' do
|
6
|
+
context 'with args' do
|
7
|
+
it 'should take a splat'
|
8
|
+
it 'should save args to @takes'
|
9
|
+
end
|
10
|
+
context 'without args' do
|
11
|
+
it 'should return @takes'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '.can_find' do
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'runners' do
|
20
|
+
|
21
|
+
describe '.now' do
|
22
|
+
it 'should take a splat'
|
23
|
+
it 'should initialize a new NowAndLater::Service instance'
|
24
|
+
it 'should call instance.run'
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '.later' do
|
28
|
+
it 'should take a splat'
|
29
|
+
it 'shouldl queue up service for later'
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '.new' do
|
35
|
+
it 'should take a splat'
|
36
|
+
it 'should create instance variables using names from self.class.takes'
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#run' do
|
40
|
+
it 'should raise NotImplementedError'
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
require 'rspec'
|
4
|
+
require 'now_and_later'
|
5
|
+
|
6
|
+
# Requires supporting files with custom matchers and macros, etc,
|
7
|
+
# in ./support/ and its subdirectories.
|
8
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: now_and_later
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jordan Glasner
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-10-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &2160342180 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.3.0
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2160342180
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: jeweler
|
27
|
+
requirement: &2160339460 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.6.4
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *2160339460
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rcov
|
38
|
+
requirement: &2160338440 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *2160338440
|
47
|
+
description: app/services
|
48
|
+
email: jordan@digitalignition.com
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files:
|
52
|
+
- LICENSE.txt
|
53
|
+
- README.rdoc
|
54
|
+
files:
|
55
|
+
- .document
|
56
|
+
- .rspec
|
57
|
+
- Gemfile
|
58
|
+
- Gemfile.lock
|
59
|
+
- LICENSE.txt
|
60
|
+
- README.rdoc
|
61
|
+
- Rakefile
|
62
|
+
- VERSION
|
63
|
+
- lib/now_and_later.rb
|
64
|
+
- lib/now_and_later/engine.rb
|
65
|
+
- lib/now_and_later/enqueue.rb
|
66
|
+
- lib/now_and_later/enqueue/with_delayed_job.rb
|
67
|
+
- lib/now_and_later/enqueue/with_resque.rb
|
68
|
+
- lib/now_and_later/queue.rb
|
69
|
+
- lib/now_and_later/runner.rb
|
70
|
+
- lib/now_and_later/service.rb
|
71
|
+
- lib/now_and_later/service/with_resque.rb
|
72
|
+
- now_and_later.gemspec
|
73
|
+
- spec/now_and_later/engine_spec.rb
|
74
|
+
- spec/now_and_later/enqueue_service_spec.rb
|
75
|
+
- spec/now_and_later/queue/with_delayed_job_spec.rb
|
76
|
+
- spec/now_and_later/queue_spec.rb
|
77
|
+
- spec/now_and_later/service_spec.rb
|
78
|
+
- spec/now_and_later_spec.rb
|
79
|
+
- spec/spec_helper.rb
|
80
|
+
homepage: http://github.com/glasner/now_and_later
|
81
|
+
licenses:
|
82
|
+
- MIT
|
83
|
+
post_install_message:
|
84
|
+
rdoc_options: []
|
85
|
+
require_paths:
|
86
|
+
- lib
|
87
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
89
|
+
requirements:
|
90
|
+
- - ! '>='
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
segments:
|
94
|
+
- 0
|
95
|
+
hash: -2809419079745790276
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
requirements: []
|
103
|
+
rubyforge_project:
|
104
|
+
rubygems_version: 1.8.10
|
105
|
+
signing_key:
|
106
|
+
specification_version: 3
|
107
|
+
summary: new app/services can be ran now or later
|
108
|
+
test_files: []
|