sql_query 0.2.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 748c4c52de904df3008bce29a438a87fb35999a7
4
- data.tar.gz: d6f2f18bd2182837f558290c57119fe33137272d
3
+ metadata.gz: 5f152c55f4f62dabfbd3e85d01341cdb6191f6c7
4
+ data.tar.gz: 5dfa356ad15704877a746d26943580c04abd92c6
5
5
  SHA512:
6
- metadata.gz: c72a0c1ddbe997fa7508b03abe76724ba9cb2c0beaf193668c2dbbca397c1e925810cc267be4b410610ea64b1d018111fac214499dc17caf869e1070b7dddcf2
7
- data.tar.gz: c25bc31e5266d0ae7ec96b559e42a08ccc604aeb996852fc575d36591fe04ed7d318b12778c66f0f4d2f812020cb60e639086666a7250d0987ac74af6684c910
6
+ metadata.gz: 4fac1c583e039c30dc2c2b7a72fdd5014dc4744185cbbc73bb8868d368b2c09606a7c6913db392799c65a435566c10c94f137b2b38e4a8f83caedc56a94a7601
7
+ data.tar.gz: 2d8488e10a49b8ee0b71325d6dea182e31eca25b058e26916cd53a6bc868f122e9e874a3510c2cc6cbe5fd854960e220ba23a27da82fe34406e5c40b66757772
@@ -0,0 +1 @@
1
+ sql_query
@@ -0,0 +1 @@
1
+ 2.3.3
@@ -1,24 +1,28 @@
1
1
  language: ruby
2
+ cache: bundler
3
+ before_install:
4
+ - gem uninstall -v '>= 2' -i $(rvm gemdir)@global -ax bundler || true
5
+ - gem install bundler -v '< 2'
6
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
7
+ - chmod +x ./cc-test-reporter
2
8
 
3
9
  gemfile:
4
10
  - gemfiles/3.2.gemfile
5
11
  - gemfiles/4.0.gemfile
6
12
  - gemfiles/4.1.gemfile
7
13
  - gemfiles/4.2.gemfile
14
+ - gemfiles/5.0.gemfile
8
15
 
9
16
  rvm:
10
- - '1.9.3'
11
- - '2.0.0'
12
- - '2.1.5'
13
- - '2.2.1'
17
+ - '2.3.3'
14
18
 
15
19
  addons:
16
- postgresql: '9.3'
17
- code_climate:
18
- repo_token: 743bf63d7a422064551b35931628682c6cad81a30743edee7ff9ea8af061397d
20
+ postgresql: '9.4'
19
21
 
20
22
  env:
21
23
  - BUILDER=travis
22
-
23
24
  before_script:
24
25
  - psql -c 'create database travis_ci_test;' -U postgres
26
+ - ./cc-test-reporter before-build
27
+ after_script:
28
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT -r 743bf63d7a422064551b35931628682c6cad81a30743edee7ff9ea8af061397d
data/Appraisals CHANGED
@@ -1,15 +1,21 @@
1
- appraise "3.2" do
2
- gem "activerecord", "~> 3.2.21"
1
+ # frozen_string_literal: true
2
+
3
+ appraise '3.2' do
4
+ gem 'activerecord', '~> 3.2.21'
5
+ end
6
+
7
+ appraise '4.0' do
8
+ gem 'activerecord', '~> 4.0.0'
3
9
  end
4
10
 
5
- appraise "4.0" do
6
- gem "activerecord", "~> 4.0.0"
11
+ appraise '4.1' do
12
+ gem 'activerecord', '~> 4.1.0'
7
13
  end
8
14
 
9
- appraise "4.1" do
10
- gem "activerecord", "~> 4.1.0"
15
+ appraise '4.2' do
16
+ gem 'activerecord', '~> 4.2.0'
11
17
  end
12
18
 
13
- appraise "4.2" do
14
- gem "activerecord", "~> 4.2.0"
19
+ appraise '5.0' do
20
+ gem 'activerecord', '~> 5.0.0'
15
21
  end
@@ -1,6 +1,6 @@
1
1
  # SqlQuery change log
2
2
 
3
- ## 0.2.2 / Unreleased
3
+ ## 0.7.1 / Unreleased
4
4
 
5
5
  * [Added]
6
6
 
@@ -10,6 +10,29 @@
10
10
 
11
11
  * [Fixed]
12
12
 
