moderate_parameters 0.3.0 → 0.4.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
  SHA256:
3
- metadata.gz: 33118bf4c165859d1135b0628d3c1177560003900ea7637a4d97bb149f00fbef
4
- data.tar.gz: cef73308c79623677793428b8704e667eca870e2f4463ffc41efb878d030429d
3
+ metadata.gz: 7da243c4e3c3402126ab024168790ca875ce97288d783432ce7d7105aa0082a8
4
+ data.tar.gz: 981432f67a8d7a5e17e774dc171cc239ff2379059e164cd4e24f40b446e51a70
5
5
  SHA512:
6
- metadata.gz: 12d73a15669d2af4b6b579b1fe0905efb191bc3474bb174fb011b2065d1efbce9c91efcf9f379984139a506c85cdf1b34ca8966df6dbf996d57c8e291487ff31
7
- data.tar.gz: 68c48b72df1c5a99a7287330c4cfa2275c6cfdc8ccfc5c6af28db5b24e5b4bff232709e24c949a58d645fbb0ef1ea9fe0e751f7ad6e01c8c9348ab578eb3ff58
6
+ metadata.gz: f87a7a589852fccbc9dce81f5d4e041aeda5bbedbdadccd8a17599e5266a25cdc98b48047cf80886360c5f3e596b2b07aa705a2bd86f2ff575e929fac271740e
7
+ data.tar.gz: c0f48cd8721c99870af9229902bb26e7a3b805109afce9ea2fde53cce48266c546ccf267396db2780e1c34093556e63939db90fe0b399367e113394467b87af4
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- moderate_parameters (0.3.0)
4
+ moderate_parameters (0.4.0)
5
5
  actionpack (>= 4.2, < 6.1)
6
6
  activemodel (>= 4.2, < 6.1)
7
7
  activesupport (>= 4.2, < 6.1)
@@ -10,51 +10,51 @@ PATH
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- actionpack (6.0.2.1)
14
- actionview (= 6.0.2.1)
15
- activesupport (= 6.0.2.1)
13
+ actionpack (6.0.3.4)
14
+ actionview (= 6.0.3.4)
15
+ activesupport (= 6.0.3.4)
16
16
  rack (~> 2.0, >= 2.0.8)
17
17
  rack-test (>= 0.6.3)
18
18
  rails-dom-testing (~> 2.0)
19
19
  rails-html-sanitizer (~> 1.0, >= 1.2.0)
20
- actionview (6.0.2.1)
21
- activesupport (= 6.0.2.1)
20
+ actionview (6.0.3.4)
21
+ activesupport (= 6.0.3.4)
22
22
  builder (~> 3.1)
23
23
  erubi (~> 1.4)
24
24
  rails-dom-testing (~> 2.0)
25
25
  rails-html-sanitizer (~> 1.1, >= 1.2.0)
26
- activemodel (6.0.2.1)
27
- activesupport (= 6.0.2.1)
28
- activesupport (6.0.2.1)
26
+ activemodel (6.0.3.4)
27
+ activesupport (= 6.0.3.4)
28
+ activesupport (6.0.3.4)
29
29
  concurrent-ruby (~> 1.0, >= 1.0.2)
30
30
  i18n (>= 0.7, < 2)
31
31
  minitest (~> 5.1)
32
32
  tzinfo (~> 1.1)
33
- zeitwerk (~> 2.2)
33
+ zeitwerk (~> 2.2, >= 2.2.2)
34
34
  appraisal (2.2.0)
35
35
  bundler
36
36
  rake
37
37
  thor (>= 0.14.0)
38
38
  builder (3.2.4)
39
39
  coderay (1.1.2)
40
- concurrent-ruby (1.1.5)
40
+ concurrent-ruby (1.1.7)
41
41
  crass (1.0.6)
42
42
  diff-lcs (1.3)
43
43
  erubi (1.9.0)
44
- i18n (1.8.2)
44
+ i18n (1.8.5)
45
45
  concurrent-ruby (~> 1.0)
46
- loofah (2.4.0)
46
+ loofah (2.7.0)
47
47
  crass (~> 1.0.2)
48
48
  nokogiri (>= 1.5.9)
49
49
  method_source (0.9.2)
