immutable_struct_ex_redactable 1.0.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -2
- data/Gemfile.lock +1 -1
- data/README.md +45 -6
- data/immutable_struct_ex_redactable.gemspec +1 -1
- data/lib/immutable_struct_ex_redactable/configuration.rb +16 -0
- data/lib/immutable_struct_ex_redactable/redacted_accessible.rb +28 -0
- data/lib/immutable_struct_ex_redactable/version.rb +1 -1
- data/lib/immutable_struct_ex_redactable.rb +11 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 321fc8418eb84c3fa0c62cb687e6811c2584c7f6a30575244b0b0468185bfbf3
|
4
|
+
data.tar.gz: dfeae468c5bdc53aaf6872e247c92bac995a736434ee0eff32acfb1a8970ad20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38f3992c16fd65c313a95988ac4dd76cba8c8765d9cba60b91fa97f94845f988c83c081ee8d4fa091946b3731c34935e91e2a1ccb7542dff1fe2319a47d867ac
|
7
|
+
data.tar.gz: 81a4e7d9caad199dcf5a207321ae1ba3f8122cb295cf3f396ca5c113e7ceb08565f327aea2ccbc57d858d60db5d53c39b2cdc718a5399f6d227fc913d9d9409b
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
-
## [1.
|
1
|
+
## [1.2.0] - 2022-10-03
|
2
|
+
* Changes
|
3
|
+
* Add `ImmutableStructExRedactable::Configuration#redacted_unsafe` property. If this property is `true`, redacted field values will be retained and accessible as private methods on the struct named `unredacted_<field>`.
|
4
|
+
* Update README.md file.
|
5
|
+
|
6
|
+
## [1.1.0] - 2022-10-02
|
7
|
+
* Changes
|
8
|
+
* Fix rubocop violations
|
2
9
|
|
3
|
-
-
|
10
|
+
## [1.0.0] - 2022-10-02
|
11
|
+
* Initial release
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -17,14 +17,13 @@
|
|
17
17
|
|
18
18
|
`immutable_struct_ex_redactable` maintains all the functionality of the *immutable_struct_ex* gem, but allows you to create immutable structs that can be configured to redact field values using standard gem configuration (`ImmutableStructExRedactable.configure { |config| ... }`) or by passing configuration options to the appropriate method (`ImmutableStructExRedactable.create_with(config, ...)`)
|
19
19
|
|
20
|
+
### Future Enhancements
|
21
|
+
- Future functionality will probably accept regex pattern for redacting field values (e.g. 'gen***@***.com').
|
22
|
+
|
20
23
|
## Usage
|
21
24
|
|
22
25
|
Follow the instructions for [Installation](#installation) first, to incorporate this gem into your code.
|
23
26
|
|
24
|
-
### Enhancements
|
25
|
-
- Future functionality may include regex pattern for redacting field values (e.g. 'gen***@***.com').
|
26
|
-
- Availability of redacted values as private fields/methods for use in `&blocks`.
|
27
|
-
|
28
27
|
### Basic usage
|
29
28
|
|
30
29
|
#### Configure Gem Global Defaults
|
@@ -58,9 +57,10 @@ ImmutableStructExRedactable.create(**fields)
|
|
58
57
|
=> #<struct first="Jane", last="Smith", password="[REDACTED]", dob="[REDACTED]">
|
59
58
|
|
60
59
|
```
|
61
|
-
NOTE: Setting the global defaults in the above manner will affect **every** *immutable_struct_ex_redactable* struct you create unless you override the global configuration options by passing a custom configuration.
|
62
60
|
|
63
|
-
|
61
|
+
NOTE: Setting the global defaults in the above manner will affect **every** *immutable_struct_ex_redactable* struct instance you create unless you override the global configuration options, by passing a custom configuration.
|
62
|
+
|
63
|
+
#### Overriding the Global Configuration Options
|
64
64
|
|
65
65
|
To override the global configuration options, you may do so by calling the `ImmutableStructExRedactable#create_with` method in the following manner:
|
66
66
|
|
@@ -83,6 +83,45 @@ ImmutableStructExRedactable.create_with(custom_config, **fields)
|
|
83
83
|
=> #<struct first="John", last="Smith", password="[NO WAY JOSE]", dob="[NO WAY JOSE]">
|
84
84
|
```
|
85
85
|
|
86
|
+
### Access to the Original Redacted Field Values
|
87
|
+
|
88
|
+
By default, *immutable_struct_ex_redactable* **will not** allow access to redacted field values; that is, field values marked for redaction via the global configuration (`ImmutableStructExRedactable::Configuration#redacted`) or by overriding the global configuration by passing a custom configuration (`ImmutableStructExRedactable.create_with(my_config, ...)`). However, if you really *need* access to redacted field values in their original, *un*redacted form, you can turn on the `ImmutableStructExRedactable::Configuration#redacted_unsafe` option in the global configuration or turn this same option on when passing a custom configuration. Turning the `redacted_unsafe` configuration option on in either scenario will instruct *immutable_struct_ex_redactable* to create *private methods* on structs created that will allow access to the original *un*redacted field values via `send:`. The *private methods* created that will allow access to the original *un*redacted field values, will have the following naming convention:
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
unredacted_<redacted field>
|
92
|
+
# Where <redacted field> == the Symbol of the redacted field.
|
93
|
+
# For example: unredacted_password, unredacted_dob, unredacted_ssn, etc.
|
94
|
+
```
|
95
|
+
|
96
|
+
For example:
|
97
|
+
|
98
|
+
```ruby
|
99
|
+
custom_config = ImmutableStructExRedactable::Configuration.new.tap do |config|
|
100
|
+
config.redacted_unsafe = true
|
101
|
+
end
|
102
|
+
|
103
|
+
hash = { username: 'jsmith', password: 'p@ssw0rd' }
|
104
|
+
struct = ImmutableStructExRedactable.create_with(custom_config, **hash) do
|
105
|
+
def to_h_unredacted
|
106
|
+
{
|
107
|
+
username: username,
|
108
|
+
password: send(:unredacted_password)
|
109
|
+
}
|
110
|
+
end
|
111
|
+
end
|
112
|
+
=> #<struct username="jsmith", password="******">
|
113
|
+
|
114
|
+
struct.unredacted_password
|
115
|
+
#=> NoMethodError: private method `unredacted_password' called for #<struct username="jsmith", password="******">...
|
116
|
+
|
117
|
+
struct.send :unredacted_password
|
118
|
+
#=> "p@ssw0rd"
|
119
|
+
|
120
|
+
struct.to_h_unredacted
|
121
|
+
#=> {:username=>"jsmith", :password=>"p@ssw0rd"}
|
122
|
+
|
123
|
+
```
|
124
|
+
|
86
125
|
### &blocks are Permitted
|
87
126
|
|
88
127
|
Current `immutable_struct_ex` gem functionality is still available, so passing `&block` is permitted. See [immutable_struct_ex](https://rubygems.org/gems/immutable_struct_ex) gem for more details:
|
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.email = ['public.gma@gmail.com']
|
10
10
|
|
11
11
|
spec.summary = 'The redactable version of the immutable_stuct_ex gem.'
|
12
|
-
spec.description = 'Creates and initializes an immutable struct in one and provides redaction.'
|
12
|
+
spec.description = 'Creates and initializes an immutable struct in one step and provides redaction functionality.'
|
13
13
|
spec.homepage = 'https://github.com/gangelo/immutable_struct_ex_redactable'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
spec.required_ruby_version = '>= 3.0.1'
|
@@ -38,17 +38,33 @@ module ImmutableStructExRedactable
|
|
38
38
|
# @return [String] the label that should replace redacted field values.
|
39
39
|
attr_accessor :redacted_label
|
40
40
|
|
41
|
+
# Gets/sets the redacted unsafe switch that determines whether or not
|
42
|
+
# redacted field values are retained as private methods named
|
43
|
+
# #unredacted_<field> on the struct returned. If this configuration
|
44
|
+
# property is true, redacted field values will be retained and
|
45
|
+
# accessible as private methods on the struct.
|
46
|
+
#
|
47
|
+
# The default is false.
|
48
|
+
#
|
49
|
+
# @return [Bool] the unsafe switch value.
|
50
|
+
attr_accessor :redacted_unsafe
|
51
|
+
|
41
52
|
# The constructor; calls {#reset}.
|
42
53
|
def initialize
|
43
54
|
reset
|
44
55
|
end
|
45
56
|
|
57
|
+
def redacted_unsafe?
|
58
|
+
@redacted_unsafe
|
59
|
+
end
|
60
|
+
|
46
61
|
# Resets the configuration settings to their default values.
|
47
62
|
#
|
48
63
|
# @return [void]
|
49
64
|
def reset
|
50
65
|
@redacted = %i[password]
|
51
66
|
@redacted_label = '******'
|
67
|
+
@redacted_unsafe = false
|
52
68
|
end
|
53
69
|
end
|
54
70
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ImmutableStructExRedactable
|
4
|
+
module RedactedAccessible
|
5
|
+
class << self
|
6
|
+
def included(base)
|
7
|
+
base.extend ClassModules
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassModules
|
12
|
+
def redacted_accessible_module_for(hash:, config:)
|
13
|
+
Module.new do
|
14
|
+
config.redacted.each do |attr|
|
15
|
+
unredacted_attr_method = "unredacted_#{attr}"
|
16
|
+
code = <<~CODE
|
17
|
+
def #{unredacted_attr_method}
|
18
|
+
"#{hash[attr]}"
|
19
|
+
end
|
20
|
+
private :#{unredacted_attr_method}
|
21
|
+
CODE
|
22
|
+
class_eval code
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -2,9 +2,12 @@
|
|
2
2
|
|
3
3
|
require 'immutable_struct_ex'
|
4
4
|
require_relative 'immutable_struct_ex_redactable/configuration'
|
5
|
+
require_relative 'immutable_struct_ex_redactable/redacted_accessible'
|
5
6
|
require_relative 'immutable_struct_ex_redactable/version'
|
6
7
|
|
7
8
|
module ImmutableStructExRedactable
|
9
|
+
include RedactedAccessible
|
10
|
+
|
8
11
|
module_function
|
9
12
|
|
10
13
|
def create(**hash, &block)
|
@@ -13,12 +16,19 @@ module ImmutableStructExRedactable
|
|
13
16
|
end
|
14
17
|
|
15
18
|
def create_with(config, **hash, &block)
|
19
|
+
if config.redacted_unsafe?
|
20
|
+
redacted_private_accessible_module =
|
21
|
+
redacted_accessible_module_for(hash: hash, config: config)
|
22
|
+
end
|
23
|
+
|
16
24
|
config.redacted.each do |attr|
|
17
25
|
next unless hash.key? attr
|
18
26
|
|
19
27
|
hash[attr] = config.redacted_label
|
20
28
|
end
|
21
29
|
|
22
|
-
ImmutableStructEx.new(**hash, &block)
|
30
|
+
ImmutableStructEx.new(**hash, &block).tap do |struct|
|
31
|
+
struct.extend(redacted_private_accessible_module) if config.redacted_unsafe?
|
32
|
+
end
|
23
33
|
end
|
24
34
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: immutable_struct_ex_redactable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gene M. Angelo, Jr.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-10-
|
11
|
+
date: 2022-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: immutable_struct_ex
|
@@ -24,7 +24,8 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.3.0
|
27
|
-
description: Creates and initializes an immutable struct in one and provides
|
27
|
+
description: Creates and initializes an immutable struct in one step and provides
|
28
|
+
redaction functionality.
|
28
29
|
email:
|
29
30
|
- public.gma@gmail.com
|
30
31
|
executables: []
|
@@ -46,6 +47,7 @@ files:
|
|
46
47
|
- immutable_struct_ex_redactable.gemspec
|
47
48
|
- lib/immutable_struct_ex_redactable.rb
|
48
49
|
- lib/immutable_struct_ex_redactable/configuration.rb
|
50
|
+
- lib/immutable_struct_ex_redactable/redacted_accessible.rb
|
49
51
|
- lib/immutable_struct_ex_redactable/version.rb
|
50
52
|
- sig/immutable_struct_ex_redactable.rbs
|
51
53
|
homepage: https://github.com/gangelo/immutable_struct_ex_redactable
|