attribute-filters 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/.yardopts CHANGED
@@ -3,6 +3,8 @@
3
3
  --readme README.md
4
4
  --no-private
5
5
  --hide-void-return
6
+ -p docs/yard-tpl
7
+ -t default
6
8
  -
7
9
  docs/USAGE
8
10
  docs/HISTORY
data/ChangeLog CHANGED
@@ -1,3 +1,72 @@
1
+ commit 60ca933e0a03f70ea9f04684ebab8b888388e9a3
2
+ Author: Paweł Wilk <siefca@gnu.org>
3
+ Date: Tue Jul 10 11:35:52 2012 +0200
4
+
5
+ ChangeLog updated
6
+
7
+ commit 19e31e31f6f9039eec91cdb97133112cd597d429
8
+ Author: Paweł Wilk <siefca@gnu.org>
9
+ Date: Tue Jul 10 11:27:31 2012 +0200
10
+
11
+ Bugfix release 1.0.3
12
+
13
+ commit 6b5aaf23fe3cb6926dac83f733544af16d3b726b
14
+ Author: Paweł Wilk <siefca@gnu.org>
15
+ Date: Fri Jun 29 02:13:21 2012 +0200
16
+
17
+ Updated release-related files
18
+
19
+ commit c4fe9eb630f342f2b5ffd4d6ff72948e0e77a864
20
+ Author: Paweł Wilk <siefca@gnu.org>
21
+ Date: Fri Jun 29 02:10:56 2012 +0200
22
+
23
+ Attributes filtering code optimization
24
+
25
+ - Removed unneeded caching that might cause troubles;
26
+ - Removed calls to accessible_attributes;
27
+ - Added a flag to iterate over/filter all attributes from set;
28
+ - Added a flag controlling attributes presence checking;
29
+ - Moved main logic to the method operate_on_attrs_from_set;
30
+ - Renamed the method call_attrs_from_set to for_each_attr_from_set;
31
+ - Module is now more DRY and clean;
32
+ - Inline documentation updated.
33
+
34
+ commit 11e85ab7d0f0028c2569b0c1f46e6296559e0bda
35
+ Author: Paweł Wilk <siefca@gnu.org>
36
+ Date: Fri Jun 29 02:04:10 2012 +0200
37
+
38
+ Module AttributeFilters moved totally to ActiveModel namespace
39
+
40
+ commit 8ddf4312278fa6538ce746b210be504e817bc265
41
+ Author: Paweł Wilk <siefca@gnu.org>
42
+ Date: Fri Jun 29 02:03:00 2012 +0200
43
+
44
+ README updated
45
+
46
+ commit fd5ece4acf16b0beb068f69f0f874019a8383879
47
+ Author: Paweł Wilk <siefca@gnu.org>
48
+ Date: Fri Jun 29 02:02:49 2012 +0200
49
+
50
+ Added custom.css and custom YARD template
51
+
52
+ commit d60d50b868f9b4a0eb91960ba4e5fa9a573da7b1
53
+ Author: Paweł Wilk <siefca@gnu.org>
54
+ Date: Thu Jun 28 15:09:32 2012 +0200
55
+
56
+ README updated
57
+
58
+ commit c3353208b5787ce20b80daa129a6cbd6eafcafbc
59
+ Author: Paweł Wilk <siefca@gnu.org>
60
+ Date: Thu Jun 28 15:03:54 2012 +0200
61
+
62
+ README updated
63
+
64
+ commit 1db1ff90bc56e6798d1bd6e80e43345fcded9c26
65
+ Author: Paweł Wilk <siefca@gnu.org>
66
+ Date: Thu Jun 28 14:47:13 2012 +0200
67
+
68
+ README updated
69
+
1
70
  commit fc3cd20ea98315736374780179bf49637646aa34
2
71
  Author: Paweł Wilk <siefca@gnu.org>
3
72
  Date: Thu Jun 28 14:29:29 2012 +0200
data/Manifest.txt CHANGED
@@ -15,6 +15,7 @@ docs/LGPL-LICENSE
15
15
  docs/TODO
16
16
  docs/USAGE
17
17
  docs/rdoc.css
18
+ docs/yard-tpl/default/fulldoc/html/css/common.css
18
19
  init.rb
19
20
  lib/attribute-filters.rb
20
21
  lib/attribute-filters/attribute_set.rb
data/README.md CHANGED
@@ -20,10 +20,18 @@ model attributes in a concise and clean way.
20
20
  When?
21
21
  -----
22
22
 
23
- If your Rails application often filters the attributes that has changed
24
- recently and uses callbacks to achieve that, then you may consider
25
- refining that process and write methods for handling common operations
26
- not certain attributes. See what I mean below.
23
+ You may want to try it when your Rails application often modifies
24
+ attribute values that changed recently and uses callbacks to do that.
25
+
26
+ When the number of attributes that are altered in such a way increases
27
+ then you can observe that the same thing happends with your filtering
28
+ methods. That's because each one is tied to some attribute.
29
+
30
+ To refine that process you may write more generic methods
31
+ for altering attributes. They should be designed to handle
32
+ common operations and not tied to certain attributes.
33
+
34
+ Enough words, let's see that approach in action.
27
35
 
