appmap 0.59.2 → 0.60.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 +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
|