vestal_versions 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.0
1
+ 0.7.0
@@ -9,13 +9,13 @@ module LaserLemon
9
9
  module ClassMethods
10
10
  def versioned
11
11
  has_many :versions, :as => :versioned, :order => 'versions.number ASC', :dependent => :delete_all do
12
- def between(from_value, to_value)
13
- from, to = number_at(from_value), number_at(to_value)
14
- return [] if from.nil? || to.nil?
15
- condition = (from == to) ? to : Range.new(*[from, to].sort)
12
+ def between(from, to)
13
+ from_number, to_number = number_at(from), number_at(to)
14
+ return [] if from_number.nil? || to_number.nil?
15
+ condition = (from_number == to_number) ? to_number : Range.new(*[from_number, to_number].sort)
16
16
  all(
17
17
  :conditions => {:number => condition},
18
- :order => "versions.number #{(from > to) ? 'DESC' : 'ASC'}"
18
+ :order => "versions.number #{(from_number > to_number) ? 'DESC' : 'ASC'}"
19
19
  )
20
20
  end
21
21
 
@@ -88,26 +88,37 @@ module LaserLemon
88
88
  reload_without_versions(*args)
89
89
  end
90
90
 
91
- def revert_to(value)
92
- to_value = versions.number_at(value)
93
- return version if to_value == version
94
- chain = versions.between(version, to_value)
95
- return version if chain.empty?
91
+ def changes_between(from, to)
92
+ from_number, to_number = versions.number_at(from), versions.number_at(to)
93
+ return {} if from_number == to_number
94
+ chain = versions.between(from_number, to_number)
95
+ return {} if chain.empty?
96
96
 
97
- new_version = chain.last.number
98
97
  backward = chain.first > chain.last
99
98
  backward ? chain.pop : chain.shift
100
99
 
101
100
  timestamps = %w(created_at created_on updated_at updated_on)
102
101
 
103
- chain.each do |version|
102
+ chain.inject({}) do |changes, version|
104
103
  version.changes.except(*timestamps).each do |attribute, change|
105
- new_value = backward ? change.first : change.last
106
- write_attribute(attribute, new_value)
104
+ change.reverse! if backward
105
+ new_change = [changes.fetch(attribute, change).first, change.last]
106
+ changes.update(attribute => new_change)
107
107
  end
108
+ changes
109
+ end
110
+ end
111
+
112
+ def revert_to(value)
113
+ to_number = versions.number_at(value)
114
+ changes = changes_between(version, to_number)
115
+ return version if changes.empty?
116
+
117
+ changes.each do |attribute, change|
118
+ write_attribute(attribute, change.last)
108
119
  end
109
120
 
110
- reset_version(new_version)
121
+ reset_version(to_number)
111
122
  end
112
123
 
113
124
  def revert_to!(value)
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{vestal_versions}
8
- s.version = "0.6.0"
8
+ s.version = "0.7.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["laserlemon"]
12
- s.date = %q{2009-09-05}
12
+ s.date = %q{2009-09-21}
13
13
  s.description = %q{Keep a DRY history of your ActiveRecord models' changes}
14
14
  s.email = %q{steve@laserlemon.com}
15
15
  s.extra_rdoc_files = [
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vestal_versions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - laserlemon
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-09-05 00:00:00 -04:00
12
+ date: 2009-09-21 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency