appmap 0.90.1 → 0.92.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -0
- data/lib/appmap/agent.rb +5 -0
- data/lib/appmap/cucumber.rb +4 -2
- data/lib/appmap/detect_enabled.rb +111 -0
- data/lib/appmap/middleware/remote_recording.rb +6 -4
- data/lib/appmap/minitest.rb +4 -2
- data/lib/appmap/railtie.rb +6 -1
- data/lib/appmap/record.rb +2 -1
- data/lib/appmap/recording_methods.rb +3 -0
- data/lib/appmap/rspec.rb +4 -5
- data/lib/appmap/service/test_command_provider.rb +4 -4
- data/lib/appmap/version.rb +2 -2
- data/lib/appmap.rb +2 -2
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 78d8c3cf7967b06242390e3d11ddd24c5cf29fd70244b93b2bf170323747b762
|
4
|
+
data.tar.gz: 10147c54915b55d8a67723d1721c31a9e809983bb9b0012cdb2f480e9dcf3695
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ce433191ab8e3699feeb995951df0653ef9b89bb11edc7ca671b80011a2af1818e08c22eaa4f0777ec364be9e6e9d8bfec84099ff518d43768fb710e005b681
|
7
|
+
data.tar.gz: f0c99190697605e71658d9c3c602913954604396c7fb3cc31db09edb1b4cb8bdd1fb4f184e762ff15458b64e5078cd69ac04c324eddd0b4d83e28e3c2b324bb0
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
# [0.92.0](https://github.com/applandinc/appmap-ruby/compare/v0.91.0...v0.92.0) (2022-09-19)
|
2
|
+
|
3
|
+
|
4
|
+
### Bug Fixes
|
5
|
+
|
6
|
+
* Detect Rails via Rails::Railtie ([cf83f00](https://github.com/applandinc/appmap-ruby/commit/cf83f005e0a85d016f864c0ad2f1dfa1af2fe6b9))
|
7
|
+
|
8
|
+
|
9
|
+
### Features
|
10
|
+
|
11
|
+
* Don't auto-enable requests recording in 'test' ([30413cd](https://github.com/applandinc/appmap-ruby/commit/30413cdc23b3851e8e1272d30063e463b4b23aba))
|
12
|
+
* Enable recording for known environments ([6c59c8a](https://github.com/applandinc/appmap-ruby/commit/6c59c8a5a0b61c19cec185d7406b148846ac5c24))
|
13
|
+
* Use APPMAP=true to flag library loading ([9900631](https://github.com/applandinc/appmap-ruby/commit/9900631c07165a877704b7d7fd73857ccf9e32b3))
|
14
|
+
|
15
|
+
# [0.91.0](https://github.com/applandinc/appmap-ruby/compare/v0.90.1...v0.91.0) (2022-09-19)
|
16
|
+
|
17
|
+
|
18
|
+
### Features
|
19
|
+
|
20
|
+
* Emit metadata.recorder.type ([6358669](https://github.com/applandinc/appmap-ruby/commit/6358669d5dc5123a613b18301519dac709614406))
|
21
|
+
|
1
22
|
## [0.90.1](https://github.com/applandinc/appmap-ruby/compare/v0.90.0...v0.90.1) (2022-09-19)
|
2
23
|
|
3
24
|
|
data/lib/appmap/agent.rb
CHANGED
@@ -9,6 +9,7 @@ require_relative 'open'
|
|
9
9
|
|
10
10
|
# load extension
|
11
11
|
require_relative 'appmap'
|
12
|
+
require_relative './detect_enabled'
|
12
13
|
|
13
14
|
module AppMap
|
14
15
|
class << self
|
@@ -114,5 +115,9 @@ module AppMap
|
|
114
115
|
def explain_queries?
|
115
116
|
ENV['APPMAP_EXPLAIN_QUERIES'] == 'true'
|
116
117
|
end
|
118
|
+
|
119
|
+
def recording_enabled?(recording_method = nil)
|
120
|
+
DetectEnabled.new(recording_method).enabled?
|
121
|
+
end
|
117
122
|
end
|
118
123
|
end
|
data/lib/appmap/cucumber.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'appmap'
|
3
4
|
require 'appmap/util'
|
4
5
|
require 'fileutils'
|
5
6
|
|
@@ -55,7 +56,7 @@ module AppMap
|
|
55
56
|
end
|
56
57
|
|
57
58
|
def enabled?
|
58
|
-
|
59
|
+
AppMap.recording_enabled?(:cucumber)
|
59
60
|
end
|
60
61
|
|
61
62
|
def run
|
@@ -92,7 +93,8 @@ module AppMap
|
|
92
93
|
'version' => Gem.loaded_specs['cucumber']&.version&.to_s
|
93
94
|
}
|
94
95
|
m['recorder'] = {
|
95
|
-
'name' => 'cucumber'
|
96
|
+
'name' => 'cucumber',
|
97
|
+
'type' => 'tests'
|
96
98
|
}
|
97
99
|
end
|
98
100
|
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require_relative './recording_methods'
|
2
|
+
|
3
|
+
module AppMap
|
4
|
+
# Detects whether AppMap recording should be enabled. This test can be performed generally, or for
|
5
|
+
# a particular recording method. Recording can be enabled explicitly, for example via APPMAP=true,
|
6
|
+
# or it can be enabled implicitly, by running in a dev or test web application environment. Recording
|
7
|
+
# can also disabled explicitly, using environment variables.
|
8
|
+
class DetectEnabled
|
9
|
+
@@detected_for_method = {}
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def clear_cache
|
13
|
+
@@detected_for_method = {}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(recording_method)
|
18
|
+
@recording_method = recording_method
|
19
|
+
end
|
20
|
+
|
21
|
+
def enabled?
|
22
|
+
unless @@detected_for_method[@recording_method].nil?
|
23
|
+
return @@detected_for_method[@recording_method]
|
24
|
+
end
|
25
|
+
|
26
|
+
raise "Unrecognized recording method: #{@recording_method}" if @recording_method && !AppMap::RECORDING_METHODS.member?(@recording_method)
|
27
|
+
|
28
|
+
message, enabled, enabled_by_env = detect_enabled
|
29
|
+
|
30
|
+
@@detected_for_method[@recording_method] = enabled
|
31
|
+
|
32
|
+
if @recording_method
|
33
|
+
if enabled && enabled_by_app_env?
|
34
|
+
warn AppMap::Util.color("AppMap #{@recording_method.nil? ? '' : "#{@recording_method} "}recording is enabled because #{message}", :magenta)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
enabled
|
39
|
+
end
|
40
|
+
|
41
|
+
def detect_enabled
|
42
|
+
detection_functions = %i[globally_disabled? recording_method_disabled? enabled_by_app_env? recording_method_enabled? globally_enabled?]
|
43
|
+
|
44
|
+
message, enabled = []
|
45
|
+
while enabled.nil? && !detection_functions.empty?
|
46
|
+
message, enabled = method(detection_functions.shift).call
|
47
|
+
end
|
48
|
+
|
49
|
+
unless enabled.nil?
|
50
|
+
_, enabled_by_env = enabled_by_app_env?
|
51
|
+
return [ message, enabled, enabled_by_env ]
|
52
|
+
else
|
53
|
+
return [ 'it is not enabled by any configuration or framework', false, false ]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def enabled_by_app_env?
|
58
|
+
env_name, app_env = detect_app_env
|
59
|
+
if %i[rspec minitest cucumber].member?(@recording_method)
|
60
|
+
return [ "#{env_name} is '#{app_env}'", true ] if app_env == 'test'
|
61
|
+
end
|
62
|
+
|
63
|
+
if @recording_method.nil?
|
64
|
+
return [ "#{env_name} is '#{app_env}'", true ] if %w[test development].member?(app_env)
|
65
|
+
end
|
66
|
+
|
67
|
+
if %i[remote requests].member?(@recording_method)
|
68
|
+
return [ "#{env_name} is '#{app_env}'", true ] if app_env == 'development'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def detect_app_env
|
73
|
+
if rails_env
|
74
|
+
return [ 'RAILS_ENV', rails_env ]
|
75
|
+
elsif ENV['APP_ENV']
|
76
|
+
return [ 'APP_ENV', ENV['APP_ENV']]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def globally_enabled?
|
81
|
+
# Don't auto-enable request recording in the 'test' environment, because users probably don't want
|
82
|
+
# AppMaps of both test cases and requests. Requests recording can always be enabled by APPMAP_RECORD_REQUESTS=true.
|
83
|
+
requests_recording_in_test = -> () { [ :requests ].member?(@recording_method) && detect_app_env == 'test' }
|
84
|
+
[ 'APPMAP=true', true ] if ENV['APPMAP'] == 'true' && !requests_recording_in_test.()
|
85
|
+
end
|
86
|
+
|
87
|
+
def globally_disabled?
|
88
|
+
[ 'APPMAP=false', false ] if ENV['APPMAP'] == 'false'
|
89
|
+
end
|
90
|
+
|
91
|
+
def recording_method_disabled?
|
92
|
+
return false unless @recording_method
|
93
|
+
|
94
|
+
env_var = [ 'APPMAP', 'RECORD', @recording_method.upcase ].join('_')
|
95
|
+
[ "#{[ 'APPMAP', 'RECORD', @recording_method.upcase ].join('_')}=false", false ] if ENV[env_var] == 'false'
|
96
|
+
end
|
97
|
+
|
98
|
+
def recording_method_enabled?
|
99
|
+
return false unless @recording_method
|
100
|
+
|
101
|
+
env_var = [ 'APPMAP', 'RECORD', @recording_method.upcase ].join('_')
|
102
|
+
[ "#{[ 'APPMAP', 'RECORD', @recording_method.upcase ].join('_')}=true", true ] if ENV[env_var] == 'true'
|
103
|
+
end
|
104
|
+
|
105
|
+
def rails_env
|
106
|
+
return Rails.env if defined?(::Rails::Railtie)
|
107
|
+
|
108
|
+
return ENV['RAILS_ENV']
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -63,7 +63,8 @@ module AppMap
|
|
63
63
|
|
64
64
|
metadata = AppMap.detect_metadata
|
65
65
|
metadata[:recorder] = {
|
66
|
-
name: 'remote_recording'
|
66
|
+
name: 'remote_recording',
|
67
|
+
type: 'remote'
|
67
68
|
}
|
68
69
|
|
69
70
|
response = JSON.generate \
|
@@ -81,7 +82,7 @@ module AppMap
|
|
81
82
|
# 0
|
82
83
|
|
83
84
|
req = Rack::Request.new(env)
|
84
|
-
return handle_record_request(req) if req.path == '/_appmap/record'
|
85
|
+
return handle_record_request(req) if AppMap.recording_enabled?(:remote) && req.path == '/_appmap/record'
|
85
86
|
|
86
87
|
start_time = Time.now
|
87
88
|
# Support multi-threaded web server such as Puma by recording each thread
|
@@ -103,7 +104,8 @@ module AppMap
|
|
103
104
|
metadata[:name] = appmap_name
|
104
105
|
metadata[:timestamp] = start_time.to_f
|
105
106
|
metadata[:recorder] = {
|
106
|
-
name: '
|
107
|
+
name: 'rack',
|
108
|
+
type: 'requests'
|
107
109
|
}
|
108
110
|
|
109
111
|
appmap = {
|
@@ -148,7 +150,7 @@ module AppMap
|
|
148
150
|
end
|
149
151
|
|
150
152
|
def record_all_requests?
|
151
|
-
|
153
|
+
AppMap.recording_enabled?(:requests)
|
152
154
|
end
|
153
155
|
|
154
156
|
def recording?
|
data/lib/appmap/minitest.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'appmap'
|
3
4
|
require 'appmap/util'
|
4
5
|
require 'fileutils'
|
5
6
|
require 'active_support'
|
@@ -101,7 +102,8 @@ module AppMap
|
|
101
102
|
version: Gem.loaded_specs['minitest']&.version&.to_s
|
102
103
|
}
|
103
104
|
m[:recorder] = {
|
104
|
-
name: 'minitest'
|
105
|
+
name: 'minitest',
|
106
|
+
type: 'tests'
|
105
107
|
}
|
106
108
|
m[:test_status] = test_status
|
107
109
|
if exception
|
@@ -124,7 +126,7 @@ module AppMap
|
|
124
126
|
end
|
125
127
|
|
126
128
|
def enabled?
|
127
|
-
|
129
|
+
AppMap.recording_enabled?(:minitest)
|
128
130
|
end
|
129
131
|
|
130
132
|
def run
|
data/lib/appmap/railtie.rb
CHANGED
@@ -4,6 +4,11 @@ module AppMap
|
|
4
4
|
# Railtie connects the AppMap recorder to Rails-specific features.
|
5
5
|
class Railtie < ::Rails::Railtie
|
6
6
|
initializer 'appmap.remote_recording' do
|
7
|
+
# Indicate early in the log when these methods are enabled.
|
8
|
+
%i[remote requests].each do |recording_method|
|
9
|
+
AppMap.recording_enabled?(recording_method)
|
10
|
+
end
|
11
|
+
|
7
12
|
require 'appmap/middleware/remote_recording'
|
8
13
|
Rails.application.config.middleware.insert_before \
|
9
14
|
ActionDispatch::Executor,
|
@@ -29,4 +34,4 @@ module AppMap
|
|
29
34
|
end
|
30
35
|
end
|
31
36
|
end
|
32
|
-
end if
|
37
|
+
end if AppMap.recording_enabled?
|
data/lib/appmap/record.rb
CHANGED
data/lib/appmap/rspec.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'appmap'
|
3
4
|
require 'appmap/util'
|
4
5
|
require 'set'
|
5
6
|
require 'fileutils'
|
6
7
|
|
7
8
|
module AppMap
|
8
|
-
# Integration of AppMap with RSpec. When enabled with APPMAP=true, the AppMap tracer will
|
9
|
-
# be activated around each scenario which has the metadata key `:appmap`.
|
10
9
|
module RSpec
|
11
10
|
APPMAP_OUTPUT_DIR = 'tmp/appmap/rspec'
|
12
11
|
LOG = false
|
@@ -192,7 +191,8 @@ module AppMap
|
|
192
191
|
version: Gem.loaded_specs['rspec-core']&.version&.to_s
|
193
192
|
}
|
194
193
|
m[:recorder] = {
|
195
|
-
name: 'rspec'
|
194
|
+
name: 'rspec',
|
195
|
+
type: 'tests'
|
196
196
|
}
|
197
197
|
m[:test_status] = test_status
|
198
198
|
if exception
|
@@ -215,7 +215,7 @@ module AppMap
|
|
215
215
|
end
|
216
216
|
|
217
217
|
def enabled?
|
218
|
-
|
218
|
+
AppMap.recording_enabled?(:rspec)
|
219
219
|
end
|
220
220
|
|
221
221
|
def run
|
@@ -226,7 +226,6 @@ module AppMap
|
|
226
226
|
end
|
227
227
|
|
228
228
|
if AppMap::RSpec.enabled?
|
229
|
-
require 'appmap'
|
230
229
|
require 'active_support/inflector/transliterate'
|
231
230
|
require 'rspec/core'
|
232
231
|
require 'rspec/core/example'
|
@@ -16,7 +16,7 @@ module AppMap
|
|
16
16
|
command: {
|
17
17
|
program: 'bundle',
|
18
18
|
args: %w[exec rspec] + integration_test_paths[:rspec].map { |path| "./#{path}" },
|
19
|
-
environment: {
|
19
|
+
environment: { }
|
20
20
|
}
|
21
21
|
}
|
22
22
|
end
|
@@ -30,7 +30,7 @@ module AppMap
|
|
30
30
|
command: {
|
31
31
|
program: 'bundle',
|
32
32
|
args: %w[exec cucumber],
|
33
|
-
environment: {
|
33
|
+
environment: { }
|
34
34
|
}
|
35
35
|
}
|
36
36
|
end
|
@@ -48,7 +48,7 @@ module AppMap
|
|
48
48
|
command: {
|
49
49
|
program: 'bundle',
|
50
50
|
args: %w[exec rails test] + integration_test_paths[:minitest].map { |path| "./#{path}" },
|
51
|
-
environment: {
|
51
|
+
environment: { }
|
52
52
|
}
|
53
53
|
}
|
54
54
|
]
|
@@ -59,7 +59,7 @@ module AppMap
|
|
59
59
|
command: {
|
60
60
|
program: 'bundle',
|
61
61
|
args: ['exec', 'ruby', "./#{path}"],
|
62
|
-
environment: {
|
62
|
+
environment: { }
|
63
63
|
}
|
64
64
|
}
|
65
65
|
end
|
data/lib/appmap/version.rb
CHANGED
data/lib/appmap.rb
CHANGED
@@ -57,7 +57,7 @@ lambda do
|
|
57
57
|
end
|
58
58
|
end.enable
|
59
59
|
|
60
|
-
if defined?(::Rails)
|
60
|
+
if defined?(::Rails::Railtie)
|
61
61
|
require 'appmap/railtie'
|
62
62
|
end
|
63
63
|
|
@@ -76,4 +76,4 @@ lambda do
|
|
76
76
|
|
77
77
|
end.call unless ENV['APPMAP_AUTOREQUIRE'] == 'false'
|
78
78
|
|
79
|
-
AppMap.initialize_configuration if
|
79
|
+
AppMap.initialize_configuration if AppMap.recording_enabled? && ENV['APPMAP_INITIALIZE'] != 'false'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appmap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.92.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Gilpin
|
@@ -378,6 +378,7 @@ files:
|
|
378
378
|
- lib/appmap/depends/test_file_inspector.rb
|
379
379
|
- lib/appmap/depends/test_runner.rb
|
380
380
|
- lib/appmap/depends/util.rb
|
381
|
+
- lib/appmap/detect_enabled.rb
|
381
382
|
- lib/appmap/event.rb
|
382
383
|
- lib/appmap/gem_hooks/actionpack.yml
|
383
384
|
- lib/appmap/gem_hooks/actionview.yml
|
@@ -415,6 +416,7 @@ files:
|
|
415
416
|
- lib/appmap/open.rb
|
416
417
|
- lib/appmap/railtie.rb
|
417
418
|
- lib/appmap/record.rb
|
419
|
+
- lib/appmap/recording_methods.rb
|
418
420
|
- lib/appmap/rspec.rb
|
419
421
|
- lib/appmap/service/config_analyzer.rb
|
420
422
|
- lib/appmap/service/guesser.rb
|