vestal_versions 1.0.2 → 2.0.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.
Files changed (69) hide show
  1. data/.gitignore +19 -20
  2. data/.travis.yml +22 -0
  3. data/CHANGELOG.md +7 -0
  4. data/Gemfile +10 -0
  5. data/README.rdoc +63 -36
  6. data/Rakefile +4 -43
  7. data/gemfiles/activerecord_3_0.gemfile +10 -0
  8. data/gemfiles/activerecord_3_1.gemfile +10 -0
  9. data/gemfiles/activerecord_3_2.gemfile +10 -0
  10. data/gemfiles/activerecord_4_0.gemfile +10 -0
  11. data/lib/generators/vestal_versions.rb +11 -0
  12. data/lib/generators/vestal_versions/migration/migration_generator.rb +17 -0
  13. data/{generators/vestal_versions → lib/generators/vestal_versions/migration}/templates/initializer.rb +0 -0
  14. data/{generators/vestal_versions → lib/generators/vestal_versions/migration}/templates/migration.rb +4 -3
  15. data/lib/vestal_versions.rb +39 -12
  16. data/lib/vestal_versions/changes.rb +43 -47
  17. data/lib/vestal_versions/conditions.rb +31 -43
  18. data/lib/vestal_versions/control.rb +162 -138
  19. data/lib/vestal_versions/creation.rb +67 -59
  20. data/lib/vestal_versions/deletion.rb +37 -0
  21. data/lib/vestal_versions/options.rb +6 -10
  22. data/lib/vestal_versions/reload.rb +7 -14
  23. data/lib/vestal_versions/reset.rb +15 -19
  24. data/lib/vestal_versions/reversion.rb +64 -52
  25. data/lib/vestal_versions/users.rb +36 -39
  26. data/lib/vestal_versions/version.rb +57 -2
  27. data/lib/vestal_versions/version_tagging.rb +51 -0
  28. data/lib/vestal_versions/versioned.rb +14 -17
  29. data/lib/vestal_versions/versions.rb +22 -7
  30. data/spec/spec_helper.rb +28 -0
  31. data/spec/support/models.rb +19 -0
  32. data/spec/support/schema.rb +25 -0
  33. data/spec/vestal_versions/changes_spec.rb +134 -0
  34. data/spec/vestal_versions/conditions_spec.rb +103 -0
  35. data/spec/vestal_versions/control_spec.rb +120 -0
  36. data/spec/vestal_versions/creation_spec.rb +90 -0
  37. data/spec/vestal_versions/deletion_spec.rb +86 -0
  38. data/spec/vestal_versions/options_spec.rb +45 -0
  39. data/spec/vestal_versions/reload_spec.rb +18 -0
  40. data/spec/vestal_versions/reset_spec.rb +111 -0
  41. data/spec/vestal_versions/reversion_spec.rb +103 -0
  42. data/spec/vestal_versions/users_spec.rb +21 -0
  43. data/spec/vestal_versions/version_spec.rb +61 -0
  44. data/spec/vestal_versions/version_tagging_spec.rb +39 -0
  45. data/spec/vestal_versions/versioned_spec.rb +16 -0
  46. data/spec/vestal_versions/versions_spec.rb +176 -0
  47. data/vestal_versions.gemspec +18 -100
  48. metadata +153 -102
  49. data/VERSION +0 -1
  50. data/generators/vestal_versions/vestal_versions_generator.rb +0 -10
  51. data/init.rb +0 -1
  52. data/lib/vestal_versions/configuration.rb +0 -40
  53. data/lib/vestal_versions/tagging.rb +0 -50
  54. data/test/changes_test.rb +0 -169
  55. data/test/conditions_test.rb +0 -137
  56. data/test/configuration_test.rb +0 -39
  57. data/test/control_test.rb +0 -152
  58. data/test/creation_test.rb +0 -110
  59. data/test/options_test.rb +0 -52
  60. data/test/reload_test.rb +0 -19
  61. data/test/reset_test.rb +0 -112
  62. data/test/reversion_test.rb +0 -68
  63. data/test/schema.rb +0 -43
  64. data/test/tagging_test.rb +0 -39
  65. data/test/test_helper.rb +0 -11
  66. data/test/users_test.rb +0 -25
  67. data/test/version_test.rb +0 -43
  68. data/test/versioned_test.rb +0 -18
  69. data/test/versions_test.rb +0 -172
