Anonymous is a light-weight gem that makes anonymizing ActiveRecord models easy! Remember, friends don't let friends use production data in staging/development.
Add this line to your application's Gemfile:
gem 'anonymous'
And then execute:
$ bundle
To use this gem in your ActiveRecord models you need to do two things.
- Include the
Anonymous::ActiveRecord
module in your model - Define a private method
anonymization_definitions
with the anonymization definitions inside it.
class User < ApplicationRecord
include Anonymous::ActiveRecord
private
def anonymization_definitions
{
name: ["Bob Dylan", "Tony Blair"].sample,
email: -> (user_email) { "fake_#{user_email}" },
phone_number: -> (phone) { phone[0..-4] + 3.times.map{rand(10)}.join },
}
end
end
The return value of anonymization_definitions
should be a Hash where the keys
are the names of the attribute to be anonymized and the values are either a
Proc
object or the value to be filled in for the anonymized attribute.
If you use a proc or lambda as the argument then the attribute value will be provided to you in the proc's first argument. This is useful when you want your anonymized value to be a transformation of the original.
It is recommended that you use this gem in conjunction with a fake data generation library like faker.
def anonymization_definitions
{
first_name: Faker::Name.first_name,
email: Faker::Internet.unique.email,
}
end
Then when you have set up the gem correctly you can call anonymize
and
anonymize!
on the model.
user = User.create(
name: "John Smith",
email: "john.smith@example.com",
phone_number: "+447875477389"
)
user.anonymize! # or user.anonymize
user.reload
user.email
=> "fake_john.smith@example.com"
user.name
=> "Bob Dylan"
user.phone_number
=> "+447875477412"
The only difference between anonymize!
and anonymize
is that the former
calls update_attributes!
and the latter calls update_attributes
.
You can configure the gem to alter the anonymisation behaviour.
# config/initializers/anonymous.rb
Anonymous.configure do |config|
config.max_anonymize_retries = 0
end
- max_anonymize_retries Under some situations (like if an RecordNotUnique error is raised when updating) the gem will retry the anonymization process. By default it will only do this once.
After checking out the repo, run bin/setup
to install dependencies. Then, run
bundle exec rake appraisal spec
to run the tests. You can also run
bin/console
for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install
.
To release a new version, update the version number in version.rb
, then run
bundle install
and bundle exec appraisal install
, and finally run bundle exec rake release
, which will create a git tag for the version, push git
commits and tags, and push the .gem
file to
rubygems.org.
Bug reports and pull requests are welcome on GitHub at https://github.com/jamesstonehill/anonymous.
Some ideas for feature contributions:
- Support for ORMs other than ActiveRecord.
- More comprehensive retry functionality in Anonymous::ActiveRecord. A the moment we only retry if we get an ActiveRecord::RecordNotUnique unique error. I didn't want to blindly rescue all errors, but it seems like that there are other times we would want to retry.
The gem is available as open source under the terms of the MIT License.