presentable 0.0.1

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.
@@ -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