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.
- data/Readme.textile +26 -0
- data/VERSION +1 -0
- data/lib/presentable.rb +30 -0
- data/lib/presenter.rb +42 -0
- data/rails/init.rb +6 -0
- data/test/presenter_test.rb +23 -0
- data/test/presenters/post_presenter.rb +5 -0
- data/test/presenters/post_rss_presenter.rb +3 -0
- data/test/presenters/rss_presenter.rb +5 -0
- data/test/schema.rb +7 -0
- data/test/test_helper.rb +5 -0
- metadata +70 -0
data/Readme.textile
ADDED
|
@@ -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
|
data/lib/presentable.rb
ADDED
|
@@ -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
|
data/lib/presenter.rb
ADDED
|
@@ -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
|
data/rails/init.rb
ADDED
|
@@ -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
|
data/test/schema.rb
ADDED
data/test/test_helper.rb
ADDED
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
|