Class: DatabaseAnonymizer::Metamorphosis
- Inherits:
-
Object
- Object
- DatabaseAnonymizer::Metamorphosis
- Defined in:
- lib/database_anonymizer/metamorphosis.rb
Constant Summary collapse
- DEFAULT_ASTERISK_LENGTH =
8
Instance Attribute Summary collapse
-
#model ⇒ Object
readonly
Returns the value of attribute model.
Class Method Summary collapse
- .anonymize ⇒ Object
- .anonymize_log(model_name, column) ⇒ Object
- .asteriskize ⇒ Object
- .execute ⇒ Object
- .prepare_for_rake ⇒ Object
- .table_existing_active_record_inheritors ⇒ Object
- .targets ⇒ Object
- .whitelist ⇒ Object
- .whitelist_path ⇒ Object
Instance Method Summary collapse
- #asterisk_length(column_length_validator) ⇒ Object
- #general_asteriskize ⇒ Object
-
#initialize(model) ⇒ Metamorphosis
constructor
A new instance of Metamorphosis.
- #length_validator(column_name) ⇒ Object
- #mysql_asteriskize ⇒ Object
- #mysql_update_query(column_name) ⇒ Object
- #string_or_text_column_names ⇒ Object
- #unwhitelist_column_names ⇒ Object
Constructor Details
#initialize(model) ⇒ Metamorphosis
Returns a new instance of Metamorphosis.
60 61 62 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 60 def initialize(model) @model = model end |
Instance Attribute Details
#model ⇒ Object (readonly)
Returns the value of attribute model.
5 6 7 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 5 def model @model end |
Class Method Details
.anonymize ⇒ Object
44 45 46 47 48 49 50 51 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 44 def self.anonymize fail DangerousRailsEnvError if Rails.env == 'production' whitelist.keys.each do |model_name| whitelist[model_name].each do |column, details| anonymize_log(model_name, column) { eval(details[:anonymized_by]) } end end end |
.anonymize_log(model_name, column) ⇒ Object
53 54 55 56 57 58 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 53 def self.anonymize_log(model_name, column) ActiveRecord::Migration.say_with_time "anonymize for #{model_name}##{column} start..." do yield puts "-- anonymize for #{model_name}##{column} completed!" end end |
.asteriskize ⇒ Object
35 36 37 38 39 40 41 42 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 35 def self.asteriskize case ActiveRecord::Base.configurations[Rails.env]['adapter'] when 'mysql2' targets.each(&:mysql_asteriskize) else targets.each(&:general_asteriskize) end end |
.execute ⇒ Object
30 31 32 33 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 30 def self.execute asteriskize anonymize end |
.prepare_for_rake ⇒ Object
7 8 9 10 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 7 def self.prepare_for_rake Rails.application.eager_load! ActiveRecord::Base.clear_cache! end |
.table_existing_active_record_inheritors ⇒ Object
20 21 22 23 24 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 20 def self.table_existing_active_record_inheritors ActiveRecord::Base.descendants.reject do |d| !d.superclass.eql?(ActiveRecord::Base) || d.eql?(ActiveRecord::SchemaMigration) || !d.table_exists? end end |
.targets ⇒ Object
26 27 28 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 26 def self.targets table_existing_active_record_inheritors.map { |model| new(model) } end |
.whitelist ⇒ Object
16 17 18 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 16 def self.whitelist YAML.load_file(whitelist_path).respond_to?(:deep_symbolize_keys) ? YAML.load_file(whitelist_path).deep_symbolize_keys : {} end |
.whitelist_path ⇒ Object
12 13 14 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 12 def self.whitelist_path File.join(Rails.root, 'config', 'database_anonymizer', 'whitelist.yml') end |
Instance Method Details
#asterisk_length(column_length_validator) ⇒ Object
76 77 78 79 80 81 82 83 84 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 76 def asterisk_length(column_length_validator) length = DEFAULT_ASTERISK_LENGTH return length unless column_length_validator length = column_length_validator.[:minimum] if column_length_validator.[:minimum] if column_length_validator.[:maximum] && length > column_length_validator.[:maximum] length = column_length_validator.[:maximum] end length end |
#general_asteriskize ⇒ Object
98 99 100 101 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 98 def general_asteriskize fail DangerousRailsEnvError if Rails.env == 'production' model.unscoped.find_each { |instance| instance.update!(asteriskize_params(instance)) } end |
#length_validator(column_name) ⇒ Object
72 73 74 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 72 def length_validator(column_name) model.validators_on(column_name).find { |validator| validator.class.eql?(ActiveModel::Validations::LengthValidator) } end |
#mysql_asteriskize ⇒ Object
91 92 93 94 95 96 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 91 def mysql_asteriskize fail DangerousRailsEnvError if Rails.env == 'production' unwhitelist_column_names.each do |column_name| ActiveRecord::Base.connection.execute(mysql_update_query(column_name)) end end |
#mysql_update_query(column_name) ⇒ Object
86 87 88 89 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 86 def mysql_update_query(column_name) # NOTE: If a column name is same as MySQL reserved words, backquote is needed. "UPDATE #{model.table_name} SET `#{column_name}`='#{'*' * asterisk_length(length_validator(column_name))}' WHERE `#{column_name}` LIKE '%_%'" end |
#string_or_text_column_names ⇒ Object
64 65 66 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 64 def string_or_text_column_names model.columns.select { |column| [:string, :text].include?(column.type) }.map { |c| c.name.to_sym } end |
#unwhitelist_column_names ⇒ Object
68 69 70 |
# File 'lib/database_anonymizer/metamorphosis.rb', line 68 def unwhitelist_column_names string_or_text_column_names.select { |column_name| self.class.whitelist[model.to_s.to_sym].try!(:[], column_name).nil? } end |