appmap 0.57.0 → 0.59.2
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/CHANGELOG.md +35 -0
- data/config-schema.yml +57 -0
- data/lib/appmap/command/agent_setup/status.rb +14 -11
- data/lib/appmap/event.rb +9 -1
- data/lib/appmap/handler/rails/template.rb +9 -4
- data/lib/appmap/service/integration_test_path_finder.rb +44 -0
- data/lib/appmap/service/test_command_provider.rb +77 -0
- data/lib/appmap/service/test_framework_detector.rb +21 -0
- data/lib/appmap/trace.rb +2 -2
- data/lib/appmap/util.rb +9 -0
- data/lib/appmap/version.rb +1 -1
- data/spec/fixtures/rails6_users_app/test/controllers/functional_calc_test.rb +10 -0
- data/spec/fixtures/rails6_users_app/test/integration/integration_calc_test.rb +12 -0
- data/test/agent_setup_status_test.rb +67 -13
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93b0a392f69c9de659a086819d29b2b4c94c4b704d04ac2d57f99cafe56f4f80
|
4
|
+
data.tar.gz: 4f42ab168f8bb4f1c8500f6f98682d7c048119125ba34aa0ddd80f9a521c7d02
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95538abb1fc5ba05793bba2efc1731a823c324515956aa7b388b04d8b43953f3885d45ca1937d684c0b6e2415fc7fb6d1f591da02ffa0dbc06883c7298d3eb0b
|
7
|
+
data.tar.gz: 48d7105b1ced68d2ddd9229b2811b0d157ca60b879b8d781e014cf02ca512147c33a95b4a52e49216e5fbf47b3fc7fafa19fa25d00a57506872ab1a3ef71651f
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,38 @@
|
|
1
|
+
## [0.59.2](https://github.com/applandinc/appmap-ruby/compare/v0.59.1...v0.59.2) (2021-07-08)
|
2
|
+
|
3
|
+
|
4
|
+
### Bug Fixes
|
5
|
+
|
6
|
+
* Remove improper reliance on Rails 'try' ([c6b5b16](https://github.com/applandinc/appmap-ruby/commit/c6b5b16a6963988e20bab5f88b99401e25691f3c))
|
7
|
+
|
8
|
+
## [0.59.1](https://github.com/applandinc/appmap-ruby/compare/v0.59.0...v0.59.1) (2021-07-08)
|
9
|
+
|
10
|
+
|
11
|
+
### Bug Fixes
|
12
|
+
|
13
|
+
* Events may be constructed in stages ([b0b23f5](https://github.com/applandinc/appmap-ruby/commit/b0b23f59a84158b8162424b84430894fe4278324))
|
14
|
+
|
15
|
+
# [0.59.0](https://github.com/applandinc/appmap-ruby/compare/v0.58.0...v0.59.0) (2021-07-07)
|
16
|
+
|
17
|
+
|
18
|
+
### Features
|
19
|
+
|
20
|
+
* define commands as objects ([1b43203](https://github.com/applandinc/appmap-ruby/commit/1b432039040277e1b5349cc2f75aa436238ea873))
|
21
|
+
|
22
|
+
# [0.58.0](https://github.com/applandinc/appmap-ruby/compare/v0.57.1...v0.58.0) (2021-07-06)
|
23
|
+
|
24
|
+
|
25
|
+
### Features
|
26
|
+
|
27
|
+
* Add `test_commands` sections to `appmap-agent-status` executable ([4cd8fe5](https://github.com/applandinc/appmap-ruby/commit/4cd8fe58acb4af72b7818db96de9e479562b9ea0))
|
28
|
+
|
29
|
+
## [0.57.1](https://github.com/applandinc/appmap-ruby/compare/v0.57.0...v0.57.1) (2021-07-02)
|
30
|
+
|
31
|
+
|
32
|
+
### Bug Fixes
|
33
|
+
|
34
|
+
* rename agentVersionPorject to agentVersion ([905fc5d](https://github.com/applandinc/appmap-ruby/commit/905fc5dd643411deb94f8a1087bcdb3a562d218a))
|
35
|
+
|
1
36
|
# [0.57.0](https://github.com/applandinc/appmap-ruby/compare/v0.56.0...v0.57.0) (2021-06-29)
|
2
37
|
|
3
38
|
|
data/config-schema.yml
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
type: object
|
2
|
+
additionalProperties: false
|
3
|
+
required:
|
4
|
+
- name
|
5
|
+
properties:
|
6
|
+
name:
|
7
|
+
type: string
|
8
|
+
packages:
|
9
|
+
type: array
|
10
|
+
items:
|
11
|
+
anyOf:
|
12
|
+
- type: object
|
13
|
+
additionalProperties: false
|
14
|
+
required:
|
15
|
+
- path
|
16
|
+
properties:
|
17
|
+
path:
|
18
|
+
type: string
|
19
|
+
shallow:
|
20
|
+
type: boolean
|
21
|
+
exclude:
|
22
|
+
type: array
|
23
|
+
items:
|
24
|
+
type: string
|
25
|
+
- type: object
|
26
|
+
additionalProperties: false
|
27
|
+
required:
|
28
|
+
- gem
|
29
|
+
properties:
|
30
|
+
gem:
|
31
|
+
type: string
|
32
|
+
shallow:
|
33
|
+
type: boolean
|
34
|
+
exclude:
|
35
|
+
type: array
|
36
|
+
items:
|
37
|
+
type: string
|
38
|
+
exclude:
|
39
|
+
type: array
|
40
|
+
items:
|
41
|
+
type: string
|
42
|
+
functions:
|
43
|
+
type: array
|
44
|
+
items:
|
45
|
+
type: object
|
46
|
+
additionalProperties: false
|
47
|
+
properties:
|
48
|
+
package:
|
49
|
+
type: string
|
50
|
+
class:
|
51
|
+
type: string
|
52
|
+
function:
|
53
|
+
type: string
|
54
|
+
labels:
|
55
|
+
type: array
|
56
|
+
items:
|
57
|
+
type: string
|
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
require 'json'
|
4
4
|
require 'appmap/service/config_analyzer'
|
5
|
+
require 'appmap/service/integration_test_path_finder'
|
6
|
+
require 'appmap/service/test_command_provider'
|
5
7
|
|
6
8
|
module AppMap
|
7
9
|
module Command
|
@@ -11,22 +13,23 @@ module AppMap
|
|
11
13
|
class Status < StatusStruct
|
12
14
|
def perform
|
13
15
|
status = {
|
14
|
-
:
|
15
|
-
|
16
|
-
|
17
|
-
:
|
18
|
-
:
|
16
|
+
test_commands: Service::TestCommandProvider.all,
|
17
|
+
properties: {
|
18
|
+
config: {
|
19
|
+
app: config_analyzer.app_name,
|
20
|
+
present: config_analyzer.present?,
|
21
|
+
valid: config_analyzer.valid?
|
19
22
|
},
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:
|
24
|
-
:
|
23
|
+
project: {
|
24
|
+
agentVersion: AppMap::VERSION,
|
25
|
+
language: 'ruby',
|
26
|
+
remoteRecordingCapable: Gem.loaded_specs.has_key?('rails'),
|
27
|
+
integrationTests: Service::IntegrationTestPathFinder.count_paths > 0
|
25
28
|
}
|
26
29
|
}
|
27
30
|
}
|
28
31
|
|
29
|
-
puts status
|
32
|
+
puts JSON.pretty_generate(status)
|
30
33
|
end
|
31
34
|
|
32
35
|
private
|
data/lib/appmap/event.rb
CHANGED
@@ -119,6 +119,14 @@ module AppMap
|
|
119
119
|
end
|
120
120
|
end
|
121
121
|
end
|
122
|
+
|
123
|
+
# An event may be partially constructed, and then completed at a later time. When the event
|
124
|
+
# is only partially constructed, it's not ready for serialization to the AppMap file.
|
125
|
+
#
|
126
|
+
# @return false until the event is fully constructed and available.
|
127
|
+
def ready?
|
128
|
+
true
|
129
|
+
end
|
122
130
|
|
123
131
|
protected
|
124
132
|
|
@@ -240,7 +248,7 @@ module AppMap
|
|
240
248
|
next_exception = exception
|
241
249
|
exceptions = []
|
242
250
|
while next_exception
|
243
|
-
exception_backtrace = next_exception.backtrace_locations
|
251
|
+
exception_backtrace = AppMap::Util.try(next_exception.backtrace_locations, :[], 0)
|
244
252
|
exceptions << {
|
245
253
|
class: best_class_name(next_exception),
|
246
254
|
message: display_string(next_exception.message),
|
@@ -71,11 +71,16 @@ module AppMap
|
|
71
71
|
attr_reader :render_instance
|
72
72
|
# Path to the view template.
|
73
73
|
attr_accessor :path
|
74
|
-
|
74
|
+
# Indicates when the event is fully constructed.
|
75
|
+
attr_accessor :ready
|
76
|
+
|
77
|
+
alias ready? ready
|
78
|
+
|
75
79
|
def initialize(render_instance)
|
76
80
|
super :call
|
77
81
|
|
78
82
|
AppMap::Event::MethodEvent.build_from_invocation(:call, event: self)
|
83
|
+
@ready = false
|
79
84
|
@render_instance = render_instance
|
80
85
|
end
|
81
86
|
|
@@ -95,8 +100,7 @@ module AppMap
|
|
95
100
|
object_id: render_instance.__id__,
|
96
101
|
value: AppMap::Event::MethodEvent.display_string(render_instance)
|
97
102
|
}
|
98
|
-
|
99
|
-
end
|
103
|
+
end.compact
|
100
104
|
end
|
101
105
|
end
|
102
106
|
|
@@ -158,7 +162,8 @@ module AppMap
|
|
158
162
|
end
|
159
163
|
|
160
164
|
def handle_return(call_event_id, elapsed, return_value, exception)
|
161
|
-
Array(Thread.current[TEMPLATE_RENDERER]).pop
|
165
|
+
template_call = Array(Thread.current[TEMPLATE_RENDERER]).pop
|
166
|
+
template_call.ready = true
|
162
167
|
|
163
168
|
AppMap::Event::MethodReturnIgnoreValue.build_from_invocation(call_event_id, elapsed: elapsed)
|
164
169
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'appmap/service/test_framework_detector'
|
4
|
+
|
5
|
+
module AppMap
|
6
|
+
module Service
|
7
|
+
class IntegrationTestPathFinder
|
8
|
+
class << self
|
9
|
+
def find
|
10
|
+
@paths ||= begin
|
11
|
+
paths = { rspec: [], minitest: [], cucumber: [] }
|
12
|
+
paths[:rspec] = find_rspec_paths if TestFrameworkDetector.rspec_present?
|
13
|
+
paths[:minitest] = find_minitest_paths if TestFrameworkDetector.minitest_present?
|
14
|
+
paths[:cucumber] = find_cucumber_paths if TestFrameworkDetector.cucumber_present?
|
15
|
+
paths
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def count_paths
|
20
|
+
find.flatten(2).length - 3
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def find_rspec_paths
|
26
|
+
find_non_empty_paths(%w[spec/controllers spec/requests spec/integration spec/api spec/features spec/system])
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def find_minitest_paths
|
31
|
+
find_non_empty_paths(%w[test/controllers test/integration])
|
32
|
+
end
|
33
|
+
|
34
|
+
def find_cucumber_paths
|
35
|
+
find_non_empty_paths(%w[features])
|
36
|
+
end
|
37
|
+
|
38
|
+
def find_non_empty_paths(paths)
|
39
|
+
paths.select { |path| Dir.exist?(path) && !Dir.empty?(path) }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'appmap/service/test_framework_detector'
|
4
|
+
require 'appmap/service/integration_test_path_finder'
|
5
|
+
|
6
|
+
module AppMap
|
7
|
+
module Service
|
8
|
+
class TestCommandProvider
|
9
|
+
class << self
|
10
|
+
def all
|
11
|
+
commands = []
|
12
|
+
|
13
|
+
if TestFrameworkDetector.rspec_present? && !integration_test_paths[:rspec].empty?
|
14
|
+
commands << {
|
15
|
+
framework: :rspec,
|
16
|
+
command: {
|
17
|
+
program: 'bundle',
|
18
|
+
args: %w[exec rspec] + integration_test_paths[:rspec].map { |path| "./#{path}" },
|
19
|
+
environment: {
|
20
|
+
APPMAP: 'true'
|
21
|
+
}
|
22
|
+
}
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
if TestFrameworkDetector.minitest_present? && !integration_test_paths[:minitest].empty?
|
27
|
+
commands += minitest_commands
|
28
|
+
end
|
29
|
+
if TestFrameworkDetector.cucumber_present? && !integration_test_paths[:cucumber].empty?
|
30
|
+
commands << {
|
31
|
+
framework: :cucumber,
|
32
|
+
command: {
|
33
|
+
program: 'bundle',
|
34
|
+
args: %w[exec cucumber],
|
35
|
+
environment: { APPMAP: 'true' }
|
36
|
+
}
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
commands
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def minitest_commands
|
46
|
+
if Gem.loaded_specs.has_key?('rails')
|
47
|
+
[
|
48
|
+
{
|
49
|
+
framework: :minitest,
|
50
|
+
command: {
|
51
|
+
program: 'bundle',
|
52
|
+
args: %w[exec rails test] + integration_test_paths[:minitest].map { |path| "./#{path}" },
|
53
|
+
environment: { APPMAP: 'true' }
|
54
|
+
}
|
55
|
+
}
|
56
|
+
]
|
57
|
+
else
|
58
|
+
integration_test_paths[:minitest].map do |path|
|
59
|
+
{
|
60
|
+
framework: :minitest,
|
61
|
+
command: {
|
62
|
+
program: 'bundle',
|
63
|
+
args: ['exec', 'ruby', "./#{path}"],
|
64
|
+
environment: { APPMAP: 'true' }
|
65
|
+
}
|
66
|
+
}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def integration_test_paths
|
72
|
+
@paths ||= Service::IntegrationTestPathFinder.find
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AppMap
|
4
|
+
module Service
|
5
|
+
class TestFrameworkDetector
|
6
|
+
class << self
|
7
|
+
def rspec_present?
|
8
|
+
Gem.loaded_specs.has_key?('rspec-core')
|
9
|
+
end
|
10
|
+
|
11
|
+
def minitest_present?
|
12
|
+
Gem.loaded_specs.has_key?('minitest')
|
13
|
+
end
|
14
|
+
|
15
|
+
def cucumber_present?
|
16
|
+
Gem.loaded_specs.has_key?('cucumber')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/appmap/trace.rb
CHANGED
@@ -143,12 +143,12 @@ module AppMap
|
|
143
143
|
|
144
144
|
# Whether there is an event available for processing.
|
145
145
|
def event?
|
146
|
-
!@events.empty?
|
146
|
+
!@events.empty? && @events.first.ready?
|
147
147
|
end
|
148
148
|
|
149
149
|
# Gets the next available event, if any.
|
150
150
|
def next_event
|
151
|
-
@events.shift
|
151
|
+
@events.shift if event?
|
152
152
|
end
|
153
153
|
end
|
154
154
|
end
|
data/lib/appmap/util.rb
CHANGED
@@ -183,6 +183,15 @@ module AppMap
|
|
183
183
|
false
|
184
184
|
end
|
185
185
|
|
186
|
+
# https://github.com/rails/rails/blob/8cd143900978902ed9bbba10b34099a3140de5c6/activesupport/lib/active_support/core_ext/object/try.rb
|
187
|
+
def try(obj, *methods)
|
188
|
+
return nil if methods.empty?
|
189
|
+
|
190
|
+
return nil unless obj.respond_to?(methods.first)
|
191
|
+
|
192
|
+
obj.public_send(*methods)
|
193
|
+
end
|
194
|
+
|
186
195
|
def startup_message(msg)
|
187
196
|
if defined?(::Rails) && defined?(::Rails.logger) && ::Rails.logger
|
188
197
|
::Rails.logger.info msg
|
data/lib/appmap/version.rb
CHANGED
@@ -4,24 +4,78 @@
|
|
4
4
|
require 'test_helper'
|
5
5
|
|
6
6
|
class AgentSetupInitTest < Minitest::Test
|
7
|
-
def
|
7
|
+
def test_status_gem
|
8
8
|
output = `./exe/appmap-agent-status`
|
9
9
|
assert_equal 0, $CHILD_STATUS.exitstatus
|
10
10
|
expected = {
|
11
|
-
:
|
12
|
-
|
13
|
-
|
14
|
-
:
|
15
|
-
:
|
11
|
+
test_commands: [],
|
12
|
+
properties: {
|
13
|
+
config: {
|
14
|
+
app: 'AppMap Rubygem',
|
15
|
+
present: true,
|
16
|
+
valid: true
|
16
17
|
},
|
17
|
-
:
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
18
|
+
project: {
|
19
|
+
agentVersion: AppMap::VERSION,
|
20
|
+
language: 'ruby',
|
21
|
+
remoteRecordingCapable: false,
|
22
|
+
integrationTests: false
|
22
23
|
}
|
23
24
|
}
|
24
|
-
}
|
25
|
-
assert_equal expected, output.strip
|
25
|
+
}
|
26
|
+
assert_equal JSON.pretty_generate(expected), output.strip
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_status_rails_app
|
30
|
+
output = `cd spec/fixtures/rails6_users_app && bundle exec ../../../exe/appmap-agent-status`
|
31
|
+
assert_equal 0, $CHILD_STATUS.exitstatus
|
32
|
+
expected = {
|
33
|
+
test_commands: [
|
34
|
+
{
|
35
|
+
framework: :rspec,
|
36
|
+
command: {
|
37
|
+
program: 'bundle',
|
38
|
+
args: %w[exec rspec ./spec/controllers],
|
39
|
+
environment: {
|
40
|
+
APPMAP: 'true'
|
41
|
+
}
|
42
|
+
}
|
43
|
+
},
|
44
|
+
{
|
45
|
+
framework: :minitest,
|
46
|
+
command: {
|
47
|
+
program: 'bundle',
|
48
|
+
args: %w[exec ruby ./test/controllers],
|
49
|
+
environment: {
|
50
|
+
APPMAP: 'true'
|
51
|
+
}
|
52
|
+
}
|
53
|
+
},
|
54
|
+
{
|
55
|
+
framework: :minitest,
|
56
|
+
command: {
|
57
|
+
program: 'bundle',
|
58
|
+
args: %w[exec ruby ./test/integration],
|
59
|
+
environment: {
|
60
|
+
APPMAP: 'true'
|
61
|
+
}
|
62
|
+
}
|
63
|
+
}
|
64
|
+
],
|
65
|
+
properties: {
|
66
|
+
config: {
|
67
|
+
app: nil,
|
68
|
+
present: true,
|
69
|
+
valid: false
|
70
|
+
},
|
71
|
+
project: {
|
72
|
+
agentVersion: AppMap::VERSION,
|
73
|
+
language: 'ruby',
|
74
|
+
remoteRecordingCapable: false,
|
75
|
+
integrationTests: true
|
76
|
+
}
|
77
|
+
}
|
78
|
+
}
|
79
|
+
assert_equal JSON.pretty_generate(expected), output.strip
|
26
80
|
end
|
27
81
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appmap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.59.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Gilpin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -317,6 +317,7 @@ files:
|
|
317
317
|
- Rakefile
|
318
318
|
- appmap.gemspec
|
319
319
|
- appmap.yml
|
320
|
+
- config-schema.yml
|
320
321
|
- examples/install.rb
|
321
322
|
- examples/mock_webapp/Gemfile
|
322
323
|
- examples/mock_webapp/appmap.yml
|
@@ -356,6 +357,9 @@ files:
|
|
356
357
|
- lib/appmap/rspec.rb
|
357
358
|
- lib/appmap/service/config_analyzer.rb
|
358
359
|
- lib/appmap/service/guesser.rb
|
360
|
+
- lib/appmap/service/integration_test_path_finder.rb
|
361
|
+
- lib/appmap/service/test_command_provider.rb
|
362
|
+
- lib/appmap/service/test_framework_detector.rb
|
359
363
|
- lib/appmap/swagger.rb
|
360
364
|
- lib/appmap/swagger/configuration.rb
|
361
365
|
- lib/appmap/swagger/markdown_descriptions.rb
|
@@ -543,6 +547,8 @@ files:
|
|
543
547
|
- spec/fixtures/rails6_users_app/spec/models/user_spec.rb
|
544
548
|
- spec/fixtures/rails6_users_app/spec/rails_helper.rb
|
545
549
|
- spec/fixtures/rails6_users_app/spec/spec_helper.rb
|
550
|
+
- spec/fixtures/rails6_users_app/test/controllers/functional_calc_test.rb
|
551
|
+
- spec/fixtures/rails6_users_app/test/integration/integration_calc_test.rb
|
546
552
|
- spec/fixtures/rails6_users_app/users_app/.gitignore
|
547
553
|
- spec/hook_spec.rb
|
548
554
|
- spec/open_spec.rb
|