controller_setter_pattern 0.1.1 → 0.1.2

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: 56f77be87b831737dd8d2dde96ac059a77c224b2
4
- data.tar.gz: cded750410e8995f62f6885c12d086dd1036800f
3
+ metadata.gz: 7f49555840cc0afe1e637c6f3a370847a1542613
4
+ data.tar.gz: 84ad014cc62bbbedbe39f1755e269dbb09d9c129
5
5
  SHA512:
6
- metadata.gz: eccec7b8481594659362b55b4cf91ee1778d998bb88334041d366bdab9e2e753d9637ea4c58b0fe74677fb17d9c91025b74e3da519a7d57789916484179133d1
7
- data.tar.gz: adfa269ee3f7bde2a8bdd351cd26cb0393a390abfc3e833a2e4312a37e322834e3a50ebb787c5eb64d64b130a918de7c70f05153a50baa6d2c27b74490a9b749
6
+ metadata.gz: 4210d5c2f3f7977e77d10c1f4fc93390d7d23785f0a38f332f6e47e96153793e1675f4483c78e026203bfbc922d038f3381ebca1653baa950c24230d8f0ead55
7
+ data.tar.gz: cd47bc1346719a2934c5cb377d92b41a5afa56c7c0cbc3ffe3422195085bcc5fb64b276c209448e1c9eb914a0689cb6ab906fdfa19f10c8fee5e4c87fc2249a5
data/Gemfile CHANGED
@@ -2,6 +2,6 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'rails', '~> 4.2.1'
5
+ gem 'rails', '~> 4.2.5'
6
6
 
7
- gem 'codeclimate-test-reporter', '~> 0.4.7', group: :test
7
+ gem 'codeclimate-test-reporter', '~> 0.4.8', group: :test
@@ -17,13 +17,13 @@ Gem::Specification.new do |s|
17
17
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
18
18
  s.require_paths = ['lib']
19
19
 
20
- s.add_development_dependency 'rspec', '~> 3.2.0'
21
- s.add_development_dependency 'rspec-rails', '~> 3.2.1'
20
+ s.add_development_dependency 'rspec', '~> 3.4.0'
21
+ s.add_development_dependency 'rspec-rails', '~> 3.4.0'
22
22
  s.add_development_dependency 'sqlite3'
23
- s.add_development_dependency 'database_cleaner', '~> 1.4.1'
23
+ s.add_development_dependency 'database_cleaner', '~> 1.5.1'
24
24
  s.add_development_dependency 'rake'
25
- s.add_development_dependency 'actionpack', '~> 4.2.1'
26
- s.add_development_dependency 'activesupport', '~> 4.2.1'
25
+ s.add_development_dependency 'actionpack', '~> 4.2.5'
26
+ s.add_development_dependency 'activesupport', '~> 4.2.5'
27
27
  s.add_development_dependency 'factory_girl_rails', '~> 4.5.0'
28
- s.add_development_dependency 'faker', '~> 1.4.3'
28
+ s.add_development_dependency 'faker', '~> 1.6.1'
29
29
  end
@@ -19,53 +19,71 @@ module ControllerSetterPattern
19
19
  end
20
20
 
21
21
  private
22
- def _normalize_finder_params(finder_params)
23
- finder_params = [finder_params] unless finder_params.is_a?(Array)
24
- finder_params = finder_params.compact.uniq
25
- finder_params.clear if finder_params.one? && finder_params.join.eql?('id')
26
- finder_params
27
- end
28
22
 
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])
23
+ def _normalize_finder_params(finder_params)
24
+ finder_params = [finder_params] unless finder_params.is_a?(Array)
25
+ finder_params = finder_params.compact.uniq
26
+ finder_params.clear if finder_params.one? && finder_params.join.eql?('id')
27
+ finder_params
28
+ end
29
+
30
+ def _insert_setters(setters, options, callback_options)
31
+ setters.each do |setter|
32
+ before_action callback_options do |controller|
33
+ resource = _get_resource(setter, options[:model], options[:ancestor])
34
+ if _is_class_model_or_association_method?(resource)
33
35
  Array(options[:scope]).each { |s| resource = resource.send(s) } unless options[:scope].nil?
