datadog-ci 1.33.0 → 1.35.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.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -2
  3. data/lib/datadog/ci/configuration/components.rb +2 -0
  4. data/lib/datadog/ci/configuration/settings.rb +11 -0
  5. data/lib/datadog/ci/contrib/cucumber/formatter.rb +51 -1
  6. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +5 -0
  7. data/lib/datadog/ci/contrib/minitest/helpers.rb +54 -6
  8. data/lib/datadog/ci/contrib/minitest/runnable.rb +5 -0
  9. data/lib/datadog/ci/contrib/minitest/runnable_minitest_6.rb +5 -0
  10. data/lib/datadog/ci/contrib/minitest/test.rb +21 -27
  11. data/lib/datadog/ci/contrib/patcher.rb +0 -4
  12. data/lib/datadog/ci/contrib/rspec/anonymous_example_name.rb +515 -0
  13. data/lib/datadog/ci/contrib/rspec/example.rb +23 -5
  14. data/lib/datadog/ci/contrib/rspec/example_group.rb +11 -1
  15. data/lib/datadog/ci/contrib/simplecov/result_extractor.rb +9 -1
  16. data/lib/datadog/ci/ext/settings.rb +1 -0
  17. data/lib/datadog/ci/ext/telemetry.rb +1 -0
  18. data/lib/datadog/ci/ext/test.rb +8 -1
  19. data/lib/datadog/ci/remote/library_settings_client.rb +3 -2
  20. data/lib/datadog/ci/source_code/method_inspect.rb +0 -3
  21. data/lib/datadog/ci/test_discovery/component.rb +4 -0
  22. data/lib/datadog/ci/test_impact_analysis/component.rb +176 -59
  23. data/lib/datadog/ci/test_impact_analysis/coverage/event.rb +6 -4
  24. data/lib/datadog/ci/test_impact_analysis/null_component.rb +25 -2
  25. data/lib/datadog/ci/test_impact_analysis/skippable.rb +20 -5
  26. data/lib/datadog/ci/test_impact_analysis/skippable_percentage/estimator.rb +3 -3
  27. data/lib/datadog/ci/test_optimization_cache/readers/legacy.rb +1 -1
  28. data/lib/datadog/ci/test_suite.rb +20 -0
  29. data/lib/datadog/ci/test_tracing/component.rb +10 -0
  30. data/lib/datadog/ci/test_tracing/deprecated_total_coverage_metric.rb +11 -1
  31. data/lib/datadog/ci/utils/configuration.rb +12 -0
  32. data/lib/datadog/ci/utils/test_name.rb +112 -0
  33. data/lib/datadog/ci/version.rb +1 -1
  34. metadata +3 -1
@@ -12,7 +12,7 @@ module Datadog
12
12
  return
13
13
  end
14
14
 
15
- unless ::SimpleCov.running
15
+ unless simplecov_running?
16
16
  Datadog.logger.debug("SimpleCov is not running, skipping code coverage extraction")
17
17
  return
18
18
  end
@@ -30,6 +30,16 @@ module Datadog
30
30
 
31
31
  test_session.set_tag(Ext::Test::TAG_CODE_COVERAGE_LINES_PCT, result.covered_percent)
32
32
  end
33
+
34
+ # SimpleCov 1.0 removed the `running` accessor and relies on Ruby's
35
+ # Coverage.running? instead.
36
+ def self.simplecov_running?
37
+ return ::SimpleCov.running if ::SimpleCov.respond_to?(:running)
38
+ return false unless defined?(::Coverage)
39
+
40
+ ::Coverage.running?
41
+ end
42
+ private_class_method :simplecov_running?
33
43
  end
34
44
  end
35
45
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "../ext/test"
3
4
  require_relative "../git/local_repository"
4
5
 
5
6
  module Datadog
@@ -13,6 +14,17 @@ module Datadog
13
14
  def self.service_name_provided_by_user?
14
15
  !!Datadog.configuration.service_without_fallback
15
16
  end