50
50
  mini_portile2 (2.4.0)
51
- minitest (5.14.0)
52
- nokogiri (1.10.7)
51
+ minitest (5.14.2)
52
+ nokogiri (1.10.10)
53
53
  mini_portile2 (~> 2.4.0)
54
54
  pry (0.12.2)
55
55
  coderay (~> 1.1.0)
56
56
  method_source (~> 0.9.0)
57
- rack (2.1.1)
57
+ rack (2.2.3)
58
58
  rack-test (1.1.0)
59
59
  rack (>= 1.0, < 3)
60
60
  rails-dom-testing (2.0.3)
@@ -62,13 +62,13 @@ GEM
62
62
  nokogiri (>= 1.6)
63
63
  rails-html-sanitizer (1.3.0)
64
64
  loofah (~> 2.3)
65
- railties (6.0.2.1)
66
- actionpack (= 6.0.2.1)
67
- activesupport (= 6.0.2.1)
65
+ railties (6.0.3.4)
66
+ actionpack (= 6.0.3.4)
67
+ activesupport (= 6.0.3.4)
68
68
  method_source
69
69
  rake (>= 0.8.7)
70
70
  thor (>= 0.20.3, < 2.0)
71
- rake (10.5.0)
71
+ rake (13.0.1)
72
72
  rspec (3.9.0)
73
73
  rspec-core (~> 3.9.0)
74
74
  rspec-expectations (~> 3.9.0)
@@ -86,9 +86,9 @@ GEM
86
86
  rspec-core (>= 2, < 4, != 2.12.0)
87
87
  thor (1.0.1)
88
88
  thread_safe (0.3.6)
89
- tzinfo (1.2.6)
89
+ tzinfo (1.2.7)
90
90
  thread_safe (~> 0.1)
91
- zeitwerk (2.2.2)
91
+ zeitwerk (2.4.0)
92
92
 
93
93
  PLATFORMS
94
94
  ruby
@@ -98,7 +98,7 @@ DEPENDENCIES
98
98
  bundler (~> 2.0)
99
99
  moderate_parameters!
100
100
  pry (~> 0.12.2)
101
- rake (~> 10.0)
101
+ rake (~> 13.0)
102
102
  rspec (~> 3.0)
103
103
  rspec_junit_formatter (= 0.4.1)
104
104
 
data/README.md CHANGED
@@ -5,6 +5,8 @@
5
5
 
