undestroy 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
 
2
2
  class Undestroy::Archive
3
- attr_accessor :source, :config, :transfer
3
+ attr_accessor :source, :config, :transfer, :transfer_options
4
4
 
5
5
  def initialize(args={})
6
6
  validate_arguments(args)
@@ -8,12 +8,15 @@ class Undestroy::Archive
8
8
  self.source = args[:source]
9
9
  self.config = args[:config]
10
10
  self.transfer = args[:transfer]
11
+ self.transfer_options = args[:transfer_options]
11
12
  end
12
13
 
13
14
  def transfer
14
15
  @transfer ||= self.config.internals[:transfer].new(
15
- :klass => self.config.target_class,
16
- :fields => archive_fields
16
+ {
17
+ :klass => self.config.target_class,
18
+ :fields => archive_fields
19
+ }.merge(self.transfer_options || {})
17
20
  )
18
21
  end
19
22
 
@@ -17,7 +17,11 @@ class Undestroy::Binding::ActiveRecord
17
17
  end
18
18
 
19
19
  def before_destroy(instance)
20
- config.internals[:archive].new(:config => config, :source => instance).run
20
+ config.internals[:archive].new(
21
+ :config => config,
22
+ :transfer_options => { :target => target(instance) },
23
+ :source => instance
24
+ ).run if active?
21
25
  end
22
26
 
23
27
  def prefix_table_name(name)
@@ -34,6 +38,12 @@ class Undestroy::Binding::ActiveRecord
34
38
 
35
39
  protected
36
40
 
41
+ def target(source)
42
+ source_pk = config.source_class.primary_key
43
+ target_pk = config.target_class.primary_key
44
+ config.target_class.where(target_pk => source[source_pk]).first
45
+ end
46
+
37
47
  def set_defaults
38
48
  self.config.source_class = self.model
39
49
  self.config.table_name ||= prefix_table_name(self.model.table_name) if self.model.respond_to?(:table_name)
@@ -6,7 +6,7 @@ class Undestroy::Transfer
6
6
  raise ArgumentError, ":klass option required" unless args[:klass]
7
7
  args[:fields] ||= {}
8
8
 
9
- self.target = args[:klass].new
9
+ self.target = args[:target] || args[:klass].new
10
10
 
11
11
  # Set instance values directly to avoid AR's filtering of protected fields
12
12
  args[:fields].each do |field, value|
@@ -1,4 +1,4 @@
1
1
  module Undestroy
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
4
4
 
@@ -1,8 +1,12 @@
1
1
 
2
2
  class Undestroy::Test::Fixtures::ARFixture
3
+ cattr_accessor :calls, :primary_key
3
4
  attr_accessor :attributes
4
5
  attr_reader :saved
5
6
 
7
+ self.calls = []
8
+ self.primary_key = :id
9
+
6
10
  alias :saved? :saved
7
11
 
8
12
  def initialize(attributes={})
@@ -41,5 +45,14 @@ class Undestroy::Test::Fixtures::ARFixture
41
45
  end
42
46
  end
43
47
 
48
+ def self.where(*attrs)
49
+ self.calls << [:where, attrs]
50
+ self
51
+ end
52
+
53
+ def self.first(*attrs)
54
+ self.calls << [:first, attrs]
55
+ end
56
+
44
57
  end
45
58
 
@@ -85,6 +85,20 @@ module Undestroy::Test::Integration::ActiveRecordTest
85
85
  assert_equal 0, @model.all.size
86
86
  end
87
87
 
88
+ should "only create archive record once" do
89
+ @model.undestroy
90
+ target_class = @model.undestroy_model_binding.config.target_class
91
+
92
+ @model.create(:name => "foo")
93
+ original1 = @model.first
94
+ original2 = @model.first
95
+ original1.destroy
96
+ assert_not_raises { original2.destroy }
97
+
98
+ assert target_class.first
99
+ assert_equal 1, target_class.count
100
+ end
101
+
88
102
  should "restore an archived record removing the archive" do
89
103
  @model.undestroy
90
104
  @model.create(:name => "Fart")
@@ -128,6 +142,16 @@ module Undestroy::Test::Integration::ActiveRecordTest
128
142
  assert_equal 2, @model.count
129
143
  assert_equal 1, @model.archived.count
130
144
  end
145
+
146
+ should "destroy without archive when destory! called" do
147
+ @model.undestroy
148
+ record = @model.create :name => "Foo"
149
+ assert_equal 1, @model.count
150
+
151
+ record.destroy!
152
+ assert_equal 0, @model.count
153
+ assert_equal 0, @model.archived.count
154
+ end
131
155
  end
132
156
 
133
157
  class BasicModelWithDifferentBase < Base
@@ -21,7 +21,7 @@ module Undestroy::Archive::Test
21
21
  subject { archive_instance }
