activerecord-tablefree 3.0.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.
@@ -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