activerecord-crate-adapter 0.0.1 → 0.0.2
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/.travis.yml +12 -0
- data/README.md +5 -11
- data/history.txt +3 -0
- data/lib/active_record/attribute_methods/crate_object.rb +5 -7
- data/lib/active_record/connection_adapters/crate/database_statements.rb +7 -3
- data/lib/active_record/connection_adapters/crate_adapter.rb +1 -3
- data/lib/activerecord-crate-adapter/version.rb +1 -1
- data/spec/data_types/array_spec.rb +31 -17
- data/spec/models/post_spec.rb +17 -3
- metadata +3 -4
- data/lib/active_record/connection_adapters/crate/quoting.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b72a6d0d462cc8984a6925f8d44119ed4e9501b5
|
4
|
+
data.tar.gz: 8d00b8c20cc072b143f55caf53e133ae4878b1d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e4f017f9f2ea9757378a9ae2d0aca1e91755b873ebcf2ebbf3938e174448033d48b24e8e7bd599cdfcd9e4b413fee5dc0514add07e4e2f2ada806eb5a662d93
|
7
|
+
data.tar.gz: 388ab7fc995ab6a112aa412b97c05ecb4a84da88555195ef21afaffc0becfcdeda055e1aa2f0b7576ec2fee06b2ae08a70b810d78b51445a6381f7d3dc1a8ef6
|
data/.travis.yml
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- "1.9.2"
|
4
|
+
- "1.9.3"
|
5
|
+
- "2.1.1"
|
6
|
+
- "2.0.0"
|
7
|
+
- jruby-18mode # JRuby in 1.8 mode
|
8
|
+
- jruby-19mode # JRuby in 1.9 mode
|
9
|
+
- rbx
|
10
|
+
- rbx-2
|
11
|
+
# uncomment this line if your project needs to run something other than `rake`:
|
12
|
+
#script: bundle exec rspec spec
|
data/README.md
CHANGED
@@ -1,18 +1,14 @@
|
|
1
|
-
|
1
|
+
[](http://badge.fury.io/rb/activerecord-crate-adapter)
|
2
2
|
|
3
3
|
The [Crate](http://www.crate.io) adapter for ActiveRecord.
|
4
4
|
|
5
|
-
## Work in progress
|
6
|
-
|
7
|
-
I've just started coding the adapter and lots of functionality might still not work. Give it a try
|
8
|
-
and help bei either contributing (fix it) or add an issue.
|
9
5
|
|
10
6
|
|
11
7
|
## Installation
|
12
8
|
|
13
9
|
Add this line to your application's Gemfile:
|
14
10
|
|
15
|
-
gem 'activerecord-crate-adapter'
|
11
|
+
gem 'activerecord-crate-adapter'
|
16
12
|
|
17
13
|
And then execute:
|
18
14
|
|
@@ -37,7 +33,7 @@ please add an issue so we can discuss.
|
|
37
33
|
|
38
34
|
class Post < ActiveRecord::Base
|
39
35
|
|
40
|
-
before_validation :set_id
|
36
|
+
before_validation :set_id, on: :create
|
41
37
|
|
42
38
|
private
|
43
39
|
|
@@ -50,8 +46,7 @@ please add an issue so we can discuss.
|
|
50
46
|
## Special Data Types
|
51
47
|
|
52
48
|
### Array
|
53
|
-
You can simply create Array columns by specifying t.array and passing array_type when you create a migration.
|
54
|
-
release 0.39 of Crate for this functionality.
|
49
|
+
You can simply create Array columns by specifying t.array and passing array_type when you create a migration.
|
55
50
|
|
56
51
|
t.array :tags, array_type: :string
|
57
52
|
t.array :votes, array_type: :integer
|
@@ -63,8 +58,7 @@ When you create an object just pass your Array directly
|
|
63
58
|
post = Post.where("'fresh' = ANY (tags)")
|
64
59
|
|
65
60
|
### Object
|
66
|
-
Crate allows you to define nested objects.
|
67
|
-
release 0.39 of Crate for this functionality. I tried to make it as simply as possible to use and reuse existing AR functionality,
|
61
|
+
Crate allows you to define nested objects. I tried to make it as simply as possible to use and reuse existing AR functionality,
|
68
62
|
I therefore ask you to reuse the existing serialize functionality. AR#serialize allows you to define your own serialization
|
69
63
|
mechanism and we simply reuse that for serializing an AR object. To get serialize working simply create a #dump and #load method
|
70
64
|
on the class that creates a literal statement that is then used in the SQL. Read up more in this [commit}(https://github.com/crate/crate/commit/16a3d4b3f23996a327f91cdacef573f7ba946017).
|
data/history.txt
CHANGED
@@ -12,19 +12,17 @@ module CrateObject
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def dump(object)
|
15
|
-
object ? object.
|
15
|
+
object ? object.to_hash : nil
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
|
20
|
-
def
|
21
|
-
|
20
|
+
def to_hash
|
21
|
+
h = {}
|
22
22
|
instance_variables.each do |var|
|
23
|
-
|
24
|
-
value = v.is_a?(Array) ? v : %Q{"#{v}"}
|
25
|
-
arr << %Q{"#{var.to_s.gsub(/@/, '')}"=#{value}}
|
23
|
+
h.merge!({"#{var.to_s.gsub(/@/, '')}" => instance_variable_get(var)})
|
26
24
|
end
|
27
|
-
|
25
|
+
h
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
@@ -26,13 +26,17 @@ module ActiveRecord
|
|
26
26
|
params = []
|
27
27
|
binds.each_with_index do |(column, value), index|
|
28
28
|
ar_column = column.is_a?(ActiveRecord::ConnectionAdapters::Column)
|
29
|
-
|
29
|
+
# only quote where clause values
|
30
|
+
unless ar_column # && column.sql_type == 'timestamp'
|
30
31
|
v = value
|
31
32
|
quoted_value = ar_column ? quote(v, column) : quote(v, nil)
|
32
33
|
params << quoted_value
|
34
|
+
else
|
35
|
+
params << value
|
36
|
+
end
|
37
|
+
|
33
38
|
end
|
34
|
-
|
35
|
-
@connection.execute sql
|
39
|
+
@connection.execute sql, params
|
36
40
|
end
|
37
41
|
|
38
42
|
# Returns the statement identifier for the client side cache
|
@@ -11,7 +11,6 @@ require 'active_record/connection_adapters/statement_pool'
|
|
11
11
|
require 'active_record/connection_adapters/column'
|
12
12
|
require 'active_record/connection_adapters/crate/schema_statements'
|
13
13
|
require 'active_record/connection_adapters/crate/database_statements'
|
14
|
-
require 'active_record/connection_adapters/crate/quoting'
|
15
14
|
require 'active_support/core_ext/kernel'
|
16
15
|
|
17
16
|
begin
|
@@ -37,7 +36,6 @@ module ActiveRecord
|
|
37
36
|
|
38
37
|
include Crate::SchemaStatements
|
39
38
|
include DatabaseStatements
|
40
|
-
include Crate::Quoting
|
41
39
|
|
42
40
|
ADAPTER_NAME = 'Crate'.freeze
|
43
41
|
|
@@ -85,7 +83,7 @@ module ActiveRecord
|
|
85
83
|
|
86
84
|
# Adds `:array` as a valid migration key
|
87
85
|
def migration_keys
|
88
|
-
super + [:array, :object_schema_behaviour, :
|
86
|
+
super + [:array, :object_schema_behaviour, :object_schema]
|
89
87
|
end
|
90
88
|
|
91
89
|
|
@@ -23,25 +23,39 @@ describe "Post#array" do
|
|
23
23
|
|
24
24
|
|
25
25
|
describe "#array column type" do
|
26
|
-
let(:array) {%w(hot fresh)}
|
27
|
-
let(:votes) {[9,8,7]}
|
28
|
-
let(:bool_arr) {[true, false, true]}
|
29
|
-
let(:post) {Post.create!(title: 'Arrays are awesome', tags: array, votes: votes, bool_arr: bool_arr
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
26
|
+
let(:array) { %w(hot fresh) }
|
27
|
+
let(:votes) { [9, 8, 7] }
|
28
|
+
let(:bool_arr) { [true, false, true] }
|
29
|
+
let(:post) { Post.create!(title: 'Arrays are awesome', tags: array, votes: votes, bool_arr: bool_arr) }
|
30
|
+
|
31
|
+
context 'create' do
|
32
|
+
it 'should store and return an array' do
|
33
|
+
p = Post.find(post.id)
|
34
|
+
p.tags.should be_a Array
|
35
|
+
p.votes.should be_a Array
|
36
|
+
p.bool_arr.should be_a Array
|
37
|
+
p.tags.should eq array
|
38
|
+
p.votes.should eq votes
|
39
|
+
p.bool_arr.should eq bool_arr
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should find the post by array value' do
|
43
|
+
post = Post.create!(title: 'Arrays are awesome', tags: array, votes: votes)
|
44
|
+
refresh_posts
|
45
|
+
Post.where("'fresh' = ANY (tags)").should include(post)
|
46
|
+
end
|
39
47
|
end
|
40
48
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
49
|
+
context '#update' do
|
50
|
+
it 'should update and existing array value' do
|
51
|
+
post = Post.create!(title: 'Arrays are awesome', tags: array, votes: votes)
|
52
|
+
refresh_posts
|
53
|
+
new_tags = %w(ok)
|
54
|
+
post.update_attributes!(tags: new_tags)
|
55
|
+
refresh_posts
|
56
|
+
post.reload
|
57
|
+
post.tags.should eq new_tags
|
58
|
+
end
|
45
59
|
end
|
46
60
|
|
47
61
|
end
|
data/spec/models/post_spec.rb
CHANGED
@@ -31,9 +31,16 @@ describe Post do
|
|
31
31
|
|
32
32
|
context 'persistance' do
|
33
33
|
|
34
|
+
before do
|
35
|
+
@post = Post.create!(params)
|
36
|
+
end
|
37
|
+
|
38
|
+
after do
|
39
|
+
@post.destroy
|
40
|
+
end
|
41
|
+
|
34
42
|
it 'should persist the record to the database' do
|
35
|
-
post
|
36
|
-
post.persisted?.should be_true
|
43
|
+
@post.persisted?.should be_true
|
37
44
|
refresh_posts
|
38
45
|
Post.count.should eq 1
|
39
46
|
end
|
@@ -58,7 +65,7 @@ describe Post do
|
|
58
65
|
end
|
59
66
|
|
60
67
|
after do
|
61
|
-
|
68
|
+
@post.destroy
|
62
69
|
end
|
63
70
|
|
64
71
|
context 'find' do
|
@@ -66,6 +73,13 @@ describe Post do
|
|
66
73
|
post = Post.where(id: @post.id).first
|
67
74
|
post.id.should eq(@post.id)
|
68
75
|
end
|
76
|
+
|
77
|
+
it 'should find the crated record by title' do
|
78
|
+
refresh_posts
|
79
|
+
Post.where(title: @post.title).count.should eq 1
|
80
|
+
post = Post.where(title: @post.title).first
|
81
|
+
post.id.should eq(@post.id)
|
82
|
+
end
|
69
83
|
end
|
70
84
|
|
71
85
|
context 'update' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-crate-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christoph Klocker
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-06-
|
11
|
+
date: 2014-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -117,6 +117,7 @@ extensions: []
|
|
117
117
|
extra_rdoc_files: []
|
118
118
|
files:
|
119
119
|
- ".gitignore"
|
120
|
+
- ".travis.yml"
|
120
121
|
- Gemfile
|
121
122
|
- LICENSE.txt
|
122
123
|
- README.md
|
@@ -125,7 +126,6 @@ files:
|
|
125
126
|
- history.txt
|
126
127
|
- lib/active_record/attribute_methods/crate_object.rb
|
127
128
|
- lib/active_record/connection_adapters/crate/database_statements.rb
|
128
|
-
- lib/active_record/connection_adapters/crate/quoting.rb
|
129
129
|
- lib/active_record/connection_adapters/crate/schema_statements.rb
|
130
130
|
- lib/active_record/connection_adapters/crate_adapter.rb
|
131
131
|
- lib/activerecord-crate-adapter.rb
|
@@ -178,4 +178,3 @@ test_files:
|
|
178
178
|
- spec/models/post_spec.rb
|
179
179
|
- spec/spec_helper.rb
|
180
180
|
- spec/test_server.rb
|
181
|
-
has_rdoc:
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module ConnectionAdapters
|
3
|
-
module Crate
|
4
|
-
module Quoting
|
5
|
-
# Quotes the column value to help prevent
|
6
|
-
# {SQL injection attacks}[http://en.wikipedia.org/wiki/SQL_injection].
|
7
|
-
def quote(value, column = nil)
|
8
|
-
# records are quoted as their primary key
|
9
|
-
return value.quoted_id if value.respond_to?(:quoted_id)
|
10
|
-
|
11
|
-
if value.is_a?(Array)
|
12
|
-
"#{value}".gsub('"', "'")
|
13
|
-
elsif column.sql_type == 'object'
|
14
|
-
"{ #{value} }"
|
15
|
-
else
|
16
|
-
super(value, column)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|