masking 1.1.0 → 1.1.2.pre.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +9 -4
  3. data/.github/workflows/acceptance_test_mariadb.yml +57 -1
  4. data/.github/workflows/acceptance_test_mysql.yml +1 -1
  5. data/.rubocop.yml +7 -1
  6. data/.rubocop_todo.yml +105 -0
  7. data/.ruby-version +1 -1
  8. data/CHANGELOG.md +19 -0
  9. data/CODEOWNERS +1 -0
  10. data/Dockerfile +5 -3
  11. data/Dockerfile.ghcr +10 -0
  12. data/Gemfile +20 -0
  13. data/Gemfile.lock +67 -51
  14. data/README.md +38 -26
  15. data/acceptance/expected_error_result.txt +2 -0
  16. data/acceptance/expected_query_result.txt +36 -30
  17. data/acceptance/import_dumpfile.sql +3 -1
  18. data/acceptance/masking.yml +2 -0
  19. data/acceptance/run_test.sh +18 -6
  20. data/docker-compose/mariadb1010.yml +17 -0
  21. data/docker-compose/mariadb1011.yml +17 -0
  22. data/docker-compose/mariadb105.yml +17 -0
  23. data/docker-compose/mariadb106.yml +17 -0
  24. data/docker-compose/mariadb107.yml +17 -0
  25. data/docker-compose/mariadb108.yml +17 -0
  26. data/docker-compose/mariadb109.yml +17 -0
  27. data/lib/masking/cli/error_message.rb +16 -9
  28. data/lib/masking/config/target_columns/column.rb +19 -5
  29. data/lib/masking/config/target_columns/method/string_binary_distinctor.rb +3 -3
  30. data/lib/masking/config/target_columns/method/type/base.rb +25 -0
  31. data/lib/masking/config/target_columns/method/type/binary.rb +19 -0
  32. data/lib/masking/config/target_columns/method/type/boolean.rb +27 -0
  33. data/lib/masking/config/target_columns/method/type/date.rb +28 -0
  34. data/lib/masking/config/target_columns/method/type/extension/ignore_null.rb +24 -0
  35. data/lib/masking/config/target_columns/method/type/float.rb +19 -0
  36. data/lib/masking/config/target_columns/method/type/integer.rb +19 -0
  37. data/lib/masking/config/target_columns/method/{null.rb → type/null.rb} +5 -5
  38. data/lib/masking/config/target_columns/method/type/string.rb +37 -0
  39. data/lib/masking/config/target_columns/method/type/time.rb +26 -0
  40. data/lib/masking/config/target_columns/method.rb +14 -10
  41. data/lib/masking/insert_statement/sql_builder.rb +2 -2
  42. data/lib/masking/insert_statement.rb +1 -1
  43. data/lib/masking/sql_dump_line.rb +1 -0
  44. data/lib/masking/version.rb +1 -1
  45. data/masking.gemspec +1 -18
  46. metadata +29 -184
  47. data/lib/masking/cli/error_messages.yml +0 -10
  48. data/lib/masking/config/target_columns/method/binary.rb +0 -23
  49. data/lib/masking/config/target_columns/method/boolean.rb +0 -29
  50. data/lib/masking/config/target_columns/method/date.rb +0 -30
  51. data/lib/masking/config/target_columns/method/float.rb +0 -23
  52. data/lib/masking/config/target_columns/method/integer.rb +0 -23
  53. data/lib/masking/config/target_columns/method/string.rb +0 -33
  54. data/lib/masking/config/target_columns/method/time.rb +0 -28
@@ -18,11 +18,11 @@ module Masking
18
18
  attr_reader :table, :columns, :values
19
19
 
20
20
  def columns_section
21
- '(' + columns.map { |column| "`#{column}`" }.join(', ') + ')'
21
+ '(' + columns.map { |column| "`#{column}`" }.join(', ') + ')' # rubocop:disable Style/StringConcatenation
22
22
  end
