activerecord-tablefree 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ module ActiveRecord
2
+ module Tablefree
3
+ unless defined?(ActiveRecord::Tablefree::VERSION)
4
+ VERSION = "3.0.0".freeze
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,284 @@
1
+ require 'sqlite3'
2
+ require 'active_record'
3
+ require 'activerecord-tablefree'
4
+ require 'logger'
5
+ require 'spec_helper'
6
+
7
+ def make_tablefree_model(database = nil, nested = nil)
8
+ eval <<EOCLASS
9
+ class Chair < ActiveRecord::Base
10
+ #{database ? "has_no_table :database => :#{database}" : 'has_no_table'}
11
+ column :id, :integer
12
+ column :name, :string
13
+ #{if nested
14
+ '
15
+ has_many :arm_rests
16
+ accepts_nested_attributes_for :arm_rests
17
+ '
18
+ end}
19
+ end
20
+ EOCLASS
21
+ if nested
22
+ eval <<EOCLASS
23
+ class ArmRest < ActiveRecord::Base
24
+ #{database ? "has_no_table :database => :#{database}" : 'has_no_table'}
25
+ belongs_to :chair
26
+ column :id, :integer
27
+ column :chair_id, :integer
28
+ column :name, :string
29
+ end
30
+ EOCLASS
31
+ end
32
+ end
33
+
34
+ def remove_models
35
+ Object.send(:remove_const, :Chair) rescue nil
36
+ Object.send(:remove_const, :ArmRest) rescue nil
37
+ end
38
+
39
+ ActiveRecord::Base.logger = Logger.new(STDERR)
40
+ ActiveRecord::Base.logger.level = Logger::Severity::UNKNOWN
41
+
42
+ shared_examples_for "an active record instance" do
43
+ it { should respond_to :id }
44
+ it { should respond_to :id= }
45
+ it { should respond_to :name }
46
+ it { should respond_to :name= }
47
+ it { should respond_to :update_attributes }
48
+ describe "#attributes=" do
49
+ before(:example){ subject.attributes=({:name => 'Jarl Friis'}) }
50
+ it "assign attributes" do
51
+ expect(subject.name).to eq 'Jarl Friis'
52
+ end
53
+ end
54
+ end
55
+
56
+ shared_examples_for "a nested active record" do
57
+ describe "conllection#build" do
58
+ specify do
59
+ expect(subject.arm_rests.build({:name => 'nice arm_rest'})).to be_an_instance_of(ArmRest)
60
+ end
61
+ end
62
+ describe "conllection#<<" do
63
+ specify do
64
+ expect(subject.arm_rests << ArmRest.new({:name => 'nice arm_rest'})).to have(1).items
65
+ end
66
+ describe 'appending two children' do
67
+ before(:example) do
68
+ subject.arm_rests << [ArmRest.new({:name => 'left'}),
69
+ ArmRest.new({:name => 'right'})]
70
+ end
71
+ it "assigns nested attributes" do
72
+ expect(subject.arm_rests[0].name).to eq 'left'
73
+ expect(subject.arm_rests[1].name).to eq 'right'
74
+ end
75
+ end
76
+ end
77
+ describe "#attributes=" do
78
+ before(:example){ subject.attributes=({ :name => 'Jarl Friis',
79
+ :arm_rests_attributes => [
80
+ {:name => 'left'},
81
+ {:name => 'right'}
82
+ ]
83
+ }) }
84
+ it "assigns attributes" do
85
+ expect(subject.name).to eq 'Jarl Friis'
86
+ end
87
+ it "assigns nested attributes" do
88
+ expect(subject.arm_rests[0].name).to eq 'left'
89
+ expect(subject.arm_rests[1].name).to eq 'right'
90
+ end
91
+ end
92
+ end
93
+
94
+ shared_examples_for "a tablefree model with fail_fast" do
95
+ case ActiveRecord::VERSION::MAJOR
96
+ when 3
97
+ describe "#all" do
98
+ it "raises ActiveRecord::Tablefree::NoDatabase" do
99
+ expect { subject.all }.to raise_exception(ActiveRecord::Tablefree::NoDatabase)
100
+ end
101
+ end
102
+ when 4
103
+ describe "#all" do
104
+ it "raises ActiveRecord::Tablefree::NoDatabase" do
105
+ expect { subject.all }.to_not raise_exception
106
+ end
107
+ end
108
+ describe "#all[]" do
109
+ it "raises ActiveRecord::Tablefree::NoDatabase" do
110
+ expect { subject.all[0] }.to raise_exception(ActiveRecord::Tablefree::NoDatabase)
111
+ end
112
+ end
113
+ end
114
+ describe "#create" do
115
+ it "raises ActiveRecord::Tablefree::NoDatabase" do
116
+ expect { subject.create(:name => 'Jarl') }.to raise_exception(ActiveRecord::Tablefree::NoDatabase)
117
+ end
118
+ end
119
+ describe "#destroy" do
120
+ it "raises ActiveRecord::Tablefree::NoDatabase" do
121
+ expect { subject.destroy(1) }.to raise_exception(ActiveRecord::Tablefree::NoDatabase)
122
+ end
123
+ end
124
+ describe "#destroy_all" do
125
+ it "raises ActiveRecord::Tablefree::NoDatabase" do
126
+ expect { subject.destroy_all }.to raise_exception(ActiveRecord::Tablefree::NoDatabase)
127
+ end
128
+ end
129
+ end
130
+
131
+ shared_examples_for "a tablefree model instance with fail_fast" do
132
+ it_behaves_like "an active record instance"
133
+ describe "#save" do
134
+ it "raises ActiveRecord::Tablefree::NoDatabase" do
135
+ expect { subject.save }.to raise_exception(ActiveRecord::Tablefree::NoDatabase)
136
+ end
137
+ end
138
+ describe "#save!" do
139
+ it "raises ActiveRecord::Tablefree::NoDatabase" do
140
+ expect { subject.save! }.to raise_exception(ActiveRecord::Tablefree::NoDatabase)
141
+ end
142
+ end
143
+ describe "#reload" do
144
+ it "raises ActiveRecord::Tablefree::NoDatabase" do
145
+ expect { subject.reload }.to raise_exception(ActiveRecord::Tablefree::NoDatabase)
146
+ end
147
+ end
148
+ describe "#update_attributes" do
149
+ it "raises ActiveRecord::Tablefree::NoDatabase" do
150
+ expect { subject.update_attributes(:name => 'Jarl') }.to raise_exception(StandardError)
151
+ end
152
+ end
153
+ end
154
+
155
+ describe "Tablefree model with fail_fast" do
156
+ before(:context) {make_tablefree_model(nil, nil)}
157
+ after(:context){ remove_models }
158
+ subject { Chair }
159
+ it_behaves_like "a tablefree model with fail_fast"
160
+ describe "instance" do
161
+ subject { Chair.new(:name => 'Jarl') }
162
+ it_behaves_like "a tablefree model instance with fail_fast"
163
+ end
164
+ end
165
+
166
+ describe "Tablefree nested with fail_fast" do
167
+ before(:context) {make_tablefree_model(nil, true)}
168
+ after(:context){ remove_models }
169
+ subject { Chair }
170
+ it_behaves_like "a tablefree model with fail_fast"
171
+ describe "#new" do
172
+ it "accepts attributes" do
173
+ expect(subject.new(:name => "Jarl")).to be_an_instance_of(subject)
174
+ end
175
+ it "assign attributes" do
176
+ expect(subject.new(:name => "Jarl").name).to eq "Jarl"
177
+ end
178
+ end
179
+ describe "instance" do
180
+ subject { Chair.new(:name => 'Jarl') }
181
+ it_behaves_like "a tablefree model instance with fail_fast"
182
+ it_behaves_like "a nested active record"
183
+ describe "#update_attributes" do
184
+ it "raises ActiveRecord::Tablefree::NoDatabase" do
185
+ expect do
186
+ subject.update_attributes(:arm_rests => {:name => 'nice arm_rest'})
187
+ end.to raise_exception(StandardError)
188
+ end
189
+ end
190
+ end
191
+ describe "instance with nested models" do
192
+ subject do
193
+ Chair.new(:name => "Jarl",
194
+ :arm_rests => [
195
+ ArmRest.new(:name => 'left'),
196
+ ArmRest.new(:name => 'right'),
197
+ ])
198
+ end
199
+ it {should be_an_instance_of(Chair) }
200
+ it {should have(2).arm_rests }
201
+ end
202
+ describe "instance with nested attributes" do
203
+ subject do
204
+ Chair.new(:name => "Jarl",
205
+ :arm_rests_attributes => [
206
+ {:name => 'left'},
207
+ {:name => 'right'},
208
+ ])
209
+ end
210
+ it {should be_an_instance_of(Chair)}
211
+ it {should have(2).arm_rests }
212
+ end
213
+ end
214
+
215
+ ##
216
+ ## Succeeding database
217
+ ##
218
+ shared_examples_for "a model with succeeding database" do
219
+ describe "#all" do
220
+ specify { expect(subject.all).to eq []}
221
+ end
222
+ describe "#create" do
223
+ specify { expect(subject.create(:name => 'Jarl')).to be_an_instance_of(subject) }
224
+ end
225
+ describe "#destroy" do
226
+ specify { expect(subject.destroy(1)).to be_an_instance_of(subject) }
227
+ end
228
+ describe "#destroy_all" do
229
+ specify { expect(subject.destroy_all).to eq [] }
230
+ end
231
+ end
232
+
233
+ shared_examples_for "an instance with succeeding database" do
234
+ it_behaves_like "an active record instance"
235
+
236
+ describe "#save" do
237
+ specify { expect(subject.save).to eq true }
238
+ end
239
+ describe "#save!" do
240
+ specify { expect(subject.save!).to eq true }
241
+ end
242
+ describe "#reload" do
243
+ before { subject.save! }
244
+ specify { expect(subject.reload).to eq subject }
245
+ end
246
+ describe "#update_attributes" do
247
+ specify { expect(subject.update_attributes(:name => 'Jarl Friis')).to eq true }
248
+ end
249
+ end
250
+
251
+ describe "ActiveRecord with real database" do
252
+ ##This is only here to ensure that the shared examples are actually behaving like a real database.
253
+ before(:context) do
254
+ FileUtils.mkdir_p "tmp"
255
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => 'tmp/test.db')
256
+ ActiveRecord::Base.connection.execute("drop table if exists chairs")
257
+ ActiveRecord::Base.connection.execute("create table chairs (id INTEGER PRIMARY KEY, name TEXT )")
258
+
259
+ class Chair < ActiveRecord::Base
260
+ end
261
+ end
262
+ after(:context) do
263
+ remove_models
264
+ ActiveRecord::Base.clear_all_connections!
265
+ end
266
+
267
+ subject { Chair }
268
+ it_behaves_like "a model with succeeding database"
269
+ describe "instance" do
270
+ subject { Chair.new(:name => 'Jarl') }
271
+ it_behaves_like "an instance with succeeding database"
272
+ end
273
+ end
274
+
275
+ describe "Tablefree model with succeeding database" do
276
+ before(:context) { make_tablefree_model(:pretend_success, nil) }
277
+ after(:context){ remove_models }
278
+ subject { Chair }
279
+ it_behaves_like "a model with succeeding database"
280
+ describe "instance" do
281
+ subject { Chair.new(:name => 'Jarl') }
282
+ it_behaves_like "an instance with succeeding database"
283
+ end
284
+ end
@@ -0,0 +1,2 @@
1
+ require 'rspec/collection_matchers'
2
+ require 'byebug'
metadata ADDED
@@ -0,0 +1,300 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: activerecord-tablefree
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jarl Friis
8
+ - Kenneth Kalmer
9
+ - Michal Zima
10
+ - Peter Boling
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+ date: 2017-11-14 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: activerecord
18
+ requirement: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 3.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 3.0.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: bundler
32
+ requirement: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - "~>"
35
+ - !ruby/object:Gem::Version
36
+ version: 1.16.0
37
+ type: :development
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: 1.16.0
44
+ - !ruby/object:Gem::Dependency
45
+ name: rake
46
+ requirement: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ - - ">"
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - - ">"
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ - !ruby/object:Gem::Dependency
65
+ name: sqlite3
66
+ requirement: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '1.3'
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '1.3'
78
+ - !ruby/object:Gem::Dependency
79
+ name: appraisal
80
+ requirement: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '1.0'
85
+ type: :development
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '1.0'
92
+ - !ruby/object:Gem::Dependency
93
+ name: cucumber
94
+ requirement: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: '1.1'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '1.1'
106
+ - !ruby/object:Gem::Dependency
107
+ name: rspec
108
+ requirement: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: '3.1'
113
+ type: :development
114
+ prerelease: false
115
+ version_requirements: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '3.1'
120
+ - !ruby/object:Gem::Dependency
121
+ name: rspec-collection_matchers
122
+ requirement: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - "~>"
125
+ - !ruby/object:Gem::Version
126
+ version: '1.0'
127
+ type: :development
128
+ prerelease: false
129
+ version_requirements: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '1.0'
134
+ - !ruby/object:Gem::Dependency
135
+ name: aruba
136
+ requirement: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: '0.5'
141
+ type: :development
142
+ prerelease: false
143
+ version_requirements: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '0.5'
148
+ - !ruby/object:Gem::Dependency
149
+ name: nokogiri
150
+ requirement: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - "~>"
153
+ - !ruby/object:Gem::Version
154
+ version: '1.0'
155
+ type: :development
156
+ prerelease: false
157
+ version_requirements: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - "~>"
160
+ - !ruby/object:Gem::Version
161
+ version: '1.0'
162
+ - !ruby/object:Gem::Dependency
163
+ name: capybara
164
+ requirement: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - "~>"
167
+ - !ruby/object:Gem::Version
168
+ version: '0.0'
169
+ type: :development
170
+ prerelease: false
171
+ version_requirements: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - "~>"
174
+ - !ruby/object:Gem::Version
175
+ version: '0.0'
176
+ - !ruby/object:Gem::Dependency
177
+ name: gem-release
178
+ requirement: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - "~>"
181
+ - !ruby/object:Gem::Version
182
+ version: 0.7.4
183
+ type: :development
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - "~>"
188
+ - !ruby/object:Gem::Version
189
+ version: 0.7.4
190
+ - !ruby/object:Gem::Dependency
191
+ name: wwtd
192
+ requirement: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ version: '0'
197
+ type: :development
198
+ prerelease: false
199
+ version_requirements: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
204
+ - !ruby/object:Gem::Dependency
205
+ name: rails
206
+ requirement: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - ">="
209
+ - !ruby/object:Gem::Version
210
+ version: '0'
211
+ type: :development
212
+ prerelease: false
213
+ version_requirements: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: '0'
218
+ - !ruby/object:Gem::Dependency
219
+ name: listen
220
+ requirement: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ version: '0'
225
+ type: :development
226
+ prerelease: false
227
+ version_requirements: !ruby/object:Gem::Requirement
228
+ requirements:
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ version: '0'
232
+ description: ActiveRecord Tablefree Models provides a simple mixin for creating models
233
+ that are not bound to the database. This approach is useful for taking advantage
234
+ of the features of ActiveRecord such as validation, relationships, etc.
235
+ email:
236
+ - jarl@softace.dk
237
+ - peter.boling@gmail.com
238
+ executables: []
239
+ extensions: []
240
+ extra_rdoc_files: []
241
+ files:
242
+ - ".gitignore"
243
+ - ".rspec"
244
+ - ".travis.yml"
245
+ - Appraisals
246
+ - Gemfile
247
+ - LICENSE.txt
248
+ - README.md
249
+ - Rakefile
250
+ - activerecord-tablefree.gemspec
251
+ - features/basic_integration.feature
252
+ - features/step_definitions/rails_steps.rb
253
+ - features/step_definitions/tablefree.rb
254
+ - features/step_definitions/web_steps.rb
255
+ - features/support/env.rb
256
+ - features/support/paths.rb
257
+ - features/support/rails.rb
258
+ - features/support/selectors.rb
259
+ - gemfiles/rails50.gemfile
260
+ - gemfiles/rails51.gemfile
261
+ - init.rb
262
+ - lib/activerecord-tablefree.rb
263
+ - lib/activerecord-tablefree/version.rb
264
+ - spec/lib/activerecord-tablefree_spec.rb
265
+ - spec/spec_helper.rb
266
+ homepage: https://github.com/boltthreads/activerecord-tablefree
267
+ licenses:
268
+ - MIT
269
+ metadata: {}
270
+ post_install_message:
271
+ rdoc_options: []
272
+ require_paths:
273
+ - lib
274
+ required_ruby_version: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - ">="
277
+ - !ruby/object:Gem::Version
278
+ version: '0'
279
+ required_rubygems_version: !ruby/object:Gem::Requirement
280
+ requirements:
281
+ - - ">="
282
+ - !ruby/object:Gem::Version
283
+ version: '0'
284
+ requirements: []
285
+ rubyforge_project:
286
+ rubygems_version: 2.6.14
287
+ signing_key:
288
+ specification_version: 4
289
+ summary: A library for implementing tablefree ActiveRecord models
290
+ test_files:
291
+ - features/basic_integration.feature
292
+ - features/step_definitions/rails_steps.rb
293
+ - features/step_definitions/tablefree.rb
294
+ - features/step_definitions/web_steps.rb
295
+ - features/support/env.rb
296
+ - features/support/paths.rb
297
+ - features/support/rails.rb
298
+ - features/support/selectors.rb
299
+ - spec/lib/activerecord-tablefree_spec.rb
300
+ - spec/spec_helper.rb