afterburner 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. data/.gitignore +6 -0
  2. data/.travis.yml +22 -0
  3. data/Gemfile +8 -0
  4. data/Rakefile +1 -0
  5. data/afterburner.gemspec +19 -0
  6. data/lib/afterburner.rb +2 -0
  7. data/lib/afterburner/adapters.rb +4 -0
  8. data/lib/afterburner/adapters/paginator.rb +6 -0
  9. data/lib/afterburner/adapters/paginator/kaminari.rb +17 -0
  10. data/lib/afterburner/adapters/paginator/will_paginate.rb +16 -0
  11. data/lib/afterburner/adapters/persistence.rb +7 -0
  12. data/lib/afterburner/adapters/persistence/hyperion.rb +36 -0
  13. data/lib/afterburner/framework.rb +4 -0
  14. data/lib/afterburner/framework/base_conductor.rb +65 -0
  15. data/lib/afterburner/framework/base_interactor.rb +19 -0
  16. data/lib/afterburner/package.rb +10 -0
  17. data/lib/afterburner/protocols.rb +4 -0
  18. data/lib/afterburner/protocols/paginator.rb +37 -0
  19. data/lib/afterburner/protocols/searcher.rb +38 -0
  20. data/license.md +19 -0
  21. data/readme.md +13 -0
  22. data/spec/afterburner/adapters/paginator/kaminari_spec.rb +23 -0
  23. data/spec/afterburner/adapters/paginator/will_paginate_spec.rb +23 -0
  24. data/spec/afterburner/adapters/persistence/hyperion_spec.rb +29 -0
  25. data/spec/afterburner/framework/base_conductor_spec.rb +11 -0
  26. data/spec/afterburner/framework/base_interactor_spec.rb +12 -0
  27. data/spec/afterburner/protocols/pagination_spec.rb +24 -0
  28. data/spec/afterburner/protocols/searching_spec.rb +24 -0
  29. data/spec/shared/afterburner/adapters/paginator.rb +17 -0
  30. data/spec/shared/afterburner/adapters/persistence.rb +31 -0
  31. data/spec/shared/callable.rb +24 -0
  32. data/spec/shared/protocols.rb +71 -0
  33. data/spec/spec_helper.rb +7 -0
  34. metadata +57 -10