23
23
 
24
24
  def values_section
25
- values.map { |value| '(' + value.join(',') + ')' }.join(',')
25
+ values.map { |value| "(#{value.join(',')})" }.join(',')
26
26
  end
27
27
  end
28
28
  end
@@ -36,7 +36,7 @@ module Masking
36
36
 
37
37
  def mask_value(column_index:, mask_method:)
38
38
  values.each do |value|
39
- value[column_index] = mask_method.call
39
+ value[column_index] = mask_method.call(value[column_index])
40
40
  end
41
41
  end
42
42
 
@@ -20,6 +20,7 @@ module Masking
20
20
  private
21
21
 
22
22
  attr_reader :line, :mask_processor
23
+
23
24
  INSERT_STATEMENT_REGEXP = /^INSERT/.freeze
24
25
 
25
26
  def processor
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Masking
4
- VERSION = '1.1.0'
4
+ VERSION = '1.1.2-alpha'
5
5
  end
data/masking.gemspec CHANGED
@@ -25,22 +25,5 @@ Gem::Specification.new do |spec|
25
25
 
26
26
  spec.required_ruby_version = '>= 2.6'
27
27
 
28
- spec.add_development_dependency 'bundler'
29
- spec.add_development_dependency 'rake'
30
- spec.add_development_dependency 'rake-notes'
31
- spec.add_development_dependency 'ruby-prof'
32
-
33
- # linter/static analyzer
34
- spec.add_development_dependency 'mdl'
35
- spec.add_development_dependency 'rubocop'
36
-
37
- # test
38
- spec.add_development_dependency 'codecov'
39
- spec.add_development_dependency 'rspec'
40
- spec.add_development_dependency 'simplecov'
41
-
42
- # debug
43
- spec.add_development_dependency 'pry'
44
- spec.add_development_dependency 'pry-byebug'
45
- spec.add_development_dependency 'tapp'
28
+ spec.metadata['rubygems_mfa_required'] = 'true'
46
29
  end
metadata CHANGED
@@ -1,183 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: masking
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.2.pre.alpha
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chikahiro Tokoro
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-02-25 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: rake-notes
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: ruby-prof
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
- - !ruby/object:Gem::Dependency
70
- name: mdl
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rubocop
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: codecov
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: rspec
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
- - !ruby/object:Gem::Dependency
126
- name: simplecov
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - ">="
130
- - !ruby/object:Gem::Version
131
- version: '0'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- version: '0'
139
- - !ruby/object:Gem::Dependency
140
- name: pry
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- version: '0'
153
- - !ruby/object:Gem::Dependency
154
- name: pry-byebug
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - ">="
158
- - !ruby/object:Gem::Version
159
- version: '0'
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - ">="
165
- - !ruby/object:Gem::Version
166
- version: '0'
167
- - !ruby/object:Gem::Dependency
168
- name: tapp
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - ">="
172
- - !ruby/object:Gem::Version
173
- version: '0'
174
- type: :development
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - ">="
179
- - !ruby/object:Gem::Version
180
- version: '0'
11
+ date: 2023-04-18 00:00:00.000000000 Z
12
+ dependencies: []
181
13
  description: Command line tool for anonymizing database records by parsing a SQL dump
182
14
  file and build new SQL dump file with masking sensitive/credential data.
183
15
  email:
@@ -196,15 +28,19 @@ files:
196
28
  - ".gitignore"
197
29
  - ".mdlrc"
198
30
  - ".rubocop.yml"
31
+ - ".rubocop_todo.yml"
199
32
  - ".ruby-version"
200
33
  - CHANGELOG.md
34
+ - CODEOWNERS
201
35
  - CODE_OF_CONDUCT.md
202
36
  - Dockerfile
37
+ - Dockerfile.ghcr
203
38
  - Gemfile
204
39
  - Gemfile.lock
205
40
  - LICENSE.txt
206
41
  - README.md
207
42
  - Rakefile
