attribute-filters 1.4.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. data.tar.gz.sig +0 -0
  2. data/.yardopts +1 -0
  3. data/ChangeLog +501 -0
  4. data/Gemfile +1 -1
  5. data/Gemfile.lock +7 -7
  6. data/Manifest.txt +7 -0
  7. data/README.md +59 -30
  8. data/Rakefile +1 -0
  9. data/attribute-filters.gemspec +4 -4
  10. data/docs/COMMON-FILTERS.md +1067 -0
  11. data/docs/HISTORY +42 -0
  12. data/docs/TODO +29 -12
  13. data/docs/USAGE.md +718 -818
  14. data/lib/attribute-filters.rb +4 -2
  15. data/lib/attribute-filters/attribute_set.rb +144 -73
  16. data/lib/attribute-filters/attribute_set_annotations.rb +110 -77
  17. data/lib/attribute-filters/attribute_set_attrquery.rb +51 -8
  18. data/lib/attribute-filters/attribute_set_enum.rb +44 -38
  19. data/lib/attribute-filters/attribute_set_query.rb +62 -12
  20. data/lib/attribute-filters/backports.rb +36 -4
  21. data/lib/attribute-filters/common_filters.rb +83 -37
  22. data/lib/attribute-filters/common_filters/bare.rb +29 -0
  23. data/lib/attribute-filters/common_filters/case.rb +34 -19
  24. data/lib/attribute-filters/common_filters/convert.rb +259 -0
  25. data/lib/attribute-filters/common_filters/join.rb +37 -30
  26. data/lib/attribute-filters/common_filters/order.rb +105 -0
  27. data/lib/attribute-filters/common_filters/pick.rb +90 -0
  28. data/lib/attribute-filters/common_filters/presence.rb +70 -0
  29. data/lib/attribute-filters/common_filters/split.rb +37 -21
  30. data/lib/attribute-filters/common_filters/squeeze.rb +28 -9
  31. data/lib/attribute-filters/common_filters/strip.rb +7 -3
  32. data/lib/attribute-filters/dsl_attr_virtual.rb +2 -1
  33. data/lib/attribute-filters/dsl_filters.rb +14 -61
  34. data/lib/attribute-filters/dsl_sets.rb +238 -88
  35. data/lib/attribute-filters/helpers.rb +7 -1
  36. data/lib/attribute-filters/meta_set.rb +38 -0
  37. data/lib/attribute-filters/version.rb +1 -1
  38. data/spec/attribute-filters_spec.rb +178 -16
  39. data/spec/spec_helper.rb +9 -4
  40. metadata +129 -69
  41. metadata.gz.sig +0 -0
@@ -44,6 +44,7 @@ module ActiveModel
44
44
  end
45
45
  end
46
46
  end
47
+ filtering_method :join_attributes, :should_be_joined
47
48
 
48
49
  # This submodule contains class methods needed to describe
49
50
  # attribute joining.
@@ -52,42 +53,48 @@ module ActiveModel
52
53
  # It uses attribute set annotations to register parameters used when joining.
53
54
  #
54
55
  # @param atr_name [String,Symbol] attribute name
55
- # @param parameters [Hash] parameters hash # fixme: add YARD parameters explained
56
+ # @param parameters [Hash] parameters hash
57
+ # @option parameters :separator [String] separator passed to +join+ method call
58
+ # @option parameters :join_separator [String] separator passed to +join+ method call (alternative name)
59
+ # @option parameters :with [String] separator passed to +join+ method call (alternative name)
60
+ # @option parameters :from [String,Array<String>] names of source attributes used to join
61
+ # @option parameters :join_from [String,Array<String>] names of source attributes used to join (alternative name)
62
+ # @option parameters :source [String,Array<String>] names of source attributes used to join (alternative name)
63
+ # @option parameters :sources [String,Array<String>] names of source attributes used to join (alternative name)
64
+ # @option parameters :compact [Boolean] flag that causes sources to be compacted before joining
65
+ # @option parameters :join_compact [Boolean] flag that causes sources to be compacted before joining (alternative name)
56
66
  # @return [void]
