attr_masker 0.1.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/tests.yml +91 -0
  3. data/.gitignore +5 -1
  4. data/.rubocop.yml +13 -1069
  5. data/CHANGELOG.adoc +31 -0
  6. data/Gemfile +5 -0
  7. data/README.adoc +81 -30
  8. data/Rakefile +0 -27
  9. data/attr_masker.gemspec +15 -10
  10. data/bin/console +14 -0
  11. data/bin/rake +29 -0
  12. data/bin/rspec +29 -0
  13. data/bin/rubocop +29 -0
  14. data/bin/setup +9 -0
  15. data/gemfiles/Rails-4.2.gemfile +2 -3
  16. data/gemfiles/Rails-5.0.gemfile +2 -3
  17. data/gemfiles/Rails-5.1.gemfile +2 -3
  18. data/gemfiles/Rails-5.2.gemfile +4 -0
  19. data/gemfiles/Rails-6.0.gemfile +3 -0
  20. data/gemfiles/Rails-6.1.gemfile +3 -0
  21. data/gemfiles/Rails-head.gemfile +1 -3
  22. data/gemfiles/common.gemfile +4 -0
  23. data/lib/attr_masker.rb +6 -210
  24. data/lib/attr_masker/attribute.rb +80 -0
  25. data/lib/attr_masker/error.rb +1 -0
  26. data/lib/attr_masker/maskers/replacing.rb +20 -3
  27. data/lib/attr_masker/maskers/simple.rb +20 -5
  28. data/lib/attr_masker/model.rb +143 -0
  29. data/lib/attr_masker/performer.rb +56 -17
  30. data/lib/attr_masker/version.rb +1 -16
  31. data/lib/tasks/db.rake +13 -4
  32. data/spec/dummy/app/models/non_persisted_model.rb +2 -0
  33. data/spec/dummy/config/attr_masker.rb +1 -0
  34. data/spec/dummy/config/mongoid.yml +33 -0
  35. data/spec/dummy/config/routes.rb +0 -1
  36. data/spec/dummy/db/schema.rb +1 -0
  37. data/spec/features/active_record_spec.rb +97 -0
  38. data/spec/features/mongoid_spec.rb +36 -0
  39. data/spec/features/shared_examples.rb +382 -0
  40. data/spec/spec_helper.rb +26 -3
  41. data/spec/support/00_control_constants.rb +2 -0
  42. data/spec/support/10_mongoid_env.rb +9 -0
  43. data/spec/support/20_combustion.rb +10 -0
  44. data/spec/support/db_cleaner.rb +13 -2
  45. data/spec/support/force_config_file_reload.rb +9 -0
  46. data/spec/support/rake.rb +1 -1
  47. data/spec/unit/attribute_spec.rb +210 -0
  48. data/spec/{maskers → unit/maskers}/replacing_spec.rb +0 -0
  49. data/spec/{maskers → unit/maskers}/simple_spec.rb +2 -2
  50. data/spec/unit/model_spec.rb +12 -0
  51. data/spec/unit/rake_task_spec.rb +30 -0
  52. metadata +139 -32
  53. data/.travis.yml +0 -32
  54. data/gemfiles/Rails-4.0.gemfile +0 -5
  55. data/gemfiles/Rails-4.1.gemfile +0 -5
  56. data/spec/features_spec.rb +0 -203
  57. data/spec/support/0_combustion.rb +0 -5
data/spec/spec_helper.rb CHANGED
@@ -1,10 +1,35 @@
1
1
  # (c) 2017 Ribose Inc.
2
2
  #
3
3
 
