draper 0.7.4 → 0.8.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.
data/.gitignore CHANGED
@@ -5,4 +5,5 @@ Gemfile.lock
5
5
  pkg/*
6
6
  coverage.data
7
7
  coverage/*
8
- .yardoc
8
+ .yardoc
9
+ tmp
data/Gemfile CHANGED
@@ -1,14 +1,13 @@
1
1
  source :rubygems
2
2
 
3
3
  gem 'rake'
4
- gem 'rspec', '~> 2.0.1'
4
+ gem 'rspec', '~> 2.0'
5
5
  gem 'activesupport', '~> 3.0.10'
6
6
  gem 'actionpack', "~> 3.0.10", :require => 'action_view'
7
+ gem 'ammeter', '~> 0.1.3', :require => 'ammeter/init'
7
8
  gem 'guard'
8
9
  gem 'guard-rspec'
9
10
  gem 'launchy'
10
- gem 'rcov', :platforms => [:mri_18]
11
- gem 'cover_me', '>= 1.0.0.rc6', :platforms => [:mri_19]
12
11
  gem 'yard'
13
12
 
14
13
  gemspec
@@ -1,5 +1,7 @@
1
1
  # Draper: View Models for Rails
2
2
 
3
+ ![TravisCI Build Status](https://secure.travis-ci.org/jcasimir/draper.png)
4
+
3
5
  ## Quick Start
4
6
 
5
7
  1. Add `gem 'draper'` to your `Gemfile` and `bundle`
@@ -319,7 +321,6 @@ end
319
321
  * Add YARD documentation to source
320
322
  * Add a section about contributing
321
323
  * Generators
322
- * Test coverage for generators (help!)
323
324
  * Implement hook so generating a controller/scaffold generates a decorator
324
325
  * Add generators for...
325
326
  * `draper:model`: Model + Decorator
@@ -1,8 +1,8 @@
1
1
  require "draper/version"
2
2
  require 'draper/system'
3
- require 'draper/all_helpers'
4
3
  require 'draper/base'
5
4
  require 'draper/lazy_helpers'
6
5
  require 'draper/model_support'
6
+ require 'draper/view_context'
7
7
 
8
8
  Draper::System.setup
@@ -101,7 +101,7 @@ module Draper
101
101
  #
102
102
  # @return [Object] proxy
103
103
  def helpers
104
- @helpers ||= ApplicationController::all_helpers
104
+ Thread.current[:current_view_context]
105
105
  end
106
106
  alias :h :helpers
107
107
 
@@ -1,7 +1,7 @@
1
1
  module Draper
2
2
  class System
3
3
  def self.setup
4
- ActionController::Base.send(:extend, Draper::AllHelpers) if defined?(ActionController::Base)
4
+ ActionController::Base.send(:include, Draper::ViewContext) if defined?(ActionController::Base)
5
5
  end
6
6
  end
7
7
  end
@@ -1,3 +1,3 @@
1
1
  module Draper
2
- VERSION = "0.7.4"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -0,0 +1,11 @@
1
+ module Draper
2
+ module ViewContext
3
+ def set_current_view_context
4
+ Thread.current[:current_view_context] ||= self.view_context
5
+ end
6
+
7
+ def self.included(source)
8
+ source.send(:before_filter, :set_current_view_context)
9
+ end
10
+ end
11
+ end
@@ -2,9 +2,16 @@ require 'spec_helper'
2
2
  require 'draper'
3
3
 
4
4
  describe Draper::Base do
5
+ before(:each){ ApplicationController.new.set_current_view_context }
5
6
  subject{ Draper::Base.new(source) }
6
7
  let(:source){ Product.new }
7
8
 
9
+ context(".helpers") do
10
+ it "should have a valid view_context" do
11
+ subject.helpers.should be
12
+ end
13
+ end
14
+
8
15
  context(".lazy_helpers") do
9
16
  it "makes Rails helpers available without using the h. proxy" do
10
17
  Draper::Base.lazy_helpers
@@ -43,10 +50,9 @@ describe Draper::Base do
43
50
 
44
51
  context("selecting methods") do
45
52
  it "echos the methods of the wrapped class except default exclusions" do
46
- pending "Fine on 1.9 but fails on 1.8 due to differences in implementation of respond_to and method_missing. Help?"
47
53
  source.methods.each do |method|
48
54
  unless Draper::Base::DEFAULT_DENIED.include?(method)
49
- subject.should respond_to(method)
55
+ subject.should respond_to(method.to_sym)
50
56
  end
51
57
  end
52
58
  end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ # Generators are not automatically loaded by Rails
4
+ require 'generators/draper/decorator/decorator_generator'
5
+
6
+ describe Draper::DecoratorGenerator do
7
+ # Tell the generator where to put its output (what it thinks of as Rails.root)
8
+ destination File.expand_path("../../../../../tmp", __FILE__)
9
+
10
+ before { prepare_destination }
11
+
12
+ describe 'no arguments' do
13
+ before { run_generator %w(products) }
14
+
15
+ describe 'app/decorators/application_decorator.rb' do
16
+ subject { file('app/decorators/application_decorator.rb') }
17
+ it { should exist }
18
+ it { should contain "class ApplicationDecorator < Draper::Base" }
19
+ end
20
+
21
+ describe 'app/decorators/products_decorator.rb' do
22
+ subject { file('app/decorators/products_decorator.rb') }
23
+ it { should exist }
24
+ it { should contain "class ProductsDecorator < ApplicationDecorator" }
25
+ end
26
+
27
+ end
28
+ end
@@ -1,10 +1,32 @@
1
- class ApplicationController
1
+ module ActionController
2
+ class Base
3
+ @@before_filters = []
4
+ def self.before_filters
5
+ @@before_filters
6
+ end
7
+ def self.before_filter(name)
8
+ @@before_filters << name
9
+ end
10
+ end
11
+ end
12
+
13
+ class ApplicationController < ActionController::Base
2
14
  extend ActionView::Helpers
3
15
  extend ActionView::Helpers::TagHelper
4
16
  extend ActionView::Helpers::UrlHelper
5
- extend ApplicationHelper
6
-
7
- def self.all_helpers
8
- self
17
+ extend ApplicationHelper
18
+
19
+ def view_context
20
+ @view_context ||= ApplicationController
9
21
  end
10
- end
22
+
23
+ def view_context=(input)
24
+ @view_context = input
25
+ end
26
+
27
+ def self.hello
28
+ "Hello!"
29
+ end
30
+ end
31
+
32
+ Draper::System.setup
@@ -1,8 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
3
  Bundler.require
4
- require 'draper'
5
4
  require './spec/samples/application_helper.rb'
6
5
  Dir.glob(['./spec/samples/*.rb', './spec/support/*.rb']) do |file|
7
6
  require file
8
- end
7
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+ require 'draper'
3
+
4
+ describe Draper::ViewContext do
5
+ let (:app_controller) do
6
+ ApplicationController
7
+ end
8
+
9
+ let (:app_controller_instance) do
10
+ app_controller.new
11
+ end
12
+
13
+ it "implements #set_current_view_context" do
14
+ app_controller_instance.should respond_to(:set_current_view_context)
15
+ end
16
+
17
+ it "calls #before_filter with #set_current_view_context" do
18
+ app_controller.before_filters.should include(:set_current_view_context)
19
+ end
20
+
21
+ it "raises an exception if the view_context is fetched without being set" do
22
+ Thread.current[:current_view_context] = nil
23
+ expect {app_controller.current_view_context}.should raise_exception(Exception)
24
+ end
25
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: draper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.4
4
+ version: 0.8.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-10-03 00:00:00.000000000Z
12
+ date: 2011-10-08 00:00:00.000000000Z
13
13
  dependencies: []
14
14
  description: Draper reimagines the role of helpers in the view layer of a Rails application,
15
15
  allowing an object-oriented approach rather than procedural.
@@ -49,12 +49,12 @@ files:
49
49
  - doc/top-level-namespace.html
50
50
  - draper.gemspec
51
51
  - lib/draper.rb
52
- - lib/draper/all_helpers.rb
53
52
  - lib/draper/base.rb
54
53
  - lib/draper/lazy_helpers.rb
55
54
  - lib/draper/model_support.rb
56
55
  - lib/draper/system.rb
57
56
  - lib/draper/version.rb
57
+ - lib/draper/view_context.rb
58
58
  - lib/generators/draper/decorator/USAGE
59
59
  - lib/generators/draper/decorator/decorator_generator.rb
60
60
  - lib/generators/draper/decorator/templates/application_decorator.rb
@@ -62,6 +62,7 @@ files:
62
62
  - lib/generators/rails/decorator_generator.rb
63
63
  - spec/base_spec.rb
64
64
  - spec/draper/model_support_spec.rb
65
+ - spec/generators/draper/decorator/decorator_generator_spec.rb
65
66
  - spec/samples/active_record.rb
66
67
  - spec/samples/application_controller.rb
67
68
  - spec/samples/application_helper.rb
@@ -71,6 +72,7 @@ files:
71
72
  - spec/samples/product.rb
72
73
  - spec/samples/product_decorator.rb
73
74
  - spec/spec_helper.rb
75
+ - spec/view_context_spec.rb
74
76
  homepage: http://github.com/jcasimir/draper
75
77
  licenses: []
76
78
  post_install_message:
@@ -98,6 +100,7 @@ summary: Decorator pattern implmentation for Rails.
98
100
  test_files:
99
101
  - spec/base_spec.rb
100
102
  - spec/draper/model_support_spec.rb
103
+ - spec/generators/draper/decorator/decorator_generator_spec.rb
101
104
  - spec/samples/active_record.rb
102
105
  - spec/samples/application_controller.rb
103
106
  - spec/samples/application_helper.rb
@@ -107,3 +110,4 @@ test_files:
107
110
  - spec/samples/product.rb
108
111
  - spec/samples/product_decorator.rb
109
112
  - spec/spec_helper.rb
113
+ - spec/view_context_spec.rb
@@ -1,50 +0,0 @@
1
- module Draper
2
- module AllHelpers
3
- # Most of the black magic here thanks to Xavier Shay (@xshay)
4
- # Provide access to helper methods from outside controllers and views,
5
- # such as in Presenter objects. Rails provides ActionController::Base.helpers,
6
- # but this does not include any of our application helpers.
7
- def all_helpers
8
- @all_helpers_proxy ||= begin
9
- # Start with just the rails helpers. This is the same method used
10
- # by ActionController::Base.helpers
11
- # proxy = ActionView::Base.new.extend(_helpers)
12
- proxy = ActionController::Base.helpers
13
-
14
- # url_for depends on _routes method being defined
15
- proxy.instance_eval do
16
- def _routes
17
- Rails.application.routes
18
- end
19
- end
20
-
21
- # Import all named path methods
22
- proxy.extend(Rails.application.routes.named_routes.module)
23
-
24
- # Load all our application helpers to extend
25
- modules_for_helpers([:all]).each do |mod|
26
- proxy.extend(mod)
27
- end
28
-
29
- proxy.instance_eval do
30
- def controller
31
- #Object.controller
32
- end
33
- end
34
-
35
- proxy.instance_eval do
36
- # A hack since this proxy doesn't pick up default_url_options from anywhere
37
- def url_for(*args)
38
- if args.last.is_a?(Hash) && !args.last[:only_path]
39
- args = args.dup
40
- args << args.pop.merge('host' => ActionMailer::Base.default_url_options[:host])
41
- end
42
- super(*args)
43
- end
44
- end
45
-
46
- proxy
47
- end
48
- end
49
- end
50
- end