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.10.1"
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



86
87
88
89
90
91
92
93
94
95
96
# File 'lib/strip_attributes.rb', line 86

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



33
34
35
36
37
38
39
# File 'lib/strip_attributes.rb', line 33

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



41
42
43
44
45
46
47
48
49
50
51
# File 'lib/strip_attributes.rb', line 41

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



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/strip_attributes.rb', line 53

def self.strip_string(value, options = {})
  return value unless value.is_a?(String)
  # TODO: FUTURE CHANGE: return value if value.frozen?

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

  value = value.dup
  value.gsub!(regex, "") if regex

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

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

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

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

.validate_options(options) ⇒ Object



98
99
100
101
102
103
104
# File 'lib/strip_attributes.rb', line 98

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