active_params 0.1.1 → 1.0.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 +35 -0
- data/lib/active_params.rb +25 -73
- data/lib/active_params/controller.rb +61 -0
- data/lib/active_params/parser.rb +41 -0
- data/lib/active_params/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89e4ec3b12048b26afb3516aad053d9bd624b77c
|
4
|
+
data.tar.gz: b036a0b06d54324fc28335d3ad106a4772af290d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2dfc110db66b78be2d862e8e41f4e621e680d7028c78256087349f413fc2bf0a5bc9a99e22986ea600fcac47fe5db5c3964caaede6e687f380ebeba7f52cae53
|
7
|
+
data.tar.gz: d821671fb2ea4db41c0cd0fd10473e635739e0f1c81b05d0b2fc062291f740b5cdea9597b1b25d815ad0f4661ba59d662677b548aad9e8e408bb1117e2cc47ba
|
data/README.md
CHANGED
@@ -91,6 +91,41 @@ end
|
|
91
91
|
|
92
92
|
When you create new features for your app & try them out in development mode, `config/active_params.json` will be automatically updated. When you commit your code, include the changes to `config/active_params.json` too.
|
93
93
|
|
94
|
+
### Static Customizations
|
95
|
+
|
96
|
+
You can add a `config/initializers/active_params.rb` file in your Rails app, and perform a global config like this
|
97
|
+
|
98
|
+
```ruby
|
99
|
+
ActiveParams.config do |config|
|
100
|
+
config.writing = Rails.env.development?
|
101
|
+
config.path = "config/active_params.json"
|
102
|
+
config.scope = proc { |controller|
|
103
|
+
"#{controller.request.method} #{controller.controller_name}/#{controller.action_name}"
|
104
|
+
}
|
105
|
+
end
|
106
|
+
```
|
107
|
+
|
108
|
+
### Dynamic Customizations
|
109
|
+
|
110
|
+
Each controller may need its own config, e.g. some strong params are only permitted for certain current_user roles. For such controllers, use the `include ActiveParams.setup(...)` syntax instead
|
111
|
+
|
112
|
+
```ruby
|
113
|
+
class ApplicationController < ActionController::Base
|
114
|
+
include ActiveParams.setup({
|
115
|
+
path: "tmp/strong_params.json",
|
116
|
+
writing: !Rails.env.production?,
|
117
|
+
scope: proc {|ctrl|
|
118
|
+
[ctrl.current_user.role, ActiveParams.scope.(ctrl)].join('@')
|
119
|
+
},
|
120
|
+
})
|
121
|
+
end
|
122
|
+
```
|
123
|
+
|
124
|
+
You can setup
|
125
|
+
- where the config file is stored
|
126
|
+
- if you want to write to the config file
|
127
|
+
- how should strong params be scoped
|
128
|
+
|
94
129
|
## LICENSE
|
95
130
|
|
96
131
|
MIT
|
data/lib/active_params.rb
CHANGED
@@ -1,86 +1,38 @@
|
|
1
1
|
require "active_params/version"
|
2
|
+
require "active_params/parser"
|
3
|
+
require "active_params/controller"
|
2
4
|
|
3
5
|
module ActiveParams
|
4
|
-
|
5
|
-
|
6
|
-
params.each do |k,v|
|
7
|
-
case result = ActiveParams.strong_params_definition_for(v)
|
8
|
-
when Array, Hash
|
9
|
-
current_config[k] = result
|
10
|
-
end
|
11
|
-
end
|
12
|
-
open(ActiveParams.path, "wb") {|f| f.write(JSON.pretty_generate(global_config)) }
|
13
|
-
yield
|
14
|
-
end
|
6
|
+
class << self
|
7
|
+
attr_accessor :writing, :path, :scope
|
15
8
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
params.each do |k,v|
|
20
|
-
if result = current_config[k]
|
21
|
-
params[k] = params.require(k).permit(result)
|
22
|
-
end
|
9
|
+
# ActiveParams.config {|c| .... }
|
10
|
+
def config
|
11
|
+
yield self
|
23
12
|
end
|
24
|
-
yield
|
25
|
-
end
|
26
13
|
|
27
|
-
|
28
|
-
|
29
|
-
base.
|
30
|
-
around_action :write_strong_params if ActiveParams.development_mode?
|
31
|
-
around_action :apply_strong_params
|
32
|
-
end
|
14
|
+
# `include ActiveParams` use default settings
|
15
|
+
def included(base)
|
16
|
+
base.send(:include, setup)
|
33
17
|
end
|
34
|
-
end
|
35
18
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
ENV.fetch("ACTIVE_PARAMS_PATH", "config/active_params.json")
|
42
|
-
end
|
43
|
-
|
44
|
-
def self.global_config
|
45
|
-
@@global_config ||= (File.exists?(ActiveParams.path) ? JSON.parse(IO.read ActiveParams.path) : {})
|
46
|
-
ensure
|
47
|
-
# undo cache in development mode
|
48
|
-
@@global_config = nil if development_mode?
|
49
|
-
end
|
50
|
-
|
51
|
-
# to obtain a hash of all possible keys
|
52
|
-
def self.combine_hashes(array_of_hashes)
|
53
|
-
array_of_hashes.select {|v| v.kind_of?(Hash) }.
|
54
|
-
inject({}) {|sum, hash| hash.inject(sum) {|sum,(k,v)| sum.merge(k => v) } }
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.strong_params_definition_for(params)
|
58
|
-
if params.kind_of?(Array)
|
59
|
-
combined_hash = combine_hashes(params)
|
60
|
-
if combined_hash.empty?
|
61
|
-
[]
|
62
|
-
else
|
63
|
-
strong_params_definition_for(combined_hash)
|
64
|
-
end
|
65
|
-
elsif params.respond_to?(:keys) # Hash, ActionController::Parameters
|
66
|
-
values, arrays = [[], {}]
|
67
|
-
params.each do |key, value|
|
68
|
-
case value
|
69
|
-
when Array
|
70
|
-
arrays[key] = strong_params_definition_for(value)
|
71
|
-
when Hash
|
72
|
-
arrays[key] = strong_params_definition_for(combine_hashes(value.values))
|
73
|
-
else
|
74
|
-
values.push(key)
|
19
|
+
# `include ActiveParams.setup({...})` customize
|
20
|
+
def setup(options = {})
|
21
|
+
Module.new do
|
22
|
+
def self.included(base)
|
23
|
+
base.send(:include, ActiveParams::Controller)
|
75
24
|
end
|
25
|
+
end.tap do |m|
|
26
|
+
m.send(:define_method, :active_params_options) { options }
|
76
27
|
end
|
77
|
-
if arrays.empty?
|
78
|
-
values
|
79
|
-
else
|
80
|
-
[*values.sort, arrays]
|
81
|
-
end
|
82
|
-
else
|
83
|
-
params
|
84
28
|
end
|
85
29
|
end
|
86
30
|
end
|
31
|
+
|
32
|
+
ActiveParams.config do |config|
|
33
|
+
config.writing = defined?(Rails) && Rails.env.development?
|
34
|
+
config.path = "config/active_params.json"
|
35
|
+
config.scope = proc { |controller|
|
36
|
+
"#{controller.request.method} #{controller.controller_name}/#{controller.action_name}"
|
37
|
+
}
|
38
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require "json"
|
2
|
+
|
3
|
+
module ActiveParams
|
4
|
+
module Controller
|
5
|
+
def self.included(base)
|
6
|
+
add_before_method =
|
7
|
+
(base.methods.include?(:before_action) && :before_action) ||
|
8
|
+
(base.methods.include?(:before_filter) && :before_filter)
|
9
|
+
|
10
|
+
if add_before_method
|
11
|
+
base.class_eval do
|
12
|
+
send add_before_method, :active_params_write, if: :active_params_writing?
|
13
|
+
send add_before_method, :active_params_apply
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def active_params_writing?
|
19
|
+
active_params_options[:writing] || ActiveParams.writing
|
20
|
+
end
|
21
|
+
|
22
|
+
def active_params_path
|
23
|
+
active_params_options[:path] || ActiveParams.path
|
24
|
+
end
|
25
|
+
|
26
|
+
def active_params_json
|
27
|
+
@@active_params_json ||= (File.exists?(active_params_path) ? JSON.parse(IO.read active_params_path) : {})
|
28
|
+
rescue JSON::ParserError
|
29
|
+
return {}
|
30
|
+
ensure
|
31
|
+
# undo cache in development mode
|
32
|
+
@@active_params_json = nil if active_params_writing?
|
33
|
+
end
|
34
|
+
|
35
|
+
def active_params_scope
|
36
|
+
scope = active_params_options[:scope] || ActiveParams.scope
|
37
|
+
scope.respond_to?(:call) ? scope.(self) : scope
|
38
|
+
end
|
39
|
+
|
40
|
+
def active_params_write(global_json: active_params_json)
|
41
|
+
scoped_json = global_json[active_params_scope] ||= {}
|
42
|
+
params.each do |k,v|
|
43
|
+
case result = ActiveParams::Parser.strong_params_definition_for(v)
|
44
|
+
when Array, Hash
|
45
|
+
scoped_json[k] = result
|
46
|
+
end
|
47
|
+
end
|
48
|
+
open(active_params_path, "wb") {|f| f.write(JSON.pretty_generate(global_json)) }
|
49
|
+
end
|
50
|
+
|
51
|
+
def active_params_apply(global_json: active_params_json)
|
52
|
+
# e.g. POST users#update
|
53
|
+
scoped_json = global_json[active_params_scope] ||= {}
|
54
|
+
params.each do |k,v|
|
55
|
+
if result = scoped_json[k]
|
56
|
+
params[k] = params.require(k).permit(result)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module ActiveParams
|
2
|
+
module Parser
|
3
|
+
# to obtain a hash of all possible keys
|
4
|
+
def combine_hashes(array_of_hashes)
|
5
|
+
array_of_hashes.select {|v| v.kind_of?(Hash) }.
|
6
|
+
inject({}) {|sum, hash| hash.inject(sum) {|sum,(k,v)| sum.merge(k => v) } }
|
7
|
+
end
|
8
|
+
|
9
|
+
def strong_params_definition_for(params)
|
10
|
+
if params.kind_of?(Array)
|
11
|
+
combined_hash = combine_hashes(params)
|
12
|
+
if combined_hash.empty?
|
13
|
+
[]
|
14
|
+
else
|
15
|
+
strong_params_definition_for(combined_hash)
|
16
|
+
end
|
17
|
+
elsif params.respond_to?(:keys) # Hash, ActionController::Parameters
|
18
|
+
values, arrays = [[], {}]
|
19
|
+
params.each do |key, value|
|
20
|
+
case value
|
21
|
+
when Array
|
22
|
+
arrays[key] = strong_params_definition_for(value)
|
23
|
+
when Hash
|
24
|
+
arrays[key] = strong_params_definition_for(combine_hashes(value.values))
|
25
|
+
else
|
26
|
+
values.push(key)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
if arrays.empty?
|
30
|
+
values
|
31
|
+
else
|
32
|
+
[*values.sort, arrays]
|
33
|
+
end
|
34
|
+
else
|
35
|
+
params
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
self.extend(self)
|
40
|
+
end
|
41
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_params
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- choonkeat
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -69,6 +69,8 @@ files:
|
|
69
69
|
- bin/console
|
70
70
|
- bin/setup
|
71
71
|
- lib/active_params.rb
|
72
|
+
- lib/active_params/controller.rb
|
73
|
+
- lib/active_params/parser.rb
|
72
74
|
- lib/active_params/version.rb
|
73
75
|
homepage: http://github.com/choonkeat/active_params
|
74
76
|
licenses: []
|
@@ -89,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
89
91
|
version: '0'
|
90
92
|
requirements: []
|
91
93
|
rubyforge_project:
|
92
|
-
rubygems_version: 2.
|
94
|
+
rubygems_version: 2.6.7
|
93
95
|
signing_key:
|
94
96
|
specification_version: 4
|
95
97
|
summary: Automatic strong parameters
|