appmap 0.101.0 → 0.102.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: e4d9d1069381257dbf69ca6becafb2bfbbc948039b89060aeb607f73b8992392
4
- data.tar.gz: da3124df4bc13ca45b0ed5c67f57667cf5c9d2773afcd4f5f9bcee4b0bf8aa0a
3
+ metadata.gz: 1df97ff2f7c62ce830193389327e102a89798678350dbc653aecc98157e502cb
4
+ data.tar.gz: ff14a72537014f549a5094b592a6dd28e9a6658679e0c411529d7c4c12491822
5
5
  SHA512:
6
- metadata.gz: 854833429a403e7ae83cfd8eabe76228d273787713aa4d44a829746264044e2a1ab8b4b7620dbc1ba36043c6c6b5128f223d38231ff281d6c48dd1b900cde800
7
- data.tar.gz: f907c847bb4a20a57b6ad0172e289d45ddb08162d526470ae3ee05c3d2f0988b7a820c47335d65c1f399b15cc2a611aeb30e0660a2b0c24ef8f2f880ecc13df2
6
+ metadata.gz: 21781f0d7b9d61d72cd6b442b1105a1eabd19ba07ccca62bb8fd5acaede9e6db2a3cf5594a80c1270ff574d977b709c22031a12a88361cd36fe3013e5238cb03
7
+ data.tar.gz: bcc9fd8526da90172d0f7f159a1c4a61a0245e70d1d800f38b98e1d13f0a35ee26898c064107a0de5eb3f7d11d1eecf98c12df1f14a4c37cb72582a1a6bdcf1d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # [0.102.0](https://github.com/getappmap/appmap-ruby/compare/v0.101.0...v0.102.0) (2023-07-18)
2
+
3
+
4
+ ### Features
5
+
6
+ * Discourage conflicting recording methods ([f86303b](https://github.com/getappmap/appmap-ruby/commit/f86303bf1b62d5131d9ed2c10e01225ec21c1405))
7
+
1
8
  # [0.101.0](https://github.com/getappmap/appmap-ruby/compare/v0.100.0...v0.101.0) (2023-07-17)
2
9
 
3
10
 
@@ -1,13 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'appmap'
4
- require 'appmap/util'
3
+ require_relative '../appmap'
4
+ require_relative './util'
5
+ require_relative './detect_enabled'
5
6
  require 'fileutils'
6
7
 
7
8
  module AppMap
8
9
  module Cucumber
9
10
  APPMAP_OUTPUT_DIR = 'tmp/appmap/cucumber'
10
-
11
+
11
12
  ScenarioAttributes = Struct.new(:name, :feature, :feature_group)
12
13
 
13
14
  ProviderStruct = Struct.new(:scenario) do
@@ -43,11 +44,13 @@ module AppMap
43
44
 
44
45
  class << self
45
46
  def init
47
+ AppMap::DetectEnabled.discourage_conflicting_recording_methods :cucumber
48
+
46
49
  warn 'Configuring AppMap recorder for Cucumber'
47
50
 
48
51
  FileUtils.mkdir_p APPMAP_OUTPUT_DIR
49
52
  end
50
-
53
+
51
54
  def write_scenario(scenario, appmap)
52
55
  appmap['metadata'] = update_metadata(scenario, appmap['metadata'])
53
56
  scenario_filename = AppMap::Util.scenario_filename(appmap['metadata']['name'])
@@ -62,7 +65,7 @@ module AppMap
62
65
  def run
63
66
  init
64
67
  end
65
-
68
+
66
69
  protected
67
70
 
68
71
  def cucumber_version
@@ -9,6 +9,32 @@ module AppMap
9
9
  @@detected_for_method = {}
10
10
 
11
11
  class << self
12
+ def discourage_conflicting_recording_methods(recording_method)
13
+ return if ENV['APPMAP_DISCOURAGE_CONFLICTING_RECORDING_METHODS'] == 'false'
14
+
15
+ return unless enabled?(recording_method.to_sym) && enabled?(:requests)
16
+
17
+ warn Util.color <<~MSG, :yellow
18
+ AppMap recording is enabled for both 'requests' and '#{recording_method}'. This is not recommended
19
+ because the recordings will contain duplicitive information, and in some case may conflict with each other.
20
+ MSG
21
+
22
+ return unless ENV['APPMAP'] == 'true'
23
+
24
+ warn Util.color <<~MSG, :yellow
25
+ The environment contains APPMAP=true, which is not recommended in this application environment because
26
+ it enables all recording methods. Consider letting AppMap detect the appropriate recording method,
27
+ or explicitly enabling only the recording methods you want to use using environment variables like
28
+ APPMAP_RECORD_REQUESTS, APPMAP_RECORD_RSPEC, etc.
29
+
30
+ See https://appmap.io/docs/reference/appmap-ruby.html#advanced-runtime-options for more information.
31
+ MSG
32
+ end
33
+
34
+ def enabled?(recording_method)
35
+ new(recording_method).enabled?
36
+ end
37
+
12
38
  def clear_cache
13
39
  @@detected_for_method = {}
14
40
  end
@@ -19,20 +45,20 @@ module AppMap
19
45
  end
20
46
 
21
47
  def enabled?
22
- unless @@detected_for_method[@recording_method].nil?
23
- return @@detected_for_method[@recording_method]
24
- end
48
+ return @@detected_for_method[@recording_method] unless @@detected_for_method[@recording_method].nil?
25
49
 
26
- raise "Unrecognized recording method: #{@recording_method}" if @recording_method && !AppMap::RECORDING_METHODS.member?(@recording_method)
50
+ if @recording_method && !AppMap::RECORDING_METHODS.member?(@recording_method)
51
+ raise "Unrecognized recording method: #{@recording_method}"
52
+ end
27
53
 
28
54
  message, enabled, enabled_by_env = detect_enabled
29
55
 
30
56
  @@detected_for_method[@recording_method] = enabled
31
57
 
32
- if @recording_method
33
- if enabled && enabled_by_app_env?
34
- warn AppMap::Util.color("AppMap #{@recording_method.nil? ? '' : "#{@recording_method} "}recording is enabled because #{message}", :magenta)
35
- end
58
+ if @recording_method && (enabled && enabled_by_app_env?)
59
+ warn AppMap::Util.color(
60
+ "AppMap #{@recording_method.nil? ? '' : "#{@recording_method} "}recording is enabled because #{message}", :magenta
61
+ )
36
62
  end
37
63
 
38
64
  enabled
@@ -49,48 +75,41 @@ module AppMap
49
75
  ]
50
76
 
51
77
  message, enabled = []
52
- while enabled.nil? && !detection_functions.empty?
53
- message, enabled = method(detection_functions.shift).call
54
- end
78
+ message, enabled = method(detection_functions.shift).call while enabled.nil? && !detection_functions.empty?
55
79
 
56
- unless enabled.nil?
57
- _, enabled_by_env = enabled_by_app_env?
58
- return [ message, enabled, enabled_by_env ]
59
- else
60
- return [ 'it is not enabled by any configuration or framework', false, false ]
61
- end
80
+ return [ 'it is not enabled by any configuration or framework', false, false ] if enabled.nil?
81
+
82
+ _, enabled_by_env = enabled_by_app_env?
83
+ [ message, enabled, enabled_by_env ]
62
84
  end
63
85
 
64
86
  def enabled_by_testing?
65
- if %i[rspec minitest cucumber].member?(@recording_method)
66
- [ "running tests with #{@recording_method}", true ]
67
- end
87
+ return unless %i[rspec minitest cucumber].member?(@recording_method)
88
+
89
+ [ "running tests with #{@recording_method}", true ]
68
90
  end
69
91
 
70
92
  def enabled_by_app_env?
71
93
  env_name, app_env = detect_app_env
72
- if @recording_method.nil?
73
- return [ "#{env_name} is '#{app_env}'", true ] if %w[test development].member?(app_env)
74
- end
94
+ return [ "#{env_name} is '#{app_env}'", true ] if @recording_method.nil? && %w[test development].member?(app_env)
75
95
 
76
- if %i[remote requests].member?(@recording_method)
77
- return [ "#{env_name} is '#{app_env}'", true ] if app_env == 'development'
78
- end
96
+ return unless %i[remote requests].member?(@recording_method)
97
+ return [ "#{env_name} is '#{app_env}'", true ] if app_env == 'development'
79
98
  end
80
99
 
81
100
  def detect_app_env
82
101
  if rails_env
83
- return [ 'RAILS_ENV', rails_env ]
102
+ [ 'RAILS_ENV', rails_env ]
84
103
  elsif ENV['APP_ENV']
85
- return [ 'APP_ENV', ENV['APP_ENV']]
104
+ [ 'APP_ENV', ENV['APP_ENV']]
86
105
  end
87
106
  end
88
107
 
89
108
  def globally_enabled?
90
109
  # Don't auto-enable request recording in the 'test' environment, because users probably don't want
91
110
  # AppMaps of both test cases and requests. Requests recording can always be enabled by APPMAP_RECORD_REQUESTS=true.
92
- requests_recording_in_test = -> () { [ :requests ].member?(@recording_method) && detect_app_env == 'test' }
93
- [ 'APPMAP=true', true ] if ENV['APPMAP'] == 'true' && !requests_recording_in_test.()
111
+ requests_recording_in_test = -> { [ :requests ].member?(@recording_method) && detect_app_env == 'test' }
112
+ [ 'APPMAP=true', true ] if ENV['APPMAP'] == 'true' && !requests_recording_in_test.call
94
113
  end
95
114
 
96
115
  def globally_disabled?
@@ -114,7 +133,7 @@ module AppMap
114
133
  def rails_env
115
134
  return Rails.env if defined?(::Rails::Railtie)
116
135
 
117
- return ENV['RAILS_ENV']
136
+ ENV.fetch('RAILS_ENV', nil)
118
137
  end
119
138
  end
120
139
  end
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'appmap'
4
- require 'appmap/util'
3
+ require_relative '../appmap'
4
+ require_relative './util'
5
+ require_relative './detect_enabled'
5
6
  require 'fileutils'
6
7
  require 'active_support'
7
8
  require 'active_support/core_ext'
@@ -32,7 +33,9 @@ module AppMap
32
33
 
33
34
  def finish(failures, exception)
34
35
  failed = failures.any? || exception
35
- warn "Finishing recording of #{failed ? 'failed ' : ''} test #{test.class}.#{test.name}" if AppMap::Minitest::LOG
36
+ if AppMap::Minitest::LOG
37
+ warn "Finishing recording of #{failed ? 'failed ' : ''} test #{test.class}.#{test.name}"
38
+ end
36
39
  warn "Exception: #{exception}" if exception && AppMap::Minitest::LOG
37
40
 
38
41
  if failed
@@ -78,7 +81,8 @@ module AppMap
78
81
  end
79
82
 
80
83
  def begin_test(test, name)
81
- AppMap.info 'Configuring AppMap recorder for Minitest' if first_recording?
84
+ AppMap::DetectEnabled.discourage_conflicting_recording_methods :minitest if first_recording?
85
+
82
86
  @recording_count += 1
83
87
 
84
88
  @recordings_by_test[test.object_id] = Recording.new(test, name)
@@ -107,24 +111,22 @@ module AppMap
107
111
  m[:frameworks] ||= []
108
112
  m[:frameworks] << {
109
113
  name: 'minitest',
110
- version: Gem.loaded_specs['minitest']&.version&.to_s,
114
+ version: Gem.loaded_specs['minitest']&.version&.to_s
111
115
  }
112
116
  m[:recorder] = {
113
117
  name: 'minitest',
114
- type: 'tests',
118
+ type: 'tests'
115
119
  }
116
120
  m[:test_status] = test_status
117
121
  m[:test_failure] = test_failure if test_failure
118
- if exception
119
- m[:exception] = Util.format_exception(exception)
120
- end
122
+ m[:exception] = Util.format_exception(exception) if exception
121
123
  end
122
124
 
123
125
  appmap = {
124
126
  version: AppMap::APPMAP_FORMAT_VERSION,
125
127
  metadata: metadata,
126
128
  classMap: class_map,
127
- events: events,
129
+ events: events
128
130
  }.compact
129
131
  fname = AppMap::Util.scenario_filename(name)
130
132
 
data/lib/appmap/rspec.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'appmap'
4
- require 'appmap/util'
3
+ require_relative '../appmap'
4
+ require_relative './util'
5
+ require_relative './detect_enabled'
5
6
  require 'set'
6
7
  require 'fileutils'
7
8
 
@@ -161,6 +162,8 @@ module AppMap
161
162
  end
162
163
 
163
164
  def begin_spec(example)
165
+ AppMap::DetectEnabled.discourage_conflicting_recording_methods :rspec if first_recording?
166
+
164
167
  @recording_count += 1
165
168
  # Disable RSpec recording for RSwag, because all the action happens in the before block.
166
169
  # The example is empty except for assertions. So RSwag has its own recorder, and RSpec
@@ -3,7 +3,7 @@
3
3
  module AppMap
4
4
  URL = 'https://github.com/applandinc/appmap-ruby'
5
5
 
6
- VERSION = '0.101.0'
6
+ VERSION = '0.102.0'
7
7
 
8
8
  APPMAP_FORMAT_VERSION = '1.12.0'
9
9
 
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.101.0
4
+ version: 0.102.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Gilpin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-07-17 00:00:00.000000000 Z
11
+ date: 2023-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: method_source