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 ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
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,7 @@
1
+ module NowAndLater
2
+ class Engine < Rails::Engine
3
+ initialize 'setup services directory' do |app|
4
+ app.config.autoload_paths += %W(#{app.config.root}/app/services)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ module NowAndLater
2
+ module Enqueue
3
+ end
4
+ end
@@ -0,0 +1,9 @@
1
+ class NowAndLater::Enqueue::WithDelayedJob < NowAndLater::Service
2
+
3
+ takes :service, :args
4
+
5
+ def run
6
+ Delayed::Job.enqueue @service.new(*args)
7
+ end
8
+
9
+ 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,5 @@
1
+ require_relative '../spec_helper'
2
+
3
+ # describe NowAndLater::Engine do
4
+ # it 'should add app/services to autoload path'
5
+ # end
@@ -0,0 +1,5 @@
1
+ require_relative '../spec_helper'
2
+
3
+ # describe NowAndLater::Engine do
4
+ # it 'should add app/services to autoload path'
5
+ # end
@@ -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
@@ -0,0 +1,5 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe NowAndLater do
4
+
5
+ end
@@ -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: []