active_decorator 0.9.0 → 1.0.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: 4a64ac56dc2cc2bf285935260b3dd24f83df0b82
4
- data.tar.gz: ec20d7d2ea5a11c8dff62b1b4bf648e73294da95
3
+ metadata.gz: 8ec56959877091a50db872942aaeb8352cdb9269
4
+ data.tar.gz: 5a64a878439cc739235815ad6b9345d243cd191b
5
5
  SHA512:
6
- metadata.gz: 113084bbe2c85cfe885ba8c99bac86b7a09650647630fe4c5c71c93ef2c316039552055a5200d49fc1d2f87a0573686d8c6865f22e38761c46751fbdd23ea58b
7
- data.tar.gz: a8dd5c74158c52d2dbda7116a3289ac30287b639606271f14f4ddcd924f6a2ee3dac79294fec6c9d3e41f6d55aea20f027530358589bf17f42e1a51a4fd7bb0a
6
+ metadata.gz: 7935a3abad55b5a751acfe09fab8cf4dcd7f1b4e5c66b09d2a00fbc0cccbf9562ea84ee76767cc77313160174f427fbcb38ec17f767a2f503c01329e8d377472
7
+ data.tar.gz: f84157d3533f18cfd9aafed0e5b23f48f210e3dd8a351e8c0bb2df95afec646c634ca650f833e388fb11c1134527ea58c7b7c5f7f4fe7933b98a8221a6672a25
@@ -7,7 +7,7 @@ rvm:
7
7
  - 2.0.0
8
8
  - 2.1.10
9
9
  - 2.2.7
10
- - 2.3.3
10
+ - 2.3.4
11
11
  - 2.4.1
12
12
  - ruby-head
13
13
  gemfile:
data/README.md CHANGED
@@ -17,7 +17,7 @@ A simple and Rubyish view helper for Rails 3, Rails 4 and Rails 5. Keep your hel
17
17
 
18
18
  * Ruby 2.0.0, 2.1.x, 2.2.x, 2.3.x, 2.4.x, and 2.5 (trunk)
19
19
 
20
- * Rails 3.2.x, 4.0.x, 4.1.x, 4.2.x, 5.0, and 5.1 (edge)
20
+ * Rails 3.2.x, 4.0.x, 4.1.x, 4.2.x, 5.0, 5.1, and 5.2 (edge)
21
21
 
22
22
 
23
23
  ## Supported ORMs ##
@@ -47,8 +47,8 @@ end
47
47
  * Controller
48
48
  ```ruby
49
49
  class AuthorsController < ApplicationController
50
- def show(id)
51
- @user = Author.find id
50
+ def show(id) # powered by action_args
51
+ @author = Author.find id
52
52
  end
53
53
  end
54
54
  ```
@@ -87,7 +87,7 @@ end
87
87
  ```ruby
88
88
  class AuthorsController < ApplicationController
89
89
  def show(id)
90
- @user = Author.find id
90
+ @author = Author.find id
91
91
  end
92
92
  end
93
93
  ```
@@ -112,6 +112,20 @@ end
112
112
  </ul>
113
113
  ```
114
114
 
115
+ ### Using ActiveDecorator outside of Action View ###
116
+
117
+ Sometimes your may want to use decorators outside of Action View, for example,
118
+ for background tasks for ActiveJob.
119
+ For such use case, ActiveDecorator module provides `with_view_context` method
120
+ that takes some kind of Action View and a block.
121
+
122
+ ```ruby
123
+ ActiveDecorator::ViewContext.run_with ApplicationController.new.view_context do
124
+ ## perform some heavy jobs here
125
+ end
126
+ ```
127
+
128
+
115
129
  ## Testing
116
130
 
117
131
  You can test a decorator using your favorite test framework by decorating the model instance with
@@ -120,7 +134,7 @@ You can test a decorator using your favorite test framework by decorating the mo
120
134
  ActiveDecorator::Decorator.instance.decorate(model_instance)
121
135
  ```
122
136
 
123
- Considering an `Organization` model and it's simple decorator:
137
+ Considering an `Organization` model and its simple decorator:
124
138
 