metadata CHANGED
@@ -1,140 +1,191 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: vestal_versions
3
- version: !ruby/object:Gem::Version
4
- version: 1.0.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
5
+ prerelease:
5
6
  platform: ruby
6
- authors:
7
- - laserlemon
7
+ authors:
8
+ - Steve Richert
9
+ - James O'Kelly
10
+ - C. Jason Harrelson
8
11
  autorequire:
9
12
  bindir: bin
10
13
  cert_chain: []
11
-
12
- date: 2010-01-13 00:00:00 -05:00
13
- default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
14
+ date: 2014-01-21 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
16
17
  name: activerecord
18
+ requirement: !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: '3'
24
+ - - <
25
+ - !ruby/object:Gem::Version
26
+ version: '5'
17
27
  type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 2.1.0
24
- version:
25
- - !ruby/object:Gem::Dependency
26
- name: shoulda
28
+ prerelease: false
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '3'
35
+ - - <
36
+ - !ruby/object:Gem::Version
37
+ version: '5'
38
+ - !ruby/object:Gem::Dependency
39
+ name: activesupport
40
+ requirement: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '3'
46
+ - - <
47
+ - !ruby/object:Gem::Version
48
+ version: '5'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '3'
57
+ - - <
58
+ - !ruby/object:Gem::Version
59
+ version: '5'
60
+ - !ruby/object:Gem::Dependency
61
+ name: bundler
62
+ requirement: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ~>
66
+ - !ruby/object:Gem::Version
67
+ version: '1.0'
27
68
  type: :development
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: "0"
34
- version:
35
- - !ruby/object:Gem::Dependency
36
- name: mocha
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ - !ruby/object:Gem::Dependency
77
+ name: rake
78
+ requirement: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ~>
82
+ - !ruby/object:Gem::Version
83
+ version: '10.0'
37
84
  type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- version: "0"
44
- version:
85
+ prerelease: false
86
+ version_requirements: !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ~>
90
+ - !ruby/object:Gem::Version
91
+ version: '10.0'
45
92
  description: Keep a DRY history of your ActiveRecord models' changes
46
- email: steve@laserlemon.com
93
+ email:
94
+ - steve.richert@gmail.com
95
+ - dreamr.okelly@gmail.com
96
+ - jason@lookforwardenterprises.com
47
97
  executables: []
48
-
49
98
  extensions: []
50
-
51
- extra_rdoc_files:
52
- - LICENSE
53
- - README.rdoc
54
- files:
99
+ extra_rdoc_files: []
100
+ files:
55
101
  - .gitignore
102
+ - .travis.yml
103
+ - CHANGELOG.md
104
+ - Gemfile
56
105
  - LICENSE
57
106
  - README.rdoc
58
107
  - Rakefile
59
- - VERSION
60
- - generators/vestal_versions/templates/initializer.rb
61
- - generators/vestal_versions/templates/migration.rb
62
- - generators/vestal_versions/vestal_versions_generator.rb
63
- - init.rb
108
+ - gemfiles/activerecord_3_0.gemfile
109
+ - gemfiles/activerecord_3_1.gemfile
110
+ - gemfiles/activerecord_3_2.gemfile
111
+ - gemfiles/activerecord_4_0.gemfile
112
+ - lib/generators/vestal_versions.rb
113
+ - lib/generators/vestal_versions/migration/migration_generator.rb
114
+ - lib/generators/vestal_versions/migration/templates/initializer.rb
115
+ - lib/generators/vestal_versions/migration/templates/migration.rb
64
116
  - lib/vestal_versions.rb
65
117
  - lib/vestal_versions/changes.rb
66
118
  - lib/vestal_versions/conditions.rb
67
- - lib/vestal_versions/configuration.rb
68
119
  - lib/vestal_versions/control.rb
69
120
  - lib/vestal_versions/creation.rb
121
+ - lib/vestal_versions/deletion.rb
70
122
  - lib/vestal_versions/options.rb
71
123
  - lib/vestal_versions/reload.rb
72
124
  - lib/vestal_versions/reset.rb
73
125
  - lib/vestal_versions/reversion.rb
74
- - lib/vestal_versions/tagging.rb
75
126
  - lib/vestal_versions/users.rb
76
127
  - lib/vestal_versions/version.rb
128
+ - lib/vestal_versions/version_tagging.rb
77
129
  - lib/vestal_versions/versioned.rb
78
130
  - lib/vestal_versions/versions.rb
