torque-postgresql 0.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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +31 -0
- data/lib/torque/postgresql/adapter/database_statements.rb +103 -0
- data/lib/torque/postgresql/adapter/oid/array.rb +19 -0
- data/lib/torque/postgresql/adapter/oid/enum.rb +46 -0
- data/lib/torque/postgresql/adapter/oid/interval.rb +94 -0
- data/lib/torque/postgresql/adapter/oid.rb +15 -0
- data/lib/torque/postgresql/adapter/quoting.rb +23 -0
- data/lib/torque/postgresql/adapter/schema_definitions.rb +28 -0
- data/lib/torque/postgresql/adapter/schema_dumper.rb +31 -0
- data/lib/torque/postgresql/adapter/schema_statements.rb +89 -0
- data/lib/torque/postgresql/adapter.rb +29 -0
- data/lib/torque/postgresql/attributes/builder/enum.rb +151 -0
- data/lib/torque/postgresql/attributes/builder.rb +1 -0
- data/lib/torque/postgresql/attributes/enum.rb +231 -0
- data/lib/torque/postgresql/attributes/lazy.rb +33 -0
- data/lib/torque/postgresql/attributes/type_map.rb +46 -0
- data/lib/torque/postgresql/attributes.rb +32 -0
- data/lib/torque/postgresql/auxiliary_statement.rb +192 -0
- data/lib/torque/postgresql/base.rb +28 -0
- data/lib/torque/postgresql/collector.rb +31 -0
- data/lib/torque/postgresql/config.rb +50 -0
- data/lib/torque/postgresql/migration/command_recorder.rb +31 -0
- data/lib/torque/postgresql/migration.rb +1 -0
- data/lib/torque/postgresql/relation/auxiliary_statement.rb +65 -0
- data/lib/torque/postgresql/relation/distinct_on.rb +43 -0
- data/lib/torque/postgresql/relation.rb +62 -0
- data/lib/torque/postgresql/schema_dumper.rb +37 -0
- data/lib/torque/postgresql/version.rb +5 -0
- data/lib/torque/postgresql.rb +18 -0
- data/lib/torque-postgresql.rb +1 -0
- metadata +236 -0
@@ -0,0 +1,43 @@
|
|
1
|
+
module Torque
|
2
|
+
module PostgreSQL
|
3
|
+
module Relation
|
4
|
+
module DistinctOn
|
5
|
+
|
6
|
+
attr_accessor :distinct_on_value
|
7
|
+
|
8
|
+
# Specifies whether the records should be unique or not by a given set of fields.
|
9
|
+
# For example:
|
10
|
+
#
|
11
|
+
# User.distinct_on(:name)
|
12
|
+
# # Returns 1 record per distinct name
|
13
|
+
#
|
14
|
+
# User.distinct_on(:name, :email)
|
15
|
+
# # Returns 1 record per distinct name and email
|
16
|
+
#
|
17
|
+
# User.distinct_on(false)
|
18
|
+
# # You can also remove the uniqueness
|
19
|
+
def distinct_on(*value)
|
20
|
+
spawn.distinct_on!(*value)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Like #distinct_on, but modifies relation in place.
|
24
|
+
def distinct_on!(*value)
|
25
|
+
self.distinct_on_value = value
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
# Hook arel build to add the distinct on clause
|
32
|
+
def build_arel
|
33
|
+
arel = super
|
34
|
+
|
35
|
+
value = self.distinct_on_value
|
36
|
+
arel.distinct_on(resolve_column(value)) unless value.nil?
|
37
|
+
arel
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
|
2
|
+
require_relative 'relation/distinct_on'
|
3
|
+
require_relative 'relation/auxiliary_statement'
|
4
|
+
|
5
|
+
module Torque
|
6
|
+
module PostgreSQL
|
7
|
+
module Relation
|
8
|
+
|
9
|
+
include DistinctOn
|
10
|
+
include AuxiliaryStatement
|
11
|
+
|
12
|
+
# Resolve column definition up to second value.
|
13
|
+
# For example, based on Post model:
|
14
|
+
#
|
15
|
+
# resolve_column(['name', :title])
|
16
|
+
# # Returns ['name', '"posts"."title"']
|
17
|
+
#
|
18
|
+
# resolve_column([:title, {authors: :name}])
|
19
|
+
# # Returns ['"posts"."title"', '"authors"."name"']
|
20
|
+
#
|
21
|
+
# resolve_column([{authors: [:name, :age]}])
|
22
|
+
# # Returns ['"authors"."name"', '"authors"."age"']
|
23
|
+
def resolve_column(list, base = false)
|
24
|
+
base = resolve_base_table(base)
|
25
|
+
|
26
|
+
list.map do |item|
|
27
|
+
case item
|
28
|
+
when String
|
29
|
+
Arel::Nodes::SqlLiteral.new(klass.send(:sanitize_sql, item.to_s))
|
30
|
+
when Symbol
|
31
|
+
base ? base.arel_attribute(item) : klass.arel_attribute(item)
|
32
|
+
when Array
|
33
|
+
resolve_column(item, base)
|
34
|
+
when Hash
|
35
|
+
raise ArgumentError, "Unsupported Hash for attributes on third level" if base
|
36
|
+
item.map do |key, other_list|
|
37
|
+
other_list = [other_list] unless other_list.kind_of? Enumerable
|
38
|
+
resolve_column(other_list, key)
|
39
|
+
end
|
40
|
+
else
|
41
|
+
raise ArgumentError, "Unsupported argument type: #{value} (#{value.class})"
|
42
|
+
end
|
43
|
+
end.flatten
|
44
|
+
end
|
45
|
+
|
46
|
+
# Get the TableMetadata from a relation
|
47
|
+
def resolve_base_table(relation)
|
48
|
+
return unless relation
|
49
|
+
|
50
|
+
table = predicate_builder.send(:table)
|
51
|
+
if table.associated_with?(relation)
|
52
|
+
table.associated_table(relation).send(:klass)
|
53
|
+
else
|
54
|
+
raise ArgumentError, "Relation for #{relation} not found on #{klass}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
ActiveRecord::Relation.include Relation
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Torque
|
2
|
+
module PostgreSQL
|
3
|
+
module SchemaDumper
|
4
|
+
|
5
|
+
def extensions(stream)
|
6
|
+
super
|
7
|
+
user_defined_types(stream)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def user_defined_types(stream)
|
13
|
+
types = @connection.user_defined_types
|
14
|
+
return unless types.any?
|
15
|
+
|
16
|
+
stream.puts " # These are user-defined types used on this database"
|
17
|
+
types.each do |name, type|
|
18
|
+
raise StandardError, "User-defined type '#{name}' cannot be dumped!" if type.blank?
|
19
|
+
send(type.to_sym, name, stream)
|
20
|
+
end
|
21
|
+
stream.puts
|
22
|
+
rescue => e
|
23
|
+
stream.puts "# Could not dump user-defined types because of following #{e.class}"
|
24
|
+
stream.puts "# #{e.message}"
|
25
|
+
stream.puts
|
26
|
+
end
|
27
|
+
|
28
|
+
def enum(name, stream)
|
29
|
+
values = @connection.enum_values(name).map { |v| "\"#{v}\"" }
|
30
|
+
stream.puts " create_enum \"#{name}\", [#{values.join(', ')}], force: :cascade"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
ActiveRecord::SchemaDumper.prepend SchemaDumper
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
require 'active_record'
|
3
|
+
require 'active_support'
|
4
|
+
|
5
|
+
require 'active_support/core_ext/hash/compact'
|
6
|
+
require 'active_record/connection_adapters/postgresql_adapter'
|
7
|
+
|
8
|
+
require 'torque/postgresql/config'
|
9
|
+
require 'torque/postgresql/version'
|
10
|
+
require 'torque/postgresql/collector'
|
11
|
+
|
12
|
+
require 'torque/postgresql/adapter'
|
13
|
+
require 'torque/postgresql/attributes'
|
14
|
+
require 'torque/postgresql/auxiliary_statement'
|
15
|
+
require 'torque/postgresql/base'
|
16
|
+
require 'torque/postgresql/migration'
|
17
|
+
require 'torque/postgresql/relation'
|
18
|
+
require 'torque/postgresql/schema_dumper'
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'torque/postgresql'
|
metadata
ADDED
@@ -0,0 +1,236 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: torque-postgresql
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Carlos Silva
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-04-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 5.0.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '5.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 5.0.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: pg
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0.19'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 0.19.0
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0.19'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 0.19.0
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rake
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '10.1'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 10.1.0
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '10.1'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 10.1.0
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: database_cleaner
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '1.5'
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.5.3
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.5'
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 1.5.3
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: dotenv
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - "~>"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '2.1'
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 2.1.1
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '2.1'
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 2.1.1
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: rspec
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - "~>"
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '3.5'
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: 3.5.0
|
123
|
+
type: :development
|
124
|
+
prerelease: false
|
125
|
+
version_requirements: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '3.5'
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 3.5.0
|
133
|
+
- !ruby/object:Gem::Dependency
|
134
|
+
name: factory_girl
|
135
|
+
requirement: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '4.5'
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: 4.5.0
|
143
|
+
type: :development
|
144
|
+
prerelease: false
|
145
|
+
version_requirements: !ruby/object:Gem::Requirement
|
146
|
+
requirements:
|
147
|
+
- - "~>"
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '4.5'
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 4.5.0
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: faker
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '1.5'
|
160
|
+
- - ">="
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: 1.5.0
|
163
|
+
type: :development
|
164
|
+
prerelease: false
|
165
|
+
version_requirements: !ruby/object:Gem::Requirement
|
166
|
+
requirements:
|
167
|
+
- - "~>"
|
168
|
+
- !ruby/object:Gem::Version
|
169
|
+
version: '1.5'
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: 1.5.0
|
173
|
+
description: Add support to complex resources of PostgreSQL, like data types, user-defined
|
174
|
+
types and CTE with extensions for Arel and ActiveRecord
|
175
|
+
email:
|
176
|
+
- carlinhus.fsilva@gmail.com
|
177
|
+
executables: []
|
178
|
+
extensions: []
|
179
|
+
extra_rdoc_files: []
|
180
|
+
files:
|
181
|
+
- MIT-LICENSE
|
182
|
+
- Rakefile
|
183
|
+
- lib/torque-postgresql.rb
|
184
|
+
- lib/torque/postgresql.rb
|
185
|
+
- lib/torque/postgresql/adapter.rb
|
186
|
+
- lib/torque/postgresql/adapter/database_statements.rb
|
187
|
+
- lib/torque/postgresql/adapter/oid.rb
|
188
|
+
- lib/torque/postgresql/adapter/oid/array.rb
|
189
|
+
- lib/torque/postgresql/adapter/oid/enum.rb
|
190
|
+
- lib/torque/postgresql/adapter/oid/interval.rb
|
191
|
+
- lib/torque/postgresql/adapter/quoting.rb
|
192
|
+
- lib/torque/postgresql/adapter/schema_definitions.rb
|
193
|
+
- lib/torque/postgresql/adapter/schema_dumper.rb
|
194
|
+
- lib/torque/postgresql/adapter/schema_statements.rb
|
195
|
+
- lib/torque/postgresql/attributes.rb
|
196
|
+
- lib/torque/postgresql/attributes/builder.rb
|
197
|
+
- lib/torque/postgresql/attributes/builder/enum.rb
|
198
|
+
- lib/torque/postgresql/attributes/enum.rb
|
199
|
+
- lib/torque/postgresql/attributes/lazy.rb
|
200
|
+
- lib/torque/postgresql/attributes/type_map.rb
|
201
|
+
- lib/torque/postgresql/auxiliary_statement.rb
|
202
|
+
- lib/torque/postgresql/base.rb
|
203
|
+
- lib/torque/postgresql/collector.rb
|
204
|
+
- lib/torque/postgresql/config.rb
|
205
|
+
- lib/torque/postgresql/migration.rb
|
206
|
+
- lib/torque/postgresql/migration/command_recorder.rb
|
207
|
+
- lib/torque/postgresql/relation.rb
|
208
|
+
- lib/torque/postgresql/relation/auxiliary_statement.rb
|
209
|
+
- lib/torque/postgresql/relation/distinct_on.rb
|
210
|
+
- lib/torque/postgresql/schema_dumper.rb
|
211
|
+
- lib/torque/postgresql/version.rb
|
212
|
+
homepage: https://github.com/crashtech/torque-postgresql
|
213
|
+
licenses:
|
214
|
+
- MIT
|
215
|
+
metadata: {}
|
216
|
+
post_install_message:
|
217
|
+
rdoc_options: []
|
218
|
+
require_paths:
|
219
|
+
- lib
|
220
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
221
|
+
requirements:
|
222
|
+
- - ">="
|
223
|
+
- !ruby/object:Gem::Version
|
224
|
+
version: '0'
|
225
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - ">="
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0'
|
230
|
+
requirements: []
|
231
|
+
rubyforge_project:
|
232
|
+
rubygems_version: 2.5.1
|
233
|
+
signing_key:
|
234
|
+
specification_version: 4
|
235
|
+
summary: ActiveRecord extension to reach PostgreSQL native resources
|
236
|
+
test_files: []
|