appmap 0.59.0 → 0.61.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/CHANGELOG.md +29 -0
- data/config-schema.yml +57 -0
- data/exe/appmap-agent-validate +19 -0
- data/lib/appmap/command/agent_setup/status.rb +1 -1
- data/lib/appmap/command/agent_setup/validate.rb +24 -0
- data/lib/appmap/event.rb +9 -1
- data/lib/appmap/handler/rails/template.rb +9 -4
- data/lib/appmap/service/config_analyzer.rb +7 -8
- data/lib/appmap/service/integration_test_path_finder.rb +29 -25
- data/lib/appmap/service/test_command_provider.rb +1 -1
- data/lib/appmap/service/validator/config_validator.rb +89 -0
- data/lib/appmap/service/validator/violation.rb +50 -0
- data/lib/appmap/trace.rb +2 -2
- data/lib/appmap/util.rb +9 -0
- data/lib/appmap/version.rb +4 -1
- data/spec/fixtures/config/invalid_config.yml +2 -2
- data/spec/fixtures/config/invalid_yaml_config.yml +3 -0
- data/spec/service/config_analyzer_spec.rb +4 -4
- data/spec/service/integration_test_path_finder_spec.rb +24 -0
- data/spec/service/validator/violation_spec.rb +68 -0
- data/test/agent_setup_status_test.rb +2 -2
- data/test/agent_setup_validate_test.rb +75 -0
- metadata +12 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff3bf2ebd7ec8fcc1a5af2e4e6dad9198f03aa002e5d9ec1c481989bae11fb4b
|
4
|
+
data.tar.gz: 0b601eb264047a0971ef17d086ea6335b2e657d198dbd8ec8892a8191d0ab373
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95d564c8858735cd87fe794657ab301fe38b96281f9947f7bc471d3a0bb9eb296b0eee309c234a2645f248aeec61bb73687378972cb5eb413ca628424787f167
|
7
|
+
data.tar.gz: 6adc060b2f2cb22f75ffb320d55f4a78a297e870b9f01b832aef366a5ecb95ff70e02ca6785644b353fbab1480418c18fddaef2242e9037aafd2d2e35b2d0d47
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,32 @@
|
|
1
|
+
# [0.61.0](https://github.com/applandinc/appmap-ruby/compare/v0.60.0...v0.61.0) (2021-07-14)
|
2
|
+
|
3
|
+
|
4
|
+
### Features
|
5
|
+
|
6
|
+
* check if rails is present in `appmap-agent-validate` ([b584c2d](https://github.com/applandinc/appmap-ruby/commit/b584c2d9bb37f166932c0b91eed4db94fbafa8a7))
|
7
|
+
|
8
|
+
# [0.60.0](https://github.com/applandinc/appmap-ruby/compare/v0.59.2...v0.60.0) (2021-07-08)
|
9
|
+
|
10
|
+
|
11
|
+
### Features
|
12
|
+
|
13
|
+
* add agent-setup-validate command ([d9b3bc1](https://github.com/applandinc/appmap-ruby/commit/d9b3bc15e01bf89994aa67b0256dd69b9983be76))
|
14
|
+
* validate ruby version (+ better config loading validation) ([1756e6c](https://github.com/applandinc/appmap-ruby/commit/1756e6c30b5c44a033c23eb47c27c56732d12470))
|
15
|
+
|
16
|
+
## [0.59.2](https://github.com/applandinc/appmap-ruby/compare/v0.59.1...v0.59.2) (2021-07-08)
|
17
|
+
|
18
|
+
|
19
|
+
### Bug Fixes
|
20
|
+
|
21
|
+
* Remove improper reliance on Rails 'try' ([c6b5b16](https://github.com/applandinc/appmap-ruby/commit/c6b5b16a6963988e20bab5f88b99401e25691f3c))
|
22
|
+
|
23
|
+
## [0.59.1](https://github.com/applandinc/appmap-ruby/compare/v0.59.0...v0.59.1) (2021-07-08)
|
24
|
+
|
25
|
+
|
26
|
+
### Bug Fixes
|
27
|
+
|
28
|
+
* Events may be constructed in stages ([b0b23f5](https://github.com/applandinc/appmap-ruby/commit/b0b23f59a84158b8162424b84430894fe4278324))
|
29
|
+
|
1
30
|
# [0.59.0](https://github.com/applandinc/appmap-ruby/compare/v0.58.0...v0.59.0) (2021-07-07)
|
2
31
|
|
3
32
|
|
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
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'optparse'
|
5
|
+
require 'appmap'
|
6
|
+
require 'appmap/command/agent_setup/validate'
|
7
|
+
|
8
|
+
@options = { config_file: AppMap::DEFAULT_CONFIG_FILE_PATH }
|
9
|
+
|
10
|
+
OptionParser.new do |parser|
|
11
|
+
parser.banner = 'Usage: appmap-agent-validate [options]'
|
12
|
+
|
13
|
+
description = "AppMap configuration file path (default: #{AppMap::DEFAULT_CONFIG_FILE_PATH})"
|
14
|
+
parser.on('-c', '--config=FILEPATH', description) do |filepath|
|
15
|
+
@options[:config_file] = filepath
|
16
|
+
end
|
17
|
+
end.parse!
|
18
|
+
|
19
|
+
AppMap::Command::AgentSetup::Validate.new(@options[:config_file]).perform
|
@@ -24,7 +24,7 @@ module AppMap
|
|
24
24
|
agentVersion: AppMap::VERSION,
|
25
25
|
language: 'ruby',
|
26
26
|
remoteRecordingCapable: Gem.loaded_specs.has_key?('rails'),
|
27
|
-
integrationTests: Service::IntegrationTestPathFinder.count_paths > 0
|
27
|
+
integrationTests: Service::IntegrationTestPathFinder.new.count_paths > 0
|
28
28
|
}
|
29
29
|
}
|
30
30
|
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'appmap/service/validator/config_validator'
|
5
|
+
|
6
|
+
module AppMap
|
7
|
+
module Command
|
8
|
+
module AgentSetup
|
9
|
+
ValidateStruct = Struct.new(:config_file)
|
10
|
+
|
11
|
+
class Validate < ValidateStruct
|
12
|
+
def perform
|
13
|
+
puts JSON.pretty_generate(config_validator.valid? ? [] : config_validator.violations.map(&:to_h))
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def config_validator
|
19
|
+
@validator ||= Service::Validator::ConfigValidator.new(config_file)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
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
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'appmap/service/validator/config_validator'
|
4
|
+
|
3
5
|
module AppMap
|
4
6
|
module Service
|
5
7
|
class ConfigAnalyzer
|
@@ -7,11 +9,10 @@ module AppMap
|
|
7
9
|
|
8
10
|
def initialize(config_file)
|
9
11
|
@config_file = config_file
|
10
|
-
@config = load_config
|
11
12
|
end
|
12
13
|
|
13
14
|
def app_name
|
14
|
-
|
15
|
+
config_validator.config.to_h['name'] if present?
|
15
16
|
end
|
16
17
|
|
17
18
|
def present?
|
@@ -19,16 +20,14 @@ module AppMap
|
|
19
20
|
end
|
20
21
|
|
21
22
|
def valid?
|
22
|
-
|
23
|
+
config_validator.valid?
|
23
24
|
end
|
24
25
|
|
25
26
|
private
|
26
27
|
|
27
|
-
def
|
28
|
-
AppMap::
|
29
|
-
rescue
|
30
|
-
nil
|
28
|
+
def config_validator
|
29
|
+
@validator ||= AppMap::Service::Validator::ConfigValidator.new(@config_file)
|
31
30
|
end
|
32
31
|
end
|
33
32
|
end
|
34
|
-
end
|
33
|
+
end
|
@@ -5,39 +5,43 @@ require 'appmap/service/test_framework_detector'
|
|
5
5
|
module AppMap
|
6
6
|
module Service
|
7
7
|
class IntegrationTestPathFinder
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
8
|
+
def initialize(base_path = '')
|
9
|
+
@base_path = base_path
|
10
|
+
end
|
18
11
|
|
19
|
-
|
20
|
-
|
12
|
+
def find
|
13
|
+
@paths ||= begin
|
14
|
+
paths = { rspec: [], minitest: [], cucumber: [] }
|
15
|
+
paths[:rspec] = find_rspec_paths if TestFrameworkDetector.rspec_present?
|
16
|
+
paths[:minitest] = find_minitest_paths if TestFrameworkDetector.minitest_present?
|
17
|
+
paths[:cucumber] = find_cucumber_paths if TestFrameworkDetector.cucumber_present?
|
18
|
+
paths
|
21
19
|
end
|
20
|
+
end
|
22
21
|
|
23
|
-
|
22
|
+
def count_paths
|
23
|
+
find.flatten(2).length - 3
|
24
|
+
end
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
26
|
+
private
|
27
|
+
|
28
|
+
def find_rspec_paths
|
29
|
+
find_non_empty_paths(%w[spec/controllers spec/requests spec/integration spec/api spec/features spec/system])
|
30
|
+
end
|
28
31
|
|
29
32
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
+
def find_minitest_paths
|
34
|
+
top_level_paths = %w[test/controllers test/integration]
|
35
|
+
children_paths = Dir.glob('test/**/{controllers,integration}')
|
36
|
+
find_non_empty_paths((top_level_paths + children_paths).uniq).sort
|
37
|
+
end
|
33
38
|
|
34
|
-
|
35
|
-
|
36
|
-
|
39
|
+
def find_cucumber_paths
|
40
|
+
find_non_empty_paths(%w[features])
|
41
|
+
end
|
37
42
|
|
38
|
-
|
39
|
-
|
40
|
-
end
|
43
|
+
def find_non_empty_paths(paths)
|
44
|
+
paths.select { |path| Dir.exist?(@base_path + path) && !Dir.empty?(@base_path + path) }
|
41
45
|
end
|
42
46
|
end
|
43
47
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'appmap/service/validator/violation'
|
4
|
+
|
5
|
+
module AppMap
|
6
|
+
module Service
|
7
|
+
module Validator
|
8
|
+
class ConfigValidator
|
9
|
+
attr_reader :violations
|
10
|
+
|
11
|
+
def initialize(config_file)
|
12
|
+
@config_file = config_file
|
13
|
+
@violations = []
|
14
|
+
end
|
15
|
+
|
16
|
+
def config
|
17
|
+
parse_config
|
18
|
+
end
|
19
|
+
|
20
|
+
def valid?
|
21
|
+
validate_ruby_version
|
22
|
+
validate_rails_presence
|
23
|
+
validate_config_presence
|
24
|
+
parse_config
|
25
|
+
validate_config_load
|
26
|
+
@violations.empty?
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def present?
|
32
|
+
File.exist?(@config_file)
|
33
|
+
end
|
34
|
+
|
35
|
+
def parse_config
|
36
|
+
return unless present?
|
37
|
+
|
38
|
+
@config_data ||= YAML.load_file(@config_file)
|
39
|
+
rescue Psych::SyntaxError => e
|
40
|
+
@violations << Violation.error(
|
41
|
+
filename: @config_file,
|
42
|
+
message: 'AppMap configuration is not valid YAML',
|
43
|
+
detailed_message: e.message
|
44
|
+
)
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
|
48
|
+
def validate_config_load
|
49
|
+
return unless @config_data
|
50
|
+
|
51
|
+
AppMap::Config.load(@config_data)
|
52
|
+
rescue StandardError => e
|
53
|
+
@violations << Violation.error(
|
54
|
+
filename: @config_file,
|
55
|
+
message: 'AppMap configuration could not be loaded',
|
56
|
+
detailed_message: e.message
|
57
|
+
)
|
58
|
+
nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def validate_config_presence
|
62
|
+
unless present?
|
63
|
+
@violations << Violation.error(
|
64
|
+
filename: @config_file,
|
65
|
+
message: 'AppMap configuration file does not exist'
|
66
|
+
)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def validate_rails_presence
|
71
|
+
unless Gem.loaded_specs.has_key?('rails')
|
72
|
+
@violations << Violation.error(
|
73
|
+
message: 'AppMap auto-configuration is currently not available for non Rails projects'
|
74
|
+
)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def validate_ruby_version
|
79
|
+
unless RUBY_VERSION =~ AppMap::SUPPORTED_RUBY_VERSIONS_REGEX
|
80
|
+
@violations << Violation.error(
|
81
|
+
message: "AppMap does not support Ruby #{RUBY_VERSION}. " \
|
82
|
+
"Supported versions are: #{AppMap::SUPPORTED_RUBY_VERSIONS.join(', ')}."
|
83
|
+
)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AppMap
|
4
|
+
module Service
|
5
|
+
module Validator
|
6
|
+
class Violation
|
7
|
+
attr_reader :level, :setting, :filename, :message, :detailed_message, :help_urls
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def error(message:, setting: nil, filename: nil, detailed_message: nil, help_urls: nil)
|
11
|
+
self.new(
|
12
|
+
level: :error,
|
13
|
+
message: message,
|
14
|
+
setting: setting,
|
15
|
+
filename: filename,
|
16
|
+
detailed_message: detailed_message,
|
17
|
+
help_urls: help_urls
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
def warning(message:, setting: nil, filename: nil, detailed_message: nil, help_urls: nil)
|
22
|
+
self.new(
|
23
|
+
level: :warning,
|
24
|
+
message: message,
|
25
|
+
setting: setting,
|
26
|
+
filename: filename,
|
27
|
+
detailed_message: detailed_message,
|
28
|
+
help_urls: help_urls
|
29
|
+
)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def initialize(level:, message:, setting:, filename:, detailed_message:, help_urls:)
|
34
|
+
@level = level
|
35
|
+
@setting = setting
|
36
|
+
@filename = filename
|
37
|
+
@message = message
|
38
|
+
@detailed_message = detailed_message
|
39
|
+
@help_urls = help_urls
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_h
|
43
|
+
instance_variables.each_with_object({}) do |var, hash|
|
44
|
+
hash[var.to_s.delete("@")] = self.instance_variable_get(var)
|
45
|
+
end.compact
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
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
@@ -3,10 +3,13 @@
|
|
3
3
|
module AppMap
|
4
4
|
URL = 'https://github.com/applandinc/appmap-ruby'
|
5
5
|
|
6
|
-
VERSION = '0.
|
6
|
+
VERSION = '0.61.0'
|
7
7
|
|
8
8
|
APPMAP_FORMAT_VERSION = '1.5.1'
|
9
9
|
|
10
|
+
SUPPORTED_RUBY_VERSIONS_REGEX = /^2\.[567]\./.freeze
|
11
|
+
SUPPORTED_RUBY_VERSIONS = %w[2.5 2.6 2.7].freeze
|
12
|
+
|
10
13
|
DEFAULT_APPMAP_DIR = 'tmp/appmap'.freeze
|
11
14
|
DEFAULT_CONFIG_FILE_PATH = 'appmap.yml'.freeze
|
12
15
|
end
|
@@ -1,2 +1,2 @@
|
|
1
|
-
name:
|
2
|
-
packages:
|
1
|
+
name: name
|
2
|
+
packages: [1,2,3]
|
@@ -28,7 +28,7 @@ describe AppMap::Service::ConfigAnalyzer do
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
context 'with valid config' do
|
31
|
+
context 'with valid but non rails config' do
|
32
32
|
let(:config_file) { 'spec/fixtures/config/valid_config.yml'}
|
33
33
|
|
34
34
|
describe '.app_name' do
|
@@ -39,7 +39,7 @@ describe AppMap::Service::ConfigAnalyzer do
|
|
39
39
|
|
40
40
|
describe '.is_valid?' do
|
41
41
|
it 'returns true' do
|
42
|
-
expect(subject.valid?).to
|
42
|
+
expect(subject.valid?).to be_falsey
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
@@ -51,7 +51,7 @@ describe AppMap::Service::ConfigAnalyzer do
|
|
51
51
|
end
|
52
52
|
|
53
53
|
context 'with invalid YAML config' do
|
54
|
-
let(:config_file) { 'spec/fixtures/config/
|
54
|
+
let(:config_file) { 'spec/fixtures/config/invalid_yaml_config.yml'}
|
55
55
|
|
56
56
|
describe '.app_name' do
|
57
57
|
it 'returns app name value from config' do
|
@@ -83,7 +83,7 @@ describe AppMap::Service::ConfigAnalyzer do
|
|
83
83
|
|
84
84
|
describe '.is_valid?' do
|
85
85
|
it 'guesses paths and returns true ' do
|
86
|
-
expect(subject.valid?).to
|
86
|
+
expect(subject.valid?).to be_falsey
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'appmap/service/integration_test_path_finder'
|
5
|
+
|
6
|
+
describe AppMap::Service::IntegrationTestPathFinder do
|
7
|
+
subject { described_class.new('./spec/fixtures/rails6_users_app/') }
|
8
|
+
|
9
|
+
describe '.count' do
|
10
|
+
it 'counts existing paths' do
|
11
|
+
expect(subject.count_paths).to be(3)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '.find' do
|
16
|
+
it 'finds paths' do
|
17
|
+
expect(subject.find).to eq({
|
18
|
+
rspec: %w[spec/controllers],
|
19
|
+
minitest: %w[test/controllers test/integration],
|
20
|
+
cucumber: []
|
21
|
+
})
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'appmap/service/validator/violation'
|
5
|
+
|
6
|
+
describe AppMap::Service::Validator::Violation do
|
7
|
+
describe '.error' do
|
8
|
+
let(:message) { 'error' }
|
9
|
+
|
10
|
+
context 'with default parameters' do
|
11
|
+
subject { described_class.error(message: :message) }
|
12
|
+
|
13
|
+
it 'builds an error' do
|
14
|
+
expect(subject.level).to be :error
|
15
|
+
expect(subject.message).to be :message
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'with default parameters' do
|
20
|
+
subject do
|
21
|
+
described_class.error(
|
22
|
+
message: :message,
|
23
|
+
setting: :setting,
|
24
|
+
filename: :filename,
|
25
|
+
detailed_message: :detailed_message,
|
26
|
+
help_urls: :help_urls
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
let(:filename) { 'filename' }
|
31
|
+
let(:setting) { 'setting' }
|
32
|
+
let(:detailed_message) { 'details' }
|
33
|
+
let(:help_urls) { %w[123 456] }
|
34
|
+
|
35
|
+
it 'builds an error' do
|
36
|
+
expect(subject.level).to be :error
|
37
|
+
expect(subject.message).to be :message
|
38
|
+
expect(subject.setting).to be :setting
|
39
|
+
expect(subject.detailed_message).to be :detailed_message
|
40
|
+
expect(subject.help_urls).to be :help_urls
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '.warning' do
|
45
|
+
let(:message) { 'warning' }
|
46
|
+
|
47
|
+
context 'with default parameters' do
|
48
|
+
subject { described_class.warning(message: :message) }
|
49
|
+
|
50
|
+
it 'builds an error' do
|
51
|
+
expect(subject.level).to be :warning
|
52
|
+
expect(subject.message).to be :message
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#to_hash' do
|
58
|
+
subject { described_class.warning(message: :message) }
|
59
|
+
|
60
|
+
let(:message) { 'warning' }
|
61
|
+
|
62
|
+
it 'returns correct hash' do
|
63
|
+
expect(subject.to_h['level']).to be :warning
|
64
|
+
expect(subject.to_h['message']).to be :message
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -13,7 +13,7 @@ class AgentSetupInitTest < Minitest::Test
|
|
13
13
|
config: {
|
14
14
|
app: 'AppMap Rubygem',
|
15
15
|
present: true,
|
16
|
-
valid:
|
16
|
+
valid: false
|
17
17
|
},
|
18
18
|
project: {
|
19
19
|
agentVersion: AppMap::VERSION,
|
@@ -64,7 +64,7 @@ class AgentSetupInitTest < Minitest::Test
|
|
64
64
|
],
|
65
65
|
properties: {
|
66
66
|
config: {
|
67
|
-
app:
|
67
|
+
app: 'rails6_users_app',
|
68
68
|
present: true,
|
69
69
|
valid: false
|
70
70
|
},
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class AgentSetupValidateTest < Minitest::Test
|
6
|
+
NON_EXISTING_CONFIG_FILENAME = '123.yml'
|
7
|
+
INVALID_YAML_CONFIG_FILENAME = 'spec/fixtures/config/invalid_yaml_config.yml'
|
8
|
+
INVALID_CONFIG_FILENAME = 'spec/fixtures/config/invalid_config.yml'
|
9
|
+
|
10
|
+
def test_init_when_config_exists
|
11
|
+
output = `./exe/appmap-agent-validate`
|
12
|
+
assert_equal 0, $CHILD_STATUS.exitstatus
|
13
|
+
expected = JSON.pretty_generate([
|
14
|
+
{
|
15
|
+
level: :error,
|
16
|
+
message: 'AppMap auto-configuration is currently not available for non Rails projects'
|
17
|
+
}
|
18
|
+
])
|
19
|
+
assert_equal expected, output.strip
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_init_with_non_existing_config_file
|
23
|
+
output = `./exe/appmap-agent-validate -c #{NON_EXISTING_CONFIG_FILENAME}`
|
24
|
+
assert_equal 0, $CHILD_STATUS.exitstatus
|
25
|
+
expected = JSON.pretty_generate([
|
26
|
+
{
|
27
|
+
level: :error,
|
28
|
+
message: 'AppMap auto-configuration is currently not available for non Rails projects'
|
29
|
+
},
|
30
|
+
{
|
31
|
+
level: :error,
|
32
|
+
filename: NON_EXISTING_CONFIG_FILENAME,
|
33
|
+
message: 'AppMap configuration file does not exist'
|
34
|
+
}
|
35
|
+
])
|
36
|
+
assert_equal expected, output.strip
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_init_with_invalid_YAML
|
40
|
+
output = `./exe/appmap-agent-validate -c #{INVALID_YAML_CONFIG_FILENAME}`
|
41
|
+
assert_equal 0, $CHILD_STATUS.exitstatus
|
42
|
+
expected = JSON.pretty_generate([
|
43
|
+
{
|
44
|
+
level: :error,
|
45
|
+
message: 'AppMap auto-configuration is currently not available for non Rails projects'
|
46
|
+
},
|
47
|
+
{
|
48
|
+
level: :error,
|
49
|
+
filename: INVALID_YAML_CONFIG_FILENAME,
|
50
|
+
message: 'AppMap configuration is not valid YAML',
|
51
|
+
detailed_message: "(#{INVALID_YAML_CONFIG_FILENAME}): " \
|
52
|
+
'did not find expected key while parsing a block mapping at line 1 column 1'
|
53
|
+
}
|
54
|
+
])
|
55
|
+
assert_equal expected, output.strip
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_init_with_invalid_data_config
|
59
|
+
output = `./exe/appmap-agent-validate -c #{INVALID_CONFIG_FILENAME}`
|
60
|
+
assert_equal 0, $CHILD_STATUS.exitstatus
|
61
|
+
expected = JSON.pretty_generate([
|
62
|
+
{
|
63
|
+
level: :error,
|
64
|
+
message: 'AppMap auto-configuration is currently not available for non Rails projects'
|
65
|
+
},
|
66
|
+
{
|
67
|
+
level: :error,
|
68
|
+
filename: INVALID_CONFIG_FILENAME,
|
69
|
+
message: 'AppMap configuration could not be loaded',
|
70
|
+
detailed_message: "no implicit conversion of String into Integer"
|
71
|
+
}
|
72
|
+
])
|
73
|
+
assert_equal expected, output.strip
|
74
|
+
end
|
75
|
+
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.61.0
|
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-07-
|
11
|
+
date: 2021-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -296,6 +296,7 @@ email:
|
|
296
296
|
executables:
|
297
297
|
- appmap-agent-init
|
298
298
|
- appmap-agent-status
|
299
|
+
- appmap-agent-validate
|
299
300
|
- appmap-inspect
|
300
301
|
extensions:
|
301
302
|
- ext/appmap/extconf.rb
|
@@ -317,6 +318,7 @@ files:
|
|
317
318
|
- Rakefile
|
318
319
|
- appmap.gemspec
|
319
320
|
- appmap.yml
|
321
|
+
- config-schema.yml
|
320
322
|
- examples/install.rb
|
321
323
|
- examples/mock_webapp/Gemfile
|
322
324
|
- examples/mock_webapp/appmap.yml
|
@@ -326,6 +328,7 @@ files:
|
|
326
328
|
- examples/mock_webapp/lib/mock_webapp/user.rb
|
327
329
|
- exe/appmap-agent-init
|
328
330
|
- exe/appmap-agent-status
|
331
|
+
- exe/appmap-agent-validate
|
329
332
|
- exe/appmap-inspect
|
330
333
|
- ext/appmap/appmap.c
|
331
334
|
- ext/appmap/extconf.rb
|
@@ -334,6 +337,7 @@ files:
|
|
334
337
|
- lib/appmap/class_map.rb
|
335
338
|
- lib/appmap/command/agent_setup/init.rb
|
336
339
|
- lib/appmap/command/agent_setup/status.rb
|
340
|
+
- lib/appmap/command/agent_setup/validate.rb
|
337
341
|
- lib/appmap/command/inspect.rb
|
338
342
|
- lib/appmap/command_error.rb
|
339
343
|
- lib/appmap/config.rb
|
@@ -359,6 +363,8 @@ files:
|
|
359
363
|
- lib/appmap/service/integration_test_path_finder.rb
|
360
364
|
- lib/appmap/service/test_command_provider.rb
|
361
365
|
- lib/appmap/service/test_framework_detector.rb
|
366
|
+
- lib/appmap/service/validator/config_validator.rb
|
367
|
+
- lib/appmap/service/validator/violation.rb
|
362
368
|
- lib/appmap/swagger.rb
|
363
369
|
- lib/appmap/swagger/configuration.rb
|
364
370
|
- lib/appmap/swagger/markdown_descriptions.rb
|
@@ -373,6 +379,7 @@ files:
|
|
373
379
|
- spec/config_spec.rb
|
374
380
|
- spec/fixtures/config/incomplete_config.yml
|
375
381
|
- spec/fixtures/config/invalid_config.yml
|
382
|
+
- spec/fixtures/config/invalid_yaml_config.yml
|
376
383
|
- spec/fixtures/config/valid_config.yml
|
377
384
|
- spec/fixtures/hook/.gitignore
|
378
385
|
- spec/fixtures/hook/app/controllers/api/api_keys_controller.rb
|
@@ -558,11 +565,14 @@ files:
|
|
558
565
|
- spec/record_sql_rails_pg_spec.rb
|
559
566
|
- spec/remote_recording_spec.rb
|
560
567
|
- spec/service/config_analyzer_spec.rb
|
568
|
+
- spec/service/integration_test_path_finder_spec.rb
|
569
|
+
- spec/service/validator/violation_spec.rb
|
561
570
|
- spec/spec_helper.rb
|
562
571
|
- spec/swagger/swagger_spec.rb
|
563
572
|
- spec/util_spec.rb
|
564
573
|
- test/agent_setup_init_test.rb
|
565
574
|
- test/agent_setup_status_test.rb
|
575
|
+
- test/agent_setup_validate_test.rb
|
566
576
|
- test/bundle_vendor_test.rb
|
567
577
|
- test/cucumber_test.rb
|
568
578
|
- test/expectations/openssl_test_key_sign1.json
|