appmap 0.102.2 → 0.103.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -0
- data/.standard.yml +1 -0
- data/.travis.yml +2 -2
- data/CHANGELOG.md +17 -0
- data/appmap.gemspec +35 -36
- data/lib/appmap/agent.rb +28 -24
- data/lib/appmap/class_map.rb +36 -31
- data/lib/appmap/config.rb +132 -110
- data/lib/appmap/cucumber.rb +25 -25
- data/lib/appmap/detect_enabled.rb +30 -28
- data/lib/appmap/gem_hooks/activejob.yml +0 -1
- data/lib/appmap/hook/method/ruby2.rb +19 -8
- data/lib/appmap/hook/method/ruby3.rb +20 -13
- data/lib/appmap/hook/method.rb +27 -27
- data/lib/appmap/hook/record_around.rb +77 -0
- data/lib/appmap/hook.rb +74 -44
- data/lib/appmap/metadata.rb +6 -18
- data/lib/appmap/middleware/remote_recording.rb +26 -27
- data/lib/appmap/minitest.rb +27 -27
- data/lib/appmap/rspec.rb +37 -37
- data/lib/appmap/trace.rb +14 -12
- data/lib/appmap/util.rb +71 -61
- data/lib/appmap/version.rb +1 -1
- metadata +5 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da7a93e936ce2a43f5003c66a1c690b2a02add786ab25f620b09febeafe64859
|
4
|
+
data.tar.gz: f4b5bc2e8aa1fe181900fa31b2d3d1965fdbe79e6f8a4c9122039367c4b8bf40
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8dc10f3ea70a97280466c1d36c693bf33bb6ef3874ee9fcc42dfd2cb38af04138e7206a434a45218beded2827737e0c34eaefe3ed016acc2d0052d9b04de2465
|
7
|
+
data.tar.gz: 6b0d23c664a28695748c83b4229e7321853025db183d100c3ce30ec9f3c4ce98228502fbb9e95e51ebfda22ac6849a73680854f94e4ae968ac22be0d9c0ea0da
|
data/.rubocop.yml
ADDED
data/.standard.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby_version: 2.6
|
data/.travis.yml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
language: ruby
|
2
2
|
dist: focal
|
3
3
|
cache:
|
4
|
-
-
|
4
|
+
- bundler
|
5
5
|
- yarn
|
6
6
|
|
7
7
|
# Travis pre-installs some Ruby versions. You can see the current list
|
@@ -10,7 +10,7 @@ cache:
|
|
10
10
|
# that list to not install rvm and ruby each time.
|
11
11
|
rvm:
|
12
12
|
- 2.6.9
|
13
|
-
- 2.7.
|
13
|
+
- 2.7.5
|
14
14
|
- 3.0.1 # doesn't show in pre-installed list
|
15
15
|
- 3.1.2
|
16
16
|
- 3.2.0
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
# [0.103.0](https://github.com/getappmap/appmap-ruby/compare/v0.102.2...v0.103.0) (2023-12-18)
|
2
|
+
|
3
|
+
|
4
|
+
### Bug Fixes
|
5
|
+
|
6
|
+
* Drop metadata timestamp ([950d8e6](https://github.com/getappmap/appmap-ruby/commit/950d8e63b87853d8d631f31e70dbf56b76166cec))
|
7
|
+
|
8
|
+
|
9
|
+
### Features
|
10
|
+
|
11
|
+
* APPMAP_OUTPUT_DIR ([82fe6d7](https://github.com/getappmap/appmap-ruby/commit/82fe6d7cc5b5672f45739ccaaf40b4b05c8fb074))
|
12
|
+
* AppMap.record accepts thread ([9863cc5](https://github.com/getappmap/appmap-ruby/commit/9863cc557f3a32229a6068bcb05df095eaf107a2))
|
13
|
+
* Drop extended git info ([1d26cb4](https://github.com/getappmap/appmap-ruby/commit/1d26cb451b8c1cee4cccfd1412ec9d8e8e88a3d9))
|
14
|
+
* Ensure existence of the appmap output dir ([3019868](https://github.com/getappmap/appmap-ruby/commit/3019868ad9d08af581a33ce2ea8664e74255ca00))
|
15
|
+
* Record around command-labeled methods ([9692e2b](https://github.com/getappmap/appmap-ruby/commit/9692e2b4fdf41bcb0bab96b0040cefe063c520ef))
|
16
|
+
* Report metadata timestamp as iso8601 ([56f8a52](https://github.com/getappmap/appmap-ruby/commit/56f8a52b3c5b964e163c9ba6021cf0f44981369e))
|
17
|
+
|
1
18
|
## [0.102.2](https://github.com/getappmap/appmap-ruby/compare/v0.102.1...v0.102.2) (2023-11-07)
|
2
19
|
|
3
20
|
|
data/appmap.gemspec
CHANGED
@@ -1,56 +1,55 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
lib = File.expand_path(
|
3
|
+
lib = File.expand_path("lib", __dir__)
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require
|
5
|
+
require "appmap/version"
|
6
6
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
8
|
# ability to parameterize gem name is added intentionally,
|
9
9
|
# to support the possibility of unofficial releases, e.g. during CI tests
|
10
|
-
spec.name
|
11
|
-
spec.version
|
12
|
-
spec.authors
|
13
|
-
spec.email
|
10
|
+
spec.name = ENV.fetch("GEM_ALTERNATIVE_NAME", "appmap")
|
11
|
+
spec.version = AppMap::VERSION
|
12
|
+
spec.authors = ["Kevin Gilpin"]
|
13
|
+
spec.email = ["kgilpin@gmail.com"]
|
14
14
|
|
15
|
-
spec.required_ruby_version =
|
15
|
+
spec.required_ruby_version = ">= 2.6.0"
|
16
16
|
|
17
|
-
spec.summary
|
18
|
-
spec.homepage
|
19
|
-
spec.license
|
17
|
+
spec.summary = "Record the operation of a Ruby program, using the AppLand 'AppMap' format."
|
18
|
+
spec.homepage = AppMap::URL
|
19
|
+
spec.license = "MIT"
|
20
20
|
|
21
21
|
# Specify which files should be added to the gem when it is released.
|
22
22
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
23
|
-
spec.files
|
23
|
+
spec.files = `git ls-files --no-deleted`.split("\n").grep_v(/appmap\.json$/).grep_v(%r{^(spec|test)/})
|
24
24
|
|
25
|
-
spec.bindir
|
26
|
-
spec.executables
|
25
|
+
spec.bindir = "exe"
|
26
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
27
|
|
28
|
-
spec.extensions <<
|
29
|
-
spec.require_paths = [
|
28
|
+
spec.extensions << "ext/appmap/extconf.rb"
|
29
|
+
spec.require_paths = ["lib"]
|
30
30
|
|
31
|
-
spec.add_dependency
|
32
|
-
spec.add_dependency
|
31
|
+
spec.add_dependency "method_source"
|
32
|
+
spec.add_dependency "reverse_markdown"
|
33
33
|
|
34
|
-
spec.add_runtime_dependency
|
35
|
-
spec.add_runtime_dependency
|
34
|
+
spec.add_runtime_dependency "activesupport"
|
35
|
+
spec.add_runtime_dependency "rack"
|
36
36
|
|
37
|
-
spec.add_development_dependency
|
38
|
-
spec.add_development_dependency
|
39
|
-
spec.add_development_dependency
|
40
|
-
spec.add_development_dependency
|
41
|
-
spec.add_development_dependency
|
42
|
-
spec.add_development_dependency
|
43
|
-
spec.add_development_dependency 'standardrb', "~> 1.0"
|
37
|
+
spec.add_development_dependency "bundler", ">= 1.16"
|
38
|
+
spec.add_development_dependency "minitest", "~> 5.15"
|
39
|
+
spec.add_development_dependency "pry-byebug"
|
40
|
+
spec.add_development_dependency "rake", ">= 12.3.3"
|
41
|
+
spec.add_development_dependency "rake-compiler"
|
42
|
+
spec.add_development_dependency "rdoc"
|
44
43
|
|
45
44
|
# Testing
|
46
|
-
spec.add_development_dependency
|
47
|
-
spec.add_development_dependency
|
48
|
-
spec.add_development_dependency
|
49
|
-
spec.add_development_dependency
|
50
|
-
spec.add_development_dependency
|
51
|
-
spec.add_development_dependency
|
52
|
-
spec.add_development_dependency
|
53
|
-
spec.add_development_dependency
|
54
|
-
spec.add_development_dependency
|
55
|
-
spec.add_development_dependency
|
45
|
+
spec.add_development_dependency "climate_control"
|
46
|
+
spec.add_development_dependency "diffy"
|
47
|
+
spec.add_development_dependency "hashie"
|
48
|
+
spec.add_development_dependency "launchy"
|
49
|
+
spec.add_development_dependency "random-port", "~> 0.5.1"
|
50
|
+
spec.add_development_dependency "rspec"
|
51
|
+
spec.add_development_dependency "selenium-webdriver"
|
52
|
+
spec.add_development_dependency "timecop"
|
53
|
+
spec.add_development_dependency "webdrivers", "~> 4.0"
|
54
|
+
spec.add_development_dependency "webrick"
|
56
55
|
end
|
data/lib/appmap/agent.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
require_relative
|
2
|
-
require_relative
|
3
|
-
require_relative
|
4
|
-
require_relative
|
5
|
-
require_relative
|
6
|
-
require_relative
|
7
|
-
require_relative
|
8
|
-
require_relative
|
1
|
+
require_relative "version"
|
2
|
+
require_relative "hook"
|
3
|
+
require_relative "config"
|
4
|
+
require_relative "trace"
|
5
|
+
require_relative "class_map"
|
6
|
+
require_relative "metadata"
|
7
|
+
require_relative "util"
|
8
|
+
require_relative "open"
|
9
9
|
|
10
10
|
# load extension
|
11
|
-
require_relative
|
12
|
-
require_relative
|
11
|
+
require_relative "appmap"
|
12
|
+
require_relative "detect_enabled"
|
13
13
|
|
14
14
|
module AppMap
|
15
15
|
class << self
|
@@ -25,13 +25,17 @@ module AppMap
|
|
25
25
|
# Sets the configuration. This is only expected to happen once per
|
26
26
|
# Ruby process.
|
27
27
|
def configuration=(config)
|
28
|
-
warn
|
28
|
+
warn "AppMap is already configured" if @configuration && config
|
29
29
|
|
30
30
|
@configuration = config
|
31
31
|
end
|
32
32
|
|
33
|
+
def output_dir
|
34
|
+
ENV["APPMAP_OUTPUT_DIR"] || DEFAULT_APPMAP_DIR
|
35
|
+
end
|
36
|
+
|
33
37
|
def default_config_file_path
|
34
|
-
ENV[
|
38
|
+
ENV["APPMAP_CONFIG_FILE"] || "appmap.yml"
|
35
39
|
end
|
36
40
|
|
37
41
|
# Configures AppMap for recording. Default behavior is to configure from
|
@@ -58,10 +62,10 @@ module AppMap
|
|
58
62
|
end
|
59
63
|
end
|
60
64
|
|
61
|
-
def tracing_enabled?
|
65
|
+
def tracing_enabled?(thread: nil)
|
62
66
|
return false unless @tracing
|
63
67
|
|
64
|
-
@tracing.enabled?
|
68
|
+
@tracing.enabled?(thread_id: thread&.object_id)
|
65
69
|
end
|
66
70
|
|
67
71
|
# Used to start tracing, stop tracing, and record events.
|
@@ -69,10 +73,10 @@ module AppMap
|
|
69
73
|
@tracing ||= Trace::Tracing.new
|
70
74
|
end
|
71
75
|
|
72
|
-
# Records the events which occur while processing a block,
|
73
|
-
#
|
74
|
-
def record
|
75
|
-
tracer = tracing.trace
|
76
|
+
# Records the events which occur while processing a block, and returns an AppMap as a Hash.
|
77
|
+
# Recording may optionally capture only a single thread.
|
78
|
+
def record(thread: nil)
|
79
|
+
tracer = tracing.trace(thread: thread)
|
76
80
|
tracer.enable
|
77
81
|
begin
|
78
82
|
yield
|
@@ -84,10 +88,10 @@ module AppMap
|
|
84
88
|
event_list << tracer.next_event.to_h while tracer.event?
|
85
89
|
end
|
86
90
|
{
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
+
"version" => AppMap::APPMAP_FORMAT_VERSION,
|
92
|
+
"metadata" => detect_metadata,
|
93
|
+
"classMap" => class_map(tracer.event_methods),
|
94
|
+
"events" => events
|
91
95
|
}
|
92
96
|
end
|
93
97
|
|
@@ -110,11 +114,11 @@ module AppMap
|
|
110
114
|
end
|
111
115
|
|
112
116
|
def parameter_schema?
|
113
|
-
ENV[
|
117
|
+
ENV["APPMAP_PARAMETER_SCHEMA"] == "true"
|
114
118
|
end
|
115
119
|
|
116
120
|
def explain_queries?
|
117
|
-
ENV[
|
121
|
+
ENV["APPMAP_EXPLAIN_QUERIES"] == "true"
|
118
122
|
end
|
119
123
|
|
120
124
|
def recording_enabled?(recording_method = nil)
|
data/lib/appmap/class_map.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "method_source"
|
4
4
|
|
5
5
|
module AppMap
|
6
6
|
class ClassMap
|
@@ -23,7 +23,7 @@ module AppMap
|
|
23
23
|
include HasChildren
|
24
24
|
|
25
25
|
def type
|
26
|
-
|
26
|
+
"package"
|
27
27
|
end
|
28
28
|
|
29
29
|
def to_h
|
@@ -38,7 +38,7 @@ module AppMap
|
|
38
38
|
include HasChildren
|
39
39
|
|
40
40
|
def type
|
41
|
-
|
41
|
+
"class"
|
42
42
|
end
|
43
43
|
|
44
44
|
def to_h
|
@@ -53,7 +53,7 @@ module AppMap
|
|
53
53
|
attr_accessor :static, :location, :labels
|
54
54
|
|
55
55
|
def type
|
56
|
-
|
56
|
+
"function"
|
57
57
|
end
|
58
58
|
|
59
59
|
def to_h
|
@@ -62,13 +62,34 @@ module AppMap
|
|
62
62
|
type: type,
|
63
63
|
location: location,
|
64
64
|
static: static,
|
65
|
-
labels: labels
|
65
|
+
labels: labels
|
66
66
|
}.delete_if { |_, v| v.nil? || v == [] }
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
71
|
class << self
|
72
|
+
# Labels can be embedded in the function comment. Label format is similar to YARD and JavaDoc.
|
73
|
+
# The keyword is @labels or @label. The keyword is followed by space-separated labels.
|
74
|
+
# For example:
|
75
|
+
# @label provider.authentication security
|
76
|
+
# rubocop:disable Metrics/MethodLength
|
77
|
+
def parse_labels(comment)
|
78
|
+
return [] unless comment
|
79
|
+
|
80
|
+
comment
|
81
|
+
.split("\n")
|
82
|
+
.map { |line| line.match(/^\s*#\s*@labels?\s+(.*)/) }
|
83
|
+
.compact
|
84
|
+
.map { |match| match[1] }
|
85
|
+
.inject([]) { |accum, labels|
|
86
|
+
accum += labels.split(/\s+/)
|
87
|
+
accum
|
88
|
+
}
|
89
|
+
.sort
|
90
|
+
end
|
91
|
+
# rubocop:enable Metrics/MethodLength
|
92
|
+
|
72
93
|
def build_from_methods(methods)
|
73
94
|
root = Types::Root.new
|
74
95
|
methods.each do |method|
|
@@ -76,13 +97,13 @@ module AppMap
|
|
76
97
|
end
|
77
98
|
|
78
99
|
collapse_package = lambda do |package|
|
79
|
-
next unless package.type ==
|
100
|
+
next unless package.type == "package"
|
80
101
|
|
81
|
-
while package.children.length == 1 && package.children.all? { |child| child.type ==
|
102
|
+
while package.children.length == 1 && package.children.all? { |child| child.type == "package" }
|
82
103
|
child = package.children[0]
|
83
104
|
package.children.clear
|
84
105
|
child.children.each { |child| package.children << child }
|
85
|
-
package.name = [
|
106
|
+
package.name = [package.name, child.name].join("/")
|
86
107
|
end
|
87
108
|
package.tap do
|
88
109
|
package.children.map(&collapse_package)
|
@@ -96,20 +117,20 @@ module AppMap
|
|
96
117
|
|
97
118
|
def add_function(root, method)
|
98
119
|
object_infos = \
|
99
|
-
method.package.split(
|
120
|
+
method.package.split("/").map do |name|
|
100
121
|
{
|
101
122
|
name: name,
|
102
|
-
type:
|
123
|
+
type: "package"
|
103
124
|
}
|
104
|
-
end + method.class_name.split(
|
125
|
+
end + method.class_name.split("::").map do |name|
|
105
126
|
{
|
106
127
|
name: name,
|
107
|
-
type:
|
128
|
+
type: "class"
|
108
129
|
}
|
109
130
|
end
|
110
131
|
function_info = {
|
111
132
|
name: method.name,
|
112
|
-
type:
|
133
|
+
type: "function",
|
113
134
|
static: method.static
|
114
135
|
}
|
115
136
|
location = method.source_location
|
@@ -118,9 +139,9 @@ module AppMap
|
|
118
139
|
if location
|
119
140
|
location_file, lineno = location
|
120
141
|
location_file = location_file[Dir.pwd.length + 1..-1] if location_file.index(Dir.pwd) == 0
|
121
|
-
[
|
142
|
+
[location_file, lineno].compact.join(":")
|
122
143
|
else
|
123
|
-
[
|
144
|
+
[method.class_name, method.static ? "." : "#", method.name].join
|
124
145
|
end
|
125
146
|
|
126
147
|
comment = method.comment
|
@@ -143,22 +164,6 @@ module AppMap
|
|
143
164
|
end
|
144
165
|
end
|
145
166
|
|
146
|
-
# Labels can be embedded in the function comment. Label format is similar to YARD and JavaDoc.
|
147
|
-
# The keyword is @labels or @label. The keyword is followed by space-separated labels.
|
148
|
-
# For example:
|
149
|
-
# @label provider.authentication security
|
150
|
-
def parse_labels(comment)
|
151
|
-
return [] unless comment
|
152
|
-
|
153
|
-
comment
|
154
|
-
.split("\n")
|
155
|
-
.map { |line| line.match(/^\s*#\s*@labels?\s+(.*)/) }
|
156
|
-
.compact
|
157
|
-
.map { |match| match[1] }
|
158
|
-
.inject([]) { |accum, labels| accum += labels.split(/\s+/); accum }
|
159
|
-
.sort
|
160
|
-
end
|
161
|
-
|
162
167
|
def find_or_create(list, info)
|
163
168
|
obj = list.find { |item| item.type == info[:type] && item.name == info[:name] }
|
164
169
|
return obj if obj
|