action_controller-parents 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b65eaacaa3167066442862b1ddf2edf7b58bff93
4
- data.tar.gz: 5e406910b949644849e180f97193ec5ec9c7a55a
3
+ metadata.gz: 9955a18a42cd44581214f13676cb0ca148311877
4
+ data.tar.gz: 18f2101a9eaef3bdda29dcde745ae5c766aaac67
5
5
  SHA512:
6
- metadata.gz: 54e3bdff2ac724499270869e2e315240e2cd1a82a16433744f7757d099118ef7d66696ab93e8f7993729bbb57b0edbf2b565e993910bb28d1daeda23ee8e6b3d
7
- data.tar.gz: f5003c8598a8a21b824e1a81b006acaeca8ae40d10c8703f614859576226d127d63400286b44d8415c3cc2e3e4edb8c3d6315f087bb03e2f98e50b68b90ab7ea
6
+ metadata.gz: e93d6c25fb728d824831b31d15eab756ea205d11599653734dcf5056561599c4eb9be0be387ac98185a5225cbd8ad7655c50bcc8e92e89080d710fa82b59fb05
7
+ data.tar.gz: b733a9c41bdc93db5ab24916061eaaf41d65f7652fd240dc26d8b79e813b8aacb123d04dbb28bae52e6d1e8d6ca5600b3731d3c5c91eb78a970048d28e0d0668
@@ -0,0 +1,26 @@
1
+ require 'bundler'
2
+ Bundler.require
3
+
4
+ require 'benchmark'
5
+ require 'action_controller/parents'
6
+
7
+ class Model
8
+ class << self
9
+ def find(id)
10
+ end
11
+ end
12
+ end
13
+ class Group < Model; end
14
+ class Event < Model; end
15
+
16
+ finder = ActionController::Parents::Finder.new(Group, Event)
17
+
18
+ n = 100_000
19
+ params = { stuff: { x: 1, y: 2 }, data: 'bla', event_id: 1 }
20
+ Benchmark.bm(20) do |x|
21
+ x.report("parent_resource") {
22
+ n.times do
23
+ finder.parent_resource(params)
24
+ end
25
+ }
26
+ end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../
3
3
  specs:
4
- action_controller-parents (0.2.1)
4
+ action_controller-parents (0.2.2)
5
5
  activesupport (>= 3.0.0)
6
6
 
7
7
  GEM
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../
3
3
  specs:
4
- action_controller-parents (0.2.1)
4
+ action_controller-parents (0.2.2)
5
5
  activesupport (>= 3.0.0)
6
6
 
7
7
  GEM
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../
3
3
  specs:
4
- action_controller-parents (0.2.1)
4
+ action_controller-parents (0.2.2)
5
5
  activesupport (>= 3.0.0)
6
6
 
7
7
  GEM
@@ -3,7 +3,7 @@ require 'active_support/core_ext/string/conversions'
3
3
  module ActionController
4
4
  # To be included in a controller.
5
5
  #
6
- # Creates a `parent_resource` method, which will call `find_by_id!` using an id
6
+ # Creates a `parent_resource` method, which will call `find` using an id
7
7
  # found in the params hash.
8
8
  #
9
9
  # @example Organization and Group as parents
@@ -29,15 +29,9 @@ module ActionController
29
29
  private
30
30
 
31
31
  def initialize(*resource_classes)
32
- @finder = Finder.new(resource_classes)
33
- end
34
-
35
- def included(base)
36
- finder = @finder
37
- base.class_eval do
38
- define_method :parent_resource do
39
- finder.parent_resource(params)
40
- end
32
+ finder = Finder.new(resource_classes)
33
+ define_method :parent_resource do
34
+ finder.parent_resource(params)
41
35
  end
42
36
  end
43
37
  end # Parents
@@ -14,25 +14,35 @@ module ActionController
14
14
  # @param [Class<ActiveRecord::Base>] parent_resource_classes
15
15
  def initialize(*parent_resource_classes)
16
16
  @parent_resource_classes = parent_resource_classes.flatten
17
- @parent_resource_classes.each do |c|
18
- unless c.respond_to?(FIND_METHOD)
19
- fail NoFindMethodError,
20
- "Parent resource #{c.name} doesn't respond to #{FIND_METHOD.inspect}"
21
- end
22
- end
17
+ assert_responds_to_find_method(@parent_resource_classes)
23
18
  setup_primary_keys
24
19
  end
25
20
 
26
- def parent_resource(hsh)
27
- key = matched_key(hsh)
21
+ # Finds the parent resources from the ActionController params hash
22
+ # @params [Hash] params
23
+ # @return [ActiveRecord::Base, nil]
24
+ def parent_resource(params)
25
+ key = find_primary_key(params)
28
26
  return nil unless key