57
- def join_attribute(atr_name, parameters = nil)
67
+ def join_attributes(atr_name, parameters = nil)
58
68
  atr_name.is_a?(Hash) and return atr_name.each_pair { |k, v| join_attribute(k, v) }
69
+ # process reversed notation
70
+ p = parameters
59
71
  if atr_name.is_a?(Array)
60
- if parameters.is_a?(Symbol) || parameters.is_a?(String)
61
- return join_attribute(parameters, atr_name)
62
- elsif parameters.is_a?(Hash)
63
- dst = parameters.delete(:into) || parameters.delete(:in) || parameters.delete(:destination)
64
- if dst.nil?
65
- raise ArgumentError, "you have to specify destination attribute using :into => 'attribute_name'"
66
- end
67
- parameters[:from] = atr_name
68
- return join_attribute(dst, parameters)
72
+ if p.is_a?(Hash)
73
+ p = p.dup
74
+ dst = [:into, :in, :destination, :join_into].find { |k| p.key?(k) }
75
+ dst.nil? and raise ArgumentError, "you must specify destination attribute using :into => 'attribute_name'"
76
+ p[:from] = atr_name
77
+ return join_attribute(p.delete(dst), p)
78
+ else
79
+ return join_attribute(p, atr_name)
69
80
  end
70
81
  end
71
- parameters = { :from => parameters } unless parameters.is_a?(Hash)
72
- the_attribute(atr_name, :should_be_joined)
73
- a = {}
74
- if parameters.key?(:with)
75
- a[:join_separator] = parameters[:with]
76
- elsif parameters.key?(:separator)
77
- a[:join_separator] = parameters[:separator]
78
- elsif parameters.key?(:join_separator)
79
- a[:join_separator] = parameters[:join_separator]
80
- end
81
- from = parameters[:from] || parameters[:source] || parameters[:sources] || parameters[:join_from]
82
- compact = parameters.key?(:compact) ? !!parameters[:compact] : !!parameters[:join_compact]
83
- a.merge!({ :join_compact => compact, :join_from => from })
84
- annotate_attributes_that(:should_be_joined, atr_name => a)
82
+ # setup attribute set
83
+ setup_attributes_that :should_be_joined, { atr_name => p },
84
+ {
85
+ :join_separator => [ :with, :separator, :join_separator ],
86
+ :join_from => [ :from, :source, :sources, :join_from ],
87
+ :join_compact => [ :compact, :join_compact ]
88
+ }, :join_from
85
89
  end
86
- alias_method :join_attributes, :join_attribute
87
- alias_method :joint_attribute, :join_attribute
88
- alias_method :joint_attributes, :join_attribute
89
- alias_method :join_attributes_to, :join_attribute
90
- alias_method :join_attributes_into, :join_attribute
90
+ alias_method :join_attribute, :join_attributes
91
+ alias_method :joint_attribute, :join_attributes
92
+ alias_method :joint_attributes, :join_attributes
93
+ alias_method :join_attributes_to, :join_attributes
94
+ alias_method :join_attributes_into, :join_attributes
95
+ alias_method :joins_attribute, :join_attributes
96
+ alias_method :joins_attributes_to, :join_attributes
97
+ alias_method :joins_attributes_into, :join_attributes
91
98
  end # module ClassMethods
92
99
  end # module Join
93
100
 