22
22
  desc 'basic instance'
23
23
 
24
- should have_accessors :source, :config, :transfer
24
+ should have_accessors :source, :config, :transfer, :transfer_options
25
25
  end
26
26
 
27
27
  class InitMethod < Base
@@ -47,6 +47,11 @@ module Undestroy::Archive::Test
47
47
  obj = archive_instance :transfer => "foo"
48
48
  assert_equal "foo", obj.transfer
49
49
  end
50
+
51
+ should "set optional :transfer_options to transfer_options attr" do
52
+ obj = archive_instance :transfer_options => { :foo => 'bar' }
53
+ assert_equal({ :foo => 'bar' }, obj.transfer_options)
54
+ end
50
55
  end
51
56
 
52
57
  class TransferMethod < BasicInstance
@@ -80,6 +85,24 @@ module Undestroy::Archive::Test
80
85
  assert_equal @archive.source, val
81
86
  assert_equal "FOO", target.attributes[:test]
82
87
  end
88
+
89
+ should "merge transfer_options attr onto arguments" do
90
+ fixture = Class.new do
91
+ attr_accessor :args
92
+ def initialize(args)
93
+ @args = args
94
+ end
95
+ def [](key)
96
+ @args[key]
97
+ end
98
+ end
99
+ @archive.config.internals[:transfer] = fixture
100
+ @archive.transfer_options = { :foo => 'bar', :fields => 123 }
101
+
102
+ assert_equal 'bar', @archive.transfer[:foo]
103
+ assert_equal 123, @archive.transfer[:fields]
104
+ assert_equal @archive.config.target_class, @archive.transfer[:klass]
105
+ end
83
106
  end
84
107
 
85
108
  class RunMethod < Base
@@ -307,9 +307,32 @@ module Undestroy::Binding::ActiveRecord::Test
307
307
  subject.config.internals[:archive] = test_class
308
308
  subject.before_destroy(ar_source)
309
309
 
310
- assert_equal({ :config => subject.config, :source => ar_source }, test_class.data[:args])
310
+ assert_equal subject.config, test_class.data[:args][:config]
311
+ assert_equal ar_source, test_class.data[:args][:source]
311
312
  assert_equal [[:run]], test_class.data[:calls]
312
313
  end
314
+
315
+ should "pass :target value in :transfer_options if archive record exists and nil otherwise" do
316
+ archive_class = Undestroy::Test::Fixtures::Archive
317
+ ar_source = Undestroy::Test::Fixtures::ARFixture.new
318
+ ar_source[:id] = 1
319
+ subject.config.internals[:archive] = archive_class
320
+ subject.config.source_class = ar_source.class
321
+ subject.config.target_class = ar_source.class
322
+ subject.before_destroy(ar_source)
323
+
324
+ assert_equal [:where, [{ :id => 1 }]], ar_source.calls[0]
325
+ assert_equal [:first, []], ar_source.calls[1]
326
+ end
327
+
328
+ should "not run the archival if active is false" do
329
+ archive_class = Undestroy::Test::Fixtures::Archive
330
+ ar_source = Undestroy::Test::Fixtures::ARFixture.new
331
+ subject.config.internals[:archive] = archive_class
332
+ subject.active = false
333
+ subject.before_destroy(ar_source)
334
+ assert_equal 0, archive_class.data[:calls].size
335
+ end
313
336
  end
314
337
 
315
338
  class PrefixTableNameMethod < Base
@@ -23,7 +23,8 @@ module Undestroy::Transfer::Test
23
23
  :name => "Foo",
24
24
  :description => "Foo Description"
25
25
  }
26
- @transfer = subject.new :klass => Undestroy::Test::Fixtures::ARFixture, :fields => @fields
26
+ @init_args = { :klass => Undestroy::Test::Fixtures::ARFixture, :fields => @fields }
27
+ @transfer = subject.new @init_args
27
28
  end
28
29
 
29
30
  should "raise ArgumentError if no :klass key" do
@@ -34,6 +35,12 @@ module Undestroy::Transfer::Test
34
35
  assert_not_raises { subject.new :klass => Undestroy::Test::Fixtures::ARFixture }
35
36
  end
36
37
 
38
+ should "use :target arg if passed" do
39
+ target = @init_args[:klass].new
40
+ @transfer = subject.new @init_args.merge(:target => target)
41
+ assert_equal target.object_id, @transfer.target.object_id
42
+ end
43
+
37
44
  should "create :klass instance with :fields" do
38
45
  assert_instance_of Undestroy::Test::Fixtures::ARFixture, @transfer.target
39
46
  assert_equal @fields[:id], @transfer.target[:id]
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: undestroy
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 0
10
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Travis Petticrew
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-03-26 00:00:00 Z
18
+ date: 2012-04-09 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  type: :runtime