README.md in data_cleansing-0.6.0 vs README.md in data_cleansing-0.6.1
- old
+ new
@@ -20,25 +20,25 @@
or pull request.
## Features
* Supports global cleansing definitions that can be associated with any Ruby,
- Rails, Mongoid, or other model.
-* Supports custom cleansing definitions that can be defined in-line using block.
-* A cleansing block can access the other attributes in the model in determining
- how to cleanse the current attribute
-* In a cleansing block other can also be modified if necessary
+ Rails, Mongoid, or other model
+* Supports custom cleansing definitions that can be defined in-line
+* A cleansing block can access the other attributes in the model while cleansing
+ the current attribute
+* In a cleansing block other attributes in the model can be modified at the
+ same time
* Cleansers are executed in the order they are defined. As a result multiple
cleansers can be run against the same field and the order is preserved
* Multiple cleansers can be specified for a list of attributes at the same time
* Inheritance is supported. The cleansers for parent classes are run before
the child's cleansers
* Cleansers can be called outside of a model instance for cases where fields
need to be cleansed before the model is created, or needs to be found
-* Logging of data cleansing with the before and after values for troubleshooting.
- Depending on the log level all modified fields are logged, or just the ones
- completely wiped out to nil
+* To aid troubleshooting the before and after values of cleansed attributes
+ is logged. The level of detail is fine-tuned using the log level
## ActiveRecord (ActiveModel) Features
* Passes the value of the attribute before the Rails type cast so that the
original text can be cleansed before passing back to rails for type conversion.
@@ -65,15 +65,15 @@
u = User.new
u.first_name = ' joe '
u.last_name = "\n black\n"
puts "Before data cleansing #{u.inspect}"
-# Before data cleansing Before data cleansing #<User:0x007fc9f1081980 @first_name=" joe ", @last_name="\n black\n">
+# Before data cleansing #<User:0x007fc9f1081980 @first_name=" joe ", @last_name="\n black\n">
u.cleanse_attributes!
puts "After data cleansing #{u.inspect}"
-# After data cleansing After data cleansing #<User:0x007fc9f1081980 @first_name="joe", @last_name="black">
+# After data cleansing #<User:0x007fc9f1081980 @first_name="joe", @last_name="black">
```
### Rails Example
```ruby
@@ -152,10 +152,68 @@
u.cleanse_attributes!
puts "After data cleansing #{u.inspect}"
# After data cleansing #<User:0x007fdd5a83a8f8 @first_name="joe", @last_name="black", @address1="2632 Brown St", @title="MR.", @gender="Male">
```
+## After Cleansing
+
+It is sometimes useful to read or write multiple fields as part of a cleansing, or
+where attributes need to be manipulated automatically once they have been cleansed.
+For this purpose instance methods on the model can be registered for invocation once
+all the attributes have been cleansed according to their :cleanse specifications.
+Multiple methods can be registered and they are called in the order they are registered.
+
+```ruby
+after_cleanse <instance_method_name>, <instance_method_name>, ...
+```
+
+Example:
+```ruby
+# Define a global cleanser
+DataCleansing.register_cleaner(:strip) {|string| string.strip}
+
+# 'users' table has the following columns :first_name, :last_name, :address1, :address2
+class User < ActiveRecord::Base
+ include DataCleansing::Cleanse
+
+ # Use a global cleaner
+ cleanse :first_name, :last_name, :cleaner => :strip
+
+ # Define a once off cleaner
+ cleanse :address1, :address2, :cleaner => Proc.new {|string| string.strip}
+
+ # Once the above cleansing is complete call the instance method
+ after_cleanse :check_address
+
+ protected
+
+ # Method to be called once data cleansing is complete
+ def check_address
+ # Move address2 to address1 if Address1 is blank and address2 has a value
+ address2 = address1 if address1.blank? && !address2.blank?
+ end
+
+end
+
+# Create a User instance
+u = User.new(:first_name => ' joe ', :last_name => "\n black\n", :address2 => "2632 Brown St \n")
+puts "Before data cleansing #{u.attributes.inspect}"
+u.cleanse_attributes!
+puts "After data cleansing #{u.attributes.inspect}"
+u.save!
+```
+
+## Recommendations
+
+:data_cleanse block are ideal for cleansing a single attribute, and applying any
+global or common cleansing algorithms.
+
+Even though multiple attributes can be read or written in a single :data_cleanse
+block, it is recommended to use the :after_cleanse method for working with multiple
+attributes. It is much easier to read and understand the interactions between multiple
+attributes in the :after_cleanse methods.
+
## Rails configuration
When DataCleansing is used in a Rails environment it can be configured using the
regular Rails configuration mechanisms. For example:
@@ -194,37 +252,46 @@
```ruby
SemanticLogger.default_level = Rails.logger.level
SemanticLogger.add_appender(Rails.logger)
```
-By changing the log level for DataCleansing the type of output for data
+By changing the log level of DataCleansing itself the type of output for data
cleansing can be controlled:
* :trace or :debug to log all fields modified
* :info to log only those fields which were nilled out
* :warn or higher to disable logging of cleansing actions
+Note:
+
+* The logging of changes made to attributes only includes attributes cleansed
+ with :data_cleanse blocks. Attributes modified within :after_cleanse methods
+ are not logged
+
+* It is not necessary to change the global log level to affect the logging detail
+ level in DataCleansing. DataCleansing log level is changed independently
+
To change the log level, either use the Rails configuration approach, or set it
directly:
```ruby
DataCleansing.logger.level = :info
```
## Notes
-Cleaners are called in the order in which they are defined, so subsequent cleaners
-can assume that the previous cleaners have run and can therefore access or even
-modify previously cleaned attributes
+* Cleaners are called in the order in which they are defined, so subsequent cleaners
+ can assume that the previous cleaners have run and can therefore access or even
+ modify previously cleaned attributes
## Installation
### Add to an existing Rails project
Add the following line to Gemfile
```ruby
-gem 'data_validation'
+gem 'data_cleansing'
```
Install the Gem with bundler
bundle install