lib/active_cleaner/base_cleaner.rb in activecleaner-0.3.1 vs lib/active_cleaner/base_cleaner.rb in activecleaner-0.3.2
- old
+ new
@@ -1,46 +1,72 @@
-# encoding: utf-8
+# frozen_string_literal: true
module ActiveCleaner
+ # = The base cleaner.
+ #
+ # Every cleaner inherit from it.
+ #
+ # class MyCleaner < ActiveCleaner::BaseCleaner
+ #
+ # def clean_value(old_value, record = nil)
+ # old_value.gsub("foo", "bar")
+ # end
+ #
+ # end
class BaseCleaner
- attr_reader :attr_name, :options
+ # Attribute name
+ attr_reader :attr_name
+ # Options given to the cleaner.
+ attr_reader :options
+
# Accepts options that will be made available through the +options+ reader.
def initialize(attr_name, options = {})
@attr_name = attr_name
@options = {
- :nilify => false,
+ nilify: false,
}.merge(options).freeze
end
+ # The kind of the cleaner.
def self.kind
- @kind ||= name.split('::').last.underscore.sub(/_cleaner$/, '').to_sym
+ @kind ||= name.split("::").last.underscore.sub(/_cleaner$/, "").to_sym
end
+ # The kind of the cleaner.
def kind
self.class.kind
end
+ # Cleans the record by extracting the value of the field, cleaning it, and setting it back.
def clean(record)
value = record.read_attribute_for_cleaning(attr_name)
new_value = clean_value(value, record)
new_value = nil if @options[:nilify] && nilify_value?(new_value, record)
record.write_attribute_after_cleaning(attr_name, new_value) unless new_value == value
end
- def clean_value(value, record=nil)
+ # Cleans the value.
+ #
+ # It is expected that the returned value is the cleaned value.
+ #
+ # The method needs to be implemented in the subclasses.
+ def clean_value(_old_value, _record = nil)
raise NotImplementedError, "Subclasses must implement a clean(value, record=nil) method."
end
- # feel free to subclass for your custom cleaner
- def nilify_value?(value, record=nil)
+ # Tests whether or not the value should be nilified.
+ #
+ # This can be changed in the subclasses.
+ def nilify_value?(value, _record = nil)
value == ""
end
+ # Test whether or not two cleaners are equal.
def ==(other)
kind == other.kind && attr_name == other.attr_name && options == other.options
end
end