@@ -0,0 +1,105 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Author:: Paweł Wilk (mailto:pw@gnu.org)
4
+ # Copyright:: (c) 2012 by Paweł Wilk
5
+ # License:: This program is licensed under the terms of {file:LGPL-LICENSE GNU Lesser General Public License} or {file:COPYING Ruby License}.
6
+ #
7
+ # This file contains ActiveModel::AttributeFilters::Common::Order module
8
+ # containing ready-to-use filtering method.
9
+
10
+ # @abstract This namespace is shared with ActveModel.
11
+ module ActiveModel
12
+ module AttributeFilters
13
+ # This module contains common, ready-to-use filtering methods.
14
+ module Common
15
+
16
+ # This module contains attribute filters responsible for manipulating order of attribute values.
17
+ module Order
18
+ extend CommonFilter
19
+ # Inverses order of attribute contents.
20
+ #
21
+ # The attrubutes are taken from the attribute set
22
+ # called +should_be_reversed+.
23
+ #
24
+ # @note If a value of currently processed attribute is an array
25
+ # then any element of the array is changed. The same with hash (its values are changed).
26
+ #
27
+ # @return [void]
28
+ def reverse_attributes
29
+ filter_attrs_from_set(:should_be_reversed) do |atr_val, atr_name, set_obj|
30
+ if set_obj.annotation(atr_name, :reverse_enumerable)
31
+ atr_val.respond_to?(:reverse) ? atr_val.reverse : atr_val
32
+ else
33
+ AFHelpers.each_element(atr_val) do |v|
34
+ v.respond_to?(:reverse) ? v.reverse : v
35
+ end
36
+ end
37
+ end
38
+ end
39
+ filtering_method :reverse_attributes, :should_be_reversed
40
+
41
+ # This submodule contains class methods used to easily define filter.
42
+ module ClassMethods
43
+ # Registers attributes that should be filled with some values.
44
+ def reverse_attributes(*args)
45
+ setup_attributes_that :should_be_reversed, args,
46
+ :reverse_enumerable => [:enum, :enums, :whole_enums, :reverse_enums, :reverse_enumerable]
47
+ end
48
+ alias_method :reverse_attribute, :reverse_attributes
49
+ alias_method :reverses_attribute, :reverse_attributes
50
+ alias_method :reverses_attributes, :reverse_attributes
51
+ end # module ClassMethods
52
+ end # module Order
53
+
54
+ # Randomizes order of attribute contents.
55
+ #
56
+ # The attrubutes are taken from the attribute set
57
+ # called +should_be_shuffled+.
58
+ #
59
+ # @note If a value of currently processed attribute is an array
60
+ # then any element of the array is changed. The same with hash (its values are changed).
61
+ #
62
+ # @return [void]
63
+ def shuffle_attributes
64
+ filter_attrs_from_set(:should_be_shuffled) do |atr_val, atr_name, set_obj|
65
+ shuffle_enum, rng = set_obj.annotation(atr_name, :shuffle_enumerable, :shuffle_generator)
66
+ rng = { :random => rng }
67
+ if shuffle_enum
68
+ if atr_val.is_a?(String)
69
+ atr_val.mb_chars.split("").shuffle(rng).join
70
+ else
71
+ atr_val.respond_to?(:shuffle) ? atr_val.shuffle(rng) : atr_val
72
+ end
73
+ else
74
+ AFHelpers.each_element(atr_val) do |v|
75
+ if v.is_a?(String)
76
+ v.mb_chars.split("").shuffle(rng).join
77
+ else
78
+ v.respond_to?(:shuffle) ? v.shuffle(rng) : v
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ filtering_method :shuffle_attributes, :should_be_shuffled
85
+
86
+ # This submodule contains class methods used to easily define filter.
87
+ module ClassMethods
88
+ # Registers attributes that should be shuffled.
89
+ def shuffle_attributes(*args)
90
+ setup_attributes_that :should_be_shuffled, args,
91
+ {
92
+ :shuffle_enumerable => [:enum, :enums, :whole_enums, :shuffle_enums, :shuffle_enumerable],
93
+ :shuffle_generator => [:random_generator, :generator, :rnd, :rng, :shuffle_generator]
94
+ }, :shuffle_generator
95
+ end
96
+ alias_method :shuffle_attribute, :shuffle_attributes
97
+ alias_method :shuffles_attribute, :shuffle_attributes
98
+ alias_method :shuffles_attributes, :shuffle_attributes
99
+ end # module ClassMethods
100
+
101
+ include Order
102
+
103
+ end # module Common
104
+ end # module AttributeFilters
105
+ end # module ActiveModel
@@ -0,0 +1,90 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Author:: Paweł Wilk (mailto:pw@gnu.org)
4
+ # Copyright:: (c) 2012 by Paweł Wilk
5
+ # License:: This program is licensed under the terms of {file:LGPL-LICENSE GNU Lesser General Public License} or {file:COPYING Ruby License}.
6
+ #
7
+ # This file contains ActiveModel::AttributeFilters::Common::Pick module
8
+ # containing ready-to-use filtering method.
9
+
10
+ # @abstract This namespace is shared with ActveModel.
11
+ module ActiveModel
12
+ module AttributeFilters
13
+ # This module contains common, ready-to-use filtering methods.
14
+ module Common
15
+ # Picks attributes from leading and trailing spaces.
16
+ module Pick
17
+ extend CommonFilter
18
+
19
+ def pick_attributes_core(val, from, to, range, step)
20
+ from ||= 0
21
+ to ||= val.size - 1
22
+ step ||= 1
23
+ range ||= from..to
24
+ range.step(step).map { |n| val[n] }
25
+ end
26
+ private :pick_attributes_core
27
+
28
+ # Picks attributes from leading and trailing spaces.
29
+ #
30
+ # The attrubutes to be picked are taken from the attribute set called
31
+ # +should_be_picked+. It operates directly on attribute's contents.
32
+ #
33
+ # @note If a value of currently processed attribute is an array
34
+ # then any element of the array is changed. The same with hash (its values are changed).
35
+ #
36
+ # @return [void]
37
+ def pick_attributes
38
+ filter_attrs_from_set(:should_be_picked) do |atr_val, atr_name, set_obj|
39
+ pick_enum, step, from, to, range, sep, jnt = set_obj.annotation(atr_name, :pick_enumerable, :pick_step,
40
+ :pick_from, :pick_to, :pick_range,
41
+ :pick_separator, :pick_join)
42
+ if pick_enum
43
+ if atr_val.is_a?(String)
44
+ sep ||= ""
45
+ jnt ||= sep.is_a?(String) ? sep : nil
46
+ pick_attributes_core(atr_val.mb_chars.split(sep), from, to, range, step).join(jnt)
47
+ elsif atr_val.is_a?(Array)
48
+ pick_attributes_core(atr_val, from, to, range, step)
49
+ elsif atr_val.is_a?(Hash)
50
+ Hash[pick_attributes_core(atr_val.to_a, from, to, range, step)]
51
+ else
52
+ atr_val
53
+ end
54
+ else
55
+ sep ||= ""
56
+ jnt ||= sep.is_a?(String) ? sep : nil
57
+ AFHelpers.each_element(atr_val, String) do |v|
58
+ pick_attributes_core(v.mb_chars.split(sep), from, to, range, step).join(jnt)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ filtering_method :pick_attributes, :should_be_picked
64
+
65
+ # This submodule contains class methods used to easily define filter.
66
+ module ClassMethods
67
+ # Registers attributes that should be picked.
68
+ def pick_attributes(*args)
69
+ setup_attributes_that :should_be_picked, args,
70
+ {
71
+ :pick_enumerable => [:enum, :enums, :whole_enums, :shuffle_enums, :pick_enumerable],
72
+ :pick_step => [:step, :with_step, :each, :pick_step],
73
+ :pick_from => [:from, :head, :take, :first, :pick_first, :pick_head, :pick_from],
74
+ :pick_to => [:to, :tail, :last, :pick_last, :pick_tail, :pick_to],
75
+ :pick_range => [:range, :pick_range],
76
+ :pick_separator => [:separator, :regex, :split_with, :split_separator, :pick_separator],
77
+ :pick_join => [:joiner, :join, :join_with, :pick_join]
78
+ }, :pick_separator
79
+ end
80
+ alias_method :pick_attribute, :pick_attributes
81
+ alias_method :picks_attribute, :pick_attributes
82
+ alias_method :picks_attributes, :pick_attributes
83
+ end # module ClassMethods
84
+ end # module Pick
85
+
86
+ include Pick
87
+
88
+ end # module Common
89
+ end # module AttributeFilters
90
+ end # module ActiveModel
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Author:: Paweł Wilk (mailto:pw@gnu.org)
4
+ # Copyright:: (c) 2012 by Paweł Wilk
5
+ # License:: This program is licensed under the terms of {file:LGPL-LICENSE GNU Lesser General Public License} or {file:COPYING Ruby License}.
6
+ #
7
+ # This file contains ActiveModel::AttributeFilters::Common::Presence module
8
+ # containing ready-to-use filtering method.
9
+
10
+ # @abstract This namespace is shared with ActveModel.
11
+ module ActiveModel
12
+ module AttributeFilters
13
+ # This module contains common, ready-to-use filtering methods.
14
+ module Common
15
+
16
+ # This module contains attribute filters responsible for manipulating presence of attribute values.
17
+ module Presence
18
+ extend CommonFilter
19
+ # Presences-up attributes that are blank with +nil+ or the given values.
20
+ #
21
+ # The attrubutes are taken from the attribute set
22
+ # called +should_be_filled+.
23
+ #
24
+ # @note If a value of currently processed attribute is an array
25
+ # then any element of the array is changed. The same with hash (its values are changed).
26
+ #
27
+ # @return [void]
28
+ def fill_attributes
29
+ filter_attrs_from_set(:should_be_filled, :process_blank) do |atr_val, atr_name, set_obj|
30
+ if set_obj.annotation(atr_name, :fill_enumerable)
31
+ if atr_val.blank? || set_obj.annotation(atr_name, :fill_any)
32
+ set_obj.annotation(atr_name, :fill_value)
33
+ else
34
+ atr_val
35
+ end
36
+ else
37
+ AFHelpers.each_element(atr_val) do |v|
38
+ if v.blank? || set_obj.annotation(atr_name, :fill_any)
39
+ set_obj.annotation(atr_name, :fill_value)
40
+ else
41
+ v
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ filtering_method :fill_attributes, :should_be_filled
48
+
49
+ # This submodule contains class methods used to easily define filter.
50
+ module ClassMethods
51
+ # Registers attributes that should be filled with some values.
52
+ def fill_attributes(*args)
53
+ setup_attributes_that :should_be_filled, args,
54
+ {
55
+ :fill_value => [:with, :fill_with, :fill, :value, :content, :default, :fill_value],
56
+ :fill_any => [:all, :any, :fill_always, :always_fill, :always, :fill_present, :fill_all, :fill_any],
57
+ :fill_enumerable => [:replace_enumerable, :replace_enums, :enums, :whole_enums, :fill_enums, :fill_enumerable]
58
+ }, :fill_value
59
+ end
60
+ alias_method :fill_attribute, :fill_attributes
61
+ alias_method :fills_attribute, :fill_attributes
62
+ alias_method :fills_attributes, :fill_attributes
63
+ end # module ClassMethods
64
+ end # module Presence
65
+
66
+ include Presence
67
+
68
+ end # module Common
69
+ end # module AttributeFilters
70
+ end # module ActiveModel
@@ -29,11 +29,11 @@ module ActiveModel
29
29
  pattern, limit, flatten, into = set_obj.annotation(atr_name, :split_pattern, :split_limit,
30
30
  :split_flatten, :split_into)
