draper 0.13.0 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -1
- data/CHANGELOG.txt +4 -0
- data/Readme.markdown +20 -0
- data/draper.gemspec +2 -3
- data/lib/draper/active_model_support.rb +2 -4
- data/lib/draper/base.rb +0 -2
- data/lib/draper/decorated_enumerable_proxy.rb +1 -5
- data/lib/draper/railtie.rb +8 -1
- data/lib/draper/version.rb +1 -1
- data/spec/draper/base_spec.rb +55 -55
- data/spec/draper/model_support_spec.rb +4 -4
- data/spec/spec_helper.rb +0 -1
- metadata +42 -57
data/.gitignore
CHANGED
data/CHANGELOG.txt
CHANGED
data/Readme.markdown
CHANGED
@@ -357,6 +357,26 @@ Now when you call the association it will use a decorator.
|
|
357
357
|
<%= @article.author.fancy_name %>
|
358
358
|
```
|
359
359
|
|
360
|
+
### A note on Rails configuration
|
361
|
+
|
362
|
+
Draper loads your application's decorators when Rails start. This may lead to an issue with configuring I18n, whereby the settings you provide in `./config/application.rb` are ignored. This happens when you use the `I18n` constant at the class-level in one of the models that have a decorator, as in the following example:
|
363
|
+
|
364
|
+
```ruby
|
365
|
+
# app/models/user.rb
|
366
|
+
class User < ActiveRecord::Base
|
367
|
+
validates :email, presence: { message: I18n.t('invalid_email') }
|
368
|
+
end
|
369
|
+
|
370
|
+
# app/decorators/user_decorator.rb
|
371
|
+
class UserDecorator < ApplicationDecorator
|
372
|
+
decorates :user
|
373
|
+
end
|
374
|
+
```
|
375
|
+
|
376
|
+
Note how the `validates` line is executed when the `User` class is loaded, triggering the initialization of the I18n framework _before_ Rails had a chance to apply its configuration.
|
377
|
+
|
378
|
+
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.
|
379
|
+
|
360
380
|
## Contributing
|
361
381
|
|
362
382
|
1. Fork it.
|
data/draper.gemspec
CHANGED
@@ -16,9 +16,6 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
17
|
s.require_paths = ["lib"]
|
18
18
|
|
19
|
-
s.add_dependency 'activesupport', '~> 3.2'
|
20
|
-
s.add_dependency 'rake', '~> 0.9.2'
|
21
|
-
s.add_dependency 'rspec', '~> 2.10'
|
22
19
|
s.add_dependency 'activesupport', '~> 3.2'
|
23
20
|
s.add_dependency 'actionpack', '~> 3.2'
|
24
21
|
|
@@ -26,5 +23,7 @@ Gem::Specification.new do |s|
|
|
26
23
|
s.add_development_dependency 'guard'
|
27
24
|
s.add_development_dependency 'guard-rspec'
|
28
25
|
s.add_development_dependency 'launchy'
|
26
|
+
s.add_development_dependency 'rake', '~> 0.9.2'
|
27
|
+
s.add_development_dependency 'rspec', '~> 2.10'
|
29
28
|
s.add_development_dependency 'yard'
|
30
29
|
end
|
@@ -10,11 +10,9 @@ module Draper::ActiveModelSupport
|
|
10
10
|
|
11
11
|
proxies.each do |method_name, dependency|
|
12
12
|
if base.model.kind_of?(dependency) || dependency.nil?
|
13
|
-
|
14
|
-
self
|
15
|
-
end.class_eval do
|
13
|
+
base.singleton_class.class_eval do
|
16
14
|
if !base.class.instance_methods.include?(method_name) || base.class.instance_method(method_name).owner === Draper::Base
|
17
|
-
|
15
|
+
define_method(method_name) do |*args, &block|
|
18
16
|
model.send(method_name, *args, &block)
|
19
17
|
end
|
20
18
|
end
|
data/lib/draper/base.rb
CHANGED
@@ -11,8 +11,6 @@ module Draper
|
|
11
11
|
self.denied = DEFAULT_DENIED
|
12
12
|
self.allowed = DEFAULT_ALLOWED
|
13
13
|
|
14
|
-
|
15
|
-
|
16
14
|
# Initialize a new decorator instance by passing in
|
17
15
|
# an instance of the source class. Pass in an optional
|
18
16
|
# context inside the options hash is stored for later use.
|
@@ -30,14 +30,10 @@ module Draper
|
|
30
30
|
@wrapped_collection == other
|
31
31
|
end
|
32
32
|
|
33
|
-
def [](index)
|
34
|
-
@klass.new(@wrapped_collection[index], @options)
|
35
|
-
end
|
36
|
-
|
37
33
|
def to_s
|
38
34
|
"#<DecoratedEnumerableProxy of #{@klass} for #{@wrapped_collection.inspect}>"
|
39
35
|
end
|
40
|
-
|
36
|
+
|
41
37
|
def context=(input)
|
42
38
|
self.map { |member| member.context = input }
|
43
39
|
end
|
data/lib/draper/railtie.rb
CHANGED
@@ -30,7 +30,7 @@ module Draper
|
|
30
30
|
# This is the standard "Rails Way" to add paths from which constants
|
31
31
|
# can be loaded.
|
32
32
|
#
|
33
|
-
config.
|
33
|
+
config.after_initialize do |app|
|
34
34
|
app.config.paths.add 'app/decorators', :eager_load => true
|
35
35
|
end
|
36
36
|
|
@@ -46,5 +46,12 @@ module Draper
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
+
console do
|
50
|
+
require 'action_controller/test_case'
|
51
|
+
ApplicationController.new.set_current_view_context
|
52
|
+
Draper::ViewContext.current.controller.request ||= ActionController::TestRequest.new
|
53
|
+
Draper::ViewContext.current.request ||= Draper::ViewContext.current.controller.request
|
54
|
+
Draper::ViewContext.current.params ||= {}
|
55
|
+
end
|
49
56
|
end
|
50
57
|
end
|
data/lib/draper/version.rb
CHANGED
data/spec/draper/base_spec.rb
CHANGED
@@ -7,35 +7,35 @@ describe Draper::Base do
|
|
7
7
|
let(:non_active_model_source){ NonActiveModelProduct.new }
|
8
8
|
|
9
9
|
context("proxying class methods") do
|
10
|
-
it "
|
10
|
+
it "pass missing class method calls on to the wrapped class" do
|
11
11
|
subject.class.sample_class_method.should == "sample class method"
|
12
12
|
end
|
13
13
|
|
14
|
-
it "
|
14
|
+
it "respond_to a wrapped class method" do
|
15
15
|
subject.class.should respond_to(:sample_class_method)
|
16
16
|
end
|
17
17
|
|
18
|
-
it "
|
18
|
+
it "still respond_to its own class methods" do
|
19
19
|
subject.class.should respond_to(:own_class_method)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
context(".helpers") do
|
24
|
-
it "
|
24
|
+
it "have a valid view_context" do
|
25
25
|
subject.helpers.should be
|
26
26
|
end
|
27
27
|
|
28
|
-
it "
|
28
|
+
it "is aliased to .h" do
|
29
29
|
subject.h.should == subject.helpers
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
33
|
context("#helpers") do
|
34
|
-
it "
|
34
|
+
it "have a valid view_context" do
|
35
35
|
Decorator.helpers.should be
|
36
36
|
end
|
37
37
|
|
38
|
-
it "
|
38
|
+
it "is aliased to #h" do
|
39
39
|
Decorator.h.should == Decorator.helpers
|
40
40
|
end
|
41
41
|
end
|
@@ -50,7 +50,7 @@ describe Draper::Base do
|
|
50
50
|
ProductDecorator.new(product_decorator).model.should be_instance_of Product
|
51
51
|
end
|
52
52
|
|
53
|
-
it "
|
53
|
+
it "handle plural-like words properly'" do
|
54
54
|
class Business; end
|
55
55
|
expect do
|
56
56
|
class BusinessDecorator < Draper::Base
|
@@ -183,13 +183,13 @@ describe Draper::Base do
|
|
183
183
|
end
|
184
184
|
|
185
185
|
context(".wrapped_object") do
|
186
|
-
it "
|
186
|
+
it "return the wrapped object" do
|
187
187
|
subject.wrapped_object.should == source
|
188
188
|
end
|
189
189
|
end
|
190
190
|
|
191
191
|
context(".source / .to_source") do
|
192
|
-
it "
|
192
|
+
it "return the wrapped object" do
|
193
193
|
subject.to_source == source
|
194
194
|
subject.source == source
|
195
195
|
end
|
@@ -204,42 +204,42 @@ describe Draper::Base do
|
|
204
204
|
end
|
205
205
|
end
|
206
206
|
|
207
|
-
it "
|
207
|
+
it "not override a defined method with a source method" do
|
208
208
|
DecoratorWithApplicationHelper.new(source).length.should == "overridden"
|
209
209
|
end
|
210
210
|
|
211
|
-
it "
|
211
|
+
it "not copy the .class, .inspect, or other existing methods" do
|
212
212
|
source.class.should_not == subject.class
|
213
213
|
source.inspect.should_not == subject.inspect
|
214
214
|
source.to_s.should_not == subject.to_s
|
215
215
|
end
|
216
216
|
|
217
217
|
context "when an ActiveModel descendant" do
|
218
|
-
it "
|
218
|
+
it "always proxy to_param if it is not defined on the decorator itself" do
|
219
219
|
source.stub(:to_param).and_return(1)
|
220
220
|
Draper::Base.new(source).to_param.should == 1
|
221
221
|
end
|
222
222
|
|
223
|
-
it "
|
223
|
+
it "always proxy id if it is not defined on the decorator itself" do
|
224
224
|
source.stub(:id).and_return(123456789)
|
225
225
|
Draper::Base.new(source).id.should == 123456789
|
226
226
|
end
|
227
227
|
|
228
|
-
it "
|
228
|
+
it "always proxy errors if it is not defined on the decorator itself" do
|
229
229
|
Draper::Base.new(source).errors.should be_an_instance_of ActiveModel::Errors
|
230
230
|
end
|
231
231
|
|
232
|
-
it "
|
232
|
+
it "never proxy to_param if it is defined on the decorator itself" do
|
233
233
|
source.stub(:to_param).and_return(1)
|
234
234
|
DecoratorWithSpecialMethods.new(source).to_param.should == "foo"
|
235
235
|
end
|
236
236
|
|
237
|
-
it "
|
237
|
+
it "never proxy id if it is defined on the decorator itself" do
|
238
238
|
source.stub(:id).and_return(123456789)
|
239
239
|
DecoratorWithSpecialMethods.new(source).id.should == 1337
|
240
240
|
end
|
241
241
|
|
242
|
-
it "
|
242
|
+
it "never proxy errors if it is defined on the decorator itself" do
|
243
243
|
DecoratorWithSpecialMethods.new(source).errors.should be_an_instance_of Array
|
244
244
|
end
|
245
245
|
end
|
@@ -266,24 +266,24 @@ describe Draper::Base do
|
|
266
266
|
end
|
267
267
|
end
|
268
268
|
|
269
|
-
it "
|
269
|
+
it "wrap source methods so they still accept blocks" do
|
270
270
|
subject.block{"marker"}.should == "marker"
|
271
271
|
end
|
272
272
|
|
273
273
|
context ".find" do
|
274
|
-
it "
|
274
|
+
it "lookup the associated model when passed an integer" do
|
275
275
|
pd = ProductDecorator.find(1)
|
276
276
|
pd.should be_instance_of(ProductDecorator)
|
277
277
|
pd.model.should be_instance_of(Product)
|
278
278
|
end
|
279
279
|
|
280
|
-
it "
|
280
|
+
it "lookup the associated model when passed a string" do
|
281
281
|
pd = ProductDecorator.find("1")
|
282
282
|
pd.should be_instance_of(ProductDecorator)
|
283
283
|
pd.model.should be_instance_of(Product)
|
284
284
|
end
|
285
285
|
|
286
|
-
it "
|
286
|
+
it "accept and store a context" do
|
287
287
|
pd = ProductDecorator.find(1, :context => :admin)
|
288
288
|
pd.context.should == :admin
|
289
289
|
end
|
@@ -453,14 +453,14 @@ describe Draper::Base do
|
|
453
453
|
end
|
454
454
|
|
455
455
|
context('.==') do
|
456
|
-
it "
|
456
|
+
it "compare the decorated models" do
|
457
457
|
other = Draper::Base.new(source)
|
458
458
|
subject.should == other
|
459
459
|
end
|
460
460
|
end
|
461
461
|
|
462
462
|
context ".respond_to?" do
|
463
|
-
it "
|
463
|
+
it "delegate respond_to? to the decorated model" do
|
464
464
|
other = Draper::Base.new(source)
|
465
465
|
source.should_receive(:respond_to?).with(:whatever, true)
|
466
466
|
subject.respond_to?(:whatever, true)
|
@@ -470,15 +470,15 @@ describe Draper::Base do
|
|
470
470
|
context 'position accessors' do
|
471
471
|
[:first, :last].each do |method|
|
472
472
|
context "##{method}" do
|
473
|
-
it "
|
473
|
+
it "return a decorated instance" do
|
474
474
|
ProductDecorator.send(method).should be_instance_of ProductDecorator
|
475
475
|
end
|
476
476
|
|
477
|
-
it "
|
477
|
+
it "return the #{method} instance of the wrapped class" do
|
478
478
|
ProductDecorator.send(method).model.should == Product.send(method)
|
479
479
|
end
|
480
480
|
|
481
|
-
it "
|
481
|
+
it "accept an optional context" do
|
482
482
|
ProductDecorator.send(method, :context => :admin).context.should == :admin
|
483
483
|
end
|
484
484
|
end
|
@@ -499,32 +499,32 @@ describe Draper::Base do
|
|
499
499
|
let(:empty_collection) { [] }
|
500
500
|
subject { ProductDecorator.decorate(paged_array) }
|
501
501
|
|
502
|
-
it "
|
502
|
+
it "proxy all calls to decorated collection" do
|
503
503
|
paged_array.page_number.should == "magic_value"
|
504
504
|
subject.page_number.should == "magic_value"
|
505
505
|
end
|
506
506
|
|
507
|
-
it "
|
507
|
+
it "support Rails partial lookup for a collection" do
|
508
508
|
# to support Rails render @collection the returned collection
|
509
509
|
# (or its proxy) should implement #to_ary.
|
510
510
|
subject.respond_to?(:to_ary).should be true
|
511
511
|
subject.to_ary.first.should == ProductDecorator.decorate(paged_array.first)
|
512
512
|
end
|
513
513
|
|
514
|
-
it "
|
514
|
+
it "delegate respond_to? to the wrapped collection" do
|
515
515
|
decorator = ProductDecorator.decorate(paged_array)
|
516
516
|
paged_array.should_receive(:respond_to?).with(:whatever, true)
|
517
517
|
decorator.respond_to?(:whatever, true)
|
518
518
|
end
|
519
519
|
|
520
|
-
it "
|
520
|
+
it "return blank for a decorated empty collection" do
|
521
521
|
# This tests that respond_to? is defined for the DecoratedEnumerableProxy
|
522
522
|
# since activesupport calls respond_to?(:empty) in #blank
|
523
523
|
decorator = ProductDecorator.decorate(empty_collection)
|
524
524
|
decorator.should be_blank
|
525
525
|
end
|
526
526
|
|
527
|
-
it "
|
527
|
+
it "return whether the member is in the array for a decorated wrapped collection" do
|
528
528
|
# This tests that include? is defined for the DecoratedEnumerableProxy
|
529
529
|
member = paged_array.first
|
530
530
|
subject.respond_to?(:include?)
|
@@ -533,20 +533,20 @@ describe Draper::Base do
|
|
533
533
|
subject.include?(Product.new).should == false
|
534
534
|
end
|
535
535
|
|
536
|
-
it "
|
536
|
+
it "equal each other when decorating the same collection" do
|
537
537
|
subject_one = ProductDecorator.decorate(paged_array)
|
538
538
|
subject_two = ProductDecorator.decorate(paged_array)
|
539
539
|
subject_one.should == subject_two
|
540
540
|
end
|
541
541
|
|
542
|
-
it "
|
542
|
+
it "not equal each other when decorating different collections" do
|
543
543
|
subject_one = ProductDecorator.decorate(paged_array)
|
544
544
|
new_paged_array = paged_array + [Product.new]
|
545
545
|
subject_two = ProductDecorator.decorate(new_paged_array)
|
546
546
|
subject_one.should_not == subject_two
|
547
547
|
end
|
548
548
|
|
549
|
-
it "
|
549
|
+
it "allow decorated access by index" do
|
550
550
|
subject = ProductDecorator.decorate(paged_array)
|
551
551
|
subject[0].should be_instance_of ProductDecorator
|
552
552
|
end
|
@@ -572,18 +572,18 @@ describe Draper::Base do
|
|
572
572
|
end
|
573
573
|
|
574
574
|
context '#all' do
|
575
|
-
it "
|
575
|
+
it "return a decorated collection" do
|
576
576
|
ProductDecorator.all.first.should be_instance_of ProductDecorator
|
577
577
|
end
|
578
578
|
|
579
|
-
it "
|
579
|
+
it "accept a context" do
|
580
580
|
collection = ProductDecorator.all(:context => :admin)
|
581
581
|
collection.first.context.should == :admin
|
582
582
|
end
|
583
583
|
end
|
584
584
|
|
585
585
|
context(".source / .to_source") do
|
586
|
-
it "
|
586
|
+
it "return the wrapped object" do
|
587
587
|
subject.to_source == source
|
588
588
|
subject.source == source
|
589
589
|
end
|
@@ -593,19 +593,19 @@ describe Draper::Base do
|
|
593
593
|
describe "a sample usage with denies" do
|
594
594
|
let(:subject_with_denies){ DecoratorWithDenies.new(source) }
|
595
595
|
|
596
|
-
it "
|
596
|
+
it "proxy methods not listed in denies" do
|
597
597
|
subject_with_denies.should respond_to(:hello_world)
|
598
598
|
end
|
599
599
|
|
600
|
-
it "
|
600
|
+
it "not echo methods specified with denies" do
|
601
601
|
subject_with_denies.should_not respond_to(:goodnight_moon)
|
602
602
|
end
|
603
603
|
|
604
|
-
it "
|
604
|
+
it "not clobber other decorators' methods" do
|
605
605
|
subject.should respond_to(:hello_world)
|
606
606
|
end
|
607
607
|
|
608
|
-
it "
|
608
|
+
it "not allow method_missing to circumvent a deny" do
|
609
609
|
expect{subject_with_denies.title}.to raise_error(NoMethodError)
|
610
610
|
end
|
611
611
|
end
|
@@ -615,20 +615,20 @@ describe Draper::Base do
|
|
615
615
|
|
616
616
|
let(:subject_with_multiple_allows){ DecoratorWithMultipleAllows.new(source) }
|
617
617
|
|
618
|
-
it "
|
618
|
+
it "echo the allowed method" do
|
619
619
|
subject_with_allows.should respond_to(:goodnight_moon)
|
620
620
|
end
|
621
621
|
|
622
|
-
it "
|
622
|
+
it "echo _only_ the allowed method" do
|
623
623
|
subject_with_allows.should_not respond_to(:hello_world)
|
624
624
|
end
|
625
625
|
|
626
|
-
it "
|
626
|
+
it "echo the combined allowed methods" do
|
627
627
|
subject_with_multiple_allows.should respond_to(:goodnight_moon)
|
628
628
|
subject_with_multiple_allows.should respond_to(:hello_world)
|
629
629
|
end
|
630
630
|
|
631
|
-
it "
|
631
|
+
it "echo _only_ the combined allowed methods" do
|
632
632
|
subject_with_multiple_allows.should_not respond_to(:title)
|
633
633
|
end
|
634
634
|
end
|
@@ -660,19 +660,19 @@ describe Draper::Base do
|
|
660
660
|
end
|
661
661
|
}
|
662
662
|
|
663
|
-
it "
|
663
|
+
it "raise an exception for a blank allows" do
|
664
664
|
expect {blank_allows}.should raise_error(ArgumentError)
|
665
665
|
end
|
666
666
|
|
667
|
-
it "
|
667
|
+
it "raise an exception for a blank denies" do
|
668
668
|
expect {blank_denies}.should raise_error(ArgumentError)
|
669
669
|
end
|
670
670
|
|
671
|
-
it "
|
671
|
+
it "raise an exception for calling allows then denies" do
|
672
672
|
expect {using_allows_then_denies}.should raise_error(ArgumentError)
|
673
673
|
end
|
674
674
|
|
675
|
-
it "
|
675
|
+
it "raise an exception for calling denies then allows" do
|
676
676
|
expect {using_denies_then_allows}.should raise_error(ArgumentError)
|
677
677
|
end
|
678
678
|
end
|
@@ -680,23 +680,23 @@ describe Draper::Base do
|
|
680
680
|
context "in a Rails application" do
|
681
681
|
let(:decorator){ DecoratorWithApplicationHelper.decorate(Object.new) }
|
682
682
|
|
683
|
-
it "
|
683
|
+
it "have access to ApplicationHelper helpers" do
|
684
684
|
decorator.uses_hello_world == "Hello, World!"
|
685
685
|
end
|
686
686
|
|
687
|
-
it "
|
687
|
+
it "is able to use the content_tag helper" do
|
688
688
|
decorator.sample_content.to_s.should == "<span>Hello, World!</span>"
|
689
689
|
end
|
690
690
|
|
691
|
-
it "
|
691
|
+
it "is able to use the link_to helper" do
|
692
692
|
decorator.sample_link.should == "<a href=\"/World\">Hello</a>"
|
693
693
|
end
|
694
694
|
|
695
|
-
it "
|
695
|
+
it "is able to use the pluralize helper" do
|
696
696
|
decorator.sample_truncate.should == "Once..."
|
697
697
|
end
|
698
698
|
|
699
|
-
it "
|
699
|
+
it "is able to use l rather than helpers.l" do
|
700
700
|
now = Time.now
|
701
701
|
decorator.helpers.should_receive(:localize).with(now)
|
702
702
|
decorator.l now
|
@@ -7,12 +7,12 @@ describe Draper::ActiveModelSupport do
|
|
7
7
|
its(:decorator) { should be_kind_of(ProductDecorator) }
|
8
8
|
its(:decorator) { should be(subject.decorator) }
|
9
9
|
|
10
|
-
it '
|
10
|
+
it 'have abillity to pass block' do
|
11
11
|
a = Product.new.decorator { |d| d.awesome_title }
|
12
12
|
a.should eql "Awesome Title"
|
13
13
|
end
|
14
14
|
|
15
|
-
it '
|
15
|
+
it 'is aliased to .decorate' do
|
16
16
|
subject.decorator.model.should == subject.decorate.model
|
17
17
|
end
|
18
18
|
end
|
@@ -23,12 +23,12 @@ describe Draper::ActiveModelSupport do
|
|
23
23
|
|
24
24
|
its(:decorate) { should be_kind_of(Draper::DecoratedEnumerableProxy) }
|
25
25
|
|
26
|
-
it "
|
26
|
+
it "decorate the collection" do
|
27
27
|
subject.decorate.size.should == 1
|
28
28
|
subject.decorate.to_ary[0].model.should be_a(klass)
|
29
29
|
end
|
30
30
|
|
31
|
-
it "
|
31
|
+
it "return a new instance each time it is called" do
|
32
32
|
subject.decorate.should_not == subject.decorate
|
33
33
|
end
|
34
34
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: draper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 39
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 14
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.14.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jeff Casimir
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2012-05-
|
19
|
+
date: 2012-05-17 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: activesupport
|
@@ -34,112 +34,111 @@ dependencies:
|
|
34
34
|
type: :runtime
|
35
35
|
version_requirements: *id001
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
37
|
+
name: actionpack
|
38
38
|
prerelease: false
|
39
39
|
requirement: &id002 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
43
43
|
- !ruby/object:Gem::Version
|
44
|
-
hash:
|
44
|
+
hash: 3
|
45
45
|
segments:
|
46
|
-
-
|
47
|
-
- 9
|
46
|
+
- 3
|
48
47
|
- 2
|
49
|
-
version:
|
48
|
+
version: "3.2"
|
50
49
|
type: :runtime
|
51
50
|
version_requirements: *id002
|
52
51
|
- !ruby/object:Gem::Dependency
|
53
|
-
name:
|
52
|
+
name: ammeter
|
54
53
|
prerelease: false
|
55
54
|
requirement: &id003 !ruby/object:Gem::Requirement
|
56
55
|
none: false
|
57
56
|
requirements:
|
58
57
|
- - ~>
|
59
58
|
- !ruby/object:Gem::Version
|
60
|
-
hash:
|
59
|
+
hash: 19
|
61
60
|
segments:
|
61
|
+
- 0
|
62
62
|
- 2
|
63
|
-
-
|
64
|
-
version:
|
65
|
-
type: :
|
63
|
+
- 2
|
64
|
+
version: 0.2.2
|
65
|
+
type: :development
|
66
66
|
version_requirements: *id003
|
67
67
|
- !ruby/object:Gem::Dependency
|
68
|
-
name:
|
68
|
+
name: guard
|
69
69
|
prerelease: false
|
70
70
|
requirement: &id004 !ruby/object:Gem::Requirement
|
71
71
|
none: false
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
hash: 3
|
76
76
|
segments:
|
77
|
-
-
|
78
|
-
|
79
|
-
|
80
|
-
type: :runtime
|
77
|
+
- 0
|
78
|
+
version: "0"
|
79
|
+
type: :development
|
81
80
|
version_requirements: *id004
|
82
81
|
- !ruby/object:Gem::Dependency
|
83
|
-
name:
|
82
|
+
name: guard-rspec
|
84
83
|
prerelease: false
|
85
84
|
requirement: &id005 !ruby/object:Gem::Requirement
|
86
85
|
none: false
|
87
86
|
requirements:
|
88
|
-
- -
|
87
|
+
- - ">="
|
89
88
|
- !ruby/object:Gem::Version
|
90
89
|
hash: 3
|
91
90
|
segments:
|
92
|
-
-
|
93
|
-
|
94
|
-
|
95
|
-
type: :runtime
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
type: :development
|
96
94
|
version_requirements: *id005
|
97
95
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
96
|
+
name: launchy
|
99
97
|
prerelease: false
|
100
98
|
requirement: &id006 !ruby/object:Gem::Requirement
|
101
99
|
none: false
|
102
100
|
requirements:
|
103
|
-
- -
|
101
|
+
- - ">="
|
104
102
|
- !ruby/object:Gem::Version
|
105
|
-
hash:
|
103
|
+
hash: 3
|
106
104
|
segments:
|
107
105
|
- 0
|
108
|
-
|
109
|
-
- 2
|
110
|
-
version: 0.2.2
|
106
|
+
version: "0"
|
111
107
|
type: :development
|
112
108
|
version_requirements: *id006
|
113
109
|
- !ruby/object:Gem::Dependency
|
114
|
-
name:
|
110
|
+
name: rake
|
115
111
|
prerelease: false
|
116
112
|
requirement: &id007 !ruby/object:Gem::Requirement
|
117
113
|
none: false
|
118
114
|
requirements:
|
119
|
-
- -
|
115
|
+
- - ~>
|
120
116
|
- !ruby/object:Gem::Version
|
121
|
-
hash:
|
117
|
+
hash: 63
|
122
118
|
segments:
|
123
119
|
- 0
|
124
|
-
|
120
|
+
- 9
|
121
|
+
- 2
|
122
|
+
version: 0.9.2
|
125
123
|
type: :development
|
126
124
|
version_requirements: *id007
|
127
125
|
- !ruby/object:Gem::Dependency
|
128
|
-
name:
|
126
|
+
name: rspec
|
129
127
|
prerelease: false
|
130
128
|
requirement: &id008 !ruby/object:Gem::Requirement
|
131
129
|
none: false
|
132
130
|
requirements:
|
133
|
-
- -
|
131
|
+
- - ~>
|
134
132
|
- !ruby/object:Gem::Version
|
135
|
-
hash:
|
133
|
+
hash: 23
|
136
134
|
segments:
|
137
|
-
-
|
138
|
-
|
135
|
+
- 2
|
136
|
+
- 10
|
137
|
+
version: "2.10"
|
139
138
|
type: :development
|
140
139
|
version_requirements: *id008
|
141
140
|
- !ruby/object:Gem::Dependency
|
142
|
-
name:
|
141
|
+
name: yard
|
143
142
|
prerelease: false
|
144
143
|
requirement: &id009 !ruby/object:Gem::Requirement
|
145
144
|
none: false
|
@@ -152,20 +151,6 @@ dependencies:
|
|
152
151
|
version: "0"
|
153
152
|
type: :development
|
154
153
|
version_requirements: *id009
|
155
|
-
- !ruby/object:Gem::Dependency
|
156
|
-
name: yard
|
157
|
-
prerelease: false
|
158
|
-
requirement: &id010 !ruby/object:Gem::Requirement
|
159
|
-
none: false
|
160
|
-
requirements:
|
161
|
-
- - ">="
|
162
|
-
- !ruby/object:Gem::Version
|
163
|
-
hash: 3
|
164
|
-
segments:
|
165
|
-
- 0
|
166
|
-
version: "0"
|
167
|
-
type: :development
|
168
|
-
version_requirements: *id010
|
169
154
|
description: Draper implements a decorator or presenter pattern for Rails applications.
|
170
155
|
email:
|
171
156
|
- jeff@casimircreative.com
|
@@ -286,7 +271,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
286
271
|
requirements: []
|
287
272
|
|
288
273
|
rubyforge_project: draper
|
289
|
-
rubygems_version: 1.8.
|
274
|
+
rubygems_version: 1.8.15
|
290
275
|
signing_key:
|
291
276
|
specification_version: 3
|
292
277
|
summary: Decorator pattern implementation for Rails.
|