125
139
  ```ruby
126
140
  module OrganizationDecorator
@@ -6,4 +6,5 @@ gem 'rails', '~> 4.0.0'
6
6
  gem 'test-unit-rails'
7
7
  gem 'capybara'
8
8
  gem 'sqlite3'
9
+ gem 'nokogiri', '~> 1.6.0'
9
10
  gem 'jbuilder'
@@ -6,4 +6,5 @@ gem 'rails', '~> 4.1.0'
6
6
  gem 'test-unit-rails'
7
7
  gem 'capybara'
8
8
  gem 'sqlite3'
9
+ gem 'nokogiri', '~> 1.6.0'
9
10
  gem 'jbuilder'
@@ -6,4 +6,5 @@ gem 'rails', '~> 4.2.0'
6
6
  gem 'test-unit-rails'
7
7
  gem 'capybara'
8
8
  gem 'sqlite3'
9
+ gem 'nokogiri', '~> 1.6.0'
9
10
  gem 'jbuilder'
@@ -2,7 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  gem 'active_decorator', path: '..'
4
4
 
5
- gem 'rails', '5.1.0.rc1'
5
+ gem 'rails', '5.1.0'
6
6
  gem 'test-unit-rails'
7
7
  gem 'capybara'
8
8
  gem 'sqlite3'
@@ -4,13 +4,20 @@ module ActiveDecorator
4
4
  module Helpers
5
5
  def method_missing(method, *args, &block)
6
6
  super
7
- rescue NoMethodError, NameError
7
+ rescue NoMethodError, NameError => e
8
+ # the error is not mine, so just releases it as is.
9
+ raise e if e.name != method
10
+
8
11
  begin
9
12
  (view_context = ActiveDecorator::ViewContext.current).send method, *args, &block
10
- rescue NoMethodError
11
- raise NoMethodError, "undefined method `#{method}` for either #{self} or #{view_context}"
12
- rescue NameError
13
- raise NameError, "undefined local variable `#{method}` for either #{self} or #{view_context}"
13
+ rescue NoMethodError => e
14
+ raise e if e.name != method
15
+
16
+ raise NoMethodError.new("undefined method `#{method}' for either #{self} or #{view_context}", method)
17
+ rescue NameError => e
18
+ raise e if e.name != method
19
+
20
+ raise NameError.new("undefined local variable `#{method}' for either #{self} or #{view_context}", method)
14
21
  end
15
22
  end
16
23
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module ActiveDecorator
3
- VERSION = '0.9.0'
3
+ VERSION = '1.0.0'
4
4
  end
@@ -4,16 +4,26 @@ module ActiveDecorator
4
4
  module ViewContext
5
5
  class << self
6
6
  def current
7
- Thread.current[:active_decorator_view_contexts].last
7
+ view_context_stack.last
8
8
  end
9
9
 
10
10
  def push(view_context)
11
- Thread.current[:active_decorator_view_contexts] ||= []
12
- Thread.current[:active_decorator_view_contexts] << view_context
11
+ view_context_stack.push view_context
13
12
  end
14
13
 
15
14
  def pop
16
- Thread.current[:active_decorator_view_contexts].pop if Thread.current[:active_decorator_view_contexts]
15
+ view_context_stack.pop
16
+ end
17
+
18
+ def view_context_stack
19
+ Thread.current[:active_decorator_view_contexts] ||= []
20
+ end
21
+
22
+ def run_with(view_context)
23
+ push view_context
24
+ yield
25
+ ensure
26
+ pop
17
27
  end
18
28
  end
19
29
 
@@ -23,20 +33,14 @@ module ActiveDecorator
23
33
  included do
24
34
  if Rails::VERSION::MAJOR >= 4
25
35
  around_action do |controller, blk|
26
- begin
27
- ActiveDecorator::ViewContext.push controller.view_context
36
+ ActiveDecorator::ViewContext.run_with(controller.view_context) do
28
37
  blk.call
29
- ensure
30
- ActiveDecorator::ViewContext.pop
31
38
  end