@@ -0,0 +1,6 @@
1
+ Gemfile.lock
2
+
3
+ .DS_Store
4
+ .bundle/
5
+ coverage/
6
+ pkg/
@@ -0,0 +1,22 @@
1
+ language: ruby
2
+ install:
3
+ - bundle install --without development
4
+ script:
5
+ - bundle exec rspec spec
6
+ notifications:
7
+ email: false
8
+ irc:
9
+ use_notice: true
10
+ skip_join: true
11
+ channels:
12
+ - "irc.freenode.org#afterburner"
13
+ campfire:
14
+ on_success: always
15
+ on_failure: always
16
+ rooms:
17
+ - secure: "X5X39BTgXacSdc32F8mIjJKPqm5dZzmgZfJ14qYpJeMETTdA5JfByt2uCfU8\njJkkxT+XGWta0bSSlRIHQJO6pK26U94A95VYDX0jNuneKEnsoAsqJ6U0VY6v\nH5oxXMAZ2perP/FH9ZsPNR+ulyFfbMQCeGPJw5AXKZQqzf6qPOI="
18
+ rvm:
19
+ - 2.0.0
20
+ - 1.9.3
21
+ - rbx-19mode
22
+ - jruby-19mode
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ group :test do
4
+ gem 'rspec'
5
+ unless ENV['TRAVIS']
6
+ gem 'simplecov'
7
+ end
8
+ end
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+ require File.expand_path('lib/afterburner/package', File.dirname(__FILE__))
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "afterburner"
6
+ s.version = Afterburner::VERSION
7
+ s.authors = Afterburner::AUTHORS
8
+ s.email = Afterburner::EMAILS
9
+ s.homepage = Afterburner::HOMEPAGE
10
+ s.summary = Afterburner::SUMMARY
11
+ s.description = Afterburner::DESCRIPTION
12
+
13
+ s.required_ruby_version = Afterburner::REQUIRED_RUBY_VERSION
14
+ s.require_paths = ["lib"]
15
+
16
+ s.files = `git ls-files`.split($/)
17
+ s.test_files = s.files.grep(%r{^(spec)/})
18
+
19
+ end
@@ -0,0 +1,2 @@
1
+ module Afterburner
2
+ end
@@ -0,0 +1,4 @@
1
+ module Afterburner
2
+ module Adapters
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module Afterburner
2
+ module Adapters
3
+ module Paginator
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,17 @@
1
+ module Afterburner
2
+ module Adapters
3
+ module Paginator
4
+ module Kaminari
5
+
6
+ def with_items_per_page(*args)
7
+ per *args
8
+ end
9
+
10
+ def with_total_pages(*args)
11
+ num_pages *args
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ module Afterburner
2
+ module Adapters
3
+ module Paginator
4
+ module WillPaginate
5
+
6
+ def with_items_per_page(*args)
7
+ per_page *args
8
+ end
9
+ def with_total_pages(*args)
10
+ total_pages *args
11
+ end
12
+
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,7 @@
1
+ module Afterburner
2
+ module Adapters
3
+ module Persistence
4
+
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,36 @@
1
+ module Afterburner
2
+ module Adapters
3
+ module Persistence
4
+ module Hyperion
5
+ # Persist a hash to the datastore.
6
+ #
7
+ # @param values [Hash] The values to persist.
8
+ # @return [Hash] The values persisted plus the resource identifier (key).
9
+ def store(values)
10
+ ::Hyperion.save({:kind => entity_kind}.merge(values))
11
+ end
12
+
13
+ # Find an entity's attributes by its key.
14
+ #
15
+ # @param key [String] The resource's identifier.
16
+ # @return [Hash] The entity's attributes.
17
+ def find(key)
18
+ ::Hyperion.find_by_key(key)
19
+ end
20
+
21
+ # Search for one or more entities.
22
+ #
23
+ # @param options [Hash] A series of options to be passed to the adapter.
24
+ # @return [Array] A collection of entity attribute hashes.
25
+ def search(options = {})
26
+ ::Hyperion.find_by_kind(entity_kind, options)
27
+ end
28
+
29
+ protected
30
+ def entity_kind
31
+ raise "entity_kind was not specified by this repository."
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,4 @@
1
+ module Afterburner
2
+ module Framework
3
+ end
4
+ end
@@ -0,0 +1,65 @@
1
+ module Afterburner
2
+ module Framework
3
+ class ResponseNotSpecifiedError < StandardError; end
4
+ class DataNotSpecifiedError < StandardError; end
5
+ # The Base Conductor is the conductor that all other conductors inherit from.
6
+ # Its primary role is to decipher the parameters, retrieve or save data to
7
+ # or from data-facing APIs like a database or a third-party API, and to
8
+ # optionally wrap what it plans to return in an object that provides methods
9
+ # for access (in some cases, abstracting complex logic away from the view).
10
+ #
11
+ # The Conductor is not responsible, however, for validating or wrapping the
12
+ # data it retrieves. That task is delegated down to the application.
13
+ class BaseConductor
14
+ class << self
15
+ # Runs the conductor and returns a hash of objects (presenter or
16
+ # otherwise) that are passed to the view.
17
+ #
18
+ # @param params [HashWithIndifferentAccess] The request parameters.
19
+ # @param options [Hash] A series of options that override default values.
20
+ # @return [Hash] An associative array of presenter objects to be passed to the view.
21
+ def call(params, options = {})
22
+ new(params, options).to_response
23
+ end
24
+ end
25
+
26
+ # Transforms the data returned by the #data method into an acceptable format
27
+ # to return to the controller. Primarily used to wrap data in presenters, but
28
+ # can pass entities back, too.
29
+ #
30
+ # @return [Hash] An associative array of presenter or entity objects to be passed to the view.
31
+ def to_response
32
+ raise ResponseNotSpecifiedError, "#to_response must be overridden when subclassing BaseConductor"
33
+ end
34
+
35
+ protected
36
+ attr_accessor :params, :options
37
+
38
+ def initialize(params, options = {})
39
+ self.params = params
40
+ self.options = defaults.merge(options)
41
+ end
42
+
43
+ # Passes data retrieved from somewhere down to Interactors and returns something
44
+ # to be wrapped by #to_response -- by convention, an associative array.
45
+ #
46
+ # This method can also assume responsibility for retrieving objects, but it may
47
+ # choose to delegate that to other methods of this class.
48
+ #
49
+ # @return [Object] Data to be wrapped to send in response to the request.
50
+ def data
51
+ raise DataNotSpecifiedError, "#data must be overridden when subclassing BaseConductor."
52
+ end
53
+
54
+ # Provides a frozen hash of sane defaults that can be overridden to change class
55
+ # behaviour. Highly useful for dependency injection to simplify testing. For
56
+ # instance, instead of hard-coding a repository object, specify a default for it
57
+ # so that you can pass in a mock when testing.
58
+ #
59
+ # @return [Hash] An associative array of defaults.
60
+ def defaults
61
+ Hash.new.freeze
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,19 @@
1
+ module Afterburner
2
+ module Framework
3
+ class BaseInteractor
4
+ class << self
5
+ def call(data, options = {})
6
+ new(data, options).to_response
7
+ end
8
+ end
9
+
10
+ def to_response
11
+ raise "#to_response must be specified!"
12
+ end
13
+
14
+ protected
15
+ def initialize(data, options = {})
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+ module Afterburner
2
+ VERSION = '0.0.3'
3
+ AUTHORS = ["The Afterburner Team"]
4
+ EMAILS = ["info@afterburnercms.com"]
5
+ HOMEPAGE = "https://github.com/grounded/"
6
+ SUMMARY = "A framework for delivery-independent applications and hot-swappability."
7
+ DESCRIPTION = SUMMARY
8
+
9
+ REQUIRED_RUBY_VERSION = '>= 1.9.3'
10
+ end
@@ -0,0 +1,4 @@
1
+ module Afterburner
2
+ module Protocols
3
+ end
4
+ end
@@ -0,0 +1,37 @@
1
+ module Afterburner
2
+ module Protocols
3
+ # Wraps pagination so that users can swap out pagination models with the use
4
+ # of any one pagination plugin. At present, it only supports a single
5
+ # pagination method, but it will pass along any arguments given to that
6
+ # method.
7
+ #
8
+ # Simply set Afterburner::Pagination.paginating_method equal to the symbol
9
+ # name of your paginating method, and then use the as_pages method on queries.
10
+ # For example, if you are wrapping will_paginate, the pagination method there
11
+ # is called 'paginate'. Thus:
12
+ #
13
+ # Afterburner::Paginator.paginating_method = :paginate
14
+ # MyModel.where('field' => true).as_pages(:per_page => 10, :blah => false)
15
+ #
16
+ # You can also set paginating_method on the model itself to use a different
17
+ # paginator for just that model. For example:
18
+ #
19
+ # MyModel.paginating_method = :page
20
+ # MyModel.where(:field => true).as_pages("cats") # uses 'local' page method
21
+ #
22
+ # This won't interrupt other models' ability to use the default paginator.
23
+ module Paginator
24
+ class << self
25
+ attr_accessor :paginating_method
26
+ end
27
+ attr_accessor :paginating_method
28
+ def paginating_method
29
+ @paginating_method || Paginator.paginating_method
30
+ end
31
+
32
+ def as_pages(*args)
33
+ send paginating_method, *args
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,38 @@
1
+ module Afterburner
2
+ module Protocols
3
+ # Wraps searching so that users can swap out searching models with the use
4
+ # of any one searching plugin. At present, it only supports a single
5
+ # searching method, but it will pass along any arguments given to that
6
+ # method.
7
+ #
8
+ # Simply set Afterburner::Searcher.searching_method equal to the symbol name
9
+ # of your searching method, and then use the :as_search_results method for
10
+ # queries. For example, if you are wrapping acts_as_indexed, the searching
11
+ # method there is called 'with_query'. Thus:
12
+ #
13
+ # Afterburner::Searcher.searching_method = :with_query
14
+ # MyModel.where(:field => true).as_search_results("cats") # uses with_query
15
+ #
16
+ # You can also set searching_method on the model itself to use a different
17
+ # as_search_results for just that model. For example:
18
+ #
19
+ # MyModel.searching_method = :local_query
20
+ # MyModel.where(:field => true).as_search_results("cats") # uses local_query
21
+ #
22
+ # This won't interrupt other models' ability to use the default as_search_results.
23
+ module Searcher
24
+ class << self
25
+ attr_accessor :searching_method
26
+ end
27
+
28
+ attr_accessor :searching_method
29
+ def searching_method
30
+ @searching_method || Searcher.searching_method
31
+ end
32
+
33
+ def as_search_results(*args)
34
+ send searching_method, *args
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,19 @@
1
+ MIT License
2
+ Copyright (c) 2005-2012 Philip Arndt, Uģis Ozols, and Rob Yurkowski
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
5
+ this software and associated documentation files (the "Software"), to deal in
6
+ the Software without restriction, including without limitation the rights to
7
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
8
+ the Software, and to permit persons to whom the Software is furnished to do so,
9
+ subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
16
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
17
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
18
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,13 @@
1
+ # Afterburner Framework
2
+
3
+ [![Code Climate](https://codeclimate.com/github/grounded/afterburner.png)](https://codeclimate.com/github/grounded/afterburner)
4
+
5
+ The building blocks for the Rails Engine universe. All the stuff that all of
6
+ our projects do over and over and in slightly different ways.
7
+
8
+ Plug and play.
9
+
10
+ ## Development
11
+ To run the tests:
12
+
13
+ rspec spec
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'afterburner/adapters/paginator/kaminari'
3
+ require 'shared/afterburner/adapters/paginator'
4
+
5
+ module Afterburner
6
+ module Adapters
7
+ module Paginator
8
+ describe Kaminari do
9
+
10
+ it_should_behave_like "adapters/paginator" do
11
+ let(:dummy_class) do
12
+ class Dummy
13
+ extend Kaminari
14
+ end
15
+ end
16
+ let(:per_page_alias) { :per }
17
+ let(:total_pages_alias) { :num_pages }
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'afterburner/adapters/paginator/will_paginate'
3
+ require 'shared/afterburner/adapters/paginator'
4
+
5
+ module Afterburner
6
+ module Adapters
7
+ module Paginator
8
+ describe WillPaginate do
9
+
10
+ it_should_behave_like "adapters/paginator" do
11
+ let(:dummy_class) do
12
+ class Dummy
13
+ extend WillPaginate
14
+ end
15
+ end
16
+ let(:per_page_alias) { :per_page }
17
+ let(:total_pages_alias) { :total_pages }
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'afterburner/adapters/persistence/hyperion'
3
+ require 'shared/afterburner/adapters/persistence'
4
+
5
+ class Hyperion; end
6
+ class Dummy
7
+ include Afterburner::Adapters::Persistence::Hyperion
8
+
9
+ protected
10
+ def entity_kind; self.class.to_s.downcase end
11
+ end
12
+
13
+ module Afterburner
14
+ module Adapters
15
+ module Persistence
16
+ describe Hyperion do
17
+
18
+ it_should_behave_like "adapters/persistence" do
19
+ let(:dummy_class) { Dummy }
20
+ let(:receiving_class) { ::Hyperion }
21
+ let(:store_alias) { :save }
22
+ let(:find_alias) { :find_by_key }
23
+ let(:search_alias) { :find_by_kind }
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ require 'shared/callable'
2
+ require 'afterburner/framework/base_conductor'
3
+
4
+ module Afterburner
5
+ module Framework
6
+ describe BaseConductor do
7
+ subject { BaseConductor }
8
+ it_behaves_like "a callable"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ require 'shared/callable'
2
+ require 'afterburner/framework/base_interactor'
3
+
4
+ module Afterburner
5
+ module Framework
6
+ describe BaseInteractor do
7
+ subject { BaseInteractor }
8
+
9
+ it_behaves_like "a callable"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,24 @@
1
+ require 'afterburner/protocols/paginator'
2
+ require 'spec_helper'
3
+
4
+ module Afterburner
5
+ module Protocols
6
+ describe Paginator do
7
+ it_should_behave_like "protocols" do
8
+ let(:dummy_class) {
9
+ class DummyClass
10
+ extend Paginator
11
+ end
12
+ }
13
+ let(:other_dummy_class) {
14
+ class AnotherDummyClass
15
+ extend Paginator
16
+ end
17
+ }
18
+ let(:protocol) { Paginator }
19
+ let(:protocol_method) { :paginating_method }
20
+ let(:protocol_action_method) { :as_pages }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ require 'afterburner/protocols/searcher'
2
+ require 'spec_helper'
3
+
4
+ module Afterburner
5
+ module Protocols
6
+ describe Searcher do
7
+ it_should_behave_like "protocols" do
8
+ let(:dummy_class) {
9
+ class DummyClass
10
+ extend Searcher
11
+ end
12
+ }
13
+ let(:other_dummy_class) {
14
+ class AnotherDummyClass
15
+ extend Searcher
16
+ end
17
+ }
18
+ let(:protocol) { Searcher }
19
+ let(:protocol_method) { :searching_method }
20
+ let(:protocol_action_method) { :as_search_results }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ shared_examples_for "adapters/paginator" do
2
+
3
+ let(:dummy_class) { nil }
4
+ let(:per_page_alias) { nil }
5
+ let(:total_pages_alias) { nil }
6
+
7
+ it 'redirects with_items_per_page properly' do
8
+ dummy_class.should_receive(per_page_alias).once.with(1).and_return true
9
+ dummy_class.with_items_per_page(1).should be_true
10
+ end
11
+
12
+ it 'redirects with_total_pages properly' do
13
+ dummy_class.should_receive(total_pages_alias).once.with(5).and_return true
14
+ dummy_class.with_total_pages(5).should be_true
15
+ end
16
+
17
+ end
@@ -0,0 +1,31 @@
1
+ shared_examples_for "adapters/persistence" do
2
+
3
+ let(:dummy_class) { nil }
4
+ let(:receiving_class) { nil }
5
+ let(:store_alias) { nil }
6
+ let(:find_alias) { nil }
7
+ let(:search_alias) { nil }
8
+ let(:kind) { dummy_class.to_s.downcase }
9
+
10
+ context 'delegates' do
11
+ specify '#store' do
12
+ receiving_class.should_receive(store_alias).once.
13
+ with(:kind => kind, :foo => :bar).
14
+ and_return Hash.new
15
+
16
+ dummy_class.new.store(:foo => :bar).should be_kind_of(Hash)
17
+ end
18
+
19
+ specify '#find' do
20
+ receiving_class.should_receive(find_alias).once.with(:key).and_return Hash.new
21
+ dummy_class.new.find(:key).should be_kind_of(Hash)
22
+ end
23
+
24
+ specify '#search' do
25
+ receiving_class.should_receive(search_alias).once.
26
+ with(kind, :for => :this).and_return []
27
+ dummy_class.new.search(:for => :this).should be_kind_of(Array)
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,24 @@
1
+ shared_examples "a callable" do
2
+ it "is not publicly instantiable" do
3
+ subject.new({}).should raise_error NoMethodError
4
+ end
5
+
6
+ describe "::call" do
7
+ it "returns with #to_response" do
8
+ mock = double "object"
9
+ mock.should_receive(:to_response)
10
+ subject.stub!(:new).and_return(mock)
11
+ subject.call({:stub => 'abc'})
12
+ end
13
+ end
14
+
15
+ describe "#new" do
16
+ it "receives the data passed to call" do
17
+ args = %w(andaone andatwo)
18
+ instance = subject.send(:new, args)
19
+ instance.stub!(:to_response).and_return(nil)
20
+ subject.should_receive(:new).with(*args).and_return(instance)
21
+ subject.call(*args)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,71 @@
1
+ shared_examples_for "protocols" do
2
+ let(:dummy_class) { nil }
3
+ let(:other_dummy_class) { nil }
4
+ let(:protocol) { nil }
5
+ let(:protocol_method) { nil }
6
+ let(:protocol_action_method) { nil }
7
+
8
+ describe "interface" do
9
+ let(:dummy) { 'dummy' }
10
+ context "at Afterburner level" do
11
+ let(:rummy) { 'rummy' }
12
+
13
+ it "stores a reference to the default_protocol_action method" do
14
+ protocol.send "#{protocol_method}=", dummy
15
+ protocol.send(protocol_method).should == dummy
16
+ dummy_class.send(protocol_method).should == dummy
17
+ end
18
+
19
+ it "doesn't override the default protocol when set locally" do
20
+ protocol.send("#{protocol_method}=", dummy)
21
+ dummy_class.send("#{protocol_method}=", rummy)
22
+
23
+ protocol.send(protocol_method).should == dummy
24
+ dummy_class.send(protocol_method).should == rummy
25
+ end
26
+ end
27
+
28
+ context "at model level" do
29
+ it "stores a reference to the protocol method" do
30
+ dummy_class.send "#{protocol_method}=", dummy
31
+ dummy_class.send(protocol_method).should == dummy
32
+ end
33
+
34
+ context 'with stub' do
35
+ let(:dummy_method) { :some_scope }
36
+ before do
37
+ dummy_class.stub! dummy_method
38
+ dummy_class.send "#{protocol_method}=", dummy_method
39
+ end
40
+
41
+ it "wraps a protocol method" do
42
+ dummy_class.should_receive dummy_method
43
+ dummy_class.send protocol_action_method
44
+ end
45
+
46
+ it "passes on all arguments to the protocol method" do
47
+ dummy_class.should_receive(dummy_method).with 1, [], {}
48
+ dummy_class.send(protocol_action_method, 1, [], {})
49
+ end
50
+
51
+ context "with local override" do
52
+ let(:new_default) { :some_random_method }
53
+ before { protocol.send "#{protocol_method}=", new_default }
54
+
55
+ it "uses local protocol" do
56
+ dummy_class.should_receive protocol_method
57
+ dummy_class.should_not_receive new_default
58
+ protocol.should_not_receive new_default
59
+
60
+ dummy_class.send protocol_method, 'cats'
61
+ end
62
+
63
+ it "doesn't override other model's protocols" do
64
+ other_dummy_class.should_receive(protocol_method).with 'cats'
65
+ other_dummy_class.send protocol_method, 'cats'
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,7 @@
1
+ unless ENV['TRAVIS']
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter "/spec/"
5
+ end
6
+ end
7
+ require File.expand_path('../shared/protocols', __FILE__)
metadata CHANGED
@@ -1,23 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: afterburner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
- - Rob Yurkowski
8
+ - The Afterburner Team
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-29 00:00:00.000000000 Z
12
+ date: 2013-03-21 00:00:00.000000000 Z
13
13
  dependencies: []
14
- description:
15
- email: rob@yurkowski.net
14
+ description: A framework for delivery-independent applications and hot-swappability.
15
+ email:
16
+ - info@afterburnercms.com
16
17
  executables: []
17
18
  extensions: []
18
19
  extra_rdoc_files: []
19
- files: []
20
- homepage:
20
+ files:
21
+ - .gitignore
22
+ - .travis.yml
23
+ - Gemfile
24
+ - Rakefile
25
+ - afterburner.gemspec
26
+ - lib/afterburner.rb
27
+ - lib/afterburner/adapters.rb
28
+ - lib/afterburner/adapters/paginator.rb
29
+ - lib/afterburner/adapters/paginator/kaminari.rb
30
+ - lib/afterburner/adapters/paginator/will_paginate.rb
31
+ - lib/afterburner/adapters/persistence.rb
32
+ - lib/afterburner/adapters/persistence/hyperion.rb
33
+ - lib/afterburner/framework.rb
34
+ - lib/afterburner/framework/base_conductor.rb
35
+ - lib/afterburner/framework/base_interactor.rb
36
+ - lib/afterburner/package.rb
37
+ - lib/afterburner/protocols.rb
38
+ - lib/afterburner/protocols/paginator.rb
39
+ - lib/afterburner/protocols/searcher.rb
40
+ - license.md
41
+ - readme.md
42
+ - spec/afterburner/adapters/paginator/kaminari_spec.rb
43
+ - spec/afterburner/adapters/paginator/will_paginate_spec.rb
44
+ - spec/afterburner/adapters/persistence/hyperion_spec.rb
45
+ - spec/afterburner/framework/base_conductor_spec.rb
46
+ - spec/afterburner/framework/base_interactor_spec.rb
47
+ - spec/afterburner/protocols/pagination_spec.rb
48
+ - spec/afterburner/protocols/searching_spec.rb
49
+ - spec/shared/afterburner/adapters/paginator.rb
50
+ - spec/shared/afterburner/adapters/persistence.rb
51
+ - spec/shared/callable.rb
52
+ - spec/shared/protocols.rb
53
+ - spec/spec_helper.rb
54
+ homepage: https://github.com/grounded/
21
55
  licenses: []
22
56
  post_install_message:
23
57
  rdoc_options: []
@@ -28,7 +62,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
28
62
  requirements:
29
63
  - - ! '>='
30
64
  - !ruby/object:Gem::Version
31
- version: '0'
65
+ version: 1.9.3
32
66
  required_rubygems_version: !ruby/object:Gem::Requirement
33
67
  none: false
34
68
  requirements:
@@ -40,5 +74,18 @@ rubyforge_project:
40
74
  rubygems_version: 1.8.24
41
75
  signing_key:
42
76
  specification_version: 3
43
- summary: Turbo Rails!
44
- test_files: []
77
+ summary: A framework for delivery-independent applications and hot-swappability.
78
+ test_files:
79
+ - spec/afterburner/adapters/paginator/kaminari_spec.rb
80
+ - spec/afterburner/adapters/paginator/will_paginate_spec.rb
81
+ - spec/afterburner/adapters/persistence/hyperion_spec.rb
82
+ - spec/afterburner/framework/base_conductor_spec.rb
83
+ - spec/afterburner/framework/base_interactor_spec.rb
84
+ - spec/afterburner/protocols/pagination_spec.rb
85
+ - spec/afterburner/protocols/searching_spec.rb
86
+ - spec/shared/afterburner/adapters/paginator.rb
87
+ - spec/shared/afterburner/adapters/persistence.rb
88
+ - spec/shared/callable.rb
89
+ - spec/shared/protocols.rb
90
+ - spec/spec_helper.rb
91
+ has_rdoc: