relation_to_struct 1.6.0 → 1.9.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 +5 -5
- data/.github/workflows/ci.yml +66 -0
- data/Appraisals +1 -6
- data/README.md +1 -1
- data/bin/setup +12 -0
- data/docker-compose.yml +8 -0
- data/gemfiles/{rails_5_0.gemfile → rails_6_1.gemfile} +1 -2
- data/gemfiles/{rails_5_1.gemfile → rails_7_0.gemfile} +1 -2
- data/gemfiles/{rails_5_2.gemfile → rails_7_1.gemfile} +1 -2
- data/lib/relation_to_struct/active_record_base_extension.rb +1 -5
- data/lib/relation_to_struct/active_record_connection_adapter_extension.rb +6 -6
- data/lib/relation_to_struct/active_record_relation_extension.rb +2 -7
- data/lib/relation_to_struct/version.rb +1 -1
- data/lib/relation_to_struct.rb +0 -3
- data/relation_to_struct.gemspec +3 -3
- data/spec/active_record_helper/setup.rb +3 -3
- data/spec/active_record_relation_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- metadata +21 -19
- data/gemfiles/rails_6_0.gemfile +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7bb8b931d89b6d73791900b6e8103442856413d8bead16b0f006b28163765ae9
|
4
|
+
data.tar.gz: '01867db9481ad85af27892312f23a5f9ceb7687bc7b3232e1c952324be98ab81'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a9aa775119c2e6de109e000591b7dcdd149d5caccc5e3dc145cab69f7e22bc1d142a83bcbb47ccf55f0d2ea9109d44973a7ea6f87226ae46d300b6b6f87e49b
|
7
|
+
data.tar.gz: 701affeecbfbce06009babd6d48f6b98622f7de98d7fce6bb3a701c0587845940057ded3661c6e0574a7b7a46ff8003c0f0b7837705263f1377725dae44dd553
|
@@ -0,0 +1,66 @@
|
|
1
|
+
name: CI
|
2
|
+
on: [push, pull_request]
|
3
|
+
jobs:
|
4
|
+
test_postgres:
|
5
|
+
strategy:
|
6
|
+
matrix:
|
7
|
+
pg:
|
8
|
+
- 11
|
9
|
+
- 12
|
10
|
+
- 13
|
11
|
+
- 14
|
12
|
+
- 15
|
13
|
+
- 16
|
14
|
+
ruby:
|
15
|
+
- "3.0"
|
16
|
+
- "3.1"
|
17
|
+
- "3.2"
|
18
|
+
gemfile:
|
19
|
+
- rails_6_1
|
20
|
+
- rails_7_0
|
21
|
+
- rails_7_1
|
22
|
+
name: PostgreSQL ${{ matrix.pg }} - Ruby ${{ matrix.ruby }} - ${{ matrix.gemfile }}
|
23
|
+
runs-on: ubuntu-latest
|
24
|
+
env: # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
|
25
|
+
BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
|
26
|
+
ImageOS: ubuntu20
|
27
|
+
steps:
|
28
|
+
- uses: actions/checkout@v3
|
29
|
+
- name: Start the postgres container
|
30
|
+
run: docker-compose up -d
|
31
|
+
env:
|
32
|
+
PGVERSION: ${{ matrix.pg }}
|
33
|
+
- name: Setup Ruby using .ruby-version file
|
34
|
+
uses: ruby/setup-ruby@v1
|
35
|
+
with:
|
36
|
+
ruby-version: ${{ matrix.ruby }}
|
37
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
38
|
+
- run: bundle exec rake spec
|
39
|
+
env:
|
40
|
+
DATABASE: postgresql
|
41
|
+
test_sqlite:
|
42
|
+
strategy:
|
43
|
+
matrix:
|
44
|
+
ruby:
|
45
|
+
- "3.0"
|
46
|
+
- "3.1"
|
47
|
+
- "3.2"
|
48
|
+
gemfile:
|
49
|
+
- rails_6_1
|
50
|
+
- rails_7_0
|
51
|
+
- rails_7_1
|
52
|
+
name: SQLite - Ruby ${{ matrix.ruby }} - ${{ matrix.gemfile }}
|
53
|
+
runs-on: ubuntu-latest
|
54
|
+
env: # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
|
55
|
+
BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
|
56
|
+
ImageOS: ubuntu20
|
57
|
+
steps:
|
58
|
+
- uses: actions/checkout@v3
|
59
|
+
- name: Setup Ruby using .ruby-version file
|
60
|
+
uses: ruby/setup-ruby@v1
|
61
|
+
with:
|
62
|
+
ruby-version: ${{ matrix.ruby }}
|
63
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
64
|
+
- run: bundle exec rake spec
|
65
|
+
env:
|
66
|
+
DATABASE: sqlite
|
data/Appraisals
CHANGED
@@ -1,10 +1,5 @@
|
|
1
|
-
%w(
|
1
|
+
%w(6.1 7.0 7.1).each do |version|
|
2
2
|
appraise "rails-#{version.gsub(/\./, "-")}" do
|
3
3
|
gem "rails", "~> #{version}.0"
|
4
|
-
if version[0] == '6'
|
5
|
-
gem "sqlite3", "~> 1.4.0"
|
6
|
-
else
|
7
|
-
gem "sqlite3", "~> 1.3.0"
|
8
|
-
end
|
9
4
|
end
|
10
5
|
end
|
data/README.md
CHANGED
@@ -110,4 +110,4 @@ For this reason, **all methods added to `ActiveRecord::Base` explicitly disable
|
|
110
110
|
|
111
111
|
1. Bump version in `lib/relation_to_struct/version.rb` and commit.
|
112
112
|
2. Run `rake build` to build the `*.gem` file.
|
113
|
-
3. Run `rake release` to publish the gem to Rubygems.
|
113
|
+
3. Run `rake release` to publish the gem to Rubygems. Note: if while releasing the gem you get the error ``Your rubygems.org credentials aren't set. Run `gem push` to set them.`` you can more simply run `gem signin`.
|
data/bin/setup
ADDED
data/docker-compose.yml
ADDED
@@ -1,9 +1,5 @@
|
|
1
1
|
module RelationToStruct::ActiveRecordBaseExtension
|
2
2
|
module ClassMethods
|
3
|
-
def _sanitize_sql_for_relation_to_struct(sql)
|
4
|
-
sanitized_sql = ActiveRecord::VERSION::MAJOR >= 5 ? sanitize_sql(sql) : sanitize_sql(sql, nil)
|
5
|
-
end
|
6
|
-
|
7
3
|
delegate(
|
8
4
|
:structs_from_sql,
|
9
5
|
:pluck_from_sql,
|
@@ -15,4 +11,4 @@ module RelationToStruct::ActiveRecordBaseExtension
|
|
15
11
|
end
|
16
12
|
end
|
17
13
|
|
18
|
-
::ActiveRecord::Base.singleton_class.
|
14
|
+
::ActiveRecord::Base.singleton_class.prepend(RelationToStruct::ActiveRecordBaseExtension::ClassMethods)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module RelationToStruct::ActiveRecordConnectionAdapterExtension
|
2
2
|
def structs_from_sql(struct_class, sql, binds=[])
|
3
|
-
sanitized_sql = ActiveRecord::Base.
|
3
|
+
sanitized_sql = ActiveRecord::Base.sanitize_sql(sql)
|
4
4
|
result = ActiveRecord::Base.uncached do
|
5
5
|
select_all(sanitized_sql, "Structs SQL Load", binds)
|
6
6
|
end
|
@@ -25,7 +25,7 @@ module RelationToStruct::ActiveRecordConnectionAdapterExtension
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def pluck_from_sql(sql, binds=[])
|
28
|
-
sanitized_sql = ActiveRecord::Base.
|
28
|
+
sanitized_sql = ActiveRecord::Base.sanitize_sql(sql)
|
29
29
|
result = ActiveRecord::Base.uncached do
|
30
30
|
select_all(sanitized_sql, "Pluck SQL Load", binds)
|
31
31
|
end
|
@@ -33,7 +33,7 @@ module RelationToStruct::ActiveRecordConnectionAdapterExtension
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def value_from_sql(sql, binds=[])
|
36
|
-
sanitized_sql = ActiveRecord::Base.
|
36
|
+
sanitized_sql = ActiveRecord::Base.sanitize_sql(sql)
|
37
37
|
result = ActiveRecord::Base.uncached do
|
38
38
|
select_all(sanitized_sql, "Value SQL Load", binds)
|
39
39
|
end
|
@@ -51,7 +51,7 @@ module RelationToStruct::ActiveRecordConnectionAdapterExtension
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def tuple_from_sql(sql, binds=[])
|
54
|
-
sanitized_sql = ActiveRecord::Base.
|
54
|
+
sanitized_sql = ActiveRecord::Base.sanitize_sql(sql)
|
55
55
|
result = ActiveRecord::Base.uncached do
|
56
56
|
select_all(sanitized_sql, "Value SQL Load", binds)
|
57
57
|
end
|
@@ -68,7 +68,7 @@ module RelationToStruct::ActiveRecordConnectionAdapterExtension
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def run_sql(sql, binds=[])
|
71
|
-
sanitized_sql = ActiveRecord::Base.
|
71
|
+
sanitized_sql = ActiveRecord::Base.sanitize_sql(sql)
|
72
72
|
# We don't need to build a result set unnecessarily; using
|
73
73
|
# interface this also ensures we're clearing the result set
|
74
74
|
# for manually memory managed object (e.g., when using the
|
@@ -77,4 +77,4 @@ module RelationToStruct::ActiveRecordConnectionAdapterExtension
|
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
|
-
::ActiveRecord::ConnectionAdapters::AbstractAdapter.
|
80
|
+
::ActiveRecord::ConnectionAdapters::AbstractAdapter.prepend(RelationToStruct::ActiveRecordConnectionAdapterExtension)
|
@@ -6,12 +6,7 @@ module RelationToStruct::ActiveRecordRelationExtension
|
|
6
6
|
|
7
7
|
# See the definition of #pluck in:
|
8
8
|
# activerecord/lib/active_record/relation/calculations.rb
|
9
|
-
result =
|
10
|
-
if ActiveRecord::VERSION::MAJOR == 5 && ActiveRecord::VERSION::MINOR < 2
|
11
|
-
result = klass.connection.select_all(relation.arel, nil, bound_attributes)
|
12
|
-
else
|
13
|
-
result = klass.connection.select_all(relation.arel)
|
14
|
-
end
|
9
|
+
result = klass.connection.select_all(relation.arel)
|
15
10
|
|
16
11
|
if result.columns.size != struct_class.members.size
|
17
12
|
raise ArgumentError, 'Expected struct fields and columns lengths to be equal'
|
@@ -35,4 +30,4 @@ module RelationToStruct::ActiveRecordRelationExtension
|
|
35
30
|
end
|
36
31
|
end
|
37
32
|
|
38
|
-
::ActiveRecord::Relation.
|
33
|
+
::ActiveRecord::Relation.prepend(RelationToStruct::ActiveRecordRelationExtension)
|
data/lib/relation_to_struct.rb
CHANGED
data/relation_to_struct.gemspec
CHANGED
@@ -21,11 +21,11 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "appraisal", ">= 2.1"
|
22
22
|
spec.add_development_dependency "bundler", ">= 1.7"
|
23
23
|
spec.add_development_dependency "rake", ">= 10.0"
|
24
|
-
spec.add_development_dependency "sqlite3", ">= 1.
|
24
|
+
spec.add_development_dependency "sqlite3", ">= 1.4"
|
25
25
|
spec.add_development_dependency "rspec", ">= 3.2"
|
26
26
|
spec.add_development_dependency "pry-byebug"
|
27
27
|
spec.add_development_dependency "pg"
|
28
28
|
|
29
|
-
spec.add_dependency "activerecord", ">=
|
30
|
-
spec.add_dependency "activesupport", ">=
|
29
|
+
spec.add_dependency "activerecord", ">= 6.1", "< 7.2"
|
30
|
+
spec.add_dependency "activesupport", ">= 6.1", "< 7.2"
|
31
31
|
end
|
@@ -4,8 +4,8 @@ ActiveRecord::Base.configurations = {
|
|
4
4
|
"host" => 'localhost',
|
5
5
|
"database" => 'relation_to_struct_tests',
|
6
6
|
"encoding" => 'utf8',
|
7
|
-
"username" => ENV["
|
8
|
-
"password" => ENV["
|
7
|
+
"username" => ENV["PGUSER"] || 'postgres',
|
8
|
+
"password" => ENV["PGPASSWORD"] || 'postgres',
|
9
9
|
},
|
10
10
|
"sqlite" => {
|
11
11
|
"adapter" => "sqlite3",
|
@@ -14,7 +14,7 @@ ActiveRecord::Base.configurations = {
|
|
14
14
|
}
|
15
15
|
|
16
16
|
env = ENV['DATABASE'] ||= 'sqlite'
|
17
|
-
config = ActiveRecord::Base.configurations
|
17
|
+
config = ActiveRecord::Base.configurations.configs_for(env_name: env).first
|
18
18
|
|
19
19
|
case env
|
20
20
|
when 'postgresql'
|
@@ -57,7 +57,7 @@ describe ActiveRecord::Relation do
|
|
57
57
|
it 'properly casts values from arbitrary calculated columns' do
|
58
58
|
hayek = Economist.create!(name: 'F.A. Hayek')
|
59
59
|
scope = Economist.all
|
60
|
-
pluck_results = scope.pluck("date('now')")
|
60
|
+
pluck_results = scope.pluck(Arel.sql("date('now')"))
|
61
61
|
pluck_column_klass = pluck_results.first.class
|
62
62
|
|
63
63
|
date_struct = Struct.new(:date)
|
data/spec/spec_helper.rb
CHANGED
@@ -14,7 +14,7 @@ def active_record_supports_arrays?
|
|
14
14
|
Economist.create!(name: 'F.A. Hayek')
|
15
15
|
Economist.create!(name: 'Ludwig von Mises')
|
16
16
|
|
17
|
-
pluck_results = Economist.select('name').order('id').limit(1).pluck('array[name]')
|
17
|
+
pluck_results = Economist.select('name').order('id').limit(1).pluck(Arel.sql('array[name]')) rescue nil
|
18
18
|
if pluck_results
|
19
19
|
raise StandardError, "Unexpected array query results" unless pluck_results == [['F.A. Hayek']] # Verify ActiveRecord interface.
|
20
20
|
supports_arrays = true
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: relation_to_struct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Coleman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-10-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: appraisal
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '1.
|
61
|
+
version: '1.4'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '1.
|
68
|
+
version: '1.4'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,47 +114,49 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
117
|
+
version: '6.1'
|
118
118
|
- - "<"
|
119
119
|
- !ruby/object:Gem::Version
|
120
|
-
version: '7'
|
120
|
+
version: '7.2'
|
121
121
|
type: :runtime
|
122
122
|
prerelease: false
|
123
123
|
version_requirements: !ruby/object:Gem::Requirement
|
124
124
|
requirements:
|
125
125
|
- - ">="
|
126
126
|
- !ruby/object:Gem::Version
|
127
|
-
version: '
|
127
|
+
version: '6.1'
|
128
128
|
- - "<"
|
129
129
|
- !ruby/object:Gem::Version
|
130
|
-
version: '7'
|
130
|
+
version: '7.2'
|
131
131
|
- !ruby/object:Gem::Dependency
|
132
132
|
name: activesupport
|
133
133
|
requirement: !ruby/object:Gem::Requirement
|
134
134
|
requirements:
|
135
135
|
- - ">="
|
136
136
|
- !ruby/object:Gem::Version
|
137
|
-
version: '
|
137
|
+
version: '6.1'
|
138
138
|
- - "<"
|
139
139
|
- !ruby/object:Gem::Version
|
140
|
-
version: '7'
|
140
|
+
version: '7.2'
|
141
141
|
type: :runtime
|
142
142
|
prerelease: false
|
143
143
|
version_requirements: !ruby/object:Gem::Requirement
|
144
144
|
requirements:
|
145
145
|
- - ">="
|
146
146
|
- !ruby/object:Gem::Version
|
147
|
-
version: '
|
147
|
+
version: '6.1'
|
148
148
|
- - "<"
|
149
149
|
- !ruby/object:Gem::Version
|
150
|
-
version: '7'
|
150
|
+
version: '7.2'
|
151
151
|
description: ''
|
152
152
|
email:
|
153
153
|
- jtc331@gmail.com
|
154
|
-
executables:
|
154
|
+
executables:
|
155
|
+
- setup
|
155
156
|
extensions: []
|
156
157
|
extra_rdoc_files: []
|
157
158
|
files:
|
159
|
+
- ".github/workflows/ci.yml"
|
158
160
|
- ".gitignore"
|
159
161
|
- ".rspec"
|
160
162
|
- Appraisals
|
@@ -162,10 +164,11 @@ files:
|
|
162
164
|
- LICENSE.txt
|
163
165
|
- README.md
|
164
166
|
- Rakefile
|
165
|
-
-
|
166
|
-
-
|
167
|
-
- gemfiles/
|
168
|
-
- gemfiles/
|
167
|
+
- bin/setup
|
168
|
+
- docker-compose.yml
|
169
|
+
- gemfiles/rails_6_1.gemfile
|
170
|
+
- gemfiles/rails_7_0.gemfile
|
171
|
+
- gemfiles/rails_7_1.gemfile
|
169
172
|
- lib/relation_to_struct.rb
|
170
173
|
- lib/relation_to_struct/active_record_base_extension.rb
|
171
174
|
- lib/relation_to_struct/active_record_connection_adapter_extension.rb
|
@@ -200,8 +203,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
200
203
|
- !ruby/object:Gem::Version
|
201
204
|
version: '0'
|
202
205
|
requirements: []
|
203
|
-
|
204
|
-
rubygems_version: 2.5.2.3
|
206
|
+
rubygems_version: 3.1.6
|
205
207
|
signing_key:
|
206
208
|
specification_version: 4
|
207
209
|
summary: Return struct results from ActiveRecord relation queries
|