sql_runner 0.3.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Travis-CI](https://travis-ci.org/fnando/sql_runner.svg)](https://travis-ci.org/fnando/sql_runner)
|
4
|
-
[![Code Climate](https://codeclimate.com/github/fnando/sql_runner/badges/gpa.svg)](https://codeclimate.com/github/fnando/sql_runner)
|
5
|
-
[![Test Coverage](https://codeclimate.com/github/fnando/sql_runner/badges/coverage.svg)](https://codeclimate.com/github/fnando/sql_runner/coverage)
|
6
3
|
[![Gem](https://img.shields.io/gem/v/sql_runner.svg)](https://rubygems.org/gems/sql_runner)
|
7
4
|
[![Gem](https://img.shields.io/gem/dt/sql_runner.svg)](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=
|