meta_presenter 0.1.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 +17 -0
- data/.travis.yml +12 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +163 -0
- data/lib/meta_presenter.rb +5 -0
- data/lib/meta_presenter/base.rb +25 -0
- data/lib/meta_presenter/base/delegate_all_to.rb +56 -0
- data/lib/meta_presenter/base/delegate_to_controller.rb +39 -0
- data/lib/meta_presenter/builder.rb +89 -0
- data/lib/meta_presenter/helpers.rb +40 -0
- data/lib/meta_presenter/layout_builder.rb +54 -0
- data/meta_presenter.gemspec +29 -0
- data/spec/meta_presenter_spec.rb +5 -0
- data/spec/spec_helper.rb +6 -0
- data/spec/support/database_cleaner.rb +17 -0
- metadata +179 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 99961e754b5d811535fd5bcb71babe0a659b81c1
|
4
|
+
data.tar.gz: d83a393e92a413e880a74ec65956eac485cb04a5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 79b5e918690bd48e7c96517df3c850007dabcb41116cd05759c2992620d11733ef8634f57ebbe88aea8e892c6b0280c541f37659f454b87bff101432ad9be5ac
|
7
|
+
data.tar.gz: aa182dedc0e876cfcb1095260ff6f50f1a96929100514e177c6dd2160bd6baf5cee7110ccfb1d61fc651a6956c75985916357eeb4311ea61a2aeac4401cc76ca
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2018 szTheory
|
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,163 @@
|
|
1
|
+
[](https://badge.fury.io/rb/meta_presenter) [](https://travis-ci.org/sztheory/meta_presenter) [](https://coveralls.io/github/sztheory/meta_presenter?branch=master) [](http://inch-ci.org/github/sztheory/meta_presenter) [](https://github.com/sztheory/meta_presenter/blob/master/LICENSE.txt) [](https://rubygems.org/gems/meta_presenter) [](https://github.com/sztheory/meta_presenter)
|
2
|
+
|
3
|
+
# MetaPresenter
|
4
|
+
|
5
|
+
MetaPresenter is a Ruby gem that gives you access to the powerful presenter pattern in your Rails controllers. For each controller/action pair you get a presenter class in `app/presenters` that you can use in your views with with `presenter.method_name`. This helps you decompose your helper logic into small, tight, classes that are easily testable. There's even a DSL for method delegation on objects to reduce boilerplate.
|
6
|
+
|
7
|
+
[Github Project Page](https://github.com/szTheory/meta_presenter)
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
gem 'meta_presenter'
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install meta_presenter
|
22
|
+
|
23
|
+
TODO: add an optional task that generates the scaffolding for you. Or, you can manually create the files you want.
|
24
|
+
|
25
|
+
Include MetaPresenter::Helpers in your controller or mailer:
|
26
|
+
|
27
|
+
class ApplicationController < ActionController::Base
|
28
|
+
include MetaPresenter::Helpers
|
29
|
+
end
|
30
|
+
|
31
|
+
class ApplicationMailer < ActionMailer::Base
|
32
|
+
include MetaPresenter::Helpers
|
33
|
+
end
|
34
|
+
|
35
|
+
## Usage Example
|
36
|
+
|
37
|
+
Say you have a PagesController with an action for home and logs. Underneath `app/presenters` you can add a class for each action. In this example we'll also create an application and base presenter we'll inherit from to re-use code in the per-action presenters.
|
38
|
+
|
39
|
+
app/
|
40
|
+
controllers/
|
41
|
+
application_controller.rb
|
42
|
+
pages_controller.rb
|
43
|
+
presenters/
|
44
|
+
application_presenter.rb
|
45
|
+
pages/
|
46
|
+
base_presenter.rb
|
47
|
+
home_presenter.rb
|
48
|
+
logs_presenter.rb
|
49
|
+
|
50
|
+
app/controllers/page_controller.rb
|
51
|
+
|
52
|
+
class ApplicationController < ActionController::Base
|
53
|
+
# Controller methods automatically become available in views and other presenters.
|
54
|
+
# So this gives you presenter.current_user in views, and you can call `current_user`
|
55
|
+
# within your presenters as well
|
56
|
+
def current_user
|
57
|
+
User.first
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
app/controllers/dashboard_controller.rb
|
62
|
+
|
63
|
+
class ApplicationController < ActionController::Base
|
64
|
+
def home
|
65
|
+
end
|
66
|
+
|
67
|
+
def logs
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
# presenter.logs in views
|
72
|
+
def logs
|
73
|
+
Log.all
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
app/presenters/application_presenter.rb
|
78
|
+
|
79
|
+
class ApplicationPresenter < MetaPresenter::BasePresenter
|
80
|
+
# Makes presenter.page_title available in all of your app's views
|
81
|
+
def page_title
|
82
|
+
"My App"
|
83
|
+
end
|
84
|
+
|
85
|
+
# presenter.last_login_at in views
|
86
|
+
def last_login_at
|
87
|
+
# controller methods from within the same scope
|
88
|
+
# as the presenter are directly available
|
89
|
+
current_user.last_login_at
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
app/presenters/pages/base_presenter.rb:
|
94
|
+
|
95
|
+
class Pages::BasePresenter < ApplicationPresenter
|
96
|
+
# Makes presenter.nav_items available for
|
97
|
+
# all actions on PagesController
|
98
|
+
def nav_items
|
99
|
+
[
|
100
|
+
{name: "Home", path: home_path},
|
101
|
+
{name: "Logs", path: logs_path}
|
102
|
+
]
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
app/presenters/pages/home_presenter.rb
|
107
|
+
|
108
|
+
class Pages::HomePresenter << Pages::BasePresenter
|
109
|
+
# presenter.email, presenter.id
|
110
|
+
# or any other method not already defined
|
111
|
+
# will delegate to the current_user
|
112
|
+
delegate_all_to :current_user
|
113
|
+
|
114
|
+
# presenter.greeting in views
|
115
|
+
def greeting
|
116
|
+
"Hello, #{current_user.name}"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
app/presenters/pages/logs_presenter.rb
|
121
|
+
|
122
|
+
class Pages::LogsPresenter << Pages::BasePresenter
|
123
|
+
# presenter.size and presenter.last will delegate to
|
124
|
+
# the controller's private #logs method
|
125
|
+
delegate :size, :last, to: :logs
|
126
|
+
|
127
|
+
# presenter.log_text(log) in view
|
128
|
+
# for example in a haml view:
|
129
|
+
#
|
130
|
+
# - presenter.logs.each do |log|
|
131
|
+
# = presenter.log_text(log)
|
132
|
+
#
|
133
|
+
def log_text(log)
|
134
|
+
log.description
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
TODO: add more documentation around layout presenters
|
139
|
+
|
140
|
+
## Aliasing the presenter methods
|
141
|
+
|
142
|
+
If you want to customize the `presenter` and `layout_presenter` methods you can specify a shorthand by adding an alias_method to your controller or mailer:
|
143
|
+
|
144
|
+
class ApplicationController < ActionController::Base
|
145
|
+
including MetaPresenter
|
146
|
+
|
147
|
+
# So convenient!
|
148
|
+
alias_method :presenter, :p
|
149
|
+
alias_method :presenter, :lp
|
150
|
+
end
|
151
|
+
|
152
|
+
## Contributing
|
153
|
+
|
154
|
+
1. Fork it
|
155
|
+
2. Create your feature branch (`git checkout -b feature/my-new-feature`) or bugfix branch (`git checkout -b bugfix/my-helpful-bugfix`)
|
156
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
157
|
+
4. Push to the branch (`git push origin feature/my-new-feature`)
|
158
|
+
5. Make sure specs are passing (`bundle exec rspec`)
|
159
|
+
6. Create new Pull Request
|
160
|
+
|
161
|
+
## License
|
162
|
+
|
163
|
+
See the [LICENSE](https://github.com/szTheory/meta_presenter/blob/master/LICENSE.txt) file.
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'base/delegate_all_to.rb'
|
2
|
+
require_relative 'base/delegate_to_controller.rb'
|
3
|
+
|
4
|
+
# Base presenter class. Inherit from this it in order
|
5
|
+
# to get a presenter you can use in your views
|
6
|
+
#
|
7
|
+
# # app/presenters/application_presenter.rb
|
8
|
+
# class ApplicationPresenter < MetaPresenter::Base
|
9
|
+
# def message
|
10
|
+
# "Hello"
|
11
|
+
# end
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
module MetaPresenter
|
15
|
+
class Base
|
16
|
+
include DelegateToController
|
17
|
+
# Comes last so `delegate_all_to` takes priority
|
18
|
+
# over default controller actions
|
19
|
+
include DelegateAllTo
|
20
|
+
|
21
|
+
def inspect
|
22
|
+
"#<#{self.class.name}>"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module MetaPresenter
|
4
|
+
class Base
|
5
|
+
module DelegateAllTo
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
included do
|
8
|
+
class_attribute :delegate_all_to
|
9
|
+
attr_accessor :delegating
|
10
|
+
include InstanceMethods
|
11
|
+
end
|
12
|
+
|
13
|
+
module InstanceMethods
|
14
|
+
def respond_to_missing?(*args)
|
15
|
+
method_name = args.first
|
16
|
+
delegate_all_responds_to?(method_name) || super
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def delegate_all_responds_to?(method_name)
|
21
|
+
delegate_all_to? && delegate_all_to.respond_to?(method_name)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Use metaprogramming to delegate all methods
|
25
|
+
def method_missing(method_name, *args, &block)
|
26
|
+
# If `delegate_all_to` has been set up for the method name
|
27
|
+
# then delegate to it, otherwise pass it up the food chain
|
28
|
+
if !delegating_all_to? && delegate_all_responds_to?(method_name)
|
29
|
+
delegate_all_to.send(method_name, *args, &block)
|
30
|
+
else
|
31
|
+
super
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def delegate_all_to
|
36
|
+
# Temporarily set a flag that we are delegating
|
37
|
+
# to an underlying method. this allows us
|
38
|
+
# to chain additional methods calls onto the end
|
39
|
+
delegating = true
|
40
|
+
send(self.class.delegate_all_to)
|
41
|
+
ensure
|
42
|
+
# Cleanup the flag afterwards to close the door behind us
|
43
|
+
delegating = false
|
44
|
+
end
|
45
|
+
|
46
|
+
def delegating_all_to?
|
47
|
+
delegating == true
|
48
|
+
end
|
49
|
+
|
50
|
+
def delegate_all_to?
|
51
|
+
self.class.delegate_all_to.present?
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module MetaPresenter
|
4
|
+
class Base
|
5
|
+
module DelegateToController
|
6
|
+
INCLUDE_PRIVATE_METHODS = true
|
7
|
+
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
included do
|
10
|
+
attr_reader :controller
|
11
|
+
include InstanceMethods
|
12
|
+
end
|
13
|
+
|
14
|
+
module InstanceMethods
|
15
|
+
def initialize(controller)
|
16
|
+
@controller = controller
|
17
|
+
end
|
18
|
+
|
19
|
+
def respond_to_missing?(*args)
|
20
|
+
method_name = args.first
|
21
|
+
delegates_controller_method? || super
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def delegates_controller_method?(method_name)
|
26
|
+
controller.respond_to?(method_name, INCLUDE_PRIVATE_METHODS)
|
27
|
+
end
|
28
|
+
|
29
|
+
def method_missing(method_name, *args, &block)
|
30
|
+
if delegates_controller_method?(method_name)
|
31
|
+
controller.send(method_name, *args, &block)
|
32
|
+
else
|
33
|
+
super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module MetaPresenter
|
2
|
+
class Builder
|
3
|
+
attr_reader :controller, :action_name
|
4
|
+
def initialize(controller, action_name)
|
5
|
+
@controller = controller
|
6
|
+
@action_name = action_name
|
7
|
+
end
|
8
|
+
|
9
|
+
def presenter_class
|
10
|
+
# Try to find the class (it's not guaranteed)
|
11
|
+
klass_name = ancestors.find do |klass_name|
|
12
|
+
presenter_class_for(klass_name)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Return the actual class
|
16
|
+
presenter_class_for(klass_name)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def all_ancestors
|
21
|
+
controller.class.ancestors
|
22
|
+
end
|
23
|
+
|
24
|
+
def mailer_ancestors
|
25
|
+
ancestors_until(ApplicationMailer) do |klass|
|
26
|
+
"Mailers::#{klass.name.gsub('Mailer', '')}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def controller_ancestors
|
31
|
+
ancestors_until(ApplicationController) do |klass|
|
32
|
+
klass.try(:name).try(:gsub, 'Controller', '')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def presenter_class_for(klass_name)
|
37
|
+
presenter_class_name = "::#{klass_name}Presenter"
|
38
|
+
begin
|
39
|
+
presenter_class_name.constantize
|
40
|
+
|
41
|
+
# No corresponding presenter class was found
|
42
|
+
rescue NameError => e
|
43
|
+
filename = "#{presenter_class_name.underscore}.rb"
|
44
|
+
presenter_file_path = File.join(Rails.root, "app", "presenters", filename)
|
45
|
+
if File.exists?(presenter_file_path)
|
46
|
+
# If the file exists, but the class isn't defined then something
|
47
|
+
# has gone wrong that the dev really should know about!
|
48
|
+
raise e
|
49
|
+
else
|
50
|
+
false
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def ancestors
|
56
|
+
all_ancestors.yield_self do |list|
|
57
|
+
# Different ancestors depending on whether
|
58
|
+
# we're dealing with a mailer or a controller
|
59
|
+
if list.include?(ActionMailer::Base)
|
60
|
+
mailer_ancestors
|
61
|
+
else
|
62
|
+
controller_ancestors
|
63
|
+
end
|
64
|
+
end.yield_self do |list|
|
65
|
+
# add a presenter class for our current action
|
66
|
+
# to the front of the list
|
67
|
+
presenter_class_name_for_current_action = "#{list.first}::#{action_name.camelcase}"
|
68
|
+
list.unshift(presenter_class_name_for_current_action)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# The list of ancestors is very long.
|
73
|
+
# Trim it down to just the length of the class we are looking for.
|
74
|
+
#
|
75
|
+
# Takes an optional block method to transform the result
|
76
|
+
# with a map operation
|
77
|
+
def ancestors_until(until_class)
|
78
|
+
# trim down the list
|
79
|
+
ancestors_list = all_ancestors[0..all_ancestors.index(until_class)]
|
80
|
+
|
81
|
+
# map to the fully qualified class name
|
82
|
+
if block_given?
|
83
|
+
ancestors_list.map { |klass| yield(klass) }
|
84
|
+
else
|
85
|
+
ancestors_list
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'meta_presenter/builder'
|
2
|
+
require 'meta_presenter/layout_builder'
|
3
|
+
require 'active_support/concern'
|
4
|
+
|
5
|
+
module MetaPresenter
|
6
|
+
module Helpers
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
included do
|
9
|
+
# Sets up the `presenter.` method as helper within your views
|
10
|
+
# If you want to customize this for yourslef just alias_method it
|
11
|
+
helper_method :presenter
|
12
|
+
|
13
|
+
# Sets up the `layout_presenter.` method as helper within your views
|
14
|
+
# If you want to customize this for yourslef just alias_method it
|
15
|
+
helper_method :layout_presenter
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
# Initialize presenter with the current controller
|
20
|
+
def presenter
|
21
|
+
@presenter ||= begin
|
22
|
+
yield_self do |controller|
|
23
|
+
klass = MetaPresenter::Builder.new(controller, action_name).presenter_class
|
24
|
+
klass.new(controller)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Initialize presenter with the current controller
|
30
|
+
def layout_presenter
|
31
|
+
@layout_presenters ||= {}
|
32
|
+
@layout_presenters[current_layout] ||= begin
|
33
|
+
yield_self do |controller|
|
34
|
+
klass = MetaPresenter::LayoutBuilder.new(current_layout, layouts).layout_presenter_class
|
35
|
+
klass.new(controller)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module MetaPresenter
|
2
|
+
class LayoutBuilder
|
3
|
+
class NoLayoutImplemented < NotImplementedError
|
4
|
+
def initialize(current_layout, layouts)
|
5
|
+
super("No layout presenter definition found for #{current_layout} among #{layouts}")
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader :layouts, :current_layout
|
10
|
+
def initialize(layouts, current_layout)
|
11
|
+
@layouts = layouts
|
12
|
+
@current_layout = current_layout
|
13
|
+
end
|
14
|
+
|
15
|
+
def layout_presenter_class
|
16
|
+
return nil if layout_index.nil?
|
17
|
+
|
18
|
+
layout_classes(layout_index).find do |klass_name|
|
19
|
+
layout_presenter_class_for(klass_name)
|
20
|
+
end.tap do |klass|
|
21
|
+
if klass.blank?
|
22
|
+
raise NoLayoutImplemented.new(current_layout, layouts)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
def layout_presenter_class_for(klass_name)
|
29
|
+
layout_presenter_class_name = "Layouts::#{klass_name.camelcase}Presenter"
|
30
|
+
begin
|
31
|
+
layout_presenter_class_name.constantize
|
32
|
+
|
33
|
+
# No corresponding presenter class was found
|
34
|
+
rescue NameError => e
|
35
|
+
layout_presenter_file_path = Rails.root.join("app", "presenters", "layouts", "#{layout_presenter_class_name.underscore}.rb")
|
36
|
+
if File.exists?(layout_presenter_file_path)
|
37
|
+
# If the file exists, but the class isn't defined then something
|
38
|
+
# has gone wrong that the dev really should know about!
|
39
|
+
raise e
|
40
|
+
else
|
41
|
+
false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def layout_index
|
47
|
+
layouts.index(current_layout)
|
48
|
+
end
|
49
|
+
|
50
|
+
def layout_classes
|
51
|
+
layouts[0..layout_index].reverse
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = 'meta_presenter'
|
5
|
+
spec.version = '0.1.0'
|
6
|
+
spec.authors = ['szTheory']
|
7
|
+
spec.description = %q{Presenter pattern in your Rails controllers and actions}
|
8
|
+
spec.summary = %q{MetaPresenter is a Ruby gem that gives you access to the powerful presenter pattern in your Rails controllers. For each controller/action pair you get a presenter class in `app/presenters` that you can use in your views with with `presenter.method_name`. This helps you decompose your helper logic into small, tight, classes that are easily testable. There's even a DSL for method delegation on objects to reduce boilerplate.}
|
9
|
+
spec.homepage = 'https://github.com/szTheory/meta_presenter'
|
10
|
+
spec.license = 'MIT'
|
11
|
+
spec.metadata = {
|
12
|
+
"source_code_uri" => "https://github.com/szTheory/meta_presenter",
|
13
|
+
}
|
14
|
+
|
15
|
+
spec.files = `git ls-files`.split($/)
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ['lib']
|
19
|
+
|
20
|
+
spec.add_runtime_dependency 'actionpack', '>= 3.0'
|
21
|
+
spec.add_runtime_dependency 'actionmailer', '>= 3.0'
|
22
|
+
|
23
|
+
spec.add_development_dependency 'rspec'
|
24
|
+
spec.add_development_dependency 'database_cleaner'
|
25
|
+
spec.add_development_dependency 'bundler'
|
26
|
+
spec.add_development_dependency 'rake'
|
27
|
+
spec.add_development_dependency 'pry'
|
28
|
+
spec.add_development_dependency 'coveralls'
|
29
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
RSpec.configure do |config|
|
2
|
+
config.before(:suite) do
|
3
|
+
DatabaseCleaner.clean_with(:truncation)
|
4
|
+
end
|
5
|
+
|
6
|
+
config.before(:each) do
|
7
|
+
DatabaseCleaner.strategy = :transaction
|
8
|
+
end
|
9
|
+
|
10
|
+
config.before(:each) do
|
11
|
+
DatabaseCleaner.start
|
12
|
+
end
|
13
|
+
|
14
|
+
config.after(:each) do
|
15
|
+
DatabaseCleaner.clean
|
16
|
+
end
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,179 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: meta_presenter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- szTheory
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-11-23 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: actionpack
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: actionmailer
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: database_cleaner
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: coveralls
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
description: Presenter pattern in your Rails controllers and actions
|
126
|
+
email:
|
127
|
+
executables: []
|
128
|
+
extensions: []
|
129
|
+
extra_rdoc_files: []
|
130
|
+
files:
|
131
|
+
- ".gitignore"
|
132
|
+
- ".travis.yml"
|
133
|
+
- Gemfile
|
134
|
+
- LICENSE.txt
|
135
|
+
- README.md
|
136
|
+
- lib/meta_presenter.rb
|
137
|
+
- lib/meta_presenter/base.rb
|
138
|
+
- lib/meta_presenter/base/delegate_all_to.rb
|
139
|
+
- lib/meta_presenter/base/delegate_to_controller.rb
|
140
|
+
- lib/meta_presenter/builder.rb
|
141
|
+
- lib/meta_presenter/helpers.rb
|
142
|
+
- lib/meta_presenter/layout_builder.rb
|
143
|
+
- meta_presenter.gemspec
|
144
|
+
- spec/meta_presenter_spec.rb
|
145
|
+
- spec/spec_helper.rb
|
146
|
+
- spec/support/database_cleaner.rb
|
147
|
+
homepage: https://github.com/szTheory/meta_presenter
|
148
|
+
licenses:
|
149
|
+
- MIT
|
150
|
+
metadata:
|
151
|
+
source_code_uri: https://github.com/szTheory/meta_presenter
|
152
|
+
post_install_message:
|
153
|
+
rdoc_options: []
|
154
|
+
require_paths:
|
155
|
+
- lib
|
156
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - ">="
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
requirements: []
|
167
|
+
rubyforge_project:
|
168
|
+
rubygems_version: 2.6.11
|
169
|
+
signing_key:
|
170
|
+
specification_version: 4
|
171
|
+
summary: MetaPresenter is a Ruby gem that gives you access to the powerful presenter
|
172
|
+
pattern in your Rails controllers. For each controller/action pair you get a presenter
|
173
|
+
class in `app/presenters` that you can use in your views with with `presenter.method_name`.
|
174
|
+
This helps you decompose your helper logic into small, tight, classes that are easily
|
175
|
+
testable. There's even a DSL for method delegation on objects to reduce boilerplate.
|
176
|
+
test_files:
|
177
|
+
- spec/meta_presenter_spec.rb
|
178
|
+
- spec/spec_helper.rb
|
179
|
+
- spec/support/database_cleaner.rb
|