6
6
  By [Hint.io](https://hint.io)
7
7
 
8
+ [![Gem Version](https://badge.fury.io/rb/moderate_parameters.svg)](https://badge.fury.io/rb/moderate_parameters) ![CI](https://github.com/hintmedia/moderate_parameters/workflows/CI/badge.svg) ![Appraisals](https://github.com/hintmedia/moderate_parameters/workflows/Appraisals/badge.svg) [![Maintainability](https://api.codeclimate.com/v1/badges/4971eb01d5bd98dbac8b/maintainability)](https://codeclimate.com/github/hintmedia/moderate_parameters/maintainability)
9
+
8
10
  In our experience with [UpgradeRails](https://www.upgraderails.com), the migration from [protected_attributes](https://github.com/rails/protected_attributes) to [strong_parameters](https://api.rubyonrails.org/classes/ActionController/StrongParameters.html) can leave more questions than answers. It can be difficult to determine what data is originating from within the app and what is coming from the internet.
9
11
 
10
12
  Moderate Parameters is a set of tools providing logging of data sources in the controller by extending `ActionController::Parameters` functionality.
@@ -111,7 +113,7 @@ end
111
113
 
112
114
  We can then hit submit data from the form at `/people/new` and see that no new lines are added to the `moderate_parameters.log` file.
113
115
 
114
- This means that we can remove `moderate_parameters` and move to using `permit` as a part of `strong_parameters`:
116
+ This means that we can remove `moderate_parameters` and move to using `permit` as the final migration step of `strong_parameters`:
115
117
 
116
118
  ```ruby
117
119
  class PeopleController < ActionController::Base
@@ -129,6 +131,17 @@ class PeopleController < ActionController::Base
129
131
  end
130
132
  ```
131
133
 
134
+ It is only _**AFTER**_ this final step of the `strong_parameters` migration has been completed that you can safely remove the `protected_attributes` line in the model:
135
+
136
+ ```ruby
137
+ class Person < ActiveRecord::Base
138
+ # attr_accessible :name, :age, :height
139
+
140
+ . . .
141
+
142
+ end
143
+ ```
144
+
132
145
  ## Contributing
133
146
 
134
147
  Bug reports and pull requests are welcome on GitHub at https://github.com/hintmedia/moderate_parameters. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
@@ -2,34 +2,90 @@
2
2
 
3
3
  module ModerateParameters
4
4
  module Breadcrumbs
5
- def [](key)
6
- internal_param_logging(key, 'read', caller_locations) if ModerateParameters.breadcrumbs_enabled
5
+ def []=(key, _value)
6
+ internal_param_logging(key, key?(key) ? 'overwritten' : 'added', caller_locations)
7
7
  super
8
8
  end
9
9
 
10
- def []=(key, value)
11
- internal_param_logging(key, 'overwritten', caller_locations) if ModerateParameters.breadcrumbs_enabled
10
+ def merge!(other_hash)
11
+ internal_method_logging('merge!', other_hash.keys, caller_locations)
12
+ super
13
+ end
14
+
15
+ def reverse_merge!(other_hash)
16
+ internal_method_logging('reverse_merge!', other_hash.keys, caller_locations)
12
17
  super
13
18
  end
14
19
 
15
20
  def extract!(*keys)
16
- internal_method_logging('extract!', keys, caller_locations) if ModerateParameters.breadcrumbs_enabled
21
+ internal_method_logging('extract!', keys, caller_locations)
22
+ super
23
+ end
24
+
25
+ def slice!(*keys)
26
+ internal_method_logging('slice!', keys, caller_locations)
27
+ super
28
+ end
29
+
30
+ def delete(*keys, &block)
31
+ internal_method_logging('delete', keys, caller_locations)
32
+ super
33
+ end
34
+
35
+ def reject!(&block)
36
+ internal_block_logging('reject!', caller_locations)
37
+ super
38
+ end
39
+
40
+ # Alias for #reject!
41
+ def delete_if(&block)
42
+ internal_block_logging('delete_if', caller_locations)
43
+ super
44
+ end
45
+
46
+ def select!(&block)
47
+ internal_block_logging('select!', caller_locations)
48
+ super
49
+ end
50
+
51
+ # Alias for #select!
52
+ def keep_if(&block)
53
+ internal_block_logging('keep_if', caller_locations)
17
54
  super
18
55
  end
19
56
 
20
57
  private
21
58
 
59
+ def needs_logged?
60
+ ModerateParameters.breadcrumbs_enabled &&
61
+ instance_variable_get(:@moderate_params_object_id) &&
62
+ !permitted?
63
+ end
64
+
22
65
  def internal_param_logging(key, action, stack_array)
66
+ return unless needs_logged?
67
+
23
68
  ActiveSupport::Notifications.instrument('moderate_parameters') do |payload|
24
69
  payload[:caller_locations] = stack_array
25
70
  payload[:message] = "#{key} is being #{action} on: #{stack_array.join("\n")}"
26
71
  end
27
72
  end
28
73
 
29
- def internal_method_logging(method, keys, stack_array)
74
+ def internal_method_logging(method, args, stack_array)
75
+ return unless needs_logged?
76
+
77
+ ActiveSupport::Notifications.instrument('moderate_parameters') do |payload|
78
+ payload[:caller_locations] = stack_array
79
+ payload[:message] = "#{method} is being called with #{args} on: #{stack_array.join("\n")}"
80
+ end
81
+ end
82
+
83
+ def internal_block_logging(method, stack_array)
84
+ return unless needs_logged?
85
+
30
86
  ActiveSupport::Notifications.instrument('moderate_parameters') do |payload|
31
87
  payload[:caller_locations] = stack_array
32
- payload[:message] = "#{method} is being called with #{keys} on: #{stack_array.join("\n")}"
88
+ payload[:message] = "#{method} is being called with a block on: #{stack_array.join("\n")}"
33
89
  end
34
90
  end
35
91
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- $moderate_parameters_logger = ModerateParameters.logger || ActiveSupport::Logger.new('/dev/null')
4
-
5
3
  ActiveSupport::Notifications.subscribe('moderate_parameters') do |_, _, _, _, payload|
6
- $moderate_parameters_logger.info "#{payload[:controller]}##{payload[:action]} #{payload[:message]}"
4
+ (ModerateParameters.logger || ActiveSupport::Logger.new('/dev/null')).info(
5
+ "#{payload[:controller]}##{payload[:action]} #{payload[:message]}"
6
+ )
7
7
  end
@@ -2,7 +2,17 @@
2
2
 
3
3
  module ModerateParameters
4
4
  module Parameters
5
+ MP_OBJECT_ID = :@moderate_params_object_id
6
+ MP_PARENT_KEY = :@moderate_params_parent_key
7
+
5
8
  def moderate(controller_name, action, *filters)
9
+ log_duplicate_moderate_warning(
10
+ caller_locations,
11
+ instance_variable_get(MP_PARENT_KEY),
12
+ controller_name,
13
+ action
14
+ ) if instance_variable_get(MP_OBJECT_ID)
15
+
6
16
  params = self.class.new
7
17
 
8
18
  filters.each do |filter|
@@ -19,7 +29,15 @@ module ModerateParameters
19
29
  end
20
30
 
21
31
  incoming_params_logging(params, controller_name, action)
22
- permit!
32
+ duplicate_params = dup
33
+ instance_variable_set(MP_OBJECT_ID, duplicate_params.object_id)
34
+ duplicate_params.permit!
35
+ end
36
+
37
+ def require(key)
38
+ return super if key.is_a?(Array) || self[key].blank?
39
+ self[key].instance_variable_set(MP_PARENT_KEY, key)
40
+ super
23
41
  end
24
42
 
25
43
  private
@@ -38,6 +56,12 @@ module ModerateParameters
38
56
  end
39
57
  end
40
58
 
59
+ def log_duplicate_moderate_warning(stack_array, parent_key, controller_name, action)
60
+ write_to_log(message: ".moderate has already been called on params.require(:#{parent_key}): #{stack_array.join("\n")}",
61
+ action: action,
62
+ controller: controller_name)
63
+ end
64
+
41
65
  def non_scalar_value_filter(params, key, controller_name, action)
42
66
  if has_key?(key) && !permitted_scalar?(self[key])
43
67
  params[key] = self[key].class.new
@@ -47,6 +71,14 @@ module ModerateParameters
47
71
  end
48
72
  end
49
73
 
74
+ def array_of_permitted_scalars?(value)
75
+ if value.is_a?(Array) && value.all? { |element| permitted_scalar?(element) }
76
+ return true unless block_given?
77
+
78
+ yield value
79
+ end
80
+ end
81
+
50
82
  def non_scalar?(value)
51
83
  value.is_a?(Array) || value.is_a?(Parameters)
52
84
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ModerateParameters
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
@@ -43,7 +43,7 @@ Gem::Specification.new do |spec|
43
43
 
44
44
  spec.add_development_dependency 'bundler', '~> 2.0'
45
45
  spec.add_development_dependency 'pry', '~> 0.12.2'
46
- spec.add_development_dependency 'rake', '~> 10.0'
46
+ spec.add_development_dependency 'rake', '~> 13.0'
47
47
  spec.add_development_dependency 'rspec', '~> 3.0'
48
48
  spec.add_development_dependency 'rspec_junit_formatter', '0.4.1'
49
49
  spec.add_development_dependency 'appraisal', '2.2.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moderate_parameters
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kyle Boe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-22 00:00:00.000000000 Z
11
+ date: 2020-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
@@ -124,14 +124,14 @@ dependencies:
124
124
  requirements:
125
125
  - - "~>"
126
126
  - !ruby/object:Gem::Version
127
- version: '10.0'
127
+ version: '13.0'
128
128
  type: :development
129
129
  prerelease: false
130
130
  version_requirements: !ruby/object:Gem::Requirement
131
131
  requirements:
132
132
  - - "~>"
133
133
  - !ruby/object:Gem::Version
134
- version: '10.0'
134
+ version: '13.0'
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: rspec
137
137
  requirement: !ruby/object:Gem::Requirement