32
39
  end
33
40
  else
34
41
  around_filter do |controller, blk|
35
- begin
36
- ActiveDecorator::ViewContext.push controller.view_context
42
+ ActiveDecorator::ViewContext.run_with(controller.view_context) do
37
43
  blk.call
38
- ensure
39
- ActiveDecorator::ViewContext.pop
40
44
  end
41
45
  end
42
46
  end
@@ -1,7 +1,7 @@
1
1
  require '<%= File.exists?('spec/rails_helper.rb') ? 'rails_helper' : 'spec_helper' %>'
2
2
 
3
- describe <%= singular_name.camelize %>Decorator do
4
- let(:<%= singular_name %>) { <%= class_name %>.new.extend <%= singular_name.camelize %>Decorator }
3
+ describe <%= class_name %>Decorator do
4
+ let(:<%= singular_name %>) { <%= class_name %>.new.extend <%= class_name %>Decorator }
5
5
  subject { <%= singular_name %> }
6
6
  it { should be_a <%= class_name %> }
7
7
  end
@@ -2,7 +2,7 @@ require 'test_helper'
2
2
 
3
3
  class <%= singular_name.camelize %>DecoratorTest < ActiveSupport::TestCase
4
4
  def setup
5
- @<%= singular_name %> = <%= class_name %>.new.extend <%= singular_name.camelize %>Decorator
5
+ @<%= singular_name %> = <%= class_name %>.new.extend <%= class_name %>Decorator
6
6
  end
7
7
 
8
8
  # test "the truth" do
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ class DecoratorTest < Test::Unit::TestCase
5
+
6
+ test 'it returns the object on decoration' do
7
+ book = Book.new title: 'Boek'
8
+ assert_equal book, ActiveDecorator::Decorator.instance.decorate(book)
9
+ end
10
+
11
+ test 'it returns the object when it already is decorated on decorate' do
12
+ book = Book.new title: 'Boek'
13
+ assert_equal book, ActiveDecorator::Decorator.instance.decorate(ActiveDecorator::Decorator.instance.decorate(book))
14
+ end
15
+ end
@@ -0,0 +1 @@
1
+ <%= @book.errata2 %>
@@ -29,6 +29,7 @@ ActiveDecoratorTestApp::Application.routes.draw do
29
29
  resources :books, only: [:index, :show] do
30
30
  member do
31
31
  get :errata
32
+ get :errata2
32
33
  get :error
33
34
  post :purchase
34
35
  end
@@ -115,6 +116,10 @@ module BookDecorator
115
116
  poof!
116
117
  end
117
118
 
119
+ def errata2
120
+ title.boom!
121
+ end
122
+
118
123
  def error
119
124
  "ERROR"
120
125
  end
@@ -203,6 +208,10 @@ class BooksController < ApplicationController
203
208
  @book = Author.find(params[:author_id]).books.find(params[:id])
204
209
  end
205
210
 
211
+ def errata2
212
+ @book = Author.find(params[:author_id]).books.find(params[:id])
213
+ end
214
+
206
215
  def error
207
216
  @book = Author.find(params[:author_id]).books.find(params[:id])
208
217
  raise CustomError, "error"
@@ -12,6 +12,17 @@ class NameErrorHandlingTest < ActionDispatch::IntegrationTest
12
12
  visit "/authors/#{@rhg.author.id}/books/#{@rhg.id}/errata"
13
13
  end
14
14
 
