has_draft 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -11,5 +11,5 @@ appraise "3.2" do
11
11
  end
12
12
 
13
13
  appraise "4.0" do
14
- gem "rails", "~> 4.0.0.beta1"
14
+ gem "rails", "~> 4.0.0"
15
15
  end
data/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
- source "http://rubygems.org"
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec
data/Gemfile.lock CHANGED
@@ -1,44 +1,54 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- has_draft (1.1.0)
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: http://rubygems.org/
9
+ remote: https://rubygems.org/
10
10
  specs:
11
- activemodel (3.0.20)
12
- activesupport (= 3.0.20)
13
- builder (~> 2.1.2)
14
- i18n (~> 0.5.0)
15
- activerecord (3.0.20)
16
- activemodel (= 3.0.20)
17
- activesupport (= 3.0.20)
18
- arel (~> 2.0.10)
19
- tzinfo (~> 0.3.23)
20
- activesupport (3.0.20)
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 (2.0.10)
25
- builder (2.1.2)
26
- diff-lcs (1.1.2)
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.0)
31
- rake (0.9.2.2)
32
- rspec (2.5.0)
33
- rspec-core (~> 2.5.0)
34
- rspec-expectations (~> 2.5.0)
35
- rspec-mocks (~> 2.5.0)
36
- rspec-core (2.5.1)
37
- rspec-expectations (2.5.0)
38
- diff-lcs (~> 1.1.2)
39
- rspec-mocks (2.5.0)
40
- sqlite3 (1.3.5)
41
- tzinfo (0.3.35)
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(ActiveRecord::Base))
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 self.to_s.demodulize.underscore.to_sym, :class_name => "::#{self.to_s}", :foreign_key => draft_foreign_key
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?
@@ -1,3 +1,3 @@
1
1
  module HasDraft
2
- VERSION = "1.2.0"
2
+ VERSION = "1.3.0"
3
3
  end
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
@@ -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.2.0
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-03-01 00:00:00.000000000 Z
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: &70326605361340 !ruby/object:Gem::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: *70326605361340
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: &70326605360140 !ruby/object:Gem::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: *70326605360140
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: &70326605359500 !ruby/object:Gem::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: *70326605359500
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: &70326605358820 !ruby/object:Gem::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: *70326605358820
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: &70326605357720 !ruby/object:Gem::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: *70326605357720
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: &70326605356960 !ruby/object:Gem::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: *70326605356960
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: &70326605356220 !ruby/object:Gem::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: *70326605356220
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: &70326605355540 !ruby/object:Gem::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: *70326605355540
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: 1.8.16
167
+ rubygems_version: 2.0.6
146
168
  signing_key:
147
- specification_version: 3
169
+ specification_version: 4
148
170
  summary: Attached draft model to your ActiveRecord models.
149
171
  test_files: []
150
172
  has_rdoc: