Easily redact your ActiveRecord Models. Great for use when you use production data in staging or dev. Simply set the redaction type of the attributes you want to redact and run via the console or the included rake task.
redaction uses Faker under the hood to generate redacted data.
NOTE: This is currently very much in beta. Use at your own risk.
Add this line to your application's Gemfile:
gem "redaction"And then execute:
$ bundle installTo "redact" a models attribute add:
class Model < ApplicationRecord
redacts :<attribute>, with: :<redactor_type>
end<redactor_type> can be a symbol, proc, or custom class. See Redactor Types for more information.
redacts accepts multiple attributes, provided they all use the same redactor type. i.e.:
class User < ApplicationRecord
redacts :first_name, :last_name, with: :name
endredaction comes with a few different redactor types:
| Type | Generates |
|---|---|
:basic |
A Sentence |
:basic_html |
An HTML snippet with strong and em tags wrapping some of the words |
:email |
A safe (will not send) email address |
:html |
Multiple HTML Paragraphs with a random amount of link tags, strong tags, and em tags |
:name |
A person first/last name |
:phone |
A phone number |
:text |
Multiple paragraphs |
To use a built in redactor type set the with: option of a redacts call to the appropriate symbol.
A Proc :with value is given two arguments: the record being redacted, and a hash with the :attribute key-value pair.
class Model < ApplicationRecord
redacts :attribute, with: -> (record, data) { record.id }
endwould cause Model#attribute to be set to Model#id after redaction
Add a folder in app/, redactors/ is suggested, and put custom redactors in there. A custom redactor should inherit from Redaction::Types::Base and should define a content method. Like so:
# app/redactors/custom_redactor.rb
class CustomRedactor < Redaction::Types::Base
def content
"Some Custom Value"
end
endand then to use it:
class Model < ApplicationRecord
redacts :attribute, with: CustomRedactor
endwould cause Model#attribute to be set to "Some Custom Value" after redaction.
Custom redactor types also get access to the record being redacted via record, and a hash with the :attribute key-value pair via data
There are two ways to preform the redaction.
rails redaction:redactThis will target all the models with redacted attributes. To target specific models run:
rails redaction:redact MODELS=User,PostThis will only redact the User and Post Models
Redaction.redact!This will target all the models with redacted attributes. To target specific models run:
Redaction.redact!(models: ["User", "Post"])This will only redact the User and Post Models
By default, preforming a redaction does not trigger validations or update the updated_at attribute.
Callbacks can be skipped with the :redacting? method. i.e.:
class User < ApplicationRecord
after_save :do_something, unless: :redacting?
redacts :first_name, :last_name, with: :name
endRedaction has the following configuration options:
| Option | Default | Description |
|---|---|---|
email_domain |
nil |
Set to a string to use a custom domain for redacted emails. i.e. `Redaction.config.email_domain = "my-domain.dev" |
progress_bar |
true |
Set to false to not use the built in progress bar when redacting |
force_redaction |
false |
Set to true to alway fill a column with redacted content even if the attribute is nil or empty |
It is reccomended that you put your configuration in an initializer like config/initializers/redaction.rb
- Raise Error or at least a message when skipping a passed in Model
- Configuration (touch, email domains, etc)
- Better Documentation
- More types
- Release v1.0 as a real gem
Bug reports and pull requests are welcome on GitHub at drbragg/redaction. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.
The gem is available as open source under the terms of the MIT License.
redaction leans heavily on the awesome Faker gem. If not for their hard work this would be a much different and probably more complex project. If you like redaction please consider sending them a thank you or contributing to the gem.