appmap 0.59.2 → 0.60.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 +8 -0
- data/exe/appmap-agent-validate +19 -0
- data/lib/appmap/command/agent_setup/validate.rb +24 -0
- data/lib/appmap/service/config_analyzer.rb +7 -8
- data/lib/appmap/service/validator/config_validator.rb +80 -0
- data/lib/appmap/service/validator/violation.rb +50 -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 +1 -1
- data/spec/service/validator/violation_spec.rb +68 -0
- data/test/agent_setup_status_test.rb +1 -1
- data/test/agent_setup_validate_test.rb +58 -0
- metadata +9 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 832f968242440a6bac78181dbb49ca1b34d75c37074810df66c3d1b1d546c0cf
|
4
|
+
data.tar.gz: 26ffec9cffe15f63dc661563ec7bee9c8b4659a54c0a8888dd797b6253518954
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '09eb7e68782f397a59a960ba617af180ee2d0746316db9b7d2c4cd011755e815205a5b484d0a90cd19224ab7f4be7231a96c664ea87e962c02372e155088cc82'
|
7
|
+
data.tar.gz: eea1765efb3ab76716d7c8c74f9f7b9d860923d815dab0bd003ecf8f07dc62ac6d3660e43ba0576b615bd6de094156e14e8a5be876dfe3851d4dc2c95cd82368
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
# [0.60.0](https://github.com/applandinc/appmap-ruby/compare/v0.59.2...v0.60.0) (2021-07-08)
|
2
|
+
|
3
|
+
|
4
|
+
### Features
|
5
|
+
|
6
|
+
* add agent-setup-validate command ([d9b3bc1](https://github.com/applandinc/appmap-ruby/commit/d9b3bc15e01bf89994aa67b0256dd69b9983be76))
|
7
|
+
* validate ruby version (+ better config loading validation) ([1756e6c](https://github.com/applandinc/appmap-ruby/commit/1756e6c30b5c44a033c23eb47c27c56732d12470))
|
8
|
+
|
1
9
|
## [0.59.2](https://github.com/applandinc/appmap-ruby/compare/v0.59.1...v0.59.2) (2021-07-08)
|
2
10
|
|
3
11
|
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -0,0 +1,80 @@
|
|
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_config_presence
|
23
|
+
parse_config
|
24
|
+
validate_config_load
|
25
|
+
@violations.empty?
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def present?
|
31
|
+
File.exist?(@config_file)
|
32
|
+
end
|
33
|
+
|
34
|
+
def parse_config
|
35
|
+
return unless present?
|
36
|
+
|
37
|
+
@config_data ||= YAML.load_file(@config_file)
|
38
|
+
rescue Psych::SyntaxError => e
|
39
|
+
@violations << Violation.error(
|
40
|
+
filename: @config_file,
|
41
|
+
message: 'AppMap configuration is not valid YAML',
|
42
|
+
detailed_message: e.message
|
43
|
+
)
|
44
|
+
nil
|
45
|
+
end
|
46
|
+
|
47
|
+
def validate_config_load
|
48
|
+
return unless @config_data
|
49
|
+
|
50
|
+
AppMap::Config.load(@config_data)
|
51
|
+
rescue StandardError => e
|
52
|
+
@violations << Violation.error(
|
53
|
+
filename: @config_file,
|
54
|
+
message: 'AppMap configuration could not be loaded',
|
55
|
+
detailed_message: e.message
|
56
|
+
)
|
57
|
+
nil
|
58
|
+
end
|
59
|
+
|
60
|
+
def validate_config_presence
|
61
|
+
unless present?
|
62
|
+
@violations << Violation.error(
|
63
|
+
filename: @config_file,
|
64
|
+
message: 'AppMap configuration file does not exist'
|
65
|
+
)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def validate_ruby_version
|
70
|
+
unless RUBY_VERSION =~ AppMap::SUPPORTED_RUBY_VERSIONS_REGEX
|
71
|
+
@violations << Violation.error(
|
72
|
+
message: "AppMap does not support Ruby #{RUBY_VERSION}. " \
|
73
|
+
"Supported versions are: #{AppMap::SUPPORTED_RUBY_VERSIONS.join(', ')}."
|
74
|
+
)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
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/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.60.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]
|
@@ -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
|
@@ -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
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'test_helper'
|
5
|
+
|
6
|
+
class AgentSetupValidateTest < Minitest::Test
|
7
|
+
NON_EXISTING_CONFIG_FILENAME = '123.yml'
|
8
|
+
INVALID_YAML_CONFIG_FILENAME = 'spec/fixtures/config/invalid_yaml_config.yml'
|
9
|
+
INVALID_CONFIG_FILENAME = 'spec/fixtures/config/invalid_config.yml'
|
10
|
+
|
11
|
+
def test_init_when_config_exists
|
12
|
+
output = `./exe/appmap-agent-validate`
|
13
|
+
assert_equal 0, $CHILD_STATUS.exitstatus
|
14
|
+
assert_equal JSON.pretty_generate([]), output.strip
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_init_with_non_existing_config_file
|
18
|
+
output = `./exe/appmap-agent-validate -c #{NON_EXISTING_CONFIG_FILENAME}`
|
19
|
+
assert_equal 0, $CHILD_STATUS.exitstatus
|
20
|
+
expected = JSON.pretty_generate([
|
21
|
+
{
|
22
|
+
level: :error,
|
23
|
+
filename: NON_EXISTING_CONFIG_FILENAME,
|
24
|
+
message: 'AppMap configuration file does not exist'
|
25
|
+
}
|
26
|
+
])
|
27
|
+
assert_equal expected, output.strip
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_init_with_invalid_YAML
|
31
|
+
output = `./exe/appmap-agent-validate -c #{INVALID_YAML_CONFIG_FILENAME}`
|
32
|
+
assert_equal 0, $CHILD_STATUS.exitstatus
|
33
|
+
expected = JSON.pretty_generate([
|
34
|
+
{
|
35
|
+
level: :error,
|
36
|
+
filename: INVALID_YAML_CONFIG_FILENAME,
|
37
|
+
message: 'AppMap configuration is not valid YAML',
|
38
|
+
detailed_message: "(#{INVALID_YAML_CONFIG_FILENAME}): " \
|
39
|
+
'did not find expected key while parsing a block mapping at line 1 column 1'
|
40
|
+
}
|
41
|
+
])
|
42
|
+
assert_equal expected, output.strip
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_init_with_invalid_data_config
|
46
|
+
output = `./exe/appmap-agent-validate -c #{INVALID_CONFIG_FILENAME}`
|
47
|
+
assert_equal 0, $CHILD_STATUS.exitstatus
|
48
|
+
expected = JSON.pretty_generate([
|
49
|
+
{
|
50
|
+
level: :error,
|
51
|
+
filename: INVALID_CONFIG_FILENAME,
|
52
|
+
message: 'AppMap configuration could not be loaded',
|
53
|
+
detailed_message: "no implicit conversion of String into Integer"
|
54
|
+
}
|
55
|
+
])
|
56
|
+
assert_equal expected, output.strip
|
57
|
+
end
|
58
|
+
end
|
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.60.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Gilpin
|
@@ -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
|
@@ -327,6 +328,7 @@ files:
|
|
327
328
|
- examples/mock_webapp/lib/mock_webapp/user.rb
|
328
329
|
- exe/appmap-agent-init
|
329
330
|
- exe/appmap-agent-status
|
331
|
+
- exe/appmap-agent-validate
|
330
332
|
- exe/appmap-inspect
|
331
333
|
- ext/appmap/appmap.c
|
332
334
|
- ext/appmap/extconf.rb
|
@@ -335,6 +337,7 @@ files:
|
|
335
337
|
- lib/appmap/class_map.rb
|
336
338
|
- lib/appmap/command/agent_setup/init.rb
|
337
339
|
- lib/appmap/command/agent_setup/status.rb
|
340
|
+
- lib/appmap/command/agent_setup/validate.rb
|
338
341
|
- lib/appmap/command/inspect.rb
|
339
342
|
- lib/appmap/command_error.rb
|
340
343
|
- lib/appmap/config.rb
|
@@ -360,6 +363,8 @@ files:
|
|
360
363
|
- lib/appmap/service/integration_test_path_finder.rb
|
361
364
|
- lib/appmap/service/test_command_provider.rb
|
362
365
|
- lib/appmap/service/test_framework_detector.rb
|
366
|
+
- lib/appmap/service/validator/config_validator.rb
|
367
|
+
- lib/appmap/service/validator/violation.rb
|
363
368
|
- lib/appmap/swagger.rb
|
364
369
|
- lib/appmap/swagger/configuration.rb
|
365
370
|
- lib/appmap/swagger/markdown_descriptions.rb
|
@@ -374,6 +379,7 @@ files:
|
|
374
379
|
- spec/config_spec.rb
|
375
380
|
- spec/fixtures/config/incomplete_config.yml
|
376
381
|
- spec/fixtures/config/invalid_config.yml
|
382
|
+
- spec/fixtures/config/invalid_yaml_config.yml
|
377
383
|
- spec/fixtures/config/valid_config.yml
|
378
384
|
- spec/fixtures/hook/.gitignore
|
379
385
|
- spec/fixtures/hook/app/controllers/api/api_keys_controller.rb
|
@@ -559,11 +565,13 @@ files:
|
|
559
565
|
- spec/record_sql_rails_pg_spec.rb
|
560
566
|
- spec/remote_recording_spec.rb
|
561
567
|
- spec/service/config_analyzer_spec.rb
|
568
|
+
- spec/service/validator/violation_spec.rb
|
562
569
|
- spec/spec_helper.rb
|
563
570
|
- spec/swagger/swagger_spec.rb
|
564
571
|
- spec/util_spec.rb
|
565
572
|
- test/agent_setup_init_test.rb
|
566
573
|
- test/agent_setup_status_test.rb
|
574
|
+
- test/agent_setup_validate_test.rb
|
567
575
|
- test/bundle_vendor_test.rb
|
568
576
|
- test/cucumber_test.rb
|
569
577
|
- test/expectations/openssl_test_key_sign1.json
|