31
31
  if limit.nil?
32
- r = AttributeFiltersHelpers.each_element(atr_val, String) do |v|
32
+ r = AFHelpers.each_element(atr_val, String) do |v|
33
33
  v.mb_chars.split(pattern)
34
34
  end
35
35
  else
36
- r = AttributeFiltersHelpers.each_element(atr_val, String) do |v|
36
+ r = AFHelpers.each_element(atr_val, String) do |v|
37
37
  v.mb_chars.split(pattern, limit)
38
38
  end
39
39
  end
@@ -48,6 +48,7 @@ module ActiveModel
48
48
  end
49
49
  end
50
50
  end
51
+ filtering_method :split_attributes, :should_be_splitted
51
52
 
52
53
  # This submodule contains class methods needed to describe
53
54
  # attribute splitting.
@@ -97,29 +98,44 @@ module ActiveModel
97
98
  # end
98
99
  #
99
100
  # @param atr_name [String,Symbol] attribute name
100
- # @param parameters [Hash] parameters hash # fixme: add YARD parameters explained
101
- # @return [void]
102
- def split_attribute(atr_name, parameters = nil)
103
- atr_name.is_a?(Hash) and return atr_name.each_pair { |k, v| split_attribute(k, v) }
104
- parameters = { :into => parameters } unless parameters.is_a?(Hash)
105
- the_attribute(atr_name, :should_be_splitted)
106
- pattern = parameters[:with] || parameters[:pattern] || parameters[:split_pattern]
107
- into = parameters[:into] || parameters[:to] || parameters[:split_into]
108
- limit = parameters[:limit] || parameters[:split_limit]
109
- limit = limit.to_i unless limit.blank?
110
- flatten = parameters[:flatten] || parameters[:split_flatten]
101
+ # @param parameters [Hash] parameters hash
102
+ # @option parameters :pattern [String] pattern passed to +split+ method call
103
+ # @option parameters :split_pattern [String] pattern passed to +split+ method call (alternative name)
104
+ # @option parameters :with [String] pattern passed to +split+ method call (alternative name)
105
+ # @option parameters :limit [Fixnum] limit parameter passed to +split+ method call
106
+ # @option parameters :split_limit [Fixnum] limit parameter passed to +split+ method call (alternative name)
107
+ # @option parameters :into [String,Symbol,Array<String,Symbol>] names of attributes that results should be written to
108
+ # @option parameters :to [String,Symbol,Array<String,Symbol>] names of attributes that results should be written to (alternative name)
109
+ # @option parameters :split_into [String,Symbol,Array<String,Symbol>] names of attributes that results should be written to (alternative name)
110
+ # @option parameters :destination [String,Symbol,Array<String,Symbol>] names of attributes that results should be written to (alternative name)
111
+ # @option parameters :flatten [Boolean] flag that causes the resulting, intermediate array to be flattened
112
+ # @option parameters :split_flatten [Boolean] flag that causes the resulting, intermediate array to be flattened (alternative name)
113
+ # @return [nil]
114
+ def split_attributes(atr_name, parameters = nil)
115
+ if atr_name.is_a?(Hash)
116
+ atr_name.each_pair { |k, v| split_attribute(k, v) }
117
+ return nil
118
+ end
119
+ setup_attributes_that :should_be_splitted, { atr_name => parameters },
120
+ {
121
+ :split_pattern => [ :with, :pattern, :split_pattern ],
122
+ :split_into => [ :into, :to, :destination, :split_into ],
123
+ :split_limit => [ :limit, :split_limit ],
124
+ :split_flatten => [ :flatten, :split_flatten ]
125
+ }, :split_into
126
+ # write some defaults
127
+ limit, into = attribute_set(:should_be_splitted).get_annotations(atr_name, :split_limit, :split_into)
128
+ annotate_attribute_set(:should_be_splitted, atr_name, :split_limit, limit.to_i) unless limit.blank?
111
129
  if into.blank?