79
- - test/changes_test.rb
80
- - test/conditions_test.rb
81
- - test/configuration_test.rb
82
- - test/control_test.rb
83
- - test/creation_test.rb
84
- - test/options_test.rb
85
- - test/reload_test.rb
86
- - test/reset_test.rb
87
- - test/reversion_test.rb
88
- - test/schema.rb
89
- - test/tagging_test.rb
90
- - test/test_helper.rb
91
- - test/users_test.rb
92
- - test/version_test.rb
93
- - test/versioned_test.rb
94
- - test/versions_test.rb
131
+ - spec/spec_helper.rb
132
+ - spec/support/models.rb
133
+ - spec/support/schema.rb
134
+ - spec/vestal_versions/changes_spec.rb
135
+ - spec/vestal_versions/conditions_spec.rb
136
+ - spec/vestal_versions/control_spec.rb
137
+ - spec/vestal_versions/creation_spec.rb
138
+ - spec/vestal_versions/deletion_spec.rb
139
+ - spec/vestal_versions/options_spec.rb
140
+ - spec/vestal_versions/reload_spec.rb
141
+ - spec/vestal_versions/reset_spec.rb
142
+ - spec/vestal_versions/reversion_spec.rb
143
+ - spec/vestal_versions/users_spec.rb
144
+ - spec/vestal_versions/version_spec.rb
145
+ - spec/vestal_versions/version_tagging_spec.rb
146
+ - spec/vestal_versions/versioned_spec.rb
147
+ - spec/vestal_versions/versions_spec.rb
95
148
  - vestal_versions.gemspec
96
- has_rdoc: true
97
149
  homepage: http://github.com/laserlemon/vestal_versions
98
- licenses: []
99
-
150
+ licenses:
151
+ - MIT
100
152
  post_install_message:
101
- rdoc_options:
102
- - --charset=UTF-8
103
- require_paths:
153
+ rdoc_options: []
154
+ require_paths:
104
155
  - lib
105
- required_ruby_version: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - ">="
108
- - !ruby/object:Gem::Version
109
- version: "0"
110
- version:
111
- required_rubygems_version: !ruby/object:Gem::Requirement
112
- requirements:
113
- - - ">="
114
- - !ruby/object:Gem::Version
115
- version: "0"
116
- version:
156
+ required_ruby_version: !ruby/object:Gem::Requirement
157
+ none: false
158
+ requirements:
159
+ - - ! '>='
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ none: false
164
+ requirements:
165
+ - - ! '>='
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
117
168
  requirements: []
118
-
119
169
  rubyforge_project:
120
- rubygems_version: 1.3.5
170
+ rubygems_version: 1.8.25
121
171
  signing_key:
122
172
  specification_version: 3
123
173
  summary: Keep a DRY history of your ActiveRecord models' changes
