skinny_controllers 0.6.2 → 0.7.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 +4 -4
- data/README.md +15 -0
- data/lib/skinny_controllers/diet.rb +8 -2
- data/lib/skinny_controllers/lookup/model.rb +2 -1
- data/lib/skinny_controllers/lookup/namespace.rb +32 -0
- data/lib/skinny_controllers/lookup/operation.rb +4 -1
- data/lib/skinny_controllers/lookup/policy.rb +16 -1
- data/lib/skinny_controllers/operation/base.rb +3 -2
- data/lib/skinny_controllers/operation/model_helpers.rb +2 -1
- data/lib/skinny_controllers/version.rb +1 -1
- data/lib/skinny_controllers.rb +1 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfd1fac9652be4c71127faeea92909e2587462b5
|
4
|
+
data.tar.gz: 8ef6996a05fd1dfc06682003c69654b130a4ae9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c516408f33f026117fc3f2e4a432ed1d6e8ace278417fc69a878e691f80f37b7a075745ae4331d6960c4d77f4780f81f4740be35f0a9bc3316e73d34ab95137
|
7
|
+
data.tar.gz: 5c2bf53aa6ae2de2fed209c3bf9caa62c901cebbe5bf5c2fd9b989beb67b9067cb96956ee9326bcc66e24e0b9af850dca0372dab3b466caebce0deaee7b9a7f9
|
data/README.md
CHANGED
@@ -74,6 +74,21 @@ end
|
|
74
74
|
Note that `each_serializer` and `serializer` is not part of `SkinnyControllers`, and is part of [ActiveModel::Serializers](https://github.com/rails-api/active_model_serializers).
|
75
75
|
|
76
76
|
|
77
|
+
### What if your model is namespaced?
|
78
|
+
|
79
|
+
All you have to do is set the `model_class`, and `model_key`.
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
class ItemsController < ApiController # or whatever your superclass is
|
83
|
+
include SkinnyControllers::Diet
|
84
|
+
self.model_class = NameSpace::Item
|
85
|
+
self.model_key = 'item'
|
86
|
+
end
|
87
|
+
```
|
88
|
+
`model_key` specifies the key to look for params when creating / updating the model.
|
89
|
+
|
90
|
+
Note that while `model_key` doesn't *have* to be specified, it would default to name_space/item. So, just keep that in mind.
|
91
|
+
|
77
92
|
### What if you want to call your own operations?
|
78
93
|
|
79
94
|
Sometimes, magic is scary. You can call anything you want manually (operations and policies).
|
@@ -4,13 +4,17 @@ module SkinnyControllers
|
|
4
4
|
|
5
5
|
included do
|
6
6
|
cattr_accessor :model_class
|
7
|
+
cattr_accessor :model_key
|
7
8
|
end
|
8
9
|
|
9
10
|
# TODO: what if we want multiple operations per action?
|
10
11
|
#
|
11
12
|
# @return an instance of the operation with default parameters
|
12
13
|
def operation
|
13
|
-
@operation ||= operation_class.new(
|
14
|
+
@operation ||= operation_class.new(
|
15
|
+
current_user,
|
16
|
+
params, params_for_action,
|
17
|
+
action_name, model_key)
|
14
18
|
end
|
15
19
|
|
16
20
|
# Assumes the operation name from the controller name
|
@@ -46,7 +50,9 @@ module SkinnyControllers
|
|
46
50
|
return {} if action_name == 'destroy'
|
47
51
|
|
48
52
|
model_key =
|
49
|
-
if
|
53
|
+
if self.model_key.present?
|
54
|
+
self.model_key
|
55
|
+
elsif model_class
|
50
56
|
# model_class should be a class
|
51
57
|
model_class.name.underscore
|
52
58
|
else
|
@@ -24,7 +24,8 @@ module SkinnyControllers
|
|
24
24
|
# Namespace::ModelOperations::Verb => Namespace::ModelOperations
|
25
25
|
namespace = operation_name.deconstantize
|
26
26
|
# Namespace::ModelOperations => ModelOperations
|
27
|
-
nested_namespace = namespace.demodulize
|
27
|
+
# nested_namespace = namespace.demodulize
|
28
|
+
nested_namespace = namespace.gsub(SkinnyControllers.operations_namespace, '')
|
28
29
|
# ModelOperations => Model
|
29
30
|
nested_namespace.gsub(SkinnyControllers.operations_suffix, '')
|
30
31
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module SkinnyControllers
|
2
|
+
module Lookup
|
3
|
+
module Namespace
|
4
|
+
module_function
|
5
|
+
|
6
|
+
# iterate through the namespaces until one doesn't exist, and create the rest
|
7
|
+
def create_namespace(desired_namespace)
|
8
|
+
if klass = desired_namespace.safe_constantize
|
9
|
+
return klass
|
10
|
+
end
|
11
|
+
|
12
|
+
namespaces = desired_namespace.split('::')
|
13
|
+
existing = []
|
14
|
+
previous = Object
|
15
|
+
|
16
|
+
namespaces.each do |namespace|
|
17
|
+
current = (existing + [namespace]).join('::')
|
18
|
+
begin
|
19
|
+
Object.const_get(current)
|
20
|
+
rescue NameError => e
|
21
|
+
previous.const_set(namespace, Module.new)
|
22
|
+
end
|
23
|
+
|
24
|
+
existing << namespace
|
25
|
+
previous = current.constantize
|
26
|
+
end
|
27
|
+
|
28
|
+
previous
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -36,12 +36,15 @@ module SkinnyControllers
|
|
36
36
|
|
37
37
|
# @return [Class] namespace for the default operation class
|
38
38
|
def default_operation_namespace_for(model_name)
|
39
|
+
# binding.pry
|
39
40
|
desired_namespace = namespace_from_model(model_name)
|
40
41
|
parent_namespace = SkinnyControllers.operations_namespace
|
41
42
|
namespace = "#{parent_namespace}::#{desired_namespace}".safe_constantize
|
42
|
-
namespace ||
|
43
|
+
namespace || Namespace.create_namespace(desired_namespace)
|
43
44
|
end
|
44
45
|
|
46
|
+
|
47
|
+
|
45
48
|
# @example 'Object' => 'ObjectOperations'
|
46
49
|
# @return [String] the operation namespace based on the model name
|
47
50
|
def namespace_from_model(model_name)
|
@@ -18,7 +18,22 @@ module SkinnyControllers
|
|
18
18
|
|
19
19
|
def define_policy_class(name)
|
20
20
|
default_policy = SkinnyControllers::Policy::Default
|
21
|
-
Object
|
21
|
+
namespace_klass = Object
|
22
|
+
# if we are namespaced, we need to get / create the namespace if it doesn't exist already
|
23
|
+
if (name.include?('::'))
|
24
|
+
namespaces = name.split('::')
|
25
|
+
namespace = namespaces[0..-2].join('::').presence
|
26
|
+
namespace = namespace == name ? 'Object' : namespace
|
27
|
+
if (namespace.presence && namespace != name )
|
28
|
+
namespace_klass = Namespace.create_namespace(namespace)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# naw remove the namespace from the name
|
33
|
+
name = name.gsub(namespace_klass.name + '::', '')
|
34
|
+
|
35
|
+
# finally, define the new policy class
|
36
|
+
namespace_klass.const_set(name, default_policy.dup)
|
22
37
|
end
|
23
38
|
|
24
39
|
# @param [String] class_name name of the operation class
|
@@ -15,7 +15,7 @@ module SkinnyControllers
|
|
15
15
|
class Base
|
16
16
|
include ModelHelpers
|
17
17
|
|
18
|
-
attr_accessor :params, :current_user, :authorized_via_parent, :action, :params_for_action
|
18
|
+
attr_accessor :params, :current_user, :authorized_via_parent, :action, :params_for_action, :model_key
|
19
19
|
|
20
20
|
def self.run(current_user, params)
|
21
21
|
object = new(current_user, params)
|
@@ -26,12 +26,13 @@ module SkinnyControllers
|
|
26
26
|
# @param [Hash] controller_params the params hash raw from the controller
|
27
27
|
# @param [Hash] params_for_action optional params hash, generally the result of strong parameters
|
28
28
|
# @param [string] action the current action on the controller
|
29
|
-
def initialize(current_user, controller_params, params_for_action = nil, action = nil)
|
29
|
+
def initialize(current_user, controller_params, params_for_action = nil, action = nil, model_key = nil)
|
30
30
|
self.authorized_via_parent = false
|
31
31
|
self.current_user = current_user
|
32
32
|
self.action = action || controller_params[:action]
|
33
33
|
self.params = controller_params
|
34
34
|
self.params_for_action = params_for_action || controller_params
|
35
|
+
self.model_key = model_key
|
35
36
|
end
|
36
37
|
|
37
38
|
def id_from_params
|
data/lib/skinny_controllers.rb
CHANGED
@@ -7,6 +7,7 @@ require 'active_support/core_ext/string/inflections'
|
|
7
7
|
|
8
8
|
# files for this gem
|
9
9
|
require 'skinny_controllers/default_verbs'
|
10
|
+
require 'skinny_controllers/lookup/namespace'
|
10
11
|
require 'skinny_controllers/lookup/controller'
|
11
12
|
require 'skinny_controllers/lookup/model'
|
12
13
|
require 'skinny_controllers/lookup/operation'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: skinny_controllers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- L. Preston Sego III
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -191,6 +191,7 @@ files:
|
|
191
191
|
- lib/skinny_controllers/diet.rb
|
192
192
|
- lib/skinny_controllers/lookup/controller.rb
|
193
193
|
- lib/skinny_controllers/lookup/model.rb
|
194
|
+
- lib/skinny_controllers/lookup/namespace.rb
|
194
195
|
- lib/skinny_controllers/lookup/operation.rb
|
195
196
|
- lib/skinny_controllers/lookup/policy.rb
|
196
197
|
- lib/skinny_controllers/operation/base.rb
|
@@ -221,8 +222,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
221
222
|
version: '0'
|
222
223
|
requirements: []
|
223
224
|
rubyforge_project:
|
224
|
-
rubygems_version: 2.
|
225
|
+
rubygems_version: 2.5.1
|
225
226
|
signing_key:
|
226
227
|
specification_version: 4
|
227
|
-
summary: SkinnyControllers-0.
|
228
|
+
summary: SkinnyControllers-0.7.0
|
228
229
|
test_files: []
|