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 +4 -4
- data/Gemfile +2 -2
- data/controller_setter_pattern.gemspec +6 -6
- data/lib/controller_setter_pattern/action_controller.rb +51 -33
- data/lib/controller_setter_pattern/version.rb +1 -1
- data/spec/controller_setter_pattern_spec.rb +11 -0
- data/spec/factories.rb +9 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/support/controllers.rb +9 -0
- data/spec/support/models.rb +8 -0
- data/spec/support/routes.rb +2 -0
- data/spec/support/schema.rb +11 -0
- metadata +15 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f49555840cc0afe1e637c6f3a370847a1542613
|
4
|
+
data.tar.gz: 84ad014cc62bbbedbe39f1755e269dbb09d9c129
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4210d5c2f3f7977e77d10c1f4fc93390d7d23785f0a38f332f6e47e96153793e1675f4483c78e026203bfbc922d038f3381ebca1653baa950c24230d8f0ead55
|
7
|
+
data.tar.gz: cd47bc1346719a2934c5cb377d92b41a5afa56c7c0cbc3ffe3422195085bcc5fb64b276c209448e1c9eb914a0689cb6ab906fdfa19f10c8fee5e4c87fc2249a5
|
data/Gemfile
CHANGED
@@ -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.
|
21
|
-
s.add_development_dependency 'rspec-rails', '~> 3.
|
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.
|
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.
|
26
|
-
s.add_development_dependency 'activesupport', '~> 4.2.
|
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.
|
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
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
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
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
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
|
@@ -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.
|
15
|
+
SimpleCov.formatters = formatters
|
16
16
|
SimpleCov.start
|
17
17
|
|
18
18
|
require 'controller_setter_pattern'
|
data/spec/support/controllers.rb
CHANGED
@@ -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
|
data/spec/support/models.rb
CHANGED
data/spec/support/routes.rb
CHANGED
@@ -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
|
data/spec/support/schema.rb
CHANGED
@@ -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.
|
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:
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|