28
36
  ### Before ###
29
37
 
@@ -57,7 +65,8 @@ class User < ActiveRecord::Base
57
65
  end
58
66
  ```
59
67
 
60
- (The more attributes there is the more messy it becomes and the filtering code is not reusable.)
68
+ The more attributes there is the more messy it becomes.
69
+ The filtering code is not reusable since it operates on specific attributes.
61
70
 
62
71
  ### After ###
63
72
 
@@ -92,8 +101,10 @@ class User < ActiveRecord::Base
92
101
  end
93
102
  ```
94
103
 
95
- (Names of new attributes that have to be altered in the same way can just be added to sets
96
- and you can use the same altering methods across all models if you wish to.)
104
+ Attributes that have to be altered in a common ways simply may be added to sets
105
+ and then filtered with more generic methods. You can share these methods
106
+ across all your models if you wish to by putting them into some base class
107
+ or (better) by including your own handy module to your models.
97
108
 
98
109
  Usage
99
110
  -----
@@ -132,12 +143,14 @@ quite often; e.g. ActiveRecord and other popular ORM-s use it. (I'm calling it
132
143
  That's why you can make use of attribute filters without explicitly including
133
144
  the module, as long as your application relies on any popular ORM.
134
145
 
135
- If something will go wrong however or your application is somehow unusual, you can always
146
+ However, if something would go wrong or your application is somehow unusual, you can always
136
147
  include the AttributeFilters module manually in any of your models:
137
148
 
138
- class ExampleModel
139
- include ActiveModel::AttributeFilters
140
- end
149
+ ```
150
+ class ExampleModel
151
+ include ActiveModel::AttributeFilters
152
+ end
153
+ ```
141
154
 
142
155
  Requirements
143
156
  ------------
data/Rakefile CHANGED
@@ -29,13 +29,13 @@ Hoe.plugin :yard
29
29
  Hoe.plugin :gemspec
30
30
 
31
31
  Hoe.spec 'attribute-filters' do
32
- developer AttributeFilters::DEVELOPER, AttributeFilters::EMAIL
32
+ developer ActiveModel::AttributeFilters::DEVELOPER, ActiveModel::AttributeFilters::EMAIL
33
33
 
34
- self.version = AttributeFilters::VERSION
35
- self.rubyforge_name = AttributeFilters::NAME
36
- self.summary = AttributeFilters::SUMMARY
37
- self.description = AttributeFilters::DESCRIPTION
38
- self.url = AttributeFilters::URL
34
+ self.version = ActiveModel::AttributeFilters::VERSION
35
+ self.rubyforge_name = ActiveModel::AttributeFilters::NAME
36
+ self.summary = ActiveModel::AttributeFilters::SUMMARY
37
+ self.description = ActiveModel::AttributeFilters::DESCRIPTION
38
+ self.url = ActiveModel::AttributeFilters::URL
39
39
 
40
40
  self.remote_rdoc_dir = ''
41
41
  self.rsync_args << '--chmod=a+rX'
@@ -76,12 +76,13 @@ end
76
76
 
77
77
  desc "Create signed tag in Git"
78
78
  task :tag do
79
- sh %{git tag -s v#{AttributeFilters::VERSION} -m 'version #{AttributeFilters::VERSION}'}
79
+ sh %{git tag -s v#{ActiveModel::AttributeFilters::VERSION} -m 'version #{ActiveModel::AttributeFilters::VERSION}'}
80
80
  end
81
81
 
82
82
  desc "Create external GnuPG signature for Gem"
83
83
  task :gemsign do
84
- sh %{gpg -u #{AttributeFilters::EMAIL} -ab pkg/#{AttributeFilters::NAME}-#{AttributeFilters::VERSION}.gem \
85
- -o pkg/#{AttributeFilters::NAME}-#{AttributeFilters::VERSION}.gem.sig}
84
+ sh %{gpg -u #{ActiveModel::AttributeFilters::EMAIL} \
85
+ -ab pkg/#{ActiveModel::AttributeFilters::NAME}-#{ActiveModel::AttributeFilters::VERSION}.gem \
86
+ -o pkg/#{ActiveModel::AttributeFilters::NAME}-#{ActiveModel::AttributeFilters::VERSION}.gem.sig}
86
87
  end
87
88
 
@@ -2,16 +2,16 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "attribute-filters"
5
- s.version = "1.0.2.20120628142850"
5
+ s.version = "1.0.3.20120710112322"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Pawe\u{142} Wilk"]
9
9
  s.cert_chain = ["/Users/siefca/.gem/gem-public_cert.pem"]
10
- s.date = "2012-06-28"
10
+ s.date = "2012-07-10"
11
11
  s.description = "Concise way of filtering model attributes in Rails."
12
12
  s.email = ["pw@gnu.org"]
13
13
  s.extra_rdoc_files = ["Manifest.txt"]
14
- s.files = [".rspec", ".yardopts", "ChangeLog", "Gemfile", "Gemfile.lock", "LGPL-LICENSE", "Manifest.txt", "README.md", "Rakefile", "attribute-filters.gemspec", "docs/COPYING", "docs/HISTORY", "docs/LEGAL", "docs/LGPL-LICENSE", "docs/TODO", "docs/USAGE", "docs/rdoc.css", "init.rb", "lib/attribute-filters.rb", "lib/attribute-filters/attribute_set.rb", "lib/attribute-filters/attribute_set_query.rb", "lib/attribute-filters/common_filters.rb", "lib/attribute-filters/dsl_filters.rb", "lib/attribute-filters/dsl_sets.rb", "lib/attribute-filters/railtie.rb", "lib/attribute-filters/version.rb", "spec/attribute-filters_spec.rb", "spec/spec_helper.rb", ".gemtest"]
14
+ s.files = [".rspec", ".yardopts", "ChangeLog", "Gemfile", "Gemfile.lock", "LGPL-LICENSE", "Manifest.txt", "README.md", "Rakefile", "attribute-filters.gemspec", "docs/COPYING", "docs/HISTORY", "docs/LEGAL", "docs/LGPL-LICENSE", "docs/TODO", "docs/USAGE", "docs/rdoc.css", "docs/yard-tpl/default/fulldoc/html/css/common.css", "init.rb", "lib/attribute-filters.rb", "lib/attribute-filters/attribute_set.rb", "lib/attribute-filters/attribute_set_query.rb", "lib/attribute-filters/common_filters.rb", "lib/attribute-filters/dsl_filters.rb", "lib/attribute-filters/dsl_sets.rb", "lib/attribute-filters/railtie.rb", "lib/attribute-filters/version.rb", "spec/attribute-filters_spec.rb", "spec/spec_helper.rb", ".gemtest"]
15
15
  s.homepage = "https://rubygems.org/gems/attribute-filters/"
16
16
  s.rdoc_options = ["--title", "Attribute::Filters Documentation", "--quiet"]
17
17
  s.require_paths = ["lib"]
data/docs/HISTORY CHANGED
@@ -1,3 +1,9 @@
1
+ === 1.0.3 / 2012-07-10
2
+
3
+ * major bugfixes
4
+
5
+ * fixed a typo in AttrQuery proxy class that caused errors during processing
6
+
1
7
  === 0.0.1 / 2012-06-27
2
8
 
3
9
  * 1 major enhancement
data/docs/TODO CHANGED
@@ -1,6 +1,7 @@
1
1
 
2
+ * test for method changed_attributes
2
3
 
3
- * test for methods changed_attributes and ... and if not then include ActiveModel...
4
+ * replace flags by some simple hash given as the second, optional argument
4
5
 
5
6
  * add some predefined, often used filters/sets
6
7
 
data/docs/rdoc.css CHANGED
@@ -18,3 +18,4 @@
18
18
  #documentation .method-description > p + ul {
19
19
  margin-left: 1.8em;
20
20
  }
21
+
@@ -0,0 +1,5 @@
1
+
2
+ .signature .aliases, h3.signature .aliases {
3
+ margin-top: 2ex;
4
+ }
5
+
@@ -66,7 +66,7 @@ module ActiveModel
66
66
  @attribute_set.method(method_sym).call(*args, &block)
67
67
  end
68
68
  else
69
- method_sym, args, block = @next_method
69
+ m, args, block = @next_method
70
70
  @next_method = nil
71
71
  @attribute_set.method(m).call { |a| @am_object[a].method(method_sym).call(*args, &block) }
72
72
  end
@@ -8,71 +8,85 @@
8
8
 
9
9
  module ActiveModel
10
10
  module AttributeFilters
11
+ # @private
12
+ PROCESSING_FLAGS = {
13
+ :process_blank => false,
14
+ :process_all => false,
15
+ :no_presence_check => false
16
+ }.freeze
17
+
11
18
  # Gets names of attributes for which filters should be applied by
12
- # selecting attributes that 1. have changed and 2. their names belong to
13
- # the given set of attributes.
19
+ # selecting attributes that are meeting certain criteria and belong
20
+ # to the given attribute set.
14
21
  #
15
- # @param process_unchanged [Boolean] if set to +true+ then all accessible attributes will
16
- # be tested (which are also present in set o course), not just the changed ones
17
- # @param set_name [AttributeSet] set of attributes used to select attributes
18
- # @return [Hash{Symbol => Object}] list of attributes (attribute name => previous_value)
19
- def attributes_to_filter(set_name, process_unchanged = false)
20
- @__attr_op_apply ||= Array.new
21
- if process_unchanged
22
- @__attr_op_apply[0] ||= Hash.new
23
- @__attr_op_apply[0][set_name] || begin
24
- buf = @__attr_op_apply[0][set_name] = Hash.new
25
- (attribute_set(set_name) & self.class.accessible_attributes.to_a).each do |a|
26
- buf[a] = nil
27
- end
28
- buf
29
- end
22
+ # @param set_name [AttributeSet] set of attributes used to get attributes
23
+ # @param alter_mode [Boolean] if set then the existence
24
+ # of attribute is checked by testing if writer is defined; otherwise the reader is checked
25
+ # @param process_all [Boolean] if set then all the attributes from the attribute set are selected,
26
+ # not just attributes that has changed
27
+ # @param no_presence_check [Boolean] if set then the checking whether attribute exists will be
28
+ # disabled (matters only when +process_all+ is also set (see also +alter_mode+)
29
+ # @return [AttributeSet] set of attributes (attribute name => previous_value)
30
+ def attributes_to_filter(set_name, alter_mode = true, process_all = false, no_presence_check = false)
31
+ if process_all
32
+ atf = attribute_set(set_name)
33
+ needs_write = alter_mode ? "=" : ""
34
+ no_presence_check ? atf : atf.select{ |atr| respond_to?("#{atr}#{needs_write}") }
30
35
  else
31
- @__attr_op_apply[1] ||= Hash.new
32
- @__attr_op_apply[1][set_name] ||= changed_attributes.select do |a,pv|
33
- attribute_set(set_name).include?(a)
34
- end
36
+ attribute_set(set_name) & changed_attributes.keys
35
37
  end
36
38
  end
37
39
 
38
- # This generic method applies a result of execution of the passed block
39
- # to each of all changed attributes that are present in the given
40
- # set of attributes. It is useful in creating filtering methods.
41
- # The result of a block is used to set a new value for each processed attribute.
42
- #
43
- # @param set_name [Symbol] name of the attributes set
44
- # @param args [Array] optional additional arguments that will be passed to the block
45
- # @yield [attribute_value, previous_value, set_name, attribute_name, *args] block that will be called for each attribute
46
- # @yieldparam attribute_value [Object] current attribute value that should be altered
47
- # @yieldparam previous_value [Object] the value of an attribute before change was made by ORM
48
- # @yieldparam set_name [Symbol] a name of the processed attribute set
49
- # @yieldparam attribute_name [Object] a name of currently processed attribute
50
- # @yieldparam args [Array] optional arguments passed to the method
51
- # @yieldreturn [Object] the result of calling the block
52
- # @return [void]
53
- #
54
- # @example
55
- # class User < ActiveRecord::Base
56
- #
57
- # attributes_that :should_be_downcased => [ :username, :email ]
58
- # before_filter :downcase_names
59
- #
60
- # def downcase_names
61
- # filter_attributes_that :should_be_downcased do |atr|
62
- # atr.mb_chars.downcase.to_s
40
+ # @overload filter_attrs_from_set(set_name, *flags, *args, &block)
41
+ #
42
+ # @note Combining the flags +process_all+ and +no_presence_check+ may raise
43
+ # exception if some attribute from the given set doesn't exist
44
+ #
45
+ # This generic method writes the result of execution of the passed block
46
+ # to each attribute that belongs to the given set of attributes.
47
+ # It's major purpose is to create filtering methods.
48
+ #
49
+ # Only the
50
+ # {http://rubydoc.info/gems/activemodel/ActiveModel/Dirty#changed_attributes-instance_method changed attributes}
51
+ # are selected, unless the +process_all+ flag is
52
+ # given. If that flag is given then presence of each attribute is verified,
53
+ # unless the +no_presence_check+ flag is also set. The presence is tested
54
+ # by checking whether the setter method exists; if it doesn't then the attribute
55
+ # is excluded from processing. Attributes with empty or unset values are ignored
56
+ # too (but see the flag called +process_blank+).
57
+ #
58
+ # The result of the given block is used to set a new values for processed attributes.
59
+ #
60
+ # @param set_name [Symbol] name of the attribute set
61
+ # @param args [Array] optional additional arguments that will be passed to the block
62
+ # @param flags [Array<Symbol>] optional additional flags controlling the processing of attributes:
63
+ # * +:process_blank+ tells to also process attributes that are blank (empty or +nil+)
64
+ # * +:process_all+ - tells to process all attributes, not just the ones that has changed
65
+ # * +:no_presence_check+ – tells not to check for existence of each processed attribute when processing
66
+ # all attributes; increases performance but you must care about putting into set only the existing attributes
67
+ # @yield [attribute_value, set_name, attribute_name, *args] block that will be called for each attribute
68
+ # @yieldparam attribute_value [Object] current attribute value that should be altered
69
+ # @yieldparam set_name [Symbol] a name of the processed attribute set
70
+ # @yieldparam attribute_name [Object] a name of currently processed attribute
71
+ # @yieldparam args [Array] optional arguments passed to the method
72
+ # @yieldreturn [Object] the result of calling the block
73
+ # @return [void]
74
+ #
75
+ # @example
76
+ # class User < ActiveRecord::Base
77
+ #
78
+ # attributes_that should_be_downcased: [ :username, :email ]
79
+ # before_filter :downcase_names
80
+ #
81
+ # def downcase_names
82
+ # filter_attributes_that :should_be_downcased do |atr|
83
+ # atr.mb_chars.downcase.to_s
84
+ # end
63
85
  # end
86
+ #
64
87
  # end
65
- #
66
- # end
67
88
  def filter_attrs_from_set(set_name, *args, &block)
68
- flags = attr_filter_process_flags(args)
69
- pb = flags[:process_blank]
70
- pu = flags[:process_unchanged]
71
- attributes_to_filter(set_name, pu).each do |a, pv|
72
- v = self[a]
73
- pv = v if pu
74
- self[a] = yield(v, pv, set_name, a, *args) if (pb || v.present?)
75
- end
89
+ operate_on_attrs_from_set(set_name, true, *args, &block)
76
90
  end
77
91
  alias_method :attribute_filter_for_set, :filter_attrs_from_set
78
92
  alias_method :filter_attributes_which, :filter_attrs_from_set
@@ -84,62 +98,106 @@ module ActiveModel
84
98
  alias_method :alter_attributes_that_are, :filter_attrs_from_set
85
99
  alias_method :alter_attributes_which_are, :filter_attrs_from_set
86
100
 
87
- # This generic method calls the passed block
88
- # on each of all changed attributes that are present in the given
89
- # set of attributes. It is useful in creating filtering methods.
90
- # The result of a block is ignored, so the only effective way of
91
- # altering attribute values is calling altering method on attributes
92
- # (usually with bang methods).
101
+ # @overload for_each_attr_from_set(set_name, *flags, *args, &block)
102
+ #
103
+ # @note If you're looking for a method that is designed to alter attributes
104
+ # by rewritting their contents see {#filter_attrs_from_set}
93
105
  #
94
- # @param set_name [Symbol] name of the attributes set
95
- # @param args [Array] optional additional arguments that will be passed to the block
96
- # @yield [attribute_value, previous_value, set_name, attribute_name, *args] block that will be called for each attribute
97
- # @yieldparam attribute_value [Object] current attribute value that should be altered
98
- # @yieldparam previous_value [Object] the value of an attribute before change was made by ORM
99
- # @yieldparam set_name [Symbol] a name of the processed attribute set
100
- # @yieldparam attribute_name [Object] a name of currently processed attribute
101
- # @yieldparam args [Array] optional arguments passed to the method
102
- # @yieldreturn [void]
103
- # @return [void]
106
+ # @note Combining the flags +process_all+ and +no_presence_check+ may raise
107
+ # exception if some attribute from the given set doesn't exist
104
108
  #
105
- # @example
106
- # class User < ActiveRecord::Base
109
+ # This generic method calls the passed block for each attribute
110
+ # that belongs to the given set of attributes.
111
+ # It's major purpose is to iterate through attributes and/or work directly with their values.
112
+ #
113
+ # Only the
114
+ # {http://rubydoc.info/gems/activemodel/ActiveModel/Dirty#changed_attributes-instance_method changed attributes}
115
+ # are selected, unless the +process_all+ flag is
116
+ # given. If that flag is given then presence of each attribute is verified,
117
+ # unless the +no_presence_check+ flag is also set. The presence is tested
118
+ # by checking whether the method of the same name as the attribute exists (the getter);
119
+ # if it doesn't then the attribute is excluded from processing. Attributes with
120
+ # empty or unset values are ignored too (but see the flag called +process_blank+).
121
+ #
122
+ # The result of the given block is not used to set the processed attribute.
123
+ # The only way to alter attribute values using this method is to use bang
124
+ # method in a block or explicitly assign new, calculated value to the attribute
125
+ # using its name (also passed to a block as one of arguments).
107
126
  #
108
- # attributes_that :should_be_stripped => [ :username, :email ]
109
- # before_filter :strip_names
127
+ # @param set_name [Symbol] name of the attribute set
128
+ # @param args [Array] optional additional arguments that will be passed to a block
129
+ # @param flags [Array<Symbol>] optional additional flags controlling the processing of attributes:
130
+ # * +:process_blank+ – tells to also process attributes that are blank (empty or +nil+)
131
+ # * +:process_all+ - tells to process all attributes, not just the ones that has changed
132
+ # * +:no_presence_check+ – tells not to check for existence of each processed attribute when processing
133
+ # all attributes; increases performance but you must care about putting into set only the existing attributes
134
+ # @yield [attribute_value, set_name, attribute_name, *args] block that will be called for each attribute
135
+ # @yieldparam attribute_value [Object] current attribute value that should be altered
136
+ # @yieldparam set_name [Symbol] a name of the processed attribute set
137
+ # @yieldparam attribute_name [Object] a name of currently processed attribute
138
+ # @yieldparam args [Array] optional arguments passed to the method
139
+ # @yieldreturn [Object] the result of calling the block
140
+ # @return [void]
141
+ #
142
+ # @example
143
+ # class User < ActiveRecord::Base
110
144
  #
111
- # def strip_names
112
- # for_attributes_that :should_be_stripped do |atr|
113
- # atr.strip!
145
+ # attributes_that should_be_stripped: [ :username, :email ]
146
+ # before_filter :strip_names
147
+ #
148
+ # def strip_names
149
+ # for_attributes_that :should_be_stripped do |atr|
150
+ # atr.strip!
151
+ # end
114
152
  # end
153
+ #
115
154
  # end
116
- #
117
- # end
118
- def call_attrs_from_set(set_name, *args, &block)
119
- flags = attr_filter_process_flags(args)
120
- pb = flags[:process_blank]
121
- pu = flags[:process_unchanged]
122
- attributes_to_filter(set_name, pu).each do |a, pv|
123
- v = self[a]
124
- pv = v if pu
125
- yield(v, pv, set_name, a, *args) if (pb || v.present?)
126
- end
155
+ def for_each_attr_from_set(set_name, *args, &block)
156
+ operate_on_attrs_from_set(set_name, false, *args, &block)
127
157
  end
128
- alias_method :attribute_call_for_set, :call_attrs_from_set
129
- alias_method :for_attributes_which, :call_attrs_from_set
130
- alias_method :for_attributes_that, :call_attrs_from_set
131
- alias_method :for_attributes_that_are, :call_attrs_from_set
132
- alias_method :for_attributes_which_are, :call_attrs_from_set
158
+ alias_method :attribute_call_for_set, :for_each_attr_from_set
159
+ alias_method :call_attrs_from_set, :for_each_attr_from_set
160
+ alias_method :for_attributes_which, :for_each_attr_from_set
161
+ alias_method :for_attributes_that, :for_each_attr_from_set
162
+ alias_method :for_attributes_that_are, :for_each_attr_from_set
163
+ alias_method :for_attributes_which_are, :for_each_attr_from_set
133
164
 
134
165
  private
135
166
 
136
167
  def attr_filter_process_flags(args)
137
- flags = { :process_blank => false, :process_unchanged => false }
168
+ flags = ActiveModel::AttributeFilters::PROCESSING_FLAGS.dup
138
169
  while flags.key?(a=args[0]) do
139
170
  flags[a] = !!args.shift
140
171
  end
141
172
  flags
142
173
  end
143
174
 
144
- end
145
- end
175
+ def operate_on_attrs_from_set(set_name, alter_mode, *args, &block)
176
+ flags = attr_filter_process_flags(args)
177
+ process_all = flags[:process_all]
178
+ process_blank = flags[:process_blank]
179
+ no_presence_check = flags[:no_presence_check]
180
+ attrs_to_process = attributes_to_filter(set_name, alter_mode, process_all, no_presence_check)
181
+ if alter_mode
182
+ if process_blank
183
+ attrs_to_process.each { |atr| self[atr] = yield(self[atr], set_name, atr, *args) }
184
+ else
185
+ attrs_to_process.each do |atr|
186
+ v = self[atr]
187
+ self[atr] = yield(v, set_name, atr, *args) if v.present?
188
+ end
189
+ end
190
+ else
191
+ if process_blank
192
+ attrs_to_process.each { |atr| yield(self[atr], set_name, atr, *args) }
193
+ else
194
+ attrs_to_process.each do |atr|
195
+ v = self[atr]
196
+ yield(v, set_name, atr, *args) if v.present?
197
+ end
198
+ end
199
+ end
200
+ end
201
+
202
+ end # module AttributeFilters
203
+ end # module ActiveModel
@@ -8,39 +8,42 @@
8
8
 
9
9
  require 'attribute-filters'
10
10
 
11
- module AttributeFilters
12
- require 'rails'
11
+ module ActiveModel
12
+ module AttributeFilters
13
+ require 'rails'
14
+
15
+ # This class is a glue that allows us to integrate with Rails.
16
+ class Railtie < ::Rails::Railtie
17
+ # Alters ActiveModel::AttributeMethods.inluded method so
18
+ # when that module is included the ActiveModel::AttributeFilters
19
+ # module is also included.
20
+ def self.insert
21
+ require 'active_model'
22
+ if defined?(ActiveModel::AttributeMethods)
13
23
 
14
- # This class is a glue that allows us to integrate with Rails.
15
- class Railtie < ::Rails::Railtie
16
- # Alters ActiveModel::AttributeMethods.inluded method so
17
- # when that module is included the ActiveModel::AttributeFilters
18
- # module is also included.
19
- def self.insert
20
- require 'active_model'
21
- if defined?(ActiveModel::AttributeMethods)
22
-
23
- ActiveModel::AttributeMethods.class_eval do
24
-
25
- def self.included_with_attribute_methods(base)
26
- base.class_eval do
27
- include ActiveModel::AttributeFilters
28
- if method_defined?(:included_without_attribute_methods)
29
- included_without_attribute_methods(base)
24
+ ActiveModel::AttributeMethods.class_eval do
25
+
26
+ def self.included_with_attribute_methods(base)
27
+ base.class_eval do
28
+ include ActiveModel::AttributeFilters
29
+ if method_defined?(:included_without_attribute_methods)
30
+ included_without_attribute_methods(base)
31
+ end
30
32
  end
31
33
  end
32
- end
33
- if singleton_class.method_defined?(:included)
34
- singleton_class.send(:alias_method_chain, :included, :attribute_methods)
35
- end
36
-
37
- end # ActiveModel::AttributeMethods.class_eval
38
-
39
- end # if defined?(ActiveModel::AttributeMethods)
40
- end # def self.insert
41
- end # class Railtie
34
+ if singleton_class.method_defined?(:included)
35
+ singleton_class.send(:alias_method_chain, :included, :attribute_methods)
36
+ end
37
+
38
+ end # ActiveModel::AttributeMethods.class_eval
39
+
40
+ end # if defined?(ActiveModel::AttributeMethods)
41
+ end # def self.insert
42
+ end # class Railtie
43
+
44
+ class Railtie
45
+ AttributeFilters::Railtie.insert
46
+ end # class Railtie
47
+ end # module AttributeFilters
48
+ end # module ActiveModel
42
49
 
43
- class Railtie
44
- AttributeFilters::Railtie.insert
45
- end # class Railtie
46
- end # module AttributeFilters
@@ -6,19 +6,21 @@
6
6
  #
7
7
  # This file contains version information.
8
8
 
9
- module AttributeFilters
10
- # @private
11
- DEVELOPER = 'Paweł Wilk'
12
- # @private
13
- EMAIL = 'pw@gnu.org'
14
- # @private
15
- VERSION = '1.0.2'
16
- # @private
17
- NAME = 'attribute-filters'
18
- # @private
19
- SUMMARY = 'Concise way of filtering model attributes in Rails'
20
- # @private
21
- URL = 'https://rubygems.org/gems/attribute-filters/'
22
- # @private
23
- DESCRIPTION = 'Concise way of filtering model attributes in Rails.'
9
+ module ActiveModel
10
+ module AttributeFilters
11
+ # @private
12
+ DEVELOPER = 'Paweł Wilk'
13
+ # @private
14
+ EMAIL = 'pw@gnu.org'
15
+ # @private
16
+ VERSION = '1.0.3'
17
+ # @private
18
+ NAME = 'attribute-filters'
19
+ # @private
20
+ SUMMARY = 'Concise way of filtering model attributes in Rails'
21
+ # @private
22
+ URL = 'https://rubygems.org/gems/attribute-filters/'
23
+ # @private
24
+ DESCRIPTION = 'Concise way of filtering model attributes in Rails.'
25
+ end
24
26
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attribute-filters
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -48,11 +48,11 @@ cert_chain:
48
48
  -----END CERTIFICATE-----
49
49
 
50
50
  '
51
- date: 2012-06-28 00:00:00.000000000 Z
51
+ date: 2012-07-10 00:00:00.000000000 Z
52
52
  dependencies:
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: railties
55
- requirement: &2157562220 !ruby/object:Gem::Requirement
55
+ requirement: &2157667380 !ruby/object:Gem::Requirement
56
56
  none: false
57
57
  requirements:
58
58
  - - ~>
@@ -60,10 +60,10 @@ dependencies:
60
60
  version: '3.0'
61
61
  type: :runtime
62
62
  prerelease: false
63
- version_requirements: *2157562220
63
+ version_requirements: *2157667380
64
64
  - !ruby/object:Gem::Dependency
65
65
  name: activemodel
66
- requirement: &2157561760 !ruby/object:Gem::Requirement
66
+ requirement: &2157666920 !ruby/object:Gem::Requirement
67
67
  none: false
68
68
  requirements:
69
69
  - - ~>
@@ -71,10 +71,10 @@ dependencies:
71
71
  version: '3.0'
72
72
  type: :runtime
73
73
  prerelease: false
74
- version_requirements: *2157561760
74
+ version_requirements: *2157666920
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: hoe-yard
77
- requirement: &2157561300 !ruby/object:Gem::Requirement
77
+ requirement: &2157666480 !ruby/object:Gem::Requirement
78
78
  none: false
79
79
  requirements:
80
80
  - - ! '>='
@@ -82,10 +82,10 @@ dependencies:
82
82
  version: 0.1.2
83
83
  type: :development
84
84
  prerelease: false
85
- version_requirements: *2157561300
85
+ version_requirements: *2157666480
86
86
  - !ruby/object:Gem::Dependency
87
87
  name: rspec
88
- requirement: &2157560820 !ruby/object:Gem::Requirement
88
+ requirement: &2157666000 !ruby/object:Gem::Requirement
89
89
  none: false
90
90
  requirements:
91
91
  - - ! '>='
@@ -93,10 +93,10 @@ dependencies:
93
93
  version: 2.6.0
94
94
  type: :development
95
95
  prerelease: false
96
- version_requirements: *2157560820
96
+ version_requirements: *2157666000
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: yard
99
- requirement: &2157560280 !ruby/object:Gem::Requirement
99
+ requirement: &2157665520 !ruby/object:Gem::Requirement
100
100
  none: false
101
101
  requirements:
102
102
  - - ! '>='
@@ -104,10 +104,10 @@ dependencies:
104
104
  version: 0.7.2
105
105
  type: :development
106
106
  prerelease: false
107
- version_requirements: *2157560280
107
+ version_requirements: *2157665520
108
108
  - !ruby/object:Gem::Dependency
109
109
  name: rdoc
110
- requirement: &2157559820 !ruby/object:Gem::Requirement
110
+ requirement: &2157665080 !ruby/object:Gem::Requirement
111
111
  none: false
112
112
  requirements:
113
113
  - - ! '>='
@@ -115,10 +115,10 @@ dependencies:
115
115
  version: 3.8.0
116
116
  type: :development
117
117
  prerelease: false
118
- version_requirements: *2157559820
118
+ version_requirements: *2157665080
119
119
  - !ruby/object:Gem::Dependency
120
120
  name: redcarpet
121
- requirement: &2157559380 !ruby/object:Gem::Requirement
121
+ requirement: &2157664640 !ruby/object:Gem::Requirement
122
122
  none: false
123
123
  requirements:
124
124
  - - ! '>='
@@ -126,10 +126,10 @@ dependencies:
126
126
  version: 2.1.0
127
127
  type: :development
128
128
  prerelease: false
129
- version_requirements: *2157559380
129
+ version_requirements: *2157664640
130
130
  - !ruby/object:Gem::Dependency
131
131
  name: bundler
132
- requirement: &2157558880 !ruby/object:Gem::Requirement
132
+ requirement: &2157664200 !ruby/object:Gem::Requirement
133
133
  none: false
134
134
  requirements:
135
135
  - - ! '>='
@@ -137,10 +137,10 @@ dependencies:
137
137
  version: 1.0.10
138
138
  type: :development
139
139
  prerelease: false
140
- version_requirements: *2157558880
140
+ version_requirements: *2157664200
141
141
  - !ruby/object:Gem::Dependency
142
142
  name: hoe-bundler
143
- requirement: &2157558440 !ruby/object:Gem::Requirement
143
+ requirement: &2157663760 !ruby/object:Gem::Requirement
144
144
  none: false
145
145
  requirements:
146
146
  - - ! '>='
@@ -148,10 +148,10 @@ dependencies:
148
148
  version: 1.1.0
149
149
  type: :development
150
150
  prerelease: false
151
- version_requirements: *2157558440
151
+ version_requirements: *2157663760
152
152
  - !ruby/object:Gem::Dependency
153
153
  name: hoe-gemspec
154
- requirement: &2157574360 !ruby/object:Gem::Requirement
154
+ requirement: &2157663320 !ruby/object:Gem::Requirement
155
155
  none: false
156
156
  requirements:
157
157
  - - ! '>='
@@ -159,10 +159,10 @@ dependencies:
159
159
  version: 1.0.0
160
160
  type: :development
161
161
  prerelease: false
162
- version_requirements: *2157574360
162
+ version_requirements: *2157663320
163
163
  - !ruby/object:Gem::Dependency
164
164
  name: hoe
165
- requirement: &2157573920 !ruby/object:Gem::Requirement
165
+ requirement: &2157662880 !ruby/object:Gem::Requirement
166
166
  none: false
167
167
  requirements:
168
168
  - - ~>
@@ -170,7 +170,7 @@ dependencies:
170
170
  version: '2.16'
171
171
  type: :development
172
172
  prerelease: false
173
- version_requirements: *2157573920
173
+ version_requirements: *2157662880
174
174
  description: Concise way of filtering model attributes in Rails.
175
175
  email:
176
176
  - pw@gnu.org
@@ -196,6 +196,7 @@ files:
196
196
  - docs/TODO
197
197
  - docs/USAGE
198
198
  - docs/rdoc.css
199
+ - docs/yard-tpl/default/fulldoc/html/css/common.css
199
200
  - init.rb
200
201
  - lib/attribute-filters.rb
201
202
  - lib/attribute-filters/attribute_set.rb
@@ -225,7 +226,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
225
226
  version: '0'
226
227
  segments:
227
228
  - 0
228
- hash: -1969500921463447156
229
+ hash: 1024401863572671819
229
230
  required_rubygems_version: !ruby/object:Gem::Requirement
230
231
  none: false
231
232
  requirements:
metadata.gz.sig CHANGED
Binary file