34
36
  values_for_find = _get_values_for_finder_params(setter, options[:finder_params])
35
37
  resource = resource.send(options[:finder_method], *values_for_find)
36
- controller.instance_variable_set("@#{setter}".to_sym, resource)
37
38
  end
39
+ controller.instance_variable_set("@#{setter}".to_sym, resource)
38
40
  end
39
41
  end
42
+ end
40
43
  end
41
44
 
42
45
  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
46
+
47
+ def _get_resource(setter, model, ancestor)
48
+ if !ancestor.nil?
49
+ _get_ancestor_resource(setter, model, ancestor)
50
+ else
51
+ (!model.nil? && model.descends_from_active_record?) ? model : setter.to_s.camelize.constantize
49
52
  end
53
+ end
50
54
 
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)
55
+ def _get_ancestor_resource(setter, model, ancestor)
56
+ if instance_variable_defined?("@#{ancestor}")
57
+ resource = instance_variable_get("@#{ancestor}")
58
+ else
59
+ model_class = ancestor.to_s.camelize.constantize
60
+ resource = model_class.find(params["#{model_class.name.underscore}_id".to_sym])
60
61
  end
61
62
 
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
63
+ reflection = _get_reflection(resource.class, model || setter)
64
+ unless reflection.nil?
65
+ reflection_method = reflection.options[:as] || reflection.name
66
+ resource = resource.send(reflection_method) if resource.respond_to?(reflection_method)
69
67
  end
68
+ end
69
+
70
+ def _get_reflection(klass, assoc_class)
71
+ singular_name = assoc_class.to_s.underscore.singularize.to_sym
72
+ plural_name = assoc_class.to_s.underscore.pluralize.to_sym
73
+ klass.reflect_on_association(singular_name) || klass.reflect_on_association(plural_name)
74
+ end
75
+
76
+ def _is_class_model_or_association_method?(resource)
77
+ resource.is_a?(Class) || resource.class.ancestors.include?(ActiveRecord::Associations::CollectionProxy)
78
+ end
79
+
80
+ def _get_values_for_finder_params(setter, finder_params)
81
+ if finder_params.empty?
82
+ values_for_find = params["#{setter}_id".to_sym] || params[:id]
83
+ else
84
+ defaults = finder_params.inject({}) { |h, v| h.merge(v.to_s => nil) }
85
+ values_for_find = defaults.merge(params.permit(finder_params)).values
86
+ end
87
+ end
70
88
  end
71
89
  end
@@ -1,6 +1,6 @@
1
1
  module ControllerSetterPattern #:nodoc:
2
2
  MAJOR = 0
3
3
  MINOR = 1
4
- PATCH = 1
4
+ PATCH = 2
5
5
  VERSION = "#{MAJOR}.#{MINOR}.#{PATCH}"
6
6
  end
@@ -68,4 +68,15 @@ describe OrdersController, type: :controller do
68
68
  xhr :get, :order_by_customer_date, customer_id: customer.id, order_date: customer.orders.last.order_date.to_date
69
69
  expect(assigns(:order)).to be_a(Order)
70
70
  end
71
+ end
72
+
73
+ describe AccountsController, type: :controller do
74
+ let(:supplier) { FactoryGirl.create(:supplier) }
75
+
76
+ context 'with ancestor' do
77
+ it 'finds an instance' do
78
+ get :show, supplier_id: supplier.id, id: supplier.account.id
79
+ expect(assigns(:account)).to be_a(Account)
80
+ end
81
+ end
71
82
  end
data/spec/factories.rb CHANGED
@@ -22,4 +22,13 @@ FactoryGirl.define do
22
22
  customer
