perpetuity-postgres 0.0.2 → 0.0.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/CHANGELOG.md +5 -0
- data/README.md +1 -1
- data/lib/perpetuity/postgres/connection_pool.rb +3 -3
- data/lib/perpetuity/postgres/json_array.rb +19 -11
- data/lib/perpetuity/postgres/json_hash.rb +3 -9
- data/lib/perpetuity/postgres/query_attribute.rb +4 -0
- data/lib/perpetuity/postgres/serialized_data.rb +1 -1
- data/lib/perpetuity/postgres/serializer.rb +6 -0
- data/lib/perpetuity/postgres/sql_value.rb +6 -0
- data/lib/perpetuity/postgres/table/attribute.rb +2 -0
- data/lib/perpetuity/postgres/version.rb +1 -1
- data/spec/perpetuity/postgres/json_array_spec.rb +4 -0
- data/spec/perpetuity/postgres/json_hash_spec.rb +5 -0
- data/spec/perpetuity/postgres/query_attribute_spec.rb +4 -0
- data/spec/perpetuity/postgres/serialized_data_spec.rb +2 -0
- data/spec/perpetuity/postgres/serializer_spec.rb +4 -0
- data/spec/perpetuity/postgres/sql_value_spec.rb +17 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1674c0daefbd7dcfaad9351b6e653f22b0ade171
|
4
|
+
data.tar.gz: b2b4e9059b515c61f3bfa0bcfda1f460c167cc51
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f142288f17ca1ac7ad7b6a9c3f8e874e64276cb2a40d08b6f03c6733d1357763a2d97c95f56a3df3ffcea98106530bceb60f721277c32a81daffbe7baeb6ef77
|
7
|
+
data.tar.gz: b624021e54ec0dc4632eb51b5ed56b56fe965fe63f7d559333da4b4f5260dc55b5907bccca3b0efbd3fe7070130e16d01cf0bf7409fdbe4f3eac8500a321609b
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
## Version 0.0.3
|
2
|
+
|
3
|
+
- Require the `bigdecimal` library to avoid undefined constant error: BigDecimals are converted to the Postgres `numeric` data type. In 1.9, it needs to be required explicitly. — [Avdi Grimm](https://github.com/avdi)
|
4
|
+
- Properly return the connection to the connection pool if an exception is raised in the query.
|
5
|
+
|
1
6
|
## Version 0.0.2
|
2
7
|
|
3
8
|
- Make DB creation call out to remote DB to create it instead of calling on localhost.
|
data/README.md
CHANGED
@@ -21,7 +21,7 @@ Or install it yourself as:
|
|
21
21
|
To configure Perpetuity to use your PostgreSQL database, you can use the same parameters as you would with the MongoDB adapter, except substitute `:postgres` in for `:mongodb`:
|
22
22
|
|
23
23
|
```ruby
|
24
|
-
require 'perpetuity
|
24
|
+
require 'perpetuity/postgres' # Unnecessary if using Rails
|
25
25
|
Perpetuity.data_source :postgres, 'my_perpetuity_database'
|
26
26
|
```
|
27
27
|
|
@@ -17,10 +17,10 @@ module Perpetuity
|
|
17
17
|
def lend_connection
|
18
18
|
if block_given?
|
19
19
|
connection = connections.pop
|
20
|
-
|
21
|
-
connections << connection
|
22
|
-
result
|
20
|
+
yield connection
|
23
21
|
end
|
22
|
+
ensure
|
23
|
+
connections << connection
|
24
24
|
end
|
25
25
|
|
26
26
|
def execute sql
|
@@ -1,31 +1,39 @@
|
|
1
|
-
require 'perpetuity/postgres/numeric_value'
|
2
1
|
require 'perpetuity/postgres/json_string_value'
|
3
|
-
require 'perpetuity/postgres/
|
2
|
+
require 'perpetuity/postgres/sql_value'
|
4
3
|
|
5
4
|
module Perpetuity
|
6
5
|
class Postgres
|
7
6
|
class JSONArray
|
8
|
-
def initialize value
|
7
|
+
def initialize value, position=:outer
|
9
8
|
@value = value
|
9
|
+
@position = position
|
10
10
|
end
|
11
11
|
|
12
12
|
def to_s
|
13
|
-
|
13
|
+
if @position == :outer
|
14
|
+
"'#{to_inner_array}'"
|
15
|
+
else
|
16
|
+
to_inner_array
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_inner_array
|
21
|
+
"[#{serialize_elements}]"
|
14
22
|
end
|
15
23
|
|
16
24
|
def serialize_elements
|
17
25
|
@value.map do |element|
|
18
|
-
if element.is_a?
|
19
|
-
NumericValue.new(element)
|
20
|
-
elsif element.is_a? String
|
26
|
+
if element.is_a? String
|
21
27
|
JSONStringValue.new(element)
|
22
|
-
|
23
|
-
|
24
|
-
elsif element.is_a? JSONHash
|
25
|
-
JSONHash.new(element.to_hash, :inner)
|
28
|
+
else
|
29
|
+
SQLValue.new(element)
|
26
30
|
end
|
27
31
|
end.join(',')
|
28
32
|
end
|
33
|
+
|
34
|
+
def to_a
|
35
|
+
@value
|
36
|
+
end
|
29
37
|
end
|
30
38
|
end
|
31
39
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
+
require 'perpetuity/postgres/sql_value'
|
1
2
|
require 'perpetuity/postgres/json_string_value'
|
2
|
-
require 'perpetuity/postgres/numeric_value'
|
3
3
|
|
4
4
|
module Perpetuity
|
5
5
|
class Postgres
|
@@ -26,20 +26,14 @@ module Perpetuity
|
|
26
26
|
string = ''
|
27
27
|
string << JSONStringValue.new(key) << ':'
|
28
28
|
|
29
|
-
string << if
|
30
|
-
NumericValue.new(value)
|
31
|
-
elsif value.is_a? String
|
32
|
-
JSONStringValue.new(value)
|
33
|
-
elsif value.is_a? Hash
|
34
|
-
JSONHash.new(value, :inner)
|
35
|
-
elsif value.is_a? Class
|
29
|
+
string << if [String, Class].include? value.class
|
36
30
|
JSONStringValue.new(value.to_s)
|
37
31
|
elsif [true, false].include? value
|
38
32
|
value.to_s
|
39
33
|
elsif value.nil?
|
40
34
|
'null'
|
41
35
|
else
|
42
|
-
value
|
36
|
+
SQLValue.new(value).to_s
|
43
37
|
end
|
44
38
|
end.join(',')
|
45
39
|
end
|
@@ -109,6 +109,8 @@ module Perpetuity
|
|
109
109
|
SQLValue.new(value)
|
110
110
|
elsif value.is_a? Array
|
111
111
|
serialize_array(object)
|
112
|
+
elsif value.is_a? Hash
|
113
|
+
serialize_hash(object)
|
112
114
|
elsif !object.embedded?
|
113
115
|
serialize_reference(value)
|
114
116
|
elsif object.embedded?
|
@@ -131,6 +133,10 @@ module Perpetuity
|
|
131
133
|
JSONArray.new(array)
|
132
134
|
end
|
133
135
|
|
136
|
+
def serialize_hash object
|
137
|
+
JSONHash.new(object)
|
138
|
+
end
|
139
|
+
|
134
140
|
def serialize_to_hash value
|
135
141
|
Hash[
|
136
142
|
mapper.attribute_set.map do |attribute|
|
@@ -3,6 +3,8 @@ require 'perpetuity/postgres/timestamp_value'
|
|
3
3
|
require 'perpetuity/postgres/numeric_value'
|
4
4
|
require 'perpetuity/postgres/null_value'
|
5
5
|
require 'perpetuity/postgres/boolean_value'
|
6
|
+
require 'perpetuity/postgres/json_hash'
|
7
|
+
require 'perpetuity/postgres/json_array'
|
6
8
|
|
7
9
|
module Perpetuity
|
8
10
|
class Postgres
|
@@ -17,6 +19,10 @@ module Perpetuity
|
|
17
19
|
TimestampValue.new(value)
|
18
20
|
when Fixnum, Float
|
19
21
|
NumericValue.new(value)
|
22
|
+
when Hash, JSONHash
|
23
|
+
JSONHash.new(value.to_hash, :inner)
|
24
|
+
when Array, JSONArray
|
25
|
+
JSONArray.new(value.to_a, :inner)
|
20
26
|
when nil
|
21
27
|
NullValue.new
|
22
28
|
when true, false
|
@@ -23,6 +23,10 @@ module Perpetuity
|
|
23
23
|
JSONArray.new([JSONHash.new(a: 1)]).to_s.should == %q{'[{"a":1}]'}
|
24
24
|
end
|
25
25
|
|
26
|
+
it 'serializes arrays of arrays' do
|
27
|
+
JSONArray.new([[1], ['foo']]).to_s.should == %q{'[[1],["foo"]]'}
|
28
|
+
end
|
29
|
+
|
26
30
|
it 'serializes elements of arrays' do
|
27
31
|
JSONArray.new([1,'a']).to_s.should == %q{'[1,"a"]'}
|
28
32
|
end
|
@@ -31,6 +31,11 @@ module Perpetuity
|
|
31
31
|
JSONHash.new({a: 1, b: 'c'}).to_s.should == %q{'{"a":1,"b":"c"}'}
|
32
32
|
end
|
33
33
|
|
34
|
+
it 'serializes a hash with array values' do
|
35
|
+
JSONHash.new({foo: ['bar', 'baz', 'quux']}).to_s.should ==
|
36
|
+
%q{'{"foo":["bar","baz","quux"]}'}
|
37
|
+
end
|
38
|
+
|
34
39
|
it 'converts back to a hash' do
|
35
40
|
JSONHash.new({a: 1}).to_hash.should == { a: 1 }
|
36
41
|
end
|
@@ -84,6 +84,10 @@ module Perpetuity
|
|
84
84
|
it 'serializes an array as JSON' do
|
85
85
|
serializer.serialize_attribute([1, 'foo']).should == %q{'[1,"foo"]'}
|
86
86
|
end
|
87
|
+
|
88
|
+
it 'serializes a hash as JSON' do
|
89
|
+
serializer.serialize_attribute(a: 1, foo: ['bar']).should == %q{'{"a":1,"foo":["bar"]}'}
|
90
|
+
end
|
87
91
|
end
|
88
92
|
|
89
93
|
describe 'unserialization AKA deserialization' do
|
@@ -29,6 +29,23 @@ module Perpetuity
|
|
29
29
|
SQLValue.new(false).should == "FALSE"
|
30
30
|
end
|
31
31
|
|
32
|
+
it 'converts hashes' do
|
33
|
+
SQLValue.new({ a: 1, b: 'foo'}).should == %q({"a":1,"b":"foo"})
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'converts arrays' do
|
37
|
+
SQLValue.new([1, 'foo', { a: 1 }]).should == %q([1,"foo",{"a":1}])
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'converts JSONHashes' do
|
41
|
+
SQLValue.new(JSONHash.new(a: 1)).should == %q({"a":1})
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'converts JSONArrays' do
|
45
|
+
SQLValue.new(JSONArray.new([1, 'foo', [1, 'foo']])).should ==
|
46
|
+
%q([1,"foo",[1,"foo"]])
|
47
|
+
end
|
48
|
+
|
32
49
|
it 'converts Time objects' do
|
33
50
|
time = Time.new(2013, 1, 2, 3, 4, 5.1234567, '+05:30')
|
34
51
|
SQLValue.new(time).should == "'2013-01-02 03:04:05.123456+0530'::timestamptz"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: perpetuity-postgres
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamie Gaskins
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|