draper 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -8,3 +8,6 @@ coverage/*
8
8
  .yardoc
9
9
  tmp
10
10
  vendor/bundle
11
+ *.swp
12
+ *.swo
13
+ *.DS_Store
data/CHANGELOG.txt CHANGED
@@ -1,5 +1,17 @@
1
1
  = Draper Changelog
2
2
 
3
+ = 0.16.0
4
+
5
+ * Automatically prime view_context, see 057ab4
6
+
7
+ * Fixed bug where rspec eq matchers didn't work, see 57617b
8
+
9
+ * Sequel ORM support, see 7d4942
10
+
11
+ * Fixed issues with newer minitest
12
+
13
+ * changed the way the view_context gets set. See 0b039c
14
+
3
15
  = 0.15.0
4
16
 
5
17
  * Proper minitest integration
data/Readme.markdown CHANGED
@@ -233,7 +233,7 @@ ArticleDecorator.decorate(Article.all) # Returns an enumeration proxy of Artic
233
233
  ```ruby
234
234
  ArticleDecorator.find(1)
235
235
  ```
236
-
236
+
237
237
  ### In Your Views
238
238
 
239
239
  Use the new methods in your views like any other model method (ex: `@article.published_at`):
@@ -242,25 +242,15 @@ Use the new methods in your views like any other model method (ex: `@article.pub
242
242
  <h1><%= @article.title %> <%= @article.published_at %></h1>
243
243
  ```
244
244
 
245
- ### Using in Mailers
246
-
247
- To use decorators in mailers that use helpers, you have to call `set_current_view_context` in your
248
- ActionMailer class.
249
-
250
- ```ruby
251
- class ArticleMailer < ActionMailer::Base
252
- default 'init-draper' => Proc.new { set_current_view_context }
253
- end
254
- ```
255
245
  ### Integration with RSpec
256
246
 
257
247
  Using the provided generator, Draper will place specs for your new decorator in `spec/decorators/`.
258
248
 
259
- By default, specs in `spec/decorators` will be tagged as `type => :decorator`. Any spec tagged as `decorator` will run `ApplicationController.new.set_current_view_context` which makes helpers available to the decorator.
249
+ By default, specs in `spec/decorators` will be tagged as `type => :decorator`. Any spec tagged as `decorator` will make helpers available to the decorator.
260
250
 
261
251
  If your decorator specs live somewhere else, which they shouldn't, make sure to tag them with `type => :decorator`. If you don't tag them, Draper's helpers won't be available to your decorator while testing.
262
252
 
263
- Note: If you're using Spork, you need to `require 'draper/rspec_integration'` in your Spork.prefork block.
253
+ Note: If you're using Spork, you need to `require 'draper/test/rspec_integration'` in your Spork.prefork block.
264
254
 
265
255
  ## Possible Decoration Methods
266
256
 
@@ -378,6 +368,10 @@ Note how the `validates` line is executed when the `User` class is loaded, trigg
378
368
 
379
369
  Using `I18n` directly in your model definition **is an antipattern**. The preferred solution would be to not override the `message` option in your `validates` macro, but provide the `activerecord.errors.models.attributes.user.email.presence` key in your translation files.
380
370
 
371
+ ## Extension gems
372
+
373
+ For automatic decoration, check out [decorates_before_rendering](https://github.com/ohwillie/decorates_before_rendering).
374
+
381
375
  ## Contributing
382
376
 
383
377
  1. Fork it.
@@ -2,14 +2,11 @@ module Draper::ActiveModelSupport
2
2
  module Proxies
3
3
  def self.extended(base)
4
4
  # These methods (as keys) will be created only if the correspondent
5
- # model descends from a specific class (as value)
6
- proxies = {}
7
- proxies[:to_param] = ActiveModel::Conversion if defined?(ActiveModel::Conversion)
8
- proxies[:errors] = ActiveModel::Validations if defined?(ActiveModel::Validations)
9
- proxies[:id] = ActiveRecord::Base if defined?(ActiveRecord::Base)
5
+ # model responds to the method
6
+ proxies = [:to_param, :errors, :id]
10
7
 
11
- proxies.each do |method_name, dependency|
12
- if base.model.kind_of?(dependency) || dependency.nil?
8
+ proxies.each do |method_name|
9
+ if base.model.respond_to?(method_name)
13
10
  base.singleton_class.class_eval do
14
11
  if !base.class.instance_methods.include?(method_name) || base.class.instance_method(method_name).owner === Draper::Base
15
12
  define_method(method_name) do |*args, &block|
data/lib/draper/base.rb CHANGED
@@ -88,7 +88,8 @@ module Draper
88
88
  #
89
89
  # @param [Symbols*] name of associations to decorate
90
90
  def self.decorates_associations(*association_symbols)
91
- association_symbols.each{ |sym| decorates_association(sym) }
91
+ options = association_symbols.extract_options!
92
+ association_symbols.each{ |sym| decorates_association(sym, options) }
92
93
  end
93
94
 
94
95
  # Specifies a black list of methods which may *not* be proxied to
@@ -136,7 +137,7 @@ module Draper
136
137
  if input.instance_of?(self)
137
138
  input.options = options unless options.empty?
138
139
  return input
139
- elsif input.respond_to?(:each)
140
+ elsif input.respond_to?(:each) && (!defined?(Sequel) || !input.is_a?(Sequel::Model))
140
141
  Draper::DecoratedEnumerableProxy.new(input, self, options)
141
142
  elsif options[:infer]
142
143
  input.decorator(options)
@@ -161,12 +162,30 @@ module Draper
161
162
  decorate(model_class.last, options)
162
163
  end
163
164
 
165
+ # Some helpers are private, for example html_escape... as a workaround
166
+ # we are wrapping the helpers in a delegator that passes the methods
167
+ # along through a send, which will ignore private/public distinctions
168
+ class HelpersWrapper
169
+ def initialize(helpers)
170
+ @helpers = helpers
171
+ end
172
+
173
+ def method_missing(method, *args, &block)
174
+ @helpers.send(method, *args, &block)
175
+ end
176
+
177
+ #needed for tests
178
+ def ==(other)
179
+ other.instance_variable_get(:@helpers) == @helpers
180
+ end
181
+ end
182
+
164
183
  # Access the helpers proxy to call built-in and user-defined
165
184
  # Rails helpers. Aliased to `.h` for convenience.
166
185
  #
167
186
  # @return [Object] proxy
168
187
  def helpers
169
- self.class.helpers
188
+ HelpersWrapper.new self.class.helpers
170
189
  end
171
190
  alias :h :helpers
172
191
 
@@ -212,6 +231,14 @@ module Draper
212
231
  super || (allow?(method) && model.respond_to?(method, include_private))
213
232
  end
214
233
 
234
+ # We always want to delegate present, in case we decorate a nil object.
235
+ #
236
+ # I don't like the idea of decorating a nil object, but we'll deal with
237
+ # that later.
238
+ def present?
239
+ model.present?
240
+ end
241
+
215
242
  def method_missing(method, *args, &block)
216
243
  super unless allow?(method)
217
244
 
@@ -27,7 +27,7 @@ module Draper
27
27
  alias :is_a? :kind_of?
28
28
 
29
29
  def ==(other)
30
- @wrapped_collection == other
30
+ @wrapped_collection == (other.respond_to?(:source) ? other.source : other)
31
31
  end
32
32
 
33
33
  def to_s
@@ -34,9 +34,15 @@ module Draper
34
34
  end
35
35
  end
36
36
 
37
+ initializer "draper.extend_active_record_base" do |app|
38
+ ActiveSupport.on_load(:active_record) do
39
+ self.send(:include, Draper::ModelSupport)
40
+ end
41
+ end
42
+
37
43
  console do
38
44
  require 'action_controller/test_case'
39
- ApplicationController.new.set_current_view_context
45
+ ApplicationController.new.view_context
40
46
  Draper::ViewContext.current.controller.request ||= ActionController::TestRequest.new
41
47
  Draper::ViewContext.current.request ||= Draper::ViewContext.current.controller.request
42
48
  Draper::ViewContext.current.params ||= {}
data/lib/draper/system.rb CHANGED
@@ -2,7 +2,7 @@ module Draper
2
2
  class System
3
3
  def self.setup(component)
4
4
  component.class_eval do
5
- include Draper::ViewContextFilter
5
+ include Draper::ViewContext
6
6
  extend Draper::HelperSupport unless defined?(::ActionMailer) && self.is_a?(::ActionMailer::Base)
7
7
  end
8
8
  end
@@ -9,7 +9,16 @@ module MiniTest
9
9
  end
10
10
 
11
11
  class MiniTest::Unit::DecoratorTestCase < MiniTest::Unit::TestCase
12
- add_setup_hook { Draper::ViewContext.infect!(self) }
12
+ if method_defined?(:before_setup)
13
+ # for minitext >= 2.11
14
+ def before_setup
15
+ super
16
+ Draper::ViewContext.infect!(self)
17
+ end
18
+ else
19
+ # for older minitest, like what ships w/Ruby 1.9
20
+ add_setup_hook { Draper::ViewContext.infect!(self) }
21
+ end
13
22
  end
14
23
 
15
24
  MiniTest::Spec.register_spec_type(MiniTest::Spec::Decorator) do |desc|
@@ -17,10 +17,6 @@ RSpec.configure do |config|
17
17
  config.before :type => :decorator do
18
18
  Draper::ViewContext.infect!(self)
19
19
  end
20
-
21
- config.before :type => :view do
22
- controller.set_current_view_context
23
- end
24
20
  end
25
21
 
26
22
  if defined?(Capybara)
@@ -30,4 +26,3 @@ if defined?(Capybara)
30
26
  config.include Capybara::RSpecMatchers, :type => :decorator
31
27
  end
32
28
  end
33
-
@@ -2,7 +2,7 @@ module Draper
2
2
  module ViewContext
3
3
  def self.infect!(context)
4
4
  context.instance_eval do
5
- ApplicationController.new.set_current_view_context
5
+ ApplicationController.new.view_context
6
6
  Draper::ViewContext.current.controller.request ||= ActionController::TestRequest.new
7
7
  Draper::ViewContext.current.request ||= Draper::ViewContext.current.controller.request
8
8
  Draper::ViewContext.current.params ||= {}
@@ -1,3 +1,3 @@
1
1
  module Draper
2
- VERSION = "0.15.0"
2
+ VERSION = "0.16.0"
3
3
  end
@@ -1,21 +1,17 @@
1
1
  module Draper
2
2
  module ViewContext
3
3
  def self.current
4
- Thread.current[:current_view_context]
4
+ Thread.current[:current_view_context] || view_context
5
5
  end
6
6
 
7
7
  def self.current=(input)
8
8
  Thread.current[:current_view_context] = input
9
9
  end
10
- end
11
-
12
- module ViewContextFilter
13
- def set_current_view_context
14
- Draper::ViewContext.current = self.view_context
15
- end
16
10
 
17
- def self.included(source)
18
- source.send(:before_filter, :set_current_view_context) if source.respond_to?(:before_filter)
11
+ def view_context
12
+ super.tap do |context|
13
+ Draper::ViewContext.current = context
14
+ end
19
15
  end
20
16
  end
21
17
  end
@@ -2,6 +2,6 @@ require 'test_helper'
2
2
 
3
3
  class <%= class_name %>DecoratorTest < ActiveSupport::TestCase
4
4
  def setup
5
- ApplicationController.new.set_current_view_context
5
+ ApplicationController.new.view_context
6
6
  end
7
7
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Draper::Base do
4
- before(:each){ ApplicationController.new.set_current_view_context }
4
+ before(:each){ ApplicationController.new.view_context }
5
5
  subject{ Decorator.new(source) }
6
6
  let(:source){ Product.new }
7
7
  let(:non_active_model_source){ NonActiveModelProduct.new }
@@ -57,7 +57,7 @@ describe Draper::Base do
57
57
  decorates:business
58
58
  end
59
59
  BusinessDecorator.model_class.should == Business
60
- end.should_not raise_error
60
+ end.to_not raise_error
61
61
  end
62
62
 
63
63
  context("accepts ActiveRecord like :class_name option too") do
@@ -67,7 +67,7 @@ describe Draper::Base do
67
67
  decorates :product, :class => Product
68
68
  end
69
69
  CustomDecorator.model_class.should == Product
70
- end.should_not raise_error
70
+ end.to_not raise_error
71
71
  end
72
72
 
73
73
  it "accepts constants for :class_name" do
@@ -76,7 +76,7 @@ describe Draper::Base do
76
76
  decorates :product, :class_name => Product
77
77
  end
78
78
  CustomDecorator.model_class.should == Product
79
- end.should_not raise_error
79
+ end.to_not raise_error
80
80
  end
81
81
 
82
82
  it "accepts strings for :class" do
@@ -85,7 +85,7 @@ describe Draper::Base do
85
85
  decorates :product, :class => 'Product'
86
86
  end
87
87
  CustomDecorator.model_class.should == Product
88
- end.should_not raise_error
88
+ end.to_not raise_error
89
89
  end
90
90
 
91
91
  it "accepts strings for :class_name" do
@@ -94,7 +94,7 @@ describe Draper::Base do
94
94
  decorates :product, :class_name => 'Product'
95
95
  end
96
96
  CustomDecorator.model_class.should == Product
97
- end.should_not raise_error
97
+ end.to_not raise_error
98
98
  end
99
99
  end
100
100
 
@@ -183,11 +183,18 @@ describe Draper::Base do
183
183
  context('.decorates_associations') do
184
184
  subject { Decorator }
185
185
  it "decorates each of the associations" do
186
- subject.should_receive(:decorates_association).with(:similar_products)
187
- subject.should_receive(:decorates_association).with(:previous_version)
186
+ subject.should_receive(:decorates_association).with(:similar_products, {})
187
+ subject.should_receive(:decorates_association).with(:previous_version, {})
188
188
 
189
189
  subject.decorates_associations :similar_products, :previous_version
190
190
  end
191
+
192
+ it "dispatches options" do
193
+ subject.should_receive(:decorates_association).with(:similar_products, :with => ProductDecorator)
194
+ subject.should_receive(:decorates_association).with(:previous_version, :with => ProductDecorator)
195
+
196
+ subject.decorates_associations :similar_products, :previous_version, :with => ProductDecorator
197
+ end
191
198
  end
192
199
 
193
200
  context(".wrapped_object") do
@@ -251,17 +258,6 @@ describe Draper::Base do
251
258
  DecoratorWithSpecialMethods.new(source).errors.should be_an_instance_of Array
252
259
  end
253
260
  end
254
-
255
- context "when not an ActiveModel descendant" do
256
- it "does not proxy to_param" do
257
- non_active_model_source.stub(:to_param).and_return(1)
258
- Draper::Base.new(non_active_model_source).to_param.should_not == 1
259
- end
260
-
261
- it "does not proxy errors" do
262
- Draper::Base.new(non_active_model_source).should_not respond_to :errors
263
- end
264
- end
265
261
  end
266
262
 
267
263
  context 'the decorated model' do
@@ -363,6 +359,15 @@ describe Draper::Base do
363
359
  end
364
360
  end
365
361
 
362
+ context "when given a collection of sequel models" do
363
+ # Sequel models implement #each
364
+ let(:source) { [SequelProduct.new, SequelProduct.new] }
365
+
366
+ it "returns a collection of wrapped objects" do
367
+ subject.each{ |decorated| decorated.should be_instance_of(Draper::Base) }
368
+ end
369
+ end
370
+
366
371
  context "when given a single source object" do
367
372
  let(:source) { Product.new }
368
373
 
@@ -468,10 +473,13 @@ describe Draper::Base do
468
473
  end
469
474
 
470
475
  context ".respond_to?" do
476
+ # respond_to? is called by some proxies (id, to_param, errors).
477
+ # This is, why I stub it this way.
471
478
  it "delegate respond_to? to the decorated model" do
472
479
  other = Draper::Base.new(source)
473
- source.should_receive(:respond_to?).with(:whatever, true)
474
- subject.respond_to?(:whatever, true)
480
+ source.stub(:respond_to?).and_return(false)
481
+ source.stub(:respond_to?).with(:whatever, true).once.and_return("mocked")
482
+ subject.respond_to?(:whatever, true).should == "mocked"
475
483
  end
476
484
  end
477
485
 
@@ -669,19 +677,19 @@ describe Draper::Base do
669
677
  }
670
678
 
671
679
  it "raise an exception for a blank allows" do
672
- expect {blank_allows}.should raise_error(ArgumentError)
680
+ expect {blank_allows}.to raise_error(ArgumentError)
673
681
  end
674
682
 
675
683
  it "raise an exception for a blank denies" do
676
- expect {blank_denies}.should raise_error(ArgumentError)
684
+ expect {blank_denies}.to raise_error(ArgumentError)
677
685
  end
678
686
 
679
687
  it "raise an exception for calling allows then denies" do
680
- expect {using_allows_then_denies}.should raise_error(ArgumentError)
688
+ expect {using_allows_then_denies}.to raise_error(ArgumentError)
681
689
  end
682
690
 
683
691
  it "raise an exception for calling denies then allows" do
684
- expect {using_denies_then_allows}.should raise_error(ArgumentError)
692
+ expect {using_denies_then_allows}.to raise_error(ArgumentError)
685
693
  end
686
694
  end
687
695
 
@@ -706,9 +714,13 @@ describe Draper::Base do
706
714
 
707
715
  it "is able to use l rather than helpers.l" do
708
716
  now = Time.now
709
- decorator.helpers.should_receive(:localize).with(now)
717
+ decorator.helpers.instance_variable_get(:@helpers).should_receive(:localize).with(now)
710
718
  decorator.l now
711
719
  end
720
+
721
+ it "is able to access html_escape, a private method" do
722
+ decorator.sample_html_escaped_text.should == '&lt;script&gt;danger&lt;/script&gt;'
723
+ end
712
724
  end
713
725
 
714
726
  context "#method_missing" do
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Draper::ActiveModelSupport do
3
+ describe Draper::ModelSupport do
4
4
  subject { Product.new }
5
5
 
6
6
  describe '#decorator' do
@@ -5,20 +5,12 @@ describe Draper::ViewContext do
5
5
  let(:app_controller) { ApplicationController }
6
6
  let(:app_controller_instance) { app_controller.new }
7
7
 
8
- it "implements #set_current_view_context" do
9
- app_controller_instance.should respond_to(:set_current_view_context)
10
- end
11
-
12
- it "calls #before_filter with #set_current_view_context" do
13
- app_controller.before_filters.should include(:set_current_view_context)
14
- end
15
-
16
- it "raises an exception if the view_context is fetched without being set" do
17
- Draper::ViewContext.current = nil
18
- expect {app_controller.current_view_context}.should raise_exception(Exception)
19
- end
20
-
21
8
  it "provides a method to create a view context while testing" do
22
9
  Draper::ViewContext.should respond_to(:infect!)
23
10
  end
11
+
12
+ it "copies the controller's view context to draper" do
13
+ ctx = app_controller_instance.view_context
14
+ Draper::ViewContext.current.should == ctx
15
+ end
24
16
  end
data/spec/spec_helper.rb CHANGED
@@ -2,11 +2,13 @@ require 'bundler/setup'
2
2
  require 'ammeter/init'
3
3
  require 'rails'
4
4
 
5
+ require 'action_view'
6
+ require './spec/support/samples/application_controller'
7
+
5
8
  Bundler.require
6
9
 
7
10
  require './spec/support/samples/active_model'
8
11
  require './spec/support/samples/active_record'
9
- require './spec/support/samples/application_controller'
10
12
  require './spec/support/samples/application_helper'
11
13
  require './spec/support/samples/decorator'
12
14
  require './spec/support/samples/decorator_with_allows'
@@ -19,8 +21,15 @@ require './spec/support/samples/namespaced_product_decorator'
19
21
  require './spec/support/samples/non_active_model_product'
20
22
  require './spec/support/samples/product'
21
23
  require './spec/support/samples/product_decorator'
24
+ require './spec/support/samples/sequel_product'
22
25
  require './spec/support/samples/specific_product_decorator'
23
26
  require './spec/support/samples/some_thing'
24
27
  require './spec/support/samples/some_thing_decorator'
25
28
  require './spec/support/samples/widget'
26
29
  require './spec/support/samples/widget_decorator'
30
+
31
+ module ActionController
32
+ class Base
33
+ Draper::System.setup(self)
34
+ end
35
+ end
@@ -1,7 +1,16 @@
1
1
  require './spec/support/samples/application_helper'
2
2
 
3
3
  module ActionController
4
- class Base
4
+ class AbstractController
5
+ def view_context
6
+ @view_context ||= ApplicationController
7
+ end
8
+
9
+ def view_context=(input)
10
+ @view_context = input
11
+ end
12
+ end
13
+ class Base < AbstractController
5
14
  @@before_filters = []
6
15
  def self.before_filters
7
16
  @@before_filters
@@ -9,8 +18,6 @@ module ActionController
9
18
  def self.before_filter(name)
10
19
  @@before_filters << name
11
20
  end
12
-
13
- Draper::System.setup(self)
14
21
  end
15
22
  end
16
23
 
@@ -20,14 +27,6 @@ class ApplicationController < ActionController::Base
20
27
  extend ActionView::Helpers::UrlHelper
21
28
  extend ApplicationHelper
22
29
 
23
- def view_context
24
- @view_context ||= ApplicationController
25
- end
26
-
27
- def view_context=(input)
28
- @view_context = input
29
- end
30
-
31
30
  def self.hello
32
31
  "Hello!"
33
32
  end
@@ -1,4 +1,7 @@
1
+ require 'active_support/core_ext/string/output_safety.rb'
1
2
  module ApplicationHelper
3
+ include ERB::Util
4
+
2
5
  def hello_world
3
6
  "Hello, World!"
4
7
  end
@@ -18,4 +18,8 @@ class DecoratorWithApplicationHelper < Draper::Base
18
18
  def length
19
19
  "overridden"
20
20
  end
21
+
22
+ def sample_html_escaped_text
23
+ h.html_escape '<script>danger</script>'
24
+ end
21
25
  end
@@ -0,0 +1,13 @@
1
+ module Sequel
2
+ class Model
3
+ def each
4
+ end
5
+ end
6
+ end
7
+
8
+ class SequelProduct < Sequel::Model
9
+ def some_attribute
10
+ "hello"
11
+ end
12
+ end
13
+
metadata CHANGED
@@ -1,125 +1,121 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: draper
3
- version: !ruby/object:Gem::Version
4
- hash: 35
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.16.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 15
9
- - 0
10
- version: 0.15.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Jeff Casimir
14
9
  - Steve Klabnik
15
10
  autorequire:
16
11
  bindir: bin
17
12
  cert_chain: []
18
-
19
- date: 2012-07-14 00:00:00 Z
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
13
+ date: 2012-08-11 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
22
16
  name: activesupport
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
25
18
  none: false
26
- requirements:
19
+ requirements:
27
20
  - - ~>
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 3
32
- - 2
33
- version: "3.2"
21
+ - !ruby/object:Gem::Version
22
+ version: '3.2'
34
23
  type: :runtime
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: actionpack
38
24
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ~>
29
+ - !ruby/object:Gem::Version
30
+ version: '3.2'
31
+ - !ruby/object:Gem::Dependency
32
+ name: actionpack
33
+ requirement: !ruby/object:Gem::Requirement
40
34
  none: false
41
- requirements:
35
+ requirements:
42
36
  - - ~>
43
- - !ruby/object:Gem::Version
44
- hash: 3
45
- segments:
46
- - 3
47
- - 2
48
- version: "3.2"
37
+ - !ruby/object:Gem::Version
38
+ version: '3.2'
49
39
  type: :runtime
50
- version_requirements: *id002
51
- - !ruby/object:Gem::Dependency
52
- name: ammeter
53
40
  prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
41
+ version_requirements: !ruby/object:Gem::Requirement
55
42
  none: false
56
- requirements:
57
- - - "="
58
- - !ruby/object:Gem::Version
59
- hash: 19
60
- segments:
61
- - 0
62
- - 2
63
- - 2
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: '3.2'
47
+ - !ruby/object:Gem::Dependency
48
+ name: ammeter
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
64
54
  version: 0.2.2
65
55
  type: :development
66
- version_requirements: *id003
67
- - !ruby/object:Gem::Dependency
68
- name: rake
69
56
  prerelease: false
70
- requirement: &id004 !ruby/object:Gem::Requirement
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - '='
61
+ - !ruby/object:Gem::Version
62
+ version: 0.2.2
63
+ - !ruby/object:Gem::Dependency
64
+ name: rake
65
+ requirement: !ruby/object:Gem::Requirement
71
66
  none: false
72
- requirements:
67
+ requirements:
73
68
  - - ~>
74
- - !ruby/object:Gem::Version
75
- hash: 63
76
- segments:
77
- - 0
78
- - 9
79
- - 2
69
+ - !ruby/object:Gem::Version
80
70
  version: 0.9.2
81
71
  type: :development
82
- version_requirements: *id004
83
- - !ruby/object:Gem::Dependency
84
- name: rspec
85
72
  prerelease: false
86
- requirement: &id005 !ruby/object:Gem::Requirement
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: 0.9.2
79
+ - !ruby/object:Gem::Dependency
80
+ name: rspec
81
+ requirement: !ruby/object:Gem::Requirement
87
82
  none: false
88
- requirements:
83
+ requirements:
89
84
  - - ~>
90
- - !ruby/object:Gem::Version
91
- hash: 23
92
- segments:
93
- - 2
94
- - 10
95
- version: "2.10"
85
+ - !ruby/object:Gem::Version
86
+ version: '2.10'
96
87
  type: :development
97
- version_requirements: *id005
98
- - !ruby/object:Gem::Dependency
99
- name: yard
100
88
  prerelease: false
101
- requirement: &id006 !ruby/object:Gem::Requirement
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ version: '2.10'
95
+ - !ruby/object:Gem::Dependency
96
+ name: yard
97
+ requirement: !ruby/object:Gem::Requirement
102
98
  none: false
103
- requirements:
104
- - - ">="
105
- - !ruby/object:Gem::Version
106
- hash: 3
107
- segments:
108
- - 0
109
- version: "0"
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
110
103
  type: :development
111
- version_requirements: *id006
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
112
111
  description: Draper implements a decorator or presenter pattern for Rails applications.
113
- email:
112
+ email:
114
113
  - jeff@casimircreative.com
115
114
  - steve@steveklabnik.com
116
115
  executables: []
117
-
118
116
  extensions: []
119
-
120
117
  extra_rdoc_files: []
121
-
122
- files:
118
+ files:
123
119
  - .gitignore
124
120
  - .rspec
125
121
  - .travis.yml
@@ -198,6 +194,7 @@ files:
198
194
  - spec/support/samples/non_active_model_product.rb
199
195
  - spec/support/samples/product.rb
200
196
  - spec/support/samples/product_decorator.rb
197
+ - spec/support/samples/sequel_product.rb
201
198
  - spec/support/samples/some_thing.rb
202
199
  - spec/support/samples/some_thing_decorator.rb
203
200
  - spec/support/samples/specific_product_decorator.rb
@@ -205,38 +202,35 @@ files:
205
202
  - spec/support/samples/widget_decorator.rb
206
203
  homepage: http://github.com/jcasimir/draper
207
204
  licenses: []
208
-
209
205
  post_install_message:
210
206
  rdoc_options: []
211
-
212
- require_paths:
207
+ require_paths:
213
208
  - lib
214
- required_ruby_version: !ruby/object:Gem::Requirement
209
+ required_ruby_version: !ruby/object:Gem::Requirement
215
210
  none: false
216
- requirements:
217
- - - ">="
218
- - !ruby/object:Gem::Version
219
- hash: 3
220
- segments:
211
+ requirements:
212
+ - - ! '>='
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
215
+ segments:
221
216
  - 0
222
- version: "0"
223
- required_rubygems_version: !ruby/object:Gem::Requirement
217
+ hash: -943728829209315877
218
+ required_rubygems_version: !ruby/object:Gem::Requirement
224
219
  none: false
225
- requirements:
226
- - - ">="
227
- - !ruby/object:Gem::Version
228
- hash: 3
229
- segments:
220
+ requirements:
221
+ - - ! '>='
222
+ - !ruby/object:Gem::Version
223
+ version: '0'
224
+ segments:
230
225
  - 0
231
- version: "0"
226
+ hash: -943728829209315877
232
227
  requirements: []
233
-
234
228
  rubyforge_project: draper
235
- rubygems_version: 1.8.15
229
+ rubygems_version: 1.8.24
236
230
  signing_key:
237
231
  specification_version: 3
238
232
  summary: Decorator pattern implementation for Rails.
239
- test_files:
233
+ test_files:
240
234
  - spec/draper/base_spec.rb
241
235
  - spec/draper/helper_support_spec.rb
242
236
  - spec/draper/model_support_spec.rb
@@ -258,6 +252,7 @@ test_files:
258
252
  - spec/support/samples/non_active_model_product.rb
259
253
  - spec/support/samples/product.rb
260
254
  - spec/support/samples/product_decorator.rb
255
+ - spec/support/samples/sequel_product.rb
261
256
  - spec/support/samples/some_thing.rb
262
257
  - spec/support/samples/some_thing_decorator.rb
263
258
  - spec/support/samples/specific_product_decorator.rb