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 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