An open API service indexing awesome lists of open source software.

https://github.com/jamesstonehill/anonymous

Data anonymization for ActiveRecord
https://github.com/jamesstonehill/anonymous

activerecord data-anonymization gem rails ruby rubygem

Last synced: 3 months ago
JSON representation

Data anonymization for ActiveRecord

Awesome Lists containing this project

README

          

# Anonymous
[![Gem Version](https://badge.fury.io/rb/anonymous.svg)](https://badge.fury.io/rb/anonymous)
[![Build Status](https://travis-ci.org/jamesstonehill/anonymous.svg?branch=master)](https://travis-ci.org/jamesstonehill/anonymous)

Anonymous is a light-weight gem that makes anonymizing ActiveRecord models easy!
Remember, friends don't let friends use production data in
staging/development.

## Installation

Add this line to your application's Gemfile:

```ruby
gem 'anonymous'
```

And then execute:

$ bundle

## Usage

### Usage With ActiveRecord
To use this gem in your ActiveRecord models you need to do two things.
1. Include the `Anonymous::ActiveRecord` module in your model
2. Define a private method `anonymization_definitions` with the anonymization
definitions inside it.

```ruby
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](https://github.com/stympy/faker).

```ruby
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.

```ruby
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`.

## Configuration

You can configure the gem to alter the anonymisation behaviour.

```ruby
# config/initializers/anonymous.rb

Anonymous.configure do |config|
config.max_anonymize_retries = 0
end
```

### Configuration Options

1. 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.

## Development

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](https://rubygems.org).

## Contributing

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.

## License

The gem is available as open source under the terms of the [MIT
License](https://opensource.org/licenses/MIT).