active_decorator 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b4ff2ae758a8f2c1a18ff85c02a06cfe4227815d
4
- data.tar.gz: 5e8fe96b2279ba2ef44a62d342056e4b6aa6b9fd
3
+ metadata.gz: 8c9a39129fbb4e1377d75be5b7267e7b0074c584
4
+ data.tar.gz: 7ef274bdeee7522ae1e4d2e72efcd3c1f8c1ad3a
5
5
  SHA512:
6
- metadata.gz: b1d64f92890474e35d2e3efcc231f1dd1299c5fd1cee9c6f4e526d8cc1d8c1900d1ce35715f8061129248e8baace4d6034bd50b805ca25b2cd6019117b0acdf1
7
- data.tar.gz: 7f885ea5e6e225b08edef2c2962affac26d450d0ea7e41af18150f1affdd624f8dabc4018504dfd4c66ad141751421f40cd7d0b828ba561da4f7e93e9e787eda
6
+ metadata.gz: f9b90b4730880cc22f36c7ff07225837d1d02a24cb1118f4306d27870905767a5ad93ec0ea1115b6eecb1410715a0a7a9435b5a7f7a67ee31e737e58cad867b1
7
+ data.tar.gz: f1ad27c204dcb408bbb87086da228aac33db149da114e99216c9dd3ba7ddccb245131c84b37ec050a0478f4ceed07e5f567060f1802680ef6d920d6daa72ac1a
data/README.md CHANGED
@@ -14,7 +14,7 @@ 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, and 4.1 (edge)
17
+ Rails 3.0.x, 3.1.x, 3.2.x, 4.0.x, 4.1.x, 4.2.x, and 5.0 (edge)
18
18
 
19
19
 
20
20
  ## Supported ORMs ##
@@ -63,6 +63,18 @@ end
63
63
  <% end %>
