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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 93b0a392f69c9de659a086819d29b2b4c94c4b704d04ac2d57f99cafe56f4f80
4
- data.tar.gz: 4f42ab168f8bb4f1c8500f6f98682d7c048119125ba34aa0ddd80f9a521c7d02
3
+ metadata.gz: 832f968242440a6bac78181dbb49ca1b34d75c37074810df66c3d1b1d546c0cf
4
+ data.tar.gz: 26ffec9cffe15f63dc661563ec7bee9c8b4659a54c0a8888dd797b6253518954
5
5
  SHA512:
6
- metadata.gz: 95538abb1fc5ba05793bba2efc1731a823c324515956aa7b388b04d8b43953f3885d45ca1937d684c0b6e2415fc7fb6d1f591da02ffa0dbc06883c7298d3eb0b
7
- data.tar.gz: 48d7105b1ced68d2ddd9229b2811b0d157ca60b879b8d781e014cf02ca512147c33a95b4a52e49216e5fbf47b3fc7fafa19fa25d00a57506872ab1a3ef71651f
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
- @config.to_h[:name] if present?
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
- present? && @config.to_h.key?(:name) && @config.to_h.key?(:packages)
23
+ config_validator.valid?
23
24
  end
24
25
 
25
26
  private
26
27
 
27
- def load_config
28
- AppMap::Config.load_from_file @config_file if present?
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
@@ -3,10 +3,13 @@
3
3
  module AppMap
4
4
  URL = 'https://github.com/applandinc/appmap-ruby'
5
5
 
6
- VERSION = '0.59.2'
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: -123- %
2
- packages: ~{}~ ''
1
+ name: name
2
+ packages: [1,2,3]
@@ -0,0 +1,3 @@
1
+ name:
2
+ -
3
+ packages: "[]" asd
@@ -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/invalid_config.yml'}
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
@@ -64,7 +64,7 @@ class AgentSetupInitTest < Minitest::Test
64
64
  ],
65
65
  properties: {
66
66
  config: {
67
- app: nil,
67
+ app: 'rails6_users_app',
68
68
  present: true,
69
69
  valid: false
70
70
  },
@@ -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.59.2
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