requires_approval_rails_2 1.0.3 → 1.0.8
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.
- checksums.yaml +7 -0
- data/Gemfile +1 -18
- data/Gemfile.lock +32 -28
- data/Rakefile +5 -15
- data/VERSION +1 -1
- data/lib/requires_approval.rb +70 -55
- data/requires_approval_rails_2.gemspec +2 -2
- data/spec/lib/requires_approval_spec.rb +35 -7
- data/spec/spec_helper.rb +0 -3
- metadata +94 -58
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 8a4b7bd4c275b86b2b16aa1de9dbdc8ed41a7b7e
|
|
4
|
+
data.tar.gz: 27891b68e190c130107655d46277ed09b919a07d
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 89c9161b544d25ded4c4dd9b8829e7fea8d85c7318b3110cfc0beb20b9030179091b720fd0a9b4c9ee27be8b165254db2817ed555dfe1cdf14a3eb5a632331e1
|
|
7
|
+
data.tar.gz: 2b933bb51777f10b0cbff0f836fa282b4b7889956b7813c29f81d2ee6cb7352d36f8db4362f8aec26b378fe0e472b70eb1b85283eaa272b17a0c0a586b83e8eb
|
data/Gemfile
CHANGED
|
@@ -3,21 +3,4 @@ source "http://rubygems.org"
|
|
|
3
3
|
# Example:
|
|
4
4
|
# gem "activesupport", ">= 2.3.5"
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
gem "activesupport", "~> 2.3"
|
|
8
|
-
|
|
9
|
-
# Add dependencies to develop your gem here.
|
|
10
|
-
# Include everything needed to run rake, tests, features, etc.
|
|
11
|
-
group :development do
|
|
12
|
-
gem "bundler"
|
|
13
|
-
gem "guard-rspec"
|
|
14
|
-
gem "guard-bundler"
|
|
15
|
-
gem "guard-spork"
|
|
16
|
-
gem "jeweler", "~> 1.8.3"
|
|
17
|
-
gem "mocha"
|
|
18
|
-
gem "rdoc"
|
|
19
|
-
gem "rspec"
|
|
20
|
-
gem "ruby-debug19", :require => "ruby-debug"
|
|
21
|
-
gem "sqlite3"
|
|
22
|
-
gem "yard"
|
|
23
|
-
end
|
|
6
|
+
gemspec :name => "requires_approval"
|
data/Gemfile.lock
CHANGED
|
@@ -1,40 +1,55 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
requires_approval (1.0.8)
|
|
5
|
+
activerecord
|
|
6
|
+
requires_approval
|
|
7
|
+
|
|
1
8
|
GEM
|
|
2
9
|
remote: http://rubygems.org/
|
|
3
10
|
specs:
|
|
4
|
-
|
|
5
|
-
activesupport (= 2.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
11
|
+
activemodel (3.2.14)
|
|
12
|
+
activesupport (= 3.2.14)
|
|
13
|
+
builder (~> 3.0.0)
|
|
14
|
+
activerecord (3.2.14)
|
|
15
|
+
activemodel (= 3.2.14)
|
|
16
|
+
activesupport (= 3.2.14)
|
|
17
|
+
arel (~> 3.0.2)
|
|
18
|
+
tzinfo (~> 0.3.29)
|
|
19
|
+
activesupport (3.2.14)
|
|
20
|
+
i18n (~> 0.6, >= 0.6.4)
|
|
21
|
+
multi_json (~> 1.0)
|
|
22
|
+
arel (3.0.2)
|
|
23
|
+
builder (3.0.4)
|
|
9
24
|
diff-lcs (1.1.3)
|
|
10
|
-
ffi (1.1.
|
|
25
|
+
ffi (1.1.5)
|
|
11
26
|
git (1.2.5)
|
|
12
|
-
guard (1.2
|
|
27
|
+
guard (1.3.2)
|
|
13
28
|
listen (>= 0.4.2)
|
|
14
29
|
thor (>= 0.14.6)
|
|
15
30
|
guard-bundler (1.0.0)
|
|
16
31
|
bundler (~> 1.0)
|
|
17
32
|
guard (~> 1.1)
|
|
18
|
-
guard-rspec (1.2.
|
|
33
|
+
guard-rspec (1.2.1)
|
|
19
34
|
guard (>= 1.1)
|
|
20
35
|
guard-spork (1.1.0)
|
|
21
36
|
guard (>= 1.1)
|
|
22
37
|
spork (>= 0.8.4)
|
|
38
|
+
i18n (0.6.5)
|
|
23
39
|
jeweler (1.8.4)
|
|
24
40
|
bundler (~> 1.0)
|
|
25
41
|
git (>= 1.2.5)
|
|
26
42
|
rake
|
|
27
43
|
rdoc
|
|
28
|
-
json (1.7.
|
|
29
|
-
linecache19 (0.5.12)
|
|
30
|
-
ruby_core_source (>= 0.1.4)
|
|
44
|
+
json (1.7.5)
|
|
31
45
|
listen (0.4.7)
|
|
32
46
|
rb-fchange (~> 0.0.5)
|
|
33
47
|
rb-fsevent (~> 0.9.1)
|
|
34
48
|
rb-inotify (~> 0.8.8)
|
|
35
49
|
metaclass (0.0.1)
|
|
36
|
-
mocha (0.12.
|
|
50
|
+
mocha (0.12.3)
|
|
37
51
|
metaclass (~> 0.0.1)
|
|
52
|
+
multi_json (1.8.0)
|
|
38
53
|
rake (0.9.2.2)
|
|
39
54
|
rb-fchange (0.0.5)
|
|
40
55
|
ffi
|
|
@@ -48,30 +63,19 @@ GEM
|
|
|
48
63
|
rspec-expectations (~> 2.11.0)
|
|
49
64
|
rspec-mocks (~> 2.11.0)
|
|
50
65
|
rspec-core (2.11.1)
|
|
51
|
-
rspec-expectations (2.11.
|
|
66
|
+
rspec-expectations (2.11.2)
|
|
52
67
|
diff-lcs (~> 1.1.3)
|
|
53
|
-
rspec-mocks (2.11.
|
|
54
|
-
ruby-debug-base19 (0.11.25)
|
|
55
|
-
columnize (>= 0.3.1)
|
|
56
|
-
linecache19 (>= 0.5.11)
|
|
57
|
-
ruby_core_source (>= 0.1.4)
|
|
58
|
-
ruby-debug19 (0.11.6)
|
|
59
|
-
columnize (>= 0.3.1)
|
|
60
|
-
linecache19 (>= 0.5.11)
|
|
61
|
-
ruby-debug-base19 (>= 0.11.19)
|
|
62
|
-
ruby_core_source (0.1.5)
|
|
63
|
-
archive-tar-minitar (>= 0.5.2)
|
|
68
|
+
rspec-mocks (2.11.2)
|
|
64
69
|
spork (0.9.2)
|
|
65
70
|
sqlite3 (1.3.6)
|
|
66
|
-
thor (0.
|
|
71
|
+
thor (0.16.0)
|
|
72
|
+
tzinfo (0.3.37)
|
|
67
73
|
yard (0.8.2.1)
|
|
68
74
|
|
|
69
75
|
PLATFORMS
|
|
70
76
|
ruby
|
|
71
77
|
|
|
72
78
|
DEPENDENCIES
|
|
73
|
-
activerecord (~> 2.3)
|
|
74
|
-
activesupport (~> 2.3)
|
|
75
79
|
bundler
|
|
76
80
|
guard-bundler
|
|
77
81
|
guard-rspec
|
|
@@ -79,7 +83,7 @@ DEPENDENCIES
|
|
|
79
83
|
jeweler (~> 1.8.3)
|
|
80
84
|
mocha
|
|
81
85
|
rdoc
|
|
86
|
+
requires_approval!
|
|
82
87
|
rspec
|
|
83
|
-
ruby-debug19
|
|
84
88
|
sqlite3
|
|
85
89
|
yard
|
data/Rakefile
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
|
|
3
|
+
Dir.glob('lib/tasks/*.rake').each {|r| import r}
|
|
4
|
+
require 'rake'
|
|
5
|
+
|
|
3
6
|
require 'rubygems'
|
|
4
7
|
require 'bundler'
|
|
5
8
|
begin
|
|
@@ -9,12 +12,12 @@ rescue Bundler::BundlerError => e
|
|
|
9
12
|
$stderr.puts "Run `bundle install` to install missing gems"
|
|
10
13
|
exit e.status_code
|
|
11
14
|
end
|
|
12
|
-
|
|
15
|
+
|
|
13
16
|
|
|
14
17
|
require 'jeweler'
|
|
15
18
|
Jeweler::Tasks.new do |gem|
|
|
16
19
|
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
|
17
|
-
gem.name = "
|
|
20
|
+
gem.name = "requires_approval"
|
|
18
21
|
gem.homepage = "http://github.com/LifebookerInc/requires_approval"
|
|
19
22
|
gem.license = "MIT"
|
|
20
23
|
gem.summary = %Q{Gem to handle versioning and things that require approval}
|
|
@@ -25,18 +28,5 @@ Jeweler::Tasks.new do |gem|
|
|
|
25
28
|
end
|
|
26
29
|
Jeweler::RubygemsDotOrgTasks.new
|
|
27
30
|
|
|
28
|
-
require 'rspec/core'
|
|
29
|
-
require 'rspec/core/rake_task'
|
|
30
|
-
RSpec::Core::RakeTask.new(:spec) do |spec|
|
|
31
|
-
spec.pattern = FileList['spec/**/*_spec.rb']
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
|
35
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
|
36
|
-
spec.rcov = true
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
task :default => :spec
|
|
40
|
-
|
|
41
31
|
require 'yard'
|
|
42
32
|
YARD::Rake::YardocTask.new
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.0.
|
|
1
|
+
1.0.8
|
data/lib/requires_approval.rb
CHANGED
|
@@ -4,8 +4,9 @@ require 'errors'
|
|
|
4
4
|
|
|
5
5
|
module RequiresApproval
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
extend ActiveSupport::Concern
|
|
8
|
+
|
|
9
|
+
included do |klass|
|
|
9
10
|
klass.send(:extend, ClassMethods)
|
|
10
11
|
end
|
|
11
12
|
|
|
@@ -15,10 +16,10 @@ module RequiresApproval
|
|
|
15
16
|
|
|
16
17
|
# # approve a list of attributes
|
|
17
18
|
def approve_attributes(*attributes)
|
|
18
|
-
|
|
19
|
+
|
|
19
20
|
return true unless self.has_pending_changes?
|
|
20
21
|
|
|
21
|
-
# validate an normalize our attributes
|
|
22
|
+
# validate an normalize our attributes
|
|
22
23
|
attributes = self.check_attributes_for_approval(attributes)
|
|
23
24
|
|
|
24
25
|
# make sure that all attributes are provided if we have never
|
|
@@ -27,7 +28,7 @@ module RequiresApproval
|
|
|
27
28
|
|
|
28
29
|
if fields_not_being_approved.present? && self.never_approved?
|
|
29
30
|
raise PartialApprovalForNewObject.new(
|
|
30
|
-
"You must approve #{self.fields_requiring_approval.join(", ")} " +
|
|
31
|
+
"You must approve #{self.fields_requiring_approval.join(", ")} " +
|
|
31
32
|
"for a new #{self.class.name}"
|
|
32
33
|
)
|
|
33
34
|
end
|
|
@@ -36,24 +37,26 @@ module RequiresApproval
|
|
|
36
37
|
write_attribute(attr, self.latest_unapproved_version.send(attr))
|
|
37
38
|
end
|
|
38
39
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
self.
|
|
40
|
+
if self.save
|
|
41
|
+
# if we have approved all requested changes, make our latest
|
|
42
|
+
# unapproved version approved -
|
|
43
|
+
# this is ALWAYS true for a new record even though its pending_changes
|
|
44
|
+
# hash is forced to have values
|
|
45
|
+
if self.is_first_version? || self.no_pending_changes?
|
|
46
|
+
self.latest_unapproved_version.update_attribute(:is_approved, true)
|
|
47
|
+
else
|
|
48
|
+
# makes our latest_unapproved_version approved and
|
|
49
|
+
# creates another unapproved version with any remaining
|
|
50
|
+
# attributes
|
|
51
|
+
self.create_approval_version_record
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
self.update_attributes(:is_frozen => false)
|
|
55
|
+
self.reload
|
|
56
|
+
return true
|
|
45
57
|
else
|
|
46
|
-
|
|
47
|
-
# creates another unapproved version with any remaining
|
|
48
|
-
# attributes
|
|
49
|
-
self.create_approval_version_record
|
|
58
|
+
return false
|
|
50
59
|
end
|
|
51
|
-
|
|
52
|
-
self.is_frozen = false
|
|
53
|
-
|
|
54
|
-
self.save
|
|
55
|
-
self.reload
|
|
56
|
-
true
|
|
57
60
|
end
|
|
58
61
|
|
|
59
62
|
def deny_attributes(*attributes)
|
|
@@ -69,20 +72,33 @@ module RequiresApproval
|
|
|
69
72
|
true
|
|
70
73
|
end
|
|
71
74
|
|
|
72
|
-
# if we have denied all changes, remove the record
|
|
75
|
+
# if we have denied all changes, remove the record and
|
|
76
|
+
# make sure it isn't frozen
|
|
73
77
|
unless self.has_pending_changes?
|
|
74
78
|
self.latest_unapproved_version.destroy
|
|
79
|
+
self.update_attribute(:is_frozen, false)
|
|
75
80
|
else
|
|
76
81
|
self.latest_unapproved_version.save
|
|
77
82
|
end
|
|
78
|
-
|
|
83
|
+
|
|
79
84
|
self.reload
|
|
80
85
|
true
|
|
81
86
|
end
|
|
82
87
|
|
|
88
|
+
def reload(*args)
|
|
89
|
+
if instance_variable_defined?(:@has_approved_version)
|
|
90
|
+
remove_instance_variable(:@has_approved_version)
|
|
91
|
+
end
|
|
92
|
+
super(*args)
|
|
93
|
+
end
|
|
94
|
+
|
|
83
95
|
# have any of our versions ever been approved?
|
|
84
96
|
def has_approved_version?
|
|
85
|
-
|
|
97
|
+
unless instance_variable_defined?(:@has_approved_version)
|
|
98
|
+
@has_approved_version = (self.versions.where(:is_approved => true).count > 0)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
@has_approved_version
|
|
86
102
|
end
|
|
87
103
|
|
|
88
104
|
# have we already approved all outstanding changes?
|
|
@@ -103,21 +119,21 @@ module RequiresApproval
|
|
|
103
119
|
# the changes users have requested since the last approval
|
|
104
120
|
def pending_changes
|
|
105
121
|
return {} if self.latest_unapproved_version.blank?
|
|
106
|
-
|
|
122
|
+
|
|
107
123
|
ret = {}
|
|
108
124
|
# check each field requiring approval
|
|
109
125
|
self.fields_requiring_approval.each do |field|
|
|
110
|
-
|
|
126
|
+
|
|
111
127
|
# if it is the same in the unapproved as in the parent table
|
|
112
128
|
# we skip it
|
|
113
|
-
if self.is_first_version? ||
|
|
129
|
+
if self.is_first_version? ||
|
|
114
130
|
self.send(field) != self.latest_unapproved_version.send(field)
|
|
115
|
-
|
|
131
|
+
|
|
116
132
|
# otherwise we get the change set
|
|
117
133
|
ret[field] = {
|
|
118
|
-
# our first version is always nil, regardless of the
|
|
134
|
+
# our first version is always nil, regardless of the
|
|
119
135
|
# defaults in that table
|
|
120
|
-
"was" => self.is_first_version? ? nil : self.send(field),
|
|
136
|
+
"was" => self.is_first_version? ? nil : self.send(field),
|
|
121
137
|
"became" => self.latest_unapproved_version.send(field)
|
|
122
138
|
}
|
|
123
139
|
end
|
|
@@ -155,7 +171,7 @@ module RequiresApproval
|
|
|
155
171
|
self.latest_unapproved_version.update_attributes(
|
|
156
172
|
self.attributes_requiring_approval.merge(:is_approved => true)
|
|
157
173
|
)
|
|
158
|
-
# reload so this unapproved version is out of our cache and will not
|
|
174
|
+
# reload so this unapproved version is out of our cache and will not
|
|
159
175
|
# get its foreign key unassigned
|
|
160
176
|
self.latest_unapproved_version(true)
|
|
161
177
|
|
|
@@ -176,7 +192,7 @@ module RequiresApproval
|
|
|
176
192
|
!self.has_approved_version?
|
|
177
193
|
end
|
|
178
194
|
|
|
179
|
-
# ActiveRecord-style attribute hash for the
|
|
195
|
+
# ActiveRecord-style attribute hash for the
|
|
180
196
|
# requested changes
|
|
181
197
|
def pending_attributes
|
|
182
198
|
ret = {}
|
|
@@ -204,7 +220,7 @@ module RequiresApproval
|
|
|
204
220
|
# adds our versions table
|
|
205
221
|
self.drop_versions_table
|
|
206
222
|
self.create_versions_table
|
|
207
|
-
|
|
223
|
+
|
|
208
224
|
end
|
|
209
225
|
|
|
210
226
|
def requires_approval_for(*attrs)
|
|
@@ -219,13 +235,14 @@ module RequiresApproval
|
|
|
219
235
|
|
|
220
236
|
# create a blank version before create to handle if no
|
|
221
237
|
# attributes were ever set
|
|
222
|
-
self.
|
|
223
|
-
:latest_unapproved_version_with_nil_check
|
|
238
|
+
self.before_validation(
|
|
239
|
+
:latest_unapproved_version_with_nil_check,
|
|
240
|
+
:on => :create
|
|
224
241
|
)
|
|
225
|
-
|
|
242
|
+
|
|
226
243
|
# create the versions class
|
|
227
244
|
self.create_versions_class
|
|
228
|
-
self.has_many :versions,
|
|
245
|
+
self.has_many :versions,
|
|
229
246
|
:class_name => self.versions_class.name,
|
|
230
247
|
:foreign_key => self.versions_foreign_key
|
|
231
248
|
|
|
@@ -236,10 +253,11 @@ module RequiresApproval
|
|
|
236
253
|
:conditions => [
|
|
237
254
|
"#{self.versions_table_name}.is_approved = ?", false
|
|
238
255
|
]
|
|
256
|
+
end
|
|
239
257
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
258
|
+
def unapproved
|
|
259
|
+
includes(:latest_unapproved_version)
|
|
260
|
+
.where("#{self.versions_table_name}.id IS NOT NULL")
|
|
243
261
|
end
|
|
244
262
|
|
|
245
263
|
# the class which our versions are
|
|
@@ -268,9 +286,9 @@ module RequiresApproval
|
|
|
268
286
|
# create a class
|
|
269
287
|
def create_versions_class
|
|
270
288
|
versions_table_name = self.versions_table_name
|
|
271
|
-
|
|
289
|
+
|
|
272
290
|
self.const_set self.versions_class_name, Class.new(ActiveRecord::Base)
|
|
273
|
-
|
|
291
|
+
|
|
274
292
|
self.versions_class.class_eval do
|
|
275
293
|
self.table_name = versions_table_name
|
|
276
294
|
end
|
|
@@ -309,27 +327,18 @@ module RequiresApproval
|
|
|
309
327
|
@versions_table_name = opts.delete(:versions_table_name)
|
|
310
328
|
end
|
|
311
329
|
|
|
312
|
-
def set_up_scopes
|
|
313
|
-
self.named_scope(:unapproved, {
|
|
314
|
-
:include => [:latest_unapproved_version],
|
|
315
|
-
:conditions => [
|
|
316
|
-
"#{self.versions_table_name}.id IS NOT NULL"
|
|
317
|
-
]
|
|
318
|
-
})
|
|
319
|
-
end
|
|
320
|
-
|
|
321
330
|
def set_up_version_delegates
|
|
322
331
|
self.fields_requiring_approval.each do |f|
|
|
323
332
|
define_method("#{f}=") do |val|
|
|
324
333
|
# type cast our val so "0" changes to 'false'
|
|
325
334
|
type_casted_val = self.column_for_attribute(f).type_cast(val)
|
|
326
|
-
|
|
335
|
+
|
|
327
336
|
# if we have a latest_unapproved version already, let it handle
|
|
328
|
-
# updates - if not, only create one if the type casted value is
|
|
337
|
+
# updates - if not, only create one if the type casted value is
|
|
329
338
|
# not the same as what is in the parent value
|
|
330
|
-
if self.latest_unapproved_version.present? ||
|
|
339
|
+
if self.latest_unapproved_version.present? ||
|
|
331
340
|
type_casted_val != self.send(f)
|
|
332
|
-
|
|
341
|
+
|
|
333
342
|
self.send("#{f}_will_change!")
|
|
334
343
|
self.latest_unapproved_version_with_nil_check.send("#{f}=", val)
|
|
335
344
|
end
|
|
@@ -337,6 +346,12 @@ module RequiresApproval
|
|
|
337
346
|
end
|
|
338
347
|
end
|
|
339
348
|
|
|
349
|
+
def validates_approved_field(*args)
|
|
350
|
+
self.versions_class.class_eval do
|
|
351
|
+
validates(*args)
|
|
352
|
+
end
|
|
353
|
+
end
|
|
354
|
+
|
|
340
355
|
# class name for our versions
|
|
341
356
|
def versions_class_name
|
|
342
357
|
@versions_class_name ||= "Version"
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = "requires_approval_rails_2"
|
|
8
|
-
s.version = "1.0.
|
|
8
|
+
s.version = "1.0.8"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Dan Langevin"]
|
|
12
|
-
s.date = "2012-
|
|
12
|
+
s.date = "2012-08-05"
|
|
13
13
|
s.description = "Gem to handle versioning and things that require approval"
|
|
14
14
|
s.email = "dan.langevin@lifebooker.com"
|
|
15
15
|
s.extra_rdoc_files = [
|
|
@@ -235,12 +235,12 @@ describe RequiresApproval do
|
|
|
235
235
|
user.reload
|
|
236
236
|
|
|
237
237
|
user.latest_unapproved_version.should be nil
|
|
238
|
+
|
|
238
239
|
user.update_attributes(
|
|
239
240
|
:first_name => user.first_name,
|
|
240
241
|
:last_name => user.last_name
|
|
241
242
|
)
|
|
242
243
|
user.reload
|
|
243
|
-
|
|
244
244
|
user.latest_unapproved_version.should be nil
|
|
245
245
|
|
|
246
246
|
|
|
@@ -266,13 +266,12 @@ describe RequiresApproval do
|
|
|
266
266
|
|
|
267
267
|
end
|
|
268
268
|
|
|
269
|
-
context "
|
|
269
|
+
context ".validates_approved_field" do
|
|
270
270
|
|
|
271
271
|
it "should delegate to the requires_approval field" do
|
|
272
272
|
User.class_eval do
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
end
|
|
273
|
+
validates_approved_field :first_name,
|
|
274
|
+
:presence => true
|
|
276
275
|
end
|
|
277
276
|
|
|
278
277
|
user = User.new
|
|
@@ -333,8 +332,7 @@ describe RequiresApproval do
|
|
|
333
332
|
})
|
|
334
333
|
|
|
335
334
|
# should create an approved version
|
|
336
|
-
|
|
337
|
-
count.should be > 0
|
|
335
|
+
user.versions.where(:is_approved => true).count.should be > 0
|
|
338
336
|
|
|
339
337
|
end
|
|
340
338
|
|
|
@@ -387,6 +385,19 @@ describe RequiresApproval do
|
|
|
387
385
|
|
|
388
386
|
end
|
|
389
387
|
|
|
388
|
+
it "should not approve the latest unapproved version if it is invalid" do
|
|
389
|
+
|
|
390
|
+
user = User.new(
|
|
391
|
+
:first_name => "Dan",
|
|
392
|
+
:last_name => "Langevin",
|
|
393
|
+
:birthday => Date.today
|
|
394
|
+
)
|
|
395
|
+
|
|
396
|
+
user.stubs(:save => false)
|
|
397
|
+
user.approve_all_attributes.should eql false
|
|
398
|
+
|
|
399
|
+
end
|
|
400
|
+
|
|
390
401
|
end
|
|
391
402
|
|
|
392
403
|
context "#deny_attributes" do
|
|
@@ -464,6 +475,23 @@ describe RequiresApproval do
|
|
|
464
475
|
)
|
|
465
476
|
end
|
|
466
477
|
|
|
478
|
+
it "should set is_frozen to false when denying all attributes" do
|
|
479
|
+
|
|
480
|
+
u = User.create(
|
|
481
|
+
:first_name => "Dan",
|
|
482
|
+
:last_name => "Langevin",
|
|
483
|
+
:birthday => Date.today
|
|
484
|
+
)
|
|
485
|
+
u.approve_all_attributes
|
|
486
|
+
|
|
487
|
+
u.update_attributes(:first_name => "Changed!", :is_frozen => true)
|
|
488
|
+
u.is_frozen?.should eql(true)
|
|
489
|
+
|
|
490
|
+
u.deny_attributes(:first_name)
|
|
491
|
+
u.is_frozen?.should eql(false)
|
|
492
|
+
|
|
493
|
+
end
|
|
494
|
+
|
|
467
495
|
end
|
|
468
496
|
|
|
469
497
|
context "#has_approved_version?" do
|
data/spec/spec_helper.rb
CHANGED
|
@@ -13,9 +13,6 @@ Spork.prefork do
|
|
|
13
13
|
require 'rspec'
|
|
14
14
|
require 'requires_approval'
|
|
15
15
|
|
|
16
|
-
require 'ruby-debug'
|
|
17
|
-
Debugger.start
|
|
18
|
-
|
|
19
16
|
# Requires supporting files with custom matchers and macros, etc,
|
|
20
17
|
# in ./support/ and its subdirectories.
|
|
21
18
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
metadata
CHANGED
|
@@ -1,159 +1,197 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: requires_approval_rails_2
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 1.0.8
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Dan Langevin
|
|
9
8
|
autorequire:
|
|
10
9
|
bindir: bin
|
|
11
10
|
cert_chain: []
|
|
12
|
-
date: 2012-
|
|
11
|
+
date: 2012-08-05 00:00:00.000000000 Z
|
|
13
12
|
dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
|
15
14
|
name: activerecord
|
|
16
|
-
requirement:
|
|
17
|
-
none: false
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
18
16
|
requirements:
|
|
19
17
|
- - ~>
|
|
20
18
|
- !ruby/object:Gem::Version
|
|
21
19
|
version: '2.3'
|
|
22
20
|
type: :runtime
|
|
23
21
|
prerelease: false
|
|
24
|
-
version_requirements:
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ~>
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '2.3'
|
|
25
27
|
- !ruby/object:Gem::Dependency
|
|
26
28
|
name: activesupport
|
|
27
|
-
requirement:
|
|
28
|
-
none: false
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
30
|
requirements:
|
|
30
31
|
- - ~>
|
|
31
32
|
- !ruby/object:Gem::Version
|
|
32
33
|
version: '2.3'
|
|
33
34
|
type: :runtime
|
|
34
35
|
prerelease: false
|
|
35
|
-
version_requirements:
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ~>
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '2.3'
|
|
36
41
|
- !ruby/object:Gem::Dependency
|
|
37
42
|
name: bundler
|
|
38
|
-
requirement:
|
|
39
|
-
none: false
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
40
44
|
requirements:
|
|
41
|
-
- -
|
|
45
|
+
- - '>='
|
|
42
46
|
- !ruby/object:Gem::Version
|
|
43
47
|
version: '0'
|
|
44
48
|
type: :development
|
|
45
49
|
prerelease: false
|
|
46
|
-
version_requirements:
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - '>='
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
47
55
|
- !ruby/object:Gem::Dependency
|
|
48
56
|
name: guard-rspec
|
|
49
|
-
requirement:
|
|
50
|
-
none: false
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
51
58
|
requirements:
|
|
52
|
-
- -
|
|
59
|
+
- - '>='
|
|
53
60
|
- !ruby/object:Gem::Version
|
|
54
61
|
version: '0'
|
|
55
62
|
type: :development
|
|
56
63
|
prerelease: false
|
|
57
|
-
version_requirements:
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - '>='
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
58
69
|
- !ruby/object:Gem::Dependency
|
|
59
70
|
name: guard-bundler
|
|
60
|
-
requirement:
|
|
61
|
-
none: false
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
62
72
|
requirements:
|
|
63
|
-
- -
|
|
73
|
+
- - '>='
|
|
64
74
|
- !ruby/object:Gem::Version
|
|
65
75
|
version: '0'
|
|
66
76
|
type: :development
|
|
67
77
|
prerelease: false
|
|
68
|
-
version_requirements:
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - '>='
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
69
83
|
- !ruby/object:Gem::Dependency
|
|
70
84
|
name: guard-spork
|
|
71
|
-
requirement:
|
|
72
|
-
none: false
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
73
86
|
requirements:
|
|
74
|
-
- -
|
|
87
|
+
- - '>='
|
|
75
88
|
- !ruby/object:Gem::Version
|
|
76
89
|
version: '0'
|
|
77
90
|
type: :development
|
|
78
91
|
prerelease: false
|
|
79
|
-
version_requirements:
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - '>='
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '0'
|
|
80
97
|
- !ruby/object:Gem::Dependency
|
|
81
98
|
name: jeweler
|
|
82
|
-
requirement:
|
|
83
|
-
none: false
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
84
100
|
requirements:
|
|
85
101
|
- - ~>
|
|
86
102
|
- !ruby/object:Gem::Version
|
|
87
103
|
version: 1.8.3
|
|
88
104
|
type: :development
|
|
89
105
|
prerelease: false
|
|
90
|
-
version_requirements:
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - ~>
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: 1.8.3
|
|
91
111
|
- !ruby/object:Gem::Dependency
|
|
92
112
|
name: mocha
|
|
93
|
-
requirement:
|
|
94
|
-
none: false
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
95
114
|
requirements:
|
|
96
|
-
- -
|
|
115
|
+
- - '>='
|
|
97
116
|
- !ruby/object:Gem::Version
|
|
98
117
|
version: '0'
|
|
99
118
|
type: :development
|
|
100
119
|
prerelease: false
|
|
101
|
-
version_requirements:
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - '>='
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: '0'
|
|
102
125
|
- !ruby/object:Gem::Dependency
|
|
103
126
|
name: rdoc
|
|
104
|
-
requirement:
|
|
105
|
-
none: false
|
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
|
106
128
|
requirements:
|
|
107
|
-
- -
|
|
129
|
+
- - '>='
|
|
108
130
|
- !ruby/object:Gem::Version
|
|
109
131
|
version: '0'
|
|
110
132
|
type: :development
|
|
111
133
|
prerelease: false
|
|
112
|
-
version_requirements:
|
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
135
|
+
requirements:
|
|
136
|
+
- - '>='
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: '0'
|
|
113
139
|
- !ruby/object:Gem::Dependency
|
|
114
140
|
name: rspec
|
|
115
|
-
requirement:
|
|
116
|
-
none: false
|
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
|
117
142
|
requirements:
|
|
118
|
-
- -
|
|
143
|
+
- - '>='
|
|
119
144
|
- !ruby/object:Gem::Version
|
|
120
145
|
version: '0'
|
|
121
146
|
type: :development
|
|
122
147
|
prerelease: false
|
|
123
|
-
version_requirements:
|
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
149
|
+
requirements:
|
|
150
|
+
- - '>='
|
|
151
|
+
- !ruby/object:Gem::Version
|
|
152
|
+
version: '0'
|
|
124
153
|
- !ruby/object:Gem::Dependency
|
|
125
154
|
name: ruby-debug19
|
|
126
|
-
requirement:
|
|
127
|
-
none: false
|
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
|
128
156
|
requirements:
|
|
129
|
-
- -
|
|
157
|
+
- - '>='
|
|
130
158
|
- !ruby/object:Gem::Version
|
|
131
159
|
version: '0'
|
|
132
160
|
type: :development
|
|
133
161
|
prerelease: false
|
|
134
|
-
version_requirements:
|
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
163
|
+
requirements:
|
|
164
|
+
- - '>='
|
|
165
|
+
- !ruby/object:Gem::Version
|
|
166
|
+
version: '0'
|
|
135
167
|
- !ruby/object:Gem::Dependency
|
|
136
168
|
name: sqlite3
|
|
137
|
-
requirement:
|
|
138
|
-
none: false
|
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
|
139
170
|
requirements:
|
|
140
|
-
- -
|
|
171
|
+
- - '>='
|
|
141
172
|
- !ruby/object:Gem::Version
|
|
142
173
|
version: '0'
|
|
143
174
|
type: :development
|
|
144
175
|
prerelease: false
|
|
145
|
-
version_requirements:
|
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
177
|
+
requirements:
|
|
178
|
+
- - '>='
|
|
179
|
+
- !ruby/object:Gem::Version
|
|
180
|
+
version: '0'
|
|
146
181
|
- !ruby/object:Gem::Dependency
|
|
147
182
|
name: yard
|
|
148
|
-
requirement:
|
|
149
|
-
none: false
|
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
|
150
184
|
requirements:
|
|
151
|
-
- -
|
|
185
|
+
- - '>='
|
|
152
186
|
- !ruby/object:Gem::Version
|
|
153
187
|
version: '0'
|
|
154
188
|
type: :development
|
|
155
189
|
prerelease: false
|
|
156
|
-
version_requirements:
|
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
191
|
+
requirements:
|
|
192
|
+
- - '>='
|
|
193
|
+
- !ruby/object:Gem::Version
|
|
194
|
+
version: '0'
|
|
157
195
|
description: Gem to handle versioning and things that require approval
|
|
158
196
|
email: dan.langevin@lifebooker.com
|
|
159
197
|
executables: []
|
|
@@ -180,27 +218,25 @@ files:
|
|
|
180
218
|
homepage: http://github.com/LifebookerInc/requires_approval
|
|
181
219
|
licenses:
|
|
182
220
|
- MIT
|
|
221
|
+
metadata: {}
|
|
183
222
|
post_install_message:
|
|
184
223
|
rdoc_options: []
|
|
185
224
|
require_paths:
|
|
186
225
|
- lib
|
|
187
226
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
188
|
-
none: false
|
|
189
227
|
requirements:
|
|
190
|
-
- -
|
|
228
|
+
- - '>='
|
|
191
229
|
- !ruby/object:Gem::Version
|
|
192
230
|
version: '0'
|
|
193
231
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
|
-
none: false
|
|
195
232
|
requirements:
|
|
196
|
-
- -
|
|
233
|
+
- - '>='
|
|
197
234
|
- !ruby/object:Gem::Version
|
|
198
235
|
version: '0'
|
|
199
236
|
requirements: []
|
|
200
237
|
rubyforge_project:
|
|
201
|
-
rubygems_version:
|
|
238
|
+
rubygems_version: 2.0.3
|
|
202
239
|
signing_key:
|
|
203
240
|
specification_version: 3
|
|
204
241
|
summary: Gem to handle versioning and things that require approval
|
|
205
242
|
test_files: []
|
|
206
|
-
has_rdoc:
|