rails_spotlight 0.1.6 → 0.1.7

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: 797f782446bb2946abfc23b500dd6bed6032df02be0795e0d44083ca78344d19
4
- data.tar.gz: a95afda90830aaa9520b1f88012091a3481ca6ac71fd031fda5f4e8dddd8b126
3
+ metadata.gz: 507c2c676db5d30d6af1ec0f505e067f16c53514dfd875cd4554041304d95b87
4
+ data.tar.gz: 8c990b6ec150e2a6c9e7b8e0c581d5b1e74987e5502907e847218a78d6324103
5
5
  SHA512:
6
- metadata.gz: a5a44dc240578e5a9a639a666d6adcb5bee447e46d26af4d6f2fd3e8e1c1c39bb9129f1df13ca209a525a16413584e2a06405c1392e652c882d671389533524a
7
- data.tar.gz: 047e4a531ef327f471a494d0865be7b2d2327572bfda8c5575638b62ebf768ab66d34c497177c3cf9b04586df6f95cace25ac234525acba17cea8d56c7a2ef0f
6
+ metadata.gz: c36b1e95facd5d437c4685a7ba66a02e45eaf152d8e4fc607468fffef5fad8d7fb9c15ed1b760feaa1501b1b2c8a27bd61166917083da90ccb5cf64529530a6c
7
+ data.tar.gz: d1439a47bedd079561dcecb4a8f1f8cde964eea6555da2dc0e16e330bac2b89abc9e0f90a2a499bf50c1939e1b1e64a0622209a14affa1d951abb76ad4c9732a
data/README.md CHANGED
@@ -48,3 +48,6 @@ The gem is available as open source under the terms of the [MIT License](https:/
48
48
  ## Code of Conduct
49
49
 
50
50
  Everyone interacting in the RailsSpotlight project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/pniemczyk/rails_spotlight/blob/master/CODE_OF_CONDUCT.md).
51
+
52
+
53
+ check https://github.com/alexrudall/ruby-openai
@@ -7,26 +7,31 @@ module RailsSpotlight
7
7
  module Handlers
8
8
  class SqlActionHandler < BaseActionHandler
9
9
  def execute
10
- if ActiveSupport.const_defined?('ExecutionContext')
11
- ActiveSupport::Notifications.subscribed(method(:logger), 'sql.active_record', monotonic: true) do
12
- ActiveSupport::ExecutionContext.set(rails_spotlight: request_id) do
13
- transaction
14
- end
15
- end
16
- else
17
- ActiveSupport::Notifications.subscribed(method(:logger), 'sql.active_record') do
18
- transaction
19
- end
10
+ validate_project!
11
+ return transaction unless ActiveSupport.const_defined?('ExecutionContext')
12
+
13
+ ActiveSupport::ExecutionContext.set(rails_spotlight: request_id) do
14
+ transaction
20
15
  end
21
16
  end
22
17
 
23
18
  private
24
19
 
20
+ def validate_project!
21
+ Rails.logger.warn required_projects
22
+ return if required_projects.blank?
23
+ return if required_projects.include?(::RailsSpotlight::Support::Project.instance.name)
24
+
25
+ raise UnprocessableEntity, "Check your connetction settings the current query is not allowed to be executed on the #{::RailsSpotlight::Support::Project.instance.name} project"
26
+ end
27
+
25
28
  def transaction
26
29
  ActiveRecord::Base.transaction do
27
- begin
28
- self.result = ActiveRecord::Base.connection.exec_query(query)
29
- rescue => e
30
+ begin # rubocop:disable Style/RedundantBegin
31
+ ActiveSupport::Notifications.subscribed(method(:logger), 'sql.active_record', monotonic: true) do
32
+ run
33
+ end
34
+ rescue => e # rubocop:disable Style/RescueStandardError
30
35
  self.error = e
31
36
  ensure
32
37
  raise ActiveRecord::Rollback unless force_execution?
@@ -34,14 +39,25 @@ module RailsSpotlight
34
39
  end
35
40
  end
36
41
 
37
- attr_accessor :result
38
- attr_accessor :error
42
+ def run
43
+ return self.result = ActiveRecord::Base.connection.exec_query(query) if connection_options.blank? || !ActiveRecord::Base.respond_to?(:connects_to)
44
+
45
+ connections = ActiveRecord::Base.connects_to(**connection_options)
46
+
47
+ adapter = connections.find { |c| c.role == use['role'] && c.shard.to_s == use['shard'] }
48
+ raise UnprocessableEntity, "Connection not found for role: `#{use["role"]}` and shard: `#{use["shard"]}`" if adapter.blank?
49
+
50
+ self.result = adapter.connection.exec_query(query)
51
+ end
52
+
53
+ attr_accessor :result, :error
39
54
 
40
55
  def json_response_body
41
56
  {
57
+ query: query,
42
58
  result: result,
43
59
  logs: logs,
44
- error: error.inspect,
60
+ error: error.present? ? error.inspect : nil,
45
61
  query_mode: force_execution? ? 'force' : 'default',
46
62
  project: ::RailsSpotlight::Support::Project.instance.name
47
63
  }
@@ -61,6 +77,25 @@ module RailsSpotlight
61
77
  @query ||= json_request_body.fetch('query')
62
78
  end
63
79
 
80
+ def raw_options
81
+ @raw_options ||= json_request_body.fetch('options', {}) || {}
82
+ end
83
+
84
+ def required_projects
85
+ @required_projects ||= raw_options.fetch('projects', [])
86
+ end
87
+
88
+ def use
89
+ @use ||= { 'shard' => 'default', 'role' => 'reading' }.merge(raw_options.fetch('use', {}))
90
+ end
91
+
92
+ def connection_options
93
+ @connection_options ||= raw_options
94
+ .symbolize_keys
95
+ .slice(:database, :shards)
96
+ .reject { |_, v| v.nil? || (!v.is_a?(TrueClass) && !v.is_a?(FalseClass) && v.empty?) } # TODO: Check for each rails version
97
+ end
98
+
64
99
  def force_execution?
65
100
  @force_execution ||= json_request_body['mode'] == 'force'
66
101
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsSpotlight
2
4
  module Support
3
5
  class Project
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsSpotlight
4
- VERSION = '0.1.6'
4
+ VERSION = '0.1.7'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_spotlight
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pawel Niemczyk
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-19 00:00:00.000000000 Z
11
+ date: 2023-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack-contrib
@@ -213,7 +213,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
213
213
  - !ruby/object:Gem::Version
214
214
  version: '0'
215
215
  requirements: []
216
- rubygems_version: 3.4.12
216
+ rubygems_version: 3.3.3
217
217
  signing_key:
218
218
  specification_version: 4
219
219
  summary: Lets have a look at your rails application in details