rom-sql 0.9.0 → 0.9.1
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 +9 -0
- data/Gemfile +0 -2
- data/lib/rom/sql/extensions/postgres/inferrer.rb +10 -15
- data/lib/rom/sql/relation/reading.rb +14 -0
- data/lib/rom/sql/schema/inferrer.rb +2 -2
- data/lib/rom/sql/version.rb +1 -1
- data/spec/extensions/postgres/inferrer_spec.rb +10 -1
- data/spec/unit/relation/read_spec.rb +21 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7afadeffec4c6a560640ef08d8dbe333d067bf6c
|
4
|
+
data.tar.gz: 096577d996f4be2697da8ca271e57c60cdbdf18e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65fc494f45e9e7a76ba43aeb541d5c38719b020ae7ef5092e3e1698f53e3ddf15c23baa4fe97c3a8bd0cb646b4ebec3c0efad77bf03aaeee9317cc9bf5aea2fb
|
7
|
+
data.tar.gz: 493b7c1cae2cb730c092e5b30df0e866797c2fdac2a5ce0c2264cbd2cf05a86ed66521c219b8d5c4c12687425bbf3ed82e193c6f5583969a49106264a17add47
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## v0.9.1 2016-12-23
|
2
|
+
|
3
|
+
### Added
|
4
|
+
|
5
|
+
* Support for PG enums in schema inferrer (flash-gordon)
|
6
|
+
* `ROM::SQL::Relation#read` method which accepts an SQL string and returns a new relation (solnic)
|
7
|
+
|
8
|
+
[Compare v0.9.0...v0.9.1](https://github.com/rom-rb/rom-sql/compare/v0.9.0...v0.9.1)
|
9
|
+
|
1
10
|
## v0.9.0 2016-11-08
|
2
11
|
|
3
12
|
### Added
|
data/Gemfile
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'set'
|
1
2
|
require 'rom/sql/schema/inferrer'
|
2
3
|
require 'rom/sql/extensions/postgres/types'
|
3
4
|
|
@@ -7,17 +8,11 @@ module ROM
|
|
7
8
|
class PostgresInferrer < Inferrer[:postgres]
|
8
9
|
defines :db_numeric_types, :db_type_mapping, :db_array_type_matcher
|
9
10
|
|
10
|
-
db_numeric_types(
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
'numeric' => true,
|
16
|
-
'real' => true,
|
17
|
-
'double precision' => true,
|
18
|
-
'serial' => true,
|
19
|
-
'bigserial' => true,
|
20
|
-
).freeze
|
11
|
+
db_numeric_types %w(
|
12
|
+
smallint integer bigint
|
13
|
+
decimal numeric real
|
14
|
+
double\ precision serial bigserial
|
15
|
+
).to_set.freeze
|
21
16
|
|
22
17
|
db_type_mapping(
|
23
18
|
'uuid' => Types::PG::UUID,
|
@@ -41,9 +36,11 @@ module ROM
|
|
41
36
|
type.meta(primary_key: true)
|
42
37
|
end
|
43
38
|
|
44
|
-
def map_type(ruby_type, db_type)
|
39
|
+
def map_type(ruby_type, db_type, enum_values: nil, **_)
|
45
40
|
if db_type.end_with?(self.class.db_array_type_matcher)
|
46
41
|
Types::PG::Array(db_type)
|
42
|
+
elsif enum_values
|
43
|
+
Types::String.enum(*enum_values)
|
47
44
|
else
|
48
45
|
map_db_type(db_type) || super
|
49
46
|
end
|
@@ -54,9 +51,7 @@ module ROM
|
|
54
51
|
end
|
55
52
|
|
56
53
|
def numeric?(ruby_type, db_type)
|
57
|
-
self.class.db_numeric_types.
|
58
|
-
ruby_type == :integer
|
59
|
-
end
|
54
|
+
self.class.db_numeric_types.include?(db_type) || ruby_type == :integer
|
60
55
|
end
|
61
56
|
end
|
62
57
|
end
|
@@ -507,6 +507,20 @@ module ROM
|
|
507
507
|
def unique?(criteria)
|
508
508
|
where(criteria).count.zero?
|
509
509
|
end
|
510
|
+
|
511
|
+
# Return a new relation from a raw SQL string
|
512
|
+
#
|
513
|
+
# @example
|
514
|
+
# users.read('SELECT name FROM users')
|
515
|
+
#
|
516
|
+
# @param [String] sql The SQL string
|
517
|
+
#
|
518
|
+
# @return [SQL::Relation]
|
519
|
+
#
|
520
|
+
# @api public
|
521
|
+
def read(sql)
|
522
|
+
__new__(dataset.db[sql])
|
523
|
+
end
|
510
524
|
end
|
511
525
|
end
|
512
526
|
end
|
@@ -53,7 +53,7 @@ module ROM
|
|
53
53
|
if primary_key
|
54
54
|
map_pk_type(type, db_type)
|
55
55
|
else
|
56
|
-
mapped_type = map_type(type, db_type)
|
56
|
+
mapped_type = map_type(type, db_type, rest)
|
57
57
|
mapped_type = mapped_type.optional if allow_null
|
58
58
|
mapped_type = mapped_type.meta(foreign_key: true, relation: foreign_key) if foreign_key
|
59
59
|
mapped_type
|
@@ -64,7 +64,7 @@ module ROM
|
|
64
64
|
self.class.numeric_pk_type.meta(primary_key: true)
|
65
65
|
end
|
66
66
|
|
67
|
-
def map_type(ruby_type, db_type)
|
67
|
+
def map_type(ruby_type, db_type, **_kw)
|
68
68
|
self.class.ruby_type_mapping.fetch(ruby_type) {
|
69
69
|
raise UnknownDBTypeError, "Cannot find corresponding type for #{ruby_type || db_type}"
|
70
70
|
}
|
data/lib/rom/sql/version.rb
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
RSpec.describe 'ROM::SQL::Schema::PostgresInferrer', :postgres do
|
2
2
|
include_context 'database setup'
|
3
3
|
|
4
|
+
colors = %w(red orange yellow green blue purple)
|
5
|
+
|
4
6
|
before do
|
7
|
+
conn.extension :pg_enum
|
8
|
+
|
5
9
|
conn.drop_table?(:test_inferrence)
|
10
|
+
conn.drop_enum(:rainbow, if_exists: true)
|
11
|
+
|
12
|
+
conn.create_enum(:rainbow, colors)
|
6
13
|
|
7
14
|
conn.create_table :test_inferrence do
|
8
15
|
primary_key :id, :uuid
|
@@ -11,6 +18,7 @@ RSpec.describe 'ROM::SQL::Schema::PostgresInferrer', :postgres do
|
|
11
18
|
Decimal :money, null: false
|
12
19
|
column :tags, "text[]"
|
13
20
|
column :tag_ids, "bigint[]"
|
21
|
+
rainbow :color
|
14
22
|
end
|
15
23
|
end
|
16
24
|
|
@@ -33,7 +41,8 @@ RSpec.describe 'ROM::SQL::Schema::PostgresInferrer', :postgres do
|
|
33
41
|
jsonb_data: ROM::SQL::Types::PG::JSONB.optional.meta(name: :jsonb_data),
|
34
42
|
money: ROM::SQL::Types::Decimal.meta(name: :money),
|
35
43
|
tags: ROM::SQL::Types::PG::Array('text').optional.meta(name: :tags),
|
36
|
-
tag_ids: ROM::SQL::Types::PG::Array('biging').optional.meta(name: :tag_ids)
|
44
|
+
tag_ids: ROM::SQL::Types::PG::Array('biging').optional.meta(name: :tag_ids),
|
45
|
+
color: ROM::SQL::Types::String.enum(*colors).optional.meta(name: :color)
|
37
46
|
)
|
38
47
|
end
|
39
48
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
RSpec.describe ROM::Relation, '#read' do
|
2
|
+
subject(:relation) { container.relations.users }
|
3
|
+
|
4
|
+
include_context 'users and tasks'
|
5
|
+
|
6
|
+
with_adapters do
|
7
|
+
let(:users) do
|
8
|
+
relation.read('SELECT name FROM users')
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'returns results from raw SQL' do
|
12
|
+
expect(users).to match_array([{ name: 'Jane' }, { name: 'Joe' }])
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'returns a new SQL relation' do
|
16
|
+
materialized = users.()
|
17
|
+
expect(materialized).to match_array([{ name: 'Jane' }, { name: 'Joe' }])
|
18
|
+
expect(materialized.source).to be(users)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rom-sql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Solnica
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-12-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sequel
|
@@ -258,6 +258,7 @@ files:
|
|
258
258
|
- spec/unit/relation/primary_key_spec.rb
|
259
259
|
- spec/unit/relation/project_spec.rb
|
260
260
|
- spec/unit/relation/qualified_columns_spec.rb
|
261
|
+
- spec/unit/relation/read_spec.rb
|
261
262
|
- spec/unit/relation/rename_spec.rb
|
262
263
|
- spec/unit/relation/sum_spec.rb
|
263
264
|
- spec/unit/relation/union_spec.rb
|
@@ -356,6 +357,7 @@ test_files:
|
|
356
357
|
- spec/unit/relation/primary_key_spec.rb
|
357
358
|
- spec/unit/relation/project_spec.rb
|
358
359
|
- spec/unit/relation/qualified_columns_spec.rb
|
360
|
+
- spec/unit/relation/read_spec.rb
|
359
361
|
- spec/unit/relation/rename_spec.rb
|
360
362
|
- spec/unit/relation/sum_spec.rb
|
361
363
|
- spec/unit/relation/union_spec.rb
|