on_destroy 0.0.3 → 0.1.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.
data/README.md CHANGED
@@ -31,23 +31,22 @@ Something similar to light version of rails3_acts_as_paranoid could be produced
31
31
  default_scope where("deleted_at IS NOT NULL")
32
32
  on_destroy :do_not_delete, set: :deleted_at, to: lambda {Time.now}
33
33
 
34
- Do on_destroy for all models with:
34
+ If you have the same deleted column and process for all models, instead of using on_destroy in every model, use configure:
35
35
 
36
36
  # Do it for everything
37
37
  OnDestroy.configure do
38
38
  self.do_not_delete = true
39
- self.set = [:deleted]
40
- self.to = true
39
+ self.on_destroy_options = [:do_not_delete, {set: :deleted_at, to: lambda {Time.now}]
41
40
  end
42
41
 
43
42
  If you want control over how it intuits how something is deleted (which is to look at the deleted date) use `:is_deleted_if` which can be a value, nil, or a Proc that takes the attribute value:
44
43
 
45
44
  on_destroy :do_not_delete, set: :some_column, to: lambda {Time.now}, is_deleted_if: {|c|Time.now > c} # provide time-travel resistent behavior of destroyed?/deleted?
46
- on_destroy :do_not_delete, set: :some_column, to: 1 is_deleted_if: 1 # this is not necessary, as it will already check for 1 since you specified it in the :to
45
+ on_destroy :do_not_delete, set: :some_column, to: 1, is_deleted_if: 1 # this is not necessary, as it will already check for 1 since you specified it in the :to
47
46
 
48
47
  If you use a proc to set the value and a value of nil indicates that it should be deleted (which is kind of wierd), you'll need to set:
49
48
 
50
- on_destroy :do_not_delete, set: :some_column, to: lambda {nil} is_deleted_if: nil
49
+ on_destroy :do_not_delete, set: :some_column, to: lambda {nil}, is_deleted_if: nil
51
50
 
52
51
  To call a normal-ish `destroy` method, use the `really_destroy` method. I think this is better than using `destroy!` because all of the other bang methods on ActiveRecord.base tend to just throw errors, not behave that differently, despite the `destroy!` method being a naming convention from acts_as_paranoid.
53
52
 
@@ -1,9 +1,7 @@
1
1
  module OnDestroy
2
2
  OPTIONS = [
3
3
  :do_not_delete,
4
- :set,
5
- :to,
6
- :is_deleted_if
4
+ :on_destroy_options,
7
5
  ]
8
6
 
9
7
  class << self
@@ -12,9 +10,8 @@ module OnDestroy
12
10
  end
13
11
  end
14
12
 
15
- # Do it for everything
13
+ # defaults
16
14
  #OnDestroy.configure do
17
- # self.do_not_delete = true
18
- # self.set = [:deleted]
19
- # self.to = true
15
+ # self.do_not_delete = false
16
+ # self.on_destroy_options = nil
20
17
  #end
@@ -3,8 +3,6 @@ module OnDestroy
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- class_attribute :defined_is_deleted_if
7
- # use values from config
8
6
  OnDestroy::OPTIONS.each do |key|
9
7
  class_attribute key, instance_writer: true
10
8
  self.send("#{key}=".to_sym, OnDestroy.send(key))
@@ -18,20 +16,8 @@ module OnDestroy
18
16
  # and to default self.is_deleted_if to a proc that
19
17
  def on_destroy(*args)
20
18
  options = args.extract_options!
21
- self.do_not_delete = true if args.include?(:do_not_delete)
22
- self.set = options[:set] if options[:set]
23
- self.to = options[:to] if options[:to]
24
- if options[:is_deleted_if]
25
- # set defined_is_deleted_if to allow explicit set to nil
26
- self.defined_is_deleted_if = true
27
- self.is_deleted_if = options[:is_deleted_if]
28
- elsif (options[:to].is_a?(Proc))
29
- # if :to is a Proc, assume that a nil value means it is not deleted and if not-nil is deleted.
30
- # that is just a guess, based on the mark with deleted_at date example.
31
- self.is_deleted_if = Proc.new {|v| v != nil}
32
- else
33
- self.is_deleted_if = Proc.new {|v| v == options[:to]}
34
- end
19
+ self.do_not_delete = args.include?(:do_not_delete)
20
+ self.on_destroy_options = options
35
21
  end
36
22
  end
37
23
 
@@ -39,11 +25,14 @@ module OnDestroy
39
25
 
40
26
  # if self.set then will use update_attributes! to set the self.set attribute to self.to or self.to.call if it is a Proc.
41
27
  def do_on_destroy
42
- if self.set
43
- to_value = self.to.is_a?(Proc) ? self.to.call : self.to
44
- update_attributes! self.set => to_value
28
+ if self.on_destroy_options
29
+ o_set = self.on_destroy_options[:set]
30
+ o_to = self.on_destroy_options[:to]
31
+ if o_set
32
+ update_attributes! o_set => (o_to.is_a?(Proc) ? o_to.call : o_to)
33
+ end
34
+ yield
45
35
  end
46
- yield
47
36
  end
48
37
 
49
38
  # if self.do_not_delete? runs no/empty callback on :destroy, otherwise calls super.
@@ -62,17 +51,21 @@ module OnDestroy
62
51
  run_callbacks(:destroy) {delete}
63
52
  end
64
53
 
65
- # if self.is_deleted_if is a Proc compares self.is_deleted_if.call to send(self.to).
66
- # if self.is_deleted_if is not nil compares self.is_deleted_if.call to send(self.to).
67
- # If self.is_deleted_if not a Proc, calls super.
68
54
  def destroyed?
69
- if self.is_deleted_if.is_a?(Proc)
70
- self.is_deleted_if.call(self.to)
71
- elsif self.is_deleted_if.nil? && !(self.defined_is_deleted_if == true)
72
- # will default to super only if self.is_deleted_if not defined by user
73
- super
55
+ if self.on_destroy_options
56
+ is_deleted_if = self.on_destroy_options[:is_deleted_if]
57
+ o_set = self.on_destroy_options[:set]
58
+ o_to = self.on_destroy_options[:to]
59
+ if is_deleted_if.is_a?(Proc)
60
+ send(o_set) == is_deleted_if.call
61
+ elsif o_to.is_a?(Proc)
62
+ # assume that a :to defined as a Proc is going to evaluate to a non-nil to indicate the model is null
63
+ send(o_set) != nil
64
+ else
65
+ send(o_set) == o_to
66
+ end
74
67
  else
75
- self.is_deleted_if == self.to
68
+ super
76
69
  end
77
70
  end
78
71
 
@@ -1,3 +1,3 @@
1
1
  module OnDestroy
2
- VERSION = '0.0.3'
2
+ VERSION = '0.1.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: on_destroy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: