data-anonymization 0.3.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -1
- data/.rvmrc +1 -1
- data/.travis.yml +2 -0
- data/Gemfile +2 -0
- data/README.md +295 -258
- data/bin/datanon +57 -0
- data/data-anonymization.gemspec +2 -1
- data/examples/blacklist_dsl.rb +42 -0
- data/examples/mongodb_blacklist_dsl.rb +38 -0
- data/examples/mongodb_whitelist_dsl.rb +44 -0
- data/examples/whitelist_dsl.rb +63 -0
- data/lib/core/database.rb +21 -3
- data/lib/core/field.rb +5 -2
- data/lib/core/fields_missing_strategy.rb +30 -0
- data/lib/core/table_errors.rb +32 -0
- data/lib/data-anonymization.rb +11 -0
- data/lib/parallel/table.rb +8 -1
- data/lib/strategy/base.rb +35 -14
- data/lib/strategy/blacklist.rb +1 -1
- data/lib/strategy/field/anonymize_array.rb +28 -0
- data/lib/strategy/field/contact/random_address.rb +12 -0
- data/lib/strategy/field/contact/random_city.rb +12 -0
- data/lib/strategy/field/contact/random_phone_number.rb +4 -0
- data/lib/strategy/field/contact/random_province.rb +12 -0
- data/lib/strategy/field/contact/random_zipcode.rb +12 -0
- data/lib/strategy/field/datetime/anonymize_date.rb +15 -0
- data/lib/strategy/field/datetime/anonymize_datetime.rb +19 -0
- data/lib/strategy/field/datetime/anonymize_time.rb +19 -0
- data/lib/strategy/field/datetime/date_delta.rb +10 -0
- data/lib/strategy/field/datetime/date_time_delta.rb +9 -0
- data/lib/strategy/field/datetime/time_delta.rb +8 -0
- data/lib/strategy/field/default_anon.rb +4 -1
- data/lib/strategy/field/email/gmail_template.rb +8 -0
- data/lib/strategy/field/email/random_email.rb +7 -0
- data/lib/strategy/field/email/random_mailinator_email.rb +5 -0
- data/lib/strategy/field/fields.rb +4 -0
- data/lib/strategy/field/name/random_first_name.rb +10 -0
- data/lib/strategy/field/name/random_full_name.rb +10 -2
- data/lib/strategy/field/name/random_last_name.rb +9 -0
- data/lib/strategy/field/name/random_user_name.rb +5 -0
- data/lib/strategy/field/number/random_big_decimal_delta.rb +6 -0
- data/lib/strategy/field/number/random_float.rb +4 -0
- data/lib/strategy/field/number/random_float_delta.rb +6 -0
- data/lib/strategy/field/number/random_integer.rb +4 -0
- data/lib/strategy/field/number/random_integer_delta.rb +6 -0
- data/lib/strategy/field/string/formatted_string_numbers.rb +10 -6
- data/lib/strategy/field/string/lorem_ipsum.rb +9 -0
- data/lib/strategy/field/string/random_formatted_string.rb +39 -0
- data/lib/strategy/field/string/random_string.rb +6 -0
- data/lib/strategy/field/string/random_url.rb +7 -1
- data/lib/strategy/field/string/select_from_database.rb +7 -5
- data/lib/strategy/field/string/select_from_file.rb +7 -0
- data/lib/strategy/field/string/select_from_list.rb +8 -0
- data/lib/strategy/field/string/string_template.rb +11 -0
- data/lib/strategy/mongodb/anonymize_field.rb +44 -0
- data/lib/strategy/mongodb/blacklist.rb +29 -0
- data/lib/strategy/mongodb/whitelist.rb +62 -0
- data/lib/strategy/strategies.rb +10 -1
- data/lib/strategy/whitelist.rb +7 -2
- data/lib/thor/helpers/mongodb_dsl_generator.rb +66 -0
- data/lib/thor/helpers/rdbms_dsl_generator.rb +36 -0
- data/lib/thor/templates/mongodb_whitelist_template.erb +15 -0
- data/lib/thor/templates/whitelist_template.erb +21 -0
- data/lib/utils/database.rb +4 -0
- data/lib/utils/parallel_progress_bar.rb +24 -0
- data/lib/utils/progress_bar.rb +34 -22
- data/lib/utils/random_string.rb +3 -2
- data/lib/utils/random_string_chars_only.rb +3 -5
- data/lib/utils/template_helper.rb +44 -0
- data/lib/version.rb +1 -1
- data/spec/acceptance/mongodb_blacklist_spec.rb +75 -0
- data/spec/acceptance/mongodb_whitelist_spec.rb +107 -0
- data/spec/core/fields_missing_strategy_spec.rb +26 -0
- data/spec/strategy/field/name/random_first_name_spec.rb +1 -1
- data/spec/strategy/field/name/random_full_name_spec.rb +12 -7
- data/spec/strategy/field/name/random_last_name_spec.rb +1 -1
- data/spec/strategy/field/string/random_formatted_string_spec.rb +39 -0
- data/spec/strategy/field/string/select_from_file_spec.rb +21 -0
- data/spec/strategy/mongodb/anonymize_field_spec.rb +52 -0
- data/spec/utils/random_float_spec.rb +12 -0
- data/spec/utils/random_string_char_only_spec.rb +12 -0
- data/spec/utils/template_helper_spec.rb +14 -0
- metadata +56 -6
- data/blacklist_dsl.rb +0 -17
- data/blacklist_nosql_dsl.rb +0 -36
- data/whitelist_dsl.rb +0 -42
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'active_record'
|
3
|
+
require 'erb'
|
4
|
+
|
5
|
+
module DataAnon
|
6
|
+
module ThorHelpers
|
7
|
+
class RDBMSDSLGenerator
|
8
|
+
|
9
|
+
def self.source_root
|
10
|
+
File.dirname(__FILE__)
|
11
|
+
end
|
12
|
+
|
13
|
+
def generate_whitelist_script(configuration_hash)
|
14
|
+
|
15
|
+
@configuration_hash = configuration_hash
|
16
|
+
@ar_object = ActiveRecord::Base.establish_connection(@configuration_hash)
|
17
|
+
|
18
|
+
@tables = @ar_object.connection.tables
|
19
|
+
|
20
|
+
erb = ERB.new( File.new(RDBMSDSLGenerator.source_root + "/../templates/whitelist_template.erb").read, nil, '-')
|
21
|
+
|
22
|
+
File.open('rdbms_whitelist_generated.rb', 'w') do |f|
|
23
|
+
f.write erb.result(binding)
|
24
|
+
f.close
|
25
|
+
end
|
26
|
+
|
27
|
+
rescue => e
|
28
|
+
puts "\e[31mActiverecord was unable to establish a connection to the specified database. Please check the configuration options and try again.\e[0m"
|
29
|
+
puts e.backtrace
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'data-anonymization'
|
2
|
+
require 'mongo'
|
3
|
+
|
4
|
+
DataAnon::Utils::Logging.logger.level = Logger::INFO
|
5
|
+
|
6
|
+
database 'test' do
|
7
|
+
|
8
|
+
strategy DataAnon::Strategy::MongoDB::Whitelist
|
9
|
+
source_db <%= DataAnon::Utils::TemplateHelper.source_connection_specs_mongo @configuration_hash %>
|
10
|
+
destination_db <%= DataAnon::Utils::TemplateHelper.destination_connection_specs_mongo %>
|
11
|
+
|
12
|
+
<%= @output.join("\n") %>
|
13
|
+
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'data-anonymization'
|
2
|
+
|
3
|
+
DataAnon::Utils::Logging.logger.level = Logger::INFO
|
4
|
+
|
5
|
+
database 'Template' do
|
6
|
+
|
7
|
+
strategy DataAnon::Strategy::Whitelist
|
8
|
+
source_db <%= DataAnon::Utils::TemplateHelper.source_connection_specs_rdbms @configuration_hash %>
|
9
|
+
destination_db <%= DataAnon::Utils::TemplateHelper.destination_connection_specs_rdbms @configuration_hash %>
|
10
|
+
|
11
|
+
<% @tables.each do |table| %>
|
12
|
+
table '<%= table %>' do
|
13
|
+
primary_key '<%= @ar_object.connection.primary_key("#{table}").nil? ? "<No primary key found. Possible composite key. Please enter the value>" : @ar_object.connection.primary_key("#{table}") %>'
|
14
|
+
<%- @ar_object.connection.indexes("#{table}").each do |index| -%>
|
15
|
+
whitelist '<%= index.columns.first %>'
|
16
|
+
<%- end -%>
|
17
|
+
end
|
18
|
+
<% end %>
|
19
|
+
|
20
|
+
end
|
21
|
+
|
data/lib/utils/database.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'powerbar'
|
2
|
+
|
3
|
+
module DataAnon
|
4
|
+
module Utils
|
5
|
+
|
6
|
+
class ParallelProgressBar < ProgressBar
|
7
|
+
include Utils::Logging
|
8
|
+
|
9
|
+
def initialize table_name, total
|
10
|
+
@total = total
|
11
|
+
@table_name = table_name
|
12
|
+
end
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
def show_progress index
|
17
|
+
suffix = started(index) ? "STARTED" : (complete(index) ? "COMPLETE" : "")
|
18
|
+
logger.info("%-30s [ %7d/%-7d ] %s" % [@table_name, index, @total, suffix])
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
data/lib/utils/progress_bar.rb
CHANGED
@@ -4,51 +4,63 @@ module DataAnon
|
|
4
4
|
module Utils
|
5
5
|
|
6
6
|
class ProgressBar
|
7
|
-
include Utils::Logging
|
8
7
|
|
9
8
|
def initialize table_name, total
|
10
9
|
@total = total
|
11
10
|
@table_name = table_name
|
12
|
-
@
|
11
|
+
@power_bar = PowerBar.new if show_progress_env
|
12
|
+
apply_power_bar_settings if show_progress_env
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
15
|
+
def apply_power_bar_settings
|
16
|
+
@power_bar.settings.tty.finite.template.main = \
|
17
|
+
"${<msg>} ${<bar> }\e[0m${<rate>/s} \e[33;1m${<percent>%} " +
|
18
|
+
"\e[36;1m${<elapsed>}\e[31;1m${ ETA: <eta>}"
|
19
|
+
@power_bar.settings.tty.finite.template.padchar = "\e[0m\u2589"
|
20
|
+
@power_bar.settings.tty.finite.template.barchar = "\e[34;1m\u2589"
|
21
|
+
@power_bar.settings.tty.finite.template.exit = "\e[?25h\e[0m" # clean up after us
|
22
|
+
@power_bar.settings.tty.finite.template.close = "\e[?25h\e[0m\n" # clean up after us
|
23
|
+
@power_bar.settings.tty.finite.output = Proc.new { |s| $stderr.print s }
|
21
24
|
end
|
22
25
|
|
23
26
|
def show index
|
24
|
-
if
|
25
|
-
|
26
|
-
msg = "Table: %-15s [ %6d/%-6d ]" % [ @table_name,index,@total]
|
27
|
-
@progress_bar.show(:msg => msg, :done => index, :total => @total)
|
28
|
-
elsif parallel?
|
29
|
-
suffix = ""
|
30
|
-
suffix = "STARTED" if started(index)
|
31
|
-
suffix = "COMPLETE" if complete(index)
|
32
|
-
logger.info("Table: %-15s [ %6d/%-6d ] %s" % [ @table_name,index,@total, suffix])
|
33
|
-
end
|
27
|
+
if show_progress? index
|
28
|
+
show_progress index
|
34
29
|
end
|
35
30
|
end
|
36
31
|
|
32
|
+
def close
|
33
|
+
@power_bar.close if @power_bar
|
34
|
+
end
|
35
|
+
|
36
|
+
protected
|
37
|
+
|
38
|
+
def show_progress? index
|
39
|
+
show_progress_env && (started(index) || regular_interval(index) || complete(index))
|
40
|
+
end
|
41
|
+
|
42
|
+
def show_progress_env
|
43
|
+
ENV['show_progress'] == "false" ? false : true
|
44
|
+
end
|
45
|
+
|
46
|
+
def show_progress counter
|
47
|
+
sleep 0.1
|
48
|
+
msg = "%-20s [%6d/%-6d]" % [@table_name, counter, @total]
|
49
|
+
@power_bar.show({:msg => msg, :done => counter, :total => @total})
|
50
|
+
end
|
51
|
+
|
37
52
|
def complete index
|
38
53
|
index == @total
|
39
54
|
end
|
40
55
|
|
41
56
|
def regular_interval index
|
42
|
-
index % 1000 == 0
|
57
|
+
(index % 1000) == 0
|
43
58
|
end
|
44
59
|
|
45
60
|
def started index
|
46
61
|
index == 1
|
47
62
|
end
|
48
63
|
|
49
|
-
def close
|
50
|
-
@progress_bar.close if @progress_bar
|
51
|
-
end
|
52
64
|
|
53
65
|
end
|
54
66
|
|
data/lib/utils/random_string.rb
CHANGED
@@ -2,9 +2,10 @@ module DataAnon
|
|
2
2
|
module Utils
|
3
3
|
class RandomString
|
4
4
|
|
5
|
-
|
5
|
+
RANDOM_STRING_CHARS = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ0123456789'
|
6
|
+
|
7
|
+
def self.generate length = nil, chars = RANDOM_STRING_CHARS
|
6
8
|
length ||= Random.new.rand 5...15
|
7
|
-
chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789'
|
8
9
|
random_string = ''
|
9
10
|
length.times { random_string << chars[rand(chars.size)] }
|
10
11
|
random_string
|
@@ -2,12 +2,10 @@ module DataAnon
|
|
2
2
|
module Utils
|
3
3
|
class RandomStringCharsOnly
|
4
4
|
|
5
|
+
CHARS = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
|
6
|
+
|
5
7
|
def self.generate length = nil
|
6
|
-
length
|
7
|
-
chars = 'abcdefghjkmnpqrstuvwxyz'
|
8
|
-
random_string = ''
|
9
|
-
length.times { random_string << chars[rand(chars.size)] }
|
10
|
-
random_string
|
8
|
+
RandomString.generate length, CHARS
|
11
9
|
end
|
12
10
|
end
|
13
11
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module DataAnon
|
2
|
+
module Utils
|
3
|
+
class TemplateHelper
|
4
|
+
|
5
|
+
def self.source_connection_specs_rdbms config_hash
|
6
|
+
|
7
|
+
config_hash.keys.reject{|key| config_hash[key].nil? }.collect { |key|
|
8
|
+
if ((config_hash[key].class.to_s.downcase == "string"))
|
9
|
+
":#{key} => '#{config_hash[key]}'"
|
10
|
+
elsif ((config_hash[key].class.to_s.downcase == "fixnum"))
|
11
|
+
":#{key} => #{config_hash[key]}"
|
12
|
+
end
|
13
|
+
}.join ', '
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.destination_connection_specs_rdbms config_hash
|
18
|
+
|
19
|
+
config_hash.keys.collect { |key|
|
20
|
+
":#{key} => '<enter_value>'"
|
21
|
+
}.join ', '
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.source_connection_specs_mongo config_hash
|
26
|
+
":mongodb_uri => '#{self.mongo_uri config_hash}', :database => '#{config_hash[:database]}'"
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.destination_connection_specs_mongo
|
30
|
+
":mongodb_uri => '<enter value>', :database => '<enter value>'"
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.mongo_uri config_hash
|
34
|
+
if config_hash[:user].nil?
|
35
|
+
mongo_uri = "mongodb://#{config_hash[:host]}#{config_hash[:port].nil? ? "" : ":#{config_hash[:port]}"}/#{config_hash[:database]}"
|
36
|
+
else
|
37
|
+
credentials = "#{config_hash[:username]}:#{config_hash[:password]}"
|
38
|
+
mongo_uri = "mongodb://#{config_hash[:host]}#{config_hash[:port].nil? ? "" : ":#{config_hash[:port]}"}@#{credentials}/#{config_hash[:database]}"
|
39
|
+
end
|
40
|
+
mongo_uri
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/version.rb
CHANGED
@@ -0,0 +1,75 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require 'mongo'
|
3
|
+
|
4
|
+
describe "End 2 End MongoDB Blacklist Acceptance Test" do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
Mongo::Connection.from_uri("mongodb://localhost/test").drop_database('test')
|
8
|
+
users = [
|
9
|
+
{
|
10
|
+
"_id" => 1,
|
11
|
+
"user_id" => "sunitparekh",
|
12
|
+
"date_of_birth" => Time.new(2012, 7, 14, 13, 1, 0),
|
13
|
+
"email" => "parekh.sunit@gmail.com",
|
14
|
+
"password" => "TfqIK8Pd8GlbMDFZCX4l/5EtnOkfLCeynOL85tJQuxum&382knaflk@@",
|
15
|
+
"failed_attempts" => 0,
|
16
|
+
"first_name" => "Sunit",
|
17
|
+
"last_name" => "Parekh",
|
18
|
+
"password_reset_answer" => "manza",
|
19
|
+
"password_reset_question" => "My new car modal?",
|
20
|
+
"updated_at" => Time.new(2012, 8, 15, 13, 1, 0)
|
21
|
+
},
|
22
|
+
{
|
23
|
+
"_id" => 2,
|
24
|
+
"user_id" => "anandagrawal",
|
25
|
+
"date_of_birth" => Time.new(2011, 8, 11, 13, 1, 0),
|
26
|
+
"email" => "anandagrawal84@gmail.com",
|
27
|
+
"password" => "Tz548O0RWusldVAWkwqfzO3jK/X4l/5EtnOkfLCeynOL85tJQuxum",
|
28
|
+
"failed_attempts" => 0,
|
29
|
+
"first_name" => "Anand",
|
30
|
+
"last_name" => "Agrawal",
|
31
|
+
"password_reset_answer" => "android",
|
32
|
+
"password_reset_question" => "My phone?",
|
33
|
+
"updated_at" => Time.new(2012, 2, 11, 13, 1, 0)
|
34
|
+
}
|
35
|
+
]
|
36
|
+
users_coll = Mongo::Connection.from_uri("mongodb://localhost/dest",{:safe => true})['test']['users']
|
37
|
+
users.each { |p| users_coll.save p }
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should anonymize plans collection" do
|
41
|
+
|
42
|
+
database 'test' do
|
43
|
+
strategy DataAnon::Strategy::MongoDB::Blacklist
|
44
|
+
source_db :mongodb_uri => "mongodb://localhost/test", :database => 'test', :options => {:safe => true}
|
45
|
+
|
46
|
+
collection 'users' do
|
47
|
+
anonymize('date_of_birth').using FieldStrategy::TimeDelta.new(5,30)
|
48
|
+
anonymize('user_id').using FieldStrategy::StringTemplate.new('user-#{row_number}')
|
49
|
+
anonymize('email').using FieldStrategy::RandomMailinatorEmail.new
|
50
|
+
anonymize('password') { |field| "password" }
|
51
|
+
anonymize('first_name').using FieldStrategy::RandomFirstName.new
|
52
|
+
anonymize('last_name').using FieldStrategy::RandomLastName.new
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
users_coll = Mongo::Connection.from_uri("mongodb://localhost/test")['test']['users']
|
58
|
+
users_coll.count.should be 2
|
59
|
+
user = users_coll.find_one({'_id' => 1})
|
60
|
+
|
61
|
+
user['_id'].should == 1
|
62
|
+
user['user_id'].should == "user-1"
|
63
|
+
user['date_of_birth'].should_not == Time.new(2012, 7, 14, 13, 1, 0)
|
64
|
+
user['email'].should_not == "parekh.sunit@gmail.com"
|
65
|
+
user['password'].should == "password"
|
66
|
+
user['failed_attempts'].should == 0
|
67
|
+
user['first_name'].should_not be "Sunit"
|
68
|
+
user['last_name'].should_not be "Parekh"
|
69
|
+
user['password_reset_answer'].should == "manza"
|
70
|
+
user['password_reset_question'].should == "My new car modal?"
|
71
|
+
user['updated_at'].should == Time.new(2012, 8, 15, 13, 1, 0)
|
72
|
+
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require 'mongo'
|
3
|
+
|
4
|
+
describe "End 2 End MongoDB Whitelist Acceptance Test" do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
Mongo::Connection.from_uri("mongodb://localhost/test").drop_database('test')
|
8
|
+
Mongo::Connection.from_uri("mongodb://localhost/dest").drop_database('dest')
|
9
|
+
plans = [
|
10
|
+
{
|
11
|
+
"_id" => 1,
|
12
|
+
"name" => "Free",
|
13
|
+
"nick_names" => ["Name1","Name2"],
|
14
|
+
"features" => [
|
15
|
+
{
|
16
|
+
"max_storage" => 21474836480,
|
17
|
+
"type" => "AmazonS3",
|
18
|
+
"users" => {"max" => 1, "additional" => false}
|
19
|
+
},
|
20
|
+
{
|
21
|
+
"max_storage" => 21474836480,
|
22
|
+
"type" => "DropBox",
|
23
|
+
"users" => {"max" => 1, "additional" => false}
|
24
|
+
}
|
25
|
+
],
|
26
|
+
"term" => "month",
|
27
|
+
"public_sharing" => false,
|
28
|
+
"photo_sharing" => true,
|
29
|
+
"created_at" => Time.new(2012, 6, 21, 13, 30, 0)
|
30
|
+
},
|
31
|
+
{
|
32
|
+
"_id" => 2,
|
33
|
+
"name" => "Team",
|
34
|
+
"plan_aliases" => ["Business", "Paid"],
|
35
|
+
"features" => [
|
36
|
+
{
|
37
|
+
"max_storage" => 53687091200,
|
38
|
+
"type" => "AmazonS3",
|
39
|
+
"users" => {"max" => 5, "additional" => true}
|
40
|
+
},
|
41
|
+
{
|
42
|
+
"max_storage" => 53687091200,
|
43
|
+
"type" => "DropBox",
|
44
|
+
"users" => {"max" => 5, "additional" => true}
|
45
|
+
}
|
46
|
+
],
|
47
|
+
"term" => "month",
|
48
|
+
"public_sharing" => true,
|
49
|
+
"photo_sharing" => true,
|
50
|
+
"created_at" => Time.new(2012, 8, 11, 13, 1, 0)
|
51
|
+
}
|
52
|
+
]
|
53
|
+
plans_coll = Mongo::Connection.from_uri("mongodb://localhost/dest")['test']['plans']
|
54
|
+
plans.each { |p| plans_coll.save p }
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should anonymize plans collection" do
|
58
|
+
|
59
|
+
database 'test' do
|
60
|
+
strategy DataAnon::Strategy::MongoDB::Whitelist
|
61
|
+
source_db :mongodb_uri => "mongodb://localhost/test", :database => 'test'
|
62
|
+
destination_db :mongodb_uri => "mongodb://localhost/dest", :database => 'dest', :options => {:safe => true}
|
63
|
+
|
64
|
+
collection 'plans' do
|
65
|
+
whitelist '_id', 'name', 'term', 'created_at'
|
66
|
+
anonymize('plan_aliases').using FieldStrategy::SelectFromList.new(["Free", "Team", "Business", "Paid"])
|
67
|
+
anonymize 'public_sharing', 'photo_sharing'
|
68
|
+
|
69
|
+
collection 'features' do
|
70
|
+
anonymize('max_storage').using FieldStrategy::SelectFromList.new([10737418240, 21474836480, 53687091200])
|
71
|
+
whitelist 'type'
|
72
|
+
|
73
|
+
document 'users' do
|
74
|
+
anonymize 'max', 'additional'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
plans_coll = Mongo::Connection.from_uri("mongodb://localhost/dest")['dest']['plans']
|
82
|
+
plans_coll.count.should be 2
|
83
|
+
plan = plans_coll.find_one({ '_id' => 1})
|
84
|
+
|
85
|
+
plan['_id'].should == 1
|
86
|
+
plan['name'].should == "Free"
|
87
|
+
plan['nick_names'][0].should_not == "Name1"
|
88
|
+
plan['nick_names'][1].should_not == "Name2"
|
89
|
+
plan['term'].should == "month"
|
90
|
+
plan['created_at'].should == Time.new(2012, 6, 21, 13, 30, 0)
|
91
|
+
plan['plan_aliases'].should be_nil
|
92
|
+
[true,false].should include(plan['public_sharing'])
|
93
|
+
[true,false].should include(plan['photo_sharing'])
|
94
|
+
plan['features'].length.should == 2
|
95
|
+
feature1 = plan['features'][0]
|
96
|
+
[10737418240, 21474836480, 53687091200].should include(feature1['max_storage'])
|
97
|
+
feature1['type'].should == "AmazonS3"
|
98
|
+
feature1['users']['max'].should be_kind_of(Fixnum)
|
99
|
+
[true,false].should include(feature1['users']['additional'])
|
100
|
+
|
101
|
+
|
102
|
+
plan = plans_coll.find_one({ '_id' => 2})
|
103
|
+
plan['plan_aliases'].length.should == 2
|
104
|
+
["Free", "Team", "Business", "Paid"].should include(plan['plan_aliases'][0])
|
105
|
+
["Free", "Team", "Business", "Paid"].should include(plan['plan_aliases'][1])
|
106
|
+
end
|
107
|
+
end
|