real_data_tests 0.3.4 → 0.3.6

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
  SHA256:
3
- metadata.gz: 2a75133368f84b08bf44ad4f2ee73ed4eaf5636a7f19dbafdc5e6c47478055d8
4
- data.tar.gz: 7693fa53c25af6c928ce61cb33e14667bf580fb18a32182452917932ca539bf2
3
+ metadata.gz: 179a591f6a485c397255c0cbec27e18757e2f7fdc450f7292f279cd681f91e0b
4
+ data.tar.gz: bb9b9f4f60b609f2ea8a901689b4b9b8d5ddfdc7d36e867c18ebbe24855cb5aa
5
5
  SHA512:
6
- metadata.gz: 366de9d95f5d8582c83cebcb89e20af819a6516dc6a1a30e3e560b3ba6de5e300404a781a08fc6b1063b562dd2519ce83ce80a0976844dfd09e0ce94551641ca
7
- data.tar.gz: be867e1b473e90ea4bcb9041704fe6e4edac3d4e371c283dda8ac6c32b2903cd2d5b81a326f4aaa6bcb36859c2125ec995d6d115b594441bb6f23b1cbc019e5b
6
+ metadata.gz: a47d49d690958e70cd324ede48dadce7d3e9e7bd39471ee052879d6fe5646ad308aebbf05f79cb92ebe3c9b7ede94b0163c74efdddf3f518ef47518a489a2ee6
7
+ data.tar.gz: a4c6a97cff1bd02096064fd1da67580dd9307ce29f4e7d5a8be4d82c9f352b97009ef1fc22eb555dc39b1b87599947680a61bc2bc376c2cd14a7f8cc5397892d
data/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.3.6] - 2025-01-14
4
+ ### Fixed
5
+ - Further enhanced SQL statement handling in native loader
6
+ - Fixed handling of SQL statements with ON CONFLICT clauses
7
+ - Improved quoting for company names containing spaces
8
+ - Added proper handling of trailing semicolons
9
+ - Enhanced detection and preservation of SQL statement structure
10
+
11
+ ## [0.3.5] - 2025-01-14
12
+ ### Fixed
13
+ - Enhanced SQL statement handling in native loader
14
+ - Added proper UUID value quoting in VALUES clauses
15
+ - Fixed string value formatting in SQL statements
16
+ - Improved error reporting with detailed SQL statement context
17
+ - Added robust SQL statement cleaning and normalization
18
+
3
19
  ## [0.3.4] - 2025-01-14
4
20
  ### Added
5
21
  - Alternative native SQL loading method for CI environments
@@ -39,9 +39,12 @@ module RealDataTests
39
39
  statements.each do |statement|
40
40
  next if statement.strip.empty?
41
41
  begin
42
- connection.execute(statement)
42
+ # Clean up any formatting issues that might cause syntax errors
43
+ cleaned_statement = clean_sql_statement(statement)
44
+ connection.execute(cleaned_statement)
43
45
  rescue ActiveRecord::StatementInvalid => e
44
- raise Error, "Failed to execute SQL statement: #{e.message}"
46
+ # Provide detailed error information
47
+ raise Error, "Failed to execute SQL statement: #{e.message}\nStatement: #{cleaned_statement}"
45
48
  end
46
49
  end
47
50
  ensure
@@ -99,5 +102,82 @@ module RealDataTests
99
102
 
100
103
  statements
101
104
  end
105
+
106
+ def clean_sql_statement(statement)
107
+ # Handle VALUES clause formatting
108
+ if statement.include?('VALUES')
109
+ # Split into pre-VALUES and VALUES parts
110
+ parts = statement.split(/VALUES\s*\(/i, 2)
111
+ if parts.length == 2
112
+ # Get the column names from the first part
113
+ column_names = parts[0].scan(/\((.*?)\)/).flatten.first&.split(',')&.map(&:strip) || []
114
+
115
+ # Split values into individual items
116
+ values_part = parts[1]
117
+ values = split_values(values_part)
118
+
119
+ # Process each value according to its column and position
120
+ values.each_with_index do |value, i|
121
+ # Skip if already properly quoted
122
+ next if value.start_with?("'") && value.end_with?("'")
123
+
124
+ # Quote UUIDs
125
+ if value.match?(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i)
126
+ values[i] = "'#{value}'"
127
+ # Quote any non-NULL string values that contain spaces or special characters
128
+ elsif !['NULL', 'true', 'false'].include?(value) &&
129
+ !value.match?(/^\d+$/) && # not a number
130
+ !value.start_with?("'{") && # not a JSON object
131
+ !value.start_with?("'") # not already quoted
132
+ values[i] = "'#{value}'"
133
+ end
134
+ end
135
+
136
+ # Reassemble the statement with any trailing ON CONFLICT clause
137
+ remainder = values_part.match(/\)\s*(ON\s+CONFLICT.*?)(;?\s*$)/i)
138
+ statement = parts[0] + 'VALUES (' + values.join(', ') + ')'
139
+ statement += " #{remainder[1]};" if remainder
140
+ end
141
+ end
142
+
143
+ statement
144
+ end
145
+
146
+ def split_values(values_part)
147
+ values = []
148
+ current_value = ''
149
+ in_quotes = false
150
+ in_json = false
151
+ depth = 0
152
+
153
+ values_part.chars.each_with_index do |char, i|
154
+ case char
155
+ when "'"
156
+ # Toggle quote state if not escaped
157
+ if i == 0 || values_part[i-1] != '\\'
158
+ in_quotes = !in_quotes
159
+ end
160
+ when '{'
161
+ depth += 1 unless in_quotes
162
+ in_json = true unless in_quotes
163
+ when '}'
164
+ depth -= 1 unless in_quotes
165
+ when ','
166
+ if !in_quotes && depth == 0
167
+ values << current_value.strip
168
+ current_value = ''
169
+ next
170
+ end
171
+ end
172
+ current_value << char
173
+ end
174
+
175
+ # Add the last value (remove trailing ';' or ')')
176
+ last_value = current_value.strip
177
+ last_value = last_value[0..-2] if last_value.end_with?(';', ')')
178
+ values << last_value
179
+
180
+ values
181
+ end
102
182
  end
103
183
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RealDataTests
4
- VERSION = "0.3.4"
4
+ VERSION = "0.3.6"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: real_data_tests
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Dias