laserlemon-vestal_versions 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.3
1
+ 0.4.4
@@ -9,6 +9,16 @@ module LaserLemon
9
9
  module ClassMethods
10
10
  def versioned
11
11
  has_many :versions, :as => :versioned, :order => 'versions.number ASC', :dependent => :destroy 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)
16
+ all(
17
+ :conditions => {:number => condition},
18
+ :order => "versions.number #{(from > to) ? 'DESC' : 'ASC'}"
19
+ )
20
+ end
21
+
12
22
  def at(value)
13
23
  case value
14
24
  when Version then value
@@ -18,24 +28,13 @@ module LaserLemon
18
28
  end
19
29
  end
20
30
 
21
- def between(from_value, to_value)
22
- from, to = number_at(from_value), number_at(to_value)
23
- return [] if from.nil? || to.nil? || (from == to)
24
- all(
25
- :conditions => {:number => Range.new(*[from, to].sort)},
26
- :order => "versions.number #{(from > to) ? 'DESC' : 'ASC'}"
27
- )
28
- end
29
-
30
- private
31
-
32
- def number_at(value)
33
- case value
34
- when Version then value.number
35
- when Numeric then value.floor
36
- when Symbol, Date, Time then at(value).try(:number)
37
- end
31
+ def number_at(value)
32
+ case value
33
+ when Version then value.number
34
+ when Numeric then value.floor
35
+ when Symbol, Date, Time then at(value).try(:number)
38
36
  end
37
+ end
39
38
  end
40
39
 
41
40
  after_save :create_version, :if => :needs_version?
@@ -47,7 +46,6 @@ module LaserLemon
47
46
 
48
47
  module InstanceMethods
49
48
  private
50
-
51
49
  def needs_version?
52
50
  !changed.empty?
53
51
  end
@@ -69,7 +67,6 @@ module LaserLemon
69
67
  end
70
68
 
71
69
  public
72
-
73
70
  def version
74
71
  @version ||= last_version
75
72
  end
@@ -81,15 +78,17 @@ module LaserLemon
81
78
  def reverted?
82
79
  version != last_version
83
80
  end
84
-
81
+
85
82
  def reload_with_versions(*args)
86
83
  reset_version
87
84
  reload_without_versions(*args)
88
85
  end
89
86
 
90
87
  def revert_to(value)
91
- chain = versions.between(version, value)
92
- return version unless chain.size > 1
88
+ to_value = versions.number_at(value)
89
+ return version if to_value == version
90
+ chain = versions.between(version, to_value)
91
+ return version if chain.empty?
93
92
 
94
93
  new_version = chain.last.number
95
94
  backward = chain.first > chain.last
@@ -114,7 +113,7 @@ module LaserLemon
114
113
  end
115
114
 
116
115
  def last_changes
117
- return {} if version == 1
116
+ return {} if version.nil? || version == 1
118
117
  versions.at(version).changes
119
118
  end
120
119
 
