truex-skylight 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +277 -0
- data/CLA.md +9 -0
- data/CONTRIBUTING.md +1 -0
- data/LICENSE.md +79 -0
- data/README.md +4 -0
- data/bin/skylight +3 -0
- data/ext/extconf.rb +186 -0
- data/ext/libskylight.yml +6 -0
- data/ext/skylight_memprof.c +115 -0
- data/ext/skylight_native.c +416 -0
- data/ext/skylight_native.h +20 -0
- data/lib/skylight.rb +2 -0
- data/lib/skylight/api.rb +79 -0
- data/lib/skylight/cli.rb +146 -0
- data/lib/skylight/compat.rb +47 -0
- data/lib/skylight/config.rb +498 -0
- data/lib/skylight/core.rb +122 -0
- data/lib/skylight/data/cacert.pem +3894 -0
- data/lib/skylight/formatters/http.rb +17 -0
- data/lib/skylight/gc.rb +107 -0
- data/lib/skylight/helpers.rb +137 -0
- data/lib/skylight/instrumenter.rb +290 -0
- data/lib/skylight/middleware.rb +75 -0
- data/lib/skylight/native.rb +69 -0
- data/lib/skylight/normalizers.rb +133 -0
- data/lib/skylight/normalizers/action_controller/process_action.rb +35 -0
- data/lib/skylight/normalizers/action_controller/send_file.rb +76 -0
- data/lib/skylight/normalizers/action_view/render_collection.rb +18 -0
- data/lib/skylight/normalizers/action_view/render_partial.rb +18 -0
- data/lib/skylight/normalizers/action_view/render_template.rb +18 -0
- data/lib/skylight/normalizers/active_record/sql.rb +79 -0
- data/lib/skylight/normalizers/active_support/cache.rb +50 -0
- data/lib/skylight/normalizers/active_support/cache_clear.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_decrement.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_delete.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_exist.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_fetch_hit.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_generate.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_increment.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_read.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_read_multi.rb +16 -0
- data/lib/skylight/normalizers/active_support/cache_write.rb +16 -0
- data/lib/skylight/normalizers/default.rb +21 -0
- data/lib/skylight/normalizers/moped/query.rb +141 -0
- data/lib/skylight/probes.rb +91 -0
- data/lib/skylight/probes/excon.rb +25 -0
- data/lib/skylight/probes/excon/middleware.rb +65 -0
- data/lib/skylight/probes/net_http.rb +44 -0
- data/lib/skylight/probes/redis.rb +30 -0
- data/lib/skylight/probes/sequel.rb +30 -0
- data/lib/skylight/probes/sinatra.rb +74 -0
- data/lib/skylight/probes/tilt.rb +27 -0
- data/lib/skylight/railtie.rb +122 -0
- data/lib/skylight/sinatra.rb +4 -0
- data/lib/skylight/subscriber.rb +92 -0
- data/lib/skylight/trace.rb +191 -0
- data/lib/skylight/util.rb +16 -0
- data/lib/skylight/util/allocation_free.rb +17 -0
- data/lib/skylight/util/clock.rb +53 -0
- data/lib/skylight/util/gzip.rb +15 -0
- data/lib/skylight/util/hostname.rb +17 -0
- data/lib/skylight/util/http.rb +218 -0
- data/lib/skylight/util/inflector.rb +110 -0
- data/lib/skylight/util/logging.rb +87 -0
- data/lib/skylight/util/multi_io.rb +21 -0
- data/lib/skylight/util/native_ext_fetcher.rb +205 -0
- data/lib/skylight/util/platform.rb +67 -0
- data/lib/skylight/util/ssl.rb +50 -0
- data/lib/skylight/vendor/active_support/notifications.rb +207 -0
- data/lib/skylight/vendor/active_support/notifications/fanout.rb +159 -0
- data/lib/skylight/vendor/active_support/notifications/instrumenter.rb +72 -0
- data/lib/skylight/vendor/active_support/per_thread_registry.rb +52 -0
- data/lib/skylight/vendor/cli/highline.rb +1034 -0
- data/lib/skylight/vendor/cli/highline/color_scheme.rb +134 -0
- data/lib/skylight/vendor/cli/highline/compatibility.rb +16 -0
- data/lib/skylight/vendor/cli/highline/import.rb +41 -0
- data/lib/skylight/vendor/cli/highline/menu.rb +381 -0
- data/lib/skylight/vendor/cli/highline/question.rb +481 -0
- data/lib/skylight/vendor/cli/highline/simulate.rb +48 -0
- data/lib/skylight/vendor/cli/highline/string_extensions.rb +111 -0
- data/lib/skylight/vendor/cli/highline/style.rb +181 -0
- data/lib/skylight/vendor/cli/highline/system_extensions.rb +242 -0
- data/lib/skylight/vendor/cli/thor.rb +473 -0
- data/lib/skylight/vendor/cli/thor/actions.rb +318 -0
- data/lib/skylight/vendor/cli/thor/actions/create_file.rb +105 -0
- data/lib/skylight/vendor/cli/thor/actions/create_link.rb +60 -0
- data/lib/skylight/vendor/cli/thor/actions/directory.rb +119 -0
- data/lib/skylight/vendor/cli/thor/actions/empty_directory.rb +137 -0
- data/lib/skylight/vendor/cli/thor/actions/file_manipulation.rb +314 -0
- data/lib/skylight/vendor/cli/thor/actions/inject_into_file.rb +109 -0
- data/lib/skylight/vendor/cli/thor/base.rb +652 -0
- data/lib/skylight/vendor/cli/thor/command.rb +136 -0
- data/lib/skylight/vendor/cli/thor/core_ext/hash_with_indifferent_access.rb +80 -0
- data/lib/skylight/vendor/cli/thor/core_ext/io_binary_read.rb +12 -0
- data/lib/skylight/vendor/cli/thor/core_ext/ordered_hash.rb +100 -0
- data/lib/skylight/vendor/cli/thor/error.rb +28 -0
- data/lib/skylight/vendor/cli/thor/group.rb +282 -0
- data/lib/skylight/vendor/cli/thor/invocation.rb +172 -0
- data/lib/skylight/vendor/cli/thor/parser.rb +4 -0
- data/lib/skylight/vendor/cli/thor/parser/argument.rb +74 -0
- data/lib/skylight/vendor/cli/thor/parser/arguments.rb +171 -0
- data/lib/skylight/vendor/cli/thor/parser/option.rb +121 -0
- data/lib/skylight/vendor/cli/thor/parser/options.rb +218 -0
- data/lib/skylight/vendor/cli/thor/rake_compat.rb +72 -0
- data/lib/skylight/vendor/cli/thor/runner.rb +322 -0
- data/lib/skylight/vendor/cli/thor/shell.rb +88 -0
- data/lib/skylight/vendor/cli/thor/shell/basic.rb +393 -0
- data/lib/skylight/vendor/cli/thor/shell/color.rb +148 -0
- data/lib/skylight/vendor/cli/thor/shell/html.rb +127 -0
- data/lib/skylight/vendor/cli/thor/util.rb +270 -0
- data/lib/skylight/vendor/cli/thor/version.rb +3 -0
- data/lib/skylight/vendor/thread_safe.rb +126 -0
- data/lib/skylight/vendor/thread_safe/non_concurrent_cache_backend.rb +133 -0
- data/lib/skylight/vendor/thread_safe/synchronized_cache_backend.rb +76 -0
- data/lib/skylight/version.rb +4 -0
- data/lib/skylight/vm/gc.rb +70 -0
- data/lib/sql_lexer.rb +6 -0
- data/lib/sql_lexer/lexer.rb +579 -0
- data/lib/sql_lexer/string_scanner.rb +11 -0
- data/lib/sql_lexer/version.rb +3 -0
- metadata +179 -0
@@ -0,0 +1,79 @@
|
|
1
|
+
require "sql_lexer"
|
2
|
+
require "json"
|
3
|
+
|
4
|
+
module Skylight
|
5
|
+
module Normalizers
|
6
|
+
module ActiveRecord
|
7
|
+
class SQL < Normalizer
|
8
|
+
register "sql.active_record"
|
9
|
+
register "sql.sequel"
|
10
|
+
register "sql.data_mapper"
|
11
|
+
|
12
|
+
CAT = "db.sql.query".freeze
|
13
|
+
|
14
|
+
def normalize(trace, name, payload)
|
15
|
+
case payload[:name]
|
16
|
+
when "SCHEMA", "CACHE"
|
17
|
+
return :skip
|
18
|
+
else
|
19
|
+
name = CAT
|
20
|
+
title = payload[:name] || "SQL"
|
21
|
+
end
|
22
|
+
|
23
|
+
binds = payload[:binds]
|
24
|
+
|
25
|
+
if binds && !binds.empty?
|
26
|
+
binds = binds.map { |col, val| val.inspect }
|
27
|
+
end
|
28
|
+
|
29
|
+
extracted_title, sql, binds, _ = extract_binds(payload, binds)
|
30
|
+
title = extracted_title if extracted_title
|
31
|
+
|
32
|
+
if sql
|
33
|
+
annotations = {
|
34
|
+
sql: sql,
|
35
|
+
binds: binds,
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
[ name, title, sql, annotations ]
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def extract_binds(payload, precalculated)
|
44
|
+
title, sql, binds = SqlLexer::Lexer.bindify(payload[:sql], precalculated, true)
|
45
|
+
[ title, sql, binds, nil ]
|
46
|
+
rescue => e
|
47
|
+
group = "sql_parse"
|
48
|
+
description = e.inspect
|
49
|
+
details = encode(backtrace: e.backtrace,
|
50
|
+
original_exception: {
|
51
|
+
class_name: e.class.name,
|
52
|
+
message: e.message
|
53
|
+
},
|
54
|
+
payload: payload,
|
55
|
+
precalculated: precalculated)
|
56
|
+
|
57
|
+
error = [group, description, details]
|
58
|
+
[ nil, nil, nil, error ]
|
59
|
+
end
|
60
|
+
|
61
|
+
# While operating in place would save memory, some of these passed in items are re-used elsewhere
|
62
|
+
# and, as such, should not be modified.
|
63
|
+
def encode(body)
|
64
|
+
if body.is_a?(Hash)
|
65
|
+
hash = {}
|
66
|
+
body.each{|k,v| hash[k] = encode(v) }
|
67
|
+
hash
|
68
|
+
elsif body.is_a?(Array)
|
69
|
+
body.map{|v| encode(v) }
|
70
|
+
elsif body.respond_to?(:encoding) && (body.encoding == Encoding::BINARY || !body.valid_encoding?)
|
71
|
+
Base64.encode64(body)
|
72
|
+
else
|
73
|
+
body
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Normalizers
|
3
|
+
module ActiveSupport
|
4
|
+
# NOTE: Instrumentation may not be turned on by default and is possibly buggy
|
5
|
+
# https://github.com/mperham/dalli/pull/284
|
6
|
+
class Cache < Normalizer
|
7
|
+
%w(clear
|
8
|
+
decrement
|
9
|
+
delete
|
10
|
+
exist
|
11
|
+
fetch_hit
|
12
|
+
generate
|
13
|
+
increment
|
14
|
+
read
|
15
|
+
read_multi
|
16
|
+
write).each do |type|
|
17
|
+
require "skylight/normalizers/active_support/cache_#{type}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# See https://github.com/rails/rails/pull/15943
|
25
|
+
if defined?(ActiveSupport::Cache::Store.instrument)
|
26
|
+
deprecated = false
|
27
|
+
|
28
|
+
# If it's deprecated, setting to false will cause a deprecation warning
|
29
|
+
# and the value will remain true
|
30
|
+
ActiveSupport::Deprecation.silence do
|
31
|
+
ActiveSupport::Cache::Store.instrument = false
|
32
|
+
deprecated = ActiveSupport::Cache::Store.instrument
|
33
|
+
end
|
34
|
+
|
35
|
+
unless deprecated
|
36
|
+
class ActiveSupport::Cache::Store
|
37
|
+
def self.instrument
|
38
|
+
true
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.instrument=(val)
|
42
|
+
unless val
|
43
|
+
Rails.logger.warn "[WARNING] Skylight has patched ActiveSupport::Cache::Store.instrument to always be true. " \
|
44
|
+
"In future versions of Rails, this method will no longer be settable. " \
|
45
|
+
"See https://github.com/rails/rails/pull/15943 for more information."
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Normalizers
|
3
|
+
module ActiveSupport
|
4
|
+
class CacheClear < Cache
|
5
|
+
register "cache_clear.active_support"
|
6
|
+
|
7
|
+
CAT = "app.cache.clear".freeze
|
8
|
+
TITLE = "cache clear".freeze
|
9
|
+
|
10
|
+
def normalize(trace, name, payload)
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Normalizers
|
3
|
+
module ActiveSupport
|
4
|
+
class CacheDecrement < Cache
|
5
|
+
register "cache_decrement.active_support"
|
6
|
+
|
7
|
+
CAT = "app.cache.decrement".freeze
|
8
|
+
TITLE = "cache decrement"
|
9
|
+
|
10
|
+
def normalize(trace, name, payload)
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Normalizers
|
3
|
+
module ActiveSupport
|
4
|
+
class CacheDelete < Cache
|
5
|
+
register "cache_delete.active_support"
|
6
|
+
|
7
|
+
CAT = "app.cache.delete".freeze
|
8
|
+
TITLE = "cache delete"
|
9
|
+
|
10
|
+
def normalize(trace, name, payload)
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Normalizers
|
3
|
+
module ActiveSupport
|
4
|
+
class CacheExist < Cache
|
5
|
+
register "cache_exist?.active_support"
|
6
|
+
|
7
|
+
CAT = "app.cache.exist".freeze
|
8
|
+
TITLE = "cache exist?"
|
9
|
+
|
10
|
+
def normalize(trace, name, payload)
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Normalizers
|
3
|
+
module ActiveSupport
|
4
|
+
class CacheFetchHit < Cache
|
5
|
+
register "cache_fetch_hit.active_support"
|
6
|
+
|
7
|
+
CAT = "app.cache.fetch_hit".freeze
|
8
|
+
TITLE = "cache fetch hit"
|
9
|
+
|
10
|
+
def normalize(trace, name, payload)
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Normalizers
|
3
|
+
module ActiveSupport
|
4
|
+
class CacheGenerate < Cache
|
5
|
+
register "cache_generate.active_support"
|
6
|
+
|
7
|
+
CAT = "app.cache.generate".freeze
|
8
|
+
TITLE = "cache generate"
|
9
|
+
|
10
|
+
def normalize(trace, name, payload)
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Normalizers
|
3
|
+
module ActiveSupport
|
4
|
+
class CacheIncrement < Cache
|
5
|
+
register "cache_increment.active_support"
|
6
|
+
|
7
|
+
CAT = "app.cache.increment".freeze
|
8
|
+
TITLE = "cache increment"
|
9
|
+
|
10
|
+
def normalize(trace, name, payload)
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Normalizers
|
3
|
+
module ActiveSupport
|
4
|
+
class CacheRead < Cache
|
5
|
+
register "cache_read.active_support"
|
6
|
+
|
7
|
+
CAT = "app.cache.read".freeze
|
8
|
+
TITLE = "cache read"
|
9
|
+
|
10
|
+
def normalize(trace, name, payload)
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Normalizers
|
3
|
+
module ActiveSupport
|
4
|
+
class CacheReadMulti < Cache
|
5
|
+
register "cache_read_multi.active_support"
|
6
|
+
|
7
|
+
CAT = "app.cache.read_multi".freeze
|
8
|
+
TITLE = "cache read multi"
|
9
|
+
|
10
|
+
def normalize(trace, name, payload)
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Normalizers
|
3
|
+
module ActiveSupport
|
4
|
+
class CacheWrite < Cache
|
5
|
+
register "cache_write.active_support"
|
6
|
+
|
7
|
+
CAT = "app.cache.write".freeze
|
8
|
+
TITLE = "cache write"
|
9
|
+
|
10
|
+
def normalize(trace, name, payload)
|
11
|
+
[ CAT, TITLE, nil, payload ]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Normalizers
|
3
|
+
class Default
|
4
|
+
|
5
|
+
def normalize(trace, name, payload)
|
6
|
+
if name =~ TIER_REGEX
|
7
|
+
annot = payload.dup
|
8
|
+
[
|
9
|
+
name,
|
10
|
+
annot.delete(:title),
|
11
|
+
annot.delete(:description),
|
12
|
+
annot
|
13
|
+
]
|
14
|
+
else
|
15
|
+
:skip
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
module Skylight
|
2
|
+
module Normalizers
|
3
|
+
module Moped
|
4
|
+
class Query < Normalizer
|
5
|
+
register "query.moped"
|
6
|
+
|
7
|
+
CAT = "db.mongo.query".freeze
|
8
|
+
|
9
|
+
def normalize(trace, name, payload)
|
10
|
+
# payload: { prefix: " MOPED: #{address.resolved}", ops: operations }
|
11
|
+
|
12
|
+
# We can sometimes have multiple operations. However, it seems like this only happens when doing things
|
13
|
+
# like an insert, followed by a get last error, so we can probably ignore all but the first.
|
14
|
+
operation = payload[:ops] ? payload[:ops].first : nil
|
15
|
+
type = operation && operation.class.to_s =~ /^Moped::Protocol::(.+)$/ ? $1 : nil
|
16
|
+
|
17
|
+
case type
|
18
|
+
when "Query" then normalize_query(operation)
|
19
|
+
when "GetMore" then normalize_get_more(operation)
|
20
|
+
when "Insert" then normalize_insert(operation)
|
21
|
+
when "Update" then normalize_update(operation)
|
22
|
+
when "Delete" then normalize_delete(operation)
|
23
|
+
else :skip
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def normalize_query(operation)
|
30
|
+
title = normalize_title("QUERY", operation)
|
31
|
+
|
32
|
+
hash, binds = extract_binds(operation.selector)
|
33
|
+
description = hash.to_json
|
34
|
+
|
35
|
+
annotations = build_annotations(operation)
|
36
|
+
annotations[:skip] = operation.skip
|
37
|
+
if operation.fields
|
38
|
+
annotations[:fields] = operation.fields.select{|k,v| v == 1 }.keys.map(&:to_s)
|
39
|
+
end
|
40
|
+
annotations[:binds] = binds unless binds.empty?
|
41
|
+
|
42
|
+
[CAT, title, description, annotations]
|
43
|
+
end
|
44
|
+
|
45
|
+
def normalize_get_more(operation)
|
46
|
+
title = normalize_title("GET_MORE", operation)
|
47
|
+
|
48
|
+
annotations = build_annotations(operation)
|
49
|
+
annotations[:limit] = operation.limit
|
50
|
+
|
51
|
+
[CAT, title, nil, annotations]
|
52
|
+
end
|
53
|
+
|
54
|
+
def normalize_insert(operation)
|
55
|
+
title = normalize_title("INSERT", operation)
|
56
|
+
|
57
|
+
annotations = build_annotations(operation)
|
58
|
+
annotations[:count] = operation.documents.count
|
59
|
+
|
60
|
+
[CAT, title, nil, annotations]
|
61
|
+
end
|
62
|
+
|
63
|
+
def normalize_update(operation)
|
64
|
+
title = normalize_title("UPDATE", operation)
|
65
|
+
|
66
|
+
selector_hash, selector_binds = extract_binds(operation.selector)
|
67
|
+
update_hash, update_binds = extract_binds(operation.update)
|
68
|
+
|
69
|
+
description = { selector: selector_hash, update: update_hash }.to_json
|
70
|
+
|
71
|
+
annotations = build_annotations(operation)
|
72
|
+
|
73
|
+
binds = {}
|
74
|
+
binds[:selector] = selector_binds unless selector_binds.empty?
|
75
|
+
binds[:update] = update_binds unless update_binds.empty?
|
76
|
+
annotations[:binds] = binds unless binds.empty?
|
77
|
+
|
78
|
+
[CAT, title, description, annotations]
|
79
|
+
end
|
80
|
+
|
81
|
+
def normalize_delete(operation)
|
82
|
+
title = normalize_title("DELETE", operation)
|
83
|
+
|
84
|
+
hash, binds = extract_binds(operation.selector)
|
85
|
+
description = hash.to_json
|
86
|
+
|
87
|
+
annotations = build_annotations(operation)
|
88
|
+
annotations[:binds] = binds unless binds.empty?
|
89
|
+
|
90
|
+
[CAT, title, description, annotations]
|
91
|
+
end
|
92
|
+
|
93
|
+
def normalize_title(type, operation)
|
94
|
+
"#{type} #{operation.collection}"
|
95
|
+
end
|
96
|
+
|
97
|
+
def build_annotations(operation)
|
98
|
+
annotations = {}
|
99
|
+
|
100
|
+
if operation.respond_to?(:flags)
|
101
|
+
flags = operation.flags.map{|f| flag_name(f) }
|
102
|
+
annotations[:flags] = flags unless flags.empty?
|
103
|
+
end
|
104
|
+
|
105
|
+
annotations
|
106
|
+
end
|
107
|
+
|
108
|
+
# Some flags used by Moped don't map directly to the Mongo docs
|
109
|
+
# See http://docs.mongodb.org/meta-driver/latest/legacy/mongodb-wire-protocol/
|
110
|
+
FLAG_MAP = {
|
111
|
+
tailable: "TailableCursor",
|
112
|
+
multi: "MultiUpdate"
|
113
|
+
}
|
114
|
+
|
115
|
+
def flag_name(flag)
|
116
|
+
FLAG_MAP[flag] || flag.to_s.sub(/^[a-z\d]*/) { $&.capitalize }.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }
|
117
|
+
end
|
118
|
+
|
119
|
+
def extract_binds(hash, binds=[])
|
120
|
+
ret = {}
|
121
|
+
|
122
|
+
hash.each do |k,v|
|
123
|
+
if v.is_a?(Hash)
|
124
|
+
ret[k] = extract_binds(v, binds)[0]
|
125
|
+
else
|
126
|
+
binds << stringify(hash[k])
|
127
|
+
ret[k] = '?'
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
[ret, binds]
|
132
|
+
end
|
133
|
+
|
134
|
+
def stringify(value)
|
135
|
+
value.is_a?(Regexp) ? value.inspect : value.to_s
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|