sql_runner 0.3.0 → 0.4.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/.github/workflows/test.yml +81 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +2 -1
- data/CODE_OF_CONDUCT.md +12 -12
- data/README.md +2 -5
- data/lib/sql_runner/adapters/active_record.rb +17 -1
- data/lib/sql_runner/adapters/sqlite.rb +91 -0
- data/lib/sql_runner/adapters.rb +1 -0
- data/lib/sql_runner/query.rb +8 -1
- data/lib/sql_runner/version.rb +1 -1
- data/lib/sql_runner.rb +2 -0
- data/sql_runner.gemspec +2 -1
- metadata +20 -5
- data/.travis.yml +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3224a627fbfdb75b22aff61e35fce3def752d203da72e6cfc89a80c539cfd413
|
4
|
+
data.tar.gz: 0b6102814d498c2fbf53b1b642f3d03b639af95514d5d1d9854d579deb79aee4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a622ef1f472136f5298a3fa4c37ba3b46f3265e7538c126ad2718e950db0e24fcfd65b49dad8eee47cf7fa699ca0623cc970cebbaabc89f327092ef5998b910
|
7
|
+
data.tar.gz: 126036d892682c63236f01dec9152fdf8cbc66e58846e04ca2e4767a408409e1f154cf57104d8cc59b78f03310f359293856e987d1271ab4efdbd72867f97dc1
|
@@ -0,0 +1,81 @@
|
|
1
|
+
---
|
2
|
+
name: ruby-tests
|
3
|
+
|
4
|
+
on:
|
5
|
+
pull_request_target:
|
6
|
+
push:
|
7
|
+
branches:
|
8
|
+
- main
|
9
|
+
workflow_dispatch:
|
10
|
+
inputs: {}
|
11
|
+
|
12
|
+
jobs:
|
13
|
+
build:
|
14
|
+
name: Tests with Ruby ${{ matrix.ruby }} and ${{ matrix.gemfile }}
|
15
|
+
runs-on: "ubuntu-latest"
|
16
|
+
if: |
|
17
|
+
github.actor == 'dependabot[bot]' && github.event_name == 'pull_request_target' ||
|
18
|
+
github.actor != 'dependabot[bot]'
|
19
|
+
strategy:
|
20
|
+
fail-fast: false
|
21
|
+
matrix:
|
22
|
+
ruby: ["3.0", "3.1", "3.2"]
|
23
|
+
gemfile:
|
24
|
+
- Gemfile
|
25
|
+
|
26
|
+
services:
|
27
|
+
postgres:
|
28
|
+
image: postgres
|
29
|
+
env:
|
30
|
+
POSTGRES_DB: test
|
31
|
+
POSTGRES_HOST_AUTH_METHOD: trust
|
32
|
+
options: >-
|
33
|
+
--health-cmd pg_isready --health-interval 10s --health-timeout 5s
|
34
|
+
--health-retries 5
|
35
|
+
ports:
|
36
|
+
- 5432:5432
|
37
|
+
mysql:
|
38
|
+
image: mysql:8.0
|
39
|
+
env:
|
40
|
+
MYSQL_ROOT_PASSWORD: test
|
41
|
+
MYSQL_PASSWORD: test
|
42
|
+
MYSQL_DATABASE: test
|
43
|
+
MYSQL_USER: test
|
44
|
+
ports:
|
45
|
+
- 3306:3306
|
46
|
+
options:
|
47
|
+
--health-cmd="mysqladmin ping" --health-interval=10s
|
48
|
+
--health-timeout=5s --health-retries=3
|
49
|
+
|
50
|
+
steps:
|
51
|
+
- uses: actions/checkout@v3
|
52
|
+
|
53
|
+
- uses: actions/cache@v3
|
54
|
+
with:
|
55
|
+
path: vendor/bundle
|
56
|
+
key: >
|
57
|
+
${{ runner.os }}-${{ matrix.ruby }}-gems-${{
|
58
|
+
hashFiles(matrix.gemfile) }}
|
59
|
+
|
60
|
+
- name: Set up Ruby
|
61
|
+
uses: ruby/setup-ruby@v1
|
62
|
+
with:
|
63
|
+
ruby-version: ${{ matrix.ruby }}
|
64
|
+
|
65
|
+
- name: Install gem dependencies
|
66
|
+
env:
|
67
|
+
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
|
68
|
+
run: |
|
69
|
+
gem install bundler
|
70
|
+
bundle config path vendor/bundle
|
71
|
+
bundle update --jobs 4 --retry 3
|
72
|
+
|
73
|
+
- name: Run Tests
|
74
|
+
env:
|
75
|
+
PGHOST: localhost
|
76
|
+
PGUSER: postgres
|
77
|
+
PG_DATABASE_URL: "postgres://127.0.0.1/test?application_name=sql_runner"
|
78
|
+
MYSQL_DATABASE_URL: "mysql2://test:test@127.0.0.1/test?application_name=sql_runner"
|
79
|
+
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
|
80
|
+
run: |
|
81
|
+
bundle exec rake
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/CODE_OF_CONDUCT.md
CHANGED
@@ -12,19 +12,19 @@ body size, race, ethnicity, age, religion, or nationality.
|
|
12
12
|
|
13
13
|
Examples of unacceptable behavior by participants include:
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
- The use of sexualized language or imagery
|
16
|
+
- Personal attacks
|
17
|
+
- Trolling or insulting/derogatory comments
|
18
|
+
- Public or private harassment
|
19
|
+
- Publishing other's private information, such as physical or electronic
|
20
20
|
addresses, without explicit permission
|
21
|
-
|
21
|
+
- Other unethical or unprofessional conduct
|
22
22
|
|
23
|
-
Project maintainers have the right and responsibility to remove, edit, or
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
Project maintainers have the right and responsibility to remove, edit, or reject
|
24
|
+
comments, commits, code, wiki edits, issues, and other contributions that are
|
25
|
+
not aligned to this Code of Conduct, or to ban temporarily or permanently any
|
26
|
+
contributor for other behaviors that they deem inappropriate, threatening,
|
27
|
+
offensive, or harmful.
|
28
28
|
|
29
29
|
By adopting this Code of Conduct, project maintainers commit themselves to
|
30
30
|
fairly and consistently applying these principles to every aspect of managing
|
@@ -46,4 +46,4 @@ version 1.3.0, available at
|
|
46
46
|
[http://contributor-covenant.org/version/1/3/0/][version]
|
47
47
|
|
48
48
|
[homepage]: http://contributor-covenant.org
|
49
|
-
[version]: http://contributor-covenant.org/version/1/3/0/
|
49
|
+
[version]: http://contributor-covenant.org/version/1/3/0/
|
data/README.md
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
# SQLRunner
|
2
2
|
|
3
|
-
[](https://travis-ci.org/fnando/sql_runner)
|
4
|
-
[](https://codeclimate.com/github/fnando/sql_runner)
|
5
|
-
[](https://codeclimate.com/github/fnando/sql_runner/coverage)
|
6
3
|
[](https://rubygems.org/gems/sql_runner)
|
7
4
|
[](https://rubygems.org/gems/sql_runner)
|
8
5
|
|
@@ -48,7 +45,7 @@ Run SQL files:
|
|
48
45
|
SQLRunner.root_dir = "#{__dir__}/sql"
|
49
46
|
|
50
47
|
class GetMembers < SQLRunner::Query
|
51
|
-
# by default will use root_dir/get_members.sql
|
48
|
+
# by default will use root_dir/get_members.{sql,psql}
|
52
49
|
end
|
53
50
|
```
|
54
51
|
|
@@ -72,7 +69,7 @@ Specify other options:
|
|
72
69
|
|
73
70
|
```ruby
|
74
71
|
class GetMembers < SQLRunner::Query
|
75
|
-
query_name "users" #=> will load root_dir/users.sql
|
72
|
+
query_name "users" #=> will load root_dir/users.{psql,sql}
|
76
73
|
root_dir "/some/path"
|
77
74
|
end
|
78
75
|
```
|
@@ -27,6 +27,18 @@ module SQLRunner
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
+
class SQLite < SQLRunner::Adapters::SQLite
|
31
|
+
def initialize(connection) # rubocop:disable Lint/MissingSuper
|
32
|
+
@connection = connection
|
33
|
+
end
|
34
|
+
|
35
|
+
def connect(*)
|
36
|
+
end
|
37
|
+
|
38
|
+
def disconnect(*)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
30
42
|
class ConnectionPool
|
31
43
|
def with
|
32
44
|
::ActiveRecord::Base.connection_pool.with_connection do |connection|
|
@@ -37,8 +49,12 @@ module SQLRunner
|
|
37
49
|
PostgreSQL.new(connection)
|
38
50
|
when "Mysql2::Client"
|
39
51
|
MySQL.new(connection)
|
52
|
+
when "SQLite3::Database"
|
53
|
+
SQLite.new(connection)
|
40
54
|
else
|
41
|
-
raise UnsupportedDatabase
|
55
|
+
raise UnsupportedDatabase,
|
56
|
+
"#{connection.class.name} is not yet supported " \
|
57
|
+
"by the SQLRunner's ActiveRecord adapter"
|
42
58
|
end
|
43
59
|
|
44
60
|
yield(adapter)
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SQLRunner
|
4
|
+
module Adapters
|
5
|
+
class SQLite
|
6
|
+
InvalidPreparedStatement = Class.new(StandardError)
|
7
|
+
|
8
|
+
def self.load
|
9
|
+
require "sqlite3"
|
10
|
+
rescue LoadError
|
11
|
+
raise MissingDependency, "make sure the `sqlite3` gem is available"
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.create_connection_pool(timeout:, size:, connection_string:)
|
15
|
+
ConnectionPool.new(timeout: timeout, size: size) do
|
16
|
+
new(connection_string)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(connection_string)
|
21
|
+
@connection_string = connection_string
|
22
|
+
@uri = URI(connection_string)
|
23
|
+
connect
|
24
|
+
end
|
25
|
+
|
26
|
+
def connect
|
27
|
+
@connection = SQLite3::Database.new(
|
28
|
+
@uri.hostname || @uri.opaque,
|
29
|
+
results_as_hash: true
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
def disconnect
|
34
|
+
@connection&.close && (@connection = nil)
|
35
|
+
end
|
36
|
+
|
37
|
+
def reconnect
|
38
|
+
disconnect
|
39
|
+
connect
|
40
|
+
end
|
41
|
+
|
42
|
+
def execute(query, **bind_vars)
|
43
|
+
_, _, names = parse(query, bind_vars)
|
44
|
+
validate_bindings(query, bind_vars, names)
|
45
|
+
|
46
|
+
@connection.execute(query, **bind_vars)
|
47
|
+
end
|
48
|
+
|
49
|
+
def active?
|
50
|
+
!@connection&.closed?
|
51
|
+
rescue SQLite3::Exception
|
52
|
+
false
|
53
|
+
end
|
54
|
+
|
55
|
+
def to_s
|
56
|
+
%[#<#{self.class.name} #{format('0x00%x', (object_id << 1))}>]
|
57
|
+
end
|
58
|
+
|
59
|
+
def inspect
|
60
|
+
to_s
|
61
|
+
end
|
62
|
+
|
63
|
+
def parse(query, bind_vars)
|
64
|
+
bindings = []
|
65
|
+
names = []
|
66
|
+
|
67
|
+
parsed_query = query.gsub(/(:?):([a-zA-Z]\w*)/) do |match|
|
68
|
+
next match if Regexp.last_match(1) == ":" # skip type casting
|
69
|
+
|
70
|
+
name = match[1..-1]
|
71
|
+
sym_name = name.to_sym
|
72
|
+
names << sym_name
|
73
|
+
bindings << bind_vars[sym_name]
|
74
|
+
|
75
|
+
"?"
|
76
|
+
end
|
77
|
+
|
78
|
+
[parsed_query, bindings, names]
|
79
|
+
end
|
80
|
+
|
81
|
+
private def validate_bindings(query, bind_vars, names)
|
82
|
+
names.each do |name|
|
83
|
+
next if bind_vars.key?(name)
|
84
|
+
|
85
|
+
raise InvalidPreparedStatement,
|
86
|
+
"missing value for :#{name} in #{query}"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
data/lib/sql_runner/adapters.rb
CHANGED
data/lib/sql_runner/query.rb
CHANGED
@@ -37,7 +37,14 @@ module SQLRunner
|
|
37
37
|
|
38
38
|
def self.query(*value)
|
39
39
|
@query = value.first if value.any?
|
40
|
-
@query || (@query = File.read(
|
40
|
+
@query || (@query = File.read(find_query_file))
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.find_query_file
|
44
|
+
[
|
45
|
+
File.join(root_dir, "#{query_name}.psql"),
|
46
|
+
File.join(root_dir, "#{query_name}.sql")
|
47
|
+
].find {|file| File.file?(file) }
|
41
48
|
end
|
42
49
|
|
43
50
|
def self.connection_pool
|
data/lib/sql_runner/version.rb
CHANGED
data/lib/sql_runner.rb
CHANGED
@@ -22,6 +22,8 @@ module SQLRunner
|
|
22
22
|
Adapters.register("postgresql", Adapters::PostgreSQL)
|
23
23
|
Adapters.register("mysql", Adapters::MySQL)
|
24
24
|
Adapters.register("mysql2", Adapters::MySQL)
|
25
|
+
Adapters.register("sqlite", Adapters::SQLite)
|
26
|
+
Adapters.register("sqlite3", Adapters::SQLite)
|
25
27
|
|
26
28
|
Query.register_plugin :one, Query::One
|
27
29
|
Query.register_plugin :many, Query::Many
|
data/sql_runner.gemspec
CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
|
|
7
7
|
spec.version = SQLRunner::VERSION
|
8
8
|
spec.authors = ["Nando Vieira"]
|
9
9
|
spec.email = ["me@fnando.com"]
|
10
|
-
spec.required_ruby_version = Gem::Requirement.new(">=
|
10
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 3.0.0")
|
11
11
|
spec.metadata = {"rubygems_mfa_required" => "true"}
|
12
12
|
|
13
13
|
spec.summary = <<~TEXT.tr("\n", " ")
|
@@ -39,4 +39,5 @@ Gem::Specification.new do |spec|
|
|
39
39
|
spec.add_development_dependency "rubocop"
|
40
40
|
spec.add_development_dependency "rubocop-fnando"
|
41
41
|
spec.add_development_dependency "simplecov"
|
42
|
+
spec.add_development_dependency "sqlite3"
|
42
43
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sql_runner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nando Vieira
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: connection_pool
|
@@ -178,6 +178,20 @@ dependencies:
|
|
178
178
|
- - ">="
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: sqlite3
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
181
195
|
description: SQLRunner allows you to load your queries out of SQL files, without using
|
182
196
|
ORMs.
|
183
197
|
email:
|
@@ -187,9 +201,9 @@ extensions: []
|
|
187
201
|
extra_rdoc_files: []
|
188
202
|
files:
|
189
203
|
- ".github/FUNDING.yml"
|
204
|
+
- ".github/workflows/test.yml"
|
190
205
|
- ".gitignore"
|
191
206
|
- ".rubocop.yml"
|
192
|
-
- ".travis.yml"
|
193
207
|
- CODE_OF_CONDUCT.md
|
194
208
|
- Gemfile
|
195
209
|
- LICENSE.txt
|
@@ -211,6 +225,7 @@ files:
|
|
211
225
|
- lib/sql_runner/adapters/active_record.rb
|
212
226
|
- lib/sql_runner/adapters/mysql.rb
|
213
227
|
- lib/sql_runner/adapters/postgresql.rb
|
228
|
+
- lib/sql_runner/adapters/sqlite.rb
|
214
229
|
- lib/sql_runner/configuration.rb
|
215
230
|
- lib/sql_runner/connection.rb
|
216
231
|
- lib/sql_runner/query.rb
|
@@ -233,14 +248,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
233
248
|
requirements:
|
234
249
|
- - ">="
|
235
250
|
- !ruby/object:Gem::Version
|
236
|
-
version:
|
251
|
+
version: 3.0.0
|
237
252
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
238
253
|
requirements:
|
239
254
|
- - ">="
|
240
255
|
- !ruby/object:Gem::Version
|
241
256
|
version: '0'
|
242
257
|
requirements: []
|
243
|
-
rubygems_version: 3.
|
258
|
+
rubygems_version: 3.4.1
|
244
259
|
signing_key:
|
245
260
|
specification_version: 4
|
246
261
|
summary: SQLRunner allows you to load your queries out of SQL files, without using
|
data/.travis.yml
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
---
|
2
|
-
language: ruby
|
3
|
-
cache: bundler
|
4
|
-
sudo: false
|
5
|
-
rvm:
|
6
|
-
- 2.7.0
|
7
|
-
services:
|
8
|
-
- mysql
|
9
|
-
addons:
|
10
|
-
postgresql: "10"
|
11
|
-
apt:
|
12
|
-
packages:
|
13
|
-
- postgresql-10
|
14
|
-
- postgresql-client-10
|
15
|
-
before_script:
|
16
|
-
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
17
|
-
- chmod +x ./cc-test-reporter
|
18
|
-
- "./cc-test-reporter before-build"
|
19
|
-
after_script:
|
20
|
-
- "./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
|
21
|
-
before_install:
|
22
|
-
- gem install bundler
|
23
|
-
- createdb test
|
24
|
-
- mysql -e 'CREATE DATABASE IF NOT EXISTS test;'
|
25
|
-
notifications:
|
26
|
-
email: false
|
27
|
-
env:
|
28
|
-
global:
|
29
|
-
secure: 4dDrl8nCItKPRKpoA2KJVWsDm3o7U0pIsdY8t19pJXbziteT3zw5pEmFh+/qWGB1VszzFFZzXcZCIoKv3NX/x24g+LU+qvL7vLYLyhUR8ZjR4rGzGkwBCgEYBWgVtqg9ncYTbYsdbAqryt6f+HvpFj8EFvGSjIWVqJyh59qHdwAVT+BUKjllEH+t5Dbjd2knIQw83af+0A5ljP2uMziNcuHD7MUBIKY1DfFnBYQ5YA50o/mZe8sG5h6bZU/sf0pdoa+z2xDIJOPO7qaCwANACetDtsfs1DN39DsubvlFLg0s2z0XCuYyWSsJQ4zhRipHgnqYn+Rmpql17t0WmhVPA1xvLyk0/4X8rjRcYyYHMM3ryga5bnrpvSiPsqG+JFNhDczpN394KGa7o+/jCuNA0MVFcCzsvW2AMkYpUbPtADY7/Tl4iUJWmFbl0nO1n1wh5dDJ7Wo7mdkPAmdV7hNmMUmHbPeh8mSjMnuS2gcMc11wDgmR56TEMu/B7LUM31og7L+JouEJAOWtzThtpdYLpqDQ3Xe1G5uMl1oZ0lNOqag5Bg+AQCAIGr1N4G2m8fI74M9lUQUfhu87L+zycYMHInOH+Czc+RamlkH3vLl9Fu6aOKoXA0+zh85sVDj3Er+X2NEHaoRe4PSkOHOBNYSkAUd36TYMt8J5MgAD0w7HqmY=
|