drafter 0.3.1 → 0.3.2
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 +1 -1
- data/drafter.gemspec +1 -1
- data/lib/drafter/draft.rb +46 -3
- data/lib/drafter/draftable.rb +3 -0
- data/test/drafter/test_creation.rb +1 -1
- data/test/drafter/test_draft.rb +60 -0
- data/test/drafter/test_subdrafts.rb +2 -2
- data/test/support/models.rb +2 -2
- metadata +26 -26
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.2
|
data/drafter.gemspec
CHANGED
data/lib/drafter/draft.rb
CHANGED
@@ -72,10 +72,53 @@ class Draft < ActiveRecord::Base
|
|
72
72
|
draftabl
|
73
73
|
end
|
74
74
|
|
75
|
-
|
76
|
-
|
77
|
-
|
75
|
+
# It's possible to use the :delegate_approval_to => :foo option in the
|
76
|
+
# draftable class method, so that this model can be approved as part of its
|
77
|
+
# parent model. This method finds the 'approver', i.e. the Draft object which
|
78
|
+
# is the parent object of this one and for which calling the 'approve' method
|
79
|
+
# will approve this subdraft too.
|
80
|
+
#
|
81
|
+
# This is currently quite weak, in the sense that it'll screw up as soon
|
82
|
+
# as you depart from standard AR class naming conventions. It's a good
|
83
|
+
# target for future development, but I think at the moment, IAGNI.
|
84
|
+
#
|
85
|
+
# At the moment, we just return the parent if a delegate exists. This should
|
86
|
+
# do the trick for us right now, as we're not using deeply nested object
|
87
|
+
# graphs that need approvals. I've got the start of an alternate, somewhat
|
88
|
+
# stronger implementation, underneath that, but we don't have time to do up
|
89
|
+
# the general case right now.
|
90
|
+
#
|
91
|
+
# @return [Draft] approver the draft object which serves as the approval
|
92
|
+
# context for this one. Returns self or a delegated draft object.
|
93
|
+
def approver
|
94
|
+
delegate = self.inflate.class.delegate_approval_to
|
95
|
+
if delegate
|
96
|
+
parent
|
97
|
+
else
|
98
|
+
self
|
78
99
|
end
|
79
100
|
end
|
101
|
+
#
|
102
|
+
# Alternate implementation:
|
103
|
+
# def approver
|
104
|
+
# if delegate.nil?
|
105
|
+
# self
|
106
|
+
# elsif delegate == self.parent.draftable_type.underscore.to_sym
|
107
|
+
# self.parent
|
108
|
+
# else
|
109
|
+
# For polymorphs, if we wanted to be really tight about things, we'd
|
110
|
+
# check here to see whether the inflated parent object has a has_many
|
111
|
+
# which matches this draft's parent_association_name, and if it does,
|
112
|
+
# and that association name matches up with the draftable's class name
|
113
|
+
# (or a :class_name specified in the relation), then we can conclude
|
114
|
+
# that the parent delegation is correct. It might look like:
|
115
|
+
# if everything_matches_up <<<< do the code to match the previous paragraph
|
116
|
+
# parent
|
117
|
+
# else
|
118
|
+
# raise "It is unclear what Draft object you're looking for. Please ensure
|
119
|
+
# that :delegate_approval_to => :foo points at a valid parent :foo"
|
120
|
+
# end
|
121
|
+
# end
|
122
|
+
# end
|
80
123
|
|
81
124
|
end
|
data/lib/drafter/draftable.rb
CHANGED
@@ -166,7 +166,7 @@ class TestCreation < Minitest::Unit::TestCase
|
|
166
166
|
# down the chain.
|
167
167
|
#
|
168
168
|
# For the moment, it should work if you save from the top of the chain.
|
169
|
-
# Given the time constraints right now, let's use that
|
169
|
+
# Given the time constraints right now, let's use that.
|
170
170
|
#
|
171
171
|
# describe "a class which may belongs_to something else, e.g. a Comment" do
|
172
172
|
# describe "when no associated class is set, e.g. there's no Article" do
|
data/test/drafter/test_draft.rb
CHANGED
@@ -323,4 +323,64 @@ class TestDraft < Minitest::Unit::TestCase
|
|
323
323
|
end
|
324
324
|
end
|
325
325
|
|
326
|
+
describe "delegating approval" do
|
327
|
+
before do
|
328
|
+
@article = Article.new(:text => "I'm an article.")
|
329
|
+
end
|
330
|
+
|
331
|
+
describe "a non-delegated model" do
|
332
|
+
before do
|
333
|
+
@draft = @article.save_draft
|
334
|
+
end
|
335
|
+
|
336
|
+
it "should return its own draft" do
|
337
|
+
assert_equal(@draft, @draft.approver)
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
describe "to a parent model, when the sub-draft is a draft for" do
|
342
|
+
describe "just a regular model" do
|
343
|
+
before do
|
344
|
+
@comment = Comment.new
|
345
|
+
@article.comments << @comment
|
346
|
+
@article.save_draft
|
347
|
+
@article_draft = Draft.first
|
348
|
+
@comment_draft = Draft.last
|
349
|
+
end
|
350
|
+
|
351
|
+
it "should return the parent" do
|
352
|
+
assert_equal(@article_draft, @comment_draft.approver)
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
describe "a polymorphic model" do
|
357
|
+
before do
|
358
|
+
@article.save_draft
|
359
|
+
@like = Like.new(:likeable => @article) # hack for polymorph
|
360
|
+
@draft = @like.save_draft(@article.draft, :likes)
|
361
|
+
@article_draft = Draft.first
|
362
|
+
@like_draft = Draft.last
|
363
|
+
end
|
364
|
+
|
365
|
+
it "should return the parent" do
|
366
|
+
assert_equal(@article_draft, @like_draft.approver)
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
before do
|
371
|
+
@article.save_draft
|
372
|
+
@like = ReallyLike.new(:likeable => @article) # hack for polymorph
|
373
|
+
@draft = @like.save_draft(@article.draft, :likes)
|
374
|
+
@article_draft = Draft.first
|
375
|
+
@like_draft = Draft.last
|
376
|
+
end
|
377
|
+
|
378
|
+
it "should return the parent" do
|
379
|
+
assert_equal(@article_draft, @like_draft.approver)
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
|
384
|
+
end
|
385
|
+
|
326
386
|
end
|
@@ -81,7 +81,7 @@ class TestSubdrafts < Minitest::Unit::TestCase
|
|
81
81
|
before do
|
82
82
|
@like_count = Like.count
|
83
83
|
@article.save_draft
|
84
|
-
@like = Like.new(:likeable => @article)
|
84
|
+
@like = Like.new(:likeable => @article) # hack for polymorph
|
85
85
|
@draft = @like.save_draft(@article.draft, :likes)
|
86
86
|
@article_draft = Draft.first
|
87
87
|
@like_draft = Draft.last
|
@@ -128,7 +128,7 @@ class TestSubdrafts < Minitest::Unit::TestCase
|
|
128
128
|
before do
|
129
129
|
@really_like_count = ReallyLike.count
|
130
130
|
@article.save_draft
|
131
|
-
@really_like = ReallyLike.new(:likeable => @article)
|
131
|
+
@really_like = ReallyLike.new(:likeable => @article) # hack for polymorph
|
132
132
|
@draft = @really_like.save_draft(@article.draft, :likes)
|
133
133
|
@article_draft = Draft.first
|
134
134
|
@really_like_draft = Draft.last
|
data/test/support/models.rb
CHANGED
@@ -17,7 +17,7 @@ end
|
|
17
17
|
#
|
18
18
|
# We can use this to test out has_many associations.
|
19
19
|
class Comment < ActiveRecord::Base
|
20
|
-
draftable
|
20
|
+
draftable :delegate_approval_to => :article
|
21
21
|
|
22
22
|
belongs_to :article
|
23
23
|
has_many :likes, :as => :likeable
|
@@ -30,7 +30,7 @@ end
|
|
30
30
|
# has_many relationship.
|
31
31
|
class Like < ActiveRecord::Base
|
32
32
|
|
33
|
-
draftable(:polymorphic_as => :likeable)
|
33
|
+
draftable(:polymorphic_as => :likeable, :delegate_approval_to => :likeable)
|
34
34
|
|
35
35
|
belongs_to :likeable, :polymorphic => true
|
36
36
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: drafter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-09-05 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
|
-
requirement: &
|
16
|
+
requirement: &2155591120 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2155591120
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: diffy
|
27
|
-
requirement: &
|
27
|
+
requirement: &2155587140 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2155587140
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: sqlite3
|
38
|
-
requirement: &
|
38
|
+
requirement: &2155586280 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2155586280
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: database_cleaner
|
49
|
-
requirement: &
|
49
|
+
requirement: &2155585300 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2155585300
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: debugger
|
60
|
-
requirement: &
|
60
|
+
requirement: &2155583900 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *2155583900
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: minitest
|
71
|
-
requirement: &
|
71
|
+
requirement: &2155583160 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *2155583160
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: bundler
|
82
|
-
requirement: &
|
82
|
+
requirement: &2155582360 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: 1.0.0
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *2155582360
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: jeweler
|
93
|
-
requirement: &
|
93
|
+
requirement: &2155581640 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ~>
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: 1.6.4
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *2155581640
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: rcov
|
104
|
-
requirement: &
|
104
|
+
requirement: &2155580740 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *2155580740
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: turn
|
115
|
-
requirement: &
|
115
|
+
requirement: &2155579900 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,10 +120,10 @@ dependencies:
|
|
120
120
|
version: '0'
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *2155579900
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: carrierwave
|
126
|
-
requirement: &
|
126
|
+
requirement: &2155572600 !ruby/object:Gem::Requirement
|
127
127
|
none: false
|
128
128
|
requirements:
|
129
129
|
- - ! '>='
|
@@ -131,10 +131,10 @@ dependencies:
|
|
131
131
|
version: '0'
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
|
-
version_requirements: *
|
134
|
+
version_requirements: *2155572600
|
135
135
|
- !ruby/object:Gem::Dependency
|
136
136
|
name: minitest-rails-shoulda
|
137
|
-
requirement: &
|
137
|
+
requirement: &2155571900 !ruby/object:Gem::Requirement
|
138
138
|
none: false
|
139
139
|
requirements:
|
140
140
|
- - ! '>='
|
@@ -142,7 +142,7 @@ dependencies:
|
|
142
142
|
version: '0'
|
143
143
|
type: :development
|
144
144
|
prerelease: false
|
145
|
-
version_requirements: *
|
145
|
+
version_requirements: *2155571900
|
146
146
|
description: A
|
147
147
|
email: dave.hrycyszyn@headlondon.com
|
148
148
|
executables: []
|
@@ -201,7 +201,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
201
201
|
version: '0'
|
202
202
|
segments:
|
203
203
|
- 0
|
204
|
-
hash:
|
204
|
+
hash: 1555687896561378054
|
205
205
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
206
206
|
none: false
|
207
207
|
requirements:
|