activerecord-tableless 1.0.2 → 1.1.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.
- data/.rspec +1 -0
- data/README.md +5 -0
- data/Rakefile +9 -2
- data/activerecord-tableless.gemspec +2 -1
- data/lib/activerecord-tableless.rb +98 -16
- data/spec/lib/activerecord-tableless_spec.rb +155 -0
- metadata +23 -4
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color --backtrace --format doc
|
data/README.md
CHANGED
@@ -59,6 +59,11 @@ For Rails 2.3.x series you need to add this line in the top of your model file.
|
|
59
59
|
|
60
60
|
require 'activerecord-tableless'
|
61
61
|
|
62
|
+
If you wish (this is not recommended), you can pretend you have a succeeding database by using
|
63
|
+
|
64
|
+
has_no_table :database => :pretend_succes
|
65
|
+
|
66
|
+
|
62
67
|
|
63
68
|
Development
|
64
69
|
-----------
|
data/Rakefile
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
2
|
require 'appraisal'
|
3
3
|
require 'rake/testtask'
|
4
|
+
require 'rspec/core/rake_task'
|
4
5
|
require 'cucumber/rake/task'
|
5
6
|
|
6
7
|
desc 'Default: clean, all.'
|
@@ -9,10 +10,10 @@ task :default => [:clean, :all]
|
|
9
10
|
desc 'Test the activerecord-tableless on all supported Rails versions.'
|
10
11
|
task :all do |t|
|
11
12
|
if ENV['BUNDLE_GEMFILE']
|
12
|
-
exec('rake test cucumber')
|
13
|
+
exec('rake test spec cucumber')
|
13
14
|
else
|
14
15
|
Rake::Task["appraisal:install"].execute
|
15
|
-
exec('rake appraisal test cucumber')
|
16
|
+
exec('rake appraisal test spec cucumber')
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
@@ -23,6 +24,12 @@ Rake::TestTask.new(:test) do |t|
|
|
23
24
|
t.verbose = true
|
24
25
|
end
|
25
26
|
|
27
|
+
desc "Run specs"
|
28
|
+
RSpec::Core::RakeTask.new do |t|
|
29
|
+
t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
|
30
|
+
# Put spec opts in a file named .rspec in root
|
31
|
+
end
|
32
|
+
|
26
33
|
desc 'Run integration test'
|
27
34
|
Cucumber::Rake::Task.new do |t|
|
28
35
|
t.cucumber_opts = %w{--format progress}
|
@@ -10,7 +10,7 @@ Gem::Specification.new do |gem|
|
|
10
10
|
gem.files = `git ls-files`.split($\)
|
11
11
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
12
12
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
13
|
-
gem.version = "1.0
|
13
|
+
gem.version = "1.1.0"
|
14
14
|
gem.has_rdoc = true
|
15
15
|
|
16
16
|
gem.require_paths = ["lib"]
|
@@ -26,6 +26,7 @@ Gem::Specification.new do |gem|
|
|
26
26
|
|
27
27
|
gem.add_development_dependency('appraisal', '~> 0.4')
|
28
28
|
gem.add_development_dependency('cucumber', '~> 1.1')
|
29
|
+
gem.add_development_dependency("rspec")
|
29
30
|
gem.add_development_dependency('launchy', '~> 2.1')
|
30
31
|
gem.add_development_dependency('aruba', '>= 0.5')
|
31
32
|
gem.add_development_dependency('capybara')
|
@@ -29,6 +29,11 @@ module ActiveRecord
|
|
29
29
|
#
|
30
30
|
module Tableless
|
31
31
|
|
32
|
+
class Exception < StandardError
|
33
|
+
end
|
34
|
+
class NoDatabase < Exception
|
35
|
+
end
|
36
|
+
|
32
37
|
def self.included( base ) #:nodoc:
|
33
38
|
base.send :extend, ActsMethods
|
34
39
|
end
|
@@ -37,17 +42,22 @@ module ActiveRecord
|
|
37
42
|
|
38
43
|
# A model that needs to be tableless will call this method to indicate
|
39
44
|
# it.
|
40
|
-
def has_no_table
|
45
|
+
def has_no_table(options = {:database => :fail_fast})
|
46
|
+
raise ArgumentError.new("Invalid database option '#{options[:database]}'") unless [:fail_fast, :pretend_succes].member? options[:database]
|
41
47
|
# keep our options handy
|
42
|
-
if
|
43
|
-
write_inheritable_attribute(
|
44
|
-
:
|
45
|
-
|
48
|
+
if ActiveRecord::VERSION::STRING < "3.1.0"
|
49
|
+
write_inheritable_attribute(:tableless_options,
|
50
|
+
{ :database => options[:database],
|
51
|
+
:columns => []
|
52
|
+
}
|
46
53
|
)
|
47
54
|
class_inheritable_reader :tableless_options
|
48
55
|
else
|
49
56
|
class_attribute :tableless_options
|
50
|
-
self.tableless_options = {
|
57
|
+
self.tableless_options = {
|
58
|
+
:database => options[:database],
|
59
|
+
:columns => []
|
60
|
+
}
|
51
61
|
end
|
52
62
|
|
53
63
|
# extend
|
@@ -85,15 +95,59 @@ module ActiveRecord
|
|
85
95
|
end
|
86
96
|
end
|
87
97
|
|
88
|
-
%w(
|
98
|
+
%w(destroy destroy_all).each do |m|
|
89
99
|
eval %{
|
90
100
|
def #{m}(*args)
|
91
|
-
|
92
|
-
|
101
|
+
case tableless_options[:database]
|
102
|
+
when :pretend_succes
|
103
|
+
self
|
104
|
+
when :fail_fast
|
105
|
+
raise NoDatabase.new("Can't ##{m} on Tableless class")
|
106
|
+
end
|
93
107
|
end
|
94
108
|
}
|
95
109
|
end
|
96
110
|
|
111
|
+
if ActiveRecord::VERSION::STRING < "3.0"
|
112
|
+
def find_with_ids(*args)
|
113
|
+
case tableless_options[:database]
|
114
|
+
when :pretend_succes
|
115
|
+
raise ActiveRecord::RecordNotFound.new("Couldn't find #{self} with ID=#{args[0].to_s}")
|
116
|
+
|
117
|
+
when :fail_fast
|
118
|
+
raise NoDatabase.new("Can't #find_from_ids on Tableless class")
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def find_every(*args)
|
123
|
+
case tableless_options[:database]
|
124
|
+
when :pretend_succes
|
125
|
+
[]
|
126
|
+
when :fail_fast
|
127
|
+
raise NoDatabase.new("Can't #find_every on Tableless class")
|
128
|
+
end
|
129
|
+
end
|
130
|
+
else ## ActiveRecord::VERSION::STRING >= "3.0"
|
131
|
+
def all(*args)
|
132
|
+
case tableless_options[:database]
|
133
|
+
when :pretend_succes
|
134
|
+
[]
|
135
|
+
when :fail_fast
|
136
|
+
raise NoDatabase.new("Can't #find_every on Tableless class")
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def transaction(&block)
|
143
|
+
case tableless_options[:database]
|
144
|
+
when :pretend_succes
|
145
|
+
yield
|
146
|
+
when :fail_fast
|
147
|
+
raise NoDatabase.new("Can't #transaction on Tableless class")
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
97
151
|
def tableless?
|
98
152
|
true
|
99
153
|
end
|
@@ -125,13 +179,41 @@ module ActiveRecord
|
|
125
179
|
attributes.to_a.collect{|(name,value)| escaped_var_name(name, prefix) + "=" + escape_for_url(value) if value }.compact.join("&")
|
126
180
|
end
|
127
181
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
182
|
+
def create(*args)
|
183
|
+
case self.class.tableless_options[:database]
|
184
|
+
when :pretend_succes
|
185
|
+
true
|
186
|
+
when :fail_fast
|
187
|
+
raise NoDatabase.new("Can't #create a Tableless object")
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def update(*args)
|
192
|
+
case self.class.tableless_options[:database]
|
193
|
+
when :pretend_succes
|
194
|
+
true
|
195
|
+
when :fail_fast
|
196
|
+
raise NoDatabase.new("Can't #update a Tableless object")
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def destroy
|
201
|
+
case self.class.tableless_options[:database]
|
202
|
+
when :pretend_succes
|
203
|
+
@destroyed = true
|
204
|
+
freeze
|
205
|
+
when :fail_fast
|
206
|
+
raise NoDatabase.new("Can't #destroy a Tableless object")
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def reload(*args)
|
211
|
+
case self.class.tableless_options[:database]
|
212
|
+
when :pretend_succes
|
213
|
+
self
|
214
|
+
when :fail_fast
|
215
|
+
raise NoDatabase.new("Can't #reload a Tableless object")
|
216
|
+
end
|
135
217
|
end
|
136
218
|
|
137
219
|
private
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'sqlite3'
|
2
|
+
require 'active_record'
|
3
|
+
require 'activerecord-tableless'
|
4
|
+
require 'logger'
|
5
|
+
|
6
|
+
ActiveRecord::Base.logger = Logger.new(STDERR)
|
7
|
+
ActiveRecord::Base.logger.level = Logger::Severity::UNKNOWN
|
8
|
+
|
9
|
+
class ChairFailure < ActiveRecord::Base
|
10
|
+
has_no_table
|
11
|
+
column :id, :integer
|
12
|
+
column :name, :string
|
13
|
+
end
|
14
|
+
|
15
|
+
class ChairPretend < ActiveRecord::Base
|
16
|
+
has_no_table :database => :pretend_succes
|
17
|
+
column :id, :integer
|
18
|
+
column :name, :string
|
19
|
+
end
|
20
|
+
|
21
|
+
FileUtils.mkdir_p "tmp"
|
22
|
+
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => 'tmp/test.db')
|
23
|
+
ActiveRecord::Base.connection.execute("drop table if exists chairs")
|
24
|
+
ActiveRecord::Base.connection.execute("create table chairs (id INTEGER PRIMARY KEY, name TEXT )")
|
25
|
+
|
26
|
+
class Chair < ActiveRecord::Base
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "tableless attributes" do
|
30
|
+
|
31
|
+
subject { ChairFailure.new }
|
32
|
+
it { should respond_to :id }
|
33
|
+
it { should respond_to :id= }
|
34
|
+
it { should respond_to :name }
|
35
|
+
it { should respond_to :name= }
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "tableless with fail_fast" do
|
40
|
+
let!(:klass) { ChairFailure }
|
41
|
+
subject { ChairFailure.new }
|
42
|
+
|
43
|
+
describe "class" do
|
44
|
+
if ActiveRecord::VERSION::STRING < "3.0"
|
45
|
+
describe "#find" do
|
46
|
+
it "raises ActiveRecord::Tableless::NoDatabase" do
|
47
|
+
expect { klass.find(1) }.to raise_exception(ActiveRecord::Tableless::NoDatabase)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
describe "#find(:all)" do
|
51
|
+
it "raises ActiveRecord::Tableless::NoDatabase" do
|
52
|
+
expect { klass.find(:all) }.to raise_exception(ActiveRecord::Tableless::NoDatabase)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
else ## ActiveRecord::VERSION::STRING >= "3.0"
|
56
|
+
describe "#all" do
|
57
|
+
it "raises ActiveRecord::Tableless::NoDatabase" do
|
58
|
+
expect { klass.all }.to raise_exception(ActiveRecord::Tableless::NoDatabase)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
describe "#create" do
|
63
|
+
it "raises ActiveRecord::Tableless::NoDatabase" do
|
64
|
+
expect { klass.create(:name => 'Jarl') }.to raise_exception(ActiveRecord::Tableless::NoDatabase)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
describe "#destroy" do
|
68
|
+
it "raises ActiveRecord::Tableless::NoDatabase" do
|
69
|
+
expect { klass.destroy(1) }.to raise_exception(ActiveRecord::Tableless::NoDatabase)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
describe "#destroy_all" do
|
73
|
+
it "raises ActiveRecord::Tableless::NoDatabase" do
|
74
|
+
expect { klass.destroy_all }.to raise_exception(ActiveRecord::Tableless::NoDatabase)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "#save" do
|
80
|
+
it "raises ActiveRecord::Tableless::NoDatabase" do
|
81
|
+
expect { subject.save }.to raise_exception(ActiveRecord::Tableless::NoDatabase)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
describe "#save!" do
|
85
|
+
it "raises ActiveRecord::Tableless::NoDatabase" do
|
86
|
+
expect { subject.save! }.to raise_exception(ActiveRecord::Tableless::NoDatabase)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
describe "#reload" do
|
90
|
+
it "raises ActiveRecord::Tableless::NoDatabase" do
|
91
|
+
expect { subject.reload }.to raise_exception(ActiveRecord::Tableless::NoDatabase)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
describe "#update_attributes" do
|
95
|
+
it "raises ActiveRecord::Tableless::NoDatabase" do
|
96
|
+
expect { subject.update_attributes(:name => 'Jarl') }.to raise_exception(StandardError)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
shared_examples_for "a succeeding database" do
|
102
|
+
|
103
|
+
describe "class" do
|
104
|
+
if ActiveRecord::VERSION::STRING < "3.0"
|
105
|
+
describe "#find" do
|
106
|
+
it "raises ActiveRecord::RecordNotFound" do
|
107
|
+
expect { klass.find(314) }.to raise_exception(ActiveRecord::RecordNotFound)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
describe "#find(:all)" do
|
111
|
+
specify { klass.find(:all) == []}
|
112
|
+
end
|
113
|
+
else ## ActiveRecord::VERSION::STRING >= "3.0"
|
114
|
+
describe "#all" do
|
115
|
+
specify { klass.all == []}
|
116
|
+
end
|
117
|
+
end
|
118
|
+
describe "#create" do
|
119
|
+
specify { klass.create(:name => 'Jarl') == true }
|
120
|
+
end
|
121
|
+
describe "#destroy" do
|
122
|
+
specify { klass.destroy(1) == true }
|
123
|
+
end
|
124
|
+
describe "#destroy_all" do
|
125
|
+
specify { klass.destroy_all == true }
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe "#save" do
|
130
|
+
specify { subject.save.should == true }
|
131
|
+
end
|
132
|
+
describe "#save!" do
|
133
|
+
specify { subject.save!.should == true }
|
134
|
+
end
|
135
|
+
describe "#reload" do
|
136
|
+
before { subject.save! }
|
137
|
+
specify { subject.reload.should == subject }
|
138
|
+
end
|
139
|
+
describe "#update_attributes" do
|
140
|
+
specify { subject.update_attributes(:name => 'Jarl Friis').should == true }
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe "tableless with real database" do
|
145
|
+
##This is only here to ensure that the shared examples are actually behaving like a real database.
|
146
|
+
let!(:klass) { Chair }
|
147
|
+
subject { Chair.new(:name => 'Jarl') }
|
148
|
+
it_behaves_like "a succeeding database"
|
149
|
+
end
|
150
|
+
|
151
|
+
describe "tableless with succeeding database" do
|
152
|
+
let!(:klass) { ChairPretend }
|
153
|
+
subject { ChairPretend.new(:name => 'Jarl') }
|
154
|
+
it_behaves_like "a succeeding database"
|
155
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-tableless
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-
|
14
|
+
date: 2013-02-20 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: activerecord
|
@@ -109,6 +109,22 @@ dependencies:
|
|
109
109
|
- - ~>
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '1.1'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: rspec
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
116
|
+
requirements:
|
117
|
+
- - ! '>='
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
type: :development
|
121
|
+
prerelease: false
|
122
|
+
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ! '>='
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
112
128
|
- !ruby/object:Gem::Dependency
|
113
129
|
name: launchy
|
114
130
|
requirement: !ruby/object:Gem::Requirement
|
@@ -167,6 +183,7 @@ extensions: []
|
|
167
183
|
extra_rdoc_files: []
|
168
184
|
files:
|
169
185
|
- .gitignore
|
186
|
+
- .rspec
|
170
187
|
- Appraisals
|
171
188
|
- Gemfile
|
172
189
|
- README.md
|
@@ -186,6 +203,7 @@ files:
|
|
186
203
|
- gemfiles/rails3x.gemfile
|
187
204
|
- init.rb
|
188
205
|
- lib/activerecord-tableless.rb
|
206
|
+
- spec/lib/activerecord-tableless_spec.rb
|
189
207
|
homepage: https://github.com/softace/activerecord-tableless
|
190
208
|
licenses: []
|
191
209
|
post_install_message:
|
@@ -200,7 +218,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
200
218
|
version: '0'
|
201
219
|
segments:
|
202
220
|
- 0
|
203
|
-
hash:
|
221
|
+
hash: 3225799463076378481
|
204
222
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
223
|
none: false
|
206
224
|
requirements:
|
@@ -209,7 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
209
227
|
version: '0'
|
210
228
|
segments:
|
211
229
|
- 0
|
212
|
-
hash:
|
230
|
+
hash: 3225799463076378481
|
213
231
|
requirements: []
|
214
232
|
rubyforge_project:
|
215
233
|
rubygems_version: 1.8.24
|
@@ -225,3 +243,4 @@ test_files:
|
|
225
243
|
- features/support/paths.rb
|
226
244
|
- features/support/rails.rb
|
227
245
|
- features/support/selectors.rb
|
246
|
+
- spec/lib/activerecord-tableless_spec.rb
|