rom-sql 2.2.0 → 2.2.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
  SHA1:
3
- metadata.gz: 8a59a75e6eb28bd684acbd721bf2718637ec3463
4
- data.tar.gz: eb2281b8bb5f156d73056e1b56f8a58fa7fa174a
3
+ metadata.gz: a673acd61e77b7b2c2a49c3dd781e06d716cec4e
4
+ data.tar.gz: e45523ac3f3c46e314fe529eb98d6ac721694e8d
5
5
  SHA512:
6
- metadata.gz: 3385bfffcc897f83b3d7c0a77d93d4a7bb9ff3416be241fe9df53e5b8a4c38371a196461d8f7b7c90dcf99f2083cfe876fcfe109b86d3fe3910913c8537fc95a
7
- data.tar.gz: 6c4cf20e4be86dc15f49162657ced6df27818c8d3c4a12bf966ce327541a585ce8d94ad7c2ad003ee318e442ae5611b4f4979114e099947b5627ba82264e9bf4
6
+ metadata.gz: d810deb9e4bc9d86bd35d8603644a7aa87dd7f2f7b712d681d9260482763c376f367535a22833f1b18ab36ff9d67ef26c175e4339967d52b6a7a18dfead68bf8
7
+ data.tar.gz: fc32e693d9b079c81108f495df1e42fcb8cdfa971104fead58c635f75a7fcb837933eb743265be7a866282f417a3d937fb7e166ebb319090809ef43ada8e331a
@@ -1,3 +1,12 @@
1
+ ## v2.2.1 2017-11-10
2
+
3
+ ### Fixed
4
+
5
+ * Instrumentation works with all db interactions (not just queries that materialize relations) (solnic)
6
+ * Typo in `MissingEnv` exception message (romatr)
7
+
8
+ [Compare v2.2.0...v2.2.1](https://github.com/rom-rb/rom-sql/compare/v2.2.0...v2.2.1)
9
+
1
10
  ## v2.2.0 2017-11-02
2
11
 
3
12
  ### Added
@@ -1,23 +1,86 @@
1
- require 'rom/plugins/relation/instrumentation'
2
-
3
1
  module ROM
4
2
  module Plugins
5
3
  module Relation
6
4
  module SQL
7
- # @api private
5
+ # Instrumentation for relations and commands
6
+ #
7
+ # This plugin allows configuring a notification system, that will be used
8
+ # to instrument interactions with databases, it's based on an abstract API
9
+ # so it should work with any instrumentation object that provides
10
+ # `instrument(identifier, payload)` method.
11
+ #
12
+ # By default, instrumentation is triggered with following arguments:
13
+ # - `identifier` is set to `:sql`
14
+ # - `payload` is set to a hash with following keys:
15
+ # - `:name` database type, ie `:sqlite`, `:postgresql` etc.
16
+ # - `:query` a string with an SQL statement that was executed
17
+ #
18
+ # @example configuring notifications
19
+ # config = ROM::Configuration.new(:sqlite, 'sqlite::memory')
20
+ #
21
+ # config.plugin(:sql, relations: :instrumentation) do |c|
22
+ # c.notifications = MyNotifications.new
23
+ # end
24
+ #
25
+ # @api public
8
26
  module Instrumentation
9
- def self.included(klass)
10
- super
27
+ extend Notifications::Listener
28
+
29
+ subscribe('configuration.relations.registry.created') do |event|
30
+ registry = event[:registry]
31
+
32
+ relations = registry.select { |_, r| r.adapter == :sql && r.respond_to?(:notifications) }.to_h
33
+ db_notifications = relations.values.map { |r| [r.dataset.db, r.notifications] }.uniq.to_h
34
+
35
+ db_notifications.each do |db, notifications|
36
+ instrumenter = Instrumenter.new(db.database_type, notifications)
37
+ db.extend(instrumenter)
38
+ end
39
+ end
40
+
41
+ # This stateful module is used to extend database connection objects
42
+ # and monkey-patches `log_connection_yield` method, which unfortunately
43
+ # is the only way to provide instrumentation on the sequel side.
44
+ #
45
+ # @api private
46
+ class Instrumenter < Module
47
+ # @!attribute [r] name
48
+ # @return [Symbol] database type
49
+ attr_reader :name
11
50
 
12
- klass.class_eval do
13
- include ROM::Plugins::Relation::Instrumentation
51
+ # @!attribute [r] notifications
52
+ # @return [Object] any object that responds to `instrument`
53
+ attr_reader :notifications
14
54
 
15
- # @api private
16
- def notification_payload(relation)
17
- super.merge(query: relation.dataset.sql)
55
+ # @api private
56
+ def initialize(name, notifications)
57
+ @name = name
58
+ @notifications = notifications
59
+ define_log_connection_yield
60
+ end
61
+
62
+ private
63
+
64
+ # @api private
65
+ def define_log_connection_yield
66
+ name = self.name
67
+ notifications = self.notifications
68
+
69
+ define_method(:log_connection_yield) do |*args, &block|
70
+ notifications.instrument(:sql, name: name, query: args[0]) do
71
+ super(*args, &block)
72
+ end
18
73
  end
19
74
  end
20
75
  end
76
+
77
+ # Add `:notifications` option to a relation
78
+ #
79
+ # @api private
80
+ def self.included(klass)
81
+ super
82
+ klass.option :notifications
83
+ end
21
84
  end
22
85
  end
23
86
  end
@@ -27,7 +27,7 @@ module ROM
27
27
  def gateway
28
28
  if env.nil?
29
29
  Gateway.instance ||
30
- raise(MissingEnv, "Set up a configutation with ROM::SQL::RakeSupport.env= in the db:setup task")
30
+ raise(MissingEnv, "Set up a configuration with ROM::SQL::RakeSupport.env= in the db:setup task")
31
31
  else
32
32
  env.gateways[:default]
33
33
  end
@@ -1,5 +1,5 @@
1
1
  module ROM
2
2
  module SQL
3
- VERSION = '2.2.0'.freeze
3
+ VERSION = '2.2.1'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rom-sql
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-02 00:00:00.000000000 Z
11
+ date: 2017-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel
@@ -246,7 +246,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
246
246
  version: '0'
247
247
  requirements: []
248
248
  rubyforge_project:
249
- rubygems_version: 2.6.11
249
+ rubygems_version: 2.6.13
250
250
  signing_key:
251
251
  specification_version: 4
252
252
  summary: SQL databases support for ROM