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.
@@ -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
- fail MissingDependency, "make sure the pg gem is available"
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
- if ended - started < SQLRunner.timeout
23
- sleep 0.1
24
- connect(started)
25
- else
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 && @connection.close && (@connection = nil)
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
- query, bindings = parse(query)
46
+ bound_query, bindings = parse(query)
45
47
  args = extract_args(query, bindings, bind_vars)
46
- @connection.exec_params(query, args)
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} #{"0x00%x" % (object_id << 1)}>]
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
- next match if $1 == ":" # skip type casting
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
- if (!index = bindings[sym_name])
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) { fail InvalidPreparedStatement, "missing value for :#{name} in #{query}" }
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
@@ -1,20 +1,29 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SQLRunner
2
4
  UnsupportedDatabase = Class.new(StandardError)
3
- MissingDependency = Class.new(StandardError)
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
- ADAPTERS = {}
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
- ADAPTERS[name] = adapter
18
+ SQLRunner.adapter_registry[name] = adapter
12
19
  end
13
20
 
14
21
  def self.find(name)
15
- ADAPTERS
16
- .fetch(name) { fail UnsupportedDatabase, "#{name} is not supported by SQLRunner" }
17
- .tap {|adapter| adapter.load }
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,7 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SQLRunner
2
4
  module Configuration
3
- attr_accessor :root_dir
4
- attr_accessor :timeout
5
- attr_accessor :pool
5
+ attr_accessor :root_dir, :timeout, :pool
6
6
  end
7
7
  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
- ConnectionPool.new(timeout: SQLRunner.timeout, size: SQLRunner.pool) do
8
- adapter.new(connection_string)
9
- end
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 && connection_pool.shutdown {|conn| conn.disconnect } && (@connection_pool = nil)
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 Many
@@ -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.kind_of?(Hash)
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)
@@ -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) or fail SQLRunner::RecordNotFound, "#{name}: record was not found with #{bind_vars.inspect} arguments"
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
@@ -1,12 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SQLRunner
2
- RecordNotFound = Class.new(StandardError)
3
- PluginNotFound = Class.new(StandardError)
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
- PLUGINS = {}
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])/) { "#{$1}_#{$2.downcase}" }
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
- PLUGINS[name] = mod
57
+ SQLRunner.plugin_registry[name] = mod
43
58
  end
44
59
 
45
60
  def self.plugin(*names)
46
- plugins *names
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 = PLUGINS.fetch(name) { fail PluginNotFound, "#{name.inspect} wasn't found" }
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.kind_of?(Hash)
77
+ return plugins unless plugins.last.is_a?(Hash)
60
78
 
61
79
  plugins_with_options = plugins.pop
62
80
 
@@ -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 |conn|
7
- conn.execute(query, **bind_vars)
8
+ with_connection do |connection|
9
+ connection.execute(query, **bind_vars)
8
10
  end
9
11
  end
10
12
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SQLRunner
2
- VERSION = "0.1.0"
4
+ VERSION = "0.4.0"
3
5
  end
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 = ENV.fetch("SQL_CONNECTION_POOL", 5)
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.vieira@gmail.com"]
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`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
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/}) { |f| File.basename(f) }
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 "codeclimate-test-reporter"
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.1.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: 2016-06-07 00:00:00.000000000 Z
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: bundler
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: rake
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: pry-meta
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: mocha
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: codeclimate-test-reporter
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. Available only for PostgreSQL.
196
+ ORMs.
127
197
  email:
128
- - fnando.vieira@gmail.com
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
- post_install_message:
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: '0'
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
- rubyforge_project:
181
- rubygems_version: 2.5.1
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. Available only for PostgreSQL.
262
+ ORMs.
186
263
  test_files: []