112
- into = nil
130
+ annotate_attribute_set(:should_be_splitted, atr_name,:split_into, nil)
113
131
  elsif !into.is_a?(Array)
114
- into = into.respond_to?(:to_a) ? into.to_a : [ into ]
132
+ annotate_attributes_that(:should_be_splitted, :split_into, into.respond_to?(:to_a) ? into.to_a : [ into ])
115
133
  end
116
- annotate_attributes_that(:should_be_splitted, atr_name => {
117
- :split_flatten => flatten,
118
- :split_pattern => pattern,
119
- :split_limit => limit,
120
- :split_into => into})
134
+ nil
121
135
  end
122
- alias_method :split_attributes, :split_attribute
136
+ alias_method :split_attribute, :split_attributes
137
+ alias_method :splits_attribute, :split_attributes
138
+ alias_method :splits_attributes, :split_attributes
123
139
  end # module ClassMethods
124
140
  end # module Split
125
141
 
@@ -22,23 +22,38 @@ module ActiveModel
22
22
  # used with multibyte strings (containing diacritics).
23
23
  #
24
24
  # @note If a value of currently processed attribute is an array
25
- # then any element of the array is changed.
25
+ # then any element of the array is changed. The same with hash (its values are changed).
26
26
  #
27
27
  # @return [void]