13
+ ## 0.7.0 / 2020-08-04
14
+
15
+ * [Added] support for exec_query from ActiveRecord https://github.com/sufleR/sql_query/pull/7
16
+
17
+
18
+ ## 0.6.0 / 2017-03-30
19
+
20
+ * [Added] possibility to override path where gem will look for sql file.
21
+
22
+ ## 0.5.0 / 2016-04-26
23
+
24
+ * [Added] possibility to overwrite default connection class and connection directly using db_connection option.
25
+
26
+ ## 0.4.0 / 2016-01-20
27
+
28
+ * [Added] execute will accept boolean attribute.
29
+ When set to false it will use raw query instead of prepared for logs.
30
+ By default it will be set to true.
31
+
32
+ ## 0.3.0 / 2015-12-10
33
+
34
+ * [Added] support for partials
35
+
13
36
  ## 0.2.1 / 2015-05-01
14
37
 
15
38
  * [Added] support for activerecord >= 3.2
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in sql_query.gemspec
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/sql_query.svg)](http://badge.fury.io/rb/sql_query)
2
- [![Dependency Status](https://gemnasium.com/sufleR/sql_query.svg)](https://gemnasium.com/sufleR/sql_query)
3
2
  [![Code Climate](https://codeclimate.com/github/sufleR/sql_query/badges/gpa.svg)](https://codeclimate.com/github/sufleR/sql_query)
4
3
  [![Test Coverage](https://codeclimate.com/github/sufleR/sql_query/badges/coverage.svg)](https://codeclimate.com/github/sufleR/sql_query)
5
4
  [![Build Status](https://travis-ci.org/sufleR/sql_query.svg?branch=master)](https://travis-ci.org/sufleR/sql_query)
@@ -79,9 +78,15 @@ Example:
79
78
  SqlQuery.new('player/get_by_email', email: 'e@mail.dev')
80
79
  ```
81
80
 
81
+ #### Special options
82
+
83
+ * db_connection - If you want to change default connection to database you may do it for every query execution using this option.
84
+ * sql_file_path - it will override default path where gem will look for sql file.
85
+
82
86
  ### Methods
83
87
 
84
- - **execute** - executes query and returns result data.
88
+ - **execute** - executes query and returns result data. It accepts boolean argument. When argument is false it will run raw sql query instead of prepared_for_logs.
89
+ - **exec_query** - similar to `#execute` but with data returned via `ActiveRecord::Result`.
85
90
  - **explain** - runs explain for SQL from template
86
91
  - **sql** - returns SQL string
87
92
  - **pretty_sql** - returns SQL string prettier to read in console
@@ -89,15 +94,46 @@ SqlQuery.new('player/get_by_email', email: 'e@mail.dev')
89
94
 
90
95
  ### Configuration
91
96
 
92
- If you don't like default path to your queries you can configure it in initializer.
93
-
94
97
  ```ruby
95
98
  # config/initializers/sql_query.rb
96
99
  SqlQuery.configure do |config|
97
100
  config.path = '/app/sql_templates'
101
+ config.adapter = ActiveRecord::Base
98
102
  end
99
103
  ```
100
104
 
105
+ #### Configuration options
106
+ * path - If you don't like default path to your queries you can change it here.
107
+
108
+ * adapter - class which implements connection method.
109
+
110
+ ### Partials
111
+
112
+ You can prepare part of sql query in partial file and reuse it in multiple queries.
113
+
114
+ Partial file should start with '_'.
115
+
116
+ Example:
117
+
118
+ ```sql
119
+ # app/sql_queries/_email_partial.sql.erb
120
+ players.email = <%= quote @email %>
121
+ ```
122
+
123
+ and use this partial like this:
124
+
125
+ ```sql
126
+ SELECT *
127
+ FROM players
128
+ WHERE <%= partial :email_partial %>
129
+ ```
130
+
131
+ ## Examples
132
+
133
+ Check examples folder for some usefull queries.
134
+
135
+ If you have some examples to share please make pull request.
136
+
101
137
  ## Contributing
102
138
 
103
139
  1. Fork it ( https://github.com/[my-github-username]/sql_query/fork )
@@ -105,3 +141,10 @@ end
105
141
  3. Commit your changes (`git commit -am 'Add some feature'`)
106
142
  4. Push to the branch (`git push origin my-new-feature`)
107
143
  5. Create a new Pull Request
144
+
145
+ To run specs, setup Postgres with the following:
146
+
147
+ ```sql
148
+ CREATE DATABASE sqlquery;
149
+ CREATE ROLE sqlquery WITH LOGIN;
150
+ ```
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
- require "bundler/gem_tasks"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
 
4
- task :default => :spec
6
+ task default: :spec
5
7
 
6
8
  RSpec::Core::RakeTask.new
@@ -0,0 +1,10 @@
1
+ ### File list:
2
+
3
+ * __distinct_values.sql.erb__ - implements "loose indexscan" in postgresql. More info [https://wiki.postgresql.org/wiki/Loose_indexscan](https://wiki.postgresql.org/wiki/Loose_indexscan)
4
+
5
+ ```
6
+ SqlQuery.new(:distinct_values, table_name: :players, column_name: :player_type).execute
7
+
8
+ ```
9
+ ###
10
+
@@ -0,0 +1,14 @@
1
+ WITH RECURSIVE t AS (
2
+ SELECT MIN(<%= @column_name %>) AS <%= @column_name %>
3
+ FROM <%= @table_name %>
4
+ UNION ALL
5
+ SELECT (
6
+ SELECT MIN(<%= @column_name %>) FROM <%= @table_name %>
7
+ WHERE <%= @column_name %> > t.<%= @column_name %>)
8
+ FROM t WHERE t.<%= @column_name %> IS NOT NULL
9
+ )
10
+ SELECT <%= @column_name %> FROM t WHERE <%= @column_name %> IS NOT NULL
11
+ <% if @with_nulls %>
12
+ UNION ALL
13
+ SELECT NULL WHERE EXISTS(SELECT 1 FROM <%= @table_name %> WHERE <%= @column_name %> IS NULL)
14
+ <% end %>
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file was generated by Appraisal
2
4
 
3
- source "https://rubygems.org"
5
+ source 'https://rubygems.org'
4
6
 
5
- gem "activerecord", "~> 3.2.21"
7
+ gem 'activerecord', '~> 3.2.21'
6
8
 
7
- gemspec :path => "../"
9
+ gemspec path: '../'
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file was generated by Appraisal
2
4
 
3
- source "https://rubygems.org"
5
+ source 'https://rubygems.org'
4
6
 
5
- gem "activerecord", "~> 4.0.0"
7
+ gem 'activerecord', '~> 4.0.0'
6
8
 
7
- gemspec :path => "../"
9
+ gemspec path: '../'
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file was generated by Appraisal
2
4
 
3
- source "https://rubygems.org"
5
+ source 'https://rubygems.org'
4
6
 
5
- gem "activerecord", "~> 4.1.0"
7
+ gem 'activerecord', '~> 4.1.0'
6
8
 
7
- gemspec :path => "../"
9
+ gemspec path: '../'
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file was generated by Appraisal
2
4
 
3
- source "https://rubygems.org"
5
+ source 'https://rubygems.org'
4
6
 
5
- gem "activerecord", "~> 4.2.0"
7
+ gem 'activerecord', '~> 4.2.0'
6
8
 
7
- gemspec :path => "../"
9
+ gemspec path: '../'
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file was generated by Appraisal
4
+
5
+ source 'https://rubygems.org'
6
+
7
+ gem 'activerecord', '~> 5.0.0'
8
+
9
+ gemspec path: '../'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'erb'
2
4
 
3
5
  class SqlQuery
@@ -5,21 +7,30 @@ class SqlQuery
5
7
 
6
8
  def initialize(file_name, options = {})
7
9
  unless file_name.is_a?(String) || file_name.is_a?(Symbol)
8
- fail ArgumentError, 'SQL file name should be String or Symbol'
10
+ raise ArgumentError, 'SQL file name should be String or Symbol'
9
11
  end
12
+
10
13
  @sql_filename = file_name
11
- prepare_variables(options)
12
- @connection = ActiveRecord::Base.connection
14
+ @options = options
15
+ @connection = options.try(:delete, :db_connection) ||
16
+ self.class.config.adapter.connection
17
+ prepare_variables
13
18
  end
14
19
 
15
20
  def explain
16
- msg = "EXPLAIN for: \n#{ sql }\n"
21
+ msg = "EXPLAIN for: \n#{sql}\n"
17
22
  msg += connection.explain(sql)
18
23
  pretty(msg)
19
24
  end
20
25
 
21
- def execute
22
- connection.execute(prepared_for_logs).entries
26
+ def execute(prepare = true)
27
+ to_execute = prepare ? prepared_for_logs : sql
28
+ connection.execute(to_execute).entries
29
+ end
30
+
31
+ def exec_query(prepare = true)
32
+ to_execute = prepare ? prepared_for_logs : sql
33
+ connection.exec_query(to_execute).to_a
23
34
  end
24
35
 
25
36
  def sql
@@ -35,13 +46,16 @@ class SqlQuery
35
46
  end
36
47
 
37
48
  def prepared_for_logs
38
- sql.gsub(/(\n|\s)+/,' ')
49
+ sql.gsub(/(\n|\s)+/, ' ')
39
50
  end
40
51
 
41
- def self.config=(value)
42
- @config = value
52
+ def partial(partial_name, partial_options = {})
53
+ path, file_name = split_to_path_and_name(partial_name)
54
+ self.class.new("#{path}/_#{file_name}",
55
+ @options.merge(partial_options)).sql
43
56
  end
44
57
 
58
+ attr_writer :config
45
59
  def self.config
46
60
  @config ||= Config.new
47
61
  end
@@ -51,44 +65,62 @@ class SqlQuery
51
65
  end
52
66
 
53
67
  class Config
54
- attr_accessor :path
68
+ attr_accessor :path, :adapter
55
69
 
56
70
  def initialize
57
71
  @path = '/app/sql_queries'
72
+ @adapter = ActiveRecord::Base
58
73
  end
59
74
  end
60
75
 
61
76
  private
62
77
 
78
+ def split_to_path_and_name(file)
79
+ if file.is_a?(Symbol)
80
+ ['', file.to_s]
81
+ else
82
+ parts = file.rpartition('/')
83
+ [parts.first, parts.last]
84
+ end
85
+ end
86
+
63
87
  def pretty(value)
64
88
  # override inspect to be more human readable from console
65
89
  # code copy from ActiveRecord
66
90
  # https://github.com/rails/rails/blob/master/activerecord/lib/active_record/explain.rb#L30
67
- def value.inspect; self; end
91
+ def value.inspect
92
+ self
93
+ end
68
94
  value
69
95
  end
70
96
 
71
- def prepare_variables(options)
72
- options.each do |k, v|
97
+ def prepare_variables
98
+ return if @options.blank?
99
+
100
+ @options.each do |k, v|
73
101
  instance_variable_set("@#{k}", v)
74
102
  end
75
103
  end
76
104
 
77
105
  def file_path
78
106
  files = Dir.glob(path)
79
- if files.size == 0
80
- raise "File not found: #{ @sql_filename }"
107
+ if files.empty?
108
+ raise "File not found: #{@sql_filename}"
81
109
  elsif files.size > 1
82
- raise "More than one file found: #{ files.join(', ')}"
110
+ raise "More than one file found: #{files.join(', ')}"
83
111
  else
84
112
  files.first
85
113
  end
86
114
  end
87
115
 
88
116
  def path
89
- root = defined?(Rails) ? Rails.root.to_s : Dir.pwd
90
- tmp_path = "#{ root }#{self.class.config.path}"
91
- tmp_path += "/#{ @sql_filename }.{sql.erb,erb.sql}"
117
+ if @sql_file_path.present?
118
+ tmp_path = @sql_file_path
119
+ else
120
+ root = defined?(Rails) ? Rails.root.to_s : Dir.pwd
121
+ tmp_path = "#{root}#{self.class.config.path}"
122
+ end
123
+ tmp_path += "/#{@sql_filename}.{sql.erb,erb.sql}"
92
124
  tmp_path
93
125
  end
94
126
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SqlQuery::Config do
6
+ describe 'initialize' do
7
+ it 'sets path to default' do
8
+ expect(described_class.new.path).to eq('/app/sql_queries')
9
+ end
10
+
11
+ it 'sets adapter to ActiveRecord::Base' do
12
+ expect(described_class.new.adapter).to eq(ActiveRecord::Base)
13
+ end
14
+ end
15
+ end
@@ -1,16 +1,13 @@
1
- if ENV['BUILDER'] == 'travis'
2
- require "codeclimate-test-reporter"
3
- CodeClimate::TestReporter.start
4
- else
5
- require 'simplecov'
6
- SimpleCov.start do
7
- add_filter '/spec/'
8
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'simplecov'
4
+ SimpleCov.start do
5
+ add_filter '/spec/'
9
6
  end
10
7
 
11
8
  require 'active_record'
12
9
  require 'sql_query'
13
- require 'pry'
10
+ #require 'pry'
14
11
 
15
12
  SqlQuery.configure do |config|
16
13
  config.path = '/spec/sql_queries'
@@ -26,15 +23,15 @@ RSpec.configure do |config|
26
23
  end
27
24
 
28
25
  connection = if ENV['BUILDER'] == 'travis'
29
- "postgres://postgres@localhost/travis_ci_test"
26
+ 'postgres://postgres@localhost/travis_ci_test'
30
27
  else
31
- "postgres://sqlquery:sqlquery@localhost/sqlquery"
28
+ 'postgres://sqlquery:sqlquery@localhost/sqlquery'
32
29
  end
33
30
 
34
31
  ActiveRecord::Base.establish_connection(connection)
35
32
 
36
33
  ActiveRecord::Base.connection.execute(
37
- "CREATE TABLE IF NOT EXISTS players (email text);"
34
+ 'CREATE TABLE IF NOT EXISTS players (email text);'
38
35
  )
39
36
 
40
37
  config.order = :random
@@ -0,0 +1 @@
1
+ players.email = <%= quote @email %>
@@ -0,0 +1,3 @@
1
+ SELECT *
2
+ FROM players
3
+ WHERE <%= partial :email_partial %>
@@ -1,13 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe SqlQuery do
4
-
5
6
  let(:options) { { email: 'e@mail.dev' } }
6
7
  let(:file_name) { :get_player_by_email }
7
8
  let(:query) { described_class.new(file_name, options) }
8
9
 
9
- describe '#initialize' do
10
+ class Model < ActiveRecord::Base
11
+ self.abstract_class = true
12
+ end
10
13
 
14
+ describe '#initialize' do
11
15
  it 'sets instance variables for all options' do
12
16
  expect(query.instance_variable_get(:@email)).to eq 'e@mail.dev'
13
17
  end
@@ -20,11 +24,21 @@ describe SqlQuery do
20
24
  end
21
25
  end
22
26
 
23
- context 'file_name argument is not Symbol or String' do
27
+ context 'when file_name argument is not Symbol or String' do
24
28
  let(:file_name) { { do: 'something' } }
25
29
 
26
30
  it 'raises ArgumentError' do
27
- expect{ query }.to raise_error(ArgumentError, 'SQL file name should be String or Symbol')
31
+ expect { query }
32
+ .to raise_error(ArgumentError,
33
+ 'SQL file name should be String or Symbol')
34
+ end
35
+ end
36
+
37
+ context 'with db_connection option' do
38
+ let(:options) { { db_connection: Model.connection } }
39
+
40
+ it 'sets connection to requested' do
41
+ expect(query.connection).to eq(Model.connection)
28
42
  end
29
43
  end
30
44
  end
@@ -39,7 +53,8 @@ describe SqlQuery do
39
53
  let(:file_name) { :not_exists }
40
54
 
41
55
  it 'raises error' do
42
- expect{ query.send(:file_path) }.to raise_error('File not found: not_exists')
56
+ expect { query.send(:file_path) }
57
+ .to raise_error('File not found: not_exists')
43
58
  end
44
59
  end
45
60
 
@@ -47,14 +62,27 @@ describe SqlQuery do
47
62
  let(:file_name) { :duplicated }
48
63
 
49
64
  it 'raises error' do
50
- expect{ query.send(:file_path) }.to raise_error.with_message(/More than one file found:/)
65
+ expect { query.send(:file_path) }
66
+ .to raise_error.with_message(/More than one file found:/)
67
+ end
68
+ end
69
+ end
70
+
71
+ describe '#path' do
72
+ context 'when there is sql_file_path option' do
73
+ let(:options) { { sql_file_path: '/path_to_file' } }
74
+ let(:file_name) { 'fname' }
75
+
76
+ it 'sets it as dir for file' do
77
+ expect(query.send(:path)).to eq('/path_to_file/fname.{sql.erb,erb.sql}')
51
78
  end
52
79
  end
53
80
  end
54
81
 
55
82
  describe '#sql' do
56
83
  it 'returns query string' do
57
- expect(query.sql).to eq "SELECT *\nFROM players\nWHERE email = 'e@mail.dev'\n"
84
+ expect(query.sql)
85
+ .to eq("SELECT *\nFROM players\nWHERE email = 'e@mail.dev'\n")
58
86
  end
59
87
 
60
88
  context 'when file is .erb.sql' do
@@ -69,7 +97,8 @@ describe SqlQuery do
69
97
 
70
98
  describe '#pretty_sql' do
71
99
  it 'returns query string' do
72
- expect(query.pretty_sql).to eq "SELECT *\nFROM players\nWHERE email = 'e@mail.dev'\n"
100
+ expect(query.pretty_sql)
101
+ .to eq("SELECT *\nFROM players\nWHERE email = 'e@mail.dev'\n")
73
102
  end
74
103
  end
75
104
 
@@ -77,7 +106,7 @@ describe SqlQuery do
77
106
  let(:explain) { query.explain }
78
107
  it 'returns explain string' do
79
108
  expect(explain).to include 'EXPLAIN for:'
80
- expect(explain).to include "FROM players"
109
+ expect(explain).to include 'FROM players'
81
110
  expect(explain).to include "WHERE email = 'e@mail.dev'"
82
111
  expect(explain).to include 'QUERY PLAN'
83
112
  expect(explain).to include 'Seq Scan on players'
@@ -93,12 +122,90 @@ describe SqlQuery do
93
122
 
94
123
  after do
95
124
  ActiveRecord::Base.connection.execute(
96
- "DELETE FROM players"
125
+ 'DELETE FROM players'
126
+ )
127
+ end
128
+
129
+ it 'returns data from database' do
130
+ expect(query.execute).to eq [{ 'email' => 'e@mail.dev' }]
131
+ end
132
+
133
+ context 'when prepare argument is true' do
134
+ it 'executes prepared query for logs' do
135
+ expect(query).to receive(:prepared_for_logs) { '' }
136
+ query.execute
137
+ end
138
+ end
139
+
140
+ context 'when prepare argument is false' do
141
+ it 'executes unchanged sql query' do
142
+ expect(query).not_to receive(:prepared_for_logs)
143
+ query.execute(false)
144
+ end
145
+ end
146
+ end
147
+
148
+ describe '#exec_query' do
149
+ before do
150
+ ActiveRecord::Base.connection.execute(
151
+ "INSERT INTO players (email) VALUES ('e@mail.dev')"
152
+ )
153
+ end
154
+
155
+ after do
156
+ ActiveRecord::Base.connection.execute(
157
+ 'DELETE FROM players'
97
158
  )
98
159
  end
99
160
 
100
161
  it 'returns data from database' do
101
- expect(query.execute).to eq [{ 'email' => 'e@mail.dev'}]
162
+ expect(query.exec_query).to eq [{ 'email' => 'e@mail.dev' }]
163
+ end
164
+
165
+ context 'when prepare argument is true' do
166
+ it 'executes prepared query for logs' do
167
+ expect(query).to receive(:prepared_for_logs) { '' }
168
+ query.exec_query
169
+ end
170
+ end
171
+
172
+ context 'when prepare argument is false' do
173
+ it 'executes unchanged sql query' do
174
+ expect(query).not_to receive(:prepared_for_logs)
175
+ query.exec_query(false)
176
+ end
177
+ end
178
+ end
179
+
180
+ describe '#partial' do
181
+ let(:file_name) { :get_player_by_email_with_template }
182
+ it 'resolves partials as parts of sql queries' do
183
+ expect(query.sql)
184
+ .to eq("SELECT *\nFROM players\nWHERE players.email = 'e@mail.dev'\n\n")
185
+ end
186
+
187
+ context 'when partial name is string with file path' do
188
+ let(:file_name) { :get_player_by_email }
189
+
190
+ it 'should find file by whole path and _name' do
191
+ query
192
+ expect(described_class)
193
+ .to receive(:new).with('some/path/to/_file.sql', options) { query }
194
+ query.partial('some/path/to/file.sql', {})
195
+ end
196
+ end
197
+ end
198
+
199
+ describe '#prepared_for_logs' do
200
+ it 'returns string without new lines' do
201
+ expect(query.prepared_for_logs)
202
+ .to eq("SELECT * FROM players WHERE email = 'e@mail.dev' ")
203
+ end
204
+ end
205
+
206
+ describe '.config' do
207
+ it 'returns configuration instance' do
208
+ expect(described_class.config).to be_kind_of(SqlQuery::Config)
102
209
  end
103
210
  end
104
211
  end
@@ -1,34 +1,35 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
 
5
6
  Gem::Specification.new do |spec|
6
- spec.name = "sql_query"
7
- spec.version = "0.2.1"
8
- spec.authors = ["sufleR"]
9
- spec.email = ["szymon.fracczak@netguru.co"]
10
- spec.summary = %q{Ruby gem to load and execute SQL queries from `.sql.erb` templates}
11
- spec.description = %q{
7
+ spec.name = 'sql_query'
8
+ spec.version = '0.7.0'
9
+ spec.authors = ['sufleR']
10
+ spec.email = ['szymon.fracczak@gmail.com']
11
+ spec.summary = 'Ruby gem to load and execute SQL queries from `.sql.erb` templates'
12
+ spec.description = "
12
13
  It makes working with pure SQL easier with syntax highlighting.
13
14
  Let's you clean your Ruby code from SQL strings.
14
- }
15
- spec.homepage = "https://github.com/sufleR/sql_query"
16
- spec.license = "MIT"
15
+ "
16
+ spec.homepage = 'https://github.com/sufleR/sql_query'
17
+ spec.license = 'MIT'
17
18
 
18
19
  spec.files = `git ls-files -z`.split("\x0")
19
20
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
21
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
- spec.require_paths = ["lib"]
22
+ spec.require_paths = ['lib']
22
23
 
23
- spec.required_ruby_version = ">= 1.9.3"
24
+ spec.required_ruby_version = '>= 1.9.3'
24
25
 
25
- spec.add_dependency "activerecord", ">= 3.2"
26
- spec.add_development_dependency "bundler", "~> 1.7"
27
- spec.add_development_dependency "rake", "~> 10"
28
- spec.add_development_dependency "rspec", "~> 3.2"
29
- spec.add_development_dependency "pg", "~> 0.18"
30
- spec.add_development_dependency "pry", "~> 0.10"
31
- spec.add_development_dependency "with_model", "~> 1.2"
32
- spec.add_development_dependency "codeclimate-test-reporter", "~> 0.4"
33
- spec.add_development_dependency "appraisal"
26
+ spec.add_dependency 'activerecord', '>= 3.2', '< 6.0'
27
+ spec.add_development_dependency 'appraisal'
28
+ spec.add_development_dependency 'bundler'
29
+ spec.add_development_dependency 'pg', '~> 0.18'
30
+ spec.add_development_dependency 'rake', '~> 13.0'
31
+ spec.add_development_dependency 'rspec', '~> 3.4'
32
+ spec.add_development_dependency 'rubocop', '<= 0.81'
33
+ spec.add_development_dependency 'simplecov'
34
+ spec.add_development_dependency 'with_model', '~> 1.2'
34
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sql_query
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - sufleR
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-01 00:00:00.000000000 Z
11
+ date: 2020-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '3.2'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '6.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,127 +27,132 @@ dependencies:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: '3.2'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '6.0'
27
33
  - !ruby/object:Gem::Dependency
28
- name: bundler
34
+ name: appraisal
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - "~>"
37
+ - - ">="
32
38
  - !ruby/object:Gem::Version
33
- version: '1.7'
39
+ version: '0'
34
40
  type: :development
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
- - - "~>"
44
+ - - ">="
39
45
  - !ruby/object:Gem::Version
40
- version: '1.7'
46
+ version: '0'
41
47
  - !ruby/object:Gem::Dependency
42
- name: rake
48
+ name: bundler
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
- - - "~>"
51
+ - - ">="
46
52
  - !ruby/object:Gem::Version
47
- version: '10'
53
+ version: '0'
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
- - - "~>"
58
+ - - ">="
53
59
  - !ruby/object:Gem::Version
54
- version: '10'
60
+ version: '0'
55
61
  - !ruby/object:Gem::Dependency
56
- name: rspec
62
+ name: pg
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
65
  - - "~>"
60
66
  - !ruby/object:Gem::Version
61
- version: '3.2'
67
+ version: '0.18'
62
68
  type: :development
63
69
  prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
72
  - - "~>"
67
73
  - !ruby/object:Gem::Version
68
- version: '3.2'
74
+ version: '0.18'
69
75
  - !ruby/object:Gem::Dependency
70
- name: pg
76
+ name: rake
71
77
  requirement: !ruby/object:Gem::Requirement
72
78
  requirements:
73
79
  - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: '0.18'
81
+ version: '13.0'
76
82
  type: :development
77
83
  prerelease: false
78
84
  version_requirements: !ruby/object:Gem::Requirement
79
85
  requirements:
80
86
  - - "~>"
81
87
  - !ruby/object:Gem::Version
82
- version: '0.18'
88
+ version: '13.0'
83
89
  - !ruby/object:Gem::Dependency
84
- name: pry
90
+ name: rspec
85
91
  requirement: !ruby/object:Gem::Requirement
86
92
  requirements:
87
93
  - - "~>"
88
94
  - !ruby/object:Gem::Version
89
- version: '0.10'
95
+ version: '3.4'
90
96
  type: :development
91
97
  prerelease: false
92
98
  version_requirements: !ruby/object:Gem::Requirement
93
99
  requirements:
94
100
  - - "~>"
95
101
  - !ruby/object:Gem::Version
96
- version: '0.10'
102
+ version: '3.4'
97
103
  - !ruby/object:Gem::Dependency
98
- name: with_model
104
+ name: rubocop
99
105
  requirement: !ruby/object:Gem::Requirement
100
106
  requirements:
101
- - - "~>"
107
+ - - "<="
102
108
  - !ruby/object:Gem::Version
103
- version: '1.2'
109
+ version: '0.81'
104
110
  type: :development
105
111
  prerelease: false
106
112
  version_requirements: !ruby/object:Gem::Requirement
107
113
  requirements:
108
- - - "~>"
114
+ - - "<="
109
115
  - !ruby/object:Gem::Version
110
- version: '1.2'
116
+ version: '0.81'
111
117
  - !ruby/object:Gem::Dependency
112
- name: codeclimate-test-reporter
118
+ name: simplecov
113
119
  requirement: !ruby/object:Gem::Requirement
114
120
  requirements:
115
- - - "~>"
121
+ - - ">="
116
122
  - !ruby/object:Gem::Version
117
- version: '0.4'
123
+ version: '0'
118
124
  type: :development
119
125
  prerelease: false
120
126
  version_requirements: !ruby/object:Gem::Requirement
121
127
  requirements:
122
- - - "~>"
128
+ - - ">="
123
129
  - !ruby/object:Gem::Version
124
- version: '0.4'
130
+ version: '0'
125
131
  - !ruby/object:Gem::Dependency
126
- name: appraisal
132
+ name: with_model
127
133
  requirement: !ruby/object:Gem::Requirement
128
134
  requirements:
129
- - - ">="
135
+ - - "~>"
130
136
  - !ruby/object:Gem::Version
131
- version: '0'
137
+ version: '1.2'
132
138
  type: :development
133
139
  prerelease: false
134
140
  version_requirements: !ruby/object:Gem::Requirement
135
141
  requirements:
136
- - - ">="
142
+ - - "~>"
137
143
  - !ruby/object:Gem::Version
138
- version: '0'
144
+ version: '1.2'
139
145
  description: "\n It makes working with pure SQL easier with syntax highlighting.\n
140
146
  \ Let's you clean your Ruby code from SQL strings.\n "
141
147
  email:
142
- - szymon.fracczak@netguru.co
148
+ - szymon.fracczak@gmail.com
143
149
  executables: []
144
150
  extensions: []
145
151
  extra_rdoc_files: []
146
152
  files:
147
153
  - ".gitignore"
154
+ - ".ruby-gemset"
155
+ - ".ruby-version"
148
156
  - ".travis.yml"
149
157
  - Appraisals
150
158
  - CHANGELOG.md
@@ -152,16 +160,22 @@ files:
152
160
  - LICENSE.txt
153
161
  - README.md
154
162
  - Rakefile
163
+ - examples/README.md
164
+ - examples/distinct_values.sql.erb
155
165
  - gemfiles/3.2.gemfile
156
166
  - gemfiles/4.0.gemfile
157
167
  - gemfiles/4.1.gemfile
158
168
  - gemfiles/4.2.gemfile
169
+ - gemfiles/5.0.gemfile
159
170
  - lib/sql_query.rb
171
+ - spec/config_spec.rb
160
172
  - spec/spec_helper.rb
173
+ - spec/sql_queries/_email_partial.sql.erb
161
174
  - spec/sql_queries/duplicated.erb.sql
162
175
  - spec/sql_queries/duplicated.sql.erb
163
176
  - spec/sql_queries/erb_sql.erb.sql
164
177
  - spec/sql_queries/get_player_by_email.sql.erb
178
+ - spec/sql_queries/get_player_by_email_with_template.sql.erb
165
179
  - spec/sql_query_spec.rb
166
180
  - sql_query.gemspec
167
181
  homepage: https://github.com/sufleR/sql_query
@@ -184,14 +198,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
198
  version: '0'
185
199
  requirements: []
186
200
  rubyforge_project:
187
- rubygems_version: 2.4.3
201
+ rubygems_version: 2.5.2
188
202
  signing_key:
189
203
  specification_version: 4
190
204
  summary: Ruby gem to load and execute SQL queries from `.sql.erb` templates
191
205
  test_files:
206
+ - spec/config_spec.rb
192
207
  - spec/spec_helper.rb
208
+ - spec/sql_queries/_email_partial.sql.erb
193
209
  - spec/sql_queries/duplicated.erb.sql
194
210
  - spec/sql_queries/duplicated.sql.erb
195
211
  - spec/sql_queries/erb_sql.erb.sql
196
212
  - spec/sql_queries/get_player_by_email.sql.erb
213
+ - spec/sql_queries/get_player_by_email_with_template.sql.erb
197
214
  - spec/sql_query_spec.rb