easy_presenter 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 +7 -0
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +67 -0
- data/Rakefile +1 -0
- data/easy_presenter.gemspec +25 -0
- data/lib/easy_presenter.rb +33 -0
- data/lib/easy_presenter/base.rb +55 -0
- data/lib/easy_presenter/filter.rb +14 -0
- data/lib/easy_presenter/railtie.rb +12 -0
- data/lib/easy_presenter/version.rb +3 -0
- metadata +97 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f55e09c891f829eb8db5291671fcae84347b2701
|
4
|
+
data.tar.gz: 55030a1f38b0ae43c7bf7f7febdfdd834f2bf601
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f934578a6067f482cca8a5e21bbc8325ad0f5fb2134d441692171784e9c0ababce61d16c50f6ca2a131f5a7dac0424527ba6731dceedfbb66db2599bc42051df
|
7
|
+
data.tar.gz: d1af8a7912d2e3279ddedafcbf4b864b91fcffc47f6bd889011ceef281adb4fe6cb0f9bb63bcf14a6d262230b8a00b6f4e8d66b38b78a90a7a352f66c0344cea
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Steven Chung
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# EasyPresenter
|
2
|
+
|
3
|
+
Access view methods from the context of your model.
|
4
|
+
|
5
|
+
## Usage
|
6
|
+
### Easy
|
7
|
+
```
|
8
|
+
gem 'easy_presenter'
|
9
|
+
```
|
10
|
+
|
11
|
+
Given a model `User`
|
12
|
+
```ruby
|
13
|
+
# app/presenters/user_presenter.rb
|
14
|
+
module UserPresenter
|
15
|
+
# Separate view of the model in the presenter, even if it's a `String`. Leave data manipulation in the model.
|
16
|
+
def full_name
|
17
|
+
"#{first_name} #{last_name}"
|
18
|
+
end
|
19
|
+
|
20
|
+
# Quick link to the `User`
|
21
|
+
def link
|
22
|
+
link_to full_name, user_path(self)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Using a module, so you must do this to add class methods
|
26
|
+
module ClassMethods
|
27
|
+
# String of all full names separated by commas
|
28
|
+
def full_names
|
29
|
+
# better to access `User` this way, you may use `User` instead of `self.class` though.
|
30
|
+
self.class.all.map(&:full_name).join(", ")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
Access your presenter methods in a view:
|
37
|
+
```erb
|
38
|
+
<!-- app/views/users/index.html.erb -->
|
39
|
+
<% User.all.each do |user| %>
|
40
|
+
<%= user.link %><br>
|
41
|
+
<% end %>
|
42
|
+
```
|
43
|
+
|
44
|
+
Or a helper:
|
45
|
+
```ruby
|
46
|
+
# app/helpers/users_helper.rb
|
47
|
+
module UsersHelper
|
48
|
+
def full_names_in_div
|
49
|
+
content_tag :div, User.full_names
|
50
|
+
end
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
### Supported ORMs
|
55
|
+
`ActiveRecord`, `Mongoid`, you may add support to an ORM at the bottom of `lib/easy_presenter.rb` and send in a pull request if you wish.
|
56
|
+
|
57
|
+
### Advanced
|
58
|
+
You may use the following modules to add EasyPresenter to other classes.
|
59
|
+
|
60
|
+
* `EasyPresenter::Base` - add access to view methods
|
61
|
+
* `EasyPresenter` - `EasyPresenter::Base` and if `method_missing?`, give access to the `ClassNamePresenter` class
|
62
|
+
|
63
|
+
## Credits
|
64
|
+
Extracted out of [Placemark](https://www.placemarkhq.com/).
|
65
|
+
|
66
|
+
### Contribution
|
67
|
+
Feel free to fork, post issues or send any pull requests. Thanks.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'easy_presenter/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "easy_presenter"
|
8
|
+
spec.version = EasyPresenter::VERSION
|
9
|
+
spec.authors = ["s12chung"]
|
10
|
+
spec.email = ["steve.chung7@gmail.com"]
|
11
|
+
spec.description = "Access view methods in your models."
|
12
|
+
spec.summary = "Access view methods in your models."
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
|
24
|
+
spec.add_dependency 'request_store'
|
25
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "easy_presenter/version"
|
2
|
+
require "easy_presenter/base"
|
3
|
+
require "easy_presenter/railtie"
|
4
|
+
|
5
|
+
module EasyPresenter
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
presenter_class = "#{self}Presenter".safe_constantize
|
10
|
+
if presenter_class
|
11
|
+
include Base
|
12
|
+
presenter_class.extend ActiveSupport::Concern
|
13
|
+
include presenter_class
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# for the Presenter module only
|
18
|
+
class << self
|
19
|
+
def controller
|
20
|
+
RequestStore.store[:presenter_controller]
|
21
|
+
end
|
22
|
+
|
23
|
+
def controller=(presenter_controller)
|
24
|
+
RequestStore.store[:presenter_controller] = presenter_controller
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
if defined?(ActiveRecord::Base)
|
30
|
+
ActiveRecord::Base.send :include, EasyPresenter
|
31
|
+
elsif defined?(Mongoid::Document)
|
32
|
+
Mongoid::Document.send :include, EasyPresenter
|
33
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module EasyPresenter
|
2
|
+
module Base
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
def controller_get(instance_variable)
|
6
|
+
self.class.controller_get instance_variable
|
7
|
+
end
|
8
|
+
|
9
|
+
# See https://github.com/amatsuda/active_decorator/blob/master/lib/active_decorator/helpers.rb
|
10
|
+
def method_missing(name, *args, &block)
|
11
|
+
super
|
12
|
+
rescue NoMethodError, NameError => original_error
|
13
|
+
self.class.try_helper(original_error, name, *args, &block)
|
14
|
+
end
|
15
|
+
|
16
|
+
# for Rails #url_for helpers
|
17
|
+
def url_options
|
18
|
+
controller = EasyPresenter.controller
|
19
|
+
if controller
|
20
|
+
controller.url_options
|
21
|
+
else
|
22
|
+
super
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
module ClassMethods
|
27
|
+
def controller_get(instance_variable)
|
28
|
+
controller.instance_variable_get instance_variable
|
29
|
+
end
|
30
|
+
|
31
|
+
def method_missing(name, *args, &block)
|
32
|
+
super
|
33
|
+
rescue NoMethodError, NameError => original_error
|
34
|
+
try_helper(original_error, name, *args, &block)
|
35
|
+
end
|
36
|
+
|
37
|
+
def try_helper(original_error, name, *args, &block)
|
38
|
+
controller = EasyPresenter.controller
|
39
|
+
if controller
|
40
|
+
begin
|
41
|
+
controller.view_context.send name, *args, &block
|
42
|
+
rescue NoMethodError, NameError => new_error
|
43
|
+
if new_error.name == name && new_error.args == args
|
44
|
+
raise original_error
|
45
|
+
else
|
46
|
+
raise new_error
|
47
|
+
end
|
48
|
+
end
|
49
|
+
else
|
50
|
+
raise original_error
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require "easy_presenter/filter"
|
2
|
+
require "rails"
|
3
|
+
|
4
|
+
module EasyPresenter
|
5
|
+
class Railtie < ::Rails::Railtie
|
6
|
+
initializer 'easy_presenter' do
|
7
|
+
ActiveSupport.on_load(:action_controller) do
|
8
|
+
ActionController::Base.send :include, Filter
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: easy_presenter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- s12chung
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-08-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: request_store
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Access view methods in your models.
|
56
|
+
email:
|
57
|
+
- steve.chung7@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- .gitignore
|
63
|
+
- Gemfile
|
64
|
+
- LICENSE.txt
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- easy_presenter.gemspec
|
68
|
+
- lib/easy_presenter.rb
|
69
|
+
- lib/easy_presenter/base.rb
|
70
|
+
- lib/easy_presenter/filter.rb
|
71
|
+
- lib/easy_presenter/railtie.rb
|
72
|
+
- lib/easy_presenter/version.rb
|
73
|
+
homepage: ''
|
74
|
+
licenses:
|
75
|
+
- MIT
|
76
|
+
metadata: {}
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
requirements: []
|
92
|
+
rubyforge_project:
|
93
|
+
rubygems_version: 2.0.3
|
94
|
+
signing_key:
|
95
|
+
specification_version: 4
|
96
|
+
summary: Access view methods in your models.
|
97
|
+
test_files: []
|