Sha256: c43e9f0caf20968d808aee672267b4b24a486382133409ce0e6a87c7035f5b61

Contents?: true

Size: 1.61 KB

Versions: 1

Compression:

Stored size: 1.61 KB

Contents

# (c) 2017 Ribose Inc.
#
module AttrMasker
  module Performer
    class ActiveRecord
      def mask
        unless defined? ::ActiveRecord
          raise AttrMasker::Error, "ActiveRecord undefined. Nothing to do!"
        end

        # Do not want production environment to be masked!
        #
        if Rails.env.production?
          raise AttrMasker::Error, "Attempted to run in production environment."
        end

        all_models.each do |klass|
          next if klass.masker_attributes.empty?
          mask_class(klass)
        end
      end

      private

      def mask_class(klass)
        progressbar_for_model(klass) do |bar|
          klass.all.each do |model|
            mask_object model
            bar.increment
          end
        end
      end

      # For each masker attribute, mask it, and save it!
      #
      def mask_object(instance)
        klass = instance.class

        updates = klass.masker_attributes.reduce({}) do |acc, masker_attr|
          attr_name = masker_attr[0]
          column_name = masker_attr[1][:column_name] || attr_name
          masker_value = instance.mask(attr_name)
          acc.merge!(column_name => masker_value)
        end

        klass.all.update(instance.id, updates)
      end

      def progressbar_for_model(klass)
        bar = ProgressBar.create(
          title: klass.name,
          total: klass.count,
          throttle_rate: 0.1,
          format: %q[%t %c/%C (%j%%) %B %E],
        )

        yield bar
      ensure
        bar.finish
      end

      def all_models
        ::ActiveRecord::Base.descendants.select(&:table_exists?)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
attr_masker-0.1.0 lib/attr_masker/performer.rb