sql_runner 0.1.0 → 0.4.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/FUNDING.yml +3 -0
- data/.gitignore +2 -1
- data/.rubocop.yml +16 -0
- data/.travis.yml +20 -4
- data/Gemfile +2 -0
- data/README.md +48 -10
- data/Rakefile +7 -2
- data/bin/console +1 -0
- data/examples/base.rb +96 -0
- data/examples/bench.rb +21 -5
- data/examples/profiling.rb +2 -0
- data/examples/test.rb +3 -84
- data/examples/test_active_record.rb +17 -0
- data/lib/sql_runner/adapters/active_record.rb +79 -0
- data/lib/sql_runner/adapters/mysql.rb +107 -0
- data/lib/sql_runner/adapters/postgresql.rb +24 -18
- data/lib/sql_runner/adapters/sqlite.rb +91 -0
- data/lib/sql_runner/adapters.rb +16 -7
- data/lib/sql_runner/configuration.rb +3 -3
- data/lib/sql_runner/connection.rb +8 -4
- data/lib/sql_runner/query/many.rb +2 -0
- data/lib/sql_runner/query/model.rb +3 -1
- data/lib/sql_runner/query/one.rb +10 -1
- data/lib/sql_runner/query.rb +26 -8
- data/lib/sql_runner/runner.rb +4 -2
- data/lib/sql_runner/version.rb +3 -1
- data/lib/sql_runner.rb +9 -2
- data/sql_runner.gemspec +23 -8
- metadata +94 -17
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SQLRunner
|
2
4
|
module Adapters
|
3
5
|
class PostgreSQL
|
@@ -6,7 +8,13 @@ module SQLRunner
|
|
6
8
|
def self.load
|
7
9
|
require "pg"
|
8
10
|
rescue LoadError
|
9
|
-
|
11
|
+
raise MissingDependency, "make sure the `pg` 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
|
10
18
|
end
|
11
19
|
|
12
20
|
def initialize(connection_string)
|
@@ -19,16 +27,14 @@ module SQLRunner
|
|
19
27
|
rescue PG::ConnectionBad
|
20
28
|
ended = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
21
29
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
raise
|
27
|
-
end
|
30
|
+
raise unless ended - started < SQLRunner.timeout
|
31
|
+
|
32
|
+
sleep 0.1
|
33
|
+
connect(started)
|
28
34
|
end
|
29
35
|
|
30
36
|
def disconnect
|
31
|
-
@connection
|
37
|
+
@connection&.close && (@connection = nil)
|
32
38
|
end
|
33
39
|
|
34
40
|
def reconnect
|
@@ -36,14 +42,10 @@ module SQLRunner
|
|
36
42
|
connect
|
37
43
|
end
|
38
44
|
|
39
|
-
def connection
|
40
|
-
@connection
|
41
|
-
end
|
42
|
-
|
43
45
|
def execute(query, **bind_vars)
|
44
|
-
|
46
|
+
bound_query, bindings = parse(query)
|
45
47
|
args = extract_args(query, bindings, bind_vars)
|
46
|
-
@connection.exec_params(
|
48
|
+
@connection.exec_params(bound_query, args)
|
47
49
|
rescue PG::ConnectionBad
|
48
50
|
reconnect
|
49
51
|
execute(query, **bind_vars)
|
@@ -56,7 +58,7 @@ module SQLRunner
|
|
56
58
|
end
|
57
59
|
|
58
60
|
def to_s
|
59
|
-
%[#<#{self.class.name} #{
|
61
|
+
%[#<#{self.class.name} #{format('0x00%x', (object_id << 1))}>]
|
60
62
|
end
|
61
63
|
|
62
64
|
def inspect
|
@@ -68,12 +70,13 @@ module SQLRunner
|
|
68
70
|
count = 0
|
69
71
|
|
70
72
|
parsed_query = query.gsub(/(:?):([a-zA-Z]\w*)/) do |match|
|
71
|
-
|
73
|
+
# skip type casting
|
74
|
+
next match if Regexp.last_match(1) == ":"
|
72
75
|
|
73
76
|
name = match[1..-1]
|
74
77
|
sym_name = name.to_sym
|
75
78
|
|
76
|
-
|
79
|
+
unless (index = bindings[sym_name])
|
77
80
|
index = (count += 1)
|
78
81
|
bindings[sym_name] = index
|
79
82
|
end
|
@@ -86,7 +89,10 @@ module SQLRunner
|
|
86
89
|
|
87
90
|
private def extract_args(query, bindings, bind_vars)
|
88
91
|
bindings.each_with_object([]) do |(name, position), buffer|
|
89
|
-
buffer[position - 1] = bind_vars.fetch(name)
|
92
|
+
buffer[position - 1] = bind_vars.fetch(name) do
|
93
|
+
raise InvalidPreparedStatement,
|
94
|
+
"missing value for :#{name} in #{query}"
|
95
|
+
end
|
90
96
|
end
|
91
97
|
end
|
92
98
|
end
|
@@ -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
@@ -1,20 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SQLRunner
|
2
4
|
UnsupportedDatabase = Class.new(StandardError)
|
3
|
-
MissingDependency
|
5
|
+
MissingDependency = Class.new(StandardError)
|
6
|
+
|
7
|
+
def self.adapter_registry
|
8
|
+
@adapter_registry ||= {}
|
9
|
+
end
|
4
10
|
|
5
11
|
module Adapters
|
6
12
|
require "sql_runner/adapters/postgresql"
|
7
|
-
|
8
|
-
|
13
|
+
require "sql_runner/adapters/mysql"
|
14
|
+
require "sql_runner/adapters/sqlite"
|
15
|
+
require "sql_runner/adapters/active_record"
|
9
16
|
|
10
17
|
def self.register(name, adapter)
|
11
|
-
|
18
|
+
SQLRunner.adapter_registry[name] = adapter
|
12
19
|
end
|
13
20
|
|
14
21
|
def self.find(name)
|
15
|
-
|
16
|
-
|
17
|
-
|
22
|
+
adapter = SQLRunner.adapter_registry.fetch(name) do
|
23
|
+
raise UnsupportedDatabase, "#{name} is not supported by SQLRunner"
|
24
|
+
end
|
25
|
+
|
26
|
+
adapter.tap(&:load)
|
18
27
|
end
|
19
28
|
end
|
20
29
|
end
|
@@ -1,12 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SQLRunner
|
2
4
|
module Connection
|
3
5
|
def self.call(connection_string)
|
4
6
|
uri = URI.parse(connection_string)
|
5
7
|
adapter = Adapters.find(uri.scheme)
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
|
9
|
+
adapter.create_connection_pool(
|
10
|
+
timeout: SQLRunner.timeout,
|
11
|
+
size: SQLRunner.pool,
|
12
|
+
connection_string: connection_string
|
13
|
+
)
|
10
14
|
end
|
11
15
|
|
12
16
|
def with_connection(&block)
|
@@ -18,7 +22,7 @@ module SQLRunner
|
|
18
22
|
end
|
19
23
|
|
20
24
|
def disconnect
|
21
|
-
connection_pool
|
25
|
+
connection_pool&.shutdown(&:disconnect) && (@connection_pool = nil)
|
22
26
|
end
|
23
27
|
|
24
28
|
def connection_pool
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SQLRunner
|
2
4
|
class Query
|
3
5
|
module Model
|
@@ -13,7 +15,7 @@ module SQLRunner
|
|
13
15
|
def call(**bind_vars)
|
14
16
|
result = super(**bind_vars)
|
15
17
|
return unless result
|
16
|
-
return model.new(result) if result.
|
18
|
+
return model.new(result) if result.is_a?(Hash)
|
17
19
|
|
18
20
|
result.to_a.map do |attrs|
|
19
21
|
model.new(attrs)
|
data/lib/sql_runner/query/one.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SQLRunner
|
2
4
|
class Query
|
3
5
|
module One
|
@@ -11,7 +13,14 @@ module SQLRunner
|
|
11
13
|
end
|
12
14
|
|
13
15
|
def call!(**bind_vars)
|
14
|
-
call(**bind_vars)
|
16
|
+
result = call(**bind_vars)
|
17
|
+
|
18
|
+
return result if result
|
19
|
+
|
20
|
+
raise(
|
21
|
+
SQLRunner::RecordNotFound,
|
22
|
+
"#{name}: record was not found with #{bind_vars.inspect} arguments"
|
23
|
+
)
|
15
24
|
end
|
16
25
|
end
|
17
26
|
end
|
data/lib/sql_runner/query.rb
CHANGED
@@ -1,12 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SQLRunner
|
2
|
-
RecordNotFound
|
3
|
-
PluginNotFound
|
4
|
+
RecordNotFound = Class.new(StandardError)
|
5
|
+
PluginNotFound = Class.new(StandardError)
|
4
6
|
InvalidPluginOrder = Class.new(StandardError)
|
7
|
+
NotImplemented = Class.new(StandardError)
|
8
|
+
|
9
|
+
def self.plugin_registry
|
10
|
+
@plugin_registry ||= {}
|
11
|
+
end
|
5
12
|
|
6
13
|
class Query
|
7
14
|
extend Runner
|
8
15
|
|
9
|
-
|
16
|
+
def self.inherited(subclass)
|
17
|
+
super
|
18
|
+
subclass.instance_variable_set(:@connection_pool, @connection_pool)
|
19
|
+
subclass.instance_variable_set(:@root_dir, @root_dir)
|
20
|
+
end
|
10
21
|
|
11
22
|
def self.query_name(*values)
|
12
23
|
@query_name = values.first if values.any?
|
@@ -14,9 +25,13 @@ module SQLRunner
|
|
14
25
|
end
|
15
26
|
|
16
27
|
def self.query_name_from_class
|
28
|
+
replacer = proc do
|
29
|
+
"#{Regexp.last_match(1)}_#{Regexp.last_match(2).downcase}"
|
30
|
+
end
|
31
|
+
|
17
32
|
name
|
18
33
|
.gsub("::", "/")
|
19
|
-
.gsub(/([a-z0-9])([A-Z])
|
34
|
+
.gsub(/([a-z0-9])([A-Z])/, &replacer)
|
20
35
|
.downcase
|
21
36
|
end
|
22
37
|
|
@@ -39,24 +54,27 @@ module SQLRunner
|
|
39
54
|
end
|
40
55
|
|
41
56
|
def self.register_plugin(name, mod)
|
42
|
-
|
57
|
+
SQLRunner.plugin_registry[name] = mod
|
43
58
|
end
|
44
59
|
|
45
60
|
def self.plugin(*names)
|
46
|
-
plugins
|
61
|
+
plugins(*names)
|
47
62
|
end
|
48
63
|
|
49
64
|
def self.plugins(*names)
|
50
65
|
names = prepare_plugins_with_options(names)
|
51
66
|
|
52
67
|
names.each do |name, options|
|
53
|
-
plugin =
|
68
|
+
plugin = SQLRunner.plugin_registry.fetch(name) do
|
69
|
+
raise PluginNotFound, "#{name.inspect} wasn't found"
|
70
|
+
end
|
71
|
+
|
54
72
|
plugin.activate(self, options)
|
55
73
|
end
|
56
74
|
end
|
57
75
|
|
58
76
|
def self.prepare_plugins_with_options(plugins)
|
59
|
-
return plugins unless plugins.last.
|
77
|
+
return plugins unless plugins.last.is_a?(Hash)
|
60
78
|
|
61
79
|
plugins_with_options = plugins.pop
|
62
80
|
|
data/lib/sql_runner/runner.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SQLRunner
|
2
4
|
module Runner
|
3
5
|
include Connection
|
4
6
|
|
5
7
|
def execute(query, **bind_vars)
|
6
|
-
with_connection do |
|
7
|
-
|
8
|
+
with_connection do |connection|
|
9
|
+
connection.execute(query, **bind_vars)
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
data/lib/sql_runner/version.rb
CHANGED
data/lib/sql_runner.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "uri"
|
2
4
|
require "connection_pool"
|
3
5
|
|
@@ -15,13 +17,18 @@ module SQLRunner
|
|
15
17
|
extend Configuration
|
16
18
|
extend Runner
|
17
19
|
|
20
|
+
Adapters.register("activerecord", Adapters::ActiveRecord)
|
18
21
|
Adapters.register("postgres", Adapters::PostgreSQL)
|
19
22
|
Adapters.register("postgresql", Adapters::PostgreSQL)
|
23
|
+
Adapters.register("mysql", Adapters::MySQL)
|
24
|
+
Adapters.register("mysql2", Adapters::MySQL)
|
25
|
+
Adapters.register("sqlite", Adapters::SQLite)
|
26
|
+
Adapters.register("sqlite3", Adapters::SQLite)
|
20
27
|
|
21
28
|
Query.register_plugin :one, Query::One
|
22
29
|
Query.register_plugin :many, Query::Many
|
23
30
|
Query.register_plugin :model, Query::Model
|
24
31
|
|
25
|
-
self.timeout = ENV.fetch("SQL_CONNECTION_TIMEOUT", 5)
|
26
|
-
self.pool
|
32
|
+
self.timeout = Integer(ENV.fetch("SQL_CONNECTION_TIMEOUT", 5))
|
33
|
+
self.pool = Integer(ENV.fetch("SQL_CONNECTION_POOL", 5))
|
27
34
|
end
|
data/sql_runner.gemspec
CHANGED
@@ -1,28 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "./lib/sql_runner/version"
|
2
4
|
|
3
5
|
Gem::Specification.new do |spec|
|
4
6
|
spec.name = "sql_runner"
|
5
7
|
spec.version = SQLRunner::VERSION
|
6
8
|
spec.authors = ["Nando Vieira"]
|
7
|
-
spec.email = ["fnando.
|
9
|
+
spec.email = ["me@fnando.com"]
|
10
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.6.0")
|
11
|
+
spec.metadata = {"rubygems_mfa_required" => "true"}
|
12
|
+
|
13
|
+
spec.summary = <<~TEXT.tr("\n", " ")
|
14
|
+
SQLRunner allows you to load your queries out of SQL files, without using
|
15
|
+
ORMs.
|
16
|
+
TEXT
|
8
17
|
|
9
|
-
spec.summary = "SQLRunner allows you to load your queries out of SQL files, without using ORMs. Available only for PostgreSQL."
|
10
18
|
spec.description = spec.summary
|
11
19
|
spec.homepage = "https://github.com/fnando/sql_runner"
|
12
20
|
spec.license = "MIT"
|
13
21
|
|
14
|
-
spec.files = `git ls-files -z
|
22
|
+
spec.files = `git ls-files -z`
|
23
|
+
.split("\x0")
|
24
|
+
.reject {|f| f.match(%r{^(test|spec|features)/}) }
|
15
25
|
spec.bindir = "exe"
|
16
|
-
spec.executables = spec.files.grep(%r{^exe/}) {
|
26
|
+
spec.executables = spec.files.grep(%r{^exe/}) {|f| File.basename(f) }
|
17
27
|
spec.require_paths = ["lib"]
|
18
28
|
|
19
29
|
spec.add_dependency "connection_pool"
|
20
30
|
|
31
|
+
spec.add_development_dependency "activerecord"
|
21
32
|
spec.add_development_dependency "bundler"
|
22
|
-
spec.add_development_dependency "rake"
|
23
33
|
spec.add_development_dependency "minitest-utils"
|
24
|
-
spec.add_development_dependency "pry-meta"
|
25
|
-
spec.add_development_dependency "pg"
|
26
34
|
spec.add_development_dependency "mocha"
|
27
|
-
spec.add_development_dependency "
|
35
|
+
spec.add_development_dependency "mysql2"
|
36
|
+
spec.add_development_dependency "pg"
|
37
|
+
spec.add_development_dependency "pry-meta"
|
38
|
+
spec.add_development_dependency "rake"
|
39
|
+
spec.add_development_dependency "rubocop"
|
40
|
+
spec.add_development_dependency "rubocop-fnando"
|
41
|
+
spec.add_development_dependency "simplecov"
|
42
|
+
spec.add_development_dependency "sqlite3"
|
28
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.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nando Vieira
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-07-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: connection_pool
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: activerecord
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -67,7 +67,21 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: mocha
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: mysql2
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
87
|
- - ">="
|
@@ -95,7 +109,35 @@ dependencies:
|
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
112
|
+
name: pry-meta
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rake
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop
|
99
141
|
requirement: !ruby/object:Gem::Requirement
|
100
142
|
requirements:
|
101
143
|
- - ">="
|
@@ -109,7 +151,35 @@ dependencies:
|
|
109
151
|
- !ruby/object:Gem::Version
|
110
152
|
version: '0'
|
111
153
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
154
|
+
name: rubocop-fnando
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: simplecov
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: sqlite3
|
113
183
|
requirement: !ruby/object:Gem::Requirement
|
114
184
|
requirements:
|
115
185
|
- - ">="
|
@@ -123,14 +193,16 @@ dependencies:
|
|
123
193
|
- !ruby/object:Gem::Version
|
124
194
|
version: '0'
|
125
195
|
description: SQLRunner allows you to load your queries out of SQL files, without using
|
126
|
-
ORMs.
|
196
|
+
ORMs.
|
127
197
|
email:
|
128
|
-
- fnando.
|
198
|
+
- me@fnando.com
|
129
199
|
executables: []
|
130
200
|
extensions: []
|
131
201
|
extra_rdoc_files: []
|
132
202
|
files:
|
203
|
+
- ".github/FUNDING.yml"
|
133
204
|
- ".gitignore"
|
205
|
+
- ".rubocop.yml"
|
134
206
|
- ".travis.yml"
|
135
207
|
- CODE_OF_CONDUCT.md
|
136
208
|
- Gemfile
|
@@ -139,6 +211,7 @@ files:
|
|
139
211
|
- Rakefile
|
140
212
|
- bin/console
|
141
213
|
- bin/setup
|
214
|
+
- examples/base.rb
|
142
215
|
- examples/bench.rb
|
143
216
|
- examples/profiling.rb
|
144
217
|
- examples/sql/create_user.sql
|
@@ -146,9 +219,13 @@ files:
|
|
146
219
|
- examples/sql/find_user.sql
|
147
220
|
- examples/sql/users.sql
|
148
221
|
- examples/test.rb
|
222
|
+
- examples/test_active_record.rb
|
149
223
|
- lib/sql_runner.rb
|
150
224
|
- lib/sql_runner/adapters.rb
|
225
|
+
- lib/sql_runner/adapters/active_record.rb
|
226
|
+
- lib/sql_runner/adapters/mysql.rb
|
151
227
|
- lib/sql_runner/adapters/postgresql.rb
|
228
|
+
- lib/sql_runner/adapters/sqlite.rb
|
152
229
|
- lib/sql_runner/configuration.rb
|
153
230
|
- lib/sql_runner/connection.rb
|
154
231
|
- lib/sql_runner/query.rb
|
@@ -161,8 +238,9 @@ files:
|
|
161
238
|
homepage: https://github.com/fnando/sql_runner
|
162
239
|
licenses:
|
163
240
|
- MIT
|
164
|
-
metadata:
|
165
|
-
|
241
|
+
metadata:
|
242
|
+
rubygems_mfa_required: 'true'
|
243
|
+
post_install_message:
|
166
244
|
rdoc_options: []
|
167
245
|
require_paths:
|
168
246
|
- lib
|
@@ -170,17 +248,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
170
248
|
requirements:
|
171
249
|
- - ">="
|
172
250
|
- !ruby/object:Gem::Version
|
173
|
-
version:
|
251
|
+
version: 2.6.0
|
174
252
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
253
|
requirements:
|
176
254
|
- - ">="
|
177
255
|
- !ruby/object:Gem::Version
|
178
256
|
version: '0'
|
179
257
|
requirements: []
|
180
|
-
|
181
|
-
|
182
|
-
signing_key:
|
258
|
+
rubygems_version: 3.3.7
|
259
|
+
signing_key:
|
183
260
|
specification_version: 4
|
184
261
|
summary: SQLRunner allows you to load your queries out of SQL files, without using
|
185
|
-
ORMs.
|
262
|
+
ORMs.
|
186
263
|
test_files: []
|