15
- assert_match(/undefined method `poof!` for/, err.message)
15
+ assert_match(/undefined method `poof!' for/, err.message)
16
+ assert_match 'poof!', err.cause.name if err.respond_to?(:cause)
17
+ end
18
+
19
+ test "Don't touch NameError that was not raised from a decorator module but from other classes" do
20
+ err = assert_raises ActionView::Template::Error do
21
+ visit "/authors/#{@rhg.author.id}/books/#{@rhg.id}/errata2"
22
+ end
23
+
24
+ assert_match(/undefined method `boom!' for/, err.message)
25
+ assert_match 'boom!', err.cause.name if err.respond_to?(:cause)
26
+ assert_not_match(/active_decorator\/lib\/active_decorator\/.* in method_missing'$/, err.backtrace[0])
16
27
  end
17
28
  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.9.0
4
+ version: 1.0.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: 2017-04-05 00:00:00.000000000 Z
11
+ date: 2017-06-29 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A simple and Rubyish view helper for Rails
14
14
  email:
@@ -17,8 +17,8 @@ executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
- - ".gitignore"
21
- - ".travis.yml"
20
+ - .gitignore
21
+ - .travis.yml
22
22
  - Gemfile
23
23
  - MIT-LICENSE
24
24
  - README.md
@@ -48,9 +48,9 @@ files:
48
48
  - lib/generators/rspec/templates/decorator_spec.rb
49
49
  - lib/generators/test_unit/decorator_generator.rb
50
50
  - lib/generators/test_unit/templates/decorator_test.rb
51
- - spec/lib/decorator_spec.rb
52
51
  - test/configuration_test.rb
53
52
  - test/controllers/fake_detection_test.rb
53
+ - test/decorator_test.rb
54
54
  - test/fake_app/app/views/authors/index.html.erb
55
55
  - test/fake_app/app/views/authors/show.html.erb
56
56
  - test/fake_app/app/views/authors/show.json.jbuilder
@@ -59,6 +59,7 @@ files:
59
59
  - test/fake_app/app/views/books/_book.json.jbuilder
60
60
  - test/fake_app/app/views/books/_book_locals.html.erb
61
61
  - test/fake_app/app/views/books/errata.html.erb
62
+ - test/fake_app/app/views/books/errata2.html.erb
62
63
  - test/fake_app/app/views/books/error.html.erb
63
64
  - test/fake_app/app/views/books/index.html.erb
64
65
  - test/fake_app/app/views/books/purchase.html.erb
@@ -81,24 +82,24 @@ require_paths:
81
82
  - lib
82
83
  required_ruby_version: !ruby/object:Gem::Requirement
83
84
  requirements:
84
- - - ">="
85
+ - - '>='
85
86
  - !ruby/object:Gem::Version
86
87
  version: '0'
87
88
  required_rubygems_version: !ruby/object:Gem::Requirement
88
89
  requirements:
89
- - - ">="
90
+ - - '>='
90
91
  - !ruby/object:Gem::Version
91
92
  version: '0'
92
93
  requirements: []
93
94
  rubyforge_project:
94
- rubygems_version: 2.6.11
95
+ rubygems_version: 2.6.12
95
96
  signing_key:
96
97
  specification_version: 4
97
98
  summary: A simple and Rubyish view helper for Rails
98
99
  test_files:
99
- - spec/lib/decorator_spec.rb
100
100
  - test/configuration_test.rb
101
101
  - test/controllers/fake_detection_test.rb
102
+ - test/decorator_test.rb
102
103
  - test/fake_app/app/views/authors/index.html.erb
103
104
  - test/fake_app/app/views/authors/show.html.erb
104
105
  - test/fake_app/app/views/authors/show.json.jbuilder
@@ -107,6 +108,7 @@ test_files:
107
108
  - test/fake_app/app/views/books/_book.json.jbuilder
108
109
  - test/fake_app/app/views/books/_book_locals.html.erb
109
110
  - test/fake_app/app/views/books/errata.html.erb
111
+ - test/fake_app/app/views/books/errata2.html.erb
110
112
  - test/fake_app/app/views/books/error.html.erb
111
113
  - test/fake_app/app/views/books/index.html.erb
112
114
  - test/fake_app/app/views/books/purchase.html.erb
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
-
4
- describe ActiveDecorator::Decorator do
5
- subject { ActiveDecorator::Decorator.instance }
6
- let(:book) { Book.new(title: 'Boek') }
7
-
8
- it 'returns the object on decoration' do
9
- subject.decorate(book).should == book
10
- end
11
-
12
- it "returns the object when it already is decorated on decorate" do
13
- subject.decorate(subject.decorate(book)).should == book
14
- end
15
- end