activerecord-tablefree 3.1.2 → 3.1.3
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 +4 -4
- data/README.md +36 -6
- data/lib/activerecord/tablefree/connection.rb +17 -12
- data/lib/activerecord/tablefree/statement_cache.rb +22 -0
- data/lib/activerecord/tablefree/version.rb +1 -1
- data/lib/activerecord/tablefree.rb +4 -1
- data/spec/activerecord/tablefree_spec.rb +44 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd641bf62d44d61669232874c115223d670525dc
|
4
|
+
data.tar.gz: e77eb3bc55b531d724c863d9368e36a9ff54b66f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d747f17d5693c762b2511296a875bf63a71cf378fd62b8c662357cdf37e3343c96968e1cce39df072e3cda1637dd98fe194e87f6ae5defcbf605b70d16bc28b5
|
7
|
+
data.tar.gz: 936bf5a5f9ff23a685b55c604687eb8f18c43499c18333f95392c552e5a651022bb3c1f34305fa1ebc7427e21e7c585bef4a81a998299c05c891e7f1fc574065
|
data/README.md
CHANGED
@@ -64,23 +64,25 @@ Define a model like this:
|
|
64
64
|
has_no_table
|
65
65
|
column :name, :string
|
66
66
|
column :email, :string
|
67
|
-
|
67
|
+
column :message, :string
|
68
|
+
validates_presence_of :name, :email, :message
|
68
69
|
end
|
69
70
|
|
70
71
|
You can now use the model in a view like this:
|
71
72
|
|
72
|
-
<%= form_for :
|
73
|
+
<%= form_for :contact_message, @contact_message do |f| %>
|
73
74
|
Your name: <%= f.text_field :name %>
|
74
75
|
Your email: <%= f.text_field :email %>
|
76
|
+
Your message: <%= f.text_field :message %>
|
75
77
|
<% end %>
|
76
78
|
|
77
79
|
And in the controller:
|
78
80
|
|
79
|
-
def
|
80
|
-
@
|
81
|
+
def contact_message
|
82
|
+
@contact_message = ContactMessage.new
|
81
83
|
if request.post?
|
82
|
-
@
|
83
|
-
if @
|
84
|
+
@contact_message.attributes = params[:contact_message]
|
85
|
+
if @contact_message.valid?
|
84
86
|
# Process the message...
|
85
87
|
end
|
86
88
|
end
|
@@ -90,6 +92,34 @@ If you wish (this is not recommended), you can pretend you have a succeeding dat
|
|
90
92
|
|
91
93
|
has_no_table :database => :pretend_success
|
92
94
|
|
95
|
+
Associations
|
96
|
+
------------
|
97
|
+
|
98
|
+
Some model as before, but with an association to a real DB-backed model.
|
99
|
+
|
100
|
+
```
|
101
|
+
class ContactMessage < ActiveRecord::Base
|
102
|
+
has_no_table
|
103
|
+
column :message, :string
|
104
|
+
column :email, :string
|
105
|
+
validates_presence_of :name, :email
|
106
|
+
belongs_to :contact, foreign_key: :email, primary_key: :email
|
107
|
+
end
|
108
|
+
|
109
|
+
class Contact < ActiveRecord::Base
|
110
|
+
validates_presence_of :name, :email
|
111
|
+
has_one :contact_message, foreign_key: :email, primary_key: :email, dependent: nil
|
112
|
+
end
|
113
|
+
```
|
114
|
+
|
115
|
+
Obviously the association is not full-fledged, as some traversals just won't make sense with one side not being loadable from the database. From the `ContactMessage` you can get to the `Contact`, but not vice versa.
|
116
|
+
|
117
|
+
```
|
118
|
+
>> contact = Contact.new(name: 'Boo', email: 'boo@example.com')
|
119
|
+
>> contact_message = ContactMessage.new(contact: contact)
|
120
|
+
>> contact_message.email
|
121
|
+
=> 'boo@example.com'
|
122
|
+
```
|
93
123
|
|
94
124
|
Development
|
95
125
|
-----------
|
@@ -1,5 +1,19 @@
|
|
1
1
|
module ActiveRecord::Tablefree
|
2
|
-
class Connection
|
2
|
+
class Connection < ActiveRecord::ConnectionAdapters::AbstractAdapter
|
3
|
+
def initialize
|
4
|
+
@connection = Object.new # The Raw Connection
|
5
|
+
@owner = nil
|
6
|
+
@instrumenter = ActiveSupport::Notifications.instrumenter
|
7
|
+
@logger = Object.new
|
8
|
+
@config = Object.new
|
9
|
+
@pool = nil
|
10
|
+
@schema_cache = ActiveRecord::Tablefree::SchemaCache.new
|
11
|
+
@quoted_column_names, @quoted_table_names = {}, {}
|
12
|
+
@visitor = Object.new
|
13
|
+
@lock = Object.new
|
14
|
+
@prepared_statements = false
|
15
|
+
end
|
16
|
+
|
3
17
|
def quote_table_name(*_args)
|
4
18
|
''
|
5
19
|
end
|
@@ -12,10 +26,6 @@ module ActiveRecord::Tablefree
|
|
12
26
|
nil
|
13
27
|
end
|
14
28
|
|
15
|
-
def schema_cache(*_args)
|
16
|
-
@_schema_cache ||= ActiveRecord::Tablefree::SchemaCache.new
|
17
|
-
end
|
18
|
-
|
19
29
|
# Fixes Issue #17. https://github.com/softace/activerecord-tablefree/issues/17
|
20
30
|
# The following method is from the ActiveRecord gem:
|
21
31
|
# /lib/active_record/connection_adapters/abstract/database_statements.rb .
|
@@ -57,14 +67,9 @@ module ActiveRecord::Tablefree
|
|
57
67
|
{}
|
58
68
|
end
|
59
69
|
|
60
|
-
# This is used in the StatementCache object.
|
61
|
-
# can be used to query the database repeatedly.
|
70
|
+
# This is used in the StatementCache object.
|
62
71
|
def cacheable_query(arel) # :nodoc:
|
63
|
-
|
64
|
-
ActiveRecord::StatementCache.query visitor, arel.ast
|
65
|
-
else
|
66
|
-
ActiveRecord::StatementCache.partial_query visitor, arel.ast, collector
|
67
|
-
end
|
72
|
+
ActiveRecord::Tablefree::StatementCache.partial_query visitor, arel.ast, collector
|
68
73
|
end
|
69
74
|
end
|
70
75
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module ActiveRecord::Tablefree
|
2
|
+
class StatementCache < ActiveRecord::StatementCache
|
3
|
+
def self.create(*_args)
|
4
|
+
new Object.new, ActiveRecord::Tablefree::StatementCache::BindMap.new
|
5
|
+
end
|
6
|
+
|
7
|
+
def execute
|
8
|
+
nil
|
9
|
+
end
|
10
|
+
|
11
|
+
class BindMap
|
12
|
+
def initialize(*_args)
|
13
|
+
@indexes = []
|
14
|
+
@bound_attributes = []
|
15
|
+
end
|
16
|
+
|
17
|
+
def bind(*_args)
|
18
|
+
[]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -36,6 +36,7 @@ module ActiveRecord
|
|
36
36
|
module Tablefree
|
37
37
|
class NoDatabase < StandardError; end
|
38
38
|
class Unsupported < StandardError; end
|
39
|
+
class InvalidColumnType < ArgumentError; end
|
39
40
|
|
40
41
|
def self.included(base) #:nodoc:
|
41
42
|
base.send :extend, ActsMethods
|
@@ -86,7 +87,9 @@ module ActiveRecord
|
|
86
87
|
|
87
88
|
# Register a new column.
|
88
89
|
def column(name, sql_type = nil, default = nil, null = true)
|
89
|
-
|
90
|
+
cast_class = "ActiveRecord::Type::#{sql_type.to_s.camelize}".constantize rescue nil
|
91
|
+
raise InvalidColumnType, "sql_type is #{sql_type} (#{sql_type.class}), which is not supported" unless cast_class.respond_to?(:new)
|
92
|
+
cast_type = cast_class.new
|
90
93
|
tablefree_options[:columns_hash][name.to_s] = ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, cast_type, sql_type.to_s, null)
|
91
94
|
end
|
92
95
|
|
@@ -255,7 +255,6 @@ shared_examples_for 'an instance with succeeding database' do
|
|
255
255
|
end
|
256
256
|
|
257
257
|
describe 'ActiveRecord with real database' do
|
258
|
-
# This is only here to ensure that the shared examples are actually behaving like a real database.
|
259
258
|
before(:context) do
|
260
259
|
FileUtils.mkdir_p 'tmp'
|
261
260
|
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'tmp/test.db')
|
@@ -276,6 +275,36 @@ describe 'ActiveRecord with real database' do
|
|
276
275
|
subject { Chair.new(name: 'Jarl') }
|
277
276
|
it_behaves_like 'an instance with succeeding database'
|
278
277
|
end
|
278
|
+
|
279
|
+
describe 'association' do
|
280
|
+
before(:context) do
|
281
|
+
# reopen the chair to add an association
|
282
|
+
class Chair < ActiveRecord::Base
|
283
|
+
has_one :arm_rest, primary_key: :name, foreign_key: :name, dependent: nil
|
284
|
+
end
|
285
|
+
class ArmRest < ActiveRecord::Base
|
286
|
+
has_no_table
|
287
|
+
column :name, :string
|
288
|
+
belongs_to :chair, primary_key: :name, foreign_key: :name
|
289
|
+
end
|
290
|
+
end
|
291
|
+
it 'can be traversed by setting association' do
|
292
|
+
chair = Chair.create(name: 'A')
|
293
|
+
arm_rest = ArmRest.new(chair: chair)
|
294
|
+
expect(arm_rest.chair).to eq chair
|
295
|
+
end
|
296
|
+
it 'sets foreign key from association' do
|
297
|
+
chair = Chair.create(name: 'A')
|
298
|
+
arm_rest = ArmRest.new(chair: chair)
|
299
|
+
expect(arm_rest.name).to eq 'A'
|
300
|
+
end
|
301
|
+
it 'can be traversed by setting foreign key' do
|
302
|
+
pending('more effort to implement')
|
303
|
+
Chair.create(name: 'B')
|
304
|
+
arm_rest = ArmRest.new(name: 'B')
|
305
|
+
expect { arm_rest.chair }.to_not raise_error
|
306
|
+
end
|
307
|
+
end
|
279
308
|
end
|
280
309
|
|
281
310
|
describe 'Tablefree model with succeeding database' do
|
@@ -306,3 +335,17 @@ describe 'Tablefree model can access connection transaction' do
|
|
306
335
|
it { is_expected.to be_a(ActiveRecord::Tablefree::Transaction) }
|
307
336
|
end
|
308
337
|
end
|
338
|
+
|
339
|
+
describe 'Bad column type' do
|
340
|
+
describe 'association' do
|
341
|
+
subject { -> {
|
342
|
+
class ArmRest < ActiveRecord::Base
|
343
|
+
has_no_table
|
344
|
+
column :chair_id
|
345
|
+
end
|
346
|
+
}}
|
347
|
+
it 'raises an InvalidColumnType error' do
|
348
|
+
expect { subject.call }.to raise_error ActiveRecord::Tablefree::InvalidColumnType, 'sql_type is (NilClass), which is not supported'
|
349
|
+
end
|
350
|
+
end
|
351
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-tablefree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.
|
4
|
+
version: 3.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jarl Friis
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2017-12-
|
14
|
+
date: 2017-12-21 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: activerecord
|
@@ -284,6 +284,7 @@ files:
|
|
284
284
|
- lib/activerecord/tablefree/cast_type.rb
|
285
285
|
- lib/activerecord/tablefree/connection.rb
|
286
286
|
- lib/activerecord/tablefree/schema_cache.rb
|
287
|
+
- lib/activerecord/tablefree/statement_cache.rb
|
287
288
|
- lib/activerecord/tablefree/transaction.rb
|
288
289
|
- lib/activerecord/tablefree/version.rb
|
289
290
|
- spec/activerecord/tablefree/version_spec.rb
|