28
28
  def squeeze_attributes
29
- filter_attrs_from_set(:should_be_squeezed) do |atr|
30
- AttributeFiltersHelpers.each_element(atr, String) do |v|
31
- v.mb_chars.squeeze.to_s
29
+ filter_attrs_from_set(:should_be_squeezed) do |atr_val, atr_name, set_obj|
30
+ other_str = set_obj.annotation(atr_name, :squeeze_other_str)
31
+ if other_str.nil?
32
+ AFHelpers.each_element(atr_val, String) do |v|
33
+ v.mb_chars.squeeze.to_s
34
+ end
35
+ else
36
+ AFHelpers.each_element(atr_val, String) do |v|
37
+ v.mb_chars.squeeze(other_str).to_s
38
+ end
32
39
  end
33
40
  end
34
41
  end
42
+ filtering_method :squeeze_attributes, :should_be_squeezed
43
+
35
44
  # This submodule contains class methods used to easily define filter.
36
45
  module ClassMethods
37
46
  # Registers attributes that should be squeezed.
38
47
  def squeeze_attributes(*args)
39
- attributes_that(:should_be_squeezed, args)
48
+ setup_attributes_that :should_be_squeezed, args,
49
+ {
50
+ :squeeze_other_str => [:squeeze_other_str, :other_str, :string, :with_string,
51
+ :with_characters, :with_character, :characters]
52
+ }, :squeeze_other_str
40
53
  end
