appmap 0.57.0 → 0.59.2

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: 442ca8673e42cd8bea0db1ba97a533e7a38965f3d27707bd8e4379b578ee85cb
4
- data.tar.gz: 1174d299f1446c8c3e16403437682196ce794bad27b7c6dd69d712f9bd59e36a
3
+ metadata.gz: 93b0a392f69c9de659a086819d29b2b4c94c4b704d04ac2d57f99cafe56f4f80
4
+ data.tar.gz: 4f42ab168f8bb4f1c8500f6f98682d7c048119125ba34aa0ddd80f9a521c7d02
5
5
  SHA512:
6
- metadata.gz: 73bb23b5ac1401565c57ffbd833fe266ddebfe71271926ca0afaa08b92c88ffd47f5c92f6e91f213b8066729e6607a1b0f99731449eecf7bd68ab125a0f5de3f
7
- data.tar.gz: f72d956ed6c6a46aebe12724a910d5cbdec1aee3d8b61f300e8b2a679873b25db245cca4407c02a03df1588fd3734d616472aed69c2741898e60bc04f6d04b33
6
+ metadata.gz: 95538abb1fc5ba05793bba2efc1731a823c324515956aa7b388b04d8b43953f3885d45ca1937d684c0b6e2415fc7fb6d1f591da02ffa0dbc06883c7298d3eb0b
7
+ data.tar.gz: 48d7105b1ced68d2ddd9229b2811b0d157ca60b879b8d781e014cf02ca512147c33a95b4a52e49216e5fbf47b3fc7fafa19fa25d00a57506872ab1a3ef71651f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,38 @@
1
+ ## [0.59.2](https://github.com/applandinc/appmap-ruby/compare/v0.59.1...v0.59.2) (2021-07-08)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Remove improper reliance on Rails 'try' ([c6b5b16](https://github.com/applandinc/appmap-ruby/commit/c6b5b16a6963988e20bab5f88b99401e25691f3c))
7
+
8
+ ## [0.59.1](https://github.com/applandinc/appmap-ruby/compare/v0.59.0...v0.59.1) (2021-07-08)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * Events may be constructed in stages ([b0b23f5](https://github.com/applandinc/appmap-ruby/commit/b0b23f59a84158b8162424b84430894fe4278324))
14
+
15
+ # [0.59.0](https://github.com/applandinc/appmap-ruby/compare/v0.58.0...v0.59.0) (2021-07-07)
16
+
17
+
18
+ ### Features
19
+
20
+ * define commands as objects ([1b43203](https://github.com/applandinc/appmap-ruby/commit/1b432039040277e1b5349cc2f75aa436238ea873))
21
+
22
+ # [0.58.0](https://github.com/applandinc/appmap-ruby/compare/v0.57.1...v0.58.0) (2021-07-06)
23
+
24
+
25
+ ### Features
26
+
27
+ * Add `test_commands` sections to `appmap-agent-status` executable ([4cd8fe5](https://github.com/applandinc/appmap-ruby/commit/4cd8fe58acb4af72b7818db96de9e479562b9ea0))
28
+
29
+ ## [0.57.1](https://github.com/applandinc/appmap-ruby/compare/v0.57.0...v0.57.1) (2021-07-02)
30
+
31
+
32
+ ### Bug Fixes
33
+
34
+ * rename agentVersionPorject to agentVersion ([905fc5d](https://github.com/applandinc/appmap-ruby/commit/905fc5dd643411deb94f8a1087bcdb3a562d218a))
35
+
1
36
  # [0.57.0](https://github.com/applandinc/appmap-ruby/compare/v0.56.0...v0.57.0) (2021-06-29)
2
37
 
3
38
 
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
@@ -2,6 +2,8 @@
2
2
 
3
3
  require 'json'
4
4
  require 'appmap/service/config_analyzer'
5
+ require 'appmap/service/integration_test_path_finder'
6
+ require 'appmap/service/test_command_provider'
5
7
 
6
8
  module AppMap
7
9
  module Command
@@ -11,22 +13,23 @@ module AppMap
11
13
  class Status < StatusStruct
12
14
  def perform
13
15
  status = {
14
- :properties => {
15
- :config => {
16
- :app => config_analyzer.app_name,
17
- :present => config_analyzer.present?,
18
- :valid => config_analyzer.valid?
16
+ test_commands: Service::TestCommandProvider.all,
17
+ properties: {
18
+ config: {
19
+ app: config_analyzer.app_name,
20
+ present: config_analyzer.present?,
21
+ valid: config_analyzer.valid?
19
22
  },
20
- :project => {
21
- :agentVersionProject => AppMap::VERSION,
22
- :language => 'ruby',
23
- :remoteRecordingCapable => Gem.loaded_specs.has_key?('rails'),
24
- :integrationTests => false #TODO
23
+ project: {
24
+ agentVersion: AppMap::VERSION,
25
+ language: 'ruby',
26
+ remoteRecordingCapable: Gem.loaded_specs.has_key?('rails'),
27
+ integrationTests: Service::IntegrationTestPathFinder.count_paths > 0
25
28
  }
26
29
  }
27
30
  }
28
31
 
29
- puts status.to_json
32
+ puts JSON.pretty_generate(status)
30
33
  end
31
34
 
32
35
  private
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.try(:[], 0)
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
- h.compact
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
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'appmap/service/test_framework_detector'
4
+
5
+ module AppMap
6
+ module Service
7
+ class IntegrationTestPathFinder
8
+ class << self
9
+ def find
10
+ @paths ||= begin
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
18
+
19
+ def count_paths
20
+ find.flatten(2).length - 3
21
+ end
22
+
23
+ private
24
+
25
+ def find_rspec_paths
26
+ find_non_empty_paths(%w[spec/controllers spec/requests spec/integration spec/api spec/features spec/system])
27
+ end
28
+
29
+
30
+ def find_minitest_paths
31
+ find_non_empty_paths(%w[test/controllers test/integration])
32
+ end
33
+
34
+ def find_cucumber_paths
35
+ find_non_empty_paths(%w[features])
36
+ end
37
+
38
+ def find_non_empty_paths(paths)
39
+ paths.select { |path| Dir.exist?(path) && !Dir.empty?(path) }
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'appmap/service/test_framework_detector'
4
+ require 'appmap/service/integration_test_path_finder'
5
+
6
+ module AppMap
7
+ module Service
8
+ class TestCommandProvider
9
+ class << self
10
+ def all
11
+ commands = []
12
+
13
+ if TestFrameworkDetector.rspec_present? && !integration_test_paths[:rspec].empty?
14
+ commands << {
15
+ framework: :rspec,
16
+ command: {
17
+ program: 'bundle',
18
+ args: %w[exec rspec] + integration_test_paths[:rspec].map { |path| "./#{path}" },
19
+ environment: {
20
+ APPMAP: 'true'
21
+ }
22
+ }
23
+ }
24
+ end
25
+
26
+ if TestFrameworkDetector.minitest_present? && !integration_test_paths[:minitest].empty?
27
+ commands += minitest_commands
28
+ end
29
+ if TestFrameworkDetector.cucumber_present? && !integration_test_paths[:cucumber].empty?
30
+ commands << {
31
+ framework: :cucumber,
32
+ command: {
33
+ program: 'bundle',
34
+ args: %w[exec cucumber],
35
+ environment: { APPMAP: 'true' }
36
+ }
37
+ }
38
+ end
39
+
40
+ commands
41
+ end
42
+
43
+ private
44
+
45
+ def minitest_commands
46
+ if Gem.loaded_specs.has_key?('rails')
47
+ [
48
+ {
49
+ framework: :minitest,
50
+ command: {
51
+ program: 'bundle',
52
+ args: %w[exec rails test] + integration_test_paths[:minitest].map { |path| "./#{path}" },
53
+ environment: { APPMAP: 'true' }
54
+ }
55
+ }
56
+ ]
57
+ else
58
+ integration_test_paths[:minitest].map do |path|
59
+ {
60
+ framework: :minitest,
61
+ command: {
62
+ program: 'bundle',
63
+ args: ['exec', 'ruby', "./#{path}"],
64
+ environment: { APPMAP: 'true' }
65
+ }
66
+ }
67
+ end
68
+ end
69
+ end
70
+
71
+ def integration_test_paths
72
+ @paths ||= Service::IntegrationTestPathFinder.find
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AppMap
4
+ module Service
5
+ class TestFrameworkDetector
6
+ class << self
7
+ def rspec_present?
8
+ Gem.loaded_specs.has_key?('rspec-core')
9
+ end
10
+
11
+ def minitest_present?
12
+ Gem.loaded_specs.has_key?('minitest')
13
+ end
14
+
15
+ def cucumber_present?
16
+ Gem.loaded_specs.has_key?('cucumber')
17
+ end
18
+ end
19
+ end
20
+ end
21
+ 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
@@ -3,7 +3,7 @@
3
3
  module AppMap
4
4
  URL = 'https://github.com/applandinc/appmap-ruby'
5
5
 
6
- VERSION = '0.57.0'
6
+ VERSION = '0.59.2'
7
7
 
8
8
  APPMAP_FORMAT_VERSION = '1.5.1'
9
9
 
@@ -0,0 +1,10 @@
1
+ # minitest_calc_test_unit_format_spec.rb
2
+
3
+ require "minitest/autorun"
4
+
5
+ class FunctionalCalcTest < Minitest::Test
6
+ def test_add
7
+ puts 'functional'
8
+ assert_equal 2 + 2, 4
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ # minitest_calc_test_unit_format_spec.rb
2
+
3
+ require "minitest/autorun"
4
+
5
+ class IntegrationCalcTest < Minitest::Test
6
+ class CalcTest < Minitest::Test
7
+ def test_add
8
+ puts 'integration'
9
+ assert_equal 2 + 2, 4
10
+ end
11
+ end
12
+ end
@@ -4,24 +4,78 @@
4
4
  require 'test_helper'
5
5
 
6
6
  class AgentSetupInitTest < Minitest::Test
7
- def test_status
7
+ def test_status_gem
8
8
  output = `./exe/appmap-agent-status`
9
9
  assert_equal 0, $CHILD_STATUS.exitstatus
10
10
  expected = {
11
- :properties => {
12
- :config => {
13
- :app => 'AppMap Rubygem',
14
- :present => true,
15
- :valid => true
11
+ test_commands: [],
12
+ properties: {
13
+ config: {
14
+ app: 'AppMap Rubygem',
15
+ present: true,
16
+ valid: true
16
17
  },
17
- :project => {
18
- :agentVersionProject => AppMap::VERSION,
19
- :language => 'ruby',
20
- :remoteRecordingCapable => false,
21
- :integrationTests => false
18
+ project: {
19
+ agentVersion: AppMap::VERSION,
20
+ language: 'ruby',
21
+ remoteRecordingCapable: false,
22
+ integrationTests: false
22
23
  }
23
24
  }
24
- }.to_json
25
- assert_equal expected, output.strip
25
+ }
26
+ assert_equal JSON.pretty_generate(expected), output.strip
27
+ end
28
+
29
+ def test_status_rails_app
30
+ output = `cd spec/fixtures/rails6_users_app && bundle exec ../../../exe/appmap-agent-status`
31
+ assert_equal 0, $CHILD_STATUS.exitstatus
32
+ expected = {
33
+ test_commands: [
34
+ {
35
+ framework: :rspec,
36
+ command: {
37
+ program: 'bundle',
38
+ args: %w[exec rspec ./spec/controllers],
39
+ environment: {
40
+ APPMAP: 'true'
41
+ }
42
+ }
43
+ },
44
+ {
45
+ framework: :minitest,
46
+ command: {
47
+ program: 'bundle',
48
+ args: %w[exec ruby ./test/controllers],
49
+ environment: {
50
+ APPMAP: 'true'
51
+ }
52
+ }
53
+ },
54
+ {
55
+ framework: :minitest,
56
+ command: {
57
+ program: 'bundle',
58
+ args: %w[exec ruby ./test/integration],
59
+ environment: {
60
+ APPMAP: 'true'
61
+ }
62
+ }
63
+ }
64
+ ],
65
+ properties: {
66
+ config: {
67
+ app: nil,
68
+ present: true,
69
+ valid: false
70
+ },
71
+ project: {
72
+ agentVersion: AppMap::VERSION,
73
+ language: 'ruby',
74
+ remoteRecordingCapable: false,
75
+ integrationTests: true
76
+ }
77
+ }
78
+ }
79
+ assert_equal JSON.pretty_generate(expected), output.strip
26
80
  end
27
81
  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.57.0
4
+ version: 0.59.2
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-06-29 00:00:00.000000000 Z
11
+ date: 2021-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -317,6 +317,7 @@ files:
317
317
  - Rakefile
318
318
  - appmap.gemspec
319
319
  - appmap.yml
320
+ - config-schema.yml
320
321
  - examples/install.rb
321
322
  - examples/mock_webapp/Gemfile
322
323
  - examples/mock_webapp/appmap.yml
@@ -356,6 +357,9 @@ files:
356
357
  - lib/appmap/rspec.rb
357
358
  - lib/appmap/service/config_analyzer.rb
358
359
  - lib/appmap/service/guesser.rb
360
+ - lib/appmap/service/integration_test_path_finder.rb
361
+ - lib/appmap/service/test_command_provider.rb
362
+ - lib/appmap/service/test_framework_detector.rb
359
363
  - lib/appmap/swagger.rb
360
364
  - lib/appmap/swagger/configuration.rb
361
365
  - lib/appmap/swagger/markdown_descriptions.rb
@@ -543,6 +547,8 @@ files:
543
547
  - spec/fixtures/rails6_users_app/spec/models/user_spec.rb
544
548
  - spec/fixtures/rails6_users_app/spec/rails_helper.rb
545
549
  - spec/fixtures/rails6_users_app/spec/spec_helper.rb
550
+ - spec/fixtures/rails6_users_app/test/controllers/functional_calc_test.rb
551
+ - spec/fixtures/rails6_users_app/test/integration/integration_calc_test.rb
546
552
  - spec/fixtures/rails6_users_app/users_app/.gitignore
547
553
  - spec/hook_spec.rb
548
554
  - spec/open_spec.rb