29
- class_by_key(key).public_send(FIND_METHOD, hsh[key])
27
+ class_by_key(key).public_send(FIND_METHOD, params.fetch(key))
30
28
  end
31
29
 
32
30
  private
33
31
 
34
- def matched_key(hsh)
35
- hsh.keys.detect { |key| valid_primary_key?(key) }
32
+ def assert_responds_to_find_method(classes)
33
+ res = classes.find { |c| !c.respond_to?(FIND_METHOD) }
34
+ unless res.nil?
35
+ fail NoFindMethodError,
36
+ "Parent resource #{res} doesn't respond to #{FIND_METHOD.inspect}"
37
+ end
38
+ end
39
+
40
+ # Looks for the primary key of any of the parent resources in the params
41
+ # hash
42
+ # @params [Hash] params
43
+ # @return [String, nil]
44
+ def find_primary_key(params)
45
+ params.keys.detect { |key| valid_primary_key?(key) }
36
46
  end
37
47
 
38
48
  def valid_primary_key?(key)
@@ -1,5 +1,5 @@
1
1
  module ActionController
2
2
  class Parents < Module
3
- VERSION = "0.2.1".freeze
3
+ VERSION = '0.2.2'.freeze
4
4
  end
5
5
  end
@@ -1,13 +1,16 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ActionController::Parents::Finder do
4
- let(:nested_resource) { described_class.new(parent_resources) }
4
+ let(:finder) { described_class.new(parent_resources) }
5
5
  let(:parent_resources) { [] }
6
6
 
7
7
  it "doesn't allow classes which don't respond to :find method" do
8
8
  expect {
9
9
  described_class.new(String)
10
- }.to raise_error(ActionController::Parents::NoFindMethodError)
10
+ }.to raise_error(
11
+ ActionController::Parents::NoFindMethodError,
12
+ "Parent resource String doesn't respond to :find",
13
+ )
11
14
  end
12
15
 
13
16
  describe '#parent_resource' do
@@ -28,7 +31,7 @@ describe ActionController::Parents::Finder do
28
31
  end
29
32
 
30
33
  describe '#primary_keys' do
31
- subject { nested_resource.primary_keys }
34
+ subject { finder.primary_keys }
32
35
  let(:parent_resources) { [DummyModel] }
33
36
 
34
37
  it 'sets the keys based on the parent resources' do
@@ -55,7 +58,7 @@ describe ActionController::Parents::Finder do
55
58
  end
56
59
 
57
60
  describe '#primary_keys' do
58
- subject { nested_resource.primary_keys }
61
+ subject { finder.primary_keys }
59
62
  let(:parent_resources) { [DummyModel, Nested::NestedDummyModel] }
60
63
 
61
64
  it 'sets the keys based on the parent resources' do
@@ -2,24 +2,29 @@ require 'spec_helper'
2
2
 
3
3
  describe ActionController::Parents do
4
4
  describe 'when included' do
5
- let(:dummy) { @controller_class.new }
5
+ let(:controller) { @controller_class.new }
6
6
 
7
7
  before(:each) do
8
8
  @controller_class = Class.new do
9
- include ActionController::Parents.new
9
+ include ActionController::Parents.new(DummyModel)
10
+ attr_accessor :params
10
11
  end
11
12
  end
12
13
 
13
- it "create the #parent_resource" do
14
- expect(dummy).to respond_to(:parent_resource)
14
+ it "create the #parent_resource method" do
15
+ expect(controller).to respond_to(:parent_resource)
15
16
  end
16
17
 
17
18
  describe '#parent_resource' do
18
19
  it 'deletegates to an instance of Finder' do
19
- args = []
20
- allow(dummy).to receive(:params) { args }
21
- expect_any_instance_of(described_class::Finder).to receive(:parent_resource).with(args)
22
- dummy.parent_resource
20
+ controller.params = { data: 'bla' }
21
+ expect_any_instance_of(described_class::Finder).to receive(:parent_resource).with(controller.params)
22
+ controller.parent_resource
23
+ end
24
+
25
+ it 'returns the result' do
26
+ controller.params = { dummy_model_id: 1 }
27
+ expect(controller.parent_resource).to be_a(DummyModel)
23
28
  end
24
29
  end
25
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: action_controller-parents
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maarten Claes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-27 00:00:00.000000000 Z
11
+ date: 2015-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -97,6 +97,7 @@ files:
97
97
  - README.md
98
98
  - Rakefile
99
99
  - action_controller-parents.gemspec
100
+ - benchmarks/parent_resource.rb
100
101
  - gemfiles/activesupport_3.gemfile
101
102
  - gemfiles/activesupport_3.gemfile.lock
102
103
  - gemfiles/activesupport_4.2.gemfile