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 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: