controller_setter_pattern 0.1.0 → 0.1.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.travis.yml +9 -0
- data/Gemfile +3 -1
- data/README.md +11 -3
- data/coverage/.gitignore +2 -0
- data/lib/controller_setter_pattern/action_controller.rb +50 -46
- data/lib/controller_setter_pattern/version.rb +1 -1
- data/log/.gitignore +2 -0
- data/spec/controller_setter_pattern_spec.rb +5 -2
- data/spec/factories.rb +8 -0
- data/spec/spec_helper.rb +14 -1
- data/spec/support/controllers.rb +5 -0
- data/spec/support/models.rb +2 -0
- data/spec/support/routes.rb +1 -0
- data/spec/support/schema.rb +1 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 56f77be87b831737dd8d2dde96ac059a77c224b2
|
4
|
+
data.tar.gz: cded750410e8995f62f6885c12d086dd1036800f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eccec7b8481594659362b55b4cf91ee1778d998bb88334041d366bdab9e2e753d9637ea4c58b0fe74677fb17d9c91025b74e3da519a7d57789916484179133d1
|
7
|
+
data.tar.gz: adfa269ee3f7bde2a8bdd351cd26cb0393a390abfc3e833a2e4312a37e322834e3a50ebb787c5eb64d64b130a918de7c70f05153a50baa6d2c27b74490a9b749
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,11 @@
|
|
1
1
|
# controller_setter_pattern
|
2
|
+
|
3
|
+
[](https://travis-ci.org/Casara/controller_setter_pattern)
|
4
|
+
[](https://codeclimate.com/github/Casara/controller_setter_pattern)
|
5
|
+
[](https://codeclimate.com/github/Casara/controller_setter_pattern/coverage)
|
6
|
+
[](http://badge.fury.io/rb/controller_setter_pattern)
|
7
|
+
[](https://gemnasium.com/Casara/controller_setter_pattern)
|
8
|
+
|
2
9
|
Pattern for assign instance variables in controllers for use in views, etc.
|
3
10
|
|
4
11
|
## Instalation
|
@@ -43,7 +50,7 @@ class ArticlesController < ApplicationController
|
|
43
50
|
render :new
|
44
51
|
end
|
45
52
|
end
|
46
|
-
|
53
|
+
|
47
54
|
# PATCH/PUT /articles/:id
|
48
55
|
def update
|
49
56
|
if @article.update(article_params)
|
@@ -52,7 +59,7 @@ class ArticlesController < ApplicationController
|
|
52
59
|
render :edit
|
53
60
|
end
|
54
61
|
end
|
55
|
-
|
62
|
+
|
56
63
|
# DELETE /articles/:id
|
57
64
|
def destroy
|
58
65
|
@article.destroy
|
@@ -162,6 +169,7 @@ set :ebook, model: Book
|
|
162
169
|
```
|
163
170
|
|
164
171
|
**Specify the parameters key to use to fetch the object:**
|
172
|
+
|
165
173
|
```ruby
|
166
174
|
set :ebook, model: Book, finder_params: :isbn
|
167
175
|
# @ebook = Book.find_by_isbn(params[:isbn])
|
@@ -175,4 +183,4 @@ set :ebook, model: Book, finder_params: [:author, :title]
|
|
175
183
|
```ruby
|
176
184
|
set :user, scope: :active, finder_params: :email
|
177
185
|
# @user = User.active.find_by_email(params[:email])
|
178
|
-
```
|
186
|
+
```
|
data/coverage/.gitignore
ADDED
@@ -4,64 +4,68 @@ module ControllerSetterPattern
|
|
4
4
|
|
5
5
|
module ClassMethods
|
6
6
|
def set(*names)
|
7
|
-
|
7
|
+
callback_options = names.extract_options!
|
8
8
|
|
9
|
-
model =
|
10
|
-
model
|
9
|
+
(options ||= {})[:model] = callback_options.delete(:model)
|
10
|
+
options[:model] ||= options[:model].to_s.camelize.constantize unless options[:model].nil?
|
11
11
|
|
12
|
-
finder_params =
|
13
|
-
finder_method = 'find' + (finder_params.empty? ? '' : '_by_' + finder_params.join('_and_'))
|
12
|
+
options[:finder_params] = _normalize_finder_params(callback_options.delete(:finder_params) || [])
|
13
|
+
options[:finder_method] = 'find' + (options[:finder_params].empty? ? '' : '_by_' + options[:finder_params].join('_and_'))
|
14
14
|
|
15
|
-
ancestor =
|
16
|
-
scope =
|
15
|
+
options[:ancestor] = callback_options.delete(:ancestor)
|
16
|
+
options[:scope] = callback_options.delete(:scope)
|
17
17
|
|
18
|
-
names
|
19
|
-
before_action options do |controller|
|
20
|
-
if !ancestor.nil?
|
21
|
-
if controller.instance_variable_defined?("@#{ancestor}")
|
22
|
-
resource = controller.instance_variable_get("@#{ancestor}")
|
23
|
-
model_class = resource.class
|
24
|
-
else
|
25
|
-
model_class = ancestor.to_s.camelize.constantize
|
26
|
-
resource = model_class.find(params["#{model_class.name.underscore}_id".to_sym])
|
27
|
-
end
|
28
|
-
reflection_name = (model || variable).to_s.underscore.pluralize.to_sym
|
29
|
-
resource = resource.send(reflection_name) if resource.respond_to?(reflection_name)
|
30
|
-
elsif !model.nil? && model.descends_from_active_record?
|
31
|
-
model_class = model
|
32
|
-
elsif
|
33
|
-
model_class = variable.to_s.camelize.constantize
|
34
|
-
end
|
35
|
-
|
36
|
-
resource ||= model_class
|
37
|
-
|
38
|
-
unless scope.nil?
|
39
|
-
scope = [scope] unless scope.is_a?(Array)
|
40
|
-
scope.each { |s| resource = resource.send(s) }
|
41
|
-
end
|
42
|
-
|
43
|
-
if finder_params.empty?
|
44
|
-
values_for_find = controller.params["#{variable}_id".to_sym] || controller.params[:id]
|
45
|
-
else
|
46
|
-
defaults = finder_params.inject({}) { |h, v| h.merge(v.to_s => nil) }
|
47
|
-
values_for_find = defaults.merge(controller.params.permit(finder_params)).values
|
48
|
-
end
|
49
|
-
|
50
|
-
resource = resource.send(finder_method, *values_for_find)
|
51
|
-
|
52
|
-
var_name = "@#{variable}".to_sym
|
53
|
-
controller.instance_variable_set(var_name, resource)
|
54
|
-
end
|
55
|
-
end
|
18
|
+
_insert_setters(names, options, callback_options)
|
56
19
|
end
|
57
20
|
|
58
21
|
private
|
59
|
-
def
|
22
|
+
def _normalize_finder_params(finder_params)
|
60
23
|
finder_params = [finder_params] unless finder_params.is_a?(Array)
|
61
24
|
finder_params = finder_params.compact.uniq
|
62
25
|
finder_params.clear if finder_params.one? && finder_params.join.eql?('id')
|
63
26
|
finder_params
|
64
27
|
end
|
28
|
+
|
29
|
+
def _insert_setters(setters, options, callback_options)
|
30
|
+
setters.each do |setter|
|
31
|
+
before_action callback_options do |controller|
|
32
|
+
resource = _get_resource(setter, options[:model], options[:ancestor])
|
33
|
+
Array(options[:scope]).each { |s| resource = resource.send(s) } unless options[:scope].nil?
|
34
|
+
values_for_find = _get_values_for_finder_params(setter, options[:finder_params])
|
35
|
+
resource = resource.send(options[:finder_method], *values_for_find)
|
36
|
+
controller.instance_variable_set("@#{setter}".to_sym, resource)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
65
40
|
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def _get_resource(setter, model, ancestor)
|
44
|
+
if !ancestor.nil?
|
45
|
+
_get_ancestor_resource(setter, model, ancestor)
|
46
|
+
else
|
47
|
+
(!model.nil? && model.descends_from_active_record?) ? model : setter.to_s.camelize.constantize
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def _get_ancestor_resource(setter, model, ancestor)
|
52
|
+
if instance_variable_defined?("@#{ancestor}")
|
53
|
+
resource = instance_variable_get("@#{ancestor}")
|
54
|
+
else
|
55
|
+
model_class = ancestor.to_s.camelize.constantize
|
56
|
+
resource = model_class.find(params["#{model_class.name.underscore}_id".to_sym])
|
57
|
+
end
|
58
|
+
reflection_name = (model || setter).to_s.underscore.pluralize.to_sym
|
59
|
+
resource = resource.send(reflection_name) if resource.respond_to?(reflection_name)
|
60
|
+
end
|
61
|
+
|
62
|
+
def _get_values_for_finder_params(setter, finder_params)
|
63
|
+
if finder_params.empty?
|
64
|
+
values_for_find = params["#{setter}_id".to_sym] || params[:id]
|
65
|
+
else
|
66
|
+
defaults = finder_params.inject({}) { |h, v| h.merge(v.to_s => nil) }
|
67
|
+
values_for_find = defaults.merge(params.permit(finder_params)).values
|
68
|
+
end
|
69
|
+
end
|
66
70
|
end
|
67
71
|
end
|
data/log/.gitignore
ADDED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'rspec/rails'
|
3
2
|
|
4
3
|
describe ControllerSetterPattern do
|
5
4
|
it 'is a model' do
|
@@ -39,10 +38,14 @@ describe AccountController, type: :controller do
|
|
39
38
|
end
|
40
39
|
|
41
40
|
it 'finds an instance with scope' do
|
42
|
-
user.active!
|
43
41
|
get :profile, username: user.username
|
44
42
|
should be_a(User)
|
45
43
|
end
|
44
|
+
|
45
|
+
it 'finds the instance with scopes' do
|
46
|
+
get :admin_profile, username: user.username
|
47
|
+
expect(assigns(:admin_account)).to be_a(User)
|
48
|
+
end
|
46
49
|
end
|
47
50
|
end
|
48
51
|
|
data/spec/factories.rb
CHANGED
@@ -3,6 +3,14 @@ FactoryGirl.define do
|
|
3
3
|
name { Faker::Name.name }
|
4
4
|
username { Faker::Internet.user_name(name) }
|
5
5
|
email { Faker::Internet.safe_email(username) }
|
6
|
+
admin false
|
7
|
+
|
8
|
+
after(:create) do |user, evaluator|
|
9
|
+
if evaluator.id == 1
|
10
|
+
user.admin = true
|
11
|
+
user.active!
|
12
|
+
end
|
13
|
+
end
|
6
14
|
end
|
7
15
|
|
8
16
|
factory :customer do
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'action_controller/railtie'
|
1
2
|
require 'action_controller'
|
2
3
|
require 'active_model'
|
3
4
|
require 'active_record'
|
@@ -5,14 +6,26 @@ require 'database_cleaner'
|
|
5
6
|
require 'logger'
|
6
7
|
require 'faker'
|
7
8
|
require 'factory_girl_rails'
|
9
|
+
require 'rspec/rails'
|
10
|
+
require 'rails'
|
11
|
+
require 'codeclimate-test-reporter'
|
12
|
+
|
13
|
+
formatters = [SimpleCov::Formatter::HTMLFormatter]
|
14
|
+
formatters << CodeClimate::TestReporter::Formatter if ENV['CODECLIMATE_REPO_TOKEN']
|
15
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[*formatters]
|
16
|
+
SimpleCov.start
|
17
|
+
|
8
18
|
require 'controller_setter_pattern'
|
9
19
|
|
10
20
|
module Rails
|
11
|
-
class App
|
21
|
+
class App < Rails::Application
|
12
22
|
def env_config; {} end
|
23
|
+
|
13
24
|
def routes
|
14
25
|
@routes ||= ActionDispatch::Routing::RouteSet.new
|
15
26
|
end
|
27
|
+
|
28
|
+
config.root = File.expand_path('../../', __FILE__)
|
16
29
|
end
|
17
30
|
|
18
31
|
def self.application
|
data/spec/support/controllers.rb
CHANGED
@@ -13,6 +13,7 @@ end
|
|
13
13
|
class AccountController < ActionController::Base
|
14
14
|
set :account, model: User, finder_params: :email, only: :resend_password
|
15
15
|
set :account, model: User, scope: :active, finder_params: :username, only: :profile
|
16
|
+
set :admin_account, model: User, scope: [:active, :administrator], finder_params: :username, only: :admin_profile
|
16
17
|
|
17
18
|
def resend_password
|
18
19
|
render text: "An email containing the new password was sent to your inbox (#{@account.email})."
|
@@ -21,6 +22,10 @@ class AccountController < ActionController::Base
|
|
21
22
|
def profile
|
22
23
|
render json: @account
|
23
24
|
end
|
25
|
+
|
26
|
+
def admin_profile
|
27
|
+
render json: @admin_account
|
28
|
+
end
|
24
29
|
end
|
25
30
|
|
26
31
|
class OrdersController < ActionController::Base
|
data/spec/support/models.rb
CHANGED
@@ -14,6 +14,8 @@ class User < ActiveRecord::Base
|
|
14
14
|
validates_uniqueness_of :username, case_sensitive: false
|
15
15
|
|
16
16
|
before_save { |record| record.status = 'pending' if record.passive? }
|
17
|
+
|
18
|
+
scope :administrator, -> { where(admin: true) }
|
17
19
|
end
|
18
20
|
|
19
21
|
class Customer < ActiveRecord::Base
|
data/spec/support/routes.rb
CHANGED
@@ -3,6 +3,7 @@ Rails.application.routes.draw do
|
|
3
3
|
|
4
4
|
get 'resend_password/:email' => 'account#resend_password'
|
5
5
|
get 'profile/:username' => 'account#profile'
|
6
|
+
get 'admin/profile/:username' => 'account#admin_profile', as: :admin_profile
|
6
7
|
|
7
8
|
get 'customers/:customer_id/orders/:id' => 'orders#show'
|
8
9
|
get 'customers/:customer_id/orders/:id/edit' => 'orders#edit', as: :edit
|
data/spec/support/schema.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: controller_setter_pattern
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rodrigo Casara
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -146,14 +146,17 @@ extra_rdoc_files: []
|
|
146
146
|
files:
|
147
147
|
- ".gitignore"
|
148
148
|
- ".rspec"
|
149
|
+
- ".travis.yml"
|
149
150
|
- Gemfile
|
150
151
|
- LICENSE
|
151
152
|
- README.md
|
152
153
|
- Rakefile
|
153
154
|
- controller_setter_pattern.gemspec
|
155
|
+
- coverage/.gitignore
|
154
156
|
- lib/controller_setter_pattern.rb
|
155
157
|
- lib/controller_setter_pattern/action_controller.rb
|
156
158
|
- lib/controller_setter_pattern/version.rb
|
159
|
+
- log/.gitignore
|
157
160
|
- spec/controller_setter_pattern_spec.rb
|
158
161
|
- spec/factories.rb
|
159
162
|
- spec/spec_helper.rb
|