niceql 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7f9f1dc89c0c7353d4b8c63056d43968b0ad2f71a602d4e50ba5a48bfa568ed0
4
- data.tar.gz: 9fc1ea32fc0ed3053702b3014dbb270457af028e61b6b1bb63ff6c28005d8ce4
3
+ metadata.gz: 6dd33b2edcd3a477068b38011e5030f5ebc261ffce8990f359754d01b556ac2f
4
+ data.tar.gz: ccbd8f33db8b50fe447e43fa08b875a9e6ca6e80a9de6179a823bd81df8df52c
5
5
  SHA512:
6
- metadata.gz: e0b76948b56fe949aac0b5582081d42a60e35dede01332772c4fb233bd8c14bd2cf1d029187d25e0bb85c20d660f29763d401f2283695f28da36c0053293411c
7
- data.tar.gz: 2be8cfca05e187114624a2c70b9318c2dd161c42aca5c3ad90456e2ea2a46cda59de1aadd4d22e8e1111155078fa03b986ce4e7624e809776934eb0c0c94dcb5
6
+ metadata.gz: 6584d6c7f9b7d53cd9726b1bdd21808df7f1a271b35c06b151dd747f33eb133897e559afbca2650659ad52c82acaed33c52785e90d8b8f9722e5490c639508fd
7
+ data.tar.gz: b0f3fc0eac42a2fb94ca60a79366d10c80e41e0baf89343853572a6679d558727ce22ce6364c5719cd8998544fa75c2153a7e633cb213f67e7f0c7041a1a3ddf
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ # 0.4.1
2
+ * description update
3
+
4
+ # 0.4.0
5
+ * merged PR https://github.com/alekseyl/niceql/pull/19, now Arel is also extended with niceql methods!!
6
+ * test and better niceql comparisons assertion
7
+ * tests were trialed against rails 4.2 and some additional conditions were added for later cases
8
+
9
+ # 0.3.0
10
+ * ruby forced to >= 2.4
11
+ * String match extension no longer needed
12
+ * fixed issue with missing HINT and DETAIL string ( https://github.com/alekseyl/niceql/issues/18 )
13
+ * both new and old activerecord StatementInvalid formats supported
14
+ * major prettify_pg_err refactoring ( much cleaner code now )
15
+
1
16
  # 0.2.0
2
17
  * Fix to issue https://github.com/alekseyl/niceql/pull/17#issuecomment-924278172. ActiveRecord base config is no longer a hash,
3
18
  so it does not have dig method, hence it's breaking the ar_using_pg_adapter? method.
data/README.md CHANGED
@@ -1,11 +1,11 @@
1
1
  # Niceql
2
2
 
3
- This is a small, nice, simple and no-dependency solution for SQL prettifying for Ruby.
3
+ This is a small, nice, simple and zero dependency solution for SQL prettifying for Ruby.
4
4
  It can be used in an irb console without any dependencies ( run bin/console and look for examples ).
5
5
 
6
- Any reasonable suggestions on formatting/coloring are welcome
6
+ Any reasonable suggestions are welcome.
7
7
 
8
- **Please pay attention: untill issue https://github.com/alekseyl/niceql/issues/16 is resolved any UPDATE or INSERT request will corrupt your data, don't use on production!**
8
+ **Please pay attention: untill issue https://github.com/alekseyl/niceql/issues/16 is resolved any UPDATE or INSERT request might corrupt your data, don't use on production!**
9
9
 
10
10
 
11
11
  ## Before/After
@@ -44,9 +44,11 @@ Or install it yourself as:
44
44
  ```ruby
45
45
  Niceql.configure do |c|
46
46
  # Setting pg_adapter_with_nicesql to true will force formatting SQL queries
47
- # before executing them, this will lead to better SQL-query debugging and much more clearer error messages
47
+ # before execution. Formatted SQL will lead to much better SQL-query debugging and much more clearer error messages
48
48
  # if you are using Postgresql as a data source.
49
+ #
49
50
  # You can adjust pg_adapter in production but do it at your own risk!
51
+ #
50
52
  # If you need to debug SQL queries in production use exec_niceql
51
53
  # default: false
52
54
  # uncomment next string to enable in development
@@ -56,7 +58,7 @@ Niceql.configure do |c|
56
58
  # default: false
57
59
  # c.prettify_active_record_log_output = true
58
60
 
59
- # now error prettifying is configurable
61
+ # Error prettifying is also configurable
60
62
  # default: defined? ::ActiveRecord::Base && ActiveRecord::Base.configurations[Rails.env]['adapter'] == 'postgresql'
61
63
  # c.prettify_pg_errors = defined? ::ActiveRecord::Base && ActiveRecord::Base.configurations[Rails.env]['adapter'] == 'postgresql'
62
64
 
@@ -85,7 +87,7 @@ end
85
87
  ### With ActiveRecord
86
88
 
87
89
  ```ruby
88
- # puts colorized ( or not if you are willing so ) to_niceql ( you need to call puts otherwise to_niceql looks ugly )
90
+ # puts colorized and formatted corresponding SQL query
89
91
  Model.scope.niceql
90
92
 
91
93
  # only formatting without colorization, you can run output of to_niceql as a SQL query in connection.execute
@@ -110,23 +112,23 @@ end
110
112
  #=>
111
113
  #=> SELECT *
112
114
  #=> FROM table
113
-
114
-
115
-
115
+
116
116
 
117
- # rails combines err with query, so don't forget to do it yourself:
118
- puts Niceql::Prettifier.prettify_pg_err( "#{pg_err_output}\n#{sql_query}" )
117
+ puts Niceql::Prettifier.prettify_pg_err( pg_err_output, sql_query )
119
118
 
120
119
  # to get real nice result you should execute prettified version (i.e. execute( prettified_sql ) !) of query on your DB!
121
120
  # otherwise you will not get such a nice output
122
- puts Niceql::Prettifier.prettify_pg_err(<<~ERR )
121
+ raw_sql = <<~SQL
122
+ SELECT err
123
+ FROM ( VALUES(1), (2) )
124
+ ORDER BY 1
125
+ SQL
126
+
127
+ puts Niceql::Prettifier.prettify_pg_err(<<~ERR, raw_sql )
123
128
  ERROR: VALUES in FROM must have an alias
124
129
  LINE 2: FROM ( VALUES(1), (2) )
125
130
  ^
126
131
  HINT: For example, FROM (VALUES ...) [AS] foo.
127
- SELECT err
128
- FROM ( VALUES(1), (2) )
129
- ORDER BY 1
130
132
  ERR
131
133
 
132
134
 
@@ -1,3 +1,3 @@
1
1
  module Niceql
2
- VERSION = "0.2.0"
2
+ VERSION = '0.4.1'
3
3
  end
data/lib/niceql.rb CHANGED
@@ -1,19 +1,18 @@
1
1
  require "niceql/version"
2
- require 'niceql/string'
3
2
 
4
3
  module Niceql
5
4
 
6
5
  module StringColorize
7
6
  def self.colorize_verb( str)
8
- #yellow ANSI color
7
+ # yellow ANSI color
9
8
  "\e[0;33;49m#{str}\e[0m"
10
9
  end
11
10
  def self.colorize_str(str)
12
- #cyan ANSI color
11
+ # cyan ANSI color
13
12
  "\e[0;36;49m#{str}\e[0m"
14
13
  end
15
14
  def self.colorize_err(err)
16
- #red ANSI color
15
+ # red ANSI color
17
16
  "\e[0;31;49m#{err}\e[0m"
18
17
  end
19
18
  end
@@ -45,167 +44,182 @@ module Niceql
45
44
  SQL_COMMENTS_CLEARED = /(\s*?--.+\s{1})|(\s*$\s*\/\*[^\/\*]*\*\/\s{1})/
46
45
  COMMENT_CONTENT = /[\S]+[\s\S]*[\S]+/
47
46
 
48
- def self.config
49
- Niceql.config
50
- end
47
+ class << self
48
+ def config
49
+ Niceql.config
50
+ end
51
51
 
52
- def self.prettify_err(err)
53
- prettify_pg_err( err.to_s )
54
- end
52
+ def prettify_err(err, original_sql_query = nil)
53
+ prettify_pg_err( err.to_s, original_sql_query )
54
+ end
55
55
 
56
56
 
57
- # Postgres error output:
58
- # ERROR: VALUES in FROM must have an alias
59
- # LINE 2: FROM ( VALUES(1), (2) );
60
- # ^
61
- # HINT: For example, FROM (VALUES ...) [AS] foo.
62
-
63
- # May go without HINT or DETAIL:
64
- # ERROR: column "usr" does not exist
65
- # LINE 1: SELECT usr FROM users ORDER BY 1
66
- # ^
67
-
68
- # ActiveRecord::StatementInvalid will add original SQL query to the bottom like this:
69
- # ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "usr" does not exist
70
- # LINE 1: SELECT usr FROM users ORDER BY 1
71
- # ^
72
- #: SELECT usr FROM users ORDER BY 1
73
-
74
- # prettify_pg_err parses ActiveRecord::StatementInvalid string,
75
- # but you may use it without ActiveRecord either way:
76
- # prettify_pg_err( err + "\n" + sql ) OR prettify_pg_err( err, sql )
77
- # don't mess with original sql query, or prettify_pg_err will deliver incorrect results
78
- def self.prettify_pg_err(err, original_sql_query = nil)
79
- return err if err[/LINE \d+/].nil?
80
- err_line_num = err[/LINE \d+/][5..-1].to_i
81
-
82
- #
83
- start_sql_line = err.lines[3][/(HINT|DETAIL)/] ? 4 : 3
84
- err_body = start_sql_line < err.lines.length ? err.lines[start_sql_line..-1] : original_sql_query&.lines
85
-
86
-
87
- # this means original query is missing so it's nothing to prettify
88
- return err unless err_body
89
-
90
- err_quote = ( err.lines[1][/\.\.\..+\.\.\./] && err.lines[1][/\.\.\..+\.\.\./][3..-4] ) ||
91
- ( err.lines[1][/\.\.\..+/] && err.lines[1][/\.\.\..+/][3..-1] )
92
-
93
- # line[2] is err carret line i.e.: ' ^'
94
- # err.lines[1][/LINE \d+:/].length+1..-1 - is a position from error quote begin
95
- err_carret_line = err.lines[2][err.lines[1][/LINE \d+:/].length+1..-1]
96
- # err line will be painted in red completely, so we just remembering it and use
97
- # to replace after paiting the verbs
98
- err_line = err_body[err_line_num-1]
99
-
100
- # when err line is too long postgres quotes it part in double '...'
101
- if err_quote
102
- err_quote_carret_offset = err_carret_line.length - err.lines[1].index( '...' ) + 3
103
- err_carret_line = ' ' * ( err_line.index( err_quote ) + err_quote_carret_offset ) + "^\n"
104
- end
57
+ # Postgres error output:
58
+ # ERROR: VALUES in FROM must have an alias
59
+ # LINE 2: FROM ( VALUES(1), (2) );
60
+ # ^
61
+ # HINT: For example, FROM (VALUES ...) [AS] foo.
105
62
 
106
- err_carret_line = " " + err_carret_line if err_body[0].start_with?(': ')
107
- # if mistake is on last string than err_line.last != \n so we need to prepend \n to carret line
108
- err_carret_line = "\n" + err_carret_line unless err_line[-1] == "\n"
63
+ # May go without HINT or DETAIL:
64
+ # ERROR: column "usr" does not exist
65
+ # LINE 1: SELECT usr FROM users ORDER BY 1
66
+ # ^
109
67
 
110
- #colorizing verbs and strings
111
- err_body = err_body.join.gsub(/#{VERBS}/ ) { |verb| StringColorize.colorize_verb(verb) }
112
- .gsub(STRINGS){ |str| StringColorize.colorize_str(str) }
68
+ # ActiveRecord::StatementInvalid will add original SQL query to the bottom like this:
69
+ # ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "usr" does not exist
70
+ # LINE 1: SELECT usr FROM users ORDER BY 1
71
+ # ^
72
+ #: SELECT usr FROM users ORDER BY 1
113
73
 
114
- #reassemling error message
115
- err_body = err_body.lines
116
- err_body[err_line_num-1]= StringColorize.colorize_err( err_line )
117
- err_body.insert( err_line_num, StringColorize.colorize_err( err_carret_line ) )
74
+ # prettify_pg_err parses ActiveRecord::StatementInvalid string,
75
+ # but you may use it without ActiveRecord either way:
76
+ # prettify_pg_err( err + "\n" + sql ) OR prettify_pg_err( err, sql )
77
+ # don't mess with original sql query, or prettify_pg_err will deliver incorrect results
78
+ def prettify_pg_err(err, original_sql_query = nil)
79
+ return err if err[/LINE \d+/].nil?
80
+ err_line_num = err[/LINE \d+/][5..-1].to_i
81
+ # LINE 1: SELECT usr FROM users ORDER BY 1
82
+ err_address_line = err.lines[1]
118
83
 
119
- err.lines[0..start_sql_line-1].join + err_body.join
120
- end
84
+ start_sql_line = 3 if err.lines.length <= 3
85
+ # error not always contains HINT
86
+ start_sql_line ||= err.lines[3][/(HINT|DETAIL)/] ? 4 : 3
87
+ sql_body = start_sql_line < err.lines.length ? err.lines[start_sql_line..-1] : original_sql_query&.lines
121
88
 
122
- def self.prettify_sql( sql, colorize = true )
123
- indent = 0
124
- parentness = []
125
-
126
- sql = sql.split( SQL_COMMENTS ).each_slice(2).map{ | sql_part, comment |
127
- # remove additional formatting for sql_parts but leave comment intact
128
- [sql_part.gsub(/[\s]+/, ' '),
129
- # comment.match?(/\A\s*$/) - SQL_COMMENTS gets all comment content + all whitespaced chars around
130
- # so this sql_part.length == 0 || comment.match?(/\A\s*$/) checks does the comment starts from new line
131
- comment && ( sql_part.length == 0 || comment.match?(/\A\s*$/) ? "\n#{comment[COMMENT_CONTENT]}\n" : comment[COMMENT_CONTENT] ) ]
132
- }.flatten.join(' ')
133
-
134
- sql.gsub!(/ \n/, "\n")
135
-
136
- sql.gsub!(STRINGS){ |str| StringColorize.colorize_str(str) } if colorize
137
-
138
- first_verb = true
139
- prev_was_comment = false
140
-
141
- sql.gsub!( /(#{VERBS}|#{BRACKETS}|#{SQL_COMMENTS_CLEARED})/) do |verb|
142
- if 'SELECT' == verb
143
- indent += config.indentation_base if !config.open_bracket_is_newliner || parentness.last.nil? || parentness.last[:nested]
144
- parentness.last[:nested] = true if parentness.last
145
- add_new_line = !first_verb
146
- elsif verb == '('
147
- next_closing_bracket = Regexp.last_match.post_match.index(')')
148
- # check if brackets contains SELECT statement
149
- add_new_line = !!Regexp.last_match.post_match[0..next_closing_bracket][/SELECT/] && config.open_bracket_is_newliner
150
- parentness << { nested: add_new_line }
151
- elsif verb == ')'
152
- # this also covers case when right bracket is used without corresponding left one
153
- add_new_line = parentness.last.nil? || parentness.last[:nested]
154
- indent -= ( parentness.last.nil? ? 2 * config.indentation_base : (parentness.last[:nested] ? config.indentation_base : 0) )
155
- indent = 0 if indent < 0
156
- parentness.pop
157
- elsif verb[POSSIBLE_INLINER]
158
- # in postgres ORDER BY can be used in aggregation function this will keep it
159
- # inline with its agg function
160
- add_new_line = parentness.last.nil? || parentness.last[:nested]
161
- else
162
- add_new_line = verb[/(#{INLINE_VERBS})/].nil?
163
- end
89
+ # this means original query is missing so it's nothing to prettify
90
+ return err unless sql_body
164
91
 
165
- # !add_new_line && previous_was_comment means we had newlined comment, and now even
166
- # if verb is inline verb we will need to add new line with indentation BUT all
167
- # inliners match with a space before so we need to strip it
168
- verb.lstrip! if !add_new_line && prev_was_comment
92
+ # err line will be painted in red completely, so we just remembering it and use
93
+ # to replace after painting the verbs
94
+ err_line = sql_body[err_line_num - 1]
169
95
 
170
- add_new_line = prev_was_comment unless add_new_line
171
- add_indent = !first_verb && add_new_line
172
96
 
173
- if verb[SQL_COMMENTS_CLEARED]
174
- verb = verb[COMMENT_CONTENT]
175
- prev_was_comment = true
176
- else
177
- first_verb = false
178
- prev_was_comment = false
97
+ #colorizing verbs and strings
98
+ colorized_sql_body = sql_body.join.gsub(/#{VERBS}/ ) { |verb| StringColorize.colorize_verb(verb) }
99
+ .gsub(STRINGS){ |str| StringColorize.colorize_str(str) }
100
+
101
+ #reassemling error message
102
+ err_body = colorized_sql_body.lines
103
+ # replacing colorized line contained error and adding caret line
104
+ err_body[err_line_num - 1]= StringColorize.colorize_err( err_line )
105
+
106
+ err_caret_line = extract_err_caret_line( err_address_line, err_line, sql_body, err )
107
+ err_body.insert( err_line_num, StringColorize.colorize_err( err_caret_line ) )
108
+
109
+ err.lines[0..start_sql_line-1].join + err_body.join
110
+ end
111
+
112
+ def prettify_sql( sql, colorize = true )
113
+ indent = 0
114
+ parentness = []
115
+
116
+ sql = sql.split( SQL_COMMENTS ).each_slice(2).map{ | sql_part, comment |
117
+ # remove additional formatting for sql_parts but leave comment intact
118
+ [sql_part.gsub(/[\s]+/, ' '),
119
+ # comment.match?(/\A\s*$/) - SQL_COMMENTS gets all comment content + all whitespaced chars around
120
+ # so this sql_part.length == 0 || comment.match?(/\A\s*$/) checks does the comment starts from new line
121
+ comment && ( sql_part.length == 0 || comment.match?(/\A\s*$/) ? "\n#{comment[COMMENT_CONTENT]}\n" : comment[COMMENT_CONTENT] ) ]
122
+ }.flatten.join(' ')
123
+
124
+ sql.gsub!(/ \n/, "\n")
125
+
126
+ sql.gsub!(STRINGS){ |str| StringColorize.colorize_str(str) } if colorize
127
+
128
+ first_verb = true
129
+ prev_was_comment = false
130
+
131
+ sql.gsub!( /(#{VERBS}|#{BRACKETS}|#{SQL_COMMENTS_CLEARED})/) do |verb|
132
+ if 'SELECT' == verb
133
+ indent += config.indentation_base if !config.open_bracket_is_newliner || parentness.last.nil? || parentness.last[:nested]
134
+ parentness.last[:nested] = true if parentness.last
135
+ add_new_line = !first_verb
136
+ elsif verb == '('
137
+ next_closing_bracket = Regexp.last_match.post_match.index(')')
138
+ # check if brackets contains SELECT statement
139
+ add_new_line = !!Regexp.last_match.post_match[0..next_closing_bracket][/SELECT/] && config.open_bracket_is_newliner
140
+ parentness << { nested: add_new_line }
141
+ elsif verb == ')'
142
+ # this also covers case when right bracket is used without corresponding left one
143
+ add_new_line = parentness.last.nil? || parentness.last[:nested]
144
+ indent -= ( parentness.last.nil? ? 2 * config.indentation_base : (parentness.last[:nested] ? config.indentation_base : 0) )
145
+ indent = 0 if indent < 0
146
+ parentness.pop
147
+ elsif verb[POSSIBLE_INLINER]
148
+ # in postgres ORDER BY can be used in aggregation function this will keep it
149
+ # inline with its agg function
150
+ add_new_line = parentness.last.nil? || parentness.last[:nested]
151
+ else
152
+ add_new_line = verb[/(#{INLINE_VERBS})/].nil?
153
+ end
154
+
155
+ # !add_new_line && previous_was_comment means we had newlined comment, and now even
156
+ # if verb is inline verb we will need to add new line with indentation BUT all
157
+ # inliners match with a space before so we need to strip it
158
+ verb.lstrip! if !add_new_line && prev_was_comment
159
+
160
+ add_new_line = prev_was_comment unless add_new_line
161
+ add_indent = !first_verb && add_new_line
162
+
163
+ if verb[SQL_COMMENTS_CLEARED]
164
+ verb = verb[COMMENT_CONTENT]
165
+ prev_was_comment = true
166
+ else
167
+ first_verb = false
168
+ prev_was_comment = false
169
+ end
170
+
171
+ verb = StringColorize.colorize_verb(verb) if !%w[( )].include?(verb) && colorize
172
+
173
+ subs = ( add_indent ? indent_multiline(verb, indent) : verb)
174
+ !first_verb && add_new_line ? "\n" + subs : subs
179
175
  end
180
176
 
181
- verb = StringColorize.colorize_verb(verb) if !['(', ')'].include?(verb) && colorize
177
+ # clear all spaces before newlines, and all whitespaces before strings endings
178
+ sql.tap{ |slf| slf.gsub!( /\s+\n/, "\n" ) }.tap{ |slf| slf.gsub!(/\s+\z/, '') }
179
+ end
182
180
 
183
- subs = ( add_indent ? indent_multiline(verb, indent) : verb)
184
- !first_verb && add_new_line ? "\n" + subs : subs
181
+ def prettify_multiple( sql_multi, colorize = true )
182
+ sql_multi.split( /(?>#{SQL_COMMENTS})|(\;)/ ).inject(['']) { |queries, pattern|
183
+ queries.last << pattern
184
+ queries << '' if pattern == ';'
185
+ queries
186
+ }.map!{ |sql|
187
+ # we were splitting by comments and ;, so if next sql start with comment we've got a misplaced \n\n
188
+ sql.match?(/\A\s+\z/) ? nil : prettify_sql( sql, colorize )
189
+ }.compact.join("\n\n")
185
190
  end
186
191
 
187
- # clear all spaces before newlines, and all whitespaces before string end
188
- sql.tap{ |slf| slf.gsub!( /\s+\n/, "\n" ) }.tap{ |slf| slf.gsub!(/\s+\z/, '') }
189
- end
192
+ private_class_method
193
+ def indent_multiline( verb, indent )
194
+ if verb.match?(/.\s*\n\s*./)
195
+ verb.lines.map!{|ln| ln.prepend(' ' * indent)}.join("\n")
196
+ else
197
+ verb.prepend(' ' * indent)
198
+ end
199
+ end
190
200
 
191
- def self.prettify_multiple( sql_multi, colorize = true )
192
- sql_multi.split( /(?>#{SQL_COMMENTS})|(\;)/ ).inject(['']) { |queries, pattern|
193
- queries.last << pattern
194
- queries << '' if pattern == ';'
195
- queries
196
- }.map!{ |sql|
197
- # we were splitting by comments and ;, so if next sql start with comment we've got a misplaced \n\n
198
- sql.match?(/\A\s+\z/) ? nil : prettify_sql( sql, colorize )
199
- }.compact.join("\n\n")
200
- end
201
+ private_class_method
202
+ def extract_err_caret_line( err_address_line, err_line, sql_body, err )
203
+ # LINE could be quoted ( both sides and sometimes only from one ):
204
+ # "LINE 1: ...t_id\" = $13 AND \"products\".\"carrier_id\" = $14 AND \"product_t...\n",
205
+ err_quote = (err_address_line.match(/\.\.\.(.+)\.\.\./) || err_address_line.match(/\.\.\.(.+)/) ).try(:[], 1)
206
+
207
+ # line[2] is original err caret line i.e.: ' ^'
208
+ # err_address_line[/LINE \d+:/].length+1..-1 - is a position from error quote begin
209
+ err_caret_line = err.lines[2][err_address_line[/LINE \d+:/].length+1..-1]
210
+
211
+ # when err line is too long postgres quotes it in double '...'
212
+ # so we need to reposition caret against original line
213
+ if err_quote
214
+ err_quote_caret_offset = err_caret_line.length - err_address_line.index( '...' ).to_i + 3
215
+ err_caret_line = ' ' * ( err_line.index( err_quote ) + err_quote_caret_offset ) + "^\n"
216
+ end
201
217
 
202
- private
203
- def self.indent_multiline( verb, indent )
204
- #
205
- if verb.match?(/.\s*\n\s*./)
206
- verb.lines.map!{|ln| "#{' ' * indent}" + ln}.join("\n")
207
- else
208
- "#{' ' * indent}" + verb.to_s
218
+ # older versions of ActiveRecord were adding ': ' before an original query :(
219
+ err_caret_line.prepend(' ') if sql_body[0].start_with?(': ')
220
+ # if mistake is on last string than err_line.last != \n then we need to prepend \n to caret line
221
+ err_caret_line.prepend("\n") unless err_line[-1] == "\n"
222
+ err_caret_line
209
223
  end
210
224
  end
211
225
  end
@@ -228,7 +242,9 @@ module Niceql
228
242
 
229
243
  module ErrorExt
230
244
  def to_s
231
- Niceql.config.prettify_pg_errors ? Prettifier.prettify_err(super) : super
245
+ # older rails version do not provide sql as a standalone query, instead they
246
+ # deliver joined message
247
+ Niceql.config.prettify_pg_errors ? Prettifier.prettify_err(super, try(:sql) ) : super
232
248
  end
233
249
  end
234
250
 
@@ -274,11 +290,10 @@ module Niceql
274
290
  @config ||= NiceQLConfig.new
275
291
  end
276
292
 
277
- if defined? ::ActiveRecord::Base
278
- ::ActiveRecord::Base.extend ArExtentions
279
- [::ActiveRecord::Relation, ::ActiveRecord::Associations::CollectionProxy].each { |klass| klass.send(:include, ArExtentions) }
293
+ if defined? ::ActiveRecord
294
+ [::ActiveRecord::Relation,
295
+ ::Arel::TreeManager,
296
+ ::Arel::Nodes::Node].each { |klass| klass.send(:include, ArExtentions) }
280
297
  end
281
298
 
282
299
  end
283
-
284
-
data/niceql.gemspec CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["alekseyl"]
10
10
  spec.email = ["leshchuk@gmail.com"]
11
11
 
12
- spec.summary = %q{This is simple and nice sql prettifier, it splits, indent and colorize SQL query and PG errors if any }
13
- spec.description = %q{This is simple and nice sql prettifier, it splits, indent and colorize SQL query and PG error if any }
12
+ spec.summary = %q{This is a simple and nice gem for SQL prettifying and formatting. Niceql splits, indent and colorize SQL query and PG errors if any. }
13
+ spec.description = %q{This is a simple and nice gem for SQL prettifying and formatting. Niceql splits, indent and colorize SQL query and PG errors if any. Could be used as a standalone gem without any dependencies. Seamless ActiveRecord integration. }
14
14
  spec.homepage = "https://github.com/alekseyl/niceql"
15
15
  spec.license = "MIT"
16
16
 
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
31
  spec.require_paths = ["lib"]
32
32
 
33
- spec.required_ruby_version = '>= 2.3'
33
+ spec.required_ruby_version = '>= 2.4'
34
34
  spec.add_development_dependency "activerecord", ">= 6.1"
35
35
 
36
36
  spec.add_development_dependency "bundler", ">= 1"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: niceql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - alekseyl
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-09-22 00:00:00.000000000 Z
11
+ date: 2021-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -122,8 +122,9 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
- description: 'This is simple and nice sql prettifier, it splits, indent and colorize
126
- SQL query and PG error if any '
125
+ description: 'This is a simple and nice gem for SQL prettifying and formatting. Niceql
126
+ splits, indent and colorize SQL query and PG errors if any. Could be used as a standalone
127
+ gem without any dependencies. Seamless ActiveRecord integration. '
127
128
  email:
128
129
  - leshchuk@gmail.com
129
130
  executables: []
@@ -147,7 +148,6 @@ files:
147
148
  - lib/generators/niceql/install_generator.rb
148
149
  - lib/generators/templates/niceql_initializer.rb
149
150
  - lib/niceql.rb
150
- - lib/niceql/string.rb
151
151
  - lib/niceql/version.rb
152
152
  - niceql.gemspec
153
153
  - to_niceql.png
@@ -164,16 +164,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
164
164
  requirements:
165
165
  - - ">="
166
166
  - !ruby/object:Gem::Version
167
- version: '2.3'
167
+ version: '2.4'
168
168
  required_rubygems_version: !ruby/object:Gem::Requirement
169
169
  requirements:
170
170
  - - ">="
171
171
  - !ruby/object:Gem::Version
172
172
  version: '0'
173
173
  requirements: []
174
- rubygems_version: 3.1.4
174
+ rubygems_version: 3.0.9
175
175
  signing_key:
176
176
  specification_version: 4
177
- summary: This is simple and nice sql prettifier, it splits, indent and colorize SQL
178
- query and PG errors if any
177
+ summary: This is a simple and nice gem for SQL prettifying and formatting. Niceql
178
+ splits, indent and colorize SQL query and PG errors if any.
179
179
  test_files: []
data/lib/niceql/string.rb DELETED
@@ -1,5 +0,0 @@
1
- class String
2
- def match?(pattern)
3
- self =~ pattern
4
- end
5
- end unless String.method_defined?(:match?)