has_draft 1.2.0 → 1.3.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.
- checksums.yaml +15 -0
- data/Appraisals +1 -1
- data/Gemfile +1 -1
- data/Gemfile.lock +37 -27
- data/README.rdoc +58 -0
- data/lib/has_draft.rb +10 -4
- data/lib/has_draft/version.rb +1 -1
- data/spec/db/schema.rb +18 -0
- data/spec/db/test.sqlite3 +0 -0
- data/spec/has_draft_spec.rb +22 -0
- data/spec/spec_helper.rb +10 -0
- metadata +53 -31
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZTU4ZWMwNzY0M2I5NzhlMDUxNWE2ZGQ4NDkyZThhZGYwYzQ5MTQ0NQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YTVhZTQ1ZTc5MWQ1MDRmZmE0ZGU0ODlkMmM1NTY4OTZmYzBlMGViMg==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NTUzNzRkMjkyMWIyYzBkOWFjYTFlZTMzZjkxNWI4ZjYzMTE0MTM5NDc2NGE0
|
10
|
+
NWNiYTUwOWZkYjViOTFmOTQxYzQyYjY0YmMxYmM0MTBkMTRhN2QzYzJjNTQ2
|
11
|
+
YjhlMWFiM2VjMzhiMzI3Mzk3MTA5YWYxZTJmODRhZjgzYzU4NDM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
Y2JkNDE3ZTZiZmU5M2EzMmVjNTE2MDc5MTVmZjFiOTc0OTU2YTk4Mjg4YjY0
|
14
|
+
NzgxZmMwODIxMmMyMzNiNjk1OTI5NWU5NDQxZDMzYjFmNDYzYjdhMjdmMDNj
|
15
|
+
NDA1ZTdmY2NhOTlmNTdlNWFjYjIwOGMwOGQ4OGRiOTFjOWY0ZDM=
|
data/Appraisals
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,44 +1,54 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
has_draft (1.
|
4
|
+
has_draft (1.2.0)
|
5
5
|
activerecord (>= 3.0.0)
|
6
6
|
activesupport (>= 3.0.0)
|
7
7
|
|
8
8
|
GEM
|
9
|
-
remote:
|
9
|
+
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
activemodel (
|
12
|
-
activesupport (=
|
13
|
-
builder (~>
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
activesupport (=
|
18
|
-
arel (~>
|
19
|
-
|
20
|
-
activesupport (
|
11
|
+
activemodel (4.0.0)
|
12
|
+
activesupport (= 4.0.0)
|
13
|
+
builder (~> 3.1.0)
|
14
|
+
activerecord (4.0.0)
|
15
|
+
activemodel (= 4.0.0)
|
16
|
+
activerecord-deprecated_finders (~> 1.0.2)
|
17
|
+
activesupport (= 4.0.0)
|
18
|
+
arel (~> 4.0.0)
|
19
|
+
activerecord-deprecated_finders (1.0.3)
|
20
|
+
activesupport (4.0.0)
|
21
|
+
i18n (~> 0.6, >= 0.6.4)
|
22
|
+
minitest (~> 4.2)
|
23
|
+
multi_json (~> 1.3)
|
24
|
+
thread_safe (~> 0.1)
|
25
|
+
tzinfo (~> 0.3.37)
|
21
26
|
appraisal (0.4.1)
|
22
27
|
bundler
|
23
28
|
rake
|
24
|
-
arel (
|
25
|
-
|
26
|
-
|
29
|
+
arel (4.0.0)
|
30
|
+
atomic (1.1.14)
|
31
|
+
builder (3.1.4)
|
32
|
+
diff-lcs (1.2.4)
|
27
33
|
factory_girl (1.3.3)
|
28
34
|
faker (0.9.5)
|
29
35
|
i18n (~> 0.4)
|
30
|
-
i18n (0.5
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
rspec-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
rspec-
|
40
|
-
|
41
|
-
|
36
|
+
i18n (0.6.5)
|
37
|
+
minitest (4.7.5)
|
38
|
+
multi_json (1.8.0)
|
39
|
+
rake (10.1.0)
|
40
|
+
rspec (2.14.1)
|
41
|
+
rspec-core (~> 2.14.0)
|
42
|
+
rspec-expectations (~> 2.14.0)
|
43
|
+
rspec-mocks (~> 2.14.0)
|
44
|
+
rspec-core (2.14.5)
|
45
|
+
rspec-expectations (2.14.3)
|
46
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
47
|
+
rspec-mocks (2.14.3)
|
48
|
+
sqlite3 (1.3.8)
|
49
|
+
thread_safe (0.1.3)
|
50
|
+
atomic
|
51
|
+
tzinfo (0.3.37)
|
42
52
|
|
43
53
|
PLATFORMS
|
44
54
|
ruby
|
data/README.rdoc
CHANGED
@@ -115,6 +115,64 @@ In your Gemfile:
|
|
115
115
|
class Article < ActiveRecord::Base
|
116
116
|
has_draft :class_name => 'Copy', :foreign_key => :news_article_id, :table_name => 'article_copies'
|
117
117
|
end
|
118
|
+
|
119
|
+
## Single Table Inheritance Example
|
120
|
+
class InitialSchema < ActiveRecord::Migration
|
121
|
+
|
122
|
+
[:elements, :element_drafts].each do |table_name|
|
123
|
+
create_table table_name, :force => true do |t|
|
124
|
+
t.integer :element_id if table_name == :element_drafts
|
125
|
+
|
126
|
+
t.string :title
|
127
|
+
t.text :content
|
128
|
+
t.string :type
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
class Element < ActiveRecord::Base
|
135
|
+
class Draft < ActiveRecord::Base
|
136
|
+
def element_icon_path
|
137
|
+
'assets/images/default.png'
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
module HasDraftCallbacks
|
142
|
+
def before_instantiate_draft
|
143
|
+
# Need to append ::Draft so that it knows to use the Draft class
|
144
|
+
self.draft.type = self.type + '::Draft'
|
145
|
+
end
|
146
|
+
|
147
|
+
def before_replace_with_draft
|
148
|
+
# We are storing drafts with the ::Draft on the end so we have to strip it
|
149
|
+
self.type = self.draft.type.split(':')[0]
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
class BlueElement < Element
|
155
|
+
has_draft :belongs_to => :element, :extends => Element::Draft do
|
156
|
+
def element_icon_path
|
157
|
+
'assets/images/blue.png'
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
include Element::HasDraftCallbacks
|
162
|
+
end
|
163
|
+
|
164
|
+
class UnknownElement < Element
|
165
|
+
has_draft :belongs_to => :element, :extends => Element::Draft
|
166
|
+
|
167
|
+
include Element::HasDraftCallbacks
|
168
|
+
end
|
169
|
+
|
170
|
+
This allows us to call element_draft.element on any subclass of Element::Draft
|
171
|
+
instead of needing to know to call element_draft.blue_element or element_draft.unknown_element.
|
172
|
+
|
173
|
+
Note: calling has_draft will have no effect if the parent class has already executed has_draft.
|
174
|
+
|
175
|
+
|
118
176
|
|
119
177
|
== Method Callbacks
|
120
178
|
|
data/lib/has_draft.rb
CHANGED
@@ -23,16 +23,22 @@ module HasDraft
|
|
23
23
|
scope :with_draft, lambda { includes(:draft).where("#{draft_table_name}.id IS NOT NULL") }
|
24
24
|
scope :without_draft, lambda { includes(:draft).where("#{draft_table_name}.id IS NULL") }
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
|
+
# Default parent class to ActiveRecord::Base
|
28
|
+
options[:extends] = ActiveRecord::Base if options[:extends].nil?
|
29
|
+
|
27
30
|
# Dynamically Create Model::Draft Class
|
28
|
-
const_set(draft_class_name, Class.new(
|
31
|
+
const_set(draft_class_name, Class.new(options[:extends]))
|
29
32
|
|
30
33
|
draft_class.cattr_accessor :original_class
|
31
34
|
draft_class.original_class = self
|
32
35
|
draft_class.table_name = draft_table_name
|
33
|
-
|
36
|
+
|
37
|
+
# Default parent association
|
38
|
+
options[:belongs_to] = self.to_s.demodulize.underscore.to_sym if options[:belongs_to].nil?
|
39
|
+
|
34
40
|
# Draft Parent Association
|
35
|
-
draft_class.belongs_to
|
41
|
+
draft_class.belongs_to options[:belongs_to], :class_name => "::#{self.to_s}", :foreign_key => draft_foreign_key
|
36
42
|
|
37
43
|
# Block extension
|
38
44
|
draft_class.class_eval(&block) if block_given?
|
data/lib/has_draft/version.rb
CHANGED
data/spec/db/schema.rb
CHANGED
@@ -10,5 +10,23 @@ ActiveRecord::Schema.define(:version => 0) do
|
|
10
10
|
t.date :post_date
|
11
11
|
end
|
12
12
|
end
|
13
|
+
|
14
|
+
[:posts, :post_drafts].each do |table_name|
|
15
|
+
create_table table_name, :force => true do |t|
|
16
|
+
t.references :post if table_name == :post_drafts
|
17
|
+
|
18
|
+
t.string :title
|
19
|
+
t.text :body
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
[:pages, :page_drafts].each do |table_name|
|
24
|
+
create_table table_name, :force => true do |t|
|
25
|
+
t.references :page if table_name == :page_drafts
|
26
|
+
|
27
|
+
t.string :title
|
28
|
+
t.text :body
|
29
|
+
end
|
30
|
+
end
|
13
31
|
|
14
32
|
end
|
data/spec/db/test.sqlite3
CHANGED
Binary file
|
data/spec/has_draft_spec.rb
CHANGED
@@ -79,5 +79,27 @@ describe HasDraft do
|
|
79
79
|
end
|
80
80
|
end
|
81
81
|
end
|
82
|
+
|
83
|
+
context "Draft class extends" do
|
84
|
+
|
85
|
+
it "ActiveRecord::Base when no options are passed" do
|
86
|
+
Article::Draft.superclass.should == ActiveRecord::Base
|
87
|
+
end
|
88
|
+
|
89
|
+
it "the class passed in with the :extends option" do
|
90
|
+
BlogPost::Draft.superclass.should == Post
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context "Draft class belongs to" do
|
95
|
+
|
96
|
+
it "self when :belongs_to is not specified" do
|
97
|
+
Article::Draft.reflect_on_association(:article).macro.should == :belongs_to
|
98
|
+
end
|
99
|
+
|
100
|
+
it "the model passed in with the :belongs_to option" do
|
101
|
+
BlogPost::Draft.reflect_on_association(:post).macro.should == :belongs_to
|
102
|
+
end
|
103
|
+
end
|
82
104
|
|
83
105
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -20,5 +20,15 @@ class Article < ActiveRecord::Base
|
|
20
20
|
has_draft
|
21
21
|
end
|
22
22
|
|
23
|
+
# Empty class to test ability of Draft class to extend other classes
|
24
|
+
class Post < ActiveRecord::Base
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
# Model for testing ability to have the draft extend a different class
|
29
|
+
class BlogPost < Post
|
30
|
+
has_draft :extends => Post, :belongs_to => :post
|
31
|
+
end
|
32
|
+
|
23
33
|
# Load Factories:
|
24
34
|
Dir[File.join(File.dirname(__FILE__), "factories/**/*.rb")].each {|f| require f}
|
metadata
CHANGED
@@ -1,104 +1,127 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: has_draft
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.3.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Ben Hughes
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-10-05 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activesupport
|
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: 3.0.0
|
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: 3.0.0
|
25
27
|
- !ruby/object:Gem::Dependency
|
26
28
|
name: activerecord
|
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: 3.0.0
|
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: 3.0.0
|
36
41
|
- !ruby/object:Gem::Dependency
|
37
42
|
name: rspec
|
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: '2.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: '2.0'
|
47
55
|
- !ruby/object:Gem::Dependency
|
48
56
|
name: factory_girl
|
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: 1.3.1
|
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: 1.3.1
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: faker
|
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.9.1
|
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.9.1
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: sqlite3
|
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: 1.3.4
|
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: 1.3.4
|
80
97
|
- !ruby/object:Gem::Dependency
|
81
98
|
name: appraisal
|
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: 0.4.0
|
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: 0.4.0
|
91
111
|
- !ruby/object:Gem::Dependency
|
92
112
|
name: rake
|
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
|
description: Allows for your ActiveRecord models to have drafts which are stored in
|
103
126
|
a separate duplicate table.
|
104
127
|
email: ben@railsgarden.com
|
@@ -124,27 +147,26 @@ files:
|
|
124
147
|
- init.rb
|
125
148
|
homepage: http://github.com/rubiety/has_draft
|
126
149
|
licenses: []
|
150
|
+
metadata: {}
|
127
151
|
post_install_message:
|
128
152
|
rdoc_options: []
|
129
153
|
require_paths:
|
130
154
|
- lib
|
131
155
|
required_ruby_version: !ruby/object:Gem::Requirement
|
132
|
-
none: false
|
133
156
|
requirements:
|
134
157
|
- - ! '>='
|
135
158
|
- !ruby/object:Gem::Version
|
136
159
|
version: '0'
|
137
160
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
|
-
none: false
|
139
161
|
requirements:
|
140
162
|
- - ! '>='
|
141
163
|
- !ruby/object:Gem::Version
|
142
164
|
version: 1.3.4
|
143
165
|
requirements: []
|
144
166
|
rubyforge_project: has_draft
|
145
|
-
rubygems_version:
|
167
|
+
rubygems_version: 2.0.6
|
146
168
|
signing_key:
|
147
|
-
specification_version:
|
169
|
+
specification_version: 4
|
148
170
|
summary: Attached draft model to your ActiveRecord models.
|
149
171
|
test_files: []
|
150
172
|
has_rdoc:
|