evil-seed 0.1.2 → 0.3.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.
- checksums.yaml +4 -4
- data/.travis.yml +41 -15
- data/Appraisals +31 -8
- data/README.md +5 -2
- data/evil-seed.gemspec +2 -2
- data/gemfiles/activerecord_5_0.gemfile +2 -1
- data/gemfiles/activerecord_5_1.gemfile +2 -0
- data/gemfiles/activerecord_5_2.gemfile +3 -1
- data/gemfiles/activerecord_6_0.gemfile +10 -0
- data/gemfiles/activerecord_6_1.gemfile +10 -0
- data/gemfiles/activerecord_master.gemfile +3 -0
- data/lib/evil_seed/anonymizer.rb +3 -3
- data/lib/evil_seed/record_dumper.rb +3 -22
- data/lib/evil_seed/relation_dumper.rb +5 -3
- data/lib/evil_seed/version.rb +1 -1
- metadata +11 -11
- data/gemfiles/activerecord_4_2.gemfile +0 -9
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d2a4c8714fe895573999dae43b0e441852c8baccba4657f49aa9330db61e020d
|
|
4
|
+
data.tar.gz: 175c040d61f8152437c15db6f4a38fa0941239f7615cf27aa1d752c57ffdbb5d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 427ec05a9b68db21101fdf293093dff447635e9b326dfd400e3d7ba69afe3a3344bfa4c97778a8c56f2158529460df9f2e1cbc62a5b9ad86e7d659498e9da37d
|
|
7
|
+
data.tar.gz: 2288cfb2559bc3b6eefeb28f066cb06e6ed2e0c624e5287755314e41e67a611341d90c4c9d08f97d7a724882b294bdc3dbb53ebfbe4ac431f06a078ed1ea76fc
|
data/.travis.yml
CHANGED
|
@@ -1,56 +1,82 @@
|
|
|
1
|
+
dist: xenial
|
|
2
|
+
language: ruby
|
|
1
3
|
cache: bundler
|
|
2
4
|
sudo: false
|
|
3
|
-
language: ruby
|
|
4
5
|
|
|
5
6
|
addons:
|
|
7
|
+
postgresql: "10"
|
|
6
8
|
apt:
|
|
7
9
|
sources:
|
|
8
10
|
- travis-ci/sqlite3
|
|
9
11
|
packages:
|
|
10
12
|
- sqlite3
|
|
11
13
|
|
|
14
|
+
services:
|
|
15
|
+
- mysql
|
|
16
|
+
- postgresql
|
|
17
|
+
|
|
18
|
+
before_install: gem install bundler -v '~> 1.17'
|
|
19
|
+
|
|
12
20
|
matrix:
|
|
13
21
|
include:
|
|
14
|
-
- rvm:
|
|
22
|
+
- rvm: 3.0.2
|
|
15
23
|
gemfile: gemfiles/activerecord_master.gemfile
|
|
16
24
|
env: "DB=sqlite"
|
|
17
|
-
- rvm:
|
|
25
|
+
- rvm: 3.0.2
|
|
18
26
|
gemfile: gemfiles/activerecord_master.gemfile
|
|
19
27
|
env: "DB=postgresql"
|
|
20
|
-
- rvm:
|
|
28
|
+
- rvm: 3.0.2
|
|
21
29
|
gemfile: gemfiles/activerecord_master.gemfile
|
|
22
30
|
env: "DB=mysql"
|
|
23
|
-
- rvm: 2.
|
|
31
|
+
- rvm: 2.7.4
|
|
32
|
+
gemfile: gemfiles/activerecord_6_1.gemfile
|
|
33
|
+
env: "DB=sqlite"
|
|
34
|
+
- rvm: 2.7.4
|
|
35
|
+
gemfile: gemfiles/activerecord_6_1.gemfile
|
|
36
|
+
env: "DB=postgresql"
|
|
37
|
+
- rvm: 2.7.4
|
|
38
|
+
gemfile: gemfiles/activerecord_6_1.gemfile
|
|
39
|
+
env: "DB=mysql"
|
|
40
|
+
- rvm: 2.7.4
|
|
41
|
+
gemfile: gemfiles/activerecord_6_0.gemfile
|
|
42
|
+
env: "DB=sqlite"
|
|
43
|
+
- rvm: 2.7.4
|
|
44
|
+
gemfile: gemfiles/activerecord_6_0.gemfile
|
|
45
|
+
env: "DB=postgresql"
|
|
46
|
+
- rvm: 2.7.4
|
|
47
|
+
gemfile: gemfiles/activerecord_6_0.gemfile
|
|
48
|
+
env: "DB=mysql"
|
|
49
|
+
- rvm: 2.6.8
|
|
24
50
|
gemfile: gemfiles/activerecord_5_2.gemfile
|
|
25
51
|
env: "DB=sqlite"
|
|
26
|
-
- rvm: 2.
|
|
52
|
+
- rvm: 2.6.8
|
|
27
53
|
gemfile: gemfiles/activerecord_5_2.gemfile
|
|
28
54
|
env: "DB=postgresql"
|
|
29
|
-
- rvm: 2.
|
|
55
|
+
- rvm: 2.6.8
|
|
30
56
|
gemfile: gemfiles/activerecord_5_2.gemfile
|
|
31
57
|
env: "DB=mysql"
|
|
32
|
-
- rvm: 2.5.
|
|
58
|
+
- rvm: 2.5.9
|
|
33
59
|
gemfile: gemfiles/activerecord_5_1.gemfile
|
|
34
60
|
env: "DB=sqlite"
|
|
35
|
-
- rvm: 2.5.
|
|
61
|
+
- rvm: 2.5.9
|
|
36
62
|
gemfile: gemfiles/activerecord_5_1.gemfile
|
|
37
63
|
env: "DB=postgresql"
|
|
38
|
-
- rvm: 2.5.
|
|
64
|
+
- rvm: 2.5.9
|
|
39
65
|
gemfile: gemfiles/activerecord_5_1.gemfile
|
|
40
66
|
env: "DB=mysql"
|
|
41
|
-
- rvm: 2.4.
|
|
67
|
+
- rvm: 2.4.10
|
|
42
68
|
gemfile: gemfiles/activerecord_5_0.gemfile
|
|
43
69
|
env: "DB=sqlite"
|
|
44
|
-
- rvm: 2.4.
|
|
70
|
+
- rvm: 2.4.10
|
|
45
71
|
gemfile: gemfiles/activerecord_5_0.gemfile
|
|
46
72
|
env: "DB=postgresql"
|
|
47
|
-
- rvm: 2.4.
|
|
73
|
+
- rvm: 2.4.10
|
|
48
74
|
gemfile: gemfiles/activerecord_5_0.gemfile
|
|
49
75
|
env: "DB=mysql"
|
|
50
|
-
- rvm: 2.3.
|
|
76
|
+
- rvm: 2.3.8
|
|
51
77
|
gemfile: gemfiles/activerecord_4_2.gemfile
|
|
52
78
|
env: "DB=postgresql"
|
|
53
|
-
- rvm: 2.3.
|
|
79
|
+
- rvm: 2.3.8
|
|
54
80
|
gemfile: gemfiles/activerecord_4_2.gemfile
|
|
55
81
|
env: "DB=sqlite"
|
|
56
82
|
# Please note that gem can't be tested against MySQL on ActiveRecord 4.2 (Dump and restore test doesn't work)!
|
data/Appraisals
CHANGED
|
@@ -1,25 +1,48 @@
|
|
|
1
|
-
appraise 'activerecord-4-2' do
|
|
2
|
-
gem 'activerecord', '~> 4.2.0'
|
|
3
|
-
gem 'pg', '~> 0.20'
|
|
4
|
-
gem 'mysql2', '~> 0.3.18'
|
|
5
|
-
end
|
|
6
|
-
|
|
7
1
|
appraise 'activerecord-5-0' do
|
|
8
2
|
gem 'activerecord', '~> 5.0.0'
|
|
9
|
-
gem
|
|
3
|
+
gem "pg", ">= 0.20", "< 2.0"
|
|
10
4
|
gem 'mysql2', '~> 0.4.4'
|
|
5
|
+
gem 'sqlite3', '~> 1.3.6'
|
|
11
6
|
end
|
|
12
7
|
|
|
13
8
|
appraise 'activerecord-5-1' do
|
|
14
9
|
gem 'activerecord', '~> 5.1.0'
|
|
10
|
+
gem "pg", ">= 0.20", "< 2.0"
|
|
15
11
|
gem 'mysql2', '~> 0.4.4'
|
|
12
|
+
gem 'sqlite3', '~> 1.3'
|
|
16
13
|
end
|
|
17
14
|
|
|
18
15
|
appraise 'activerecord-5-2' do
|
|
19
|
-
gem 'activerecord', '~> 5.2.0
|
|
16
|
+
gem 'activerecord', '~> 5.2.0'
|
|
17
|
+
gem "pg", ">= 0.20", "< 2.0"
|
|
18
|
+
gem 'mysql2', '~> 0.4.4'
|
|
19
|
+
gem 'sqlite3', '~> 1.3'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
appraise 'activerecord-6-0' do
|
|
23
|
+
gem 'activerecord', '~> 6.0.0'
|
|
24
|
+
gem "pg", ">= 0.20", "< 2.0"
|
|
20
25
|
gem 'mysql2', '~> 0.4.4'
|
|
26
|
+
gem 'sqlite3', '~> 1.4'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
appraise 'activerecord-6-0' do
|
|
30
|
+
gem 'activerecord', '~> 6.0.0'
|
|
31
|
+
gem "pg", ">= 0.20", "< 2.0"
|
|
32
|
+
gem 'mysql2', '~> 0.4.4'
|
|
33
|
+
gem 'sqlite3', '~> 1.4'
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
appraise 'activerecord-6-1' do
|
|
37
|
+
gem 'activerecord', '~> 6.1.0'
|
|
38
|
+
gem "pg", "~> 1.1"
|
|
39
|
+
gem 'mysql2', '~> 0.5'
|
|
40
|
+
gem 'sqlite3', '~> 1.4'
|
|
21
41
|
end
|
|
22
42
|
|
|
23
43
|
appraise 'activerecord-master' do
|
|
24
44
|
gem 'activerecord', git: 'https://github.com/rails/rails.git'
|
|
45
|
+
gem "pg", "~> 1.1"
|
|
46
|
+
gem 'mysql2', '~> 0.5'
|
|
47
|
+
gem 'sqlite3', '~> 1.4'
|
|
25
48
|
end
|
data/README.md
CHANGED
|
@@ -72,10 +72,12 @@ EvilSeed.configure do |config|
|
|
|
72
72
|
end
|
|
73
73
|
|
|
74
74
|
# Transformations allows you to change dumped data e. g. to hide sensitive information
|
|
75
|
-
config.customize("User") do |
|
|
75
|
+
config.customize("User") do |u|
|
|
76
76
|
# Reset password for all users to the same for ease of debugging on developer's machine
|
|
77
77
|
u["encrypted_password"] = encrypt("qwerty")
|
|
78
|
-
|
|
78
|
+
# Reset or mutate other attributes at your convenience
|
|
79
|
+
u["metadata"].merge!("foo" => "bar")
|
|
80
|
+
u["created_at"] = Time.current
|
|
79
81
|
# Please note that there you have only hash of record attributes, not the record itself!
|
|
80
82
|
end
|
|
81
83
|
|
|
@@ -84,6 +86,7 @@ EvilSeed.configure do |config|
|
|
|
84
86
|
config.anonymize("User")
|
|
85
87
|
name { Faker::Name.name }
|
|
86
88
|
email { Faker::Internet.email }
|
|
89
|
+
login { |login| "#{login}-test" }
|
|
87
90
|
end
|
|
88
91
|
```
|
|
89
92
|
|
data/evil-seed.gemspec
CHANGED
|
@@ -25,9 +25,9 @@ Gem::Specification.new do |spec|
|
|
|
25
25
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
26
26
|
spec.require_paths = ['lib']
|
|
27
27
|
|
|
28
|
-
spec.required_ruby_version = '
|
|
28
|
+
spec.required_ruby_version = '>= 2.0'
|
|
29
29
|
|
|
30
|
-
spec.add_dependency 'activerecord', '>=
|
|
30
|
+
spec.add_dependency 'activerecord', '>= 5.0'
|
|
31
31
|
|
|
32
32
|
spec.add_development_dependency 'rake', '~> 12.0'
|
|
33
33
|
spec.add_development_dependency 'minitest', '~> 5.0'
|
data/lib/evil_seed/anonymizer.rb
CHANGED
|
@@ -27,19 +27,19 @@ module EvilSeed
|
|
|
27
27
|
def call(attributes)
|
|
28
28
|
attributes.deep_dup.tap do |attrs|
|
|
29
29
|
@changers.each do |attribute, changer|
|
|
30
|
-
attrs[attribute] = changer.call
|
|
30
|
+
attrs[attribute] = changer.call(attrs[attribute])
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def respond_to_missing?(attribute_name)
|
|
36
|
-
@model_class.
|
|
36
|
+
@model_class.column_names.include?(attribute_name.to_s) || super
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
private
|
|
40
40
|
|
|
41
41
|
def method_missing(attribute_name, &block)
|
|
42
|
-
return super unless @model_class.
|
|
42
|
+
return super unless @model_class.column_names.include?(attribute_name.to_s)
|
|
43
43
|
@changers[attribute_name.to_s] = block
|
|
44
44
|
end
|
|
45
45
|
end
|
|
@@ -53,7 +53,7 @@ module EvilSeed
|
|
|
53
53
|
def insert_statement
|
|
54
54
|
connection = model_class.connection
|
|
55
55
|
table_name = connection.quote_table_name(model_class.table_name)
|
|
56
|
-
columns = model_class.
|
|
56
|
+
columns = model_class.column_names.map { |c| connection.quote_column_name(c) }.join(', ')
|
|
57
57
|
"INSERT INTO #{table_name} (#{columns}) VALUES\n"
|
|
58
58
|
end
|
|
59
59
|
|
|
@@ -73,27 +73,8 @@ module EvilSeed
|
|
|
73
73
|
|
|
74
74
|
def prepare(attributes)
|
|
75
75
|
attributes.map do |key, value|
|
|
76
|
-
model_class.
|
|
77
|
-
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
# Handles ActiveRecord API differences between AR 4.2 and 5.0
|
|
81
|
-
def attribute_types
|
|
82
|
-
return @attribute_types if defined?(@attribute_types)
|
|
83
|
-
@attribute_types = if model_class.respond_to?(:attribute_types)
|
|
84
|
-
model_class.attribute_types
|
|
85
|
-
else
|
|
86
|
-
model_class.column_types
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
# Handles ActiveRecord API differences between AR 4.2 and 5.0
|
|
91
|
-
# Casts a value from the ruby type to a type that the database knows how to understand.
|
|
92
|
-
def serialize(type, value)
|
|
93
|
-
if type.respond_to?(:serialize)
|
|
94
|
-
type.serialize(value)
|
|
95
|
-
else
|
|
96
|
-
type.type_cast_for_database(value)
|
|
76
|
+
type = model_class.attribute_types[key]
|
|
77
|
+
model_class.connection.quote(type.serialize(value))
|
|
97
78
|
end
|
|
98
79
|
end
|
|
99
80
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'active_support/core_ext/array/grouping'
|
|
4
|
+
|
|
3
5
|
# As method ActiveRecord::Relation#in_batches is available only since ActiveRecord 5.0
|
|
4
6
|
# we will backport it only for us via refinements for ActiveRecord 4.2 compatibility.
|
|
5
7
|
unless ActiveRecord::Batches.instance_methods(false).include?(:in_batches)
|
|
@@ -122,8 +124,8 @@ module EvilSeed
|
|
|
122
124
|
# @param relation [ActiveRecord::Relation]
|
|
123
125
|
# @return [Array<Hash{String => String, Integer, Float, Boolean, nil}>]
|
|
124
126
|
def fetch_attributes(relation)
|
|
125
|
-
relation.pluck(*model_class.
|
|
126
|
-
Hash[model_class.
|
|
127
|
+
relation.pluck(*model_class.column_names).map do |row|
|
|
128
|
+
Hash[model_class.column_names.zip(row)]
|
|
127
129
|
end
|
|
128
130
|
end
|
|
129
131
|
|
|
@@ -144,7 +146,7 @@ module EvilSeed
|
|
|
144
146
|
next false if reflection.options[:polymorphic] # TODO: Add support for polymorphic belongs_to
|
|
145
147
|
excluded = root.excluded?("#{association_path}.#{reflection.name}") || reflection.name == inverse_reflection
|
|
146
148
|
if excluded
|
|
147
|
-
nullify_columns << reflection.foreign_key if model_class.
|
|
149
|
+
nullify_columns << reflection.foreign_key if model_class.column_names.include?(reflection.foreign_key)
|
|
148
150
|
else
|
|
149
151
|
foreign_keys[reflection.name] = reflection.foreign_key
|
|
150
152
|
table_names[reflection.name] = reflection.table_name
|
data/lib/evil_seed/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: evil-seed
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andrey Novikov
|
|
8
8
|
- Vladimir Dementyev
|
|
9
|
-
autorequire:
|
|
9
|
+
autorequire:
|
|
10
10
|
bindir: exe
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2022-03-14 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: activerecord
|
|
@@ -17,14 +17,14 @@ dependencies:
|
|
|
17
17
|
requirements:
|
|
18
18
|
- - ">="
|
|
19
19
|
- !ruby/object:Gem::Version
|
|
20
|
-
version: '
|
|
20
|
+
version: '5.0'
|
|
21
21
|
type: :runtime
|
|
22
22
|
prerelease: false
|
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
|
24
24
|
requirements:
|
|
25
25
|
- - ">="
|
|
26
26
|
- !ruby/object:Gem::Version
|
|
27
|
-
version: '
|
|
27
|
+
version: '5.0'
|
|
28
28
|
- !ruby/object:Gem::Dependency
|
|
29
29
|
name: rake
|
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -172,10 +172,11 @@ files:
|
|
|
172
172
|
- bin/setup
|
|
173
173
|
- evil-seed.gemspec
|
|
174
174
|
- gemfiles/.bundle/config
|
|
175
|
-
- gemfiles/activerecord_4_2.gemfile
|
|
176
175
|
- gemfiles/activerecord_5_0.gemfile
|
|
177
176
|
- gemfiles/activerecord_5_1.gemfile
|
|
178
177
|
- gemfiles/activerecord_5_2.gemfile
|
|
178
|
+
- gemfiles/activerecord_6_0.gemfile
|
|
179
|
+
- gemfiles/activerecord_6_1.gemfile
|
|
179
180
|
- gemfiles/activerecord_master.gemfile
|
|
180
181
|
- lib/evil-seed.rb
|
|
181
182
|
- lib/evil/seed.rb
|
|
@@ -194,13 +195,13 @@ homepage: https://github.com/palkan/evil-seed
|
|
|
194
195
|
licenses:
|
|
195
196
|
- MIT
|
|
196
197
|
metadata: {}
|
|
197
|
-
post_install_message:
|
|
198
|
+
post_install_message:
|
|
198
199
|
rdoc_options: []
|
|
199
200
|
require_paths:
|
|
200
201
|
- lib
|
|
201
202
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
202
203
|
requirements:
|
|
203
|
-
- - "
|
|
204
|
+
- - ">="
|
|
204
205
|
- !ruby/object:Gem::Version
|
|
205
206
|
version: '2.0'
|
|
206
207
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
@@ -209,9 +210,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
209
210
|
- !ruby/object:Gem::Version
|
|
210
211
|
version: '0'
|
|
211
212
|
requirements: []
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
signing_key:
|
|
213
|
+
rubygems_version: 3.2.22
|
|
214
|
+
signing_key:
|
|
215
215
|
specification_version: 4
|
|
216
216
|
summary: Create partial and anonymized production database dumps for use in development
|
|
217
217
|
test_files: []
|