attr_masker 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +11 -0
- data/CHANGELOG.adoc +7 -0
- data/README.adoc +6 -6
- data/attr_masker.gemspec +2 -0
- data/gemfiles/Rails-4.0.gemfile +1 -3
- data/gemfiles/Rails-4.1.gemfile +1 -3
- data/gemfiles/Rails-4.2.gemfile +1 -3
- data/gemfiles/Rails-5.0.gemfile +1 -3
- data/gemfiles/Rails-5.1.gemfile +1 -3
- data/gemfiles/Rails-head.gemfile +1 -3
- data/gemfiles/common.gemfile +5 -0
- data/lib/attr_masker.rb +1 -1
- data/lib/attr_masker/maskers/simple.rb +4 -2
- data/lib/attr_masker/model.rb +1 -1
- data/lib/attr_masker/performer.rb +26 -6
- data/lib/attr_masker/version.rb +2 -2
- data/lib/tasks/db.rake +8 -1
- data/spec/dummy/config/mongoid.yml +33 -0
- data/spec/features/active_record_spec.rb +28 -0
- data/spec/features/mongoid_spec.rb +36 -0
- data/spec/{features_spec.rb → features/shared_examples.rb} +2 -8
- data/spec/spec_helper.rb +1 -3
- data/spec/support/00_mongoid_env.rb +9 -0
- data/spec/support/20_combustion.rb +10 -0
- data/spec/support/db_cleaner.rb +11 -2
- data/spec/unit/maskers/simple_spec.rb +2 -2
- metadata +29 -6
- data/spec/support/0_combustion.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84f6dabd5fc0ea9d919da16d60ca4b06c46b2c97
|
4
|
+
data.tar.gz: 72d8b8eeb8eb59a24c7613c752fb8c2175be566f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0274cb6920ce73043fff153a27c8140cfb3fa9ec095a020c1fe5f4180e1339d0ad75bb41cccf5a68573d351b3fb4b98ced45829ff836729e2c7966a8b9b3316e
|
7
|
+
data.tar.gz: 3e13de85e38714f92b9a10cbdcae9178ea6bf81ebca353b63e764ed33d797e759cb489803ee22f006883548b9d2ca1daad2ee2ceb17658da16d92f9097651015
|
data/.travis.yml
CHANGED
@@ -3,6 +3,9 @@ dist: trusty
|
|
3
3
|
language: ruby
|
4
4
|
before_install: gem install bundler -v 1.15.1
|
5
5
|
|
6
|
+
services:
|
7
|
+
- mongodb
|
8
|
+
|
6
9
|
script:
|
7
10
|
- bundle exec rspec
|
8
11
|
|
@@ -26,6 +29,14 @@ matrix:
|
|
26
29
|
gemfile: "gemfiles/Rails-4.1.gemfile"
|
27
30
|
- rvm: "2.2"
|
28
31
|
gemfile: "gemfiles/Rails-4.0.gemfile"
|
32
|
+
- rvm: "2.4"
|
33
|
+
gemfile: "gemfiles/Rails-5.1.gemfile"
|
34
|
+
env:
|
35
|
+
- WITHOUT_ACTIVE_RECORD: "1"
|
36
|
+
- rvm: "2.4"
|
37
|
+
gemfile: "gemfiles/Rails-5.1.gemfile"
|
38
|
+
env:
|
39
|
+
- WITHOUT_MONGOID: "1"
|
29
40
|
|
30
41
|
allow_failures:
|
31
42
|
- rvm: "ruby-head"
|
data/CHANGELOG.adoc
CHANGED
data/README.adoc
CHANGED
@@ -6,13 +6,13 @@
|
|
6
6
|
image:https://img.shields.io/gem/v/attr_masker.svg["Gem Version", link="https://rubygems.org/gems/attr_masker"]
|
7
7
|
image:https://img.shields.io/travis/riboseinc/attr_masker/master.svg["Build Status", link="https://travis-ci.org/riboseinc/attr_masker"]
|
8
8
|
|
9
|
-
Mask ActiveRecord data with ease!
|
9
|
+
Mask ActiveRecord/Mongoid data with ease!
|
10
10
|
|
11
11
|
== Introduction
|
12
12
|
|
13
13
|
This gem is intended to mask sensitive data so that production database dumps
|
14
|
-
can be used in staging or test environments. It works with
|
15
|
-
and
|
14
|
+
can be used in staging or test environments. It works with Rails 4+ and modern
|
15
|
+
Rubies. It supports Active Record and Mongoid models.
|
16
16
|
|
17
17
|
== Getting started
|
18
18
|
|
@@ -76,7 +76,7 @@ gem to soft-delete your data, records marked as deleted will be masked as well.
|
|
76
76
|
|
77
77
|
=== Using custom maskers
|
78
78
|
|
79
|
-
By default, data is maksed with `AttrMasker::Maskers::
|
79
|
+
By default, data is maksed with `AttrMasker::Maskers::Simple` masker which
|
80
80
|
always returns `"(redacted)"` string. But anything what responds to `#call`
|
81
81
|
can be used instead: a lambda, `Method` instance, and more. You can specify it
|
82
82
|
by setting the `:masker` option.
|
@@ -100,7 +100,7 @@ customize masker's behaviour.
|
|
100
100
|
|
101
101
|
Attr Masker comes with several built-in maskers.
|
102
102
|
|
103
|
-
`AttrMasker::Maskers::
|
103
|
+
`AttrMasker::Maskers::Simple`::
|
104
104
|
+
|
105
105
|
Simply replaces any value with the `"(redacted)"`. Only useful for columns
|
106
106
|
containing textual data.
|
@@ -112,7 +112,7 @@ Example:
|
|
112
112
|
[source,ruby]
|
113
113
|
----
|
114
114
|
attr_masker :first_name
|
115
|
-
attr_masker :last_name, :masker => AttrMasker::Maskers::
|
115
|
+
attr_masker :last_name, :masker => AttrMasker::Maskers::Simple.new
|
116
116
|
----
|
117
117
|
+
|
118
118
|
Would set both `first_name` and `last_name` attributes to `"(redacted)"`.
|
data/attr_masker.gemspec
CHANGED
@@ -27,6 +27,8 @@ Gem::Specification.new do |gem|
|
|
27
27
|
gem.add_development_dependency("bundler", "~> 1.15")
|
28
28
|
gem.add_development_dependency("combustion", "~> 0.7.0")
|
29
29
|
gem.add_development_dependency("database_cleaner", "~> 1.6")
|
30
|
+
# Older versions aren't needed as we don't support Rails < 4
|
31
|
+
gem.add_development_dependency("mongoid", ">= 5")
|
30
32
|
gem.add_development_dependency("pry")
|
31
33
|
gem.add_development_dependency("rspec", ">= 3.0")
|
32
34
|
gem.add_development_dependency("rubocop", "~> 0.49.1")
|
data/gemfiles/Rails-4.0.gemfile
CHANGED
data/gemfiles/Rails-4.1.gemfile
CHANGED
data/gemfiles/Rails-4.2.gemfile
CHANGED
data/gemfiles/Rails-5.0.gemfile
CHANGED
data/gemfiles/Rails-5.1.gemfile
CHANGED
data/gemfiles/Rails-head.gemfile
CHANGED
data/lib/attr_masker.rb
CHANGED
data/lib/attr_masker/model.rb
CHANGED
@@ -2,12 +2,8 @@
|
|
2
2
|
#
|
3
3
|
module AttrMasker
|
4
4
|
module Performer
|
5
|
-
class
|
5
|
+
class Base
|
6
6
|
def mask
|
7
|
-
unless defined? ::ActiveRecord
|
8
|
-
raise AttrMasker::Error, "ActiveRecord undefined. Nothing to do!"
|
9
|
-
end
|
10
|
-
|
11
7
|
# Do not want production environment to be masked!
|
12
8
|
#
|
13
9
|
if Rails.env.production?
|
@@ -44,7 +40,7 @@ module AttrMasker
|
|
44
40
|
acc.merge!(column_name => masker_value)
|
45
41
|
end
|
46
42
|
|
47
|
-
|
43
|
+
make_update instance, updates unless updates.empty?
|
48
44
|
end
|
49
45
|
|
50
46
|
def progressbar_for_model(klass)
|
@@ -59,10 +55,34 @@ module AttrMasker
|
|
59
55
|
ensure
|
60
56
|
bar.finish
|
61
57
|
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class ActiveRecord < Base
|
61
|
+
def dependencies_available?
|
62
|
+
defined? ::ActiveRecord
|
63
|
+
end
|
62
64
|
|
63
65
|
def all_models
|
64
66
|
::ActiveRecord::Base.descendants.select(&:table_exists?)
|
65
67
|
end
|
68
|
+
|
69
|
+
def make_update(instance, updates)
|
70
|
+
instance.class.all.unscoped.update(instance.id, updates)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
class Mongoid < Base
|
75
|
+
def dependencies_available?
|
76
|
+
defined? ::Mongoid
|
77
|
+
end
|
78
|
+
|
79
|
+
def all_models
|
80
|
+
::Mongoid.models
|
81
|
+
end
|
82
|
+
|
83
|
+
def make_update(instance, updates)
|
84
|
+
instance.class.all.unscoped.where(id: instance.id).update(updates)
|
85
|
+
end
|
66
86
|
end
|
67
87
|
end
|
68
88
|
end
|
data/lib/attr_masker/version.rb
CHANGED
@@ -5,8 +5,8 @@ module AttrMasker
|
|
5
5
|
# Contains information about this gem's version
|
6
6
|
module Version
|
7
7
|
MAJOR = 0
|
8
|
-
MINOR =
|
9
|
-
PATCH =
|
8
|
+
MINOR = 2
|
9
|
+
PATCH = 0
|
10
10
|
|
11
11
|
# Returns a version string by joining <tt>MAJOR</tt>, <tt>MINOR</tt>, and
|
12
12
|
# <tt>PATCH</tt> with <tt>'.'</tt>
|
data/lib/tasks/db.rake
CHANGED
@@ -16,6 +16,13 @@ namespace :db do
|
|
16
16
|
# http://stackoverflow.com/questions/14163938/activerecordconnectionnotestablished-within-a-rake-task
|
17
17
|
#
|
18
18
|
task :mask => :environment do
|
19
|
-
AttrMasker::Performer::
|
19
|
+
performers = AttrMasker::Performer::Base.descendants.map(&:new)
|
20
|
+
performers.select!(&:dependencies_available?)
|
21
|
+
|
22
|
+
if performers.empty?
|
23
|
+
raise AttrMasker::Error, "No supported database!"
|
24
|
+
end
|
25
|
+
|
26
|
+
performers.each(&:mask)
|
20
27
|
end
|
21
28
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Heavily based on Mongoid's test suite
|
2
|
+
# https://github.com/mongodb/mongoid/blob/v6.2.0/spec/config/mongoid.yml
|
3
|
+
test:
|
4
|
+
clients:
|
5
|
+
default:
|
6
|
+
database: attr_masker_test
|
7
|
+
hosts:
|
8
|
+
- <%=ENV["MONGOID_SPEC_HOST"]%>:<%=ENV["MONGOID_SPEC_PORT"]%>
|
9
|
+
options:
|
10
|
+
auth_source: "admin"
|
11
|
+
read:
|
12
|
+
mode: :primary_preferred
|
13
|
+
tag_sets:
|
14
|
+
- use: web
|
15
|
+
max_pool_size: 1
|
16
|
+
reports:
|
17
|
+
database: reports
|
18
|
+
hosts:
|
19
|
+
- <%=ENV["MONGOID_SPEC_HOST"]%>:<%=ENV["MONGOID_SPEC_PORT"]%>
|
20
|
+
options:
|
21
|
+
user: "mongoid-user"
|
22
|
+
password: "password"
|
23
|
+
auth_source: "admin"
|
24
|
+
options:
|
25
|
+
include_root_in_json: false
|
26
|
+
include_type_for_serialization: false
|
27
|
+
preload_models: false
|
28
|
+
scope_overwrite_exception: false
|
29
|
+
raise_not_found_error: true
|
30
|
+
use_activesupport_time_zone: true
|
31
|
+
use_utc: false
|
32
|
+
log_level: :warn
|
33
|
+
app_name: 'testing'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# (c) 2017 Ribose Inc.
|
2
|
+
#
|
3
|
+
|
4
|
+
# No point in using ApplicationRecord here.
|
5
|
+
# rubocop:disable Rails/ApplicationRecord
|
6
|
+
|
7
|
+
require_relative "shared_examples"
|
8
|
+
|
9
|
+
RSpec.describe "Attr Masker gem", :suppress_progressbar do
|
10
|
+
context "when used with ActiveRecord" do
|
11
|
+
before do
|
12
|
+
if ENV["WITHOUT_ACTIVE_RECORD"]
|
13
|
+
expect(defined?(::ActiveRecord)).to be(nil)
|
14
|
+
skip "Active Record specs disabled with WITHOUT_ACTIVE_RECORD shell " \
|
15
|
+
"variable"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
before do
|
20
|
+
allow(ActiveRecord::Base).to receive(:descendants).
|
21
|
+
and_return([ActiveRecord::SchemaMigration, user_class_definition])
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:user_class_definition) { Class.new(ActiveRecord::Base) }
|
25
|
+
|
26
|
+
include_examples "Attr Masker gem feature specs"
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# (c) 2017 Ribose Inc.
|
2
|
+
#
|
3
|
+
|
4
|
+
require_relative "shared_examples"
|
5
|
+
|
6
|
+
RSpec.describe "Attr Masker gem", :suppress_progressbar do
|
7
|
+
context "when used with Mongoid" do
|
8
|
+
before do
|
9
|
+
if ENV["WITHOUT_MONGOID"]
|
10
|
+
expect(defined?(::Mongoid)).to be(nil)
|
11
|
+
skip "Mongoid specs disabled with WITHOUT_MONGOID shell variable"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
after do
|
16
|
+
# Remove the example-specific model from Mongoid.models
|
17
|
+
::Mongoid.models.delete(user_class_definition)
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:user_class_definition) do
|
21
|
+
Class.new do
|
22
|
+
include Mongoid::Document
|
23
|
+
include Mongoid::Timestamps
|
24
|
+
|
25
|
+
store_in collection: "users"
|
26
|
+
|
27
|
+
field :first_name
|
28
|
+
field :last_name
|
29
|
+
field :email
|
30
|
+
field :avatar
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
include_examples "Attr Masker gem feature specs"
|
35
|
+
end
|
36
|
+
end
|
@@ -1,26 +1,20 @@
|
|
1
1
|
# (c) 2017 Ribose Inc.
|
2
2
|
#
|
3
3
|
|
4
|
-
# No point in using ApplicationRecord here.
|
5
|
-
# rubocop:disable Rails/ApplicationRecord
|
6
|
-
|
7
4
|
# No point in ensuring a trailing comma in multiline argument lists here.
|
8
5
|
# rubocop:disable Style/TrailingCommaInArguments
|
9
6
|
|
10
7
|
require "spec_helper"
|
11
8
|
|
12
|
-
RSpec.
|
9
|
+
RSpec.shared_examples "Attr Masker gem feature specs" do
|
13
10
|
before do
|
14
|
-
stub_const "User",
|
11
|
+
stub_const "User", user_class_definition
|
15
12
|
|
16
13
|
User.class_eval do
|
17
14
|
def jedi?
|
18
15
|
email.ends_with? "@jedi.example.test"
|
19
16
|
end
|
20
17
|
end
|
21
|
-
|
22
|
-
allow(ActiveRecord::Base).to receive(:descendants).
|
23
|
-
and_return([ActiveRecord::SchemaMigration, User])
|
24
18
|
end
|
25
19
|
|
26
20
|
let!(:han) do
|
data/spec/spec_helper.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
require "bundler"
|
5
5
|
Bundler.require :default, :development
|
6
6
|
|
7
|
-
Dir[File.expand_path "../support/**/*.rb", __FILE__].each { |f| require f }
|
7
|
+
Dir[File.expand_path "../support/**/*.rb", __FILE__].sort.each { |f| require f }
|
8
8
|
|
9
9
|
RSpec.configure do |config|
|
10
10
|
# Enable flags like --only-failures and --next-failure
|
@@ -17,5 +17,3 @@ RSpec.configure do |config|
|
|
17
17
|
c.syntax = :expect
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
21
|
-
require "rails/all"
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# Copied from Mongoid's test suite
|
2
|
+
# https://github.com/mongodb/mongoid/blob/v6.2.0/spec/spec_helper.rb
|
3
|
+
|
4
|
+
# These environment variables can be set if wanting to test against a database
|
5
|
+
# that is not on the local machine.
|
6
|
+
ENV["MONGOID_SPEC_HOST"] ||= "127.0.0.1"
|
7
|
+
ENV["MONGOID_SPEC_PORT"] ||= "27017"
|
8
|
+
|
9
|
+
require "mongoid" unless ENV["WITHOUT_MONGOID"]
|
data/spec/support/db_cleaner.rb
CHANGED
@@ -2,9 +2,18 @@ require "database_cleaner"
|
|
2
2
|
|
3
3
|
RSpec.configure do |config|
|
4
4
|
config.before(:suite) do
|
5
|
-
|
5
|
+
unless ENV["WITHOUT_ACTIVE_RECORD"]
|
6
|
+
DatabaseCleaner[:active_record].strategy = :truncation
|
7
|
+
end
|
6
8
|
|
7
|
-
|
9
|
+
# Since models are defined dynamically in specs, Database Cleaner is unable
|
10
|
+
# to list them and to determine collection names to be cleaned.
|
11
|
+
# Therefore, they are specified explicitly here.
|
12
|
+
unless ENV["WITHOUT_MONGOID"]
|
13
|
+
DatabaseCleaner[:mongoid].strategy = :truncation, { only: "users" }
|
14
|
+
end
|
15
|
+
|
16
|
+
DatabaseCleaner.clean_with(:truncation)
|
8
17
|
end
|
9
18
|
|
10
19
|
config.around(:each) do |example|
|
@@ -5,8 +5,8 @@
|
|
5
5
|
|
6
6
|
require "spec_helper"
|
7
7
|
|
8
|
-
RSpec.describe AttrMasker::Maskers::
|
9
|
-
subject { described_class }
|
8
|
+
RSpec.describe AttrMasker::Maskers::Simple do
|
9
|
+
subject { described_class.new }
|
10
10
|
|
11
11
|
example { expect(subject.(value: "Solo")).to eq("(redacted)") }
|
12
12
|
example { expect(subject.(value: Math::PI)).to eq("(redacted)") }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attr_masker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -86,6 +86,20 @@ dependencies:
|
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
version: '1.6'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: mongoid
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '5'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '5'
|
89
103
|
- !ruby/object:Gem::Dependency
|
90
104
|
name: pry
|
91
105
|
requirement: !ruby/object:Gem::Requirement
|
@@ -169,6 +183,7 @@ files:
|
|
169
183
|
- gemfiles/Rails-5.0.gemfile
|
170
184
|
- gemfiles/Rails-5.1.gemfile
|
171
185
|
- gemfiles/Rails-head.gemfile
|
186
|
+
- gemfiles/common.gemfile
|
172
187
|
- lib/attr_masker.rb
|
173
188
|
- lib/attr_masker/attribute.rb
|
174
189
|
- lib/attr_masker/error.rb
|
@@ -180,12 +195,16 @@ files:
|
|
180
195
|
- lib/attr_masker/version.rb
|
181
196
|
- lib/tasks/db.rake
|
182
197
|
- spec/dummy/config/database.yml
|
198
|
+
- spec/dummy/config/mongoid.yml
|
183
199
|
- spec/dummy/config/routes.rb
|
184
200
|
- spec/dummy/db/schema.rb
|
185
201
|
- spec/dummy/public/favicon.ico
|
186
|
-
- spec/
|
202
|
+
- spec/features/active_record_spec.rb
|
203
|
+
- spec/features/mongoid_spec.rb
|
204
|
+
- spec/features/shared_examples.rb
|
187
205
|
- spec/spec_helper.rb
|
188
|
-
- spec/support/
|
206
|
+
- spec/support/00_mongoid_env.rb
|
207
|
+
- spec/support/20_combustion.rb
|
189
208
|
- spec/support/db_cleaner.rb
|
190
209
|
- spec/support/matchers.rb
|
191
210
|
- spec/support/rake.rb
|
@@ -220,12 +239,16 @@ specification_version: 4
|
|
220
239
|
summary: Masking attributes
|
221
240
|
test_files:
|
222
241
|
- spec/dummy/config/database.yml
|
242
|
+
- spec/dummy/config/mongoid.yml
|
223
243
|
- spec/dummy/config/routes.rb
|
224
244
|
- spec/dummy/db/schema.rb
|
225
245
|
- spec/dummy/public/favicon.ico
|
226
|
-
- spec/
|
246
|
+
- spec/features/active_record_spec.rb
|
247
|
+
- spec/features/mongoid_spec.rb
|
248
|
+
- spec/features/shared_examples.rb
|
227
249
|
- spec/spec_helper.rb
|
228
|
-
- spec/support/
|
250
|
+
- spec/support/00_mongoid_env.rb
|
251
|
+
- spec/support/20_combustion.rb
|
229
252
|
- spec/support/db_cleaner.rb
|
230
253
|
- spec/support/matchers.rb
|
231
254
|
- spec/support/rake.rb
|