41
- alias_method :squeeze_attribute, :squeeze_attributes
54
+ alias_method :squeeze_attribute, :squeeze_attributes
55
+ alias_method :squeezes_attribute, :squeeze_attributes
56
+ alias_method :squeezes_attributes, :squeeze_attributes
42
57
  end # module ClassMethods
43
58
 
44
59
  # Squeezes white characters in attributes, removes leading and trailing spaces and newlines.
@@ -48,23 +63,27 @@ module ActiveModel
48
63
  # used with multibyte strings (containing diacritics).
49
64
  #
50
65
  # @note If a value of currently processed attribute is an array
51
- # then any element of the array is changed.
66
+ # then any element of the array is changed. The same with hash (its values are changed).
52
67
  #
53
68
  # @return [void]
54
69
  def squish_attributes
55
70
  filter_attrs_from_set(:should_be_squished) do |atr|
56
- AttributeFiltersHelpers.each_element(atr, String) do |v|
71
+ AFHelpers.each_element(atr, String) do |v|
57
72
  v.mb_chars.squish.to_s
58
73
  end
59
74
  end
60
75
  end
76
+ filtering_method :squish_attributes, :should_be_squished
77
+
61
78
  # This submodule contains class methods used to easily define filter.
62
79
  module ClassMethods
63
80
  # Registers attributes that should be squished.
64
81
  def squish_attributes(*args)
65
82
  attributes_that(:should_be_squished, args)
66
83
  end
67
- alias_method :squish_attribute, :squish_attributes
84
+ alias_method :squish_attribute, :squish_attributes
85
+ alias_method :squishes_attribute, :squish_attributes
86
+ alias_method :squishes_attributes, :squish_attributes
68
87
  end # module ClassMethods
69
88
  end # module Squeeze
70
89