action_controller-parents 0.0.2 → 0.1.0

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: b9f3dc097efe51fe77aa33b7b4ad3c0c611f64b4
4
- data.tar.gz: a0a01b028d0a2e45d040724461deaeec8319318d
3
+ metadata.gz: 4a9f2bdc1c4e85e3c0d39e223566ee29b1ec14cd
4
+ data.tar.gz: 8788d5de3a3a647774347603be67f560e46f9a5a
5
5
  SHA512:
6
- metadata.gz: 98ca811ff7ae5d0a203dd92de929394b8fc4731cc1f29db014444401fd0ab4362fabb8c7fa8606f066d426a668474cd8dc0ee0712a27c60e72667e33cacdd82b
7
- data.tar.gz: 27a6e714af635f1abfc34bff53f349a46688c184ff5f677c8a71483d225afbb32bd78d14634e316ce94492674eb28614df4a30b916ce7cef6268539985b80bbb
6
+ metadata.gz: 0d81e8a1697bb974675e72a4a5e0aa2e75ab209a25ceed5931c76cd68866fa052fd297065d78fbdb527438f086a1898c51616f0366cb9c7f68139f857f7f6ba8
7
+ data.tar.gz: fe34b89177ceb2248ec54f25c2c6341ca097e80ded2216575198c6df09b58204d78ab541d23468f65d4e8d4db27a26912bc02c29bf2d2ff5637f2af98ed9b170
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # ActionController::Parents
2
2
 
