lulalala_presenter 0.0.1 → 0.1.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 +4 -4
- data/.travis.yml +29 -3
- data/Gemfile +4 -3
- data/README.md +5 -4
- data/Rakefile +9 -5
- data/gemfiles/Gemfile-rails.3.2.x +3 -12
- data/gemfiles/Gemfile-rails.4.0.x +3 -3
- data/gemfiles/Gemfile-rails.4.1.x +3 -2
- data/gemfiles/Gemfile-rails.4.2.x +3 -2
- data/gemfiles/Gemfile-rails.5.0.x +9 -0
- data/gemfiles/Gemfile-rails.5.1.x +9 -0
- data/lib/active_decorator/config.rb +3 -17
- data/lib/active_decorator/monkey/action_controller/base/rescue_from.rb +12 -8
- data/lib/active_decorator/view_context.rb +17 -12
- data/lib/generators/rails/decorator_generator.rb +1 -0
- data/lib/generators/rspec/decorator_generator.rb +1 -0
- data/lib/generators/test_unit/decorator_generator.rb +1 -0
- data/lib/lulalala_presenter/railtie.rb +8 -3
- data/lib/lulalala_presenter/version.rb +1 -1
- data/lulalala_presenter.gemspec +1 -0
- data/test/configuration_test.rb +28 -0
- data/test/controllers/fake_detection_test.rb +13 -0
- data/{spec → test}/fake_app/app/views/authors/index.html.erb +2 -2
- data/test/fake_app/app/views/authors/show.html.erb +2 -0
- data/test/fake_app/app/views/authors/show.json.jbuilder +3 -0
- data/test/fake_app/app/views/book_mailer/thanks.text.erb +1 -0
- data/test/fake_app/app/views/books/_book.html.erb +2 -0
- data/test/fake_app/app/views/books/_book.json.jbuilder +3 -0
- data/test/fake_app/app/views/books/_book_locals.html.erb +2 -0
- data/test/fake_app/app/views/books/error.html.erb +1 -0
- data/{spec → test}/fake_app/app/views/books/index.html.erb +1 -1
- data/{spec → test}/fake_app/app/views/books/purchase.html.erb +0 -0
- data/test/fake_app/app/views/books/show.html.erb +4 -0
- data/{spec → test}/fake_app/app/views/movies/show.html.erb +0 -0
- data/{spec → test}/fake_app/fake_app.rb +24 -37
- data/test/features/action_view_helpers_test.rb +37 -0
- data/test/features/controller_ivar_test.rb +40 -0
- data/test/features/jbuilder_test.rb +15 -0
- data/test/features/partial_test.rb +28 -0
- data/test/test_helper.rb +30 -0
- metadata +44 -46
- data/.rspec +0 -2
- data/gemfiles/Gemfile-rails.3.0.x +0 -16
- data/gemfiles/Gemfile-rails.3.1.x +0 -19
- data/lib/active_decorator/helpers.rb +0 -14
- data/spec/configuration_spec.rb +0 -27
- data/spec/controllers/fake_detection_spec.rb +0 -7
- data/spec/fake_app/app/views/authors/show.html.erb +0 -2
- data/spec/fake_app/app/views/authors/show.json.jbuilder +0 -2
- data/spec/fake_app/app/views/book_mailer/thanks.text.erb +0 -1
- data/spec/fake_app/app/views/books/_book.html.erb +0 -2
- data/spec/fake_app/app/views/books/_book.json.jbuilder +0 -2
- data/spec/fake_app/app/views/books/_book_locals.html.erb +0 -2
- data/spec/fake_app/app/views/books/error.html.erb +0 -1
- data/spec/fake_app/app/views/books/show.html.erb +0 -4
- data/spec/features/action_view_helpers_spec.rb +0 -25
- data/spec/features/controller_ivar_spec.rb +0 -37
- data/spec/features/jbuilder_spec.rb +0 -12
- data/spec/features/partial_spec.rb +0 -25
- data/spec/spec_helper.rb +0 -27
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0b5396454f4b88dc51e67b067966e38eaf3a521b
|
|
4
|
+
data.tar.gz: b0539b185e73b8482d825d40d5b691ed33af7b53
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6ba589a63175ef5df3b856190026721afb3cea7b8f101ce37833d43878287ac7d74535aad9440febd760c1efc3f363059c24435d6c779c409692c514d571d76d
|
|
7
|
+
data.tar.gz: e2c4fbdb0d99cb4a634ee593c6f75dd9a88138dd35f800d2cc6d92b025b52790dadb07f929c4577d50d19f6c27f5ce9aa771cf222a7f3fa8ac52cc6f3163b2f6
|
data/.travis.yml
CHANGED
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
language: ruby
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
before_install: gem update bundler --no-document
|
|
4
|
+
script: bundle exec rake test
|
|
4
5
|
|
|
5
6
|
rvm:
|
|
6
7
|
- 2.0.0
|
|
7
|
-
- 2.1
|
|
8
|
-
- 2.2.
|
|
8
|
+
- 2.1.10
|
|
9
|
+
- 2.2.7
|
|
10
|
+
- 2.3.4
|
|
11
|
+
- 2.4.1
|
|
9
12
|
- ruby-head
|
|
10
13
|
gemfile:
|
|
11
14
|
- gemfiles/Gemfile-rails.3.2.x
|
|
12
15
|
- gemfiles/Gemfile-rails.4.0.x
|
|
13
16
|
- gemfiles/Gemfile-rails.4.1.x
|
|
14
17
|
- gemfiles/Gemfile-rails.4.2.x
|
|
18
|
+
- gemfiles/Gemfile-rails.5.0.x
|
|
19
|
+
- gemfiles/Gemfile-rails.5.1.x
|
|
15
20
|
|
|
16
21
|
sudo: false
|
|
17
22
|
|
|
@@ -19,5 +24,26 @@ matrix:
|
|
|
19
24
|
exclude:
|
|
20
25
|
- rvm: ruby-head
|
|
21
26
|
gemfile: gemfiles/Gemfile-rails.3.2.x
|
|
27
|
+
- rvm: ruby-head
|
|
28
|
+
gemfile: gemfiles/Gemfile-rails.4.0.x
|
|
29
|
+
- rvm: ruby-head
|
|
30
|
+
gemfile: gemfiles/Gemfile-rails.4.1.x
|
|
31
|
+
- rvm: 2.4.1
|
|
32
|
+
gemfile: gemfiles/Gemfile-rails.3.2.x
|
|
33
|
+
- rvm: 2.4.1
|
|
34
|
+
gemfile: gemfiles/Gemfile-rails.4.0.x
|
|
35
|
+
- rvm: 2.4.1
|
|
36
|
+
gemfile: gemfiles/Gemfile-rails.4.1.x
|
|
37
|
+
- rvm: 2.4.1
|
|
38
|
+
gemfile: gemfiles/Gemfile-rails.4.2.x
|
|
39
|
+
- rvm: 2.0.0
|
|
40
|
+
gemfile: gemfiles/Gemfile-rails.5.0.x
|
|
41
|
+
- rvm: 2.1.10
|
|
42
|
+
gemfile: gemfiles/Gemfile-rails.5.0.x
|
|
43
|
+
- rvm: 2.0.0
|
|
44
|
+
gemfile: gemfiles/Gemfile-rails.5.1.x
|
|
45
|
+
- rvm: 2.1.10
|
|
46
|
+
gemfile: gemfiles/Gemfile-rails.5.1.x
|
|
22
47
|
allow_failures:
|
|
23
48
|
- rvm: ruby-head
|
|
49
|
+
- gemfile: gemfiles/Gemfile-rails.5.1.x
|
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -13,10 +13,11 @@ and this gem will solve it.
|
|
|
13
13
|
|
|
14
14
|
## Usage ##
|
|
15
15
|
|
|
16
|
-
1. put `gem 'lulalala_presenter'
|
|
17
|
-
2. create a presenter class for each AR model you wish to present. For example, a decorator for a model `User` should be named `UserPresenter`.
|
|
16
|
+
1. put `gem 'lulalala_presenter'` in Gemfile and then `bundle install`.
|
|
17
|
+
2. create a presenter class for each AR model you wish to present. For example, a decorator for a model `User` should be named `UserPresenter`. In your helper methods:
|
|
18
|
+
1. call any ActionView's helper methods using `h`, e.g. `h.content_tag` or `h.link_to`.
|
|
19
|
+
2. call any model methods using `model`, e.g. `model.title`
|
|
18
20
|
3. access this presenter from the model like this: `record.presenter`, and from there call the helper methods.
|
|
19
|
-
2. call any ActionView's helper methods using `h`, e.g. `h.content_tag` or `h.link_to`.
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
## Examples ##
|
|
@@ -28,7 +29,7 @@ class User < ActiveRecord::Base
|
|
|
28
29
|
end
|
|
29
30
|
|
|
30
31
|
# app/presenters/user_presenter.rb
|
|
31
|
-
|
|
32
|
+
class UserPresenter < LulalalaPresenter::Base
|
|
32
33
|
def full_name
|
|
33
34
|
"#{model.first_name} #{model.last_name}"
|
|
34
35
|
end
|
data/Rakefile
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
require 'bundler'
|
|
4
5
|
Bundler::GemHelper.install_tasks
|
|
5
6
|
|
|
6
|
-
require '
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
require 'rake/testtask'
|
|
8
|
+
|
|
9
|
+
Rake::TestTask.new do |t|
|
|
10
|
+
t.libs << "test"
|
|
11
|
+
t.pattern = 'test/**/*_test.rb'
|
|
12
|
+
t.warning = true
|
|
13
|
+
t.verbose = true
|
|
10
14
|
end
|
|
11
15
|
|
|
12
|
-
task :
|
|
16
|
+
task default: :test
|
|
@@ -1,20 +1,11 @@
|
|
|
1
1
|
source 'https://rubygems.org'
|
|
2
2
|
|
|
3
|
-
gem 'active_decorator', :
|
|
3
|
+
gem 'active_decorator', path: '..'
|
|
4
4
|
|
|
5
5
|
gem 'rails', '~> 3.2.0'
|
|
6
|
-
gem '
|
|
7
|
-
if RUBY_VERSION <= '1.8.7'
|
|
8
|
-
gem 'i18n', '~> 0.6.11'
|
|
9
|
-
end
|
|
6
|
+
gem 'test-unit-rails', '1.0.2'
|
|
10
7
|
gem 'capybara', '~> 2.0.0'
|
|
11
|
-
# rubyzip >=1 doesn't support ruby 1.8
|
|
12
|
-
gem 'rubyzip', '< 1.0.0'
|
|
13
8
|
gem 'sqlite3'
|
|
14
9
|
gem 'nokogiri', '~> 1.5.0'
|
|
15
|
-
|
|
16
|
-
gem 'jbuilder', '< 2'
|
|
17
|
-
else
|
|
18
|
-
gem 'jbuilder'
|
|
19
|
-
end
|
|
10
|
+
gem 'jbuilder'
|
|
20
11
|
gem 'test-unit'
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
source 'https://rubygems.org'
|
|
2
2
|
|
|
3
|
-
gem 'active_decorator', :
|
|
3
|
+
gem 'active_decorator', path: '..'
|
|
4
4
|
|
|
5
5
|
gem 'rails', '~> 4.0.0'
|
|
6
|
-
gem '
|
|
6
|
+
gem 'test-unit-rails'
|
|
7
7
|
gem 'capybara'
|
|
8
8
|
gem 'sqlite3'
|
|
9
|
+
gem 'nokogiri', '~> 1.6.0'
|
|
9
10
|
gem 'jbuilder'
|
|
10
|
-
gem 'test-unit'
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
source 'https://rubygems.org'
|
|
2
2
|
|
|
3
|
-
gem 'active_decorator', :
|
|
3
|
+
gem 'active_decorator', path: '..'
|
|
4
4
|
|
|
5
5
|
gem 'rails', '~> 4.1.0'
|
|
6
|
-
gem '
|
|
6
|
+
gem 'test-unit-rails'
|
|
7
7
|
gem 'capybara'
|
|
8
8
|
gem 'sqlite3'
|
|
9
|
+
gem 'nokogiri', '~> 1.6.0'
|
|
9
10
|
gem 'jbuilder'
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
source 'https://rubygems.org'
|
|
2
2
|
|
|
3
|
-
gem 'active_decorator', :
|
|
3
|
+
gem 'active_decorator', path: '..'
|
|
4
4
|
|
|
5
5
|
gem 'rails', '~> 4.2.0'
|
|
6
|
-
gem '
|
|
6
|
+
gem 'test-unit-rails'
|
|
7
7
|
gem 'capybara'
|
|
8
8
|
gem 'sqlite3'
|
|
9
|
+
gem 'nokogiri', '~> 1.6.0'
|
|
9
10
|
gem 'jbuilder'
|
|
@@ -1,20 +1,6 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ActiveDecorator
|
|
2
|
-
|
|
3
|
-
yield @config ||= ActiveDecorator::Configuration.new
|
|
4
|
-
end
|
|
3
|
+
include ActiveSupport::Configurable
|
|
5
4
|
|
|
6
|
-
|
|
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
|
|
5
|
+
config.decorator_suffix = 'Decorator'
|
|
20
6
|
end
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module ActiveDecorator
|
|
3
|
+
module Monkey
|
|
4
|
+
module ActionController
|
|
5
|
+
module Base
|
|
6
|
+
def rescue_with_handler(*)
|
|
7
|
+
ActiveDecorator::ViewContext.push(view_context)
|
|
8
|
+
super
|
|
9
|
+
ensure
|
|
10
|
+
ActiveDecorator::ViewContext.pop
|
|
11
|
+
end
|
|
12
|
+
end
|
|
8
13
|
end
|
|
9
|
-
alias_method_chain :rescue_with_handler, :decorator_view_context
|
|
10
14
|
end
|
|
11
15
|
end
|
|
@@ -1,17 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ActiveDecorator
|
|
2
3
|
module ViewContext
|
|
3
4
|
class << self
|
|
4
5
|
def current
|
|
5
|
-
|
|
6
|
+
view_context_stack.last
|
|
6
7
|
end
|
|
7
8
|
|
|
8
9
|
def push(view_context)
|
|
9
|
-
|
|
10
|
-
Thread.current[:active_decorator_view_contexts] << view_context
|
|
10
|
+
view_context_stack.push view_context
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def pop
|
|
14
|
-
|
|
14
|
+
view_context_stack.pop
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def view_context_stack
|
|
18
|
+
Thread.current[:active_decorator_view_contexts] ||= []
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def run_with(view_context)
|
|
22
|
+
push view_context
|
|
23
|
+
yield
|
|
24
|
+
ensure
|
|
25
|
+
pop
|
|
15
26
|
end
|
|
16
27
|
end
|
|
17
28
|
|
|
@@ -21,20 +32,14 @@ module ActiveDecorator
|
|
|
21
32
|
included do
|
|
22
33
|
if Rails::VERSION::MAJOR >= 4
|
|
23
34
|
around_action do |controller, blk|
|
|
24
|
-
|
|
25
|
-
ActiveDecorator::ViewContext.push controller.view_context
|
|
35
|
+
ActiveDecorator::ViewContext.run_with(controller.view_context) do
|
|
26
36
|
blk.call
|
|
27
|
-
ensure
|
|
28
|
-
ActiveDecorator::ViewContext.pop
|
|
29
37
|
end
|
|
30
38
|
end
|
|
31
39
|
else
|
|
32
40
|
around_filter do |controller, blk|
|
|
33
|
-
|
|
34
|
-
ActiveDecorator::ViewContext.push controller.view_context
|
|
41
|
+
ActiveDecorator::ViewContext.run_with(controller.view_context) do
|
|
35
42
|
blk.call
|
|
36
|
-
ensure
|
|
37
|
-
ActiveDecorator::ViewContext.pop
|
|
38
43
|
end
|
|
39
44
|
end
|
|
40
45
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'active_decorator/view_context'
|
|
2
3
|
require 'lulalala_presenter/active_model_bridge'
|
|
3
4
|
require 'rails'
|
|
@@ -5,16 +6,20 @@ require 'rails'
|
|
|
5
6
|
module LulalalaPresenter
|
|
6
7
|
class Railtie < ::Rails::Railtie
|
|
7
8
|
initializer 'active_decorator' do
|
|
8
|
-
ActiveSupport.on_load
|
|
9
|
+
ActiveSupport.on_load :action_controller do
|
|
9
10
|
require 'active_decorator/monkey/action_controller/base/rescue_from'
|
|
11
|
+
ActionController::Base.send :prepend, ActiveDecorator::Monkey::ActionController::Base
|
|
12
|
+
|
|
10
13
|
ActionController::Base.send :include, ActiveDecorator::ViewContext::Filter
|
|
11
14
|
end
|
|
12
|
-
|
|
15
|
+
|
|
16
|
+
ActiveSupport.on_load :action_mailer do
|
|
13
17
|
if ActionMailer::Base.respond_to? :before_action
|
|
14
18
|
ActionMailer::Base.send :include, ActiveDecorator::ViewContext::Filter
|
|
15
19
|
end
|
|
16
20
|
end
|
|
17
|
-
|
|
21
|
+
|
|
22
|
+
ActiveSupport.on_load :active_record do
|
|
18
23
|
ActiveRecord::Base.send :include, LulalalaPresenter::ActiveModelBridge
|
|
19
24
|
end
|
|
20
25
|
end
|
data/lulalala_presenter.gemspec
CHANGED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
Comic = Struct.new(:title, :price)
|
|
5
|
+
|
|
6
|
+
class ComicPresenter < LulalalaPresenter::Base
|
|
7
|
+
def price
|
|
8
|
+
"$#{super}"
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class ConfigurationTest < Test::Unit::TestCase
|
|
13
|
+
test 'with a custom decorator_suffix' do
|
|
14
|
+
pend
|
|
15
|
+
begin
|
|
16
|
+
ActiveDecorator.configure do |config|
|
|
17
|
+
config.decorator_suffix = 'Presenter'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
comic = Comic.new("amatsuda's (Poignant) Guide to ActiveDecorator", 3)
|
|
21
|
+
assert_equal '$3', comic.presenter.price
|
|
22
|
+
ensure
|
|
23
|
+
LulalalPresenter.configure do |config|
|
|
24
|
+
config.decorator_suffix = 'Presenter'
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
class MoviesControllerTest < ActionController::TestCase
|
|
5
|
+
test 'reveals fakes' do
|
|
6
|
+
movie = Movie.create
|
|
7
|
+
if Rails::VERSION::MAJOR >= 5
|
|
8
|
+
assert_nothing_raised { get :show, params: {id: movie.id} }
|
|
9
|
+
else
|
|
10
|
+
assert_nothing_raised { get :show, id: movie.id }
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
<% @authors.each do |author| %>
|
|
2
2
|
<%= author.name %>
|
|
3
|
-
<%= author.reverse_name %>
|
|
3
|
+
<%= author.presenter.reverse_name %>
|
|
4
4
|
|
|
5
5
|
<% if params[:partial] == 'collection' %>
|
|
6
6
|
<%= render author.books %>
|
|
7
7
|
<% elsif params[:partial] == 'locals' %>
|
|
8
8
|
<% author.books.each do |book| %>
|
|
9
|
-
<%= render :
|
|
9
|
+
<%= render partial: 'books/book_locals', locals: {b: book} %>
|
|
10
10
|
<% end %>
|
|
11
11
|
<% else %>
|
|
12
12
|
<% author.books.each do |book| %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Thank you for purchasing <%= @book.presenter.upcased_title %>.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= @book.presenter.error %>
|
|
File without changes
|
|
File without changes
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'active_record'
|
|
2
3
|
require 'action_controller/railtie'
|
|
3
4
|
require 'action_mailer/railtie'
|
|
@@ -6,12 +7,12 @@ require 'ostruct'
|
|
|
6
7
|
require 'jbuilder'
|
|
7
8
|
|
|
8
9
|
# config
|
|
9
|
-
ActiveRecord::Base.establish_connection(:
|
|
10
|
+
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
|
|
10
11
|
|
|
11
12
|
module ActiveDecoratorTestApp
|
|
12
13
|
class Application < Rails::Application
|
|
13
14
|
config.secret_token = '"confusion" will be my epitaph.'
|
|
14
|
-
config.session_store :cookie_store, :
|
|
15
|
+
config.session_store :cookie_store, key: '_myapp_session'
|
|
15
16
|
config.active_support.deprecation = :log
|
|
16
17
|
config.eager_load = false
|
|
17
18
|
config.action_dispatch.show_exceptions = false
|
|
@@ -24,15 +25,15 @@ ActiveDecoratorTestApp::Application.initialize!
|
|
|
24
25
|
|
|
25
26
|
# routes
|
|
26
27
|
ActiveDecoratorTestApp::Application.routes.draw do
|
|
27
|
-
resources :authors, :
|
|
28
|
-
resources :books, :
|
|
28
|
+
resources :authors, only: [:index, :show] do
|
|
29
|
+
resources :books, only: [:index, :show] do
|
|
29
30
|
member do
|
|
30
31
|
get :error
|
|
31
32
|
post :purchase
|
|
32
33
|
end
|
|
33
34
|
end
|
|
34
35
|
end
|
|
35
|
-
resources :movies, :
|
|
36
|
+
resources :movies, only: :show
|
|
36
37
|
end
|
|
37
38
|
|
|
38
39
|
# models
|
|
@@ -49,30 +50,30 @@ end
|
|
|
49
50
|
module ApplicationHelper; end
|
|
50
51
|
|
|
51
52
|
# decorators
|
|
52
|
-
|
|
53
|
+
class AuthorPresenter < LulalalaPresenter::Base
|
|
53
54
|
def reverse_name
|
|
54
|
-
name.reverse
|
|
55
|
+
model.name.reverse
|
|
55
56
|
end
|
|
56
57
|
|
|
57
58
|
def capitalized_name
|
|
58
|
-
name.capitalize
|
|
59
|
+
model.name.capitalize
|
|
59
60
|
end
|
|
60
61
|
end
|
|
61
|
-
|
|
62
|
+
class BookPresenter < LulalalaPresenter::Base
|
|
62
63
|
def reverse_title
|
|
63
|
-
title.reverse
|
|
64
|
+
model.title.reverse
|
|
64
65
|
end
|
|
65
66
|
|
|
66
67
|
def upcased_title
|
|
67
|
-
title.upcase
|
|
68
|
+
model.title.upcase
|
|
68
69
|
end
|
|
69
70
|
|
|
70
71
|
def link
|
|
71
|
-
link_to title, "#{request.protocol}#{request.host_with_port}/assets/sample.png", :
|
|
72
|
+
h.link_to model.title, "#{h.request.protocol}#{h.request.host_with_port}/assets/sample.png", class: 'title'
|
|
72
73
|
end
|
|
73
74
|
|
|
74
75
|
def cover_image
|
|
75
|
-
image_tag 'cover.png'
|
|
76
|
+
h.image_tag 'cover.png'
|
|
76
77
|
end
|
|
77
78
|
|
|
78
79
|
def error
|
|
@@ -81,7 +82,7 @@ module BookDecorator
|
|
|
81
82
|
end
|
|
82
83
|
|
|
83
84
|
# decorator fake
|
|
84
|
-
class
|
|
85
|
+
class MoviePresenter < LulalalaPresenter::Base; end
|
|
85
86
|
|
|
86
87
|
# controllers
|
|
87
88
|
class ApplicationController < ActionController::Base
|
|
@@ -118,7 +119,7 @@ class BooksController < ApplicationController
|
|
|
118
119
|
class CustomError < StandardError; end
|
|
119
120
|
|
|
120
121
|
rescue_from CustomError do
|
|
121
|
-
render
|
|
122
|
+
render :error
|
|
122
123
|
end
|
|
123
124
|
|
|
124
125
|
def index
|
|
@@ -153,12 +154,12 @@ end
|
|
|
153
154
|
class BookMailer < ActionMailer::Base
|
|
154
155
|
def thanks(book)
|
|
155
156
|
@book = book
|
|
156
|
-
mail :
|
|
157
|
+
mail from: 'nobody@example.com', to: 'test@example.com', subject: 'Thanks'
|
|
157
158
|
end
|
|
158
159
|
end
|
|
159
160
|
|
|
160
161
|
# migrations
|
|
161
|
-
class CreateAllTables < ActiveRecord::Migration
|
|
162
|
+
class CreateAllTables < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
|
|
162
163
|
def self.up
|
|
163
164
|
create_table(:authors) {|t| t.string :name}
|
|
164
165
|
create_table(:books) {|t| t.string :title; t.references :author}
|
|
@@ -167,28 +168,14 @@ class CreateAllTables < ActiveRecord::Migration
|
|
|
167
168
|
end
|
|
168
169
|
|
|
169
170
|
# Proxy for ActiveRecord::Relation
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
attr_accessor :ar_relation
|
|
171
|
+
class RelationProxy < BasicObject
|
|
172
|
+
attr_accessor :ar_relation
|
|
173
173
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
def method_missing(method, *args, &block)
|
|
179
|
-
@ar_relation.public_send(method, *args, &block)
|
|
180
|
-
end
|
|
174
|
+
def initialize(ar_relation)
|
|
175
|
+
@ar_relation = ar_relation
|
|
181
176
|
end
|
|
182
|
-
else
|
|
183
|
-
class RelationProxy < Object
|
|
184
|
-
attr_accessor :ar_relation
|
|
185
177
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
def method_missing(method, *args, &block)
|
|
191
|
-
@ar_relation.send(method, *args, &block)
|
|
192
|
-
end
|
|
178
|
+
def method_missing(method, *args, &block)
|
|
179
|
+
@ar_relation.public_send(method, *args, &block)
|
|
193
180
|
end
|
|
194
181
|
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
class ActionViewHelpersTest < ActionDispatch::IntegrationTest
|
|
5
|
+
setup do
|
|
6
|
+
aamine = Author.create! name: 'aamine'
|
|
7
|
+
@rhg = aamine.books.create! title: 'RHG'
|
|
8
|
+
@rhg_novel = aamine.books.create! title: 'RHG Novel'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
test 'invoking action_view helper methods' do
|
|
12
|
+
visit "/authors/#{@rhg.author.id}/books/#{@rhg.id}"
|
|
13
|
+
within 'a.title' do
|
|
14
|
+
assert page.has_content? 'RHG'
|
|
15
|
+
end
|
|
16
|
+
assert page.has_css?('img')
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
test 'invoking action_view helper methods on model subclass' do
|
|
20
|
+
visit "/authors/#{@rhg_novel.author.id}/books/#{@rhg_novel.id}"
|
|
21
|
+
within 'a.title' do
|
|
22
|
+
assert page.has_content? 'RHG Novel'
|
|
23
|
+
end
|
|
24
|
+
assert page.has_css?('img')
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
test 'invoking action_view helper methods in rescue_from view' do
|
|
28
|
+
visit "/authors/#{@rhg.author.id}/books/#{@rhg.id}/error"
|
|
29
|
+
assert page.has_content?('ERROR')
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
test 'make sure that action_view + action_mailer works' do
|
|
33
|
+
visit "/authors/#{@rhg.author.id}/books/#{@rhg.id}"
|
|
34
|
+
click_link 'purchase'
|
|
35
|
+
assert page.has_content? 'done'
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
class ControllerIvarTest < ActionDispatch::IntegrationTest
|
|
5
|
+
setup do
|
|
6
|
+
@matz = Author.create! name: 'matz'
|
|
7
|
+
@matz.books.create! title: 'the world of code'
|
|
8
|
+
Author.create! name: 'takahashim'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
test 'decorating a model object in ivar' do
|
|
12
|
+
visit "/authors/#{@matz.id}"
|
|
13
|
+
assert page.has_content? 'matz'
|
|
14
|
+
assert page.has_content? 'matz'.capitalize
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
test 'decorating model scope in ivar' do
|
|
18
|
+
visit '/authors'
|
|
19
|
+
assert page.has_content? 'takahashim'
|
|
20
|
+
assert page.has_content? 'takahashim'.reverse
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
test "decorating models' array in ivar" do
|
|
24
|
+
visit '/authors?variable_type=array'
|
|
25
|
+
assert page.has_content? 'takahashim'
|
|
26
|
+
assert page.has_content? 'takahashim'.reverse
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
test "decorating models' proxy object in ivar" do
|
|
30
|
+
visit '/authors?variable_type=proxy'
|
|
31
|
+
assert page.has_content? 'takahashim'
|
|
32
|
+
assert page.has_content? 'takahashim'.reverse
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
test 'decorating model association proxy in ivar' do
|
|
36
|
+
visit "/authors/#{@matz.id}/books"
|
|
37
|
+
assert page.has_content? 'the world of code'
|
|
38
|
+
assert page.has_content? 'the world of code'.reverse
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
class JbuilderTest < ActionDispatch::IntegrationTest
|
|
5
|
+
setup do
|
|
6
|
+
Author.create! name: 'aamine'
|
|
7
|
+
nari = Author.create! name: 'nari'
|
|
8
|
+
nari.books.create! title: 'the gc book'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
test 'decorating objects in Jbuilder partials' do
|
|
12
|
+
visit "/authors/#{Author.last.id}.json"
|
|
13
|
+
assert_equal '{"name":"nari","books":[{"title":"the gc book","reverse_title":"koob cg eht"}]}', page.source
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
class PartialTest < ActionDispatch::IntegrationTest
|
|
5
|
+
setup do
|
|
6
|
+
Author.create! name: 'aamine'
|
|
7
|
+
nari = Author.create! name: 'nari'
|
|
8
|
+
nari.books.create! title: 'the gc book'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
test 'decorating implicit @object' do
|
|
12
|
+
visit '/authors'
|
|
13
|
+
assert page.has_content? 'the gc book'
|
|
14
|
+
assert page.has_content? 'the gc book'.reverse
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
test 'decorating implicit @collection' do
|
|
18
|
+
visit '/authors?partial=collection'
|
|
19
|
+
assert page.has_content? 'the gc book'
|
|
20
|
+
assert page.has_content? 'the gc book'.reverse
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
test 'decorating objects in @locals' do
|
|
24
|
+
visit '/authors?partial=locals'
|
|
25
|
+
assert page.has_content? 'the gc book'
|
|
26
|
+
assert page.has_content? 'the gc book'.upcase
|
|
27
|
+
end
|
|
28
|
+
end
|
data/test/test_helper.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
3
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
4
|
+
# load Rails first
|
|
5
|
+
require 'rails'
|
|
6
|
+
|
|
7
|
+
# load the plugin
|
|
8
|
+
require 'lulalala_presenter'
|
|
9
|
+
|
|
10
|
+
# needs to load the app next
|
|
11
|
+
require 'fake_app/fake_app'
|
|
12
|
+
|
|
13
|
+
require 'test/unit/rails/test_help'
|
|
14
|
+
|
|
15
|
+
class ActionDispatch::IntegrationTest
|
|
16
|
+
include Capybara::DSL
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module DatabaseDeleter
|
|
20
|
+
def setup
|
|
21
|
+
Book.delete_all
|
|
22
|
+
Author.delete_all
|
|
23
|
+
Movie.delete_all
|
|
24
|
+
super
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
Test::Unit::TestCase.send :prepend, DatabaseDeleter
|
|
29
|
+
|
|
30
|
+
CreateAllTables.up unless ActiveRecord::Base.connection.table_exists? 'authors'
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lulalala_presenter
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0
|
|
4
|
+
version: 0.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- lulalala
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2017-11-19 00:00:00.000000000 Z
|
|
13
13
|
dependencies: []
|
|
14
14
|
description: A simple and Rubyish view helper for Rails
|
|
15
15
|
email:
|
|
@@ -20,20 +20,18 @@ extensions: []
|
|
|
20
20
|
extra_rdoc_files: []
|
|
21
21
|
files:
|
|
22
22
|
- ".gitignore"
|
|
23
|
-
- ".rspec"
|
|
24
23
|
- ".travis.yml"
|
|
25
24
|
- Gemfile
|
|
26
25
|
- MIT-LICENSE
|
|
27
26
|
- README.md
|
|
28
27
|
- Rakefile
|
|
29
|
-
- gemfiles/Gemfile-rails.3.0.x
|
|
30
|
-
- gemfiles/Gemfile-rails.3.1.x
|
|
31
28
|
- gemfiles/Gemfile-rails.3.2.x
|
|
32
29
|
- gemfiles/Gemfile-rails.4.0.x
|
|
33
30
|
- gemfiles/Gemfile-rails.4.1.x
|
|
34
31
|
- gemfiles/Gemfile-rails.4.2.x
|
|
32
|
+
- gemfiles/Gemfile-rails.5.0.x
|
|
33
|
+
- gemfiles/Gemfile-rails.5.1.x
|
|
35
34
|
- lib/active_decorator/config.rb
|
|
36
|
-
- lib/active_decorator/helpers.rb
|
|
37
35
|
- lib/active_decorator/monkey/action_controller/base/rescue_from.rb
|
|
38
36
|
- lib/active_decorator/view_context.rb
|
|
39
37
|
- lib/generators/rails/decorator_generator.rb
|
|
@@ -48,26 +46,26 @@ files:
|
|
|
48
46
|
- lib/lulalala_presenter/railtie.rb
|
|
49
47
|
- lib/lulalala_presenter/version.rb
|
|
50
48
|
- lulalala_presenter.gemspec
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
-
|
|
66
|
-
-
|
|
67
|
-
-
|
|
68
|
-
-
|
|
69
|
-
-
|
|
70
|
-
-
|
|
49
|
+
- test/configuration_test.rb
|
|
50
|
+
- test/controllers/fake_detection_test.rb
|
|
51
|
+
- test/fake_app/app/views/authors/index.html.erb
|
|
52
|
+
- test/fake_app/app/views/authors/show.html.erb
|
|
53
|
+
- test/fake_app/app/views/authors/show.json.jbuilder
|
|
54
|
+
- test/fake_app/app/views/book_mailer/thanks.text.erb
|
|
55
|
+
- test/fake_app/app/views/books/_book.html.erb
|
|
56
|
+
- test/fake_app/app/views/books/_book.json.jbuilder
|
|
57
|
+
- test/fake_app/app/views/books/_book_locals.html.erb
|
|
58
|
+
- test/fake_app/app/views/books/error.html.erb
|
|
59
|
+
- test/fake_app/app/views/books/index.html.erb
|
|
60
|
+
- test/fake_app/app/views/books/purchase.html.erb
|
|
61
|
+
- test/fake_app/app/views/books/show.html.erb
|
|
62
|
+
- test/fake_app/app/views/movies/show.html.erb
|
|
63
|
+
- test/fake_app/fake_app.rb
|
|
64
|
+
- test/features/action_view_helpers_test.rb
|
|
65
|
+
- test/features/controller_ivar_test.rb
|
|
66
|
+
- test/features/jbuilder_test.rb
|
|
67
|
+
- test/features/partial_test.rb
|
|
68
|
+
- test/test_helper.rb
|
|
71
69
|
homepage: https://github.com/lulalala/lulalala_presenter
|
|
72
70
|
licenses: []
|
|
73
71
|
metadata: {}
|
|
@@ -92,23 +90,23 @@ signing_key:
|
|
|
92
90
|
specification_version: 4
|
|
93
91
|
summary: A simple and Rubyish view helper for Rails
|
|
94
92
|
test_files:
|
|
95
|
-
-
|
|
96
|
-
-
|
|
97
|
-
-
|
|
98
|
-
-
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
-
|
|
102
|
-
-
|
|
103
|
-
-
|
|
104
|
-
-
|
|
105
|
-
-
|
|
106
|
-
-
|
|
107
|
-
-
|
|
108
|
-
-
|
|
109
|
-
-
|
|
110
|
-
-
|
|
111
|
-
-
|
|
112
|
-
-
|
|
113
|
-
-
|
|
114
|
-
-
|
|
93
|
+
- test/configuration_test.rb
|
|
94
|
+
- test/controllers/fake_detection_test.rb
|
|
95
|
+
- test/fake_app/app/views/authors/index.html.erb
|
|
96
|
+
- test/fake_app/app/views/authors/show.html.erb
|
|
97
|
+
- test/fake_app/app/views/authors/show.json.jbuilder
|
|
98
|
+
- test/fake_app/app/views/book_mailer/thanks.text.erb
|
|
99
|
+
- test/fake_app/app/views/books/_book.html.erb
|
|
100
|
+
- test/fake_app/app/views/books/_book.json.jbuilder
|
|
101
|
+
- test/fake_app/app/views/books/_book_locals.html.erb
|
|
102
|
+
- test/fake_app/app/views/books/error.html.erb
|
|
103
|
+
- test/fake_app/app/views/books/index.html.erb
|
|
104
|
+
- test/fake_app/app/views/books/purchase.html.erb
|
|
105
|
+
- test/fake_app/app/views/books/show.html.erb
|
|
106
|
+
- test/fake_app/app/views/movies/show.html.erb
|
|
107
|
+
- test/fake_app/fake_app.rb
|
|
108
|
+
- test/features/action_view_helpers_test.rb
|
|
109
|
+
- test/features/controller_ivar_test.rb
|
|
110
|
+
- test/features/jbuilder_test.rb
|
|
111
|
+
- test/features/partial_test.rb
|
|
112
|
+
- test/test_helper.rb
|
data/.rspec
DELETED
|
@@ -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
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
module ActiveDecorator
|
|
2
|
-
module Helpers
|
|
3
|
-
def method_missing(method, *args, &block)
|
|
4
|
-
super
|
|
5
|
-
#TODO need to make sure who raised the error?
|
|
6
|
-
rescue NoMethodError, NameError => original_error
|
|
7
|
-
begin
|
|
8
|
-
ActiveDecorator::ViewContext.current.send method, *args, &block
|
|
9
|
-
rescue NoMethodError, NameError
|
|
10
|
-
raise original_error
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
data/spec/configuration_spec.rb
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
Comic = Struct.new(:title, :price)
|
|
2
|
-
|
|
3
|
-
module ComicPresenter
|
|
4
|
-
def price
|
|
5
|
-
"$#{super}"
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
describe ActiveDecorator::Configuration do
|
|
10
|
-
let(:comic) { ActiveDecorator::Decorator.instance.decorate(Comic.new("amatsuda's (Poignant) Guide to ActiveDecorator", 3)) }
|
|
11
|
-
|
|
12
|
-
context 'with a custom decorator_suffix' do
|
|
13
|
-
before do
|
|
14
|
-
ActiveDecorator.configure do |config|
|
|
15
|
-
config.decorator_suffix = 'Presenter'
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
after do
|
|
20
|
-
ActiveDecorator.configure do |config|
|
|
21
|
-
config.decorator_suffix = 'Decorator'
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
specify { comic.price.should == '$3' }
|
|
26
|
-
end
|
|
27
|
-
end
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Thank you for purchasing <%= @book.upcased_title %>.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<%= @book.error %>
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
feature 'fallback to helpers' do
|
|
2
|
-
background do
|
|
3
|
-
aamine = Author.create! :name => 'aamine'
|
|
4
|
-
@rhg = aamine.books.create! :title => 'RHG'
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
scenario 'invoking action_view helper methods' do
|
|
8
|
-
visit "/authors/#{@rhg.author.id}/books/#{@rhg.id}"
|
|
9
|
-
within 'a.title' do
|
|
10
|
-
page.should have_content 'RHG'
|
|
11
|
-
end
|
|
12
|
-
page.should have_css('img')
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
scenario 'invoking action_view helper methods in rescue_from view' do
|
|
16
|
-
visit "/authors/#{@rhg.author.id}/books/#{@rhg.id}/error"
|
|
17
|
-
page.should have_content('ERROR')
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
scenario 'make sure that action_view + action_mailer works' do
|
|
21
|
-
visit "/authors/#{@rhg.author.id}/books/#{@rhg.id}"
|
|
22
|
-
click_link 'purchase'
|
|
23
|
-
page.should have_content 'done'
|
|
24
|
-
end
|
|
25
|
-
end
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
feature 'decorating controller ivar' do
|
|
2
|
-
background do
|
|
3
|
-
@matz = Author.create! :name => 'matz'
|
|
4
|
-
@matz.books.create! :title => 'the world of code'
|
|
5
|
-
Author.create! :name => 'takahashim'
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
scenario 'decorating a model object in ivar' do
|
|
9
|
-
visit "/authors/#{@matz.id}"
|
|
10
|
-
page.should have_content 'matz'
|
|
11
|
-
page.should have_content 'matz'.capitalize
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
scenario 'decorating model scope in ivar' do
|
|
15
|
-
visit '/authors'
|
|
16
|
-
page.should have_content 'takahashim'
|
|
17
|
-
page.should have_content 'takahashim'.reverse
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
scenario "decorating models' array in ivar" do
|
|
21
|
-
visit '/authors?variable_type=array'
|
|
22
|
-
page.should have_content 'takahashim'
|
|
23
|
-
page.should have_content 'takahashim'.reverse
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
scenario "decorating models' proxy object in ivar" do
|
|
27
|
-
visit '/authors?variable_type=proxy'
|
|
28
|
-
page.should have_content 'takahashim'
|
|
29
|
-
page.should have_content 'takahashim'.reverse
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
scenario 'decorating model association proxy in ivar' do
|
|
33
|
-
visit "/authors/#{@matz.id}/books"
|
|
34
|
-
page.should have_content 'the world of code'
|
|
35
|
-
page.should have_content 'the world of code'.reverse
|
|
36
|
-
end
|
|
37
|
-
end
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
feature 'decorating partial object in Jbuilder' do
|
|
2
|
-
background do
|
|
3
|
-
Author.create! :name => 'aamine'
|
|
4
|
-
nari = Author.create! :name => 'nari'
|
|
5
|
-
nari.books.create! :title => 'the gc book'
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
scenario 'decorating objects in Jbuilder partials' do
|
|
9
|
-
visit "/authors/#{Author.last.id}.json"
|
|
10
|
-
page.source.should eq '{"name":"nari","books":[{"title":"the gc book","reverse_title":"koob cg eht"}]}'
|
|
11
|
-
end
|
|
12
|
-
end
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
feature 'decorating partial object' do
|
|
2
|
-
background do
|
|
3
|
-
Author.create! :name => 'aamine'
|
|
4
|
-
nari = Author.create! :name => 'nari'
|
|
5
|
-
nari.books.create! :title => 'the gc book'
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
scenario 'decorating implicit @object' do
|
|
9
|
-
visit '/authors'
|
|
10
|
-
page.should have_content 'the gc book'
|
|
11
|
-
page.should have_content 'the gc book'.reverse
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
scenario 'decorating implicit @collection' do
|
|
15
|
-
visit '/authors?partial=collection'
|
|
16
|
-
page.should have_content 'the gc book'
|
|
17
|
-
page.should have_content 'the gc book'.reverse
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
scenario 'decorating objects in @locals' do
|
|
21
|
-
visit '/authors?partial=locals'
|
|
22
|
-
page.should have_content 'the gc book'
|
|
23
|
-
page.should have_content 'the gc book'.upcase
|
|
24
|
-
end
|
|
25
|
-
end
|
data/spec/spec_helper.rb
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
2
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
3
|
-
# load Rails first
|
|
4
|
-
require 'rails'
|
|
5
|
-
require 'active_decorator'
|
|
6
|
-
# needs to load the app before loading rspec/rails => capybara
|
|
7
|
-
require 'fake_app/fake_app'
|
|
8
|
-
require 'rspec/rails'
|
|
9
|
-
# Requires supporting files with custom matchers and macros, etc,
|
|
10
|
-
# in ./support/ and its subdirectories.
|
|
11
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
|
12
|
-
|
|
13
|
-
RSpec.configure do |config|
|
|
14
|
-
config.expect_with :rspec do |c|
|
|
15
|
-
c.syntax = [:should, :expect]
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
config.before :all do
|
|
19
|
-
CreateAllTables.up unless ActiveRecord::Base.connection.table_exists? 'authors'
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
config.before :each do
|
|
23
|
-
Book.delete_all
|
|
24
|
-
Author.delete_all
|
|
25
|
-
Movie.delete_all
|
|
26
|
-
end
|
|
27
|
-
end
|