124
- test_files:
125
- - test/changes_test.rb
126
- - test/conditions_test.rb
127
- - test/configuration_test.rb
128
- - test/control_test.rb
129
- - test/creation_test.rb
130
- - test/options_test.rb
131
- - test/reload_test.rb
132
- - test/reset_test.rb
133
- - test/reversion_test.rb
134
- - test/schema.rb
135
- - test/tagging_test.rb
136
- - test/test_helper.rb
137
- - test/users_test.rb
138
- - test/version_test.rb
139
- - test/versioned_test.rb
140
- - test/versions_test.rb
174
+ test_files:
175
+ - spec/spec_helper.rb
176
+ - spec/support/models.rb
177
+ - spec/support/schema.rb
178
+ - spec/vestal_versions/changes_spec.rb
179
+ - spec/vestal_versions/conditions_spec.rb
180
+ - spec/vestal_versions/control_spec.rb
181
+ - spec/vestal_versions/creation_spec.rb
182
+ - spec/vestal_versions/deletion_spec.rb
183
+ - spec/vestal_versions/options_spec.rb
184
+ - spec/vestal_versions/reload_spec.rb
185
+ - spec/vestal_versions/reset_spec.rb
186
+ - spec/vestal_versions/reversion_spec.rb
187
+ - spec/vestal_versions/users_spec.rb
188
+ - spec/vestal_versions/version_spec.rb
189
+ - spec/vestal_versions/version_tagging_spec.rb
190
+ - spec/vestal_versions/versioned_spec.rb
191
+ - spec/vestal_versions/versions_spec.rb
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 1.0.2
@@ -1,10 +0,0 @@
1
- class VestalVersionsGenerator < Rails::Generator::Base
2
- def manifest
3
- record do |m|
4
- m.migration_template 'migration.rb', File.join('db', 'migrate'), :migration_file_name => 'create_vestal_versions'
5
-
6
- m.directory File.join('config', 'initializers')
7
- m.template 'initializer.rb', File.join('config', 'initializers', 'vestal_versions.rb')
8
- end
9
- end
10
- end
data/init.rb DELETED
@@ -1 +0,0 @@
1
- require File.join(File.dirname(__FILE__), 'lib', 'vestal_versions')
@@ -1,40 +0,0 @@
1
- module VestalVersions
2
- # Allows for easy application-wide configuration of options passed into the +versioned+ method.
3
- module Configuration
4
- # The VestalVersions module is extended by VestalVersions::Configuration, allowing the
5
- # +configure method+ to be used as follows in a Rails initializer:
6
- #
7
- # VestalVersions.configure do |config|
8
- # config.class_name = "MyCustomVersion"
9
- # config.dependent = :destroy
10
- # end
11
- #
12
- # Each variable assignment in the +configure+ block corresponds directly with the options
13
- # available to the +versioned+ method. Assigning common options in an initializer can keep your
14
- # models tidy.
15
- #
16
- # If an option is given in both an initializer and in the options passed to +versioned+, the
17
- # value given in the model itself will take precedence.
18
- def configure
19
- yield Configuration
20
- end
21
-
22
- class << self
23
- # Simply stores a hash of options given to the +configure+ block.
24
- def options
25
- @options ||= {}
26
- end
27
-
28
- # If given a setter method name, will assign the first argument to the +options+ hash with
29
- # the method name (sans "=") as the key. If given a getter method name, will attempt to
30
- # a value from the +options+ hash for that key. If the key doesn't exist, defers to +super+.
31
- def method_missing(symbol, *args)
32
- if (method = symbol.to_s).sub!(/\=$/, '')
33
- options[method.to_sym] = args.first
34
- else
35
- options.fetch(method.to_sym, super)
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,50 +0,0 @@
1
- module VestalVersions
2
- # Allows specific versions to be tagged with a custom string. Useful for assigning a more
3
- # meaningful value to a version for the purpose of reversion.
4
- module Tagging
5
- def self.included(base) # :nodoc:
6
- Version.send(:include, VersionMethods)
7
-
8
- base.class_eval do
9
- include InstanceMethods
10
- end
11
- end
12
-
13
- # Adds an instance method which allows version tagging through the parent object.
14
- module InstanceMethods
15
- # Accepts a single string argument which is attached to the version record associated with
16
- # the current version number of the parent object.
17
- #
18
- # Returns the given tag if successful, nil if not. Tags must be unique within the scope of
19
- # the parent object. Tag creation will fail if non-unique.
20
- #
21
- # Version records corresponding to version number 1 are not typically created, but one will
22
- # be built to house the given tag if the parent object's current version number is 1.
23
- def tag_version(tag)
24
- v = versions.at(version) || versions.build(:number => 1)
25
- v.tag!(tag)
26
- end
27
- end
28
-
29
- # Instance methods included into VestalVersions::Version to enable version tagging.
30
- module VersionMethods
31
- def self.included(base) # :nodoc:
32
- base.class_eval do
33
- validates_uniqueness_of :tag, :scope => [:versioned_id, :versioned_type], :if => :tagged?
34
- end
35
- end
36
-
37
- # Attaches the given string to the version tag column. If the uniqueness validation fails,
38
- # nil is returned. Otherwise, the given string is returned.
39
- def tag!(tag)
40
- write_attribute(:tag, tag)
41
- save ? tag : nil
42
- end
43
-
44
- # Simply returns a boolean signifying whether the version instance has a tag value attached.
45
- def tagged?
46
- !tag.nil?
47
- end
48
- end
49
- end
50
- end
@@ -1,169 +0,0 @@
1
- require File.join(File.dirname(__FILE__), 'test_helper')
2
-
3
- class ChangesTest < Test::Unit::TestCase
4
- context "A version's changes" do
5
- setup do
6
- @user = User.create(:name => 'Steve Richert')
7
- @user.update_attribute(:last_name, 'Jobs')
8
- @changes = @user.versions.last.changes
9
- end
10
-
11
- should 'be a hash' do
12
- assert_kind_of Hash, @changes
13
- end
14
-
15
- should 'not be empty' do
16
- assert !@changes.empty?
17
- end
18
-
19
- should 'have string keys' do
20
- @changes.keys.each do |key|
21
- assert_kind_of String, key
22
- end
23
- end
24
-
25
- should 'have array values' do
26
- @changes.values.each do |value|
27
- assert_kind_of Array, value
28
- end
29
- end
30
-
31
- should 'have two-element values' do
32
- @changes.values.each do |value|
33
- assert_equal 2, value.size
34
- end
35
- end
36
-
37
- should 'have unique-element values' do
38
- @changes.values.each do |value|
39
- assert_equal value.uniq, value
40
- end
41
- end
42
-
43
- should "equal the model's changes" do
44
- @user.first_name = 'Stephen'
45
- model_changes = @user.changes
46
- @user.save
47
- changes = @user.versions.last.changes
48
- assert_equal model_changes, changes
49
- end
50
- end
51
-
52
- context 'A hash of changes' do
53
- setup do
54
- @changes = {'first_name' => ['Steve', 'Stephen']}
55
- @other = {'first_name' => ['Catie', 'Catherine']}
56
- end
57
-
58
- should 'properly append other changes' do
59
- expected = {'first_name' => ['Steve', 'Catherine']}
60
- changes = @changes.append_changes(@other)
61
- assert_equal expected, changes
62
- @changes.append_changes!(@other)
63
- assert_equal expected, @changes
64
- end
65
-
66
- should 'properly prepend other changes' do
67
- expected = {'first_name' => ['Catie', 'Stephen']}
68
- changes = @changes.prepend_changes(@other)
69
- assert_equal expected, changes
70
- @changes.prepend_changes!(@other)
71
- assert_equal expected, @changes
72
- end
73
-
74
- should 'be reversible' do
75
- expected = {'first_name' => ['Stephen', 'Steve']}
76
- changes = @changes.reverse_changes
77
- assert_equal expected, changes
78
- @changes.reverse_changes!
79
- assert_equal expected, @changes
80
- end
81
- end
82
-
83
- context 'The changes between two versions' do
84
- setup do
85
- name = 'Steve Richert'
86
- @user = User.create(:name => name) # 1
87
- @user.update_attribute(:last_name, 'Jobs') # 2
88
- @user.update_attribute(:first_name, 'Stephen') # 3
89
- @user.update_attribute(:last_name, 'Richert') # 4
90
- @user.update_attribute(:name, name) # 5
91
- @version = @user.version
92
- end
93
-
94
- should 'be a hash' do
95
- 1.upto(@version) do |i|
96
- 1.upto(@version) do |j|
97
- changes = @user.changes_between(i, j)
98
- assert_kind_of Hash, changes
99
- end
100
- end
101
- end
102
-
103
- should 'have string keys' do
104
- 1.upto(@version) do |i|
105
- 1.upto(@version) do |j|
106
- changes = @user.changes_between(i, j)
107
- changes.keys.each do |key|
108
- assert_kind_of String, key
109
- end
110
- end
111
- end
112
- end
113
-
114
- should 'have array values' do
115
- 1.upto(@version) do |i|
116
- 1.upto(@version) do |j|
117
- changes = @user.changes_between(i, j)
118
- changes.values.each do |value|
119
- assert_kind_of Array, value
120
- end
121
- end
122
- end
123
- end
124
-
125
- should 'have two-element values' do
126
- 1.upto(@version) do |i|
127
- 1.upto(@version) do |j|
128
- changes = @user.changes_between(i, j)
129
- changes.values.each do |value|
130
- assert_equal 2, value.size
131
- end
132
- end
133
- end
134
- end
135
-
136
- should 'have unique-element values' do
137
- 1.upto(@version) do |i|
138
- 1.upto(@version) do |j|
139
- changes = @user.changes_between(i, j)
140
- changes.values.each do |value|
141
- assert_equal value.uniq, value
142
- end
143
- end
144
- end
145
- end
146
-
147
- should 'be empty between identical versions' do
148
- assert @user.changes_between(1, @version).empty?
149
- assert @user.changes_between(@version, 1).empty?
150
- end
151
-
152
- should 'be should reverse with direction' do
153
- 1.upto(@version) do |i|
154
- i.upto(@version) do |j|
155
- up = @user.changes_between(i, j)
156
- down = @user.changes_between(j, i)
157
- assert_equal up, down.reverse_changes
158
- end
159
- end
160
- end
161
-
162
- should 'be empty with invalid arguments' do
163
- 1.upto(@version) do |i|
164
- assert @user.changes_between(i, nil)
165
- assert @user.changes_between(nil, i)
166
- end
167
- end
168
- end
169
- end