3
+ [![Gem
4
+ Version](https://badge.fury.io/rb/action_controller-parents.png)](http://badge.fury.io/rb/action_controller-parents)
3
5
  [![Build
4
6
  Status](https://travis-ci.org/mcls/action_controller-parents.png?branch=master)](https://travis-ci.org/mcls/action_controller-parents)
5
7
 
@@ -21,7 +23,26 @@ Or install it yourself as:
21
23
 
22
24
  ## Usage
23
25
 
24
- Example:
26
+ Extend your `ApplicationController` with the
27
+ `ActionController::Parents::Methods` module and use `parent_resources`:
28
+
29
+ ```ruby
30
+ class ApplicationController < ActionController::Base
31
+ extend ActionController::Parents::Methods
32
+ end
33
+
34
+ class MembersController < ApplicationController
35
+ parent_resources Group, Organization
36
+
37
+ # GET /organizations/:organization_id/members
38
+ # GET /groups/:group_id/members
39
+ def index
40
+ @members = parent_resource.members
41
+ end
42
+ end
43
+ ```
44
+
45
+ Or use `ActionController::Parents` directly:
25
46
 
26
47
  ```ruby
27
48
  class MembersController < ActionController::Base
@@ -35,6 +56,7 @@ Example:
35
56
  end
36
57
  ```
37
58
 
59
+
38
60
  ## Contributing
39
61
 
40
62
  1. Fork it
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- action_controller-parents (0.0.1)
4
+ action_controller-parents (0.1.0)
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.0.1)
4
+ action_controller-parents (0.1.0)
5
5
  activesupport (>= 3.0.0)
6
6
 
7
7
  GEM
@@ -1,4 +1,6 @@
1
1
  require 'active_support/core_ext/string/conversions'
2
+ require 'action_controller/parents/finder'
3
+ require 'action_controller/parents/methods'
2
4
  require 'action_controller/parents/version'
3
5
 
4
6
  module ActionController
@@ -41,43 +43,5 @@ module ActionController
41
43
  end
42
44
  end
43
45
  end
44
-
45
- # Used to find the parent resource
46
- #
47
- # @api private
48
- #
49
- class Finder
50
- attr_reader :parent_resource_classes, :primary_keys
51
-
52
- # @param [Class<ActiveRecord::Base>] parent_resource_classes
53
- def initialize(*parent_resource_classes)
54
- @parent_resource_classes = parent_resource_classes.flatten
55
- setup_primary_keys
56
- end
57
-
58
- def parent_resource(hsh)
59
- key = matched_key(hsh)
60
- return nil unless key
61
- to_resource_class(key).find_by_id!(hsh[key])
62
- end
63
-
64
- def to_resource_class(key)
65
- key.to_s.sub(/_id$/, '').classify.constantize
66
- end
67
-
68
- def matched_key(hsh)
69
- hsh.keys.detect { |key| valid_primary_key?(key) }
70
- end
71
-
72
- def valid_primary_key?(key)
73
- primary_keys.include?(key.to_s)
74
- end
75
-
76
- def setup_primary_keys
77
- @primary_keys = parent_resource_classes.map { |klass|
78
- klass.to_s.underscore.concat('_id')
79
- }
80
- end
81
- end
82
- end
46
+ end # Parents
83
47
  end
@@ -0,0 +1,41 @@
1
+ module ActionController
2
+ class Parents
3
+ # Used to find the parent resource
4
+ #
5
+ # @api private
6
+ #
7
+ class Finder
8
+ attr_reader :parent_resource_classes, :primary_keys
9
+
10
+ # @param [Class<ActiveRecord::Base>] parent_resource_classes
11
+ def initialize(*parent_resource_classes)
12
+ @parent_resource_classes = parent_resource_classes.flatten
13
+ setup_primary_keys
14
+ end
15
+
16
+ def parent_resource(hsh)
17
+ key = matched_key(hsh)
18
+ return nil unless key
19
+ to_resource_class(key).find_by_id!(hsh[key])
20
+ end
21
+
22
+ def to_resource_class(key)
23
+ key.to_s.sub(/_id$/, '').classify.constantize
24
+ end
25
+
26
+ def matched_key(hsh)
27
+ hsh.keys.detect { |key| valid_primary_key?(key) }
28
+ end
29
+
30
+ def valid_primary_key?(key)
31
+ primary_keys.include?(key.to_s)
32
+ end
33
+
34
+ def setup_primary_keys
35
+ @primary_keys = parent_resource_classes.map { |klass|
36
+ klass.to_s.underscore.concat('_id')
37
+ }
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,33 @@
1
+ module ActionController
2
+ class Parents
3
+ # Defines a {#parent_resources} method which can then be used instead of
4
+ # doing `include ActionController::Parents.new(...)`.
5
+ #
6
+ # @example
7
+ #
8
+ # class ApplicationController < ActionController::Base
9
+ # extend ActionController::Parents::Methods
10
+ # end
11
+ #
12
+ # class MembersController < ApplicationController
13
+ # parent_resources Group, Organization
14
+ #
15
+ # def index
16
+ # @members = parent_resource.members
17
+ # end
18
+ # end
19
+ module Methods
20
+
21
+ # Includes new instance of {ActionController::Parents}, defining
22
+ # `#parent_resource` as a result.
23
+ #
24
+ # @param [Class<ActiveRecord::Base>] classes
25
+ #
26
+ # @return [undefined]
27
+ #
28
+ def parent_resources(*classes)
29
+ include Parents.new(*classes)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,5 +1,5 @@
1
1
  module ActionController
2
2
  class Parents < Module
3
- VERSION = "0.0.2"
3
+ VERSION = "0.1.0".freeze
4
4
  end
5
5
  end
data/spec/spec_helper.rb CHANGED
@@ -1 +1,2 @@
1
1
  require 'action_controller/parents'
2
+ require_relative 'support/dummy_model'
@@ -0,0 +1,5 @@
1
+ class DummyModel
2
+ def self.find_by_id!(id)
3
+ DummyModel.new
4
+ end
5
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActionController::Parents::Finder do
4
+ let(:nested_resource) { described_class.new(parent_resources) }
5
+ let(:parent_resources) { [] }
6
+
7
+ describe '#parent_resource' do
8
+ subject { described_class.new(DummyModel).parent_resource(params) }
9
+ let(:params) { { :dummy_model_id => 1 } }
10
+
11
+ it 'calls find_by_id! on the found class' do
12
+ expect(DummyModel).to receive(:find_by_id!).with(1)
13
+ subject
14
+ end
15
+
16
+ context 'when class not found' do
17
+ let(:params) { { :random_model_id => 1 } }
18
+ it 'returns nil' do
19
+ expect(subject).to be_nil
20
+ end
21
+ end
22
+ end
23
+
24
+ describe '#to_resource_class' do
25
+ subject { described_class.new(DummyModel).to_resource_class(param_key) }
26
+ let(:param_key) { :dummy_model_id }
27
+
28
+ it 'transforms the key to a class' do
29
+ expect(subject).to eq DummyModel
30
+ end
31
+ end
32
+
33
+ describe '#primary_keys' do
34
+ subject { nested_resource.primary_keys }
35
+ let(:parent_resources) { [String, Integer] }
36
+
37
+ it 'sets the keys based on the parent resources' do
38
+ expect(subject).to eq %w(string_id integer_id)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,33 @@
1
+ describe ActionController::Parents::Methods do
2
+ context 'when extended' do
3
+ subject do
4
+ mod = described_class
5
+ @controller ||= Class.new { extend mod }
6
+ end
7
+
8
+ it { should respond_to(:parent_resources) }
9
+ end
10
+
11
+ context 'when parent_resources is called' do
12
+ subject do
13
+ mod = described_class
14
+ @controller ||= Class.new do
15
+ extend mod
16
+ parent_resources DummyModel
17
+ end
18
+ end
19
+
20
+ it 'includes new ActionController::Parents' do
21
+ expect(subject.ancestors.map(&:class)).to include(ActionController::Parents)
22
+ end
23
+
24
+ it 'the Parents module is instantiated with the same arguments of parent_resources' do
25
+ expect(ActionController::Parents).to receive(:new).with(DummyModel).and_call_original
26
+ mod = described_class
27
+ Class.new do
28
+ extend mod
29
+ parent_resources DummyModel
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,24 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
- class DummyController
4
- attr_accessor :params
5
- def params
6
- @params || {}
7
- end
8
- end
9
-
10
- class DummyModel
11
- def self.find_by_id!(id)
12
- DummyModel.new
13
- end
14
- end
15
-
16
3
  describe ActionController::Parents do
17
4
  describe 'when included' do
18
- let(:dummy) { DummyController.new }
5
+ let(:dummy) { @controller_class.new }
19
6
 
20
7
  before(:each) do
21
- class DummyController; include(ActionController::Parents.new); end
8
+ @controller_class = Class.new do
9
+ include ActionController::Parents.new
10
+ end
22
11
  end
23
12
 
24
13
  it "create the #parent_resource" do
@@ -33,47 +22,5 @@ describe ActionController::Parents do
33
22
  dummy.parent_resource
34
23
  end
35
24
  end
36
-
37
- end
38
- end
39
-
40
- describe ActionController::Parents::Finder do
41
- let(:nested_resource) { described_class.new(parent_resources) }
42
- let(:parent_resources) { [] }
43
-
44
- describe '#parent_resource' do
45
- subject { described_class.new(DummyModel).parent_resource(params) }
46
- let(:params) { { :dummy_model_id => 1 } }
47
-
48
- it 'calls find_by_id! on the found class' do
49
- expect(DummyModel).to receive(:find_by_id!).with(1)
50
- subject
51
- end
52
-
53
- context 'when class not found' do
54
- let(:params) { { :random_model_id => 1 } }
55
- it 'returns nil' do
56
- expect(subject).to be_nil
57
- end
58
- end
59
25
  end
60
-
61
- describe '#to_resource_class' do
62
- subject { described_class.new(DummyModel).to_resource_class(param_key) }
63
- let(:param_key) { :dummy_model_id }
64
-
65
- it 'transforms the key to a class' do
66
- expect(subject).to eq DummyModel
67
- end
68
- end
69
-
70
- describe '#primary_keys' do
71
- subject { nested_resource.primary_keys }
72
- let(:parent_resources) { [String, Integer] }
73
-
74
- it 'sets the keys based on the parent resources' do
75
- expect(subject).to eq %w(string_id integer_id)
76
- end
77
- end
78
-
79
26
  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.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maarten Claes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-09 00:00:00.000000000 Z
11
+ date: 2014-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -116,8 +116,13 @@ files:
116
116
  - gemfiles/activesupport_4.gemfile
117
117
  - gemfiles/activesupport_4.gemfile.lock
118
118
  - lib/action_controller/parents.rb
119
+ - lib/action_controller/parents/finder.rb
120
+ - lib/action_controller/parents/methods.rb
119
121
  - lib/action_controller/parents/version.rb
120
122
  - spec/spec_helper.rb
123
+ - spec/support/dummy_model.rb
124
+ - spec/unit/action_controller-parents/finder_spec.rb
125
+ - spec/unit/action_controller-parents/methods_spec.rb
121
126
  - spec/unit/action_controller-parents_spec.rb
122
127
  homepage: ''
123
128
  licenses:
@@ -145,4 +150,7 @@ specification_version: 4
145
150
  summary: Easily access parent resources
146
151
  test_files:
147
152
  - spec/spec_helper.rb
153
+ - spec/support/dummy_model.rb
154
+ - spec/unit/action_controller-parents/finder_spec.rb
155
+ - spec/unit/action_controller-parents/methods_spec.rb
148
156
  - spec/unit/action_controller-parents_spec.rb