laserlemon-vestal_versions 0.6.0 → 0.7.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/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: laserlemon-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 -07:00
12
+ date: 2009-09-21 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -53,6 +53,7 @@ files:
53
53
  - vestal_versions.gemspec
54
54
  has_rdoc: false
55
55
  homepage: http://github.com/laserlemon/vestal_versions
56
+ licenses:
56
57
  post_install_message:
57
58
  rdoc_options:
58
59
  - --charset=UTF-8
@@ -73,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
74
  requirements: []
74
75
 
75
76
  rubyforge_project: laser-lemon
76
- rubygems_version: 1.2.0
77
+ rubygems_version: 1.3.5
77
78
  signing_key:
78
79
  specification_version: 3
79
80
  summary: Keep a DRY history of your ActiveRecord models' changes