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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 36ee901377eb976f73cfc39346aa635c7063af71
4
- data.tar.gz: 7740bd3b21ee8af6e282fb182ac75cdb33026c5c
3
+ metadata.gz: 56f77be87b831737dd8d2dde96ac059a77c224b2
4
+ data.tar.gz: cded750410e8995f62f6885c12d086dd1036800f
5
5
  SHA512:
6
- metadata.gz: 1fff224ca7116cf0773456103b329f60d4186a3c1ea176f35cd84f5ba8b048b5ba14104e302c17f4970ec4685e931ca0b0a82cec52e4220cd5a53f2996365420
7
- data.tar.gz: 1fdbb3904400d9b320a4b10ad7918cf1bdb50d5b78c2b6531bb8cd895b518dd5f5c60630ec9b06bdbd41447883a86be49b5ae9b455a004776e79523ac2bc76dd
6
+ metadata.gz: eccec7b8481594659362b55b4cf91ee1778d998bb88334041d366bdab9e2e753d9637ea4c58b0fe74677fb17d9c91025b74e3da519a7d57789916484179133d1
7
+ data.tar.gz: adfa269ee3f7bde2a8bdd351cd26cb0393a390abfc3e833a2e4312a37e322834e3a50ebb787c5eb64d64b130a918de7c70f05153a50baa6d2c27b74490a9b749
data/.gitignore CHANGED
@@ -1,3 +1,3 @@
1
1
  .project
2
2
  Gemfile.lock
3
- log/*
3
+ *.gem
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
4
+ gemfile:
5
+ - Gemfile
6
+ addons:
7
+ code_climate:
8
+ repo_token: c1f8ba0adfcc8f55bfa8940710b9899fdfed0581fdc6d9537a34a5e42ed8dfe7
9
+ script: "bundle exec rake spec"
data/Gemfile CHANGED
@@ -2,4 +2,6 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'rails', '~> 4.2.1'
5
+ gem 'rails', '~> 4.2.1'
6
+
7
+ gem 'codeclimate-test-reporter', '~> 0.4.7', group: :test
data/README.md CHANGED
@@ -1,4 +1,11 @@
1
1
  # controller_setter_pattern
2
+
3
+ [![Build Status](https://travis-ci.org/Casara/controller_setter_pattern.svg)](https://travis-ci.org/Casara/controller_setter_pattern)
4
+ [![Code Climate](https://codeclimate.com/github/Casara/controller_setter_pattern.svg)](https://codeclimate.com/github/Casara/controller_setter_pattern)
5
+ [![Test Coverage](https://codeclimate.com/github/Casara/controller_setter_pattern/badges/coverage.svg)](https://codeclimate.com/github/Casara/controller_setter_pattern/coverage)
6
+ [![Gem Version](https://badge.fury.io/rb/controller_setter_pattern.svg)](http://badge.fury.io/rb/controller_setter_pattern)
7
+ [![Dependency Status](https://gemnasium.com/Casara/controller_setter_pattern.svg)](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
+ ```
@@ -0,0 +1,2 @@
1
+ *
2
+ !.gitignore
@@ -4,64 +4,68 @@ module ControllerSetterPattern
4
4
 
5
5
  module ClassMethods
6
6
  def set(*names)
7
- options = names.extract_options!
7
+ callback_options = names.extract_options!
8
8
 
9
- model = options.delete(:model)
10
- model = model.to_s.camelize.constantize unless model.nil?
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 = normalize_finder_params(options.delete(: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 = options.delete(:ancestor)
16
- scope = options.delete(:scope)
15
+ options[:ancestor] = callback_options.delete(:ancestor)
16
+ options[:scope] = callback_options.delete(:scope)
17
17
 
18
- names.each do |variable|
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 normalize_finder_params(finder_params)
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
@@ -1,6 +1,6 @@
1
1
  module ControllerSetterPattern #:nodoc:
2
2
  MAJOR = 0
3
3
  MINOR = 1
4
- PATCH = 0
4
+ PATCH = 1
5
5
  VERSION = "#{MAJOR}.#{MINOR}.#{PATCH}"
6
6
  end
data/log/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *
2
+ !.gitignore
@@ -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
@@ -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
@@ -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
@@ -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
@@ -6,6 +6,7 @@ ActiveRecord::Schema.define do
6
6
  t.string :name
7
7
  t.string :username, unique: true
8
8
  t.string :email, unique: true
9
+ t.boolean :admin, default: false
9
10
  t.timestamps null: false
10
11
  end
11
12
 
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.0
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-04 00:00:00.000000000 Z
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