masking 0.0.3 → 1.0.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/.circleci/config.yml +30 -0
- data/.codeclimate.yml +4 -0
- data/.dockerignore +18 -0
- data/.github/workflows/acceptance_test_mariadb.yml +56 -0
- data/.github/workflows/acceptance_test_mysql.yml +40 -0
- data/.github/workflows/check_changelog.yml +13 -0
- data/.gitignore +3 -0
- data/.mdlrc +1 -0
- data/.ruby-version +1 -1
- data/CHANGELOG.md +11 -0
- data/Dockerfile +24 -0
- data/Gemfile.lock +3 -3
- data/README.md +61 -12
- data/acceptance/expected_query_result.txt +33 -0
- data/acceptance/import_dumpfile.sql +59 -0
- data/acceptance/masking.yml +15 -0
- data/acceptance/run_test.sh +25 -0
- data/docker-compose-ci.yml +6 -0
- data/docker-compose.yml +11 -0
- data/docker-compose/acceptance_test.sh +8 -0
- data/docker-compose/mariadb100.yml +17 -0
- data/docker-compose/mariadb101.yml +17 -0
- data/docker-compose/mariadb102.yml +17 -0
- data/docker-compose/mariadb103.yml +17 -0
- data/docker-compose/mariadb104.yml +17 -0
- data/docker-compose/mariadb55.yml +17 -0
- data/docker-compose/mysql55.yml +17 -0
- data/docker-compose/mysql56.yml +17 -0
- data/docker-compose/mysql57.yml +17 -0
- data/docker-compose/mysql80.yml +19 -0
- data/docker-compose/wait-for-mysql.sh +19 -0
- data/exe/masking +3 -0
- data/lib/masking/cli.rb +8 -0
- data/lib/masking/cli/error_messages.yml +4 -0
- data/lib/masking/config/target_columns.rb +2 -0
- data/lib/masking/config/target_columns/column.rb +3 -0
- data/lib/masking/errors.rb +3 -0
- data/lib/masking/insert_statement.rb +3 -0
- data/lib/masking/version.rb +1 -1
- data/masking.gemspec +1 -1
- data/masking.yml.sample +1 -1
- metadata +31 -6
- data/.travis.yml +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34f66d96cbd6ffe36c28c91073edb927d60eba4aa520d6fcc025bb5dd156d5a7
|
4
|
+
data.tar.gz: 492f56f9002a98220fefe58b18232dd1b6d0a340be796fc10ae863043ccb843e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6057d19706c939b4ab70a0349f57dc550ac95ea98726938ae6d48fa6eac4cd389169715d985883769870752fc8dee2a6a28d68727005b87c3fb9ff5589ee2267
|
7
|
+
data.tar.gz: e9be5add5db208a607096e4b0a2c27b8214a55f796b23ff575aaed8cf138ed5de9de40cdb2199ffcdbba33f804c39bef6b4df60f66a8ef0d9f64f9046a58cba1
|
@@ -0,0 +1,30 @@
|
|
1
|
+
version: 2.1
|
2
|
+
|
3
|
+
test_attributes: &test_attributes
|
4
|
+
machine: true
|
5
|
+
steps:
|
6
|
+
- checkout
|
7
|
+
- run: docker build -t masking-$RUBY_VERSION-$CIRCLE_SHA1 --build-arg ruby_version=$RUBY_VERSION .
|
8
|
+
- run: docker run --entrypoint sh masking-$RUBY_VERSION-$CIRCLE_SHA1 -c "ruby -v" # debug
|
9
|
+
- run: docker run --entrypoint sh -e CI -e COVERALLS_REPO_TOKEN masking-$RUBY_VERSION-$CIRCLE_SHA1 -c "bundle exec rspec"
|
10
|
+
|
11
|
+
jobs:
|
12
|
+
test-rubyrc:
|
13
|
+
<<: *test_attributes
|
14
|
+
environment:
|
15
|
+
RUBY_VERSION: rc
|
16
|
+
test-ruby26:
|
17
|
+
<<: *test_attributes
|
18
|
+
environment:
|
19
|
+
RUBY_VERSION: '2.6'
|
20
|
+
test-ruby25:
|
21
|
+
<<: *test_attributes
|
22
|
+
environment:
|
23
|
+
RUBY_VERSION: '2.5'
|
24
|
+
|
25
|
+
workflows:
|
26
|
+
'CircleCI: build':
|
27
|
+
jobs:
|
28
|
+
- test-ruby26
|
29
|
+
- test-ruby25
|
30
|
+
- test-rubyrc
|
data/.codeclimate.yml
CHANGED
@@ -5,6 +5,10 @@ plugins:
|
|
5
5
|
markdownlint:
|
6
6
|
enabled: true
|
7
7
|
checks:
|
8
|
+
MD013: # MD013/Line length
|
9
|
+
enabled: false
|
10
|
+
MD033: # MD033/no-inline-html
|
11
|
+
enabled: false
|
8
12
|
# below 3 checks are disabled because Codeclimate's Markdownlint is not latest version (0.5.0)
|
9
13
|
MD023:
|
10
14
|
enabled: false
|
data/.dockerignore
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
/.bundle/
|
2
|
+
/_yardoc/
|
3
|
+
/coverage/*
|
4
|
+
/doc/
|
5
|
+
/pkg/
|
6
|
+
/spec/reports/*
|
7
|
+
/tmp/*
|
8
|
+
/profile/
|
9
|
+
/vendor/
|
10
|
+
.DS_Store
|
11
|
+
|
12
|
+
# rspec failure tracking
|
13
|
+
.rspec_status
|
14
|
+
|
15
|
+
Dockerfile
|
16
|
+
docker-compose.yml
|
17
|
+
docker-compose-ci.yml
|
18
|
+
docker-compose/*.yml
|
@@ -0,0 +1,56 @@
|
|
1
|
+
name: Acceptance Test MariaDB
|
2
|
+
on:
|
3
|
+
push:
|
4
|
+
branches:
|
5
|
+
- master
|
6
|
+
pull_request:
|
7
|
+
|
8
|
+
jobs:
|
9
|
+
mariadb104:
|
10
|
+
runs-on: ubuntu-latest
|
11
|
+
steps:
|
12
|
+
- uses: actions/checkout@v1
|
13
|
+
with:
|
14
|
+
fetch-depth: 1 # shallow clone
|
15
|
+
- name: run test
|
16
|
+
run: docker-compose/acceptance_test.sh mariadb104 docker-compose-ci.yml
|
17
|
+
mariadb103:
|
18
|
+
runs-on: ubuntu-latest
|
19
|
+
steps:
|
20
|
+
- uses: actions/checkout@v1
|
21
|
+
with:
|
22
|
+
fetch-depth: 1 # shallow clone
|
23
|
+
- name: run test
|
24
|
+
run: docker-compose/acceptance_test.sh mariadb103 docker-compose-ci.yml
|
25
|
+
mariadb102:
|
26
|
+
runs-on: ubuntu-latest
|
27
|
+
steps:
|
28
|
+
- uses: actions/checkout@v1
|
29
|
+
with:
|
30
|
+
fetch-depth: 1 # shallow clone
|
31
|
+
- name: run test
|
32
|
+
run: docker-compose/acceptance_test.sh mariadb102 docker-compose-ci.yml
|
33
|
+
mariadb101:
|
34
|
+
runs-on: ubuntu-latest
|
35
|
+
steps:
|
36
|
+
- uses: actions/checkout@v1
|
37
|
+
with:
|
38
|
+
fetch-depth: 1 # shallow clone
|
39
|
+
- name: run test
|
40
|
+
run: docker-compose/acceptance_test.sh mariadb101 docker-compose-ci.yml
|
41
|
+
mariadb100:
|
42
|
+
runs-on: ubuntu-latest
|
43
|
+
steps:
|
44
|
+
- uses: actions/checkout@v1
|
45
|
+
with:
|
46
|
+
fetch-depth: 1 # shallow clone
|
47
|
+
- name: run test
|
48
|
+
run: docker-compose/acceptance_test.sh mariadb100 docker-compose-ci.yml
|
49
|
+
mariadb55:
|
50
|
+
runs-on: ubuntu-latest
|
51
|
+
steps:
|
52
|
+
- uses: actions/checkout@v1
|
53
|
+
with:
|
54
|
+
fetch-depth: 1 # shallow clone
|
55
|
+
- name: run test
|
56
|
+
run: docker-compose/acceptance_test.sh mariadb55 docker-compose-ci.yml
|
@@ -0,0 +1,40 @@
|
|
1
|
+
name: Acceptance Test MySQL
|
2
|
+
on:
|
3
|
+
push:
|
4
|
+
branches:
|
5
|
+
- master
|
6
|
+
pull_request:
|
7
|
+
|
8
|
+
jobs:
|
9
|
+
mysql80:
|
10
|
+
runs-on: ubuntu-latest
|
11
|
+
steps:
|
12
|
+
- uses: actions/checkout@v1
|
13
|
+
with:
|
14
|
+
fetch-depth: 1 # shallow clone
|
15
|
+
- name: run test
|
16
|
+
run: docker-compose/acceptance_test.sh mysql80 docker-compose-ci.yml
|
17
|
+
mysql57:
|
18
|
+
runs-on: ubuntu-latest
|
19
|
+
steps:
|
20
|
+
- uses: actions/checkout@v1
|
21
|
+
with:
|
22
|
+
fetch-depth: 1 # shallow clone
|
23
|
+
- name: run test
|
24
|
+
run: docker-compose/acceptance_test.sh mysql57 docker-compose-ci.yml
|
25
|
+
mysql56:
|
26
|
+
runs-on: ubuntu-latest
|
27
|
+
steps:
|
28
|
+
- uses: actions/checkout@v1
|
29
|
+
with:
|
30
|
+
fetch-depth: 1 # shallow clone
|
31
|
+
- name: run test
|
32
|
+
run: docker-compose/acceptance_test.sh mysql56 docker-compose-ci.yml
|
33
|
+
mysql55:
|
34
|
+
runs-on: ubuntu-latest
|
35
|
+
steps:
|
36
|
+
- uses: actions/checkout@v1
|
37
|
+
with:
|
38
|
+
fetch-depth: 1 # shallow clone
|
39
|
+
- name: run test
|
40
|
+
run: docker-compose/acceptance_test.sh mysql55 docker-compose-ci.yml
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# inspired from: https://github.com/rails/sprockets/pull/631
|
2
|
+
name: Check Changelog
|
3
|
+
|
4
|
+
on: [pull_request]
|
5
|
+
|
6
|
+
jobs:
|
7
|
+
build:
|
8
|
+
runs-on: ubuntu-latest
|
9
|
+
steps:
|
10
|
+
- uses: actions/checkout@v1
|
11
|
+
- name: Check that CHANGELOG is touched
|
12
|
+
run: |
|
13
|
+
cat $GITHUB_EVENT_PATH | jq .pull_request.title | grep -i '\[changelog skip\]\|\[skip changelog\]' || git diff remotes/origin/${{ github.base_ref }} --name-only | grep CHANGELOG.md
|
data/.gitignore
CHANGED
data/.mdlrc
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.6.
|
1
|
+
2.6.5
|
data/CHANGELOG.md
CHANGED
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
7
7
|
|
8
8
|
## [Unreleased]
|
9
9
|
|
10
|
+
## [v1.0.0] - 2019-11-10
|
11
|
+
|
12
|
+
### Added
|
13
|
+
|
14
|
+
- `masking --version` option [#31](https://github.com/kibitan/masking/pull/31)
|
15
|
+
- add friendly parse error message [#26](https://github.com/kibitan/masking/pull/26) [#38](https://github.com/kibitan/masking/pull/38)
|
16
|
+
- Setup Docker and Acceptance test [#32](https://github.com/kibitan/masking/pull/32) [#36](https://github.com/kibitan/masking/pull/36)
|
17
|
+
- setup acceptance test for ci [#34](https://github.com/kibitan/masking/pull/34)
|
18
|
+
- add Ruby2.7(preview) [#35](https://github.com/kibitan/masking/pull/35)
|
19
|
+
- setup ci for changelog checker [#41](https://github.com/kibitan/masking/pull/41)
|
20
|
+
|
10
21
|
## [v0.0.3] - 2019-07-07
|
11
22
|
|
12
23
|
### Changed
|
data/Dockerfile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
ARG ruby_version=2.6
|
2
|
+
|
3
|
+
FROM ruby:$ruby_version-alpine AS builder
|
4
|
+
RUN apk add --no-cache build-base git
|
5
|
+
WORKDIR /app
|
6
|
+
RUN addgroup -S app && adduser -S -G app app
|
7
|
+
USER app
|
8
|
+
COPY --chown=app . ./
|
9
|
+
RUN gem install bundler:2.0.2 && bundle install -j "$(nproc)"
|
10
|
+
|
11
|
+
FROM builder AS with-mysql-client
|
12
|
+
USER root
|
13
|
+
RUN apk add --no-cache mysql-client
|
14
|
+
USER app
|
15
|
+
|
16
|
+
FROM ruby:$ruby_version-alpine
|
17
|
+
WORKDIR /app
|
18
|
+
# TODO: remove dependecy of `git` from masking.gemspec:L19
|
19
|
+
RUN apk add --no-cache git
|
20
|
+
RUN addgroup -S app && adduser -S -G app app
|
21
|
+
USER app
|
22
|
+
COPY --from=builder /usr/local/bundle/ /usr/local/bundle/
|
23
|
+
COPY --chown=app . ./
|
24
|
+
ENTRYPOINT ["bundle", "exec", "exe/masking"]
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
masking (0.0
|
4
|
+
masking (1.0.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
@@ -101,7 +101,7 @@ PLATFORMS
|
|
101
101
|
ruby
|
102
102
|
|
103
103
|
DEPENDENCIES
|
104
|
-
bundler (~>
|
104
|
+
bundler (~> 2.0)
|
105
105
|
coveralls
|
106
106
|
masking!
|
107
107
|
mdl
|
@@ -116,4 +116,4 @@ DEPENDENCIES
|
|
116
116
|
tapp
|
117
117
|
|
118
118
|
BUNDLED WITH
|
119
|
-
|
119
|
+
2.0.2
|
data/README.md
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# MasKING🤴
|
2
2
|
|
3
|
-
[](https://circleci.com/gh/kibitan/masking/tree/master)
|
4
|
+
[](https://github.com/kibitan/masking/actions?query=workflow%3A%22Acceptance+Test+MySQL%22+branch%3Amaster)
|
5
|
+
[](https://github.com/kibitan/masking/actions?query=workflow%3A%22Acceptance+Test+MariaDB%22+branch%3Amaster)
|
6
|
+
|
4
7
|
[](https://coveralls.io/github/kibitan/masking?branch=master)
|
5
8
|
[](https://codeclimate.com/github/kibitan/masking/maintainability)
|
6
9
|
[](https://badge.fury.io/rb/masking)
|
@@ -15,11 +18,12 @@ gem install masking
|
|
15
18
|
|
16
19
|
## Requirement
|
17
20
|
|
18
|
-
* Ruby 2.5/2.6
|
21
|
+
* Ruby 2.5/2.6/2.7(preview)
|
19
22
|
|
20
23
|
## Supported RDBMS
|
21
24
|
|
22
|
-
* MySQL 5.
|
25
|
+
* MySQL: 5.5<sup>[1](#footnote1)</sup>, 5.6, 5.7, 8.0
|
26
|
+
* MariaDB: 5.5, 10.0<sup>[2](#footnote2)</sup>, 10.1, 10.2, 10.3, 10.4
|
23
27
|
|
24
28
|
## Usage
|
25
29
|
|
@@ -35,7 +39,7 @@ gem install masking
|
|
35
39
|
integer: 12345
|
36
40
|
float: 123.45
|
37
41
|
boolean: true
|
38
|
-
|
42
|
+
null_column: null
|
39
43
|
date: 2018-08-24
|
40
44
|
time: 2018-08-24 15:54:06
|
41
45
|
binary_or_blob: !binary | # Binary Data Language-Independent Type for YAML™ Version 1.1: http://yaml.org/type/binary.html
|
@@ -81,6 +85,7 @@ gem install masking
|
|
81
85
|
$ masking -h
|
82
86
|
Usage: masking [options]
|
83
87
|
-c, --config=FILE_PATH specify config file. default: masking.yml
|
88
|
+
-v, --version version
|
84
89
|
```
|
85
90
|
|
86
91
|
## Use case of annonymized (production) database
|
@@ -118,30 +123,71 @@ You can also run `bin/console` for an interactive prompt that will allow you to
|
|
118
123
|
|
119
124
|
To install this gem onto your local machine, run `bundle exec rake install`.
|
120
125
|
|
126
|
+
### boot
|
127
|
+
|
128
|
+
```bash
|
129
|
+
bundle exec exe/masking
|
130
|
+
```
|
131
|
+
|
121
132
|
### Run test & rubocop & notes
|
122
133
|
|
123
134
|
```bash
|
124
135
|
bundle exec rake
|
125
136
|
```
|
126
137
|
|
127
|
-
####
|
138
|
+
#### acceptance test
|
139
|
+
|
140
|
+
```bash
|
141
|
+
./acceptance/run_test.sh
|
142
|
+
```
|
143
|
+
|
144
|
+
available option via environment variable:
|
145
|
+
|
146
|
+
* `MYSQL_HOST`: database host(default: `localhost`)
|
147
|
+
* `MYSQL_USER`: mysql user name(default: `mysqluser`}
|
148
|
+
* `MYSQL_PASSWORD`: password for user(default: `password`)
|
149
|
+
* `MYSQL_DBNAME`: database name(default: `mydb`)
|
150
|
+
|
151
|
+
##### with docker
|
128
152
|
|
129
|
-
|
153
|
+
```bash
|
154
|
+
docker-compose -f docker-compose.yml -f docker-compose/mysql80.yml run -e MYSQL_HOST=mysql80 app acceptance/run_test.sh
|
155
|
+
```
|
156
|
+
|
157
|
+
or
|
130
158
|
|
131
159
|
```bash
|
132
|
-
|
133
|
-
#!/usr/bin/env bash
|
134
|
-
bundle exec rake
|
135
|
-
EOF
|
160
|
+
docker-compose/acceptance_test.sh mysql80
|
136
161
|
```
|
137
162
|
|
163
|
+
The docker-compose file names for other database versions, specify that file.
|
164
|
+
|
165
|
+
* MySQL 8.0: [`docker-compose/mysql80.yml`](./docker-compose/mysql80.yml)
|
166
|
+
* MySQL 5.7: [`docker-compose/mysql57.yml`](./docker-compose/mysql57.yml)
|
167
|
+
* MySQL 5.6: [`docker-compose/mysql56.yml`](./docker-compose/mysql56.yml)
|
168
|
+
* MySQL 5.5<sup>[1](#footnote1)</sup>: [`docker-compose/mysql55.yml`](./docker-compose/mysql55.yml)
|
169
|
+
* MariaDB 10.4: [`docker-compose/mariadb104.yml`](./docker-compose/mariadb104.yml)
|
170
|
+
* MariaDB 10.3: [`docker-compose/mariadb103.yml`](./docker-compose/mariadb103.yml)
|
171
|
+
* MariaDB 10.2: [`docker-compose/mariadb102.yml`](./docker-compose/mariadb102.yml)
|
172
|
+
* MariaDB 10.1: [`docker-compose/mariadb101.yml`](./docker-compose/mariadb101.yml)
|
173
|
+
* MariaDB 10.0<sup>[2](#footnote2)</sup>: [`docker-compose/mariadb100.yml`](./docker-compose/mariadb100.yml)
|
174
|
+
* MariaDB 5.5: [`docker-compose/mariadb55.yml`](./docker-compose/mariadb55.yml)
|
175
|
+
|
138
176
|
#### [Markdown lint](https://github.com/markdownlint/markdownlint)
|
139
177
|
|
140
178
|
```bash
|
141
179
|
bundle exec mdl *.md
|
142
180
|
```
|
143
181
|
|
144
|
-
|
182
|
+
## Development with Docker
|
183
|
+
|
184
|
+
```bash
|
185
|
+
docker build . -t masking
|
186
|
+
echo "sample stdout" | docker run -i masking
|
187
|
+
docker run masking -v
|
188
|
+
```
|
189
|
+
|
190
|
+
## Profiling
|
145
191
|
|
146
192
|
use `bin/masking_profile`
|
147
193
|
|
@@ -181,7 +227,6 @@ Depend on only pure language standard libraries, no external libraries. (except
|
|
181
227
|
* Pluguable/customizable for a mask way e.g. integrate with [Faker](https://github.com/stympy/faker)
|
182
228
|
* Compatible with other RDBMS e.g. PostgreSQL, Oracle, SQL Server
|
183
229
|
* Parse the schema type information and validate target columns value
|
184
|
-
* Integration test with real database
|
185
230
|
* Performance optimization
|
186
231
|
* Write in streaming process
|
187
232
|
* rewrite by another language?
|
@@ -199,3 +244,7 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
199
244
|
## Code of Conduct
|
200
245
|
|
201
246
|
Everyone interacting in the Masking project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/kibitan/masking/blob/master/CODE_OF_CONDUCT.md).
|
247
|
+
|
248
|
+
<a name="footnote1">1</a>: <small> MySQL 5.5 is already not supported by [official](https://www.mysql.com/support/supportedplatforms/database.html)</small>
|
249
|
+
|
250
|
+
<a name="footnote2">2</a>: <small> MariaDB 10.0 is already not supported by [official](https://mariadb.org/about/maintenance-policy/)</small>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
*************************** 1. row ***************************
|
2
|
+
id: 1
|
3
|
+
string: anonymized string
|
4
|
+
email: anonymized+1@example.com
|
5
|
+
integer: 12345
|
6
|
+
float: 123.45
|
7
|
+
boolean: 1
|
8
|
+
null: NULL
|
9
|
+
date: 2018-08-24
|
10
|
+
time: 2018-08-24 15:54:06
|
11
|
+
binary_or_blob: \x92
|
12
|
+
*************************** 2. row ***************************
|
13
|
+
id: 2
|
14
|
+
string: anonymized string
|
15
|
+
email: anonymized+2@example.com
|
16
|
+
integer: 12345
|
17
|
+
float: 123.45
|
18
|
+
boolean: 1
|
19
|
+
null: NULL
|
20
|
+
date: 2018-08-24
|
21
|
+
time: 2018-08-24 15:54:06
|
22
|
+
binary_or_blob: \x92\x92
|
23
|
+
*************************** 3. row ***************************
|
24
|
+
id: 3
|
25
|
+
string: anonymized string
|
26
|
+
email: anonymized+3@example.com
|
27
|
+
integer: 12345
|
28
|
+
float: 123.45
|
29
|
+
boolean: 1
|
30
|
+
null: NULL
|
31
|
+
date: 2018-08-24
|
32
|
+
time: 2018-08-24 15:54:06
|
33
|
+
binary_or_blob: NULL
|
@@ -0,0 +1,59 @@
|
|
1
|
+
-- MySQL dump 10.13 Distrib 5.7.27, for osx10.14 (x86_64)
|
2
|
+
--
|
3
|
+
-- Host: localhost Database: sample
|
4
|
+
-- ------------------------------------------------------
|
5
|
+
-- Server version 5.7.27
|
6
|
+
|
7
|
+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
8
|
+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
9
|
+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
10
|
+
/*!40101 SET NAMES utf8 */;
|
11
|
+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
12
|
+
/*!40103 SET TIME_ZONE='+00:00' */;
|
13
|
+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
14
|
+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
15
|
+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
16
|
+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
17
|
+
|
18
|
+
--
|
19
|
+
-- Table structure for table `users`
|
20
|
+
--
|
21
|
+
|
22
|
+
DROP TABLE IF EXISTS `users`;
|
23
|
+
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
24
|
+
/*!40101 SET character_set_client = utf8 */;
|
25
|
+
CREATE TABLE `users` (
|
26
|
+
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
27
|
+
`string` varchar(20) NOT NULL DEFAULT '',
|
28
|
+
`email` varchar(200) NOT NULL DEFAULT '',
|
29
|
+
`integer` int(11) DEFAULT NULL,
|
30
|
+
`float` float DEFAULT NULL,
|
31
|
+
`boolean` tinyint(1) DEFAULT NULL,
|
32
|
+
`null` int(11) DEFAULT NULL,
|
33
|
+
`date` date DEFAULT NULL,
|
34
|
+
`time` timestamp NULL DEFAULT NULL,
|
35
|
+
`binary_or_blob` binary(11) DEFAULT NULL,
|
36
|
+
PRIMARY KEY (`id`)
|
37
|
+
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
|
38
|
+
/*!40101 SET character_set_client = @saved_cs_client */;
|
39
|
+
|
40
|
+
--
|
41
|
+
-- Dumping data for table `users`
|
42
|
+
--
|
43
|
+
|
44
|
+
LOCK TABLES `users` WRITE;
|
45
|
+
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
|
46
|
+
INSERT INTO `users` (`id`, `string`, `email`, `integer`, `float`, `boolean`, `null`, `date`, `time`, `binary_or_blob`) VALUES (1,'example@exa','test@example.com',1245,2.1,1,-321,NULL,NULL,_binary '\\x92\0\0\0\0\0\0\0'),(2,'あいうえお','invalid@email',0,-23.4422,0,321,NULL,NULL,_binary '\\x92\\x92\0\0\0'),(3,'+-l;a*&^%$','chikahiro@test.com',-1,21.2321,NULL,-231321,'2019-10-31','2019-10-31 16:27:21',NULL);
|
47
|
+
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
|
48
|
+
UNLOCK TABLES;
|
49
|
+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
50
|
+
|
51
|
+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
52
|
+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
53
|
+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
54
|
+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
55
|
+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
56
|
+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
57
|
+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
58
|
+
|
59
|
+
-- Dump completed on 2019-10-31 18:19:32
|
@@ -0,0 +1,15 @@
|
|
1
|
+
users:
|
2
|
+
string: anonymized string
|
3
|
+
email: anonymized+%{n}@example.com
|
4
|
+
integer: 12345
|
5
|
+
float: 123.45
|
6
|
+
boolean: true
|
7
|
+
'null': NULL
|
8
|
+
date: 2018-08-24
|
9
|
+
time: 2018-08-24 15:54:06
|
10
|
+
## TODO: something not working well with binary...
|
11
|
+
# binary_or_blob: !binary |
|
12
|
+
# R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5
|
13
|
+
# OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+
|
14
|
+
# +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC
|
15
|
+
# AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
set -Ceu -o pipefail
|
4
|
+
# set -vx # for debug
|
5
|
+
|
6
|
+
MYSQL_HOST=${MYSQL_HOST:-localhost}
|
7
|
+
MYSQL_USER=${MYSQL_USER:-mysqluser}
|
8
|
+
MYSQL_PASSWORD=${MYSQL_PASSWORD:-password}
|
9
|
+
MYSQL_DBNAME=${MYSQL_DBNAME:-mydb}
|
10
|
+
|
11
|
+
FILEDIR="$( cd "$( dirname "$0" )" && pwd )"
|
12
|
+
|
13
|
+
## clear tmp file
|
14
|
+
rm "$FILEDIR"/tmp/* || echo 'no tmp file'
|
15
|
+
|
16
|
+
## import database
|
17
|
+
mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DBNAME" < "$FILEDIR/import_dumpfile.sql"
|
18
|
+
|
19
|
+
## masking
|
20
|
+
mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DBNAME" --complete-insert | exe/masking -c "$FILEDIR/masking.yml" > "$FILEDIR/tmp/masking_dumpfile.sql"
|
21
|
+
mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DBNAME" < "$FILEDIR/tmp/masking_dumpfile.sql"
|
22
|
+
|
23
|
+
## compare
|
24
|
+
mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DBNAME" -e 'SELECT * FROM users ORDER BY id;' --vertical > "$FILEDIR/tmp/query_result.txt"
|
25
|
+
diff "$FILEDIR/tmp/query_result.txt" "$FILEDIR/expected_query_result.txt" && echo 'test passed!'
|
data/docker-compose.yml
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -Ceu -o pipefail
|
4
|
+
#set -vx # for debug
|
5
|
+
|
6
|
+
MYSQL_VERSION=${1:-mysql80}
|
7
|
+
DOCKER_COMPOSE_FILE=${2:-docker-compose.yml}
|
8
|
+
docker-compose -f "$DOCKER_COMPOSE_FILE" -f "docker-compose/$MYSQL_VERSION.yml" run -e "MYSQL_HOST=$MYSQL_VERSION" app acceptance/run_test.sh
|
@@ -0,0 +1,17 @@
|
|
1
|
+
version: '3.7'
|
2
|
+
|
3
|
+
services:
|
4
|
+
app:
|
5
|
+
build:
|
6
|
+
target: with-mysql-client
|
7
|
+
depends_on:
|
8
|
+
- mariadb100
|
9
|
+
entrypoint: docker-compose/wait-for-mysql.sh mariadb100
|
10
|
+
|
11
|
+
mariadb100:
|
12
|
+
image: mariadb:10.0
|
13
|
+
environment:
|
14
|
+
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
|
15
|
+
MYSQL_USER: mysqluser
|
16
|
+
MYSQL_PASSWORD: password
|
17
|
+
MYSQL_DATABASE: mydb
|
@@ -0,0 +1,17 @@
|
|
1
|
+
version: '3.7'
|
2
|
+
|
3
|
+
services:
|
4
|
+
app:
|
5
|
+
build:
|
6
|
+
target: with-mysql-client
|
7
|
+
depends_on:
|
8
|
+
- mariadb101
|
9
|
+
entrypoint: docker-compose/wait-for-mysql.sh mariadb101
|
10
|
+
|
11
|
+
mariadb101:
|
12
|
+
image: mariadb:10.1
|
13
|
+
environment:
|
14
|
+
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
|
15
|
+
MYSQL_USER: mysqluser
|
16
|
+
MYSQL_PASSWORD: password
|
17
|
+
MYSQL_DATABASE: mydb
|
@@ -0,0 +1,17 @@
|
|
1
|
+
version: '3.7'
|
2
|
+
|
3
|
+
services:
|
4
|
+
app:
|
5
|
+
build:
|
6
|
+
target: with-mysql-client
|
7
|
+
depends_on:
|
8
|
+
- mariadb102
|
9
|
+
entrypoint: docker-compose/wait-for-mysql.sh mariadb102
|
10
|
+
|
11
|
+
mariadb102:
|
12
|
+
image: mariadb:10.2
|
13
|
+
environment:
|
14
|
+
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
|
15
|
+
MYSQL_USER: mysqluser
|
16
|
+
MYSQL_PASSWORD: password
|
17
|
+
MYSQL_DATABASE: mydb
|
@@ -0,0 +1,17 @@
|
|
1
|
+
version: '3.7'
|
2
|
+
|
3
|
+
services:
|
4
|
+
app:
|
5
|
+
build:
|
6
|
+
target: with-mysql-client
|
7
|
+
depends_on:
|
8
|
+
- mariadb103
|
9
|
+
entrypoint: docker-compose/wait-for-mysql.sh mariadb103
|
10
|
+
|
11
|
+
mariadb103:
|
12
|
+
image: mariadb:10.3
|
13
|
+
environment:
|
14
|
+
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
|
15
|
+
MYSQL_USER: mysqluser
|
16
|
+
MYSQL_PASSWORD: password
|
17
|
+
MYSQL_DATABASE: mydb
|
@@ -0,0 +1,17 @@
|
|
1
|
+
version: '3.7'
|
2
|
+
|
3
|
+
services:
|
4
|
+
app:
|
5
|
+
build:
|
6
|
+
target: with-mysql-client
|
7
|
+
depends_on:
|
8
|
+
- mariadb104
|
9
|
+
entrypoint: docker-compose/wait-for-mysql.sh mariadb104
|
10
|
+
|
11
|
+
mariadb104:
|
12
|
+
image: mariadb:10.4
|
13
|
+
environment:
|
14
|
+
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
|
15
|
+
MYSQL_USER: mysqluser
|
16
|
+
MYSQL_PASSWORD: password
|
17
|
+
MYSQL_DATABASE: mydb
|
@@ -0,0 +1,17 @@
|
|
1
|
+
version: '3.7'
|
2
|
+
|
3
|
+
services:
|
4
|
+
app:
|
5
|
+
build:
|
6
|
+
target: with-mysql-client
|
7
|
+
depends_on:
|
8
|
+
- mariadb55
|
9
|
+
entrypoint: docker-compose/wait-for-mysql.sh mariadb55
|
10
|
+
|
11
|
+
mariadb55:
|
12
|
+
image: mariadb:5.5
|
13
|
+
environment:
|
14
|
+
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
|
15
|
+
MYSQL_USER: mysqluser
|
16
|
+
MYSQL_PASSWORD: password
|
17
|
+
MYSQL_DATABASE: mydb
|
@@ -0,0 +1,17 @@
|
|
1
|
+
version: '3.7'
|
2
|
+
|
3
|
+
services:
|
4
|
+
app:
|
5
|
+
build:
|
6
|
+
target: with-mysql-client
|
7
|
+
depends_on:
|
8
|
+
- mysql55
|
9
|
+
entrypoint: docker-compose/wait-for-mysql.sh mysql55
|
10
|
+
|
11
|
+
mysql55:
|
12
|
+
image: mysql:5.5
|
13
|
+
environment:
|
14
|
+
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
|
15
|
+
MYSQL_USER: mysqluser
|
16
|
+
MYSQL_PASSWORD: password
|
17
|
+
MYSQL_DATABASE: mydb
|
@@ -0,0 +1,17 @@
|
|
1
|
+
version: '3.7'
|
2
|
+
|
3
|
+
services:
|
4
|
+
app:
|
5
|
+
build:
|
6
|
+
target: with-mysql-client
|
7
|
+
depends_on:
|
8
|
+
- mysql56
|
9
|
+
entrypoint: docker-compose/wait-for-mysql.sh mysql56
|
10
|
+
|
11
|
+
mysql56:
|
12
|
+
image: mysql:5.6
|
13
|
+
environment:
|
14
|
+
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
|
15
|
+
MYSQL_USER: mysqluser
|
16
|
+
MYSQL_PASSWORD: password
|
17
|
+
MYSQL_DATABASE: mydb
|
@@ -0,0 +1,17 @@
|
|
1
|
+
version: '3.7'
|
2
|
+
|
3
|
+
services:
|
4
|
+
app:
|
5
|
+
build:
|
6
|
+
target: with-mysql-client
|
7
|
+
depends_on:
|
8
|
+
- mysql57
|
9
|
+
entrypoint: docker-compose/wait-for-mysql.sh mysql57
|
10
|
+
|
11
|
+
mysql57:
|
12
|
+
image: mysql:5.7
|
13
|
+
environment:
|
14
|
+
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
|
15
|
+
MYSQL_USER: mysqluser
|
16
|
+
MYSQL_PASSWORD: password
|
17
|
+
MYSQL_DATABASE: mydb
|
@@ -0,0 +1,19 @@
|
|
1
|
+
version: '3.7'
|
2
|
+
|
3
|
+
services:
|
4
|
+
app:
|
5
|
+
build:
|
6
|
+
target: with-mysql-client
|
7
|
+
depends_on:
|
8
|
+
- mysql80
|
9
|
+
entrypoint: docker-compose/wait-for-mysql.sh mysql80
|
10
|
+
|
11
|
+
mysql80:
|
12
|
+
image: mysql:8.0
|
13
|
+
# fix for: ERROR 1045 (28000): Plugin caching_sha2_password could not be loaded:
|
14
|
+
command: --default-authentication-plugin=mysql_native_password
|
15
|
+
environment:
|
16
|
+
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
|
17
|
+
MYSQL_USER: mysqluser
|
18
|
+
MYSQL_PASSWORD: password
|
19
|
+
MYSQL_DATABASE: mydb
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
# inspited from Control startup and shutdown order in Compose | Docker Documentation: https://docs.docker.com/compose/startup-order/
|
3
|
+
|
4
|
+
set -e
|
5
|
+
|
6
|
+
MYSQL_USER=${MYSQL_USER:-mysqluser}
|
7
|
+
MYSQL_PASSWORD=${MYSQL_PASSWORD:-password}
|
8
|
+
|
9
|
+
MYSQL_HOST="$1"
|
10
|
+
shift
|
11
|
+
cmd=$*
|
12
|
+
|
13
|
+
until mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -e 'exit'; do
|
14
|
+
>&2 echo "mysql is unavailable - sleeping"
|
15
|
+
sleep 1
|
16
|
+
done
|
17
|
+
|
18
|
+
>&2 echo "mysql is up - executing command"
|
19
|
+
exec $cmd
|
data/exe/masking
CHANGED
data/lib/masking/cli.rb
CHANGED
@@ -28,6 +28,7 @@ module Masking
|
|
28
28
|
parser.banner = 'Usage: masking [options]'
|
29
29
|
|
30
30
|
define_config_option(parser)
|
31
|
+
define_version_option(parser)
|
31
32
|
end
|
32
33
|
end
|
33
34
|
|
@@ -38,5 +39,12 @@ module Masking
|
|
38
39
|
end
|
39
40
|
end
|
40
41
|
end
|
42
|
+
|
43
|
+
def define_version_option(parser)
|
44
|
+
parser.on('-v', '--version', 'version') do
|
45
|
+
puts Masking::VERSION
|
46
|
+
exit(true)
|
47
|
+
end
|
48
|
+
end
|
41
49
|
end
|
42
50
|
end
|
@@ -4,3 +4,7 @@ Masking::Error::ConfigFileIsNotFile:
|
|
4
4
|
"ERROR: config file (<%= config_file_path %>) is not file"
|
5
5
|
Masking::Error::ConfigFileIsNotValidYaml:
|
6
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?"
|
@@ -44,6 +44,8 @@ module Masking
|
|
44
44
|
@tables ||= data.each_with_object({}) do |kv, r|
|
45
45
|
r[kv[0].to_sym] = Table.new(kv[0], columns: kv[1])
|
46
46
|
end
|
47
|
+
rescue Masking::Config::TargetColumns::Column::ColumnNameIsNil
|
48
|
+
raise Masking::Error::ConfigFileContainsNullAsColumnName
|
47
49
|
end
|
48
50
|
end
|
49
51
|
end
|
@@ -10,6 +10,8 @@ module Masking
|
|
10
10
|
attr_accessor :index
|
11
11
|
|
12
12
|
def initialize(name, table_name:, method_value:)
|
13
|
+
raise ColumnNameIsNil if name.nil?
|
14
|
+
|
13
15
|
@name = name.to_sym
|
14
16
|
@table_name = table_name.to_sym
|
15
17
|
@method_value = method_value
|
@@ -27,6 +29,7 @@ module Masking
|
|
27
29
|
private
|
28
30
|
|
29
31
|
attr_reader :method
|
32
|
+
class ColumnNameIsNil < StandardError; end
|
30
33
|
end
|
31
34
|
end
|
32
35
|
end
|
data/lib/masking/errors.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# Global Errors in Masking library
|
3
4
|
module Masking
|
4
5
|
class Error < StandardError
|
5
6
|
class ConfigFileDoesNotExist < Error; end
|
6
7
|
class ConfigFileIsNotFile < Error; end
|
7
8
|
class ConfigFileIsNotValidYaml < Error; end
|
9
|
+
class ConfigFileContainsNullAsColumnName < Error; end
|
10
|
+
class InsertStatementParseError < Error; end
|
8
11
|
end
|
9
12
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'masking/errors'
|
3
4
|
require 'masking/insert_statement/sql_builder'
|
4
5
|
|
5
6
|
module Masking
|
@@ -10,6 +11,8 @@ module Masking
|
|
10
11
|
@raw_statement = raw_statement
|
11
12
|
|
12
13
|
PARSE_REGEXP.match(raw_statement).tap do |match_data|
|
14
|
+
raise Error::InsertStatementParseError if match_data.nil?
|
15
|
+
|
13
16
|
@table = match_data[:table]
|
14
17
|
@columns_section = match_data[:columns_section]
|
15
18
|
@values_section = match_data[:values_section]
|
data/lib/masking/version.rb
CHANGED
data/masking.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
|
26
26
|
spec.required_ruby_version = '>= 2.5'
|
27
27
|
|
28
|
-
spec.add_development_dependency 'bundler', '~>
|
28
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
29
29
|
spec.add_development_dependency 'rake', '~> 10.0'
|
30
30
|
spec.add_development_dependency 'rake-notes'
|
31
31
|
spec.add_development_dependency 'ruby-prof'
|
data/masking.yml.sample
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: masking
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chikahiro Tokoro
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -187,24 +187,49 @@ executables:
|
|
187
187
|
extensions: []
|
188
188
|
extra_rdoc_files: []
|
189
189
|
files:
|
190
|
+
- ".circleci/config.yml"
|
190
191
|
- ".codeclimate.yml"
|
192
|
+
- ".dockerignore"
|
193
|
+
- ".github/workflows/acceptance_test_mariadb.yml"
|
194
|
+
- ".github/workflows/acceptance_test_mysql.yml"
|
195
|
+
- ".github/workflows/check_changelog.yml"
|
191
196
|
- ".gitignore"
|
192
197
|
- ".mdlrc"
|
193
198
|
- ".rubocop.yml"
|
194
199
|
- ".ruby-version"
|
195
|
-
- ".travis.yml"
|
196
200
|
- CHANGELOG.md
|
197
201
|
- CODE_OF_CONDUCT.md
|
202
|
+
- Dockerfile
|
198
203
|
- Gemfile
|
199
204
|
- Gemfile.lock
|
200
205
|
- LICENSE.txt
|
201
206
|
- README.md
|
202
207
|
- Rakefile
|
208
|
+
- acceptance/expected_query_result.txt
|
209
|
+
- acceptance/import_dumpfile.sql
|
210
|
+
- acceptance/masking.yml
|
211
|
+
- acceptance/run_test.sh
|
212
|
+
- acceptance/tmp/.keep
|
203
213
|
- bin/benchmark.rb
|
204
214
|
- bin/console
|
205
215
|
- bin/masking_profile
|
206
216
|
- bin/setup
|
207
217
|
- config/.keep
|
218
|
+
- coverage/.keep
|
219
|
+
- docker-compose-ci.yml
|
220
|
+
- docker-compose.yml
|
221
|
+
- docker-compose/acceptance_test.sh
|
222
|
+
- docker-compose/mariadb100.yml
|
223
|
+
- docker-compose/mariadb101.yml
|
224
|
+
- docker-compose/mariadb102.yml
|
225
|
+
- docker-compose/mariadb103.yml
|
226
|
+
- docker-compose/mariadb104.yml
|
227
|
+
- docker-compose/mariadb55.yml
|
228
|
+
- docker-compose/mysql55.yml
|
229
|
+
- docker-compose/mysql56.yml
|
230
|
+
- docker-compose/mysql57.yml
|
231
|
+
- docker-compose/mysql80.yml
|
232
|
+
- docker-compose/wait-for-mysql.sh
|
208
233
|
- exe/masking
|
209
234
|
- lib/masking.rb
|
210
235
|
- lib/masking/cli.rb
|
@@ -253,7 +278,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
253
278
|
- !ruby/object:Gem::Version
|
254
279
|
version: '0'
|
255
280
|
requirements: []
|
256
|
-
rubygems_version: 3.0.
|
281
|
+
rubygems_version: 3.0.3
|
257
282
|
signing_key:
|
258
283
|
specification_version: 4
|
259
284
|
summary: Command line tool for anonymizing databese records
|