Module: StripAttributes

Defined in:
lib/strip_attributes/version.rb,
lib/strip_attributes/matchers.rb,
lib/strip_attributes/shoulda/macros.rb,
lib/strip_attributes.rb

Defined Under Namespace

Modules: Matchers, Shoulda

Constant Summary collapse

VERSION =
"1.9.2"
VALID_OPTIONS =
[:only, :except, :allow_empty, :collapse_spaces, :replace_newlines, :regex, :if, :unless].freeze
MULTIBYTE_WHITE =

Unicode invisible and whitespace characters. The POSIX character class

:space:

corresponds to the Unicode class Z (“separator”). We also

include the following characters from Unicode class C (“control”), which are spaces or invisible characters that make no sense at the start or end of a string:

U+180E MONGOLIAN VOWEL SEPARATOR
U+200B ZERO WIDTH SPACE
U+200C ZERO WIDTH NON-JOINER
U+200D ZERO WIDTH JOINER
U+2060 WORD JOINER
U+FEFF ZERO WIDTH NO-BREAK SPACE
"\u180E\u200B\u200C\u200D\u2060\uFEFF".freeze
MULTIBYTE_SPACE =
/[[:space:]#{MULTIBYTE_WHITE}]/.freeze
MULTIBYTE_BLANK =
/[[:blank:]#{MULTIBYTE_WHITE}]/.freeze
MULTIBYTE_SUPPORTED =
"\u0020" == " "

Class Method Summary collapse

Class Method Details

.narrow(attributes, options = {}) ⇒ Object

Necessary because Rails has removed the narrowing of attributes using :only and :except on Base#attributes



93
94
95
96
97
98
99
100
101
102
103
# File 'lib/strip_attributes.rb', line 93

def self.narrow(attributes, options = {})
  if except = options[:except]
    except = Array(except).collect { |attribute| attribute.to_s }
    attributes.except(*except)
  elsif only = options[:only]
    only = Array(only).collect { |attribute| attribute.to_s }
    attributes.slice(*only)
  else
    attributes
  end
end

.strip(record_or_string, options = {}) ⇒ Object



40
41
42
43
44
45
46
# File 'lib/strip_attributes.rb', line 40

def self.strip(record_or_string, options = {})
  if record_or_string.respond_to?(:attributes)
    strip_record(record_or_string, options)
  else
    strip_string(record_or_string, options)
  end
end

.strip_record(record, options = {}) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
# File 'lib/strip_attributes.rb', line 48

def self.strip_record(record, options = {})
  attributes = narrow(record.attributes, options)

  attributes.each do |attr, value|
    original_value = value
    value = strip_string(value, options)
    record[attr] = value if original_value != value
  end

  record
end

.strip_string(value, options = {}) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/strip_attributes.rb', line 60

def self.strip_string(value, options = {})
  return value unless value.is_a?(String)

  allow_empty      = options[:allow_empty]
  collapse_spaces  = options[:collapse_spaces]
  replace_newlines = options[:replace_newlines]
  regex            = options[:regex]

  value = value.strip if value.respond_to?(:strip)

  value.gsub!(regex, "") if regex && value.respond_to?(:gsub!)

  if MULTIBYTE_SUPPORTED && value.respond_to?(:gsub!) && Encoding.compatible?(value, MULTIBYTE_SPACE)
    value.gsub!(/\A#{MULTIBYTE_SPACE}+|#{MULTIBYTE_SPACE}+\z/, "")
  elsif value.respond_to?(:strip!)
    value.strip!
  end

  value.gsub!(/[\r\n]+/, " ") if replace_newlines && value.respond_to?(:gsub!)

  if collapse_spaces
    if MULTIBYTE_SUPPORTED && value.respond_to?(:gsub!) && Encoding.compatible?(value, MULTIBYTE_BLANK)
      value.gsub!(/#{MULTIBYTE_BLANK}+/, " ")
    elsif value.respond_to?(:squeeze!)
      value.squeeze!(" ")
    end
  end

  (value.blank? && !allow_empty) ? nil : value
end

.validate_options(options) ⇒ Object



105
106
107
108
109
110
111
# File 'lib/strip_attributes.rb', line 105

def self.validate_options(options)
  if keys = options.keys
    unless (keys - VALID_OPTIONS).empty?
      raise ArgumentError, "Options does not specify #{VALID_OPTIONS} (#{options.keys.inspect})"
    end
  end
end