presentable 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,26 @@
1
+ h1. Presentable
2
+
3
+ Making presenters easy and fun!
4
+
5
+ h2. Setup for Rails
6
+
7
+ h3. Update config/environment.rb
8
+
9
+ <pre>config.load_paths += %W( #{RAILS_ROOT}/app/presenters )</pre>
10
+
11
+ h3. Create a presenter class
12
+
13
+ <pre>class PostPresenter < Presenter
14
+ def title
15
+ "#{original_title} - <span class='date'>#{created_at.strftime('%B %d')}</span>" # reference old values by prefixing them with original_
16
+ end
17
+ end</pre>
18
+
19
+ h3. Call present on your instance
20
+
21
+ <pre>@post = Post.find(params[:id]).presenter</pre>
22
+
23
+ h3. Use presenter methods in your view
24
+
25
+ <pre><h2><%= @post.title %></h2>
26
+ <p>@post.body</p></pre>
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,30 @@
1
+ path = File.expand_path(File.dirname(__FILE__))
2
+ $LOAD_PATH << path unless $LOAD_PATH.include?(path)
3
+ require 'presenter'
4
+
5
+ module Presentable
6
+ attr_accessor :presenter_name, :presenter
7
+ def presenter_name
8
+ @presenter_name ||= self.class.to_s + 'Presenter'
9
+ end
10
+
11
+ def presenter(name = nil)
12
+ klass_name = case name
13
+ when NilClass then presenter_name
14
+ when String, Symbol
15
+ klass = name.to_s.gsub(/(?:^|_)(.)/) { $1.upcase }
16
+ klass.gsub!(/$/, 'Presenter') unless klass_name =~ /Presenter$/
17
+ klass
18
+ else
19
+ name.to_s
20
+ end
21
+ @presenter_name = klass_name
22
+ Object.module_eval("::#{klass_name}", __FILE__, __LINE__).new(self)
23
+ end
24
+
25
+ module Collection
26
+ def presenter
27
+ CollectionPresenter.new(self)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,42 @@
1
+ class Presenter
2
+ instance_methods.each do |method|
3
+ undef_method(method) unless method =~ /^__/
4
+ end
5
+
6
+ attr_accessor :context
7
+ def initialize(context)
8
+ @context = context
9
+ end
10
+
11
+ def method_missing(method, *args, &block)
12
+ method = method.to_s.gsub!(/^original_/, '').to_sym if method.to_s =~ /^original_/
13
+ @context.__send__(method, *args, &block)
14
+ end
15
+
16
+ def self.presents_like(*presenters)
17
+ presenters.each do |other_presenter|
18
+ other_presenter.instance_methods.each do |method|
19
+ class_eval %[
20
+ def #{method}(*args, &block)
21
+ (@#{other_presenter.to_s.downcase} ||= #{other_presenter.to_s}.new(context)).__send__(:#{method}, *args, &block)
22
+ end
23
+ ] unless method =~ /^__/ || [:context, :context=, :method_missing].include?(method.to_sym)
24
+ end
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+ class CollectionPresenter
31
+ instance_methods.each do |method|
32
+ undef_method(method) unless method =~ /^__/
33
+ end
34
+
35
+ def initialize(nodes)
36
+ @nodes = nodes.map{ |n| n.presenter }
37
+ end
38
+
39
+ def method_missing(method, *attrs, &block)
40
+ @nodes.__send__(method, *attrs, &block)
41
+ end
42
+ end
@@ -0,0 +1,6 @@
1
+ require 'presentable'
2
+
3
+ ActiveRecord::Base.send(:extend, Presentable) if defined? ActiveRecord
4
+ Presentable.send(:include, ActionView::Helpers) if defined? ActionView
5
+
6
+ Array.send(:extend, Presentable::Collection)
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ class PresenterTest < Test::Unit::TestCase
4
+ def test_presenter
5
+ post = Post.new.presenter
6
+ assert post.is_post_presenter?
7
+ assert post.respond_to?(:is_rss_presenter?) == false
8
+ end
9
+
10
+ def test_presenter_naming
11
+ [:rss, 'rss', RssPresenter].each do |presenter|
12
+ post = Post.new.presenter(presenter)
13
+ assert post.is_rss_presenter?
14
+ assert post.respond_to?(:is_post_presenter?) == false
15
+ end
16
+ post = Post.new.presenter
17
+ assert post.is_post_presenter?
18
+ assert post.respond_to?(:is_rss_presenter?) == false
19
+ post = Post.new.presenter(:post_rss)
20
+ assert post.is_post_presenter?
21
+ assert post.is_rss_presenter?
22
+ end
23
+ end
@@ -0,0 +1,5 @@
1
+ class PostPresenter < Presenter
2
+ def is_post_presenter?
3
+ true
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ class PostRssPresenter < Presenter
2
+ presents_like RssPresenter, PostPresenter
3
+ end
@@ -0,0 +1,5 @@
1
+ class RssPresenter < Presenter
2
+ def is_rss_presenter?
3
+ true
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ require 'presenters/post_presenter'
2
+ require 'presenters/rss_presenter'
3
+ require 'presenters/post_rss_presenter'
4
+
5
+ class Post
6
+ include Presentable
7
+ end
@@ -0,0 +1,5 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
2
+
3
+ require 'test/unit'
4
+ require 'presentable'
5
+ require 'schema'
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: presentable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - toastyapps
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-16 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Making presenters easy and fun!
17
+ email: matt@toastyapps.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - Readme.textile
26
+ - VERSION
27
+ - lib/presentable.rb
28
+ - lib/presenter.rb
29
+ - rails/init.rb
30
+ - test/presenter_test.rb
31
+ - test/presenters/post_presenter.rb
32
+ - test/presenters/post_rss_presenter.rb
33
+ - test/presenters/rss_presenter.rb
34
+ - test/schema.rb
35
+ - test/test_helper.rb
36
+ has_rdoc: true
37
+ homepage: http://github.com/toastyapps/presentable
38
+ licenses: []
39
+
40
+ post_install_message:
41
+ rdoc_options:
42
+ - --charset=UTF-8
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: "0"
50
+ version:
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: "0"
56
+ version:
57
+ requirements: []
58
+
59
+ rubyforge_project:
60
+ rubygems_version: 1.3.5
61
+ signing_key:
62
+ specification_version: 3
63
+ summary: Making presenters easy and fun!
64
+ test_files:
65
+ - test/presenter_test.rb
66
+ - test/presenters/post_presenter.rb
67
+ - test/presenters/post_rss_presenter.rb
68
+ - test/presenters/rss_presenter.rb
69
+ - test/schema.rb
70
+ - test/test_helper.rb