vidibus-versioning 0.1.0 → 0.1.1

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/README.md CHANGED
@@ -60,32 +60,36 @@ article.redo! # restores next version
60
60
  There is also a method `version` that loads an exisiting version of the record or instantiates a new one:
61
61
 
62
62
  ```ruby
63
- article.version(3) # returns version 3 of the article
64
- article.version(:previous) # returns the previous version of the article
65
- article.version(:next) # returns the next version of the article
66
- article.version(:new) # returns a new version of the article
63
+ article.version(3) # returns version 3 of the article
64
+ article.version(:previous) # returns the previous version of the article
65
+ article.version(:next) # returns the next version of the article
66
+ article.version(:new) # returns a new version of the article
67
67
  ```
68
68
 
69
69
  To apply a version on the current article itself, call `version` with a bang!:
70
70
 
71
71
  ```ruby
72
- article.version!(3) # applies version 3 to the article and returns nil
72
+ article.version!(3) # applies version 3 to the article and returns nil
73
73
  ```
74
74
 
75
- It is even possible to apply versioned attributes directly by adding it to the `version` call:
75
+ It is even possible to apply versioned attributes directly by adding them to the `version` call:
76
76
 
77
77
  ```ruby
78
- article.version(3, :title => "Wicked!") # returns version 3 with a new title applied
78
+ article.version(3, :title => "Wicked!") # returns version 3 with a new title applied
79
79
  ```
80
80
 
81
81
  You may treat the article object with an applied version like the article itself. All changes will
82
- be applied to the loaded version instead of the current instance. An example:
82
+ be applied to the loaded version instead of the current instance. This is useful for creating future versions
83
+ that can be scheduled by [Vidibus::VersionScheduler](https://github.com/vidibus/vidibus-version_scheduler).
84
+
85
+ A workflow example:
83
86
 
84
87
  ```ruby
85
- article.version!(3) # applies version 3
86
- article.title = "Brand new" # sets a new title
87
- article.save # saves version 3 of the article
88
- article.reload # loads the current version of the article
88
+ article = Article.create(:title => "Old shit")
89
+ future_article = article.version(:new) # initialize a new version
90
+ future_article.updated_at = 1.day.since # set a date in the future
91
+ future_article.title = "New shit" # set the new title
92
+ future_article.save # save the version
89
93
  ```
90
94
 
91
95
 
@@ -1,5 +1,5 @@
1
1
  module Vidibus
2
2
  module Versioning
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
5
5
  end
@@ -10,13 +10,14 @@ module Vidibus
10
10
  has_many :versions, :as => :versioned, :class_name => "Vidibus::Versioning::Version", :dependent => :destroy
11
11
 
12
12
  field :version_number, :type => Integer, :default => 1
13
+ field :version_updated_at, :type => Time
13
14
 
14
15
  after_initialize :original_attributes
15
16
  before_update :reset_version_cache
16
17
 
17
18
  mattr_accessor :versioned_attributes, :unversioned_attributes, :versioning_options
18
19
  self.versioned_attributes = []
19
- self.unversioned_attributes = %w[_id _type uuid updated_at created_at version_number]
20
+ self.unversioned_attributes = %w[_id _type uuid updated_at created_at version_number version_updated_at]
20
21
  self.versioning_options = {}
21
22
 
22
23
  # Returns the attributes that should be versioned.
@@ -40,7 +41,6 @@ module Vidibus
40
41
  #
41
42
  def versioned(*args)
42
43
  options = args.extract_options!
43
-
44
44
  self.versioned_attributes = args.map {|a| a.to_s} if args.any?
45
45
  self.versioning_options = options if options.any?
46
46
  end
@@ -130,6 +130,11 @@ module Vidibus
130
130
  version_obj and version_obj.new_record?
131
131
  end
132
132
 
133
+ # Returns the time when versioned attributes have been updated.
134
+ def version_updated_at
135
+ read_attribute(:version_updated_at) || updated_at
136
+ end
137
+
133
138
  protected
134
139
 
135
140
  # Applies version on self. Returns nil
@@ -141,7 +146,10 @@ module Vidibus
141
146
 
142
147
  self.attributes = version_attributes
143
148
  self.version_number = version_cache.wanted_version_number
144
- self.updated_at = version_obj.created_at if version_obj.created_at
149
+ if time = version_obj.created_at
150
+ self.updated_at = time
151
+ self.version_updated_at = time
152
+ end
145
153
  nil
146
154
  end
147
155
 
@@ -157,10 +165,15 @@ module Vidibus
157
165
  end
158
166
 
159
167
  # Returns original attributes with attributes of version object and wanted attributes merged in.
168
+ # TODO: Only return attributes that are present on the object. They may have changed.
160
169
  def version_attributes
161
170
  # TODO: Setting the following line will cause DelayedJob to loop endlessly. The same should happen if an embedded document is defined as versioned_attribute!
162
171
  # original_attributes.merge(version_obj.versioned_attributes).merge(version_cache.wanted_attributes.stringify_keys!)
163
- version_obj.versioned_attributes.merge(version_cache.wanted_attributes.stringify_keys!)
172
+
173
+ Hash[*self.class.fields.keys.zip([]).flatten]. # ensure nil fields are included as well
174
+ merge(version_obj.versioned_attributes). # add version's attributes
175
+ merge(version_cache.wanted_attributes.stringify_keys!). # add options provided with #version call
176
+ except(self.class.unversioned_attributes) # remove unversioned attributes; they may have changed
164
177
  end
165
178
 
166
179
  # Sets instance variables used for versioning.
@@ -211,7 +224,7 @@ module Vidibus
211
224
  obj
212
225
  else
213
226
  editing_time = self.class.versioning_options[:editing_time]
214
- if !editing_time or updated_at <= (Time.now-editing_time.to_i) or updated_at > Time.now # allow future versions
227
+ if !editing_time or version_updated_at <= (Time.now-editing_time.to_i) or version_updated_at > Time.now # allow future versions
215
228
  versions.build(:created_at => updated_at_was)
216
229
  end
217
230
  end
@@ -261,6 +274,7 @@ module Vidibus
261
274
  elsif version_obj
262
275
  version_obj.update_attributes!(:versioned_attributes => original_attributes)
263
276
  self.version_number = version_obj.number + 1
277
+ self.version_updated_at = Time.now
264
278
  end
265
279
  nil
266
280
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vidibus-versioning
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 25
5
+ prerelease:
5
6
  segments:
6
7
  - 0
7
8
  - 1
8
- - 0
9
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
10
11
  platform: ruby
11
12
  authors:
12
13
  - Andre Pankratz
@@ -21,9 +22,11 @@ dependencies:
21
22
  name: mongoid
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ~>
26
28
  - !ruby/object:Gem::Version
29
+ hash: 7
27
30
  segments:
28
31
  - 2
29
32
  version: "2"
@@ -33,9 +36,11 @@ dependencies:
33
36
  name: vidibus-core_extensions
34
37
  prerelease: false
35
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
36
40
  requirements:
37
41
  - - ">="
38
42
  - !ruby/object:Gem::Version
43
+ hash: 3
39
44
  segments:
40
45
  - 0
41
46
  version: "0"
@@ -45,9 +50,11 @@ dependencies:
45
50
  name: vidibus-uuid
46
51
  prerelease: false
47
52
  requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
48
54
  requirements:
49
55
  - - ">="
50
56
  - !ruby/object:Gem::Version
57
+ hash: 3
51
58
  segments:
52
59
  - 0
53
60
  version: "0"
@@ -57,9 +64,11 @@ dependencies:
57
64
  name: bundler
58
65
  prerelease: false
59
66
  requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
60
68
  requirements:
61
69
  - - ">="
62
70
  - !ruby/object:Gem::Version
71
+ hash: 23
63
72
  segments:
64
73
  - 1
65
74
  - 0
@@ -71,9 +80,11 @@ dependencies:
71
80
  name: rake
72
81
  prerelease: false
73
82
  requirement: &id005 !ruby/object:Gem::Requirement
83
+ none: false
74
84
  requirements:
75
85
  - - ">="
76
86
  - !ruby/object:Gem::Version
87
+ hash: 3
77
88
  segments:
78
89
  - 0
79
90
  version: "0"
@@ -83,9 +94,11 @@ dependencies:
83
94
  name: rdoc
84
95
  prerelease: false
85
96
  requirement: &id006 !ruby/object:Gem::Requirement
97
+ none: false
86
98
  requirements:
87
99
  - - ">="
88
100
  - !ruby/object:Gem::Version
101
+ hash: 3
89
102
  segments:
90
103
  - 0
91
104
  version: "0"
@@ -95,9 +108,11 @@ dependencies:
95
108
  name: rcov
96
109
  prerelease: false
97
110
  requirement: &id007 !ruby/object:Gem::Requirement
111
+ none: false
98
112
  requirements:
99
113
  - - ">="
100
114
  - !ruby/object:Gem::Version
115
+ hash: 3
101
116
  segments:
102
117
  - 0
103
118
  version: "0"
@@ -107,9 +122,11 @@ dependencies:
107
122
  name: rspec
108
123
  prerelease: false
109
124
  requirement: &id008 !ruby/object:Gem::Requirement
125
+ none: false
110
126
  requirements:
111
127
  - - ~>
112
128
  - !ruby/object:Gem::Version
129
+ hash: 7
113
130
  segments:
114
131
  - 2
115
132
  version: "2"
@@ -119,9 +136,11 @@ dependencies:
119
136
  name: rr
120
137
  prerelease: false
121
138
  requirement: &id009 !ruby/object:Gem::Requirement
139
+ none: false
122
140
  requirements:
123
141
  - - ">="
124
142
  - !ruby/object:Gem::Version
143
+ hash: 3
125
144
  segments:
126
145
  - 0
127
146
  version: "0"
@@ -155,16 +174,20 @@ rdoc_options: []
155
174
  require_paths:
156
175
  - lib
157
176
  required_ruby_version: !ruby/object:Gem::Requirement
177
+ none: false
158
178
  requirements:
159
179
  - - ">="
160
180
  - !ruby/object:Gem::Version
181
+ hash: 3
161
182
  segments:
162
183
  - 0
163
184
  version: "0"
164
185
  required_rubygems_version: !ruby/object:Gem::Requirement
186
+ none: false
165
187
  requirements:
166
188
  - - ">="
167
189
  - !ruby/object:Gem::Version
190
+ hash: 23
168
191
  segments:
169
192
  - 1
170
193
  - 3
@@ -173,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
173
196
  requirements: []
174
197
 
175
198
  rubyforge_project: vidibus-versioning
176
- rubygems_version: 1.3.6
199
+ rubygems_version: 1.6.2
177
200
  signing_key:
178
201
  specification_version: 3
179
202
  summary: Advanced versioning for Mongoid models