4
+ # Warnings gem must be added to Gemfile or otherwise loaded in order to have
5
+ # the following configuration in effect.
6
+ #
7
+ # TODO: Add Warning to gemspec or Gemfile after dropping support for Ruby 2.3.
8
+ begin
9
+ require "warning"
10
+
11
+ # Deduplicate warnings
12
+ Warning.dedup
13
+
14
+ # Ignore all warnings in Gem dependencies
15
+ Gem.path.each do |path|
16
+ Warning.ignore(//, path)
17
+ end
18
+ rescue LoadError
19
+ end
20
+
21
+ require "simplecov"
22
+ SimpleCov.start
23
+
24
+ if ENV.key?("CI")
25
+ require "codecov"
26
+ SimpleCov.formatter = SimpleCov::Formatter::Codecov
27
+ end
28
+
4
29
  require "bundler"
5
30
  Bundler.require :default, :development
6
31
 
7
- Dir[File.expand_path "../support/**/*.rb", __FILE__].each { |f| require f }
32
+ Dir[File.expand_path "support/**/*.rb", __dir__].sort.each { |f| require f }
8
33
 
9
34
  RSpec.configure do |config|
10
35
  # Enable flags like --only-failures and --next-failure
@@ -17,5 +42,3 @@ RSpec.configure do |config|
17
42
  c.syntax = :expect
18
43
  end
19
44
  end
20
-
21
- require "rails/all"
@@ -0,0 +1,2 @@
1
+ WITHOUT_ACTIVE_RECORD = ENV.fetch("WITHOUT", "") =~ /\bactiverecord\b/
2
+ WITHOUT_MONGOID = ENV.fetch("WITHOUT", "") =~ /\bmongoid\b/
@@ -0,0 +1,9 @@
1
+ # Copied from Mongoid's test suite
2
+ # https://github.com/mongodb/mongoid/blob/v6.2.0/spec/spec_helper.rb
3
+
4
+ # These environment variables can be set if wanting to test against a database
5
+ # that is not on the local machine.
6
+ ENV["MONGOID_SPEC_HOST"] ||= "127.0.0.1"
7
+ ENV["MONGOID_SPEC_PORT"] ||= "27017"
8
+
9
+ require "mongoid" unless WITHOUT_MONGOID
@@ -0,0 +1,10 @@
1
+ # (c) 2017 Ribose Inc.
2
+ #
3
+
4
+ Combustion.path = "spec/dummy"
5
+
6
+ if WITHOUT_ACTIVE_RECORD
7
+ Combustion.initialize!
8
+ else
9
+ Combustion.initialize! :active_record
10
+ end
@@ -2,9 +2,20 @@ require "database_cleaner"
2
2
 
3
3
  RSpec.configure do |config|
4
4
  config.before(:suite) do
5
- DatabaseCleaner.clean_with(:truncation)
5
+ unless WITHOUT_ACTIVE_RECORD
6
+ require "database_cleaner-active_record"
7
+ DatabaseCleaner[:active_record].strategy = :truncation
8
+ end
6
9
 
7
- DatabaseCleaner.strategy = :truncation
10
+ # Since models are defined dynamically in specs, Database Cleaner is unable
11
+ # to list them and to determine collection names to be cleaned.
12
+ # Therefore, they are specified explicitly here.
13
+ unless WITHOUT_MONGOID
14
+ require "database_cleaner-mongoid"
15
+ DatabaseCleaner[:mongoid].strategy = :truncation, { only: "users" }
16
+ end
17
+
18
+ DatabaseCleaner.clean_with(:truncation)
8
19
  end
9
20
 
10
21
  config.around(:each) do |example|
@@ -0,0 +1,9 @@
1
+ RSpec.configure do |config|
2
+ config.before(:each, :force_config_file_reload) do
3
+ config_path = Rails.root.join("config", "attr_masker.rb").to_s
4
+ # $" holds names of source files which have been loaded already.
5
+ # Removing a path from that list causes given file to be loaded
6
+ # again at next #require call.
7
+ $".delete(config_path)
8
+ end
9
+ end
data/spec/support/rake.rb CHANGED
@@ -3,4 +3,4 @@
3
3
 
4
4
  require "rake"
5
5
  Rails.application.load_tasks
6
- load File.expand_path("../../../lib/tasks/db.rake", __FILE__)
6
+ load File.expand_path("../../lib/tasks/db.rake", __dir__)
@@ -0,0 +1,210 @@
1
+ # (c) 2017 Ribose Inc.
2
+ #
3
+
4
+ require "spec_helper"
5
+
6
+ RSpec.describe AttrMasker::Attribute do
7
+ describe "::new" do
8
+ subject { described_class.method :new }
9
+
10
+ it "instantiates a new attribute definition" do
11
+ opts = { arbitrary: :options }
12
+ retval = subject.call(:some_attr, :some_model, opts)
13
+ expect(retval.name).to eq(:some_attr)
14
+ expect(retval.model).to eq(:some_model)
15
+ expect(retval.options).to eq(opts)
16
+ end
17
+ end
18
+
19
+ describe "#column_names" do
20
+ subject { receiver.method :column_names }
21
+ let(:receiver) { described_class.new :some_attr, :some_model, options }
22
+ let(:options) { {} }
23
+
24
+ it "defaults to array containing attribute name only" do
25
+ expect(subject.call).to contain_exactly(:some_attr)
26
+ end
27
+
28
+ it "can be overriden with :column_names option" do
29
+ options[:column_names] = :some_column
30
+ expect(subject.call).to eq(:some_column)
31
+ end
32
+ end
33
+
34
+ describe "#should_mask?" do
35
+ subject { described_class.instance_method :should_mask? }
36
+
37
+ let(:model_instance) { double }
38
+ let(:truthy) { double call: true }
39
+ let(:falsey) { double call: false }
40
+
41
+ example { expect(retval_for_opts({})).to be(true) }
42
+ example { expect(retval_for_opts(if: truthy)).to be(true) }
43
+ example { expect(retval_for_opts(if: falsey)).to be(false) }
44
+ example { expect(retval_for_opts(unless: truthy)).to be(false) }
45
+ example { expect(retval_for_opts(unless: falsey)).to be(true) }
46
+ example { expect(retval_for_opts(if: truthy, unless: truthy)).to be(false) }
47
+ example { expect(retval_for_opts(if: truthy, unless: falsey)).to be(true) }
48
+ example { expect(retval_for_opts(if: falsey, unless: truthy)).to be(false) }
49
+ example { expect(retval_for_opts(if: falsey, unless: falsey)).to be(false) }
50
+
51
+ def retval_for_opts(opts)
52
+ receiver = described_class.new(:some_attr, :some_model, opts)
53
+ callable = subject.bind(receiver)
54
+ callable.(model_instance)
55
+ end
56
+ end
57
+
58
+ describe "mask" do
59
+ subject { described_class.instance_method :mask }
60
+ let(:receiver) { described_class.new :some_attr, :some_model, options }
61
+ let(:model_instance) { Struct.new(:some_attr).new("value") }
62
+ let(:options) { { masker: masker } }
63
+ let(:masker) { ->(**) { "masked_value" } }
64
+
65
+ it "takes the instance.options[:masker] and calls it" do
66
+ expect(masker).to receive(:call)
67
+ subject.bind(receiver).call(model_instance)
68
+ end
69
+
70
+ it "passes the unmarshalled attribute value to the masker" do
71
+ expect(receiver).to receive(:unmarshal_data).
72
+ with("value").and_return("unmarshalled_value")
73
+ expect(masker).to receive(:call).
74
+ with(hash_including(value: "unmarshalled_value"))
75
+ subject.bind(receiver).call(model_instance)
76
+ end
77
+
78
+ it "passes the model instance to the masker" do
79
+ expect(masker).to receive(:call).
80
+ with(hash_including(model: model_instance))
81
+ subject.bind(receiver).call(model_instance)
82
+ end
83
+
84
+ it "passes the attribute name to the masker" do
85
+ expect(masker).to receive(:call).
86
+ with(hash_including(attribute_name: :some_attr))
87
+ subject.bind(receiver).call(model_instance)
88
+ end
89
+
90
+ it "passes the masking options to the masker" do
91
+ expect(masker).to receive(:call).
92
+ with(hash_including(masking_options: options))
93
+ subject.bind(receiver).call(model_instance)
94
+ end
95
+
96
+ it "marshals the masked value, and assigns it to the attribute" do
97
+ expect(receiver).to receive(:marshal_data).
98
+ with("masked_value").and_return("marshalled_masked_value")
99
+ subject.bind(receiver).call(model_instance)
100
+ expect(model_instance.some_attr).to eq("marshalled_masked_value")
101
+ end
102
+ end
103
+
104
+ describe "#masked_attributes_new_values" do
105
+ subject { receiver.method :masked_attributes_new_values }
106
+ let(:receiver) { described_class.new :some_attr, :some_model, options }
107
+ let(:options) { {} }
108
+ let(:model_instance) { double } # Struct.new(:some_attr, :other_attr) }
109
+ let(:changes) { { some_attr: [nil, "new"], other_attr: [nil, "other"] } }
110
+
111
+ before { allow(model_instance).to receive(:changes).and_return(changes) }
112
+
113
+ # rubocop:disable Style/BracesAroundHashParameters
114
+ # We are comparing hashes here, and we want hash literals
115
+ it "returns a hash of required database updates which include masked field \
116
+ change, but ignores other attribute changes" do
117
+ expect(subject.(model_instance)).to eq({ some_attr: "new" })
118
+ end
119
+
120
+ it "returns an emtpy hash for an unchanged object" do
121
+ changes.clear
122
+ expect(subject.(model_instance)).to eq({})
123
+ end
124
+
125
+ it "allows overriding column/field name to be updated with column_name \
126
+ option" do
127
+ options[:column_names] = %i[other_attr]
128
+ expect(subject.(model_instance)).to eq({ other_attr: "other" })
129
+ end
130
+
131
+ it "allows specifying more than one column/field name to be updated \
132
+ with column_name option" do
133
+ options[:column_names] = %i[some_attr other_attr]
134
+ expect(subject.(model_instance)).
135
+ to eq({ some_attr: "new", other_attr: "other" })
136
+ end
137
+ # rubocop:enable Style/BracesAroundHashParameters
138
+ end
139
+
140
+ describe "#evaluate_option" do
141
+ subject { receiver.method :evaluate_option }
142
+ let(:receiver) { described_class.new :some_attr, model_instance, options }
143
+ let(:options) { {} }
144
+ let(:model_instance) { double }
145
+ let(:retval) { subject.call(:option_name, model_instance) }
146
+
147
+ context "when that option value is a symbol" do
148
+ let(:options) { { option_name: :meth } }
149
+
150
+ before do
151
+ allow(model_instance).to receive(:meth).with(no_args).and_return(:rv)
152
+ end
153
+
154
+ it "evaluates an object's method pointed by that symbol" do
155
+ expect(retval).to be(:rv)
156
+ end
157
+ end
158
+
159
+ context "when that option_nameion value responds to #call" do
160
+ let(:options) { { option_name: callable } }
161
+ let(:callable) { double }
162
+
163
+ before do
164
+ allow(callable).to receive(:call).with(model_instance).and_return(:rv)
165
+ end
166
+
167
+ it "calls #call on it passing model instance as the only argument" do
168
+ expect(retval).to be(:rv)
169
+ end
170
+ end
171
+ end
172
+
173
+ describe "#marshal_data" do
174
+ subject { receiver.method :marshal_data }
175
+ let(:receiver) { described_class.new :some_attr, model_instance, options }
176
+ let(:options) { { marshaler: marshaller, dump_method: :dump_m } }
177
+ let(:marshaller) { double }
178
+ let(:model_instance) { double }
179
+
180
+ it "returns unmodified argument when marshal option is falsey" do
181
+ options[:marshal] = false
182
+ expect(subject.call(:data)).to be(:data)
183
+ end
184
+
185
+ it "returns unmodified argument when marshal option is falsey" do
186
+ options[:marshal] = true
187
+ expect(marshaller).to receive(:dump_m).with(:data).and_return(:retval)
188
+ expect(subject.call(:data)).to be(:retval)
189
+ end
190
+ end
191
+
192
+ describe "#unmarshal_data" do
193
+ subject { receiver.method :unmarshal_data }
194
+ let(:receiver) { described_class.new :some_attr, model_instance, options }
195
+ let(:options) { { marshaler: marshaller, load_method: :load_m } }
196
+ let(:marshaller) { double }
197
+ let(:model_instance) { double }
198
+
199
+ it "returns unmodified argument when marshal option is falsey" do
200
+ options[:marshal] = false
201
+ expect(subject.call(:data)).to be(:data)
202
+ end
203
+
204
+ it "returns unmodified argument when marshal option is falsey" do
205
+ options[:marshal] = true
206
+ expect(marshaller).to receive(:load_m).with(:data).and_return(:retval)
207
+ expect(subject.call(:data)).to be(:retval)
208
+ end
209
+ end
210
+ end
File without changes
@@ -5,8 +5,8 @@
5
5
 
6
6
  require "spec_helper"
7
7
 
8
- RSpec.describe AttrMasker::Maskers::SIMPLE do
9
- subject { described_class }
8
+ RSpec.describe AttrMasker::Maskers::Simple do
9
+ subject { described_class.new }
10
10
 
11
11
  example { expect(subject.(value: "Solo")).to eq("(redacted)") }
12
12
  example { expect(subject.(value: Math::PI)).to eq("(redacted)") }
@@ -0,0 +1,12 @@
1
+ # (c) 2017 Ribose Inc.
2
+ #
3
+
4
+ require "spec_helper"
5
+
6
+ RSpec.describe AttrMasker::Model do
7
+ it "extends every class and provides class methods" do
8
+ c = Class.new
9
+ expect(c).to respond_to(:attr_masker)
10
+ expect(c.singleton_class.included_modules).to include(described_class)
11
+ end
12
+ end
@@ -0,0 +1,30 @@
1
+ # (c) 2017 Ribose Inc.
2
+ #
3
+
4
+ require "spec_helper"
5
+
6
+ RSpec.describe "db:mask", :suppress_progressbar do
7
+ subject { Rake::Task["db:mask"] }
8
+
9
+ let(:config_file_path) do
10
+ File.expand_path("../dummy/config/attr_masker.rb", __dir__)
11
+ end
12
+
13
+ it "loads all application's models eagerly" do
14
+ expect(Rails.application).to receive(:eager_load!)
15
+ subject.execute
16
+ expect(defined? NonPersistedModel).to be_truthy
17
+ end
18
+
19
+ it "loads configuration file if it exists", :force_config_file_reload do
20
+ allow(File).to receive(:file?).and_call_original
21
+ allow(File).to receive(:file?).with(config_file_path).and_return(true)
22
+ expect { subject.execute }.to change { $CONFIG_LOADED_AT }
23
+ end
24
+
25
+ it "works without configuration file", :force_config_file_reload do
26
+ allow(File).to receive(:file?).and_call_original
27
+ allow(File).to receive(:file?).with(config_file_path).and_return(false)
28
+ expect { subject.execute }.not_to change { $CONFIG_LOADED_AT }
29
+ end
30
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attr_masker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-02 00:00:00.000000000 Z
11
+ date: 2021-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: 4.0.0
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '6.0'
22
+ version: '7'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: 4.0.0
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '6.0'
32
+ version: '7'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: ruby-progressbar
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -48,14 +48,14 @@ dependencies:
48
48
  name: bundler
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - "~>"
51
+ - - ">="
52
52
  - !ruby/object:Gem::Version
53
53
  version: '1.15'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - "~>"
58
+ - - ">="
59
59
  - !ruby/object:Gem::Version
60
60
  version: '1.15'
61
61
  - !ruby/object:Gem::Dependency
@@ -64,28 +64,70 @@ dependencies:
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: 0.7.0
67
+ version: '1.0'
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: 0.7.0
74
+ version: '1.0'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: database_cleaner
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '1.6'
81
+ version: '1.8'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.8'
89
+ - !ruby/object:Gem::Dependency
90
+ name: database_cleaner-active_record
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '1.8'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.8'
103
+ - !ruby/object:Gem::Dependency
104
+ name: database_cleaner-mongoid
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.8'
82
110
  type: :development
83
111
  prerelease: false
84
112
  version_requirements: !ruby/object:Gem::Requirement
85
113
  requirements:
86
114
  - - "~>"
87
115
  - !ruby/object:Gem::Version
88
- version: '1.6'
116
+ version: '1.8'
117
+ - !ruby/object:Gem::Dependency
118
+ name: mongoid
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '5'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '5'
89
131
  - !ruby/object:Gem::Dependency
90
132
  name: pry
91
133
  requirement: !ruby/object:Gem::Requirement
@@ -104,14 +146,14 @@ dependencies:
104
146
  name: rspec
105
147
  requirement: !ruby/object:Gem::Requirement
106
148
  requirements:
107
- - - ">="
149
+ - - "~>"
108
150
  - !ruby/object:Gem::Version
109
151
  version: '3.0'
110
152
  type: :development
111
153
  prerelease: false
112
154
  version_requirements: !ruby/object:Gem::Requirement
113
155
  requirements:
114
- - - ">="
156
+ - - "~>"
115
157
  - !ruby/object:Gem::Version
116
158
  version: '3.0'
117
159
  - !ruby/object:Gem::Dependency
@@ -120,28 +162,62 @@ dependencies:
120
162
  requirements:
121
163
  - - "~>"
122
164
  - !ruby/object:Gem::Version
123
- version: 0.49.1
165
+ version: 0.54.0
124
166
  type: :development
125
167
  prerelease: false
126
168
  version_requirements: !ruby/object:Gem::Requirement
127
169
  requirements:
128
170
  - - "~>"
129
171
  - !ruby/object:Gem::Version
130
- version: 0.49.1
172
+ version: 0.54.0
173
+ - !ruby/object:Gem::Dependency
174
+ name: simplecov
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
131
187
  - !ruby/object:Gem::Dependency
132
188
  name: sqlite3
133
189
  requirement: !ruby/object:Gem::Requirement
134
190
  requirements:
135
- - - "~>"
191
+ - - ">="
136
192
  - !ruby/object:Gem::Version
137
193
  version: 1.3.13
194
+ - - "<"
195
+ - !ruby/object:Gem::Version
196
+ version: '2'
138
197
  type: :development
139
198
  prerelease: false
140
199
  version_requirements: !ruby/object:Gem::Requirement
141
200
  requirements:
142
- - - "~>"
201
+ - - ">="
143
202
  - !ruby/object:Gem::Version
144
203
  version: 1.3.13
204
+ - - "<"
205
+ - !ruby/object:Gem::Version
206
+ version: '2'
207
+ - !ruby/object:Gem::Dependency
208
+ name: warning
209
+ requirement: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - "~>"
212
+ - !ruby/object:Gem::Version
213
+ version: '1.1'
214
+ type: :development
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - "~>"
219
+ - !ruby/object:Gem::Version
220
+ version: '1.1'
145
221
  description: It is desired to mask certain attributes of certain models by modifying
146
222
  the database.
147
223
  email:
@@ -151,49 +227,70 @@ extensions: []
151
227
  extra_rdoc_files: []
152
228
  files:
153
229
  - ".editorconfig"
230
+ - ".github/workflows/tests.yml"
154
231
  - ".gitignore"
155
232
  - ".hound.yml"
156
233
  - ".rspec"
157
234
  - ".rubocop.yml"
158
- - ".travis.yml"
235
+ - CHANGELOG.adoc
159
236
  - Gemfile
160
237
  - LICENSE
161
238
  - README.adoc
162
239
  - Rakefile
163
240
  - attr_masker.gemspec
241
+ - bin/console
242
+ - bin/rake
243
+ - bin/rspec
244
+ - bin/rubocop
245
+ - bin/setup
164
246
  - config.ru
165
- - gemfiles/Rails-4.0.gemfile
166
- - gemfiles/Rails-4.1.gemfile
167
247
  - gemfiles/Rails-4.2.gemfile
168
248
  - gemfiles/Rails-5.0.gemfile
169
249
  - gemfiles/Rails-5.1.gemfile
250
+ - gemfiles/Rails-5.2.gemfile
251
+ - gemfiles/Rails-6.0.gemfile
252
+ - gemfiles/Rails-6.1.gemfile
170
253
  - gemfiles/Rails-head.gemfile
254
+ - gemfiles/common.gemfile
171
255
  - lib/attr_masker.rb
256
+ - lib/attr_masker/attribute.rb
172
257
  - lib/attr_masker/error.rb
173
258
  - lib/attr_masker/maskers/replacing.rb
174
259
  - lib/attr_masker/maskers/simple.rb
260
+ - lib/attr_masker/model.rb
175
261
  - lib/attr_masker/performer.rb
176
262
  - lib/attr_masker/railtie.rb
177
263
  - lib/attr_masker/version.rb
178
264
  - lib/tasks/db.rake
265
+ - spec/dummy/app/models/non_persisted_model.rb
266
+ - spec/dummy/config/attr_masker.rb
179
267
  - spec/dummy/config/database.yml
268
+ - spec/dummy/config/mongoid.yml
180
269
  - spec/dummy/config/routes.rb
181
270
  - spec/dummy/db/schema.rb
182
271
  - spec/dummy/public/favicon.ico
183
- - spec/features_spec.rb
184
- - spec/maskers/replacing_spec.rb
185
- - spec/maskers/simple_spec.rb
272
+ - spec/features/active_record_spec.rb
273
+ - spec/features/mongoid_spec.rb
274
+ - spec/features/shared_examples.rb
186
275
  - spec/spec_helper.rb
187
- - spec/support/0_combustion.rb
276
+ - spec/support/00_control_constants.rb
277
+ - spec/support/10_mongoid_env.rb
278
+ - spec/support/20_combustion.rb
188
279
  - spec/support/db_cleaner.rb
280
+ - spec/support/force_config_file_reload.rb
189
281
  - spec/support/matchers.rb
190
282
  - spec/support/rake.rb
191
283
  - spec/support/silence_stdout.rb
284
+ - spec/unit/attribute_spec.rb
285
+ - spec/unit/maskers/replacing_spec.rb
286
+ - spec/unit/maskers/simple_spec.rb
287
+ - spec/unit/model_spec.rb
288
+ - spec/unit/rake_task_spec.rb
192
289
  homepage: https://github.com/riboseinc/attr_masker
193
290
  licenses:
194
291
  - MIT
195
292
  metadata: {}
196
- post_install_message:
293
+ post_install_message:
197
294
  rdoc_options: []
198
295
  require_paths:
199
296
  - lib
@@ -208,22 +305,32 @@ required_rubygems_version: !ruby/object:Gem::Requirement
208
305
  - !ruby/object:Gem::Version
209
306
  version: '0'
210
307
  requirements: []
211
- rubyforge_project:
212
- rubygems_version: 2.5.2
213
- signing_key:
308
+ rubygems_version: 3.2.3
309
+ signing_key:
214
310
  specification_version: 4
215
311
  summary: Masking attributes
216
312
  test_files:
313
+ - spec/dummy/app/models/non_persisted_model.rb
314
+ - spec/dummy/config/attr_masker.rb
217
315
  - spec/dummy/config/database.yml
316
+ - spec/dummy/config/mongoid.yml
218
317
  - spec/dummy/config/routes.rb
219
318
  - spec/dummy/db/schema.rb
220
319
  - spec/dummy/public/favicon.ico
221
- - spec/features_spec.rb
222
- - spec/maskers/replacing_spec.rb
223
- - spec/maskers/simple_spec.rb
320
+ - spec/features/active_record_spec.rb
321
+ - spec/features/mongoid_spec.rb
322
+ - spec/features/shared_examples.rb
224
323
  - spec/spec_helper.rb
225
- - spec/support/0_combustion.rb
324
+ - spec/support/00_control_constants.rb
325
+ - spec/support/10_mongoid_env.rb
326
+ - spec/support/20_combustion.rb
226
327
  - spec/support/db_cleaner.rb
328
+ - spec/support/force_config_file_reload.rb
227
329
  - spec/support/matchers.rb
228
330
  - spec/support/rake.rb
229
331
  - spec/support/silence_stdout.rb
332
+ - spec/unit/attribute_spec.rb
333
+ - spec/unit/maskers/replacing_spec.rb
334
+ - spec/unit/maskers/simple_spec.rb
335
+ - spec/unit/model_spec.rb
336
+ - spec/unit/rake_task_spec.rb