marginalia 1.6.0 → 1.7.0
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 +4 -4
- data/.travis.yml +11 -13
- data/Gemfile +5 -1
- data/README.md +21 -0
- data/gemfiles/4.2.api.gemfile +9 -0
- data/gemfiles/4.2.gemfile +8 -0
- data/gemfiles/5.0.gemfile +8 -0
- data/gemfiles/5.1.gemfile +8 -0
- data/gemfiles/5.2.gemfile +8 -0
- data/lib/marginalia.rb +14 -3
- data/lib/marginalia/comment.rb +13 -0
- data/lib/marginalia/sidekiq_instrumentation.rb +25 -0
- data/marginalia.gemspec +2 -3
- data/test/query_comments_test.rb +57 -0
- metadata +23 -5
- data/ext/mkrf_conf.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da6b70d12c22d141f4283d2e99b5550afaf8da14
|
4
|
+
data.tar.gz: fb2a34d6aee5b051fc9611ba792f4c14a50b2e9b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af483022b150c72a218aa51dadb6db0865272cd81faa53db211b1b08e81a0b18b560908e92f553e93eb8b0d47029bd927f6fe6e61c811ab11e9d4b63339bed9d
|
7
|
+
data.tar.gz: e688057959cfd654dc027f03b1a8720ad21c90113d5478d18ed6897d5e4ab0a21297e703cfca85275e5d4495bce0e354acd9612f97f395cad6b1c70cdb39c8fa
|
data/.travis.yml
CHANGED
@@ -1,18 +1,16 @@
|
|
1
1
|
language: ruby
|
2
|
+
sudo: false
|
2
3
|
|
3
4
|
rvm:
|
4
|
-
- 2.
|
5
|
-
- 2.
|
6
|
-
- 2.
|
7
|
-
|
8
|
-
sudo: false
|
5
|
+
- 2.2
|
6
|
+
- 2.3
|
7
|
+
- 2.4
|
9
8
|
|
10
|
-
script: bundle exec rake db:reset test:all
|
9
|
+
script: "bundle exec rake db:reset test:all"
|
11
10
|
|
12
|
-
|
13
|
-
-
|
14
|
-
-
|
15
|
-
-
|
16
|
-
-
|
17
|
-
-
|
18
|
-
- "RAILS_VERSION=5.1.5 TEST_RAILS_API=true"
|
11
|
+
gemfile:
|
12
|
+
- gemfiles/4.2.gemfile
|
13
|
+
- gemfiles/4.2.api.gemfile
|
14
|
+
- gemfiles/5.0.gemfile
|
15
|
+
- gemfiles/5.1.gemfile
|
16
|
+
- gemfiles/5.2.gemfile
|
data/Gemfile
CHANGED
@@ -10,7 +10,7 @@ else
|
|
10
10
|
gem 'mysql2', '>= 0.3.13', '< 0.5'
|
11
11
|
end
|
12
12
|
gem 'pg', '~> 0.15'
|
13
|
-
gem 'sqlite3'
|
13
|
+
gem 'sqlite3', '~> 1.3.6'
|
14
14
|
|
15
15
|
rails = case version
|
16
16
|
when "master"
|
@@ -24,3 +24,7 @@ gem "rails", rails
|
|
24
24
|
if ENV["TEST_RAILS_API"] == "true"
|
25
25
|
gem "rails-api", "~> 0.2.1"
|
26
26
|
end
|
27
|
+
|
28
|
+
if RUBY_VERSION.start_with?('2.3')
|
29
|
+
gem 'mysql'
|
30
|
+
end
|
data/README.md
CHANGED
@@ -100,6 +100,27 @@ With ActiveRecord >= 3.2.19:
|
|
100
100
|
|
101
101
|
Pull requests for other included comment components are welcome.
|
102
102
|
|
103
|
+
## Inline query annotations
|
104
|
+
|
105
|
+
In addition to the request or job-level component-based annotations,
|
106
|
+
Marginalia may be used to add inline annotations to specific queries using a
|
107
|
+
block-based API.
|
108
|
+
|
109
|
+
For example, the following code:
|
110
|
+
|
111
|
+
Marginalia.with_annotation("foo") do
|
112
|
+
Account.where(queenbee_id: 1234567890).first
|
113
|
+
end
|
114
|
+
|
115
|
+
will issue this query:
|
116
|
+
|
117
|
+
Account Load (0.3ms) SELECT `accounts`.* FROM `accounts`
|
118
|
+
WHERE `accounts`.`queenbee_id` = 1234567890
|
119
|
+
LIMIT 1
|
120
|
+
/*application:BCX,controller:project_imports,action:show*/ /*foo*/
|
121
|
+
|
122
|
+
Nesting `with_annotation` blocks will concatenate the comment strings.
|
123
|
+
|
103
124
|
## Contributing
|
104
125
|
|
105
126
|
Start by bundling and creating the test database:
|
data/lib/marginalia.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'marginalia/railtie'
|
2
2
|
require 'marginalia/comment'
|
3
|
+
require 'marginalia/sidekiq_instrumentation'
|
3
4
|
|
4
5
|
module Marginalia
|
5
6
|
mattr_accessor :application_name
|
@@ -48,10 +49,13 @@ module Marginalia
|
|
48
49
|
Marginalia::Comment.update_adapter!(self)
|
49
50
|
comment = Marginalia::Comment.construct_comment
|
50
51
|
if comment.present? && !sql.include?(comment)
|
51
|
-
"#{sql} /*#{comment}*/"
|
52
|
-
else
|
53
|
-
sql
|
52
|
+
sql = "#{sql} /*#{comment}*/"
|
54
53
|
end
|
54
|
+
inline_comment = Marginalia::Comment.construct_inline_comment
|
55
|
+
if inline_comment.present?
|
56
|
+
sql = "#{sql} /*#{inline_comment}*/"
|
57
|
+
end
|
58
|
+
sql
|
55
59
|
end
|
56
60
|
|
57
61
|
def execute_with_marginalia(sql, name = nil)
|
@@ -100,4 +104,11 @@ module Marginalia
|
|
100
104
|
Marginalia::Comment.clear!
|
101
105
|
end
|
102
106
|
end
|
107
|
+
|
108
|
+
def self.with_annotation(comment, &block)
|
109
|
+
Marginalia::Comment.inline_annotations.push(comment)
|
110
|
+
block.call if block.present?
|
111
|
+
ensure
|
112
|
+
Marginalia::Comment.inline_annotations.pop
|
113
|
+
end
|
103
114
|
end
|
data/lib/marginalia/comment.rb
CHANGED
@@ -30,6 +30,11 @@ module Marginalia
|
|
30
30
|
ret
|
31
31
|
end
|
32
32
|
|
33
|
+
def self.construct_inline_comment
|
34
|
+
return nil if inline_annotations.none?
|
35
|
+
escape_sql_comment(inline_annotations.join)
|
36
|
+
end
|
37
|
+
|
33
38
|
def self.escape_sql_comment(str)
|
34
39
|
while str.include?('/*') || str.include?('*/')
|
35
40
|
str = str.gsub('/*', '').gsub('*/', '')
|
@@ -96,6 +101,10 @@ module Marginalia
|
|
96
101
|
marginalia_controller.action_name if marginalia_controller.respond_to? :action_name
|
97
102
|
end
|
98
103
|
|
104
|
+
def self.sidekiq_job
|
105
|
+
marginalia_job["class"] if marginalia_job
|
106
|
+
end
|
107
|
+
|
99
108
|
def self.line
|
100
109
|
Marginalia::Comment.lines_to_ignore ||= /\.rvm|gem|vendor\/|marginalia|rbenv/
|
101
110
|
last_line = caller.detect do |line|
|
@@ -154,6 +163,10 @@ module Marginalia
|
|
154
163
|
marginalia_adapter.pool.spec.config
|
155
164
|
end
|
156
165
|
end
|
166
|
+
|
167
|
+
def self.inline_annotations
|
168
|
+
Thread.current[:marginalia_inline_annotations] ||= []
|
169
|
+
end
|
157
170
|
end
|
158
171
|
|
159
172
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Marginalia
|
2
|
+
|
3
|
+
# Alternative to ActiveJob Instrumentation for Sidekiq.
|
4
|
+
# Apt for Instrumenting Sidekiq with Rails version < 4.2.
|
5
|
+
module SidekiqInstrumentation
|
6
|
+
|
7
|
+
class Middleware
|
8
|
+
def call(worker, msg, queue)
|
9
|
+
Marginalia::Comment.update_job! msg
|
10
|
+
yield
|
11
|
+
ensure
|
12
|
+
Marginalia::Comment.clear_job!
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.enable!
|
17
|
+
Sidekiq.configure_server do |config|
|
18
|
+
config.server_middleware do |chain|
|
19
|
+
chain.add Marginalia::SidekiqInstrumentation::Middleware
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/marginalia.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.test_files = `git ls-files -- {test}/*`.split("\n")
|
9
9
|
gem.name = "marginalia"
|
10
10
|
gem.require_paths = ["lib"]
|
11
|
-
gem.version = "1.
|
11
|
+
gem.version = "1.7.0"
|
12
12
|
gem.license = "MIT"
|
13
13
|
|
14
14
|
gem.add_runtime_dependency "actionpack", ">= 2.3"
|
@@ -19,8 +19,7 @@ Gem::Specification.new do |gem|
|
|
19
19
|
gem.add_development_dependency "sqlite3"
|
20
20
|
gem.add_development_dependency "minitest"
|
21
21
|
gem.add_development_dependency "mocha"
|
22
|
+
gem.add_development_dependency "sidekiq"
|
22
23
|
|
23
24
|
gem.summary = gem.description = %q{Attach comments to your ActiveRecord queries.}
|
24
|
-
|
25
|
-
gem.extensions = ["ext/mkrf_conf.rb"]
|
26
25
|
end
|
data/test/query_comments_test.rb
CHANGED
@@ -23,6 +23,8 @@ require 'logger'
|
|
23
23
|
require 'pp'
|
24
24
|
require 'active_record'
|
25
25
|
require 'action_controller'
|
26
|
+
require 'sidekiq'
|
27
|
+
require 'sidekiq/testing'
|
26
28
|
|
27
29
|
if request_id_available?
|
28
30
|
require 'action_dispatch/middleware/request_id'
|
@@ -87,6 +89,13 @@ if active_job_available?
|
|
87
89
|
end
|
88
90
|
end
|
89
91
|
|
92
|
+
class PostsSidekiqJob
|
93
|
+
include Sidekiq::Worker
|
94
|
+
def perform
|
95
|
+
Post.first
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
90
99
|
if using_rails_api?
|
91
100
|
class PostsApiController < ActionController::API
|
92
101
|
def driver_only
|
@@ -275,6 +284,23 @@ class MarginaliaTest < MiniTest::Test
|
|
275
284
|
end
|
276
285
|
end
|
277
286
|
|
287
|
+
def test_sidekiq_job
|
288
|
+
Marginalia::Comment.components = [:sidekiq_job]
|
289
|
+
Marginalia::SidekiqInstrumentation.enable!
|
290
|
+
|
291
|
+
# Test harness does not run Sidekiq middlewares by default so include testing middleware.
|
292
|
+
Sidekiq::Testing.server_middleware do |chain|
|
293
|
+
chain.add Marginalia::SidekiqInstrumentation::Middleware
|
294
|
+
end
|
295
|
+
|
296
|
+
Sidekiq::Testing.fake!
|
297
|
+
PostsSidekiqJob.perform_async
|
298
|
+
PostsSidekiqJob.drain
|
299
|
+
assert_match %{sidekiq_job:PostsSidekiqJob}, @queries.first
|
300
|
+
Post.first
|
301
|
+
refute_match %{sidekiq_job:PostsSidekiqJob}, @queries.last
|
302
|
+
end
|
303
|
+
|
278
304
|
def test_good_comment
|
279
305
|
assert_equal Marginalia::Comment.escape_sql_comment('app:foo'), 'app:foo'
|
280
306
|
end
|
@@ -284,6 +310,37 @@ class MarginaliaTest < MiniTest::Test
|
|
284
310
|
assert_equal Marginalia::Comment.escape_sql_comment('**//; DROP TABLE USERS;/*'), '; DROP TABLE USERS;'
|
285
311
|
end
|
286
312
|
|
313
|
+
def test_inline_annotations
|
314
|
+
Marginalia.with_annotation("foo") do
|
315
|
+
Post.first
|
316
|
+
end
|
317
|
+
Post.first
|
318
|
+
assert_match %r{/\*foo\*/$}, @queries.first
|
319
|
+
refute_match %r{/\*foo\*/$}, @queries.last
|
320
|
+
# Assert we're not adding an empty comment, either
|
321
|
+
refute_match %r{/\*\s*\*/$}, @queries.last
|
322
|
+
end
|
323
|
+
|
324
|
+
def test_nested_inline_annotations
|
325
|
+
Marginalia.with_annotation("foo") do
|
326
|
+
Marginalia.with_annotation("bar") do
|
327
|
+
Post.first
|
328
|
+
end
|
329
|
+
end
|
330
|
+
assert_match %r{/\*foobar\*/$}, @queries.first
|
331
|
+
end
|
332
|
+
|
333
|
+
def test_bad_inline_annotations
|
334
|
+
Marginalia.with_annotation("*/; DROP TABLE USERS;/*") do
|
335
|
+
Post.first
|
336
|
+
end
|
337
|
+
Marginalia.with_annotation("**//; DROP TABLE USERS;//**") do
|
338
|
+
Post.first
|
339
|
+
end
|
340
|
+
assert_match %r{/\*; DROP TABLE USERS;\*/$}, @queries.first
|
341
|
+
assert_match %r{/\*; DROP TABLE USERS;\*/$}, @queries.last
|
342
|
+
end
|
343
|
+
|
287
344
|
def teardown
|
288
345
|
Marginalia.application_name = nil
|
289
346
|
Marginalia::Comment.lines_to_ignore = nil
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: marginalia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Noah Lorang
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2019-03-15 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: actionpack
|
@@ -124,13 +124,26 @@ dependencies:
|
|
124
124
|
- - ">="
|
125
125
|
- !ruby/object:Gem::Version
|
126
126
|
version: '0'
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: sidekiq
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - ">="
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
127
141
|
description: Attach comments to your ActiveRecord queries.
|
128
142
|
email:
|
129
143
|
- noah@37signals.com
|
130
144
|
- arthurnn@github.com
|
131
145
|
executables: []
|
132
|
-
extensions:
|
133
|
-
- ext/mkrf_conf.rb
|
146
|
+
extensions: []
|
134
147
|
extra_rdoc_files: []
|
135
148
|
files:
|
136
149
|
- ".gitignore"
|
@@ -140,11 +153,16 @@ files:
|
|
140
153
|
- LICENSE
|
141
154
|
- README.md
|
142
155
|
- Rakefile
|
143
|
-
-
|
156
|
+
- gemfiles/4.2.api.gemfile
|
157
|
+
- gemfiles/4.2.gemfile
|
158
|
+
- gemfiles/5.0.gemfile
|
159
|
+
- gemfiles/5.1.gemfile
|
160
|
+
- gemfiles/5.2.gemfile
|
144
161
|
- init.rb
|
145
162
|
- lib/marginalia.rb
|
146
163
|
- lib/marginalia/comment.rb
|
147
164
|
- lib/marginalia/railtie.rb
|
165
|
+
- lib/marginalia/sidekiq_instrumentation.rb
|
148
166
|
- marginalia.gemspec
|
149
167
|
- test/query_comments_test.rb
|
150
168
|
homepage: https://github.com/basecamp/marginalia
|
data/ext/mkrf_conf.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'rubygems/command.rb'
|
3
|
-
require 'rubygems/dependency_installer.rb'
|
4
|
-
|
5
|
-
begin
|
6
|
-
Gem::Command.build_args = ARGV
|
7
|
-
rescue NoMethodError
|
8
|
-
end
|
9
|
-
|
10
|
-
installer = Gem::DependencyInstaller.new
|
11
|
-
begin
|
12
|
-
if RUBY_VERSION < "2.4"
|
13
|
-
installer.install "mysql", ">=0"
|
14
|
-
end
|
15
|
-
rescue
|
16
|
-
exit(1)
|
17
|
-
end
|
18
|
-
|
19
|
-
f = File.open(File.join(File.dirname(__FILE__), "Rakefile"), "w")
|
20
|
-
f.write("task :default\n")
|
21
|
-
f.close
|