23
23
  order_date { Faker::Date.forward(90) }
24
24
  end
25
+
26
+ factory :supplier do
27
+ name { Faker::Company.name }
28
+ account { FactoryGirl.create(:account) }
29
+ end
30
+
31
+ factory :account do
32
+ account_number { Faker::Number.number(10) }
33
+ end
25
34
  end
data/spec/spec_helper.rb CHANGED
@@ -12,7 +12,7 @@ require 'codeclimate-test-reporter'
12
12
 
13
13
  formatters = [SimpleCov::Formatter::HTMLFormatter]
14
14
  formatters << CodeClimate::TestReporter::Formatter if ENV['CODECLIMATE_REPO_TOKEN']
15
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[*formatters]
15
+ SimpleCov.formatters = formatters
16
16
  SimpleCov.start
17
17
 
18
18
  require 'controller_setter_pattern'
@@ -45,4 +45,13 @@ class OrdersController < ActionController::Base
45
45
  def order_by_customer_date
46
46
  render json: @order
47
47
  end
48
+ end
49
+
50
+ class AccountsController < ActionController::Base
51
+ set :supplier
52
+ set :account, ancestor: :supplier
53
+
54
+ def show
55
+ render json: @account
56
+ end
48
57
  end
@@ -24,4 +24,12 @@ end
24
24
 
25
25
  class Order < ActiveRecord::Base
26
26
  belongs_to :customer
27
+ end
28
+
29
+ class Supplier < ActiveRecord::Base
30
+ has_one :account
31
+ end
32
+
33
+ class Account < ActiveRecord::Base
34
+ belongs_to :supplier
27
35
  end
@@ -8,4 +8,6 @@ Rails.application.routes.draw do
8
8
  get 'customers/:customer_id/orders/:id' => 'orders#show'
9
9
  get 'customers/:customer_id/orders/:id/edit' => 'orders#edit', as: :edit
10
10
  get 'order_by_customer_date' => 'orders#order_by_customer_date'
11
+
12
+ get 'suppliers/:supplier_id/accounts/:id' => 'accounts#show'
11
13
  end
@@ -20,4 +20,15 @@ ActiveRecord::Schema.define do
20
20
  t.datetime :order_date
21
21
  t.timestamps null: false
22
22
  end
23
+
24
+ create_table :suppliers, force: true do |t|
25
+ t.string :name
26
+ t.timestamps null: false
27
+ end
28
+
29
+ create_table :accounts, force: true do |t|
30
+ t.belongs_to :supplier, index: true
31
+ t.string :account_number
32
+ t.timestamps null: false
33
+ end
23
34
  end
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.1
4
+ version: 0.1.2
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-05 00:00:00.000000000 Z
11
+ date: 2016-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 3.2.0
19
+ version: 3.4.0
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 3.2.0
26
+ version: 3.4.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec-rails
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 3.2.1
33
+ version: 3.4.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 3.2.1
40
+ version: 3.4.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: sqlite3
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 1.4.1
61
+ version: 1.5.1
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 1.4.1
68
+ version: 1.5.1
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -86,28 +86,28 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 4.2.1
89
+ version: 4.2.5
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 4.2.1
96
+ version: 4.2.5
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: activesupport
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 4.2.1
103
+ version: 4.2.5
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 4.2.1
110
+ version: 4.2.5
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: factory_girl_rails
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 1.4.3
131
+ version: 1.6.1
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 1.4.3
138
+ version: 1.6.1
139
139
  description: Pattern for assign instance variables in controllers for use in views,
140
140
  etc.
141
141
  email:
@@ -184,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
184
  version: '0'
185
185
  requirements: []
186
186
  rubyforge_project:
187
- rubygems_version: 2.4.6
187
+ rubygems_version: 2.4.8
188
188
  signing_key:
189
189
  specification_version: 4
190
190
  summary: Pattern for assign instance variables in controllers for use in views, etc.