pres 0.2.0 → 1.0.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/README.md +43 -18
- data/lib/pres/presenter.rb +11 -15
- data/lib/pres/presents.rb +33 -31
- data/lib/pres/version.rb +1 -1
- data/lib/pres/view_delegation.rb +22 -0
- data/lib/pres.rb +4 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38f3df21d4a8eec7d64db8e94ea4b032811c5af4
|
4
|
+
data.tar.gz: 3bb195b7290f4c41b96ac063e1ed2e49344d61cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed39b6d60be0ac37a431a4b5d0921b6ed7bd11e3ba1d8f95c2e2a157d3d889ac08e60c6d8ca9807f1f1fe2b2e495ebecf20eba07cdfa31fce07bd8210d9dc80c
|
7
|
+
data.tar.gz: d007458b744e863ea1ab9db627236032930121ec89cf3d2686516748d7b0c43932ebbff90c3d14b11913db13a9c4799e4f0bc8eb2486527dc15b6d9e408bab83
|
data/README.md
CHANGED
@@ -20,14 +20,9 @@ Other presenter libraries mix in all the methods from the Rails `ViewContext` to
|
|
20
20
|
make it easy to call those methods in the Presenter class. This causes method
|
21
21
|
bloat. `pres` instead injects the `ViewContext` as a dependency into the
|
22
22
|
Presenter class, and uses `method_missing` to delegate to `ViewContext` methods.
|
23
|
-
So `pres` produces small classes that contain and delegate to an existing object
|
23
|
+
So `pres` produces small classes that contain and delegate to an existing object
|
24
24
|
that handles server-side rendering.
|
25
25
|
|
26
|
-
## Presenter vs. Decorator
|
27
|
-
|
28
|
-
Decorators add methods to a model. `pres` encourages you to whitelist model methods
|
29
|
-
via delegation.
|
30
|
-
|
31
26
|
## Install
|
32
27
|
|
33
28
|
Add it to your Gemfile:
|
@@ -36,11 +31,11 @@ Add it to your Gemfile:
|
|
36
31
|
gem "pres"
|
37
32
|
```
|
38
33
|
|
39
|
-
Include the `Presents` module:
|
34
|
+
Include the `Pres::Presents` module:
|
40
35
|
|
41
36
|
```ruby
|
42
37
|
class ApplicationController
|
43
|
-
include Presents
|
38
|
+
include Pres::Presents
|
44
39
|
end
|
45
40
|
```
|
46
41
|
|
@@ -50,12 +45,14 @@ Add `app/presenters` to your application's autoload paths in `application.rb`:
|
|
50
45
|
config.autoload_paths += %W( #{ config.root }/app/presenters )
|
51
46
|
```
|
52
47
|
|
53
|
-
|
48
|
+
### Usage
|
49
|
+
|
50
|
+
The quickest way to get started is to use the `Pres::Presenter` base class.
|
54
51
|
|
55
52
|
Create a presenter class in `app/presenters`:
|
56
53
|
|
57
54
|
```ruby
|
58
|
-
class DogePresenter < Presenter
|
55
|
+
class DogePresenter < Pres::Presenter
|
59
56
|
# explicitly delegate methods to the model
|
60
57
|
delegate :name, to: :object
|
61
58
|
|
@@ -88,9 +85,9 @@ class DogesController
|
|
88
85
|
end
|
89
86
|
|
90
87
|
private
|
91
|
-
|
88
|
+
|
92
89
|
helper_method :doge
|
93
|
-
|
90
|
+
|
94
91
|
def doge
|
95
92
|
@doge ||= present(Doge.find(params[:id]))
|
96
93
|
end
|
@@ -112,7 +109,7 @@ Use the presenter object in `doges/show.haml.html`
|
|
112
109
|
Create a presenter class in `app/presenters`:
|
113
110
|
|
114
111
|
```ruby
|
115
|
-
class DogePresenter < Presenter
|
112
|
+
class DogePresenter < Pres::Presenter
|
116
113
|
# same as above
|
117
114
|
end
|
118
115
|
```
|
@@ -151,7 +148,7 @@ Or use each:
|
|
151
148
|
|
152
149
|
#### Present with options
|
153
150
|
|
154
|
-
Use keyword
|
151
|
+
Use keyword arguments (or an options hash) to pass additional options to a
|
155
152
|
Presenter:
|
156
153
|
|
157
154
|
```ruby
|
@@ -193,12 +190,12 @@ a presenter in your view code, make the `present` method visible to your views:
|
|
193
190
|
|
194
191
|
```ruby
|
195
192
|
class ApplicationController
|
196
|
-
include Presents
|
193
|
+
include Pres::Presents
|
197
194
|
helper_method :present
|
198
195
|
end
|
199
196
|
```
|
200
197
|
|
201
|
-
|
198
|
+
### More Goodness
|
202
199
|
|
203
200
|
#### Presenters are objects
|
204
201
|
|
@@ -219,7 +216,7 @@ end
|
|
219
216
|
You can override methods without resorting to convoluted method names:
|
220
217
|
|
221
218
|
```ruby
|
222
|
-
class DogePresenter < Presenter
|
219
|
+
class DogePresenter < Pres::Presenter
|
223
220
|
include Shared
|
224
221
|
|
225
222
|
def truncated_name(length: 60)
|
@@ -232,7 +229,7 @@ end
|
|
232
229
|
#### Presenters can create other presenters
|
233
230
|
|
234
231
|
```ruby
|
235
|
-
class DogePresenter < Presenter
|
232
|
+
class DogePresenter < Pres::Presenter
|
236
233
|
def cats
|
237
234
|
present(object.cats)
|
238
235
|
end
|
@@ -243,6 +240,34 @@ end
|
|
243
240
|
= render doge.cats
|
244
241
|
```
|
245
242
|
|
243
|
+
### Using mixins instead of inheritance
|
244
|
+
|
245
|
+
If you don't want to inherit from `Pres::Presenter`, you can include
|
246
|
+
`Pres::ViewDelegation` and implement your own initializer (so the `present` helper
|
247
|
+
will work).
|
248
|
+
|
249
|
+
```ruby
|
250
|
+
class DogePresenter < SimpleDelegator
|
251
|
+
include Pres::ViewDelegation
|
252
|
+
|
253
|
+
# you need to write your own initializer with SimpleDelegator
|
254
|
+
def initialize(object, view_context, options = {})
|
255
|
+
super
|
256
|
+
@view_context = view_context
|
257
|
+
end
|
258
|
+
```
|
259
|
+
|
260
|
+
```haml
|
261
|
+
= doge.name
|
262
|
+
```
|
263
|
+
|
264
|
+
see [SimpleDelegator](http://ruby-doc.org/stdlib-2.3.0/libdoc/delegate/rdoc/SimpleDelegator.html)
|
265
|
+
|
266
|
+
## Updating to version 1.0
|
267
|
+
|
268
|
+
Modules and classes have been moved into the `Pres` namespace with version 1.0.
|
269
|
+
Change your code references to `Pres::Presents` and `Pres::Presenter`.
|
270
|
+
|
246
271
|
## References
|
247
272
|
|
248
273
|
* http://nithinbekal.com/posts/rails-presenters/
|
data/lib/pres/presenter.rb
CHANGED
@@ -1,22 +1,18 @@
|
|
1
1
|
# Base Presenter class
|
2
2
|
# Construct with object, view_context, and optional options
|
3
|
-
|
4
|
-
|
3
|
+
module Pres
|
4
|
+
class Presenter
|
5
|
+
include Presents
|
6
|
+
include ViewDelegation
|
5
7
|
|
6
|
-
|
8
|
+
attr_reader :object, :options
|
7
9
|
|
8
|
-
|
9
|
-
self.object = object
|
10
|
-
self.view_context = view_context
|
11
|
-
self.options = options
|
12
|
-
end
|
13
|
-
|
14
|
-
# Send missing symbols to view_context
|
15
|
-
def method_missing(symbol, *args, &block)
|
16
|
-
view_context.send(symbol, *args, &block)
|
17
|
-
end
|
10
|
+
delegate :id, :to_partial_path, to: :object
|
18
11
|
|
19
|
-
|
20
|
-
|
12
|
+
def initialize(object, view_context = nil, options = {})
|
13
|
+
@object = object
|
14
|
+
@view_context = view_context
|
15
|
+
@options = options
|
16
|
+
end
|
21
17
|
end
|
22
18
|
end
|
data/lib/pres/presents.rb
CHANGED
@@ -1,35 +1,37 @@
|
|
1
|
-
module
|
2
|
-
|
1
|
+
module Pres
|
2
|
+
module Presents
|
3
|
+
private
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
5
|
+
# Wrap an object or collection of objects with a presenter class.
|
6
|
+
#
|
7
|
+
# object - a ruby class, or nil
|
8
|
+
# presenter - a Presenter class (optional)
|
9
|
+
#
|
10
|
+
# Examples
|
11
|
+
#
|
12
|
+
# user = User.new
|
13
|
+
# present(user, cool: true)
|
14
|
+
# => #<UserPresenter object: #<User> ...>
|
15
|
+
#
|
16
|
+
# user = User.new
|
17
|
+
# present(user, presenter: NiceUserPresenter, cool: true)
|
18
|
+
# => #<NiceUserPresenter object: #<User> ...>
|
19
|
+
#
|
20
|
+
# present([user])
|
21
|
+
# => [#<UserPresenter object: #<User> ...>]
|
22
|
+
#
|
23
|
+
# present(nil)
|
24
|
+
# => [#<Presenter object: nil ...>]
|
25
|
+
#
|
26
|
+
# Returns a new Presenter object or array of new Presenter objects
|
27
|
+
def present(object, presenter: nil, **args)
|
28
|
+
if object.respond_to?(:to_ary)
|
29
|
+
object.map { |item| present(item, presenter: presenter, **args) }
|
30
|
+
else
|
31
|
+
presenter ||= Presenter if object.nil?
|
32
|
+
presenter ||= Object.const_get("#{object.class.name}Presenter")
|
33
|
+
presenter.new(object, view_context, **args)
|
34
|
+
end
|
33
35
|
end
|
34
36
|
end
|
35
37
|
end
|
data/lib/pres/version.rb
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Pres
|
2
|
+
module ViewDelegation
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
attr_reader :view_context
|
7
|
+
end
|
8
|
+
|
9
|
+
# Send missing symbols to view_context first
|
10
|
+
def method_missing(symbol, *args, &block)
|
11
|
+
if view_context.respond_to?(symbol, true)
|
12
|
+
view_context.send(symbol, *args, &block)
|
13
|
+
else
|
14
|
+
super
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def respond_to_missing?(symbol, _ = false)
|
19
|
+
view_context.respond_to?(symbol, true) || super
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/pres.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pres
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tee Parham
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-01-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -95,6 +95,7 @@ files:
|
|
95
95
|
- lib/pres/presenter.rb
|
96
96
|
- lib/pres/presents.rb
|
97
97
|
- lib/pres/version.rb
|
98
|
+
- lib/pres/view_delegation.rb
|
98
99
|
homepage: https://github.com/neighborland/pres
|
99
100
|
licenses:
|
100
101
|
- MIT
|