64
64
  ```
65
65
 
66
+ ## Configuring the decorator suffix
67
+
68
+ By default, ActiveDecorator searches a decorator module named `target_class.name + "Decorator"`
69
+
70
+ If you would like a different rule, you can configure in your initializer.
71
+
72
+ ```ruby
73
+ ActiveDecorator.configure do |config|
74
+ config.decorator_suffix = 'Presenter'
75
+ end
76
+ ```
77
+
66
78
  ## Contributing to ActiveDecorator ##
67
79
 
68
80
  * Fork, fix, then send me a pull request.
@@ -1,3 +1,4 @@
1
1
  require 'active_decorator/version'
2
2
  require 'active_decorator/decorator'
3
3
  require 'active_decorator/railtie'
4
+ require 'active_decorator/config'
@@ -0,0 +1,20 @@
1
+ module ActiveDecorator
2
+ def self.configure(&block)
3
+ yield @config ||= ActiveDecorator::Configuration.new
4
+ end
5
+
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
20
+ end
@@ -37,7 +37,7 @@ module ActiveDecorator
37
37
  def decorator_for(model_class)
38
38
  return @@decorators[model_class] if @@decorators.has_key? model_class
39
39
 
40
- decorator_name = "#{model_class.name}Decorator"
40
+ decorator_name = "#{model_class.name}#{ActiveDecorator.config.decorator_suffix}"
41
41
  d = decorator_name.constantize
42
42
  unless Class === d
43
43
  d.send :include, ActiveDecorator::Helpers
@@ -12,8 +12,10 @@ module ActiveDecorator
12
12
  ActionController::Base.send :include, ActiveDecorator::ViewContext::Filter
13
13
  end
14
14
  ActiveSupport.on_load(:action_mailer) do
15
- require 'active_decorator/monkey/abstract_controller/rendering'
16
- ActionMailer::Base.send :include, ActiveDecorator::ViewContext::Filter
15
+ if ActionMailer::Base.respond_to? :before_action
16
+ require 'active_decorator/monkey/abstract_controller/rendering'
17
+ ActionMailer::Base.send :include, ActiveDecorator::ViewContext::Filter
18
+ end
17
19
  end
18
20
  end
19
21
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveDecorator
2
- VERSION = '0.4.0'
2
+ VERSION = '0.5.0'
3
3
  end
@@ -2,11 +2,16 @@ module ActiveDecorator
2
2
  module ViewContext
3
3
  class << self
4
4
  def current
5
- Thread.current[:view_context]
5
+ Thread.current[:active_decorator_view_contexts].last
6
6
  end
7
7
 
8
- def current=(view_context)
9
- Thread.current[:view_context] = view_context
8
+ def push(view_context)
9
+ Thread.current[:active_decorator_view_contexts] ||= []
10
+ Thread.current[:active_decorator_view_contexts] << view_context
11
+ end
12
+
13
+ def pop
14
+ Thread.current[:active_decorator_view_contexts].pop if Thread.current[:active_decorator_view_contexts]
10
15
  end
11
16
  end
12
17
 
@@ -14,8 +19,24 @@ module ActiveDecorator
14
19
  extend ActiveSupport::Concern
15
20
 
16
21
  included do
17
- before_filter do |controller|
18
- ActiveDecorator::ViewContext.current = controller.view_context
22
+ if Rails::VERSION::MAJOR >= 4
23
+ around_action do |controller, blk|
24
+ begin
25
+ ActiveDecorator::ViewContext.push controller.view_context
26
+ blk.call
27
+ ensure
28
+ ActiveDecorator::ViewContext.pop
29
+ end
30
+ end
31
+ else
32
+ around_filter do |controller, blk|
33
+ begin
34
+ ActiveDecorator::ViewContext.push controller.view_context
35
+ blk.call
36
+ ensure
37
+ ActiveDecorator::ViewContext.pop
38
+ end
39
+ end
19
40
  end
20
41
  end
21
42
  end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ Comic = Struct.new(:title, :price)
4
+
5
+ module ComicPresenter
6
+ def price
7
+ "$#{super}"
8
+ end
9
+ end
10
+
11
+ describe ActiveDecorator::Configuration do
12
+ let(:comic) { ActiveDecorator::Decorator.instance.decorate(Comic.new("amatsuda's (Poignant) Guide to ActiveDecorator", 3)) }
13
+
14
+ context 'with a custom decorator_suffix' do
15
+ before do
16
+ ActiveDecorator.configure do |config|
17
+ config.decorator_suffix = 'Presenter'
18
+ end
19
+ end
20
+
21
+ after do
22
+ ActiveDecorator.configure do |config|
23
+ config.decorator_suffix = 'Decorator'
24
+ end
25
+ end
26
+
27
+ specify { comic.price.should == '$3' }
28
+ end
29
+ end
@@ -0,0 +1 @@
1
+ Thank you for purchasing <%= @book.upcased_title %>.
@@ -0,0 +1,4 @@
1
+ <%= @book.link %>
2
+ <%= @book.cover_image %>
3
+
4
+ <%= link_to 'purchase', [:purchase, @book.author, @book], :method => :post %>
@@ -1,5 +1,6 @@
1
1
  require 'active_record'
2
2
  require 'action_controller/railtie'
3
+ require 'action_mailer/railtie'
3
4
  require 'action_view/railtie'
4
5
  require 'jbuilder'
5
6
 
@@ -13,6 +14,9 @@ module ActiveDecoratorTestApp
13
14
  config.active_support.deprecation = :log
14
15
  config.eager_load = false
15
16
  config.action_dispatch.show_exceptions = false
17
+ config.root = File.dirname(__FILE__)
18
+
19
+ config.action_mailer.delivery_method = :test
16
20
  end
17
21
  end
18
22
  ActiveDecoratorTestApp::Application.initialize!
@@ -20,7 +24,11 @@ ActiveDecoratorTestApp::Application.initialize!
20
24
  # routes
21
25
  ActiveDecoratorTestApp::Application.routes.draw do
22
26
  resources :authors, :only => [:index, :show] do
23
- resources :books, :only => [:index, :show]
27
+ resources :books, :only => [:index, :show] do
28
+ member do
29
+ post :purchase
30
+ end
31
+ end
24
32
  end
25
33
  resources :movies, :only => :show
26
34
  end
@@ -58,7 +66,7 @@ module BookDecorator
58
66
  end
59
67
 
60
68
  def link
61
- link_to title, "#{request.protocol}#{request.host_with_port}/assets/sample.png"
69
+ link_to title, "#{request.protocol}#{request.host_with_port}/assets/sample.png", :class => 'title'
62
70
  end
63
71
 
64
72
  def cover_image
@@ -105,6 +113,14 @@ class BooksController < ApplicationController
105
113
  def show
106
114
  @book = Author.find(params[:author_id]).books.find(params[:id])
107
115
  end
116
+
117
+ def purchase
118
+ @book = Author.find(params[:author_id]).books.find(params[:id])
119
+
120
+ @view_context_before_sending_mail = ActiveDecorator::ViewContext.current
121
+ BookMailer.thanks(@book).deliver
122
+ raise 'Wrong ViewContext!' if ActiveDecorator::ViewContext.current != @view_context_before_sending_mail
123
+ end
108
124
  end
109
125
  class MoviesController < ApplicationController
110
126
  def show
@@ -112,6 +128,14 @@ class MoviesController < ApplicationController
112
128
  end
113
129
  end
114
130
 
131
+ # mailers
132
+ class BookMailer < ActionMailer::Base
133
+ def thanks(book)
134
+ @book = book
135
+ mail :from => 'nobody@example.com', :to => 'test@example.com', :subject => 'Thanks'
136
+ end
137
+ end
138
+
115
139
  # migrations
116
140
  class CreateAllTables < ActiveRecord::Migration
117
141
  def self.up
@@ -8,9 +8,15 @@ feature 'fallback to helpers' do
8
8
 
9
9
  scenario 'invoking action_view helper methods' do
10
10
  visit "/authors/#{@rhg.author.id}/books/#{@rhg.id}"
11
- within 'a' do
11
+ within 'a.title' do
12
12
  page.should have_content 'RHG'
13
13
  end
14
14
  page.should have_css('img')
15
15
  end
16
+
17
+ scenario 'make sure that action_view + action_mailer works' do
18
+ visit "/authors/#{@rhg.author.id}/books/#{@rhg.id}"
19
+ click_link 'purchase'
20
+ page.should have_content 'done'
21
+ end
16
22
  end
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.4.0
4
+ version: 0.5.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-01-13 00:00:00.000000000 Z
11
+ date: 2015-02-21 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A simple and Rubyish view helper for Rails 3
14
14
  email:
@@ -32,6 +32,7 @@ files:
32
32
  - gemfiles/Gemfile-rails.4.1.x
33
33
  - gemfiles/Gemfile-rails.4.2.x
34
34
  - lib/active_decorator.rb
35
+ - lib/active_decorator/config.rb
35
36
  - lib/active_decorator/decorator.rb
36
37
  - lib/active_decorator/helpers.rb
37
38
  - lib/active_decorator/monkey/abstract_controller/rendering.rb
@@ -45,17 +46,20 @@ files:
45
46
  - lib/generators/rspec/templates/decorator_spec.rb
46
47
  - lib/generators/test_unit/decorator_generator.rb
47
48
  - lib/generators/test_unit/templates/decorator_test.rb
49
+ - spec/configuration_spec.rb
48
50
  - spec/controllers/fake_detection_spec.rb
49
- - spec/fake_app/authors/index.html.erb
50
- - spec/fake_app/authors/show.html.erb
51
- - spec/fake_app/authors/show.json.jbuilder
52
- - spec/fake_app/books/_book.html.erb
53
- - spec/fake_app/books/_book.json.jbuilder
54
- - spec/fake_app/books/_book_locals.html.erb
55
- - spec/fake_app/books/index.html.erb
56
- - spec/fake_app/books/show.html.erb
51
+ - spec/fake_app/app/views/authors/index.html.erb
52
+ - spec/fake_app/app/views/authors/show.html.erb
53
+ - spec/fake_app/app/views/authors/show.json.jbuilder
54
+ - spec/fake_app/app/views/book_mailer/thanks.text.erb
55
+ - spec/fake_app/app/views/books/_book.html.erb
56
+ - spec/fake_app/app/views/books/_book.json.jbuilder
57
+ - spec/fake_app/app/views/books/_book_locals.html.erb
58
+ - spec/fake_app/app/views/books/index.html.erb
59
+ - spec/fake_app/app/views/books/purchase.html.erb
60
+ - spec/fake_app/app/views/books/show.html.erb
61
+ - spec/fake_app/app/views/movies/show.html.erb
57
62
  - spec/fake_app/fake_app.rb
58
- - spec/fake_app/movies/show.html.erb
59
63
  - spec/features/action_view_helpers_spec.rb
60
64
  - spec/features/controller_ivar_spec.rb
61
65
  - spec/features/jbuilder_spec.rb
@@ -85,19 +89,23 @@ signing_key:
85
89
  specification_version: 4
86
90
  summary: A simple and Rubyish view helper for Rails 3
87
91
  test_files:
92
+ - spec/configuration_spec.rb
88
93
  - spec/controllers/fake_detection_spec.rb
89
- - spec/fake_app/authors/index.html.erb
90
- - spec/fake_app/authors/show.html.erb
91
- - spec/fake_app/authors/show.json.jbuilder
92
- - spec/fake_app/books/_book.html.erb
93
- - spec/fake_app/books/_book.json.jbuilder
94
- - spec/fake_app/books/_book_locals.html.erb
95
- - spec/fake_app/books/index.html.erb
96
- - spec/fake_app/books/show.html.erb
94
+ - spec/fake_app/app/views/authors/index.html.erb
95
+ - spec/fake_app/app/views/authors/show.html.erb
96
+ - spec/fake_app/app/views/authors/show.json.jbuilder
97
+ - spec/fake_app/app/views/book_mailer/thanks.text.erb
98
+ - spec/fake_app/app/views/books/_book.html.erb
99
+ - spec/fake_app/app/views/books/_book.json.jbuilder
100
+ - spec/fake_app/app/views/books/_book_locals.html.erb
101
+ - spec/fake_app/app/views/books/index.html.erb
102
+ - spec/fake_app/app/views/books/purchase.html.erb
103
+ - spec/fake_app/app/views/books/show.html.erb
104
+ - spec/fake_app/app/views/movies/show.html.erb
97
105
  - spec/fake_app/fake_app.rb
98
- - spec/fake_app/movies/show.html.erb
99
106
  - spec/features/action_view_helpers_spec.rb
100
107
  - spec/features/controller_ivar_spec.rb
101
108
  - spec/features/jbuilder_spec.rb
102
109
  - spec/features/partial_spec.rb
103
110
  - spec/spec_helper.rb
111
+ has_rdoc:
@@ -1,2 +0,0 @@
1
- <%= @book.link %>
2
- <%= @book.cover_image %>