43
+ - acceptance/expected_error_result.txt
208
44
  - acceptance/expected_query_result.txt
209
45
  - acceptance/import_dumpfile.sql
210
46
  - acceptance/masking.yml
@@ -223,9 +59,16 @@ files:
223
59
  - docker-compose/acceptance_test.sh
224
60
  - docker-compose/mariadb100.yml
225
61
  - docker-compose/mariadb101.yml
62
+ - docker-compose/mariadb1010.yml
63
+ - docker-compose/mariadb1011.yml
226
64
  - docker-compose/mariadb102.yml
227
65
  - docker-compose/mariadb103.yml
228
66
  - docker-compose/mariadb104.yml
67
+ - docker-compose/mariadb105.yml
68
+ - docker-compose/mariadb106.yml
69
+ - docker-compose/mariadb107.yml
70
+ - docker-compose/mariadb108.yml
71
+ - docker-compose/mariadb109.yml
229
72
  - docker-compose/mariadb55.yml
230
73
  - docker-compose/mysql55.yml
231
74
  - docker-compose/mysql56.yml
@@ -236,20 +79,21 @@ files:
236
79
  - lib/masking.rb
237
80
  - lib/masking/cli.rb
238
81
  - lib/masking/cli/error_message.rb
239
- - lib/masking/cli/error_messages.yml
240
82
  - lib/masking/config.rb
241
83
  - lib/masking/config/target_columns.rb
242
84
  - lib/masking/config/target_columns/column.rb
243
85
  - lib/masking/config/target_columns/method.rb
244
- - lib/masking/config/target_columns/method/binary.rb
245
- - lib/masking/config/target_columns/method/boolean.rb
246
- - lib/masking/config/target_columns/method/date.rb
247
- - lib/masking/config/target_columns/method/float.rb
248
- - lib/masking/config/target_columns/method/integer.rb
249
- - lib/masking/config/target_columns/method/null.rb
250
- - lib/masking/config/target_columns/method/string.rb
251
86
  - lib/masking/config/target_columns/method/string_binary_distinctor.rb
252
- - lib/masking/config/target_columns/method/time.rb
87
+ - lib/masking/config/target_columns/method/type/base.rb
88
+ - lib/masking/config/target_columns/method/type/binary.rb
89
+ - lib/masking/config/target_columns/method/type/boolean.rb
90
+ - lib/masking/config/target_columns/method/type/date.rb
91
+ - lib/masking/config/target_columns/method/type/extension/ignore_null.rb
92
+ - lib/masking/config/target_columns/method/type/float.rb
93
+ - lib/masking/config/target_columns/method/type/integer.rb
94
+ - lib/masking/config/target_columns/method/type/null.rb
95
+ - lib/masking/config/target_columns/method/type/string.rb
96
+ - lib/masking/config/target_columns/method/type/time.rb
253
97
  - lib/masking/config/target_columns/table.rb
254
98
  - lib/masking/data_mask_processor.rb
255
99
  - lib/masking/data_mask_processor/cache.rb
@@ -265,7 +109,8 @@ files:
265
109
  homepage: https://github.com/kibitan/masking
266
110
  licenses:
267
111
  - MIT
268
- metadata: {}
112
+ metadata:
113
+ rubygems_mfa_required: 'true'
269
114
  post_install_message:
270
115
  rdoc_options: []
271
116
  require_paths:
@@ -277,11 +122,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
277
122
  version: '2.6'
278
123
  required_rubygems_version: !ruby/object:Gem::Requirement
279
124
  requirements:
280
- - - ">="
125
+ - - ">"
281
126
  - !ruby/object:Gem::Version
282
- version: '0'
127
+ version: 1.3.1
283
128
  requirements: []
284
- rubygems_version: 3.3.26
129
+ rubygems_version: 3.4.6
285
130
  signing_key:
286
131
  specification_version: 4
287
132
  summary: Command line tool for anonymizing databese records
