Sha256: fbd6f5c4963546da0d55c9ff8e8680600a5d08c5526293bedaa697d91267cce4

Contents?: true

Size: 937 Bytes

Versions: 1

Compression:

Stored size: 937 Bytes

Contents

# frozen_string_literal: true
require 'credit_card_validations'

module SensitiveDataFilter
  module Types
    module CreditCard
      SEPARATORS = /[\s-]/
      SEPRS      = SEPARATORS.source + '*'
      LENGTHS    = (11..19)
      CARD       = Regexp.new(
        LENGTHS.map { |length| /(?=((?<!\d)(?:\d#{SEPRS}){#{length - 1}}\d(?!\d))?)/.source }.join
      )
      FILTERED = '[FILTERED]'

      module_function def valid?(number)
        return false unless number.is_a? String
        CreditCardValidations::Detector.new(number.gsub(SEPARATORS, '')).brand.present?
      end

      module_function def scan(value)
        return [] unless value.is_a? String
        value.scan(CARD).flatten.compact.select { |card| valid?(card) }
      end

      module_function def mask(value)
        return value unless value.is_a? String
        scan(value).inject(value) { |acc, elem| acc.gsub(elem, FILTERED) }
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sensitive_data_filter-0.2.3 lib/sensitive_data_filter/types/credit_card.rb