pgdump_scrambler 0.4.0 → 0.4.1
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/.github/workflows/main.yml +40 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +45 -1
- data/CHANGELOG.md +3 -0
- data/Gemfile +13 -2
- data/Gemfile.lock +26 -12
- data/README.md +1 -1
- data/Rakefile +5 -3
- data/bin/console +4 -3
- data/bin/pgdump-obfuscator +7 -3
- data/lib/config/table.rb +8 -10
- data/lib/pgdump_scrambler/config.rb +31 -30
- data/lib/pgdump_scrambler/dumper.rb +23 -17
- data/lib/pgdump_scrambler/railtie.rb +2 -1
- data/lib/pgdump_scrambler/s3_request.rb +31 -36
- data/lib/pgdump_scrambler/s3_uploader.rb +17 -8
- data/lib/pgdump_scrambler/version.rb +2 -1
- data/lib/pgdump_scrambler.rb +6 -7
- data/lib/tasks/pgdump_scrambler_tasks.rake +8 -6
- data/pgdump_scrambler.gemspec +17 -24
- metadata +11 -66
- data/.rubocop_todo.yml +0 -173
- data/.ruby-version +0 -1
- data/.travis.yml +0 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: da5d3c9bc68d351090dfabdab28ad0bd216515554d61f8d4a06381eba5fc1ce4
|
|
4
|
+
data.tar.gz: 0e01334e4769d064ff9d3e2ebbca847f389ec12157b7ac299f8c89568937e2fc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3b12790519c8980cc4b208f3e9ad6b137d83ab970acfc2d03cf21793893ed376a67e7d47c2f0d83afb4c675320ba6548125c22dc2d8e66050c70c1414fa76f89
|
|
7
|
+
data.tar.gz: 98f6af73aa1b377c4c31e365c65dcefa1b90cb8c6f3b1c69220270a519db0d9b55e0fb9440ba843c0dffb9819d3b0f63592935656feaf18d8fd438d8f314ed82
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: Ruby
|
|
2
|
+
|
|
3
|
+
on: [pull_request]
|
|
4
|
+
|
|
5
|
+
concurrency:
|
|
6
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
7
|
+
cancel-in-progress: true
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
build:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
|
|
13
|
+
strategy:
|
|
14
|
+
matrix:
|
|
15
|
+
ruby-version:
|
|
16
|
+
- "3.2"
|
|
17
|
+
- "3.1"
|
|
18
|
+
- "3.0"
|
|
19
|
+
# - "3.3.0-preview2"
|
|
20
|
+
|
|
21
|
+
# services:
|
|
22
|
+
# postgres:
|
|
23
|
+
# image: postgres:14
|
|
24
|
+
# ports: ["5432:5432"]
|
|
25
|
+
# options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
|
|
26
|
+
# env:
|
|
27
|
+
# POSTGRES_USER: postgres
|
|
28
|
+
# POSTGRES_PASSWORD: postgres
|
|
29
|
+
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/checkout@v4
|
|
32
|
+
- name: Set up Ruby ${{ matrix.ruby-version }}
|
|
33
|
+
uses: ruby/setup-ruby@v1
|
|
34
|
+
with:
|
|
35
|
+
ruby-version: ${{ matrix.ruby-version }}
|
|
36
|
+
bundler-cache: true
|
|
37
|
+
- name: rspec
|
|
38
|
+
run: bundle exec rspec
|
|
39
|
+
- name: rubocop
|
|
40
|
+
run: bundle exec rubocop
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
|
@@ -1,2 +1,46 @@
|
|
|
1
|
-
|
|
1
|
+
require: rubocop-rspec
|
|
2
2
|
|
|
3
|
+
AllCops:
|
|
4
|
+
TargetRubyVersion: 3.0
|
|
5
|
+
NewCops: enable
|
|
6
|
+
|
|
7
|
+
# https://docs.rubocop.org/rubocop/cops_layout.html#layoutargumentalignment
|
|
8
|
+
Layout/ArgumentAlignment:
|
|
9
|
+
EnforcedStyle: with_fixed_indentation
|
|
10
|
+
|
|
11
|
+
# https://docs.rubocop.org/rubocop/cops_layout.html#layoutmultilinemethodcallindentation
|
|
12
|
+
Layout/MultilineMethodCallIndentation:
|
|
13
|
+
EnforcedStyle: indented
|
|
14
|
+
|
|
15
|
+
Style/Documentation:
|
|
16
|
+
Enabled: false
|
|
17
|
+
|
|
18
|
+
Style/FormatString:
|
|
19
|
+
Enabled: false
|
|
20
|
+
|
|
21
|
+
Metrics/AbcSize:
|
|
22
|
+
Enabled: false
|
|
23
|
+
|
|
24
|
+
Metrics/ClassLength:
|
|
25
|
+
Enabled: false
|
|
26
|
+
|
|
27
|
+
Metrics/MethodLength:
|
|
28
|
+
Enabled: false
|
|
29
|
+
|
|
30
|
+
Metrics/BlockLength:
|
|
31
|
+
Enabled: false
|
|
32
|
+
|
|
33
|
+
Metrics/CyclomaticComplexity:
|
|
34
|
+
Enabled: false
|
|
35
|
+
|
|
36
|
+
Metrics/PerceivedComplexity:
|
|
37
|
+
Enabled: false
|
|
38
|
+
|
|
39
|
+
RSpec/ExampleLength:
|
|
40
|
+
Enabled: false
|
|
41
|
+
|
|
42
|
+
RSpec/DescribedClass:
|
|
43
|
+
Enabled: false
|
|
44
|
+
|
|
45
|
+
RSpec/MultipleExpectations:
|
|
46
|
+
Enabled: false
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
source 'https://rubygems.org'
|
|
4
|
+
|
|
5
|
+
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
|
4
6
|
|
|
5
7
|
# Specify your gem's dependencies in pgdump_scrambler.gemspec
|
|
6
8
|
gemspec
|
|
9
|
+
|
|
10
|
+
gem 'rails', '~> 7.0'
|
|
11
|
+
|
|
12
|
+
gem 'rake', '~> 13.0'
|
|
13
|
+
|
|
14
|
+
gem 'rspec', '~> 3.12'
|
|
15
|
+
|
|
16
|
+
gem 'rubocop', '1.57.1'
|
|
17
|
+
gem 'rubocop-rspec', '2.24.1'
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
pgdump_scrambler (0.4.
|
|
4
|
+
pgdump_scrambler (0.4.1)
|
|
5
5
|
|
|
6
6
|
GEM
|
|
7
7
|
remote: https://rubygems.org/
|
|
@@ -72,6 +72,7 @@ GEM
|
|
|
72
72
|
minitest (>= 5.1)
|
|
73
73
|
tzinfo (~> 2.0)
|
|
74
74
|
ast (2.4.2)
|
|
75
|
+
base64 (0.1.1)
|
|
75
76
|
builder (3.2.4)
|
|
76
77
|
concurrent-ruby (1.2.2)
|
|
77
78
|
crass (1.0.6)
|
|
@@ -83,6 +84,7 @@ GEM
|
|
|
83
84
|
i18n (1.12.0)
|
|
84
85
|
concurrent-ruby (~> 1.0)
|
|
85
86
|
json (2.6.3)
|
|
87
|
+
language_server-protocol (3.17.0.3)
|
|
86
88
|
loofah (2.20.0)
|
|
87
89
|
crass (~> 1.0.2)
|
|
88
90
|
nokogiri (>= 1.5.9)
|
|
@@ -107,9 +109,10 @@ GEM
|
|
|
107
109
|
nio4r (2.5.9)
|
|
108
110
|
nokogiri (1.14.3-x86_64-linux)
|
|
109
111
|
racc (~> 1.4)
|
|
110
|
-
parallel (1.
|
|
111
|
-
parser (3.2.2.
|
|
112
|
+
parallel (1.23.0)
|
|
113
|
+
parser (3.2.2.4)
|
|
112
114
|
ast (~> 2.4.1)
|
|
115
|
+
racc
|
|
113
116
|
racc (1.6.2)
|
|
114
117
|
rack (2.2.6.4)
|
|
115
118
|
rack-test (2.1.0)
|
|
@@ -142,8 +145,8 @@ GEM
|
|
|
142
145
|
zeitwerk (~> 2.5)
|
|
143
146
|
rainbow (3.1.1)
|
|
144
147
|
rake (13.0.6)
|
|
145
|
-
regexp_parser (2.
|
|
146
|
-
rexml (3.2.
|
|
148
|
+
regexp_parser (2.8.2)
|
|
149
|
+
rexml (3.2.6)
|
|
147
150
|
rspec (3.12.0)
|
|
148
151
|
rspec-core (~> 3.12.0)
|
|
149
152
|
rspec-expectations (~> 3.12.0)
|
|
@@ -157,24 +160,34 @@ GEM
|
|
|
157
160
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
158
161
|
rspec-support (~> 3.12.0)
|
|
159
162
|
rspec-support (3.12.0)
|
|
160
|
-
rubocop (1.
|
|
163
|
+
rubocop (1.57.1)
|
|
164
|
+
base64 (~> 0.1.1)
|
|
161
165
|
json (~> 2.3)
|
|
166
|
+
language_server-protocol (>= 3.17.0)
|
|
162
167
|
parallel (~> 1.10)
|
|
163
|
-
parser (>= 3.2.
|
|
168
|
+
parser (>= 3.2.2.4)
|
|
164
169
|
rainbow (>= 2.2.2, < 4.0)
|
|
165
170
|
regexp_parser (>= 1.8, < 3.0)
|
|
166
171
|
rexml (>= 3.2.5, < 4.0)
|
|
167
|
-
rubocop-ast (>= 1.28.
|
|
172
|
+
rubocop-ast (>= 1.28.1, < 2.0)
|
|
168
173
|
ruby-progressbar (~> 1.7)
|
|
169
174
|
unicode-display_width (>= 2.4.0, < 3.0)
|
|
170
|
-
rubocop-ast (1.
|
|
175
|
+
rubocop-ast (1.29.0)
|
|
171
176
|
parser (>= 3.2.1.0)
|
|
177
|
+
rubocop-capybara (2.19.0)
|
|
178
|
+
rubocop (~> 1.41)
|
|
179
|
+
rubocop-factory_bot (2.24.0)
|
|
180
|
+
rubocop (~> 1.33)
|
|
181
|
+
rubocop-rspec (2.24.1)
|
|
182
|
+
rubocop (~> 1.33)
|
|
183
|
+
rubocop-capybara (~> 2.17)
|
|
184
|
+
rubocop-factory_bot (~> 2.22)
|
|
172
185
|
ruby-progressbar (1.13.0)
|
|
173
186
|
thor (1.2.1)
|
|
174
187
|
timeout (0.3.2)
|
|
175
188
|
tzinfo (2.0.6)
|
|
176
189
|
concurrent-ruby (~> 1.0)
|
|
177
|
-
unicode-display_width (2.
|
|
190
|
+
unicode-display_width (2.5.0)
|
|
178
191
|
websocket-driver (0.7.5)
|
|
179
192
|
websocket-extensions (>= 0.1.0)
|
|
180
193
|
websocket-extensions (0.1.5)
|
|
@@ -188,7 +201,8 @@ DEPENDENCIES
|
|
|
188
201
|
rails (~> 7.0)
|
|
189
202
|
rake (~> 13.0)
|
|
190
203
|
rspec (~> 3.12)
|
|
191
|
-
rubocop
|
|
204
|
+
rubocop (= 1.57.1)
|
|
205
|
+
rubocop-rspec (= 2.24.1)
|
|
192
206
|
|
|
193
207
|
BUNDLED WITH
|
|
194
|
-
2.4.
|
|
208
|
+
2.4.20
|
data/README.md
CHANGED
data/Rakefile
CHANGED
data/bin/console
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
4
|
+
require 'bundler/setup'
|
|
5
|
+
require 'pgdump_scrambler'
|
|
5
6
|
|
|
6
7
|
# You can add fixtures and/or initialization code here to make experimenting
|
|
7
8
|
# with your gem easier. You can also use a different console, if you like.
|
|
@@ -10,5 +11,5 @@ require "pgdump_scrambler"
|
|
|
10
11
|
# require "pry"
|
|
11
12
|
# Pry.start
|
|
12
13
|
|
|
13
|
-
require
|
|
14
|
+
require 'irb'
|
|
14
15
|
IRB.start(__FILE__)
|
data/bin/pgdump-obfuscator
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require 'English'
|
|
2
5
|
require 'shellwords'
|
|
3
6
|
|
|
4
|
-
arch =
|
|
7
|
+
arch =
|
|
8
|
+
case RUBY_PLATFORM
|
|
5
9
|
when /aarch64-linux/
|
|
6
10
|
'linux-arm64'
|
|
7
11
|
when /x86_64-linux/
|
|
@@ -12,8 +16,8 @@ arch = case RUBY_PLATFORM
|
|
|
12
16
|
'darwin-arm64'
|
|
13
17
|
else
|
|
14
18
|
raise "Unsupported platform: #{RUBY_PLATFORM}"
|
|
15
|
-
end
|
|
19
|
+
end
|
|
16
20
|
|
|
17
21
|
cmd = File.expand_path "#{File.dirname(__FILE__)}/../libexec/pgdump-obfuscator-#{arch}"
|
|
18
22
|
|
|
19
|
-
exec "#{cmd} #{Shellwords.join(
|
|
23
|
+
exec "#{cmd} #{Shellwords.join($ARGV)}"
|
data/lib/config/table.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module PgdumpScrambler
|
|
3
4
|
class Config
|
|
4
5
|
class Table
|
|
@@ -6,7 +7,7 @@ module PgdumpScrambler
|
|
|
6
7
|
|
|
7
8
|
def initialize(name, columns)
|
|
8
9
|
@name = name
|
|
9
|
-
@column_hash = columns.sort_by(&:name).
|
|
10
|
+
@column_hash = columns.sort_by(&:name).to_h { |column| [column.name, column] }
|
|
10
11
|
end
|
|
11
12
|
|
|
12
13
|
def columns
|
|
@@ -39,29 +40,26 @@ module PgdumpScrambler
|
|
|
39
40
|
SCRAMBLE_CONST_REGEXP = /\Aconst\[.+\]\z/
|
|
40
41
|
NOP_METHODS = %w[unspecified nop].freeze
|
|
41
42
|
UNSPECIFIED = 'unspecified'
|
|
42
|
-
attr_reader :name
|
|
43
|
+
attr_reader :name, :scramble_method
|
|
43
44
|
|
|
44
45
|
def initialize(name, scramble_method = UNSPECIFIED)
|
|
45
46
|
unless self.class.valid_scramble_method?(scramble_method)
|
|
46
47
|
raise ArgumentError, "invalid scramble_method: #{scramble_method}"
|
|
47
48
|
end
|
|
49
|
+
|
|
48
50
|
@name = name
|
|
49
51
|
@scramble_method = scramble_method
|
|
50
52
|
end
|
|
51
53
|
|
|
52
|
-
def scramble_method
|
|
53
|
-
@scramble_method
|
|
54
|
-
end
|
|
55
|
-
|
|
56
54
|
def unspecifiled?
|
|
57
55
|
@scramble_method == UNSPECIFIED
|
|
58
56
|
end
|
|
59
57
|
|
|
60
58
|
def option
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
59
|
+
return if NOP_METHODS.member?(@scramble_method)
|
|
60
|
+
|
|
61
|
+
m = Shellwords.escape(scramble_method)
|
|
62
|
+
"#{@name}:#{m}"
|
|
65
63
|
end
|
|
66
64
|
|
|
67
65
|
class << self
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require 'yaml'
|
|
3
4
|
require 'erb'
|
|
4
5
|
require 'set'
|
|
@@ -19,14 +20,14 @@ module PgdumpScrambler
|
|
|
19
20
|
'prefix' => 'YOUR_S3_PATH_PREFIX',
|
|
20
21
|
'access_key_id' => "<%= ENV['AWS_ACCESS_KEY_ID'] %>",
|
|
21
22
|
'secret_key' => "<%= ENV['AWS_SECRET_KEY'] %>"
|
|
22
|
-
}
|
|
23
|
+
}.freeze
|
|
23
24
|
attr_reader :dump_path, :s3, :resolved_s3, :exclude_tables, :pgdump_args
|
|
24
25
|
|
|
25
|
-
def initialize(tables, dump_path, s3, exclude_tables, pgdump_args)
|
|
26
|
-
@table_hash = tables.sort_by(&:name).
|
|
26
|
+
def initialize(tables, dump_path, s3, exclude_tables, pgdump_args) # rubocop:disable Naming/MethodParameterName
|
|
27
|
+
@table_hash = tables.sort_by(&:name).to_h { |table| [table.name, table] }
|
|
27
28
|
@dump_path = dump_path
|
|
28
29
|
@s3 = s3
|
|
29
|
-
@resolved_s3 = s3.
|
|
30
|
+
@resolved_s3 = s3.transform_values { |v| ERB.new(v).result } if s3
|
|
30
31
|
@exclude_tables = exclude_tables
|
|
31
32
|
@pgdump_args = pgdump_args
|
|
32
33
|
end
|
|
@@ -45,7 +46,7 @@ module PgdumpScrambler
|
|
|
45
46
|
|
|
46
47
|
def update_with(other)
|
|
47
48
|
new_tables = @table_hash.map do |_, table|
|
|
48
|
-
if other_table = other.table(table.name)
|
|
49
|
+
if (other_table = other.table(table.name))
|
|
49
50
|
table.update_with(other_table)
|
|
50
51
|
else
|
|
51
52
|
table
|
|
@@ -66,15 +67,15 @@ module PgdumpScrambler
|
|
|
66
67
|
yml = {}
|
|
67
68
|
yml[KEY_DUMP_PATH] = @dump_path
|
|
68
69
|
yml[KEY_S3] = @s3 if @s3
|
|
69
|
-
yml[KEY_EXCLUDE_TABLES] = @exclude_tables if @exclude_tables.size
|
|
70
|
+
yml[KEY_EXCLUDE_TABLES] = @exclude_tables if @exclude_tables.size.positive?
|
|
70
71
|
yml[KEY_TABLES] = @table_hash.map do |_, table|
|
|
71
72
|
columns = table.columns
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
]
|
|
77
|
-
|
|
73
|
+
next if columns.empty?
|
|
74
|
+
|
|
75
|
+
[
|
|
76
|
+
table.name,
|
|
77
|
+
columns.to_h { |column| [column.name, column.scramble_method] }
|
|
78
|
+
]
|
|
78
79
|
end.compact.to_h
|
|
79
80
|
YAML.dump(yml, io)
|
|
80
81
|
end
|
|
@@ -92,21 +93,22 @@ module PgdumpScrambler
|
|
|
92
93
|
class << self
|
|
93
94
|
def read(io)
|
|
94
95
|
yml = YAML.safe_load(io, permitted_classes: [], permitted_symbols: [], aliases: true)
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
96
|
+
tables =
|
|
97
|
+
if yml[KEY_TABLES]
|
|
98
|
+
yml[KEY_TABLES].map do |table_name, columns|
|
|
99
|
+
Table.new(
|
|
100
|
+
table_name,
|
|
101
|
+
columns.map { |name, scramble_method| Column.new(name, scramble_method) }
|
|
102
|
+
)
|
|
103
|
+
end
|
|
104
|
+
else
|
|
105
|
+
[]
|
|
101
106
|
end
|
|
102
|
-
else
|
|
103
|
-
tables = []
|
|
104
|
-
end
|
|
105
107
|
Config.new(tables, yml[KEY_DUMP_PATH], yml[KEY_S3], yml[KEY_EXCLUDE_TABLES] || [], yml[KEY_PGDUMP_ARGS])
|
|
106
108
|
end
|
|
107
109
|
|
|
108
110
|
def read_file(path)
|
|
109
|
-
open(path, 'r') do |f|
|
|
111
|
+
File.open(path, 'r') do |f|
|
|
110
112
|
read(f)
|
|
111
113
|
end
|
|
112
114
|
end
|
|
@@ -118,18 +120,17 @@ module PgdumpScrambler
|
|
|
118
120
|
else
|
|
119
121
|
Rails.application.eager_load!
|
|
120
122
|
end
|
|
121
|
-
klasses_by_table = ActiveRecord::Base.descendants.
|
|
123
|
+
klasses_by_table = ActiveRecord::Base.descendants.to_h { |klass| [klass.table_name, klass] }
|
|
122
124
|
table_names = ActiveRecord::Base.connection.tables.sort - IGNORED_ACTIVE_RECORD_TABLES
|
|
123
125
|
tables = table_names.map do |table_name|
|
|
124
126
|
klass = klasses_by_table[table_name]
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
Column.new(name)
|
|
130
|
-
end
|
|
131
|
-
Table.new(table_name, columns)
|
|
127
|
+
next unless klass
|
|
128
|
+
|
|
129
|
+
column_names = klass.columns.map(&:name).reject do |name|
|
|
130
|
+
IGNORED_ACTIVE_RECORD_COLUMNS.member?(name)
|
|
132
131
|
end
|
|
132
|
+
columns = column_names.map { |name| Column.new(name) }
|
|
133
|
+
Table.new(table_name, columns)
|
|
133
134
|
end.compact
|
|
134
135
|
Config.new(tables, 'scrambled.dump.gz', Config::DEFAULT_S3_PROPERTIES, [], nil)
|
|
135
136
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require 'open3'
|
|
3
4
|
module PgdumpScrambler
|
|
4
5
|
class Dumper
|
|
@@ -9,13 +10,11 @@ module PgdumpScrambler
|
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def run
|
|
12
|
-
puts
|
|
13
|
+
puts 'Executing pg_dump...'
|
|
13
14
|
puts full_command
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
raise "pg_dump failed!"
|
|
18
|
-
end
|
|
15
|
+
raise 'pg_dump failed!' unless system(full_command)
|
|
16
|
+
|
|
17
|
+
puts 'Done!'
|
|
19
18
|
end
|
|
20
19
|
|
|
21
20
|
private
|
|
@@ -25,10 +24,10 @@ module PgdumpScrambler
|
|
|
25
24
|
end
|
|
26
25
|
|
|
27
26
|
def obfuscator_command
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
return unless (options = @config.obfuscator_options)
|
|
28
|
+
|
|
29
|
+
command = File.expand_path('../../bin/pgdump-obfuscator', __dir__)
|
|
30
|
+
"#{command} #{options}"
|
|
32
31
|
end
|
|
33
32
|
|
|
34
33
|
def pgdump_command
|
|
@@ -39,18 +38,25 @@ module PgdumpScrambler
|
|
|
39
38
|
command << "--username=#{Shellwords.escape(@db_config['username'])}" if @db_config['username']
|
|
40
39
|
command << "--host='#{@db_config['host']}'" if @db_config['host']
|
|
41
40
|
command << "--port='#{@db_config['port']}'" if @db_config['port']
|
|
42
|
-
|
|
41
|
+
if @config.exclude_tables.present?
|
|
42
|
+
command << @config.exclude_tables.map do |exclude_table|
|
|
43
|
+
"--exclude-table-data=#{exclude_table}"
|
|
44
|
+
end.join(' ')
|
|
45
|
+
end
|
|
43
46
|
command << @db_config['database']
|
|
44
47
|
command.join(' ')
|
|
45
48
|
end
|
|
46
49
|
|
|
47
50
|
def load_database_yml
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
return unless defined?(Rails)
|
|
52
|
+
|
|
53
|
+
db_config = YAML.safe_load_file(
|
|
54
|
+
Rails.root.join('config', 'database.yml'),
|
|
55
|
+
permitted_classes: [],
|
|
56
|
+
permitted_symbols: [],
|
|
57
|
+
aliases: true
|
|
58
|
+
)
|
|
59
|
+
db_config[Rails.env]
|
|
54
60
|
end
|
|
55
61
|
end
|
|
56
62
|
end
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module PgdumpScrambler
|
|
3
4
|
class Railtie < ::Rails::Railtie
|
|
4
5
|
rake_tasks do
|
|
5
|
-
load File.expand_path('
|
|
6
|
+
load File.expand_path('../tasks/pgdump_scrambler_tasks.rake', __dir__)
|
|
6
7
|
end
|
|
7
8
|
end
|
|
8
9
|
end
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require 'uri'
|
|
3
4
|
require 'digest'
|
|
4
5
|
require 'openssl'
|
|
5
6
|
|
|
6
7
|
module PgdumpScrambler
|
|
7
8
|
class S3Request
|
|
8
|
-
def initialize(s3_path:, verb:, region:, bucket:, access_key_id:, secret_key:, time: nil)
|
|
9
|
+
def initialize(s3_path:, verb:, region:, bucket:, access_key_id:, secret_key:, time: nil) # rubocop:disable Metrics/ParameterLists
|
|
9
10
|
@s3_path = s3_path.start_with?('/') ? s3_path : "/#{s3_path}"
|
|
10
11
|
@verb = verb
|
|
11
12
|
@time = time || Time.now.utc
|
|
@@ -18,7 +19,7 @@ module PgdumpScrambler
|
|
|
18
19
|
def canonical_request
|
|
19
20
|
[
|
|
20
21
|
@verb,
|
|
21
|
-
|
|
22
|
+
self.class.uri_encode(@s3_path),
|
|
22
23
|
canonical_query_string,
|
|
23
24
|
"host:#{@bucket}.s3.amazonaws.com\n", # canonical headers
|
|
24
25
|
'host', # signed headers
|
|
@@ -38,13 +39,15 @@ module PgdumpScrambler
|
|
|
38
39
|
end
|
|
39
40
|
|
|
40
41
|
def url
|
|
41
|
-
|
|
42
|
+
encoded_path = self.class.uri_encode(@s3_path)
|
|
43
|
+
File.join("https://#{@bucket}.s3.amazonaws.com/",
|
|
44
|
+
"#{encoded_path}?#{canonical_query_string}&X-Amz-Signature=#{signature}")
|
|
42
45
|
end
|
|
43
46
|
|
|
44
47
|
private
|
|
45
48
|
|
|
46
49
|
def iso_time
|
|
47
|
-
@time.strftime(
|
|
50
|
+
@time.strftime('%Y%m%dT%H%M%SZ')
|
|
48
51
|
end
|
|
49
52
|
|
|
50
53
|
def iso_date
|
|
@@ -52,15 +55,17 @@ module PgdumpScrambler
|
|
|
52
55
|
end
|
|
53
56
|
|
|
54
57
|
def hmac_sha256(key, message)
|
|
55
|
-
OpenSSL::HMAC.digest(OpenSSL::Digest
|
|
58
|
+
OpenSSL::HMAC.digest(OpenSSL::Digest.new('SHA256'), key, message)
|
|
56
59
|
end
|
|
57
60
|
|
|
58
61
|
def hmac_sha256_hex(key, message)
|
|
59
|
-
OpenSSL::HMAC.hexdigest(OpenSSL::Digest
|
|
62
|
+
OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('SHA256'), key, message)
|
|
60
63
|
end
|
|
61
64
|
|
|
62
65
|
def canonical_query_string
|
|
66
|
+
# rubocop:disable Layout/LineLength
|
|
63
67
|
"X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=#{@access_key_id}%2F#{iso_date}%2F#{@region}%2Fs3%2Faws4_request&X-Amz-Date=#{iso_time}&X-Amz-Expires=86400&X-Amz-SignedHeaders=host"
|
|
68
|
+
# rubocop:enable Layout/LineLength
|
|
64
69
|
end
|
|
65
70
|
|
|
66
71
|
def string_to_sign
|
|
@@ -68,39 +73,29 @@ module PgdumpScrambler
|
|
|
68
73
|
'AWS4-HMAC-SHA256',
|
|
69
74
|
iso_time,
|
|
70
75
|
"#{iso_date}/#{@region}/s3/aws4_request",
|
|
71
|
-
Digest::SHA256.hexdigest(canonical_request)
|
|
76
|
+
Digest::SHA256.hexdigest(canonical_request)
|
|
72
77
|
].join("\n")
|
|
73
78
|
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
if $0 == __FILE__
|
|
78
|
-
# https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html
|
|
79
|
-
require "minitest/autorun"
|
|
80
|
-
class TestS3Request < Minitest::Test
|
|
81
|
-
def setup
|
|
82
|
-
@s3_request = PgdumpScrambler::S3Request.new(verb: 'GET', s3_path: '/test.txt', region: 'us-east-1', bucket: 'examplebucket', access_key_id: 'AKIAIOSFODNN7EXAMPLE', secret_key: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY', time: Time.utc(2013, 5, 24, 0, 0, 0))
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def test_canonical_request
|
|
86
|
-
assert_equal <<~EOS.chomp, @s3_request.canonical_request
|
|
87
|
-
GET
|
|
88
|
-
/test.txt
|
|
89
|
-
X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host
|
|
90
|
-
host:examplebucket.s3.amazonaws.com
|
|
91
|
-
|
|
92
|
-
host
|
|
93
|
-
UNSIGNED-PAYLOAD
|
|
94
|
-
EOS
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def test_signature
|
|
98
|
-
assert_equal 'aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404', @s3_request.signature
|
|
99
|
-
end
|
|
100
79
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
80
|
+
class << self
|
|
81
|
+
# https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html
|
|
82
|
+
# * URI encode every byte except the unreserved characters: 'A'-'Z', 'a'-'z', '0'-'9', '-', '.', '_', and '~'.
|
|
83
|
+
# * The space character is a reserved character and must be encoded as "%20" (and not as "+").
|
|
84
|
+
# * Each URI encoded byte is formed by a '%' and the two-digit hexadecimal value of the byte.
|
|
85
|
+
# * Letters in the hexadecimal value must be uppercase, for example "%1A".
|
|
86
|
+
# * Encode the forward slash character, '/', everywhere except in the object key name.
|
|
87
|
+
# For example, if the object key name is photos/Jan/sample.jpg,
|
|
88
|
+
# the forward slash in the key name is not encoded.
|
|
89
|
+
def uri_encode(str)
|
|
90
|
+
str.gsub(%r{[^A-Za-z0-9\-._~/]}) do
|
|
91
|
+
us = Regexp.last_match(0)
|
|
92
|
+
tmp = +''
|
|
93
|
+
us.each_byte do |uc|
|
|
94
|
+
tmp << sprintf('%%%02X', uc)
|
|
95
|
+
end
|
|
96
|
+
tmp
|
|
97
|
+
end.force_encoding(Encoding::US_ASCII)
|
|
98
|
+
end
|
|
104
99
|
end
|
|
105
100
|
end
|
|
106
101
|
end
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require 'net/http'
|
|
3
4
|
require 'uri'
|
|
4
|
-
require_relative '
|
|
5
|
+
require_relative 's3_request'
|
|
5
6
|
|
|
6
7
|
module PgdumpScrambler
|
|
7
8
|
class S3UploadError < StandardError
|
|
8
9
|
attr_reader :response
|
|
10
|
+
|
|
9
11
|
def initialize(response)
|
|
10
12
|
@response = response
|
|
11
13
|
super "S3 upload failed: #{response.body}"
|
|
@@ -13,17 +15,25 @@ module PgdumpScrambler
|
|
|
13
15
|
end
|
|
14
16
|
|
|
15
17
|
class S3Uploader
|
|
16
|
-
def initialize(s3_path:, local_path:, region:, bucket:, access_key_id:, secret_key:)
|
|
18
|
+
def initialize(s3_path:, local_path:, region:, bucket:, access_key_id:, secret_key:) # rubocop:disable Metrics/ParameterLists
|
|
17
19
|
raise 'missing access_key_id' if access_key_id.nil? || access_key_id.empty?
|
|
18
20
|
raise 'missing secret_key' if secret_key.nil? || secret_key.empty?
|
|
19
|
-
|
|
21
|
+
|
|
22
|
+
@s3_request = S3Request.new(
|
|
23
|
+
s3_path: s3_path,
|
|
24
|
+
verb: 'PUT',
|
|
25
|
+
region: region,
|
|
26
|
+
bucket: bucket,
|
|
27
|
+
access_key_id: access_key_id,
|
|
28
|
+
secret_key: secret_key
|
|
29
|
+
)
|
|
20
30
|
@local_path = local_path
|
|
21
31
|
end
|
|
22
32
|
|
|
23
33
|
def run
|
|
24
34
|
uri = URI.parse(@s3_request.url)
|
|
25
|
-
puts "
|
|
26
|
-
open(@local_path, 'r') do |io|
|
|
35
|
+
puts "Uploading #{@local_path} to #{uri.host}#{uri.path}"
|
|
36
|
+
File.open(@local_path, 'r') do |io|
|
|
27
37
|
uri_path = uri.path
|
|
28
38
|
uri_path += "?#{uri.query}" if uri.query
|
|
29
39
|
req = Net::HTTP::Put.new(uri_path)
|
|
@@ -33,10 +43,9 @@ module PgdumpScrambler
|
|
|
33
43
|
http = Net::HTTP.new(uri.host, uri.port)
|
|
34
44
|
http.use_ssl = true
|
|
35
45
|
res = http.request(req)
|
|
36
|
-
if res.code != '200'
|
|
37
|
-
raise S3UploadError.new(res)
|
|
38
|
-
end
|
|
46
|
+
raise S3UploadError, res if res.code != '200'
|
|
39
47
|
end
|
|
48
|
+
puts 'Done.'
|
|
40
49
|
end
|
|
41
50
|
end
|
|
42
51
|
end
|
data/lib/pgdump_scrambler.rb
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require
|
|
4
|
-
require
|
|
5
|
-
require
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
end
|
|
2
|
+
|
|
3
|
+
require 'pgdump_scrambler/version'
|
|
4
|
+
require 'pgdump_scrambler/config'
|
|
5
|
+
require 'pgdump_scrambler/dumper'
|
|
6
|
+
require 'pgdump_scrambler/s3_uploader'
|
|
7
|
+
require 'pgdump_scrambler/railtie' if defined?(Rails)
|
|
9
8
|
|
|
10
9
|
module PgdumpScrambler
|
|
11
10
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
namespace :pgdump_scrambler do
|
|
3
4
|
default_config_path = ENV['SCRAMBLER_CONFIG_PATH'] || 'config/pgdump_scrambler.yml'
|
|
4
5
|
|
|
@@ -6,15 +7,16 @@ namespace :pgdump_scrambler do
|
|
|
6
7
|
task config_from_db: :environment do
|
|
7
8
|
config =
|
|
8
9
|
if File.exist?(default_config_path)
|
|
9
|
-
puts "#{default_config_path} found!\
|
|
10
|
+
puts "#{default_config_path} found!\nMerging existing config with config from database"
|
|
10
11
|
PgdumpScrambler::Config
|
|
11
12
|
.read_file(default_config_path)
|
|
12
13
|
.update_with(PgdumpScrambler::Config.from_db)
|
|
13
14
|
else
|
|
14
|
-
puts
|
|
15
|
+
puts 'Creating a config file from database'
|
|
15
16
|
PgdumpScrambler::Config.from_db
|
|
16
17
|
end
|
|
17
18
|
config.write_file(default_config_path)
|
|
19
|
+
puts "Wrote to #{default_config_path}"
|
|
18
20
|
end
|
|
19
21
|
|
|
20
22
|
desc 'check if new columns exist'
|
|
@@ -24,7 +26,7 @@ namespace :pgdump_scrambler do
|
|
|
24
26
|
.update_with(PgdumpScrambler::Config.from_db)
|
|
25
27
|
unspecified_columns = config.unspecified_columns
|
|
26
28
|
count = unspecified_columns.sum { |_, columns| columns.size }
|
|
27
|
-
if count
|
|
29
|
+
if count.positive?
|
|
28
30
|
unspecified_columns.each_key do |table_name|
|
|
29
31
|
puts "#{table_name}:"
|
|
30
32
|
unspecified_columns[table_name].each do |column_name|
|
|
@@ -34,7 +36,7 @@ namespace :pgdump_scrambler do
|
|
|
34
36
|
puts "#{count} unspecified columns found!"
|
|
35
37
|
exit 1
|
|
36
38
|
else
|
|
37
|
-
puts
|
|
39
|
+
puts 'No unspecified columns found.'
|
|
38
40
|
end
|
|
39
41
|
end
|
|
40
42
|
|
|
@@ -47,7 +49,7 @@ namespace :pgdump_scrambler do
|
|
|
47
49
|
desc 'create scrambled dump'
|
|
48
50
|
task clear_dump: :environment do
|
|
49
51
|
config = PgdumpScrambler::Config.read_file(default_config_path)
|
|
50
|
-
if File.
|
|
52
|
+
if File.exist? config.dump_path
|
|
51
53
|
File.delete(config.dump_path)
|
|
52
54
|
puts "Dump file #{config.dump_path} has been deleted."
|
|
53
55
|
end
|
|
@@ -57,7 +59,7 @@ namespace :pgdump_scrambler do
|
|
|
57
59
|
task s3_upload: :environment do
|
|
58
60
|
config = PgdumpScrambler::Config.read_file(default_config_path)
|
|
59
61
|
uploader = PgdumpScrambler::S3Uploader.new(
|
|
60
|
-
s3_path: File.join(config.resolved_s3['prefix'], File
|
|
62
|
+
s3_path: File.join(config.resolved_s3['prefix'], File.basename(config.dump_path)),
|
|
61
63
|
local_path: config.dump_path,
|
|
62
64
|
region: config.resolved_s3['region'],
|
|
63
65
|
bucket: config.resolved_s3['bucket'],
|
data/pgdump_scrambler.gemspec
CHANGED
|
@@ -1,37 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
|
|
2
|
-
lib = File.expand_path(
|
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
-
require
|
|
5
|
+
require 'pgdump_scrambler/version'
|
|
5
6
|
|
|
6
7
|
Gem::Specification.new do |spec|
|
|
7
|
-
spec.name =
|
|
8
|
+
spec.name = 'pgdump_scrambler'
|
|
8
9
|
spec.version = PgdumpScrambler::VERSION
|
|
9
|
-
spec.authors = [
|
|
10
|
-
spec.email = [
|
|
10
|
+
spec.authors = ['Shunichi Ikegami']
|
|
11
|
+
spec.email = ['sike.tm@gmail.com']
|
|
11
12
|
|
|
12
|
-
spec.summary =
|
|
13
|
-
spec.description =
|
|
13
|
+
spec.summary = 'Scramble pg_dump columns'
|
|
14
|
+
spec.description = 'Scramble pg_dump columns.'
|
|
14
15
|
spec.homepage = 'https://github.com/shunichi/pgdump_scrambler'
|
|
15
|
-
spec.license =
|
|
16
|
+
spec.license = 'MIT'
|
|
17
|
+
spec.required_ruby_version = '>= 3.0'
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
else
|
|
22
|
-
raise "RubyGems 2.0 or newer is required to protect against " \
|
|
23
|
-
"public gem pushes."
|
|
24
|
-
end
|
|
19
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
|
20
|
+
spec.metadata['source_code_uri'] = 'https://github.com/shunichi/pgdump_scrambler'
|
|
21
|
+
spec.metadata['changelog_uri'] = 'https://github.com/shunichi/pgdump_scrambler/blob/main/CHANGELOG.md'
|
|
22
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
|
25
23
|
|
|
26
|
-
spec.files
|
|
24
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
|
27
25
|
f.match(%r{^(test|spec|features)/})
|
|
28
26
|
end
|
|
29
|
-
spec.bindir =
|
|
27
|
+
spec.bindir = 'exe'
|
|
30
28
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
31
|
-
spec.require_paths = [
|
|
32
|
-
|
|
33
|
-
spec.add_development_dependency "rake", "~> 13.0"
|
|
34
|
-
spec.add_development_dependency "rspec", "~> 3.12"
|
|
35
|
-
spec.add_development_dependency "rails", "~> 7.0"
|
|
36
|
-
spec.add_development_dependency "rubocop"
|
|
29
|
+
spec.require_paths = ['lib']
|
|
37
30
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pgdump_scrambler
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.4.
|
|
4
|
+
version: 0.4.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Shunichi Ikegami
|
|
@@ -9,76 +9,18 @@ autorequire:
|
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
11
|
date: 2023-10-19 00:00:00.000000000 Z
|
|
12
|
-
dependencies:
|
|
13
|
-
|
|
14
|
-
name: rake
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - "~>"
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: '13.0'
|
|
20
|
-
type: :development
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - "~>"
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: '13.0'
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: rspec
|
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
|
30
|
-
requirements:
|
|
31
|
-
- - "~>"
|
|
32
|
-
- !ruby/object:Gem::Version
|
|
33
|
-
version: '3.12'
|
|
34
|
-
type: :development
|
|
35
|
-
prerelease: false
|
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
-
requirements:
|
|
38
|
-
- - "~>"
|
|
39
|
-
- !ruby/object:Gem::Version
|
|
40
|
-
version: '3.12'
|
|
41
|
-
- !ruby/object:Gem::Dependency
|
|
42
|
-
name: rails
|
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
|
44
|
-
requirements:
|
|
45
|
-
- - "~>"
|
|
46
|
-
- !ruby/object:Gem::Version
|
|
47
|
-
version: '7.0'
|
|
48
|
-
type: :development
|
|
49
|
-
prerelease: false
|
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
-
requirements:
|
|
52
|
-
- - "~>"
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: '7.0'
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: rubocop
|
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
|
58
|
-
requirements:
|
|
59
|
-
- - ">="
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '0'
|
|
62
|
-
type: :development
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - ">="
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '0'
|
|
69
|
-
description: scramble pg_dump columns.
|
|
12
|
+
dependencies: []
|
|
13
|
+
description: Scramble pg_dump columns.
|
|
70
14
|
email:
|
|
71
15
|
- sike.tm@gmail.com
|
|
72
16
|
executables: []
|
|
73
17
|
extensions: []
|
|
74
18
|
extra_rdoc_files: []
|
|
75
19
|
files:
|
|
20
|
+
- ".github/workflows/main.yml"
|
|
76
21
|
- ".gitignore"
|
|
77
22
|
- ".rspec"
|
|
78
23
|
- ".rubocop.yml"
|
|
79
|
-
- ".rubocop_todo.yml"
|
|
80
|
-
- ".ruby-version"
|
|
81
|
-
- ".travis.yml"
|
|
82
24
|
- ".vscode/tasks.json"
|
|
83
25
|
- CHANGELOG.md
|
|
84
26
|
- Gemfile
|
|
@@ -107,7 +49,10 @@ homepage: https://github.com/shunichi/pgdump_scrambler
|
|
|
107
49
|
licenses:
|
|
108
50
|
- MIT
|
|
109
51
|
metadata:
|
|
110
|
-
|
|
52
|
+
homepage_uri: https://github.com/shunichi/pgdump_scrambler
|
|
53
|
+
source_code_uri: https://github.com/shunichi/pgdump_scrambler
|
|
54
|
+
changelog_uri: https://github.com/shunichi/pgdump_scrambler/blob/main/CHANGELOG.md
|
|
55
|
+
rubygems_mfa_required: 'true'
|
|
111
56
|
post_install_message:
|
|
112
57
|
rdoc_options: []
|
|
113
58
|
require_paths:
|
|
@@ -116,15 +61,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
116
61
|
requirements:
|
|
117
62
|
- - ">="
|
|
118
63
|
- !ruby/object:Gem::Version
|
|
119
|
-
version: '0'
|
|
64
|
+
version: '3.0'
|
|
120
65
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
66
|
requirements:
|
|
122
67
|
- - ">="
|
|
123
68
|
- !ruby/object:Gem::Version
|
|
124
69
|
version: '0'
|
|
125
70
|
requirements: []
|
|
126
|
-
rubygems_version: 3.
|
|
71
|
+
rubygems_version: 3.4.10
|
|
127
72
|
signing_key:
|
|
128
73
|
specification_version: 4
|
|
129
|
-
summary:
|
|
74
|
+
summary: Scramble pg_dump columns
|
|
130
75
|
test_files: []
|
data/.rubocop_todo.yml
DELETED
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
# This configuration was generated by
|
|
2
|
-
# `rubocop --auto-gen-config`
|
|
3
|
-
# on 2018-03-08 00:50:23 +0900 using RuboCop version 0.52.1.
|
|
4
|
-
# The point is for the user to remove these configuration records
|
|
5
|
-
# one by one as the offenses are removed from the code base.
|
|
6
|
-
# Note that changes in the inspected code, or installation of new
|
|
7
|
-
# versions of RuboCop, may require this file to be generated again.
|
|
8
|
-
|
|
9
|
-
# Offense count: 1
|
|
10
|
-
# Cop supports --auto-correct.
|
|
11
|
-
# Configuration parameters: Include, TreatCommentsAsGroupSeparators.
|
|
12
|
-
# Include: **/*.gemspec
|
|
13
|
-
Gemspec/OrderedDependencies:
|
|
14
|
-
Exclude:
|
|
15
|
-
- 'pgdump_scrambler.gemspec'
|
|
16
|
-
|
|
17
|
-
# Offense count: 5
|
|
18
|
-
# Cop supports --auto-correct.
|
|
19
|
-
Layout/EmptyLineAfterMagicComment:
|
|
20
|
-
Exclude:
|
|
21
|
-
- 'lib/pgdump_scrambler.rb'
|
|
22
|
-
- 'lib/pgdump_scrambler/railtie.rb'
|
|
23
|
-
- 'lib/pgdump_scrambler/table.rb'
|
|
24
|
-
- 'lib/pgdump_scrambler/version.rb'
|
|
25
|
-
- 'lib/tasks/pgdump_scrambler_tasks.rake'
|
|
26
|
-
|
|
27
|
-
# Offense count: 1
|
|
28
|
-
# Cop supports --auto-correct.
|
|
29
|
-
# Configuration parameters: AllowForAlignment, ForceEqualSignAlignment.
|
|
30
|
-
Layout/ExtraSpacing:
|
|
31
|
-
Exclude:
|
|
32
|
-
- 'pgdump_scrambler.gemspec'
|
|
33
|
-
|
|
34
|
-
# Offense count: 1
|
|
35
|
-
# Cop supports --auto-correct.
|
|
36
|
-
# Configuration parameters: EnforcedStyle.
|
|
37
|
-
# SupportedStyles: auto_detection, squiggly, active_support, powerpack, unindent
|
|
38
|
-
Layout/IndentHeredoc:
|
|
39
|
-
Exclude:
|
|
40
|
-
- 'spec/pgdump_scrambler_spec.rb'
|
|
41
|
-
|
|
42
|
-
# Offense count: 1
|
|
43
|
-
# Cop supports --auto-correct.
|
|
44
|
-
# Configuration parameters: AllowForAlignment.
|
|
45
|
-
Layout/SpaceAroundOperators:
|
|
46
|
-
Exclude:
|
|
47
|
-
- 'pgdump_scrambler.gemspec'
|
|
48
|
-
|
|
49
|
-
# Offense count: 1
|
|
50
|
-
# Cop supports --auto-correct.
|
|
51
|
-
# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
|
|
52
|
-
# SupportedStyles: space, no_space
|
|
53
|
-
# SupportedStylesForEmptyBraces: space, no_space
|
|
54
|
-
Layout/SpaceInsideBlockBraces:
|
|
55
|
-
Exclude:
|
|
56
|
-
- 'Gemfile'
|
|
57
|
-
|
|
58
|
-
# Offense count: 2
|
|
59
|
-
# Cop supports --auto-correct.
|
|
60
|
-
# Configuration parameters: EnforcedStyle.
|
|
61
|
-
# SupportedStyles: final_newline, final_blank_line
|
|
62
|
-
Layout/TrailingBlankLines:
|
|
63
|
-
Exclude:
|
|
64
|
-
- 'lib/pgdump_scrambler/table.rb'
|
|
65
|
-
- 'lib/tasks/pgdump_scrambler_tasks.rake'
|
|
66
|
-
|
|
67
|
-
# Offense count: 4
|
|
68
|
-
# Cop supports --auto-correct.
|
|
69
|
-
Layout/TrailingWhitespace:
|
|
70
|
-
Exclude:
|
|
71
|
-
- 'lib/pgdump_scrambler/table.rb'
|
|
72
|
-
|
|
73
|
-
# Offense count: 1
|
|
74
|
-
# Configuration parameters: AllowSafeAssignment.
|
|
75
|
-
Lint/AssignmentInCondition:
|
|
76
|
-
Exclude:
|
|
77
|
-
- 'lib/pgdump_scrambler/table.rb'
|
|
78
|
-
|
|
79
|
-
# Offense count: 1
|
|
80
|
-
# Cop supports --auto-correct.
|
|
81
|
-
# Configuration parameters: IgnoreEmptyBlocks, AllowUnusedKeywordArguments.
|
|
82
|
-
Lint/UnusedBlockArgument:
|
|
83
|
-
Exclude:
|
|
84
|
-
- 'lib/pgdump_scrambler/table.rb'
|
|
85
|
-
|
|
86
|
-
# Offense count: 1
|
|
87
|
-
# Cop supports --auto-correct.
|
|
88
|
-
Security/YAMLLoad:
|
|
89
|
-
Exclude:
|
|
90
|
-
- 'lib/pgdump_scrambler/table.rb'
|
|
91
|
-
|
|
92
|
-
# Offense count: 5
|
|
93
|
-
Style/Documentation:
|
|
94
|
-
Exclude:
|
|
95
|
-
- 'spec/**/*'
|
|
96
|
-
- 'test/**/*'
|
|
97
|
-
- 'lib/pgdump_scrambler.rb'
|
|
98
|
-
- 'lib/pgdump_scrambler/railtie.rb'
|
|
99
|
-
- 'lib/pgdump_scrambler/table.rb'
|
|
100
|
-
|
|
101
|
-
# Offense count: 6
|
|
102
|
-
# Cop supports --auto-correct.
|
|
103
|
-
# Configuration parameters: EnforcedStyle.
|
|
104
|
-
# SupportedStyles: when_needed, always, never
|
|
105
|
-
Style/FrozenStringLiteralComment:
|
|
106
|
-
Exclude:
|
|
107
|
-
- 'Gemfile'
|
|
108
|
-
- 'Rakefile'
|
|
109
|
-
- 'bin/console'
|
|
110
|
-
- 'pgdump_scrambler.gemspec'
|
|
111
|
-
- 'spec/pgdump_scrambler_spec.rb'
|
|
112
|
-
- 'spec/spec_helper.rb'
|
|
113
|
-
|
|
114
|
-
# Offense count: 1
|
|
115
|
-
# Cop supports --auto-correct.
|
|
116
|
-
# Configuration parameters: EnforcedStyle, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols.
|
|
117
|
-
# SupportedStyles: ruby19, hash_rockets, no_mixed_keys, ruby19_no_mixed_keys
|
|
118
|
-
Style/HashSyntax:
|
|
119
|
-
Exclude:
|
|
120
|
-
- 'Rakefile'
|
|
121
|
-
|
|
122
|
-
# Offense count: 1
|
|
123
|
-
# Cop supports --auto-correct.
|
|
124
|
-
Style/IfUnlessModifier:
|
|
125
|
-
Exclude:
|
|
126
|
-
- 'lib/pgdump_scrambler.rb'
|
|
127
|
-
|
|
128
|
-
# Offense count: 2
|
|
129
|
-
# Cop supports --auto-correct.
|
|
130
|
-
# Configuration parameters: PreferredDelimiters.
|
|
131
|
-
Style/PercentLiteralDelimiters:
|
|
132
|
-
Exclude:
|
|
133
|
-
- 'pgdump_scrambler.gemspec'
|
|
134
|
-
|
|
135
|
-
# Offense count: 1
|
|
136
|
-
# Cop supports --auto-correct.
|
|
137
|
-
Style/RescueModifier:
|
|
138
|
-
Exclude:
|
|
139
|
-
- 'lib/pgdump_scrambler/table.rb'
|
|
140
|
-
|
|
141
|
-
# Offense count: 32
|
|
142
|
-
# Cop supports --auto-correct.
|
|
143
|
-
# Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
|
|
144
|
-
# SupportedStyles: single_quotes, double_quotes
|
|
145
|
-
Style/StringLiterals:
|
|
146
|
-
Exclude:
|
|
147
|
-
- 'Gemfile'
|
|
148
|
-
- 'Rakefile'
|
|
149
|
-
- 'bin/console'
|
|
150
|
-
- 'lib/pgdump_scrambler.rb'
|
|
151
|
-
- 'lib/pgdump_scrambler/version.rb'
|
|
152
|
-
- 'pgdump_scrambler.gemspec'
|
|
153
|
-
- 'spec/spec_helper.rb'
|
|
154
|
-
|
|
155
|
-
# Offense count: 1
|
|
156
|
-
# Cop supports --auto-correct.
|
|
157
|
-
# Configuration parameters: EnforcedStyleForMultiline.
|
|
158
|
-
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
|
159
|
-
Style/TrailingCommaInLiteral:
|
|
160
|
-
Exclude:
|
|
161
|
-
- 'lib/pgdump_scrambler/table.rb'
|
|
162
|
-
|
|
163
|
-
# Offense count: 2
|
|
164
|
-
# Cop supports --auto-correct.
|
|
165
|
-
Style/UnneededPercentQ:
|
|
166
|
-
Exclude:
|
|
167
|
-
- 'pgdump_scrambler.gemspec'
|
|
168
|
-
|
|
169
|
-
# Offense count: 11
|
|
170
|
-
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
|
171
|
-
# URISchemes: http, https
|
|
172
|
-
Metrics/LineLength:
|
|
173
|
-
Max: 96
|
data/.ruby-version
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
3.1.3
|