@@ -1,10 +0,0 @@
1
- Masking::Error::ConfigFileDoesNotExist:
2
- "ERROR: config file (<%= config_file_path %>) does not exist"
3
- Masking::Error::ConfigFileIsNotFile:
4
- "ERROR: config file (<%= config_file_path %>) is not file"
5
- Masking::Error::ConfigFileIsNotValidYaml:
6
- "ERROR: config file (<%= config_file_path %>) is not valid yaml format"
7
- Masking::Error::ConfigFileContainsNullAsColumnName:
8
- "ERROR: config file (<%= config_file_path %>) is not valid, column name contains `null`"
9
- Masking::Error::InsertStatementParseError:
10
- "ERROR: cannot parse SQL dump file. you may forget to put `--complete-insert` option in mysqldump?"
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masking
4
- class Config
5
- class TargetColumns
6
- class Method
7
- class Binary
8
- def initialize(value)
9
- @binary = value
10
- end
11
-
12
- def call
13
- "_binary '#{binary}'".b
14
- end
15
-
16
- private
17
-
18
- attr_reader :binary
19
- end
20
- end
21
- end
22
- end
23
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masking
4
- class Config
5
- class TargetColumns
6
- class Method
7
- class Boolean
8
- def initialize(value)
9
- @boolean = value
10
- end
11
-
12
- def call
13
- boolean_format.to_s
14
- end
15
-
16
- private
17
-
18
- attr_reader :boolean
19
-
20
- # NOTE: 11.1.1 Numeric Type Overview, chapter BOOL, BOOLEAN
21
- # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.html
22
- def boolean_format
23
- boolean ? 1 : 0
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'date'
4
-
5
- module Masking
6
- class Config
7
- class TargetColumns
8
- class Method
9
- class Date
10
- def initialize(value)
11
- @date = value.strftime(FORMAT)
12
- end
13
-
14
- def call
15
- "'#{date_format}'"
16
- end
17
-
18
- private
19
-
20
- attr_reader :date
21
- FORMAT = '%Y-%m-%d'
22
-
23
- def date_format
24
- date
25
- end
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masking
4
- class Config
5
- class TargetColumns
6
- class Method
7
- class Float
8
- def initialize(value)
9
- @float = value.to_s
10
- end
11
-
12
- def call
13
- float
14
- end
15
-
16
- private
17
-
18
- attr_reader :float
19
- end
20
- end
21
- end
22
- end
23
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masking
4
- class Config
5
- class TargetColumns
6
- class Method
7
- class Integer
8
- def initialize(value)
9
- @integer = value.to_s
10
- end
11
-
12
- def call
13
- integer
14
- end
15
-
16
- private
17
-
18
- attr_reader :integer
19
- end
20
- end
21
- end
22
- end
23
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masking
4
- class Config
5
- class TargetColumns
6
- class Method
7
- class String
8
- def initialize(value)
9
- @string = value
10
- @sequence = 0
11
- end
12
-
13
- def call
14
- ("'" + output + "'").b
15
- end
16
-
17
- private
18
-
19
- SEQUENTIAL_NUMBER_PLACEHOLDER = '%{n}' # rubocop:disable Style/FormatStringToken
20
- attr_reader :string
21
-
22
- def output
23
- string.sub(SEQUENTIAL_NUMBER_PLACEHOLDER, sequence.to_s)
24
- end
25
-
26
- def sequence
27
- @sequence += 1
28
- end
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masking
4
- class Config
5
- class TargetColumns
6
- class Method
7
- class Time
8
- def initialize(value)
9
- @time = value.strftime(FORMAT)
10
- end
11
-
12
- def call
13
- "'#{time_format}'"
14
- end
15
-
16
- private
17
-
18
- attr_reader :time
19
- FORMAT = '%Y-%m-%d %H:%M:%S'
20
-
21
- def time_format
22
- time
23
- end
24
- end
25
- end
26
- end
27
- end
28
- end