@@ -0,0 +1,58 @@
1
+ require 'test_helper'
2
+
3
+ class BetweenTest < Test::Unit::TestCase
4
+ context 'The number of versions between' do
5
+ setup do
6
+ @user = User.create(:name => 'Steve Richert')
7
+ @version = @user.version
8
+ @valid = [@version, 0, 1_000_000, :first, :last, 1.day.since(@user.created_at), @user.versions.first]
9
+ @invalid = [nil, :bogus, 'bogus', Date.parse('0001-12-25')]
10
+ end
11
+
12
+ context 'the current version and the current version' do
13
+ should 'equal one' do
14
+ assert_equal 1, @user.versions.between(@version, @version).size
15
+ end
16
+ end
17
+
18
+ context 'the current version and a valid value' do
19
+ should 'not equal zero' do
20
+ @valid.each do |valid|
21
+ assert_not_equal 0, @user.versions.between(@version, valid).size
22
+ assert_not_equal 0, @user.versions.between(valid, @version).size
23
+ end
24
+ end
25
+ end
26
+
27
+ context 'the current version and an invalid value' do
28
+ should 'equal zero' do
29
+ @invalid.each do |invalid|
30
+ assert_equal 0, @user.versions.between(@version, invalid).size
31
+ assert_equal 0, @user.versions.between(invalid, @version).size
32
+ end
33
+ end
34
+ end
35
+
36
+ context 'two invalid values' do
37
+ should 'equal zero' do
38
+ @invalid.each do |first|
39
+ @invalid.each do |second|
40
+ assert_equal 0, @user.versions.between(first, second).size
41
+ assert_equal 0, @user.versions.between(second, first).size
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ context 'a valid value and an invalid value' do
48
+ should 'equal zero' do
49
+ @valid.each do |valid|
50
+ @invalid.each do |invalid|
51
+ assert_equal 0, @user.versions.between(valid, invalid).size
52
+ assert_equal 0, @user.versions.between(invalid, valid).size
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -27,14 +27,6 @@ class CreationTest < Test::Unit::TestCase
27
27
  assert_equal @count, @user.versions.count
28
28
  end
29
29
 
30
- should 'not increase when reverting to an identical version' do
31
- @user.update_attribute(:name, 'Steve Jobs')
32
- @user.update_attribute(:name, @name)
33
- count = @user.versions.count
34
- @user.revert_to!(:first)
35
- assert_equal count, @user.versions.count
36
- end
37
-
38
30
  context 'after an update' do
39
31
  setup do
40
32
  @initial_count = @count
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{vestal_versions}
8
- s.version = "0.4.3"
8
+ s.version = "0.4.4"
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-08-31}
12
+ s.date = %q{2009-09-01}
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 = [
@@ -27,6 +27,7 @@ Gem::Specification.new do |s|
27
27
  "init.rb",
28
28
  "lib/version.rb",
29
29
  "lib/vestal_versions.rb",
30
+ "test/between_test.rb",
30
31
  "test/changes_test.rb",
31
32
  "test/comparable_test.rb",
32
33
  "test/creation_test.rb",
@@ -42,7 +43,8 @@ Gem::Specification.new do |s|
42
43
  s.rubygems_version = %q{1.3.5}
43
44
  s.summary = %q{Keep a DRY history of your ActiveRecord models' changes}
44
45
  s.test_files = [
45
- "test/changes_test.rb",
46
+ "test/between_test.rb",
47
+ "test/changes_test.rb",
46
48
  "test/comparable_test.rb",
47
49
  "test/creation_test.rb",
48
50
  "test/last_changes_test.rb",
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.4.3
4
+ version: 0.4.4
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-08-31 00:00:00 -07:00
12
+ date: 2009-09-01 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -42,6 +42,7 @@ files:
42
42
  - init.rb
43
43
  - lib/version.rb
44
44
  - lib/vestal_versions.rb
45
+ - test/between_test.rb
45
46
  - test/changes_test.rb
46
47
  - test/comparable_test.rb
47
48
  - test/creation_test.rb
@@ -52,7 +53,6 @@ files:
52
53
  - vestal_versions.gemspec
53
54
  has_rdoc: false
54
55
  homepage: http://github.com/laserlemon/vestal_versions
55
- licenses:
56
56
  post_install_message:
57
57
  rdoc_options:
58
58
  - --charset=UTF-8
@@ -73,11 +73,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
73
  requirements: []
74
74
 
75
75
  rubyforge_project:
76
- rubygems_version: 1.3.5
76
+ rubygems_version: 1.2.0
77
77
  signing_key:
78
78
  specification_version: 3
79
79
  summary: Keep a DRY history of your ActiveRecord models' changes
80
80
  test_files:
81
+ - test/between_test.rb
81
82
  - test/changes_test.rb
82
83
  - test/comparable_test.rb
83
84
  - test/creation_test.rb