acts_as_scrubbable 2.1.3 → 2.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +109 -0
- data/Gemfile +12 -2
- data/acts_as_scrubbable.gemspec +1 -0
- data/lib/acts_as_scrubbable/scrub.rb +12 -14
- data/lib/acts_as_scrubbable/update_processor.rb +4 -2
- data/lib/acts_as_scrubbable/version.rb +1 -1
- data/spec/lib/acts_as_scrubbable/scrub_spec.rb +23 -4
- data/spec/lib/acts_as_scrubbable/task_runner_spec.rb +2 -1
- data/spec/lib/acts_as_scrubbable/update_processor_spec.rb +7 -1
- data/spec/support/database.rb +4 -0
- metadata +17 -3
- data/.github/workflows/pr-security.yaml +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 78c5e20c000ca44b2113629dd0bd1f2b17f1e0f0fc02235b769a81e5d2522f14
|
4
|
+
data.tar.gz: 42fadcfbaecf25abde3745e41aea33672f8cfa8250b60b8d8a321210dd0be8ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7077e06618544ec4e97888b15bf375fa7547ba6b090d7b16068940d421275c0751133e45147765ebe4cee922e2dd82fd5c80be036d516b320f956cff7d52a0d9
|
7
|
+
data.tar.gz: 4edf71dd76d658eb1c92ee2ea77351ab748bc18042b3a6286210bade096ef1712e6a1508f76cce6667f96d0051ff6694985abb40df6852d591893cf5d69c1c37
|
@@ -0,0 +1,109 @@
|
|
1
|
+
version: 2.1
|
2
|
+
|
3
|
+
_references:
|
4
|
+
ruby_versions: &ruby_versions
|
5
|
+
ruby-version:
|
6
|
+
- "3.3.0"
|
7
|
+
- "3.2.2"
|
8
|
+
- "3.1.4"
|
9
|
+
- "3.0.6"
|
10
|
+
rails_version_prefixess: &rails_version_prefixes
|
11
|
+
rails-version-prefix:
|
12
|
+
- "7.1"
|
13
|
+
- "7.0"
|
14
|
+
- "6.1"
|
15
|
+
|
16
|
+
orbs:
|
17
|
+
ruby: circleci/ruby@2.1.0
|
18
|
+
|
19
|
+
jobs:
|
20
|
+
test:
|
21
|
+
parameters:
|
22
|
+
ruby-version:
|
23
|
+
type: string
|
24
|
+
rails-version-prefix:
|
25
|
+
type: string
|
26
|
+
|
27
|
+
executor:
|
28
|
+
name: ruby/default
|
29
|
+
tag: <<parameters.ruby-version>>
|
30
|
+
environment:
|
31
|
+
RAILS_VERSION_PREFIX: <<parameters.rails-version-prefix>>
|
32
|
+
steps:
|
33
|
+
- checkout
|
34
|
+
- ruby/install-deps:
|
35
|
+
# Have to set this since there's no lockfile
|
36
|
+
bundler-version: ">2"
|
37
|
+
# Do not use deployment mode, because we don't have a lockfile
|
38
|
+
path: "bundle"
|
39
|
+
# Always install the latest versions available
|
40
|
+
with-cache: false
|
41
|
+
- ruby/rspec-test
|
42
|
+
test-ruby-head:
|
43
|
+
parameters:
|
44
|
+
rails-version-prefix:
|
45
|
+
type: string
|
46
|
+
docker:
|
47
|
+
- image: cimg/base:stable
|
48
|
+
environment:
|
49
|
+
RAILS_VERSION: <<parameters.rails-version-prefix>>
|
50
|
+
steps:
|
51
|
+
- checkout
|
52
|
+
- ruby/install:
|
53
|
+
# RVM wants Ruby 2 for some reason to install Ruby head.
|
54
|
+
# But then it will use 2.7.8 by default in the future;
|
55
|
+
# we must use `rvm use ruby-head` before every command that matters
|
56
|
+
version: "2.7.8"
|
57
|
+
- ruby/install:
|
58
|
+
version: ruby-head
|
59
|
+
- restore_cache:
|
60
|
+
keys:
|
61
|
+
- v1-{{ arch }}-ruby-head-bundler
|
62
|
+
- run:
|
63
|
+
name: Install Ruby dependencies
|
64
|
+
command: |
|
65
|
+
rvm use ruby-head
|
66
|
+
ruby --version
|
67
|
+
gem install bundler
|
68
|
+
bundle config set path bundle
|
69
|
+
bundle update
|
70
|
+
- save_cache:
|
71
|
+
key: v1-{{ arch }}-ruby-head-bundler
|
72
|
+
paths:
|
73
|
+
- ./bundle
|
74
|
+
- run:
|
75
|
+
name: RSpec tests
|
76
|
+
command: |
|
77
|
+
rvm use ruby-head
|
78
|
+
ruby --version
|
79
|
+
mkdir -p /tmp/test-results/rspec
|
80
|
+
bundle exec rspec --profile 10 --format RspecJunitFormatter --out /tmp/test-results/rspec/results.xml --format progress
|
81
|
+
- store_test_results:
|
82
|
+
path: /tmp/test-results/rspec
|
83
|
+
|
84
|
+
workflows:
|
85
|
+
test:
|
86
|
+
jobs:
|
87
|
+
- test:
|
88
|
+
name: "test-ruby-<<matrix.ruby-version>>-rails-<<matrix.rails-version-prefix>>"
|
89
|
+
matrix:
|
90
|
+
parameters:
|
91
|
+
<<: *ruby_versions
|
92
|
+
<<: *rails_version_prefixes
|
93
|
+
test-head:
|
94
|
+
jobs:
|
95
|
+
- test:
|
96
|
+
name: "test-ruby-<<matrix.ruby-version>>-rails-main"
|
97
|
+
matrix:
|
98
|
+
parameters:
|
99
|
+
<<: *ruby_versions
|
100
|
+
rails-version-prefix:
|
101
|
+
- main
|
102
|
+
exclude:
|
103
|
+
- ruby-version: 3.0.6
|
104
|
+
rails-version-prefix: main
|
105
|
+
- test-ruby-head:
|
106
|
+
name: "test-ruby-head-rails-<<matrix.rails-version-prefix>>"
|
107
|
+
matrix:
|
108
|
+
parameters:
|
109
|
+
<<: *rails_version_prefixes
|
data/Gemfile
CHANGED
@@ -1,5 +1,15 @@
|
|
1
|
-
ruby '3.2.2'
|
2
|
-
|
3
1
|
source 'https://rubygems.org'
|
4
2
|
|
5
3
|
gemspec
|
4
|
+
|
5
|
+
# Lock Rails down in the matrix build, but not by default
|
6
|
+
rails_version_prefix = ENV.fetch("RAILS_VERSION_PREFIX", nil)
|
7
|
+
if rails_version_prefix == "main"
|
8
|
+
gem "activesupport", github: "rails/rails", branch: "main"
|
9
|
+
gem "activerecord", github: "rails/rails", branch: "main"
|
10
|
+
gem "railties", github: "rails/rails", branch: "main"
|
11
|
+
elsif rails_version_prefix
|
12
|
+
gem "activesupport", "~> #{rails_version_prefix}.0"
|
13
|
+
gem "activerecord", "~> #{rails_version_prefix}.0"
|
14
|
+
gem "railties", "~> #{rails_version_prefix}.0"
|
15
|
+
end
|
data/acts_as_scrubbable.gemspec
CHANGED
@@ -27,6 +27,7 @@ Gem::Specification.new do |s|
|
|
27
27
|
s.add_development_dependency 'pry-byebug' , '~> 3.2'
|
28
28
|
s.add_development_dependency 'terminal-notifier-guard' , '~> 1.6'
|
29
29
|
s.add_development_dependency 'activerecord-nulldb-adapter', '~> 1.0'
|
30
|
+
s.add_development_dependency 'rspec_junit_formatter'
|
30
31
|
|
31
32
|
s.files = `git ls-files`.split("\n")
|
32
33
|
s.test_files = `git ls-files -- spec/*`.split("\n")
|
@@ -4,24 +4,22 @@ module ActsAsScrubbable
|
|
4
4
|
def scrubbed_values
|
5
5
|
return unless self.class.scrubbable?
|
6
6
|
|
7
|
-
|
8
|
-
_updates = {}
|
7
|
+
_updates = {}
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
14
|
-
next if self.send(_field).blank?
|
15
|
-
|
16
|
-
if ActsAsScrubbable.scrub_map.keys.include?(value)
|
17
|
-
_updates[_field] = ActsAsScrubbable.scrub_map[value].call
|
18
|
-
else
|
19
|
-
puts "Undefined scrub: #{value} for #{self.class}#{_field}"
|
20
|
-
end
|
9
|
+
scrubbable_fields.each do |_field, value|
|
10
|
+
unless self.respond_to?(_field)
|
11
|
+
raise ArgumentError, "#{self.class} do not respond to #{_field}"
|
21
12
|
end
|
13
|
+
next if self.send(_field).blank?
|
22
14
|
|
23
|
-
|
15
|
+
if ActsAsScrubbable.scrub_map.keys.include?(value)
|
16
|
+
_updates[_field] = ActsAsScrubbable.scrub_map[value].call
|
17
|
+
else
|
18
|
+
puts "Undefined scrub: #{value} for #{self.class}.#{_field}"
|
19
|
+
end
|
24
20
|
end
|
21
|
+
|
22
|
+
_updates
|
25
23
|
end
|
26
24
|
end
|
27
25
|
end
|
@@ -8,8 +8,10 @@ module ActsAsScrubbable
|
|
8
8
|
def handle_batch(batch)
|
9
9
|
scrubbed_count = 0
|
10
10
|
batch.each do |obj|
|
11
|
-
|
12
|
-
|
11
|
+
obj.run_callbacks(:scrub) do
|
12
|
+
_updates = obj.scrubbed_values
|
13
|
+
obj.update_columns(_updates) unless _updates.empty?
|
14
|
+
end
|
13
15
|
scrubbed_count += 1
|
14
16
|
end
|
15
17
|
scrubbed_count
|
@@ -57,10 +57,29 @@ RSpec.describe ActsAsScrubbable::Scrub do
|
|
57
57
|
expect(_updates[:address1]).to be_nil
|
58
58
|
end
|
59
59
|
|
60
|
-
it '
|
61
|
-
|
62
|
-
|
63
|
-
|
60
|
+
it 'output no information when all scrubbers found' do
|
61
|
+
expect(STDOUT).to_not receive(:puts)
|
62
|
+
|
63
|
+
_updates = subject.scrubbed_values
|
64
|
+
end
|
65
|
+
|
66
|
+
context "scrubbable" do
|
67
|
+
subject { MissingScrubbableModel.new }
|
68
|
+
|
69
|
+
it 'outputs warning message' do
|
70
|
+
subject.first_name = "Johnny"
|
71
|
+
subject.last_name = "Frank"
|
72
|
+
|
73
|
+
allow(Faker::Name).to receive(:first_name).and_return("Larry")
|
74
|
+
allow(Faker::Name).to receive(:last_name).and_return("Baker")
|
75
|
+
|
76
|
+
expect(STDOUT).to receive(:puts).with('Undefined scrub: fake_first_name for MissingScrubbableModel.first_name')
|
77
|
+
expect(Faker::Name).to_not receive(:first_name)
|
78
|
+
|
79
|
+
_updates = subject.scrubbed_values
|
80
|
+
expect(_updates[:last_name]).to eq('Baker')
|
81
|
+
expect(_updates[:first_name]).to be_nil
|
82
|
+
end
|
64
83
|
end
|
65
84
|
end
|
66
85
|
end
|
@@ -53,10 +53,11 @@ RSpec.describe ActsAsScrubbable::TaskRunner do
|
|
53
53
|
it "scrubs all scrubbable classes", :aggregate_failures do
|
54
54
|
runner.extract_ar_classes
|
55
55
|
runner.scrub(num_of_batches: 1)
|
56
|
-
expect(processor).to have_received(:process).with(1).exactly(
|
56
|
+
expect(processor).to have_received(:process).with(1).exactly(4).times
|
57
57
|
expect(ActsAsScrubbable::ArClassProcessor).to have_received(:new).with(ScrubbableModel)
|
58
58
|
expect(ActsAsScrubbable::ArClassProcessor).to have_received(:new).with(AnotherScrubbableModel)
|
59
59
|
expect(ActsAsScrubbable::ArClassProcessor).to have_received(:new).with(AThirdScrubbableModel)
|
60
|
+
expect(ActsAsScrubbable::ArClassProcessor).to have_received(:new).with(MissingScrubbableModel)
|
60
61
|
expect(ActsAsScrubbable::ArClassProcessor).not_to have_received(:new).with(NonScrubbableModel)
|
61
62
|
end
|
62
63
|
|
@@ -15,5 +15,11 @@ RSpec.describe ActsAsScrubbable::UpdateProcessor do
|
|
15
15
|
|
16
16
|
expect(subject.send(:handle_batch, [model])).to eq 1
|
17
17
|
end
|
18
|
+
|
19
|
+
it "runs scrub callbacks" do
|
20
|
+
subject.send(:handle_batch, [model])
|
21
|
+
expect(model.scrubbing_begun).to be(true)
|
22
|
+
expect(model.scrubbing_finished).to be(true)
|
23
|
+
end
|
18
24
|
end
|
19
|
-
end
|
25
|
+
end
|
data/spec/support/database.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_scrubbable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samer Masry
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-07-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -210,6 +210,20 @@ dependencies:
|
|
210
210
|
- - "~>"
|
211
211
|
- !ruby/object:Gem::Version
|
212
212
|
version: '1.0'
|
213
|
+
- !ruby/object:Gem::Dependency
|
214
|
+
name: rspec_junit_formatter
|
215
|
+
requirement: !ruby/object:Gem::Requirement
|
216
|
+
requirements:
|
217
|
+
- - ">="
|
218
|
+
- !ruby/object:Gem::Version
|
219
|
+
version: '0'
|
220
|
+
type: :development
|
221
|
+
prerelease: false
|
222
|
+
version_requirements: !ruby/object:Gem::Requirement
|
223
|
+
requirements:
|
224
|
+
- - ">="
|
225
|
+
- !ruby/object:Gem::Version
|
226
|
+
version: '0'
|
213
227
|
description: ActsAsScrubbable helps you scrub your database the easy way with mock
|
214
228
|
data at the ActiveRecord level
|
215
229
|
email:
|
@@ -218,7 +232,7 @@ executables: []
|
|
218
232
|
extensions: []
|
219
233
|
extra_rdoc_files: []
|
220
234
|
files:
|
221
|
-
- ".
|
235
|
+
- ".circleci/config.yml"
|
222
236
|
- ".gitignore"
|
223
237
|
- ".rspec"
|
224
238
|
- ".travis.yml"
|
@@ -1,32 +0,0 @@
|
|
1
|
-
---
|
2
|
-
# onemedical/<repo>/.github/workflows/pr-security.yaml
|
3
|
-
#
|
4
|
-
# This is the workflow for distribution to repositories across the organization.
|
5
|
-
# It will call the reusable PR security workflow, and run scans against each PR.
|
6
|
-
name: PR Security
|
7
|
-
|
8
|
-
|
9
|
-
# yamllint disable-line rule:truthy
|
10
|
-
on:
|
11
|
-
pull_request:
|
12
|
-
branches: [main, master]
|
13
|
-
|
14
|
-
|
15
|
-
permissions:
|
16
|
-
# Required for workflows in private repositories.
|
17
|
-
contents: read
|
18
|
-
|
19
|
-
# Required for SARIF results upload to GHAS.
|
20
|
-
security-events: write
|
21
|
-
actions: read
|
22
|
-
|
23
|
-
|
24
|
-
jobs:
|
25
|
-
# Run the reusable workflow.
|
26
|
-
run-workflow:
|
27
|
-
name: Run Workflow
|
28
|
-
# yamllint disable-line rule:line-length
|
29
|
-
uses: onemedical/github-reusable-workflows/.github/workflows/reusable-pr-security.yaml@main
|
30
|
-
# The detect-secrets tool is used in some repositories, and generates false
|
31
|
-
# positives like the one below. Add comment to ignore.
|
32
|
-
secrets: inherit # pragma: allowlist secret
|