17
+
18
+ def self.normalize_tia_test_skipping_mode(mode)
19
+ return mode if Ext::Test::TIATestSkippingMode::ALL.include?(mode)
20
+
21
+ Datadog.logger.warn(
22
+ "Invalid Test Impact Analysis skipping mode #{mode.inspect}. " \
23
+ "Falling back to #{Ext::Test::TIATestSkippingMode::TEST.inspect}."
24
+ )
25
+
26
+ Ext::Test::TIATestSkippingMode::TEST
27
+ end
16
28
  end
17
29
  end
18
30
  end
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module CI
5
+ module Utils
6
+ module TestName
7
+ MONTH = "(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"
8
+ WEEKDAY = "(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)"
9
+ CONSTANT_NAME = "[A-Z]\\w*(?:::[A-Z]\\w*)*"
10
+
11
+ DATE_INSPECT_PATTERN = /#<Date(?::[^>\n]*)?>/.freeze
12
+ TIME_INSPECT_PATTERN = /#<(?:DateTime|Time)(?::[^>\n]*)?>/.freeze
13
+ CLASS_INSPECT_PATTERN = /#<Class:(#{CONSTANT_NAME}|0x[0-9a-fA-F]+)(?:\s[^>\n]*)?>/.freeze
14
+ NAMED_OBJECT_INSPECT_PATTERN = /#<(#{CONSTANT_NAME})(?::[^>\n]*)?>/.freeze
15
+ OBJECT_INSPECT_PATTERN = /#<[^>\n]+>/.freeze
16
+ ACTIVE_RECORD_CLASS_INSPECT_PATTERN = /
17
+ \b(#{CONSTANT_NAME})
18
+ (?:
19
+ \s\(call\s'\1\.connection'\sto\ establish\ a\ connection\)
20
+ |
21
+ \(
22
+ (?:\.\.\.\s*)?[a-z_][a-z0-9_]*:\s[^,)\n]*
23
+ (?:
24
+ ,\s(?:\.\.\.\s*)?[a-z_][a-z0-9_]*:\s[^,)\n]*
25
+ )*
26
+ \)
27
+ )
28
+ /x.freeze
29
+
30
+ TIME_PATTERN = /
31
+ \b
32
+ (?:
33
+ \d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?
34
+ (?:\s?(?:Z|UTC|[A-Z]{2,5}|[+-]\d{2}:?\d{2}))?
35
+ |
36
+ #{WEEKDAY},?\s+\d{1,2}\s+#{MONTH}\s+\d{4}\s+\d{2}:\d{2}:\d{2}(?:\.\d+)?
37
+ (?:\s+(?:UTC|[A-Z]{2,5}|[+-]\d{2}:?\d{2}))?
38
+ )
39
+ \b
40
+ /x.freeze
41
+ DATE_PATTERN = /
42
+ \b
43
+ (?:
44
+ \d{4}-\d{2}-\d{2}
45
+ |
46
+ #{WEEKDAY},?\s+\d{1,2}\s+#{MONTH}\s+\d{4}
47
+ )
48
+ \b
49
+ /x.freeze
50
+ RANGE_PATTERN = /
51
+ (^|[^\w.])
52
+ (?:-?\d+(?:\.\d+)?|DATE|TIME|:[a-zA-Z_]\w*|"[^"]*"|'[^']*')
53
+ \s*\.{2,3}\s*
54
+ (?:-?\d+(?:\.\d+)?|DATE|TIME|:[a-zA-Z_]\w*|"[^"]*"|'[^']*')
55
+ (?=$|[^\w.])
56
+ /x.freeze
57
+
58
+ def self.normalize(name)
59
+ return name unless name.is_a?(String)
60
+ return name if name.empty?
61
+
62
+ normalized = name.gsub(DATE_INSPECT_PATTERN, "DATE")
63
+ normalized.gsub!(TIME_INSPECT_PATTERN, "TIME")
64
+ normalized.gsub!(CLASS_INSPECT_PATTERN) do
65
+ class_name = Regexp.last_match(1).to_s
66
+ class_name.start_with?("0x") ? "CLASS" : "CLASS:#{class_name}"
67
+ end
68
+ normalized.gsub!(NAMED_OBJECT_INSPECT_PATTERN) { "OBJECT:#{Regexp.last_match(1)}" }
69
+ normalized.gsub!(OBJECT_INSPECT_PATTERN, "OBJECT")
70
+ normalized.gsub!(ACTIVE_RECORD_CLASS_INSPECT_PATTERN) { Regexp.last_match(1).to_s }
71
+ normalized.gsub!(ARRAY_PATTERN) { |value| array_literal?(value) ? "ARRAY" : value }
72
+ normalized.gsub!(HASH_PATTERN) { |value| hash_literal?(value) ? "HASH" : value }
73
+ normalized.gsub!(TIME_PATTERN, "TIME")
74
+ normalized.gsub!(DATE_PATTERN, "DATE")
75
+ normalized.gsub!(RANGE_PATTERN) { "#{Regexp.last_match(1)}RANGE" }
76
+
77
+ normalized
78
+ rescue => e
79
+ warn_normalization_error(e)
80
+ name
81
+ end
82
+
83
+ ARRAY_PATTERN = /\[[^\[\]\n]{0,300}\]/.freeze
84
+ HASH_PATTERN = /\{[^{}\n]{0,300}\}/.freeze
85
+
86
+ def self.array_literal?(value)
87
+ content = value[1, value.length - 2].to_s.strip
88
+ return true if content.empty?
89
+
90
+ content.include?(",") || content.match?(/\A(?:"|'|:|-?\d|true\b|false\b|nil\b|#<|\[|\{)/)
91
+ end
92
+ private_class_method :array_literal?
93
+
94
+ def self.hash_literal?(value)
95
+ content = value[1, value.length - 2].to_s.strip
96
+ return true if content.empty?
97
+
98
+ content.include?("=>") ||
99
+ content.match?(/(?:\A|,)\s*(?:"[^"]+"|'[^']+'|:[a-zA-Z_]\w*|[a-zA-Z_]\w*)\s*:/)
100
+ end
101
+ private_class_method :hash_literal?
102
+
103
+ def self.warn_normalization_error(error)
104
+ Datadog.logger.warn { "Unable to normalize test name: #{error.class}: #{error.message}" }
105
+
106
+ nil
107
+ end
108
+ private_class_method :warn_normalization_error
109
+ end
110
+ end
111
+ end
112
+ end
@@ -4,7 +4,7 @@ module Datadog
4
4
  module CI
5
5
  module VERSION
6
6
  MAJOR = 1
7
- MINOR = 33
7
+ MINOR = 35
8
8
  PATCH = 0
9
9
  PRE = nil
10
10
  BUILD = nil
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datadog-ci
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.33.0
4
+ version: 1.35.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
@@ -151,6 +151,7 @@ files:
151
151
  - lib/datadog/ci/contrib/parallel_tests/integration.rb
152
152
  - lib/datadog/ci/contrib/parallel_tests/patcher.rb
153
153
  - lib/datadog/ci/contrib/patcher.rb
154
+ - lib/datadog/ci/contrib/rspec/anonymous_example_name.rb
154
155
  - lib/datadog/ci/contrib/rspec/configuration/settings.rb
155
156
  - lib/datadog/ci/contrib/rspec/documentation_formatter.rb
156
157
  - lib/datadog/ci/contrib/rspec/example.rb
@@ -322,6 +323,7 @@ files:
322
323
  - lib/datadog/ci/utils/runtime_tags_overrides.rb
323
324
  - lib/datadog/ci/utils/stateful.rb
324
325
  - lib/datadog/ci/utils/telemetry.rb
326
+ - lib/datadog/ci/utils/test_name.rb
325
327
  - lib/datadog/ci/utils/test_run.rb
326
328
  - lib/datadog/ci/version.rb
327
329
  - lib/datadog/ci/worker.rb