copydb 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/config/sampleconfig.yml +1 -0
- data/lib/copydb.rb +100 -12
- metadata +21 -4
@@ -0,0 +1 @@
|
|
1
|
+
helloworld:
|
data/lib/copydb.rb
CHANGED
@@ -3,25 +3,37 @@ require 'yaml'
|
|
3
3
|
require 'active_record'
|
4
4
|
require 'active_support/core_ext/kernel/reporting'
|
5
5
|
require 'rails/railtie'
|
6
|
+
require 'fileutils'
|
7
|
+
require 'faker'
|
6
8
|
|
7
9
|
module CopyDb
|
8
10
|
|
9
11
|
class DumpDb
|
10
12
|
def dump
|
11
|
-
|
13
|
+
|
14
|
+
anonymizer = CopyDb::Config.read_anonymize_config
|
15
|
+
|
16
|
+
output = File.new(File.expand_path('db/copydb_dumped_data.yml'), "w+")
|
12
17
|
yml = [self.schema_version]
|
13
18
|
self.tables.each do |table|
|
14
|
-
|
15
|
-
|
19
|
+
if anonymizer.has_key?(table)
|
20
|
+
yml << self.table_dump_anonymous(table,anonymizer[table])
|
21
|
+
else
|
22
|
+
yml << self.table_dump(table)
|
23
|
+
end
|
16
24
|
end
|
17
|
-
|
18
|
-
|
25
|
+
output.write(yml.to_yaml)
|
26
|
+
output.close
|
19
27
|
end
|
20
28
|
|
21
29
|
def tables
|
22
30
|
ActiveRecord::Base.connection.tables.reject { |table| ['schema_info', 'schema_migrations'].include?(table) }
|
23
31
|
end
|
24
32
|
|
33
|
+
def table_column_names(table)
|
34
|
+
ActiveRecord::Base.connection.columns(table).map { |c| c.name }
|
35
|
+
end
|
36
|
+
|
25
37
|
def table_dump(table)
|
26
38
|
rs = ActiveRecord::Base.connection.execute("SELECT * FROM #{table}")
|
27
39
|
yml = Array.new
|
@@ -32,6 +44,36 @@ module CopyDb
|
|
32
44
|
yml
|
33
45
|
end
|
34
46
|
|
47
|
+
def table_dump_anonymous(table,anonymize_column_configurations)
|
48
|
+
|
49
|
+
column_names = Array.new
|
50
|
+
anonymizing_types = Array.new
|
51
|
+
|
52
|
+
anonymize_column_configurations.each do |anonymize_column_configuration|
|
53
|
+
column_names << anonymize_column_configuration.keys[0]
|
54
|
+
anonymizing_types << anonymize_column_configuration.values[0]
|
55
|
+
end
|
56
|
+
|
57
|
+
rs = ActiveRecord::Base.connection.execute("SELECT * FROM #{table}")
|
58
|
+
yml = Array.new
|
59
|
+
yml << table
|
60
|
+
rs.each do |result|
|
61
|
+
resultHash = Hash.new
|
62
|
+
result.each do |result_column,result_value|
|
63
|
+
|
64
|
+
if column_names.include?(result_column)
|
65
|
+
anonymize_type = anonymizing_types[(column_names.index(result_column))]
|
66
|
+
resultHash[result_column] = CopyDb::Anonymizer.anonymize(anonymize_type)
|
67
|
+
else
|
68
|
+
resultHash[result_column] = result_value
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
yml << resultHash
|
73
|
+
end
|
74
|
+
yml
|
75
|
+
end
|
76
|
+
|
35
77
|
def schema_version
|
36
78
|
ActiveRecord::Migrator.current_version
|
37
79
|
end
|
@@ -39,23 +81,28 @@ module CopyDb
|
|
39
81
|
|
40
82
|
class LoadDb
|
41
83
|
def load
|
42
|
-
if FileTest.exists?(File.expand_path('
|
84
|
+
if FileTest.exists?(File.expand_path('db/copydb_dumped_data.yml'))
|
43
85
|
|
44
|
-
yml = YAML.load_file(File.expand_path('
|
45
|
-
|
86
|
+
yml = YAML.load_file(File.expand_path('db/copydb_dumped_data.yml'))
|
46
87
|
|
47
88
|
yml.each_with_index do |entry,i|
|
48
89
|
if i == 0
|
49
|
-
|
90
|
+
unless entry.to_s == self.schema_version.to_s
|
91
|
+
puts "ERROR: schema version mismatch"
|
92
|
+
end
|
93
|
+
next
|
50
94
|
end
|
51
95
|
unless entry[1].nil?
|
52
|
-
|
96
|
+
columns = entry[1].each_key.to_a
|
97
|
+
quoted_column_names = columns.map { |column| ActiveRecord::Base.connection.quote_column_name(column) }.join(',')
|
53
98
|
|
54
99
|
for i in 1..(entry.length-1)
|
55
|
-
|
100
|
+
entries = entry[i].each_value.to_a
|
101
|
+
quoted_column_values = entries.map { |record| ActiveRecord::Base.connection.quote(record) }.join(',')
|
56
102
|
|
57
103
|
sql_string = "INSERT INTO #{entry[0]} (#{quoted_column_names}) VALUES (#{quoted_column_values});"
|
58
|
-
|
104
|
+
|
105
|
+
ActiveRecord::Base.connection.execute(sql_string)
|
59
106
|
end
|
60
107
|
end
|
61
108
|
end
|
@@ -70,6 +117,47 @@ module CopyDb
|
|
70
117
|
end
|
71
118
|
end
|
72
119
|
|
120
|
+
class Config
|
121
|
+
def self.read_anonymize_config
|
122
|
+
if FileTest.exists?(File.expand_path('config/copydb_anonymize.yml'))
|
123
|
+
YAML.load_file(File.expand_path('config/copydb_anonymize.yml'))
|
124
|
+
else
|
125
|
+
Hash.new
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
class Anonymizer
|
131
|
+
|
132
|
+
Faker::Config.locale = "en"
|
133
|
+
|
134
|
+
def self.anonymize(type)
|
135
|
+
if type == "name"
|
136
|
+
Faker::Name.name
|
137
|
+
elsif type == "first_name"
|
138
|
+
Faker::Name.first_name
|
139
|
+
elsif type == "last_name"
|
140
|
+
Faker::Name.last_name
|
141
|
+
elsif type == "street_address"
|
142
|
+
Faker::Address.street_address
|
143
|
+
elsif type == "city"
|
144
|
+
Faker::Address.city
|
145
|
+
elsif type == "zip"
|
146
|
+
Faker::Address.zip_code
|
147
|
+
elsif type == "phone"
|
148
|
+
Faker::PhoneNumber.phone_number
|
149
|
+
elsif type == "email"
|
150
|
+
Faker::Internet.free_email
|
151
|
+
elsif type == "company"
|
152
|
+
Faker::Company.name
|
153
|
+
elsif type == "date"
|
154
|
+
"2011-11-11"
|
155
|
+
else
|
156
|
+
Faker::Company.bs
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
73
161
|
class Railtie < Rails::Railtie
|
74
162
|
rake_tasks do
|
75
163
|
load File.expand_path('../tasks/copydb.rake',__FILE__)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: copydb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,9 +11,24 @@ bindir: bin
|
|
11
11
|
cert_chain: []
|
12
12
|
date: 2011-09-02 00:00:00.000000000 +02:00
|
13
13
|
default_executable:
|
14
|
-
dependencies:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: faker
|
17
|
+
requirement: &21538480 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.9.5
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *21538480
|
15
26
|
description: Copydb is a gem that helps you to copy databases e.g. from a production
|
16
|
-
database to your development database.
|
27
|
+
database to your development database. During the process it is possible to define
|
28
|
+
columns in tables in which the data should be exchanged for fake data. This can
|
29
|
+
be interesting in a scenario where you want to run your development machine with
|
30
|
+
production data, but privacy laws (such as in Germany) prohibit you to use real
|
31
|
+
data.
|
17
32
|
email: eicke@yfu.de
|
18
33
|
executables: []
|
19
34
|
extensions: []
|
@@ -21,6 +36,7 @@ extra_rdoc_files: []
|
|
21
36
|
files:
|
22
37
|
- lib/copydb.rb
|
23
38
|
- lib/tasks/copydb.rake
|
39
|
+
- lib/config/sampleconfig.yml
|
24
40
|
has_rdoc: true
|
25
41
|
homepage: https://github.com/ceicke/copydb
|
26
42
|
licenses: []
|
@@ -45,5 +61,6 @@ rubyforge_project:
|
|
45
61
|
rubygems_version: 1.6.2
|
46
62
|
signing_key:
|
47
63
|
specification_version: 3
|
48
|
-
summary: Copydb helps you synchronize your databases
|
64
|
+
summary: Copydb helps you synchronize your databases and can be configured to anonymize
|
65
|
+
certain parts of a table
|
49
66
|
test_files: []
|