active_decorator 0.5.3 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8b629e8976c74e87685b7bb1fbf2e147e98b28d0
4
- data.tar.gz: 39f23f27bf3a043b71dce4e6d819d1108090ba81
3
+ metadata.gz: 42f46de551b9463436f22f02b446cc587c69d7f4
4
+ data.tar.gz: bc4bcb100cb17417f34c18e919adce05e18ee02e
5
5
  SHA512:
6
- metadata.gz: 5bd056ada07410daf3273da2227d1a486d16676cba88cf7ed6297fa6647feccd97d1219c5e86cee571c790a368f6ad2c5a8a6c1e556ded5c64167971f5cdfb0b
7
- data.tar.gz: b7e46eac597123a5ae5d9741c76101341684d3e0ca93b6ae1792eb152c8b4f7691faf82c695ad3c7e926744b2b2ce27d602219eb58a9d820b0a027dc5df58b4c
6
+ metadata.gz: 7e7775bd6e2b67fbbd60b968926eb8d50b0e048729a976e7cd247a9c1a942fc3edbaa6624734dde9d8599cd536dccf15db9b3334da96eb6214ddba5266abd2ba
7
+ data.tar.gz: c13028fd5ac9ebf59e8e699423aa1179b2816edbaddd70c2e82fce43ccfdb37a8ba9d82fff1a239b1207c49b82fd408d3b561df74d5959499d7c5ec3f5637b5e
data/.rspec CHANGED
@@ -1 +1,2 @@
1
1
  --color
2
+ --require spec_helper
data/.travis.yml CHANGED
@@ -3,33 +3,27 @@ language: ruby
3
3
  script: bundle exec rake spec
4
4
 
5
5
  rvm:
6
- - 1.9.3
7
6
  - 2.0.0
8
- - 2.1
9
- - 2.2
7
+ - 2.1.8
8
+ - 2.2.4
9
+ - 2.3.0
10
10
  - ruby-head
11
11
  gemfile:
12
12
  - gemfiles/Gemfile-rails.3.2.x
13
13
  - gemfiles/Gemfile-rails.4.0.x
14
14
  - gemfiles/Gemfile-rails.4.1.x
15
15
  - gemfiles/Gemfile-rails.4.2.x
16
+ - gemfiles/Gemfile-rails.5.0.0.beta1
16
17
 
17
18
  sudo: false
18
19
 
19
20
  matrix:
20
- include:
21
- - rvm: 1.8.7
22
- gemfile: gemfiles/Gemfile-rails.3.0.x
23
- - rvm: 1.8.7
24
- gemfile: gemfiles/Gemfile-rails.3.1.x
25
- - rvm: 1.8.7
26
- gemfile: gemfiles/Gemfile-rails.3.2.x
27
- - rvm: 1.9.3
28
- gemfile: gemfiles/Gemfile-rails.3.0.x
29
- - rvm: 1.9.3
30
- gemfile: gemfiles/Gemfile-rails.3.1.x
31
21
  exclude:
32
22
  - rvm: ruby-head
33
23
  gemfile: gemfiles/Gemfile-rails.3.2.x
24
+ - rvm: 2.0.0
25
+ gemfile: gemfiles/Gemfile-rails.5.0.0.beta1
26
+ - rvm: 2.1.8
27
+ gemfile: gemfiles/Gemfile-rails.5.0.0.beta1
34
28
  allow_failures:
35
29
  - rvm: ruby-head
data/README.md CHANGED
@@ -14,7 +14,9 @@ A simple and Rubyish view helper for Rails 3 and Rails 4. Keep your helpers and
14
14
 
15
15
  ## Supported versions ##
16
16
 
17
- Rails 3.0.x, 3.1.x, 3.2.x, 4.0.x, 4.1.x, 4.2.x, and 5.0 (edge)
17
+ * Ruby 2.0.0, 2.1.x, 2.2.x, 2.3.x, and 2.4 (trunk)
18
+
19
+ * Rails 3.2.x, 4.0.x, 4.1.x, 4.2.x, and 5.0 (edge)
18
20
 
19
21
 
20
22
  ## Supported ORMs ##
@@ -63,6 +65,48 @@ end
63
65
  <% end %>
64
66
  ```
65
67
 
68
+ ## Decorating associated objects ##
69
+
70
+ ActiveDecorator *does not* automatically decorate associated objects. We recommend that you pass associated objects to `render` when decorated associated objects are needed.
71
+
72
+ ```ruby
73
+ # app/models/blog_post.rb
74
+ class BlogPost < ActiveRecord::Base
75
+ # published_at:datetime
76
+ end
77
+
78
+ # app/models/user.rb
79
+ class User < ActiveRecord::Base
80
+ has_many :blog_posts
81
+ end
82
+
83
+ # app/decorators/blog_post_decorator.rb
84
+ module BlogPostDecorator
85
+ def published_date
86
+ published_at.strftime("%Y.%m.%d")
87
+ end
88
+ end
89
+
90
+ # app/controllers/users_controller.rb
91
+ class UsersController < ApplicationController
92
+ def index
93
+ @users = User.all
94
+ end
95
+ end
96
+ ```
97
+
98
+ ```erb
99
+ # app/views/users/index.html.erb
100
+ <% @users.each do |user| %>
101
+ <%= render partial: "blog_post", locals: { blog_posts: user.blog_posts } %><br>
102
+ <% end %>
103
+
104
+ # app/views/users/_blog_post.html.erb
105
+ <% blog_posts.each do |blog_post| %>
106
+ <%= blog_post.published_date %>
107
+ <% end %>
108
+ ```
109
+
66
110
  ## Configuring the decorator suffix
67
111
 
68
112
  By default, ActiveDecorator searches a decorator module named `target_class.name + "Decorator"`
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'active_decorator', :path => '..'
4
+
5
+ gem 'rails', '~> 5.0.0.beta1'
6
+ gem 'rspec-rails'
7
+ gem 'capybara'
8
+ gem 'sqlite3'
9
+ gem 'jbuilder'
@@ -1,20 +1,5 @@
1
1
  module ActiveDecorator
2
- def self.configure(&block)
3
- yield @config ||= ActiveDecorator::Configuration.new
4
- end
2
+ include ActiveSupport::Configurable
5
3
 
6
- def self.config
7
- @config
8
- end
9
-
10
- # need a Class for 3.0
11
- class Configuration #:nodoc:
12
- include ActiveSupport::Configurable
13
-
14
- config_accessor :decorator_suffix
15
- end
16
-
17
- configure do |config|
18
- config.decorator_suffix = 'Decorator'
19
- end
4
+ config.decorator_suffix = 'Decorator'
20
5
  end
@@ -17,15 +17,9 @@ module ActiveDecorator
17
17
  obj.each do |r|
18
18
  decorate r
19
19
  end
20
- elsif defined?(ActiveRecord) && obj.is_a?(ActiveRecord::Relation) && !obj.respond_to?(:to_a_with_decorator)
21
- obj.class.class_eval do
22
- def to_a_with_decorator
23
- to_a_without_decorator.tap do |arr|
24
- ActiveDecorator::Decorator.instance.decorate arr
25
- end
26
- end
27
- alias_method_chain :to_a, :decorator
28
- end
20
+ elsif defined?(ActiveRecord) && obj.is_a?(ActiveRecord::Relation) && !obj.is_a?(ActiveDecorator::RelationDecorator)
21
+ # don't call each nor to_a immediately
22
+ obj.extend ActiveDecorator::RelationDecorator
29
23
  else
30
24
  d = decorator_for obj.class
31
25
  return obj unless d
@@ -43,10 +37,20 @@ module ActiveDecorator
43
37
  d.send :include, ActiveDecorator::Helpers
44
38
  @@decorators[model_class] = d
45
39
  else
40
+ # Cache nil results
46
41
  @@decorators[model_class] = nil
47
42
  end
48
43
  rescue NameError
44
+ # Cache nil results
49
45
  @@decorators[model_class] = nil
50
46
  end
51
47
  end
48
+
49
+ module RelationDecorator
50
+ def to_a
51
+ super.tap do |arr|
52
+ ActiveDecorator::Decorator.instance.decorate arr
53
+ end
54
+ end
55
+ end
52
56
  end
@@ -1,13 +1,15 @@
1
- module AbstractController
2
- module Rendering
3
- def view_assigns_with_decorator
4
- hash = view_assigns_without_decorator
5
- hash.values.each do |v|
6
- ActiveDecorator::Decorator.instance.decorate v
1
+ module ActiveDecorator
2
+ module Monkey
3
+ module AbstractController
4
+ module Rendering
5
+ def view_assigns
6
+ hash = super
7
+ hash.values.each do |v|
8
+ ActiveDecorator::Decorator.instance.decorate v
9
+ end
10
+ hash
11
+ end
7
12
  end
8
- hash
9
13
  end
10
-
11
- alias_method_chain :view_assigns, :decorator
12
14
  end
13
15
  end
@@ -1,11 +1,14 @@
1
- module ActionController
2
- class Base
3
- def rescue_with_handler_with_decorator_view_context(exception)
4
- ActiveDecorator::ViewContext.push(view_context)
5
- rescue_with_handler_without_decorator_view_context(exception)
6
- ensure
7
- ActiveDecorator::ViewContext.pop
1
+ module ActiveDecorator
2
+ module Monkey
3
+ module ActionController
4
+ module Base
5
+ def rescue_with_handler(*)
6
+ ActiveDecorator::ViewContext.push(view_context)
7
+ super
8
+ ensure
9
+ ActiveDecorator::ViewContext.pop
10
+ end
11
+ end
8
12
  end
9
- alias_method_chain :rescue_with_handler, :decorator_view_context
10
13
  end
11
14
  end
@@ -1,37 +1,19 @@
1
1
  module ActiveDecorator
2
- module ActionViewExtension
3
- def setup_decorator
4
- @locals.values.each do |v|
5
- ActiveDecorator::Decorator.instance.decorate v
6
- end unless @locals.blank?
7
- ActiveDecorator::Decorator.instance.decorate @object unless @object.blank?
8
- ActiveDecorator::Decorator.instance.decorate @collection unless @collection.blank?
2
+ module Monkey
3
+ module ActionView
4
+ module PartialRenderer
5
+ def setup(*)
6
+ super
9
7
 
10
- self
11
- end
12
- end
13
- end
8
+ @locals.values.each do |v|
9
+ ActiveDecorator::Decorator.instance.decorate v
10
+ end unless @locals.blank?
11
+ ActiveDecorator::Decorator.instance.decorate @object unless @object.blank?
12
+ ActiveDecorator::Decorator.instance.decorate @collection unless @collection.blank?
14
13
 
15
- if ActionPack::VERSION::STRING >= '3.1'
16
- class ActionView::PartialRenderer
17
- include ActiveDecorator::ActionViewExtension
18
-
19
- def setup_with_decorator(context, options, block) #:nodoc:
20
- setup_without_decorator context, options, block
21
- setup_decorator
14
+ self
15
+ end
16
+ end
22
17
  end
23
-
24
- alias_method_chain :setup, :decorator
25
- end
26
- else
27
- class ActionView::Partials::PartialRenderer
28
- include ActiveDecorator::ActionViewExtension
29
-
30
- def setup_with_decorator(options, block) #:nodoc:
31
- setup_without_decorator options, block
32
- setup_decorator
33
- end
34
-
35
- alias_method_chain :setup, :decorator
36
18
  end
37
19
  end
@@ -4,17 +4,26 @@ require 'rails'
4
4
  module ActiveDecorator
5
5
  class Railtie < ::Rails::Railtie
6
6
  initializer 'active_decorator' do
7
- ActiveSupport.on_load(:action_view) do
7
+ ActiveSupport.on_load :action_view do
8
8
  require 'active_decorator/monkey/action_view/partial_renderer'
9
+ ActionView::PartialRenderer.send :prepend, ActiveDecorator::Monkey::ActionView::PartialRenderer
9
10
  end
10
- ActiveSupport.on_load(:action_controller) do
11
+
12
+ ActiveSupport.on_load :action_controller do
11
13
  require 'active_decorator/monkey/abstract_controller/rendering'
14
+ ::ActionController::Base.send :prepend, ActiveDecorator::Monkey::AbstractController::Rendering
15
+
12
16
  require 'active_decorator/monkey/action_controller/base/rescue_from'
17
+ ActionController::Base.send :prepend, ActiveDecorator::Monkey::ActionController::Base
18
+
13
19
  ActionController::Base.send :include, ActiveDecorator::ViewContext::Filter
14
20
  end
15
- ActiveSupport.on_load(:action_mailer) do
21
+
22
+ ActiveSupport.on_load :action_mailer do
23
+ require 'active_decorator/monkey/abstract_controller/rendering'
24
+ ActionMailer::Base.send :prepend, ActiveDecorator::Monkey::AbstractController::Rendering
25
+
16
26
  if ActionMailer::Base.respond_to? :before_action
17
- require 'active_decorator/monkey/abstract_controller/rendering'
18
27
  ActionMailer::Base.send :include, ActiveDecorator::ViewContext::Filter
19
28
  end
20
29
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveDecorator
2
- VERSION = '0.5.3'
2
+ VERSION = '0.6.0'
3
3
  end
@@ -1,3 +1,2 @@
1
- # coding: utf-8
2
1
  module <%= class_name %>Decorator
3
2
  end
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  require '<%= File.exists?('spec/rails_helper.rb') ? 'rails_helper' : 'spec_helper' %>'
3
2
 
4
3
  describe <%= singular_name.camelize %>Decorator do
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  require 'test_helper'
3
2
 
4
3
  class <%= singular_name.camelize %>DecoratorTest < ActiveSupport::TestCase
@@ -1,5 +1,3 @@
1
- require 'spec_helper'
2
-
3
1
  Comic = Struct.new(:title, :price)
4
2
 
5
3
  module ComicPresenter
@@ -1,5 +1,3 @@
1
- require 'spec_helper'
2
-
3
1
  describe MoviesController, :type => :controller do
4
2
  let(:movie){ Movie.create }
5
3
 
@@ -167,28 +167,14 @@ class CreateAllTables < ActiveRecord::Migration
167
167
  end
168
168
 
169
169
  # Proxy for ActiveRecord::Relation
170
- if RUBY_VERSION >= '1.9.0'
171
- class RelationProxy < BasicObject
172
- attr_accessor :ar_relation
170
+ class RelationProxy < BasicObject
171
+ attr_accessor :ar_relation
173
172
 
174
- def initialize(ar_relation)
175
- @ar_relation = ar_relation
176
- end
177
-
178
- def method_missing(method, *args, &block)
179
- @ar_relation.public_send(method, *args, &block)
180
- end
173
+ def initialize(ar_relation)
174
+ @ar_relation = ar_relation
181
175
  end
182
- else
183
- class RelationProxy < Object
184
- attr_accessor :ar_relation
185
176
 
186
- def initialize(ar_relation)
187
- @ar_relation = ar_relation
188
- end
189
-
190
- def method_missing(method, *args, &block)
191
- @ar_relation.send(method, *args, &block)
192
- end
177
+ def method_missing(method, *args, &block)
178
+ @ar_relation.public_send(method, *args, &block)
193
179
  end
194
180
  end
@@ -1,5 +1,3 @@
1
- require 'spec_helper'
2
-
3
1
  feature 'fallback to helpers' do
4
2
  background do
5
3
  aamine = Author.create! :name => 'aamine'
@@ -1,5 +1,3 @@
1
- require 'spec_helper'
2
-
3
1
  feature 'decorating controller ivar' do
4
2
  background do
5
3
  @matz = Author.create! :name => 'matz'
@@ -7,11 +5,6 @@ feature 'decorating controller ivar' do
7
5
  Author.create! :name => 'takahashim'
8
6
  end
9
7
 
10
- after do
11
- Author.delete_all
12
- Book.delete_all
13
- end
14
-
15
8
  scenario 'decorating a model object in ivar' do
16
9
  visit "/authors/#{@matz.id}"
17
10
  page.should have_content 'matz'
@@ -1,15 +1,9 @@
1
- require 'spec_helper'
2
-
3
1
  feature 'decorating partial object in Jbuilder' do
4
2
  background do
5
3
  Author.create! :name => 'aamine'
6
4
  nari = Author.create! :name => 'nari'
7
5
  nari.books.create! :title => 'the gc book'
8
6
  end
9
- after do
10
- Book.delete_all
11
- Author.delete_all
12
- end
13
7
 
14
8
  scenario 'decorating objects in Jbuilder partials' do
15
9
  visit "/authors/#{Author.last.id}.json"
@@ -1,15 +1,9 @@
1
- require 'spec_helper'
2
-
3
1
  feature 'decorating partial object' do
4
2
  background do
5
3
  Author.create! :name => 'aamine'
6
4
  nari = Author.create! :name => 'nari'
7
5
  nari.books.create! :title => 'the gc book'
8
6
  end
9
- after do
10
- Book.delete_all
11
- Author.delete_all
12
- end
13
7
 
14
8
  scenario 'decorating implicit @object' do
15
9
  visit '/authors'
data/spec/spec_helper.rb CHANGED
@@ -18,6 +18,7 @@ RSpec.configure do |config|
18
18
  config.before :all do
19
19
  CreateAllTables.up unless ActiveRecord::Base.connection.table_exists? 'authors'
20
20
  end
21
+
21
22
  config.before :each do
22
23
  Book.delete_all
23
24
  Author.delete_all
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_decorator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Akira Matsuda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-28 00:00:00.000000000 Z
11
+ date: 2016-01-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A simple and Rubyish view helper for Rails
14
14
  email:
@@ -25,12 +25,11 @@ files:
25
25
  - README.md
26
26
  - Rakefile
27
27
  - active_decorator.gemspec
28
- - gemfiles/Gemfile-rails.3.0.x
29
- - gemfiles/Gemfile-rails.3.1.x
30
28
  - gemfiles/Gemfile-rails.3.2.x
31
29
  - gemfiles/Gemfile-rails.4.0.x
32
30
  - gemfiles/Gemfile-rails.4.1.x
33
31
  - gemfiles/Gemfile-rails.4.2.x
32
+ - gemfiles/Gemfile-rails.5.0.0.beta1
34
33
  - lib/active_decorator.rb
35
34
  - lib/active_decorator/config.rb
36
35
  - lib/active_decorator/decorator.rb
@@ -86,7 +85,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
85
  version: '0'
87
86
  requirements: []
88
87
  rubyforge_project: active_decorator
89
- rubygems_version: 2.4.5
88
+ rubygems_version: 2.4.5.1
90
89
  signing_key:
91
90
  specification_version: 4
92
91
  summary: A simple and Rubyish view helper for Rails
@@ -1,16 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'active_decorator', :path => '..'
4
-
5
- gem 'rails', '~> 3.0.0'
6
- gem 'rspec-rails', '~> 2.14.0'
7
- gem 'capybara', '~> 2.0.0'
8
- # rubyzip >=1 doesn't support ruby 1.8
9
- gem 'rubyzip', '< 1.0.0'
10
- gem 'sqlite3'
11
- gem 'nokogiri', '~> 1.5.0'
12
- if RUBY_VERSION <= '1.8.7'
13
- gem 'jbuilder', '< 2'
14
- else
15
- gem 'jbuilder'
16
- end
@@ -1,19 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'active_decorator', :path => '..'
4
-
5
- gem 'rails', '~> 3.1.0'
6
- gem 'rspec-rails', '~> 2.14.0'
7
- if RUBY_VERSION <= '1.8.7'
8
- gem 'i18n', '~> 0.6.11'
9
- end
10
- gem 'capybara', '~> 2.0.0'
11
- # rubyzip >=1 doesn't support ruby 1.8
12
- gem 'rubyzip', '< 1.0.0'
13
- gem 'sqlite3'
14
- gem 'nokogiri', '~> 1.5.0'
15
- if RUBY_VERSION <= '1.8.7'
16
- gem 'jbuilder', '< 2'
17
- else
18
- gem 'jbuilder'
19
- end