diff --git a/.gitignore b/.gitignore index 68740aeb..051d7715 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,11 @@ Gemfile-*.lock .ruby-version .DS_Store /test.rb + +# Native extension binaries +lib/**/*.bundle +lib/**/*.so +lib/**/*.o +lib/**/*.dylib +lib/**/*.dll + diff --git a/.standard.yml b/.standard.yml index fd66eadf..3240abdd 100644 --- a/.standard.yml +++ b/.standard.yml @@ -1,7 +1,7 @@ -ruby_version: 2.1 +ruby_version: 2.7 format: progress ignore: - 'gemfiles/**/*' - 'tasks/**/*' - - 'yard/**/*' \ No newline at end of file + - 'yard/**/*' diff --git a/.standard_todo.yml b/.standard_todo.yml index 63304fc5..2d9ee0b5 100644 --- a/.standard_todo.yml +++ b/.standard_todo.yml @@ -4,14 +4,6 @@ ignore: - lib/datadog/ci/test_visibility/serializers/base.rb: - Style/HashExcept - - lib/datadog/ci/contrib/minitest/integration.rb: - - Style/SafeNavigation - - lib/datadog/ci/contrib/cucumber/integration.rb: - - Style/SafeNavigation - - lib/datadog/ci/contrib/rspec/integration.rb: - - Style/SafeNavigation - - lib/datadog/ci/ext/environment.rb: - - Style/SafeNavigation - spec/support/log_helpers.rb: - Performance/UnfreezeString - Appraisals: diff --git a/CHANGELOG.md b/CHANGELOG.md index a3e50136..802cce16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ ## [Unreleased] +## [1.0.0.beta1] - 2024-03-25 + +### Added + +* datadog-cov native extension for per test code coverage ([#137]) +* citestcov transport to serialize and send code coverage events ([#148]) + +### Removed + +* Ruby 2.1-2.6 support is dropped + ## [0.8.3] - 2024-03-20 ### Fixed @@ -188,6 +199,7 @@ Currently test suite level visibility is not used by our instrumentation: it wil * Ruby versions < 2.7 no longer supported ([#8][]) [Unreleased]: https://github.com/DataDog/datadog-ci-rb/compare/v0.8.3...main +[1.0.0.beta1]: https://github.com/DataDog/datadog-ci-rb/compare/v0.8.3...v1.0.0.beta1 [0.8.3]: https://github.com/DataDog/datadog-ci-rb/compare/v0.8.2...v0.8.3 [0.8.2]: https://github.com/DataDog/datadog-ci-rb/compare/v0.8.1...v0.8.2 [0.8.1]: https://github.com/DataDog/datadog-ci-rb/compare/v0.8.0...v0.8.1 @@ -258,7 +270,9 @@ Currently test suite level visibility is not used by our instrumentation: it wil [#123]: https://github.com/DataDog/datadog-ci-rb/issues/123 [#131]: https://github.com/DataDog/datadog-ci-rb/issues/131 [#134]: https://github.com/DataDog/datadog-ci-rb/issues/134 +[#137]: https://github.com/DataDog/datadog-ci-rb/issues/137 [#139]: https://github.com/DataDog/datadog-ci-rb/issues/139 [#141]: https://github.com/DataDog/datadog-ci-rb/issues/141 [#142]: https://github.com/DataDog/datadog-ci-rb/issues/142 [#145]: https://github.com/DataDog/datadog-ci-rb/issues/145 +[#148]: https://github.com/DataDog/datadog-ci-rb/issues/148 diff --git a/Gemfile b/Gemfile index c3275d07..61e871ec 100644 --- a/Gemfile +++ b/Gemfile @@ -5,13 +5,13 @@ source "https://rubygems.org" # Specify your gem's dependencies in datadog-ci.gemspec gemspec -# needed to run tests, always present at runtime -gem "ddtrace" - gem "pry" gem "rake" gem "os" +# To compile native extensions +gem "rake-compiler" + gem "climate_control" gem "rspec" diff --git a/LICENSE-3rdparty.csv b/LICENSE-3rdparty.csv index 0abe6b1b..988877b9 100644 --- a/LICENSE-3rdparty.csv +++ b/LICENSE-3rdparty.csv @@ -1,3 +1,3 @@ Component,Origin,License,Copyright -dd-trace-rb,https://github.com/DataDog/dd-trace-rb,Apache 2.0,"Copyright 2016-Present Datadog, Inc." +datadog,https://github.com/DataDog/dd-trace-rb,Apache 2.0,"Copyright 2016-Present Datadog, Inc." msgpack,https://rubygems.org/gems/msgpack,Apache-2.0,"Copyright (c) 2008-2015 Sadayuki Furuhashi" diff --git a/README.md b/README.md index d90a4b1d..13196129 100644 --- a/README.md +++ b/README.md @@ -8,17 +8,14 @@ Datadog's Ruby Library for instrumenting your test and continuous integration pipeline. Learn more on our [official website](https://docs.datadoghq.com/tests/) and check out our [documentation for this library](https://docs.datadoghq.com/tests/setup/ruby/?tab=cloudciprovideragentless). -> [!IMPORTANT] -> The `datadog-ci` gem is currently a component of [`ddtrace`](https://github.com/datadog/dd-trace-rb) and should not be used without it. -> -> We expect this to change in the future. - ## Installation Add to your Gemfile. ```ruby -gem "ddtrace" +group :test do + gem "datadog-ci" +end ``` ## Usage @@ -52,7 +49,6 @@ end | --- | ----------- | ------- | | `enabled` | Defines whether RSpec tests should be traced. Useful for temporarily disabling tracing. `true` or `false` | `true` | | `service_name` | Service name used for `rspec` instrumentation. | `'rspec'` | -| `operation_name` | *DEPRECATED, to be removed in 1.0* Operation name used for `rspec` instrumentation (has no effect in agentless mode or when using newer agent versions). | `'rspec.example'` | ### Minitest @@ -104,7 +100,6 @@ end | --- | ----------- | ------- | | `enabled` | Defines whether Minitest tests should be traced. Useful for temporarily disabling tracing. `true` or `false` | `true` | | `service_name` | Service name used for `minitest` instrumentation. | `'minitest'` | -| `operation_name` | *DEPRECATED, to be removed in 1.0* Operation name used for `minitest` instrumentation (has no effect in agentless mode or when using newer agent versions). | `'minitest.test'` | ### Cucumber @@ -135,7 +130,6 @@ end | --- | ----------- | ------- | | `enabled` | Defines whether Cucumber tests should be traced. Useful for temporarily disabling tracing. `true` or `false` | `true` | | `service_name` | Service name used for `cucumber` instrumentation. | `'cucumber'` | -| `operation_name` | *DEPRECATED, to be removed in 1.0* Operation name used for `cucumber` instrumentation (has no effect in agentless mode or when using newer agent versions). | `'cucumber.test'` | ## Agentless mode diff --git a/Rakefile b/Rakefile index 6dd64737..8038289a 100644 --- a/Rakefile +++ b/Rakefile @@ -5,6 +5,7 @@ require_relative "lib/datadog/ci/version" require "bundler/gem_tasks" require "rspec/core/rake_task" require "yard" +require "rake/extensiontask" RSpec::Core::RakeTask.new(:spec) @@ -107,8 +108,12 @@ end namespace :spec do desc "" # "Explicitly hiding from `rake -T`" RSpec::Core::RakeTask.new(:main) do |t, args| - t.pattern = "spec/**/*_spec.rb" - t.exclude_pattern = "spec/**/{contrib}/**/*_spec.rb," + t.pattern = if RUBY_ENGINE == "jruby" + "spec/datadog/**/*_spec.rb" + else + "spec/datadog/**/*_spec.rb,spec/ddcov/**/*_spec.rb" + end + t.exclude_pattern = "spec/datadog/**/{contrib}/**/*_spec.rb," t.rspec_opts = args.to_a.join(" ") end @@ -132,3 +137,18 @@ end desc "CI task; it runs all tests for current version of Ruby" task ci: "test:all" + +# native extensions +Rake::ExtensionTask.new("datadog_cov.#{RUBY_VERSION}_#{RUBY_PLATFORM}") do |ext| + ext.ext_dir = "ext/datadog_cov" +end + +task :compile_ext do + if RUBY_ENGINE == "ruby" + Rake::Task[:clean].invoke + Rake::Task[:compile].invoke + end +end + +# run compile before any tests are run +Rake::Task["test:all"].prerequisite_tasks.each { |t| t.enhance([:compile_ext]) } diff --git a/Steepfile b/Steepfile index a9861c22..6571d23e 100644 --- a/Steepfile +++ b/Steepfile @@ -12,6 +12,10 @@ target :lib do library "minitest" library "net-http" library "zlib" + library "securerandom" + library "tmpdir" + library "fileutils" + library "socket" repo_path "vendor/rbs" library "ddtrace" diff --git a/datadog-ci.gemspec b/datadog-ci.gemspec index 07157b82..3e0b7168 100644 --- a/datadog-ci.gemspec +++ b/datadog-ci.gemspec @@ -34,10 +34,15 @@ Gem::Specification.new do |spec| LICENSE* NOTICE README.md + ext/**/* lib/**/* ]].select { |fn| File.file?(fn) } # We don't want directories, only files + .reject { |fn| fn.end_with?(".so", ".bundle") } # Exclude local native binary artifacts spec.require_paths = ["lib"] + spec.add_dependency "datadog", "~> 2.0.0.beta2" spec.add_dependency "msgpack" + + spec.extensions = ["ext/datadog_cov/extconf.rb"] end diff --git a/ext/datadog_cov/datadog_cov.c b/ext/datadog_cov/datadog_cov.c new file mode 100644 index 00000000..d35cf4a8 --- /dev/null +++ b/ext/datadog_cov/datadog_cov.c @@ -0,0 +1,192 @@ +#include +#include + +// constants +#define DD_COV_TARGET_FILES 1 +#define DD_COV_TARGET_LINES 2 + +// Data structure +struct dd_cov_data +{ + VALUE root; + int mode; + VALUE coverage; +}; + +static void dd_cov_mark(void *ptr) +{ + struct dd_cov_data *dd_cov_data = ptr; + rb_gc_mark_movable(dd_cov_data->coverage); + rb_gc_mark_movable(dd_cov_data->root); +} + +static void dd_cov_free(void *ptr) +{ + struct dd_cov_data *dd_cov_data = ptr; + + xfree(dd_cov_data); +} + +static void dd_cov_compact(void *ptr) +{ + struct dd_cov_data *dd_cov_data = ptr; + dd_cov_data->coverage = rb_gc_location(dd_cov_data->coverage); + dd_cov_data->root = rb_gc_location(dd_cov_data->root); +} + +const rb_data_type_t dd_cov_data_type = { + .wrap_struct_name = "dd_cov", + .function = { + .dmark = dd_cov_mark, + .dfree = dd_cov_free, + .dsize = NULL, + .dcompact = dd_cov_compact}, + .flags = RUBY_TYPED_FREE_IMMEDIATELY}; + +static VALUE dd_cov_allocate(VALUE klass) +{ + struct dd_cov_data *dd_cov_data; + VALUE obj = TypedData_Make_Struct(klass, struct dd_cov_data, &dd_cov_data_type, dd_cov_data); + dd_cov_data->coverage = rb_hash_new(); + dd_cov_data->root = Qnil; + dd_cov_data->mode = DD_COV_TARGET_FILES; + return obj; +} + +// DDCov methods +static VALUE dd_cov_initialize(int argc, VALUE *argv, VALUE self) +{ + VALUE opt; + int mode; + + rb_scan_args(argc, argv, "10", &opt); + VALUE rb_root = rb_hash_lookup(opt, ID2SYM(rb_intern("root"))); + if (!RTEST(rb_root)) + { + rb_raise(rb_eArgError, "root is required"); + } + + VALUE rb_mode = rb_hash_lookup(opt, ID2SYM(rb_intern("mode"))); + if (!RTEST(rb_mode) || rb_mode == ID2SYM(rb_intern("files"))) + { + mode = DD_COV_TARGET_FILES; + } + else if (rb_mode == ID2SYM(rb_intern("lines"))) + { + mode = DD_COV_TARGET_LINES; + } + else + { + rb_raise(rb_eArgError, "mode is invalid"); + } + + struct dd_cov_data *dd_cov_data; + TypedData_Get_Struct(self, struct dd_cov_data, &dd_cov_data_type, dd_cov_data); + + dd_cov_data->root = rb_root; + dd_cov_data->mode = mode; + + return Qnil; +} + +static void dd_cov_update_line_coverage(rb_event_flag_t event, VALUE data, VALUE self, ID id, VALUE klass) +{ + struct dd_cov_data *dd_cov_data; + TypedData_Get_Struct(data, struct dd_cov_data, &dd_cov_data_type, dd_cov_data); + + const char *filename = rb_sourcefile(); + if (filename == NULL) + { + return; + } + + if (dd_cov_data->root == Qnil) + { + return; + } + + char *c_root = RSTRING_PTR(dd_cov_data->root); + if (c_root == NULL) + { + return; + } + long root_len = RSTRING_LEN(dd_cov_data->root); + // check that root is a prefix of the filename + // so this file is located under the given root + if (strncmp(c_root, filename, root_len) != 0) + { + return; + } + + VALUE rb_str_source_file = rb_str_new2(filename); + + if (dd_cov_data->mode == DD_COV_TARGET_FILES) + { + rb_hash_aset(dd_cov_data->coverage, rb_str_source_file, Qtrue); + return; + } + + // this isn't optimized yet, this is a POC to show that lines coverage is possible + // ITR beta is going to use files coverage, we'll get back to this part when + // we need to implement lines coverage + if (dd_cov_data->mode == DD_COV_TARGET_LINES) + { + int line_number = rb_sourceline(); + if (line_number <= 0) + { + return; + } + + VALUE rb_lines = rb_hash_aref(dd_cov_data->coverage, rb_str_source_file); + if (rb_lines == Qnil) + { + rb_lines = rb_hash_new(); + rb_hash_aset(dd_cov_data->coverage, rb_str_source_file, rb_lines); + } + + rb_hash_aset(rb_lines, INT2FIX(line_number), Qtrue); + } +} + +static VALUE dd_cov_start(VALUE self) +{ + // get current thread + VALUE thval = rb_thread_current(); + + // add event hook + rb_thread_add_event_hook(thval, dd_cov_update_line_coverage, RUBY_EVENT_LINE, self); + + return self; +} + +static VALUE dd_cov_stop(VALUE self) +{ + // get current thread + VALUE thval = rb_thread_current(); + // remove event hook for the current thread + rb_thread_remove_event_hook(thval, dd_cov_update_line_coverage); + + struct dd_cov_data *dd_cov_data; + TypedData_Get_Struct(self, struct dd_cov_data, &dd_cov_data_type, dd_cov_data); + + VALUE cov = dd_cov_data->coverage; + + dd_cov_data->coverage = rb_hash_new(); + + return cov; +} + +void Init_datadog_cov(void) +{ + VALUE mDatadog = rb_define_module("Datadog"); + VALUE mCI = rb_define_module_under(mDatadog, "CI"); + VALUE mITR = rb_define_module_under(mCI, "ITR"); + VALUE mCoverage = rb_define_module_under(mITR, "Coverage"); + VALUE cDatadogCov = rb_define_class_under(mCoverage, "DDCov", rb_cObject); + + rb_define_alloc_func(cDatadogCov, dd_cov_allocate); + + rb_define_method(cDatadogCov, "initialize", dd_cov_initialize, -1); + rb_define_method(cDatadogCov, "start", dd_cov_start, 0); + rb_define_method(cDatadogCov, "stop", dd_cov_stop, 0); +} diff --git a/ext/datadog_cov/extconf.rb b/ext/datadog_cov/extconf.rb new file mode 100644 index 00000000..93b003d6 --- /dev/null +++ b/ext/datadog_cov/extconf.rb @@ -0,0 +1,18 @@ +if RUBY_ENGINE != "ruby" || Gem.win_platform? + warn( + "WARN: Skipping build of code coverage native extension because of unsupported platform." + ) + + File.write("Makefile", "all install clean: # dummy makefile that does nothing") + exit +end + +require "mkmf" + +# Tag the native extension library with the Ruby version and Ruby platform. +# This makes it easier for development (avoids "oops I forgot to rebuild when I switched my Ruby") and ensures that +# the wrong library is never loaded. +# When requiring, we need to use the exact same string, including the version and the platform. +EXTENSION_NAME = "datadog_cov.#{RUBY_VERSION}_#{RUBY_PLATFORM}".freeze + +create_makefile(EXTENSION_NAME) diff --git a/gemfiles/jruby_9.4_activesupport_4.gemfile b/gemfiles/jruby_9.4_activesupport_4.gemfile index 04adf446..743b8dd6 100644 --- a/gemfiles/jruby_9.4_activesupport_4.gemfile +++ b/gemfiles/jruby_9.4_activesupport_4.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_activesupport_4.gemfile.lock b/gemfiles/jruby_9.4_activesupport_4.gemfile.lock index 73cad8c0..b1567ff4 100644 --- a/gemfiles/jruby_9.4_activesupport_4.gemfile.lock +++ b/gemfiles/jruby_9.4_activesupport_4.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -20,10 +21,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -32,13 +32,13 @@ GEM ffi (1.16.3-java) i18n (0.9.5) concurrent-ruby (~> 1.0) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2-java) os (1.1.4) @@ -53,7 +53,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -130,11 +132,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/jruby_9.4_activesupport_5.gemfile b/gemfiles/jruby_9.4_activesupport_5.gemfile index e2a82443..f34f18af 100644 --- a/gemfiles/jruby_9.4_activesupport_5.gemfile +++ b/gemfiles/jruby_9.4_activesupport_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_activesupport_5.gemfile.lock b/gemfiles/jruby_9.4_activesupport_5.gemfile.lock index 5533e69d..4cc19a0b 100644 --- a/gemfiles/jruby_9.4_activesupport_5.gemfile.lock +++ b/gemfiles/jruby_9.4_activesupport_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -20,10 +21,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -32,13 +32,13 @@ GEM ffi (1.16.3-java) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2-java) os (1.1.4) @@ -53,7 +53,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -130,11 +132,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/jruby_9.4_activesupport_6.gemfile b/gemfiles/jruby_9.4_activesupport_6.gemfile index 5b5e6678..fb56a074 100644 --- a/gemfiles/jruby_9.4_activesupport_6.gemfile +++ b/gemfiles/jruby_9.4_activesupport_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_activesupport_6.gemfile.lock b/gemfiles/jruby_9.4_activesupport_6.gemfile.lock index 6c32ce1d..8b01cf89 100644 --- a/gemfiles/jruby_9.4_activesupport_6.gemfile.lock +++ b/gemfiles/jruby_9.4_activesupport_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -21,10 +22,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -33,13 +33,13 @@ GEM ffi (1.16.3-java) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2-java) os (1.1.4) @@ -54,7 +54,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -131,11 +133,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/jruby_9.4_activesupport_7.gemfile b/gemfiles/jruby_9.4_activesupport_7.gemfile index c6893a10..839d04c6 100644 --- a/gemfiles/jruby_9.4_activesupport_7.gemfile +++ b/gemfiles/jruby_9.4_activesupport_7.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_activesupport_7.gemfile.lock b/gemfiles/jruby_9.4_activesupport_7.gemfile.lock index 40287c06..c2da0848 100644 --- a/gemfiles/jruby_9.4_activesupport_7.gemfile.lock +++ b/gemfiles/jruby_9.4_activesupport_7.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -28,10 +29,9 @@ GEM coderay (1.1.3) concurrent-ruby (1.2.3) connection_pool (2.4.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -41,13 +41,13 @@ GEM ffi (1.16.3-java) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2-java) mutex_m (0.2.0) @@ -63,7 +63,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -139,11 +141,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/jruby_9.4_ci_queue_0_minitest_5.gemfile b/gemfiles/jruby_9.4_ci_queue_0_minitest_5.gemfile index b01a4f94..965b3cb3 100644 --- a/gemfiles/jruby_9.4_ci_queue_0_minitest_5.gemfile +++ b/gemfiles/jruby_9.4_ci_queue_0_minitest_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_ci_queue_0_minitest_5.gemfile.lock b/gemfiles/jruby_9.4_ci_queue_0_minitest_5.gemfile.lock index ddc08908..c7088767 100644 --- a/gemfiles/jruby_9.4_ci_queue_0_minitest_5.gemfile.lock +++ b/gemfiles/jruby_9.4_ci_queue_0_minitest_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,26 +15,25 @@ GEM thor (>= 0.14.0) ast (2.4.2) builder (3.2.4) - ci-queue (0.47.0) + ci-queue (0.49.0) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3-java) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) minitest-reporters (1.6.1) ansi @@ -53,7 +53,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -127,13 +129,13 @@ DEPENDENCIES ci-queue (~> 0) climate_control datadog-ci! - ddtrace minitest (~> 5) minitest-reporters (~> 1) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/jruby_9.4_ci_queue_0_rspec_3.gemfile b/gemfiles/jruby_9.4_ci_queue_0_rspec_3.gemfile index 6db8ba2f..4678ec13 100644 --- a/gemfiles/jruby_9.4_ci_queue_0_rspec_3.gemfile +++ b/gemfiles/jruby_9.4_ci_queue_0_rspec_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec", "~> 3" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_ci_queue_0_rspec_3.gemfile.lock b/gemfiles/jruby_9.4_ci_queue_0_rspec_3.gemfile.lock index ffff3d9f..9cb4c8a7 100644 --- a/gemfiles/jruby_9.4_ci_queue_0_rspec_3.gemfile.lock +++ b/gemfiles/jruby_9.4_ci_queue_0_rspec_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -12,26 +13,25 @@ GEM rake thor (>= 0.14.0) ast (2.4.2) - ci-queue (0.47.0) + ci-queue (0.49.0) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3-java) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2-java) os (1.1.4) parallel (1.24.0) @@ -45,7 +45,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -119,11 +121,11 @@ DEPENDENCIES ci-queue (~> 0) climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec (~> 3) rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/jruby_9.4_cucumber_3.gemfile b/gemfiles/jruby_9.4_cucumber_3.gemfile index fab17200..a11bbfda 100644 --- a/gemfiles/jruby_9.4_cucumber_3.gemfile +++ b/gemfiles/jruby_9.4_cucumber_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_cucumber_3.gemfile.lock b/gemfiles/jruby_9.4_cucumber_3.gemfile.lock index dce36086..9e6c8aa6 100644 --- a/gemfiles/jruby_9.4_cucumber_3.gemfile.lock +++ b/gemfiles/jruby_9.4_cucumber_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -32,10 +33,9 @@ GEM cucumber-expressions (6.0.1) cucumber-tag_expressions (1.1.1) cucumber-wire (0.0.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -43,13 +43,13 @@ GEM docile (1.4.0) ffi (1.16.3-java) gherkin (5.1.0) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2-java) multi_json (1.15.0) multi_test (1.1.0) @@ -65,7 +65,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -139,11 +141,11 @@ DEPENDENCIES climate_control cucumber (~> 3) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/jruby_9.4_cucumber_4.gemfile b/gemfiles/jruby_9.4_cucumber_4.gemfile index 029dabeb..fc2b41cc 100644 --- a/gemfiles/jruby_9.4_cucumber_4.gemfile +++ b/gemfiles/jruby_9.4_cucumber_4.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_cucumber_4.gemfile.lock b/gemfiles/jruby_9.4_cucumber_4.gemfile.lock index 3fac02d4..b33a6b42 100644 --- a/gemfiles/jruby_9.4_cucumber_4.gemfile.lock +++ b/gemfiles/jruby_9.4_cucumber_4.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -52,10 +53,9 @@ GEM cucumber-core (~> 7.1, >= 7.1.0) cucumber-cucumber-expressions (~> 10.1, >= 10.1.0) cucumber-messages (~> 12.2, >= 12.2.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -64,13 +64,13 @@ GEM ffi (1.16.3-java) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) minitest (5.22.3) msgpack (1.7.2-java) @@ -92,7 +92,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -172,11 +174,11 @@ DEPENDENCIES climate_control cucumber (~> 4) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/jruby_9.4_cucumber_5.gemfile b/gemfiles/jruby_9.4_cucumber_5.gemfile index 9b3e16e3..a7470c67 100644 --- a/gemfiles/jruby_9.4_cucumber_5.gemfile +++ b/gemfiles/jruby_9.4_cucumber_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_cucumber_5.gemfile.lock b/gemfiles/jruby_9.4_cucumber_5.gemfile.lock index 3b8c9d83..007ad4d8 100644 --- a/gemfiles/jruby_9.4_cucumber_5.gemfile.lock +++ b/gemfiles/jruby_9.4_cucumber_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -52,10 +53,9 @@ GEM cucumber-core (~> 8.0, >= 8.0.1) cucumber-cucumber-expressions (~> 10.3, >= 10.3.0) cucumber-messages (~> 13.0, >= 13.0.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -64,13 +64,13 @@ GEM ffi (1.16.3-java) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) minitest (5.22.3) msgpack (1.7.2-java) @@ -92,7 +92,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -172,11 +174,11 @@ DEPENDENCIES climate_control cucumber (~> 5) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/jruby_9.4_cucumber_6.gemfile b/gemfiles/jruby_9.4_cucumber_6.gemfile index ccbf58dc..bed45967 100644 --- a/gemfiles/jruby_9.4_cucumber_6.gemfile +++ b/gemfiles/jruby_9.4_cucumber_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_cucumber_6.gemfile.lock b/gemfiles/jruby_9.4_cucumber_6.gemfile.lock index 95e49236..3e2ed8ea 100644 --- a/gemfiles/jruby_9.4_cucumber_6.gemfile.lock +++ b/gemfiles/jruby_9.4_cucumber_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -53,10 +54,9 @@ GEM cucumber-core (~> 9.0, >= 9.0.1) cucumber-cucumber-expressions (~> 12.1, >= 12.1.1) cucumber-messages (~> 15.0, >= 15.0.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -65,13 +65,13 @@ GEM ffi (1.16.3-java) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) @@ -96,7 +96,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -176,11 +178,11 @@ DEPENDENCIES climate_control cucumber (~> 6) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/jruby_9.4_cucumber_7.gemfile b/gemfiles/jruby_9.4_cucumber_7.gemfile index 01745dc9..797a22d1 100644 --- a/gemfiles/jruby_9.4_cucumber_7.gemfile +++ b/gemfiles/jruby_9.4_cucumber_7.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_cucumber_7.gemfile.lock b/gemfiles/jruby_9.4_cucumber_7.gemfile.lock index ab17c85a..ccdd80c4 100644 --- a/gemfiles/jruby_9.4_cucumber_7.gemfile.lock +++ b/gemfiles/jruby_9.4_cucumber_7.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -45,23 +46,22 @@ GEM cucumber-wire (6.2.1) cucumber-core (~> 10.1, >= 10.1.0) cucumber-cucumber-expressions (~> 14.0, >= 14.0.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3-java) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) mime-types-data (3.2024.0305) @@ -79,7 +79,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -155,11 +157,11 @@ DEPENDENCIES climate_control cucumber (~> 7) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/jruby_9.4_cucumber_8.gemfile b/gemfiles/jruby_9.4_cucumber_8.gemfile index 62fca36f..5a46403d 100644 --- a/gemfiles/jruby_9.4_cucumber_8.gemfile +++ b/gemfiles/jruby_9.4_cucumber_8.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_cucumber_8.gemfile.lock b/gemfiles/jruby_9.4_cucumber_8.gemfile.lock index 83bcfc50..086461d2 100644 --- a/gemfiles/jruby_9.4_cucumber_8.gemfile.lock +++ b/gemfiles/jruby_9.4_cucumber_8.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -39,23 +40,22 @@ GEM cucumber-messages (~> 18.0, >= 18.0.0) cucumber-messages (18.0.0) cucumber-tag-expressions (4.1.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3-java) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) mime-types-data (3.2024.0305) @@ -73,7 +73,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -149,11 +151,11 @@ DEPENDENCIES climate_control cucumber (~> 8) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/jruby_9.4_cucumber_9.gemfile b/gemfiles/jruby_9.4_cucumber_9.gemfile index d544226d..f1d1d65b 100644 --- a/gemfiles/jruby_9.4_cucumber_9.gemfile +++ b/gemfiles/jruby_9.4_cucumber_9.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_cucumber_9.gemfile.lock b/gemfiles/jruby_9.4_cucumber_9.gemfile.lock index ef8ebeb4..ad50ff65 100644 --- a/gemfiles/jruby_9.4_cucumber_9.gemfile.lock +++ b/gemfiles/jruby_9.4_cucumber_9.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -29,35 +30,34 @@ GEM multi_test (~> 1.1) sys-uname (~> 1.2) cucumber-ci-environment (10.0.1) - cucumber-core (13.0.1) + cucumber-core (13.0.2) cucumber-gherkin (>= 27, < 28) cucumber-messages (>= 20, < 23) cucumber-tag-expressions (> 5, < 7) - cucumber-cucumber-expressions (17.0.2) + cucumber-cucumber-expressions (17.1.0) bigdecimal cucumber-gherkin (27.0.0) cucumber-messages (>= 19.1.4, < 23) - cucumber-html-formatter (21.3.0) + cucumber-html-formatter (21.3.1) cucumber-messages (> 19, < 25) cucumber-messages (22.0.0) cucumber-tag-expressions (6.1.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3-java) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mini_mime (1.1.5) msgpack (1.7.2-java) multi_test (1.1.0) @@ -73,7 +73,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -149,11 +151,11 @@ DEPENDENCIES climate_control cucumber (~> 9) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/jruby_9.4_minitest_5.gemfile b/gemfiles/jruby_9.4_minitest_5.gemfile index 88f19fa2..49b16794 100644 --- a/gemfiles/jruby_9.4_minitest_5.gemfile +++ b/gemfiles/jruby_9.4_minitest_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_minitest_5.gemfile.lock b/gemfiles/jruby_9.4_minitest_5.gemfile.lock index d350af3e..438c8537 100644 --- a/gemfiles/jruby_9.4_minitest_5.gemfile.lock +++ b/gemfiles/jruby_9.4_minitest_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,23 +15,22 @@ GEM ast (2.4.2) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3-java) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2-java) os (1.1.4) @@ -45,7 +45,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -118,12 +120,12 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace minitest (~> 5) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/jruby_9.4_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile b/gemfiles/jruby_9.4_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile index 1e411861..fd3e7624 100644 --- a/gemfiles/jruby_9.4_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile +++ b/gemfiles/jruby_9.4_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock b/gemfiles/jruby_9.4_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock index be363ea8..0dc6491d 100644 --- a/gemfiles/jruby_9.4_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock +++ b/gemfiles/jruby_9.4_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -28,10 +29,9 @@ GEM coderay (1.1.3) concurrent-ruby (1.2.3) connection_pool (2.4.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -41,13 +41,13 @@ GEM ffi (1.16.3-java) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2-java) mutex_m (0.2.0) @@ -63,7 +63,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -141,12 +143,12 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace minitest (~> 5) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/jruby_9.4_rspec_3.gemfile b/gemfiles/jruby_9.4_rspec_3.gemfile index 9c8cce28..5f7adce2 100644 --- a/gemfiles/jruby_9.4_rspec_3.gemfile +++ b/gemfiles/jruby_9.4_rspec_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec", "~> 3" gem "rspec-collection_matchers" diff --git a/gemfiles/jruby_9.4_rspec_3.gemfile.lock b/gemfiles/jruby_9.4_rspec_3.gemfile.lock index a6f4ef3e..7937972a 100644 --- a/gemfiles/jruby_9.4_rspec_3.gemfile.lock +++ b/gemfiles/jruby_9.4_rspec_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,23 +15,22 @@ GEM ast (2.4.2) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3-java) - json (2.7.1-java) + json (2.7.2-java) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) + libdatadog (7.0.0.1.0) libddwaf (1.14.0.0.0-java) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2-java) os (1.1.4) parallel (1.24.0) @@ -44,7 +44,9 @@ GEM spoon (~> 0.0) racc (1.7.3-java) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake regexp_parser (2.9.0) rexml (3.2.6) rspec (3.13.0) @@ -117,11 +119,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler rspec (~> 3) rspec-collection_matchers rspec_junit_formatter diff --git a/gemfiles/ruby_2.7_activesupport_4.gemfile b/gemfiles/ruby_2.7_activesupport_4.gemfile index e0942bd4..82e35051 100644 --- a/gemfiles/ruby_2.7_activesupport_4.gemfile +++ b/gemfiles/ruby_2.7_activesupport_4.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_2.7_activesupport_4.gemfile.lock b/gemfiles/ruby_2.7_activesupport_4.gemfile.lock index 4d5c48ce..16516e87 100644 --- a/gemfiles/ruby_2.7_activesupport_4.gemfile.lock +++ b/gemfiles/ruby_2.7_activesupport_4.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -20,10 +21,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -32,13 +32,13 @@ GEM ffi (1.16.3) i18n (0.9.5) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -52,7 +52,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -128,11 +130,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_2.7_activesupport_5.gemfile b/gemfiles/ruby_2.7_activesupport_5.gemfile index c179d19f..c27b3fd3 100644 --- a/gemfiles/ruby_2.7_activesupport_5.gemfile +++ b/gemfiles/ruby_2.7_activesupport_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_2.7_activesupport_5.gemfile.lock b/gemfiles/ruby_2.7_activesupport_5.gemfile.lock index 0cfbb1a6..34b44728 100644 --- a/gemfiles/ruby_2.7_activesupport_5.gemfile.lock +++ b/gemfiles/ruby_2.7_activesupport_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -20,10 +21,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -32,13 +32,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -52,7 +52,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -128,11 +130,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_2.7_activesupport_6.gemfile b/gemfiles/ruby_2.7_activesupport_6.gemfile index b4b3dd02..f83569de 100644 --- a/gemfiles/ruby_2.7_activesupport_6.gemfile +++ b/gemfiles/ruby_2.7_activesupport_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_2.7_activesupport_6.gemfile.lock b/gemfiles/ruby_2.7_activesupport_6.gemfile.lock index 2453c312..3dade8f1 100644 --- a/gemfiles/ruby_2.7_activesupport_6.gemfile.lock +++ b/gemfiles/ruby_2.7_activesupport_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -21,10 +22,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -33,13 +33,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -53,7 +53,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -129,11 +131,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_2.7_activesupport_7.gemfile b/gemfiles/ruby_2.7_activesupport_7.gemfile index 408bceae..357a72c1 100644 --- a/gemfiles/ruby_2.7_activesupport_7.gemfile +++ b/gemfiles/ruby_2.7_activesupport_7.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_2.7_activesupport_7.gemfile.lock b/gemfiles/ruby_2.7_activesupport_7.gemfile.lock index ee33ffe3..1a68c818 100644 --- a/gemfiles/ruby_2.7_activesupport_7.gemfile.lock +++ b/gemfiles/ruby_2.7_activesupport_7.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -28,10 +29,9 @@ GEM coderay (1.1.3) concurrent-ruby (1.2.3) connection_pool (2.4.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -41,13 +41,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) mutex_m (0.2.0) @@ -62,7 +62,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -137,11 +139,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_2.7_ci_queue_0_minitest_5.gemfile b/gemfiles/ruby_2.7_ci_queue_0_minitest_5.gemfile index af228342..d50f9499 100644 --- a/gemfiles/ruby_2.7_ci_queue_0_minitest_5.gemfile +++ b/gemfiles/ruby_2.7_ci_queue_0_minitest_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_2.7_ci_queue_0_minitest_5.gemfile.lock b/gemfiles/ruby_2.7_ci_queue_0_minitest_5.gemfile.lock index 366ed043..b99cbca8 100644 --- a/gemfiles/ruby_2.7_ci_queue_0_minitest_5.gemfile.lock +++ b/gemfiles/ruby_2.7_ci_queue_0_minitest_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,26 +15,25 @@ GEM thor (>= 0.14.0) ast (2.4.2) builder (3.2.4) - ci-queue (0.47.0) + ci-queue (0.49.0) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) minitest-reporters (1.6.1) ansi @@ -52,7 +52,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -125,13 +127,13 @@ DEPENDENCIES ci-queue (~> 0) climate_control datadog-ci! - ddtrace minitest (~> 5) minitest-reporters (~> 1) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_2.7_ci_queue_0_rspec_3.gemfile b/gemfiles/ruby_2.7_ci_queue_0_rspec_3.gemfile index 92f54a22..7d35ef19 100644 --- a/gemfiles/ruby_2.7_ci_queue_0_rspec_3.gemfile +++ b/gemfiles/ruby_2.7_ci_queue_0_rspec_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec", "~> 3" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_2.7_ci_queue_0_rspec_3.gemfile.lock b/gemfiles/ruby_2.7_ci_queue_0_rspec_3.gemfile.lock index 90d427e0..90b3f633 100644 --- a/gemfiles/ruby_2.7_ci_queue_0_rspec_3.gemfile.lock +++ b/gemfiles/ruby_2.7_ci_queue_0_rspec_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -12,26 +13,25 @@ GEM rake thor (>= 0.14.0) ast (2.4.2) - ci-queue (0.47.0) + ci-queue (0.49.0) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2) os (1.1.4) parallel (1.24.0) @@ -44,7 +44,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -117,11 +119,11 @@ DEPENDENCIES ci-queue (~> 0) climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec (~> 3) rspec-collection_matchers diff --git a/gemfiles/ruby_2.7_cucumber_3.gemfile b/gemfiles/ruby_2.7_cucumber_3.gemfile index 1f55b450..e3fb6988 100644 --- a/gemfiles/ruby_2.7_cucumber_3.gemfile +++ b/gemfiles/ruby_2.7_cucumber_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_2.7_cucumber_3.gemfile.lock b/gemfiles/ruby_2.7_cucumber_3.gemfile.lock index 923b1304..ed6da19e 100644 --- a/gemfiles/ruby_2.7_cucumber_3.gemfile.lock +++ b/gemfiles/ruby_2.7_cucumber_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -32,10 +33,9 @@ GEM cucumber-expressions (6.0.1) cucumber-tag_expressions (1.1.1) cucumber-wire (0.0.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -43,13 +43,13 @@ GEM docile (1.4.0) ffi (1.16.3) gherkin (5.1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2) multi_json (1.15.0) multi_test (1.1.0) @@ -64,7 +64,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -137,11 +139,11 @@ DEPENDENCIES climate_control cucumber (~> 3) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_2.7_cucumber_4.gemfile b/gemfiles/ruby_2.7_cucumber_4.gemfile index b6c68188..5177689d 100644 --- a/gemfiles/ruby_2.7_cucumber_4.gemfile +++ b/gemfiles/ruby_2.7_cucumber_4.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_2.7_cucumber_4.gemfile.lock b/gemfiles/ruby_2.7_cucumber_4.gemfile.lock index c4b957c8..67c6c507 100644 --- a/gemfiles/ruby_2.7_cucumber_4.gemfile.lock +++ b/gemfiles/ruby_2.7_cucumber_4.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -52,10 +53,9 @@ GEM cucumber-core (~> 7.1, >= 7.1.0) cucumber-cucumber-expressions (~> 10.1, >= 10.1.0) cucumber-messages (~> 12.2, >= 12.2.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -64,13 +64,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) minitest (5.22.3) msgpack (1.7.2) @@ -91,7 +91,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -170,11 +172,11 @@ DEPENDENCIES climate_control cucumber (~> 4) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_2.7_cucumber_5.gemfile b/gemfiles/ruby_2.7_cucumber_5.gemfile index a1173bf8..35ab0fca 100644 --- a/gemfiles/ruby_2.7_cucumber_5.gemfile +++ b/gemfiles/ruby_2.7_cucumber_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_2.7_cucumber_5.gemfile.lock b/gemfiles/ruby_2.7_cucumber_5.gemfile.lock index b5d24770..092304ed 100644 --- a/gemfiles/ruby_2.7_cucumber_5.gemfile.lock +++ b/gemfiles/ruby_2.7_cucumber_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -52,10 +53,9 @@ GEM cucumber-core (~> 8.0, >= 8.0.1) cucumber-cucumber-expressions (~> 10.3, >= 10.3.0) cucumber-messages (~> 13.0, >= 13.0.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -64,13 +64,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) minitest (5.22.3) msgpack (1.7.2) @@ -91,7 +91,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -170,11 +172,11 @@ DEPENDENCIES climate_control cucumber (~> 5) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_2.7_cucumber_6.gemfile b/gemfiles/ruby_2.7_cucumber_6.gemfile index dec66193..f88a12a6 100644 --- a/gemfiles/ruby_2.7_cucumber_6.gemfile +++ b/gemfiles/ruby_2.7_cucumber_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_2.7_cucumber_6.gemfile.lock b/gemfiles/ruby_2.7_cucumber_6.gemfile.lock index 1030a0e7..17c2dd9d 100644 --- a/gemfiles/ruby_2.7_cucumber_6.gemfile.lock +++ b/gemfiles/ruby_2.7_cucumber_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -53,10 +54,9 @@ GEM cucumber-core (~> 9.0, >= 9.0.1) cucumber-cucumber-expressions (~> 12.1, >= 12.1.1) cucumber-messages (~> 15.0, >= 15.0.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -65,13 +65,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) @@ -95,7 +95,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -174,11 +176,11 @@ DEPENDENCIES climate_control cucumber (~> 6) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_2.7_cucumber_7.gemfile b/gemfiles/ruby_2.7_cucumber_7.gemfile index e2444dd3..2d3a7768 100644 --- a/gemfiles/ruby_2.7_cucumber_7.gemfile +++ b/gemfiles/ruby_2.7_cucumber_7.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_2.7_cucumber_7.gemfile.lock b/gemfiles/ruby_2.7_cucumber_7.gemfile.lock index c5412026..aca75974 100644 --- a/gemfiles/ruby_2.7_cucumber_7.gemfile.lock +++ b/gemfiles/ruby_2.7_cucumber_7.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -45,23 +46,22 @@ GEM cucumber-wire (6.2.1) cucumber-core (~> 10.1, >= 10.1.0) cucumber-cucumber-expressions (~> 14.0, >= 14.0.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) mime-types-data (3.2024.0305) @@ -78,7 +78,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -153,11 +155,11 @@ DEPENDENCIES climate_control cucumber (~> 7) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_2.7_cucumber_8.gemfile b/gemfiles/ruby_2.7_cucumber_8.gemfile index 7c5e99fb..ba274849 100644 --- a/gemfiles/ruby_2.7_cucumber_8.gemfile +++ b/gemfiles/ruby_2.7_cucumber_8.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_2.7_cucumber_8.gemfile.lock b/gemfiles/ruby_2.7_cucumber_8.gemfile.lock index 91eaaf65..b408c074 100644 --- a/gemfiles/ruby_2.7_cucumber_8.gemfile.lock +++ b/gemfiles/ruby_2.7_cucumber_8.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -39,23 +40,22 @@ GEM cucumber-messages (~> 18.0, >= 18.0.0) cucumber-messages (18.0.0) cucumber-tag-expressions (4.1.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) mime-types-data (3.2024.0305) @@ -72,7 +72,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -147,11 +149,11 @@ DEPENDENCIES climate_control cucumber (~> 8) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_2.7_cucumber_9.gemfile b/gemfiles/ruby_2.7_cucumber_9.gemfile index 126475c4..47c6db1b 100644 --- a/gemfiles/ruby_2.7_cucumber_9.gemfile +++ b/gemfiles/ruby_2.7_cucumber_9.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_2.7_cucumber_9.gemfile.lock b/gemfiles/ruby_2.7_cucumber_9.gemfile.lock index 88b1978f..63726d45 100644 --- a/gemfiles/ruby_2.7_cucumber_9.gemfile.lock +++ b/gemfiles/ruby_2.7_cucumber_9.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -29,35 +30,34 @@ GEM multi_test (~> 1.1) sys-uname (~> 1.2) cucumber-ci-environment (10.0.1) - cucumber-core (13.0.1) + cucumber-core (13.0.2) cucumber-gherkin (>= 27, < 28) cucumber-messages (>= 20, < 23) cucumber-tag-expressions (> 5, < 7) - cucumber-cucumber-expressions (17.0.2) + cucumber-cucumber-expressions (17.1.0) bigdecimal cucumber-gherkin (27.0.0) cucumber-messages (>= 19.1.4, < 23) - cucumber-html-formatter (21.3.0) + cucumber-html-formatter (21.3.1) cucumber-messages (> 19, < 25) cucumber-messages (22.0.0) cucumber-tag-expressions (6.1.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mini_mime (1.1.5) msgpack (1.7.2) multi_test (1.1.0) @@ -72,7 +72,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -147,11 +149,11 @@ DEPENDENCIES climate_control cucumber (~> 9) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_2.7_minitest_5.gemfile b/gemfiles/ruby_2.7_minitest_5.gemfile index b30188da..17603638 100644 --- a/gemfiles/ruby_2.7_minitest_5.gemfile +++ b/gemfiles/ruby_2.7_minitest_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_2.7_minitest_5.gemfile.lock b/gemfiles/ruby_2.7_minitest_5.gemfile.lock index 3a1de845..535dff2b 100644 --- a/gemfiles/ruby_2.7_minitest_5.gemfile.lock +++ b/gemfiles/ruby_2.7_minitest_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,23 +15,22 @@ GEM ast (2.4.2) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -44,7 +44,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -116,12 +118,12 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace minitest (~> 5) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_2.7_rspec_3.gemfile b/gemfiles/ruby_2.7_rspec_3.gemfile index 6e1d4097..8a600225 100644 --- a/gemfiles/ruby_2.7_rspec_3.gemfile +++ b/gemfiles/ruby_2.7_rspec_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec", "~> 3" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_2.7_rspec_3.gemfile.lock b/gemfiles/ruby_2.7_rspec_3.gemfile.lock index cdb0bbb1..aa9e9de0 100644 --- a/gemfiles/ruby_2.7_rspec_3.gemfile.lock +++ b/gemfiles/ruby_2.7_rspec_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,23 +15,22 @@ GEM ast (2.4.2) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2) os (1.1.4) parallel (1.24.0) @@ -43,7 +43,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -115,11 +117,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec (~> 3) rspec-collection_matchers diff --git a/gemfiles/ruby_3.0_activesupport_4.gemfile b/gemfiles/ruby_3.0_activesupport_4.gemfile index e0942bd4..82e35051 100644 --- a/gemfiles/ruby_3.0_activesupport_4.gemfile +++ b/gemfiles/ruby_3.0_activesupport_4.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.0_activesupport_4.gemfile.lock b/gemfiles/ruby_3.0_activesupport_4.gemfile.lock index 4d5c48ce..16516e87 100644 --- a/gemfiles/ruby_3.0_activesupport_4.gemfile.lock +++ b/gemfiles/ruby_3.0_activesupport_4.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -20,10 +21,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -32,13 +32,13 @@ GEM ffi (1.16.3) i18n (0.9.5) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -52,7 +52,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -128,11 +130,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.0_activesupport_5.gemfile b/gemfiles/ruby_3.0_activesupport_5.gemfile index c179d19f..c27b3fd3 100644 --- a/gemfiles/ruby_3.0_activesupport_5.gemfile +++ b/gemfiles/ruby_3.0_activesupport_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.0_activesupport_5.gemfile.lock b/gemfiles/ruby_3.0_activesupport_5.gemfile.lock index 0cfbb1a6..34b44728 100644 --- a/gemfiles/ruby_3.0_activesupport_5.gemfile.lock +++ b/gemfiles/ruby_3.0_activesupport_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -20,10 +21,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -32,13 +32,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -52,7 +52,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -128,11 +130,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.0_activesupport_6.gemfile b/gemfiles/ruby_3.0_activesupport_6.gemfile index b4b3dd02..f83569de 100644 --- a/gemfiles/ruby_3.0_activesupport_6.gemfile +++ b/gemfiles/ruby_3.0_activesupport_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.0_activesupport_6.gemfile.lock b/gemfiles/ruby_3.0_activesupport_6.gemfile.lock index 2453c312..3dade8f1 100644 --- a/gemfiles/ruby_3.0_activesupport_6.gemfile.lock +++ b/gemfiles/ruby_3.0_activesupport_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -21,10 +22,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -33,13 +33,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -53,7 +53,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -129,11 +131,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.0_activesupport_7.gemfile b/gemfiles/ruby_3.0_activesupport_7.gemfile index 408bceae..357a72c1 100644 --- a/gemfiles/ruby_3.0_activesupport_7.gemfile +++ b/gemfiles/ruby_3.0_activesupport_7.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.0_activesupport_7.gemfile.lock b/gemfiles/ruby_3.0_activesupport_7.gemfile.lock index ee33ffe3..1a68c818 100644 --- a/gemfiles/ruby_3.0_activesupport_7.gemfile.lock +++ b/gemfiles/ruby_3.0_activesupport_7.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -28,10 +29,9 @@ GEM coderay (1.1.3) concurrent-ruby (1.2.3) connection_pool (2.4.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -41,13 +41,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) mutex_m (0.2.0) @@ -62,7 +62,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -137,11 +139,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.0_ci_queue_0_minitest_5.gemfile b/gemfiles/ruby_3.0_ci_queue_0_minitest_5.gemfile index af228342..d50f9499 100644 --- a/gemfiles/ruby_3.0_ci_queue_0_minitest_5.gemfile +++ b/gemfiles/ruby_3.0_ci_queue_0_minitest_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.0_ci_queue_0_minitest_5.gemfile.lock b/gemfiles/ruby_3.0_ci_queue_0_minitest_5.gemfile.lock index 366ed043..b99cbca8 100644 --- a/gemfiles/ruby_3.0_ci_queue_0_minitest_5.gemfile.lock +++ b/gemfiles/ruby_3.0_ci_queue_0_minitest_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,26 +15,25 @@ GEM thor (>= 0.14.0) ast (2.4.2) builder (3.2.4) - ci-queue (0.47.0) + ci-queue (0.49.0) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) minitest-reporters (1.6.1) ansi @@ -52,7 +52,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -125,13 +127,13 @@ DEPENDENCIES ci-queue (~> 0) climate_control datadog-ci! - ddtrace minitest (~> 5) minitest-reporters (~> 1) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.0_ci_queue_0_rspec_3.gemfile b/gemfiles/ruby_3.0_ci_queue_0_rspec_3.gemfile index 92f54a22..7d35ef19 100644 --- a/gemfiles/ruby_3.0_ci_queue_0_rspec_3.gemfile +++ b/gemfiles/ruby_3.0_ci_queue_0_rspec_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec", "~> 3" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.0_ci_queue_0_rspec_3.gemfile.lock b/gemfiles/ruby_3.0_ci_queue_0_rspec_3.gemfile.lock index 90d427e0..90b3f633 100644 --- a/gemfiles/ruby_3.0_ci_queue_0_rspec_3.gemfile.lock +++ b/gemfiles/ruby_3.0_ci_queue_0_rspec_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -12,26 +13,25 @@ GEM rake thor (>= 0.14.0) ast (2.4.2) - ci-queue (0.47.0) + ci-queue (0.49.0) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2) os (1.1.4) parallel (1.24.0) @@ -44,7 +44,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -117,11 +119,11 @@ DEPENDENCIES ci-queue (~> 0) climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec (~> 3) rspec-collection_matchers diff --git a/gemfiles/ruby_3.0_cucumber_3.gemfile b/gemfiles/ruby_3.0_cucumber_3.gemfile index 1f55b450..e3fb6988 100644 --- a/gemfiles/ruby_3.0_cucumber_3.gemfile +++ b/gemfiles/ruby_3.0_cucumber_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.0_cucumber_3.gemfile.lock b/gemfiles/ruby_3.0_cucumber_3.gemfile.lock index 923b1304..ed6da19e 100644 --- a/gemfiles/ruby_3.0_cucumber_3.gemfile.lock +++ b/gemfiles/ruby_3.0_cucumber_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -32,10 +33,9 @@ GEM cucumber-expressions (6.0.1) cucumber-tag_expressions (1.1.1) cucumber-wire (0.0.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -43,13 +43,13 @@ GEM docile (1.4.0) ffi (1.16.3) gherkin (5.1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2) multi_json (1.15.0) multi_test (1.1.0) @@ -64,7 +64,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -137,11 +139,11 @@ DEPENDENCIES climate_control cucumber (~> 3) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.0_cucumber_4.gemfile b/gemfiles/ruby_3.0_cucumber_4.gemfile index b6c68188..5177689d 100644 --- a/gemfiles/ruby_3.0_cucumber_4.gemfile +++ b/gemfiles/ruby_3.0_cucumber_4.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.0_cucumber_4.gemfile.lock b/gemfiles/ruby_3.0_cucumber_4.gemfile.lock index c4b957c8..67c6c507 100644 --- a/gemfiles/ruby_3.0_cucumber_4.gemfile.lock +++ b/gemfiles/ruby_3.0_cucumber_4.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -52,10 +53,9 @@ GEM cucumber-core (~> 7.1, >= 7.1.0) cucumber-cucumber-expressions (~> 10.1, >= 10.1.0) cucumber-messages (~> 12.2, >= 12.2.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -64,13 +64,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) minitest (5.22.3) msgpack (1.7.2) @@ -91,7 +91,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -170,11 +172,11 @@ DEPENDENCIES climate_control cucumber (~> 4) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.0_cucumber_5.gemfile b/gemfiles/ruby_3.0_cucumber_5.gemfile index a1173bf8..35ab0fca 100644 --- a/gemfiles/ruby_3.0_cucumber_5.gemfile +++ b/gemfiles/ruby_3.0_cucumber_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.0_cucumber_5.gemfile.lock b/gemfiles/ruby_3.0_cucumber_5.gemfile.lock index b5d24770..092304ed 100644 --- a/gemfiles/ruby_3.0_cucumber_5.gemfile.lock +++ b/gemfiles/ruby_3.0_cucumber_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -52,10 +53,9 @@ GEM cucumber-core (~> 8.0, >= 8.0.1) cucumber-cucumber-expressions (~> 10.3, >= 10.3.0) cucumber-messages (~> 13.0, >= 13.0.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -64,13 +64,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) minitest (5.22.3) msgpack (1.7.2) @@ -91,7 +91,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -170,11 +172,11 @@ DEPENDENCIES climate_control cucumber (~> 5) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.0_cucumber_6.gemfile b/gemfiles/ruby_3.0_cucumber_6.gemfile index dec66193..f88a12a6 100644 --- a/gemfiles/ruby_3.0_cucumber_6.gemfile +++ b/gemfiles/ruby_3.0_cucumber_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.0_cucumber_6.gemfile.lock b/gemfiles/ruby_3.0_cucumber_6.gemfile.lock index 1030a0e7..17c2dd9d 100644 --- a/gemfiles/ruby_3.0_cucumber_6.gemfile.lock +++ b/gemfiles/ruby_3.0_cucumber_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -53,10 +54,9 @@ GEM cucumber-core (~> 9.0, >= 9.0.1) cucumber-cucumber-expressions (~> 12.1, >= 12.1.1) cucumber-messages (~> 15.0, >= 15.0.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -65,13 +65,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) @@ -95,7 +95,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -174,11 +176,11 @@ DEPENDENCIES climate_control cucumber (~> 6) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.0_cucumber_7.gemfile b/gemfiles/ruby_3.0_cucumber_7.gemfile index e2444dd3..2d3a7768 100644 --- a/gemfiles/ruby_3.0_cucumber_7.gemfile +++ b/gemfiles/ruby_3.0_cucumber_7.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.0_cucumber_7.gemfile.lock b/gemfiles/ruby_3.0_cucumber_7.gemfile.lock index c5412026..aca75974 100644 --- a/gemfiles/ruby_3.0_cucumber_7.gemfile.lock +++ b/gemfiles/ruby_3.0_cucumber_7.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -45,23 +46,22 @@ GEM cucumber-wire (6.2.1) cucumber-core (~> 10.1, >= 10.1.0) cucumber-cucumber-expressions (~> 14.0, >= 14.0.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) mime-types-data (3.2024.0305) @@ -78,7 +78,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -153,11 +155,11 @@ DEPENDENCIES climate_control cucumber (~> 7) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.0_cucumber_8.gemfile b/gemfiles/ruby_3.0_cucumber_8.gemfile index 7c5e99fb..ba274849 100644 --- a/gemfiles/ruby_3.0_cucumber_8.gemfile +++ b/gemfiles/ruby_3.0_cucumber_8.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.0_cucumber_8.gemfile.lock b/gemfiles/ruby_3.0_cucumber_8.gemfile.lock index 91eaaf65..b408c074 100644 --- a/gemfiles/ruby_3.0_cucumber_8.gemfile.lock +++ b/gemfiles/ruby_3.0_cucumber_8.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -39,23 +40,22 @@ GEM cucumber-messages (~> 18.0, >= 18.0.0) cucumber-messages (18.0.0) cucumber-tag-expressions (4.1.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) mime-types-data (3.2024.0305) @@ -72,7 +72,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -147,11 +149,11 @@ DEPENDENCIES climate_control cucumber (~> 8) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.0_cucumber_9.gemfile b/gemfiles/ruby_3.0_cucumber_9.gemfile index 126475c4..47c6db1b 100644 --- a/gemfiles/ruby_3.0_cucumber_9.gemfile +++ b/gemfiles/ruby_3.0_cucumber_9.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.0_cucumber_9.gemfile.lock b/gemfiles/ruby_3.0_cucumber_9.gemfile.lock index 88b1978f..63726d45 100644 --- a/gemfiles/ruby_3.0_cucumber_9.gemfile.lock +++ b/gemfiles/ruby_3.0_cucumber_9.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -29,35 +30,34 @@ GEM multi_test (~> 1.1) sys-uname (~> 1.2) cucumber-ci-environment (10.0.1) - cucumber-core (13.0.1) + cucumber-core (13.0.2) cucumber-gherkin (>= 27, < 28) cucumber-messages (>= 20, < 23) cucumber-tag-expressions (> 5, < 7) - cucumber-cucumber-expressions (17.0.2) + cucumber-cucumber-expressions (17.1.0) bigdecimal cucumber-gherkin (27.0.0) cucumber-messages (>= 19.1.4, < 23) - cucumber-html-formatter (21.3.0) + cucumber-html-formatter (21.3.1) cucumber-messages (> 19, < 25) cucumber-messages (22.0.0) cucumber-tag-expressions (6.1.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mini_mime (1.1.5) msgpack (1.7.2) multi_test (1.1.0) @@ -72,7 +72,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -147,11 +149,11 @@ DEPENDENCIES climate_control cucumber (~> 9) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.0_minitest_5.gemfile b/gemfiles/ruby_3.0_minitest_5.gemfile index b30188da..17603638 100644 --- a/gemfiles/ruby_3.0_minitest_5.gemfile +++ b/gemfiles/ruby_3.0_minitest_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.0_minitest_5.gemfile.lock b/gemfiles/ruby_3.0_minitest_5.gemfile.lock index 3a1de845..535dff2b 100644 --- a/gemfiles/ruby_3.0_minitest_5.gemfile.lock +++ b/gemfiles/ruby_3.0_minitest_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,23 +15,22 @@ GEM ast (2.4.2) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -44,7 +44,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -116,12 +118,12 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace minitest (~> 5) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.0_rspec_3.gemfile b/gemfiles/ruby_3.0_rspec_3.gemfile index 6e1d4097..8a600225 100644 --- a/gemfiles/ruby_3.0_rspec_3.gemfile +++ b/gemfiles/ruby_3.0_rspec_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec", "~> 3" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.0_rspec_3.gemfile.lock b/gemfiles/ruby_3.0_rspec_3.gemfile.lock index cdb0bbb1..aa9e9de0 100644 --- a/gemfiles/ruby_3.0_rspec_3.gemfile.lock +++ b/gemfiles/ruby_3.0_rspec_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,23 +15,22 @@ GEM ast (2.4.2) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2) os (1.1.4) parallel (1.24.0) @@ -43,7 +43,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -115,11 +117,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec (~> 3) rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_activesupport_4.gemfile b/gemfiles/ruby_3.1_activesupport_4.gemfile index e0942bd4..82e35051 100644 --- a/gemfiles/ruby_3.1_activesupport_4.gemfile +++ b/gemfiles/ruby_3.1_activesupport_4.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_activesupport_4.gemfile.lock b/gemfiles/ruby_3.1_activesupport_4.gemfile.lock index 4d5c48ce..16516e87 100644 --- a/gemfiles/ruby_3.1_activesupport_4.gemfile.lock +++ b/gemfiles/ruby_3.1_activesupport_4.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -20,10 +21,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -32,13 +32,13 @@ GEM ffi (1.16.3) i18n (0.9.5) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -52,7 +52,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -128,11 +130,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_activesupport_5.gemfile b/gemfiles/ruby_3.1_activesupport_5.gemfile index c179d19f..c27b3fd3 100644 --- a/gemfiles/ruby_3.1_activesupport_5.gemfile +++ b/gemfiles/ruby_3.1_activesupport_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_activesupport_5.gemfile.lock b/gemfiles/ruby_3.1_activesupport_5.gemfile.lock index 0cfbb1a6..34b44728 100644 --- a/gemfiles/ruby_3.1_activesupport_5.gemfile.lock +++ b/gemfiles/ruby_3.1_activesupport_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -20,10 +21,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -32,13 +32,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -52,7 +52,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -128,11 +130,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_activesupport_6.gemfile b/gemfiles/ruby_3.1_activesupport_6.gemfile index b4b3dd02..f83569de 100644 --- a/gemfiles/ruby_3.1_activesupport_6.gemfile +++ b/gemfiles/ruby_3.1_activesupport_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_activesupport_6.gemfile.lock b/gemfiles/ruby_3.1_activesupport_6.gemfile.lock index 2453c312..3dade8f1 100644 --- a/gemfiles/ruby_3.1_activesupport_6.gemfile.lock +++ b/gemfiles/ruby_3.1_activesupport_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -21,10 +22,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -33,13 +33,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -53,7 +53,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -129,11 +131,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_activesupport_7.gemfile b/gemfiles/ruby_3.1_activesupport_7.gemfile index 408bceae..357a72c1 100644 --- a/gemfiles/ruby_3.1_activesupport_7.gemfile +++ b/gemfiles/ruby_3.1_activesupport_7.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_activesupport_7.gemfile.lock b/gemfiles/ruby_3.1_activesupport_7.gemfile.lock index ee33ffe3..1a68c818 100644 --- a/gemfiles/ruby_3.1_activesupport_7.gemfile.lock +++ b/gemfiles/ruby_3.1_activesupport_7.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -28,10 +29,9 @@ GEM coderay (1.1.3) concurrent-ruby (1.2.3) connection_pool (2.4.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -41,13 +41,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) mutex_m (0.2.0) @@ -62,7 +62,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -137,11 +139,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_ci_queue_0_minitest_5.gemfile b/gemfiles/ruby_3.1_ci_queue_0_minitest_5.gemfile index af228342..d50f9499 100644 --- a/gemfiles/ruby_3.1_ci_queue_0_minitest_5.gemfile +++ b/gemfiles/ruby_3.1_ci_queue_0_minitest_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_ci_queue_0_minitest_5.gemfile.lock b/gemfiles/ruby_3.1_ci_queue_0_minitest_5.gemfile.lock index 366ed043..b99cbca8 100644 --- a/gemfiles/ruby_3.1_ci_queue_0_minitest_5.gemfile.lock +++ b/gemfiles/ruby_3.1_ci_queue_0_minitest_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,26 +15,25 @@ GEM thor (>= 0.14.0) ast (2.4.2) builder (3.2.4) - ci-queue (0.47.0) + ci-queue (0.49.0) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) minitest-reporters (1.6.1) ansi @@ -52,7 +52,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -125,13 +127,13 @@ DEPENDENCIES ci-queue (~> 0) climate_control datadog-ci! - ddtrace minitest (~> 5) minitest-reporters (~> 1) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_ci_queue_0_rspec_3.gemfile b/gemfiles/ruby_3.1_ci_queue_0_rspec_3.gemfile index 92f54a22..7d35ef19 100644 --- a/gemfiles/ruby_3.1_ci_queue_0_rspec_3.gemfile +++ b/gemfiles/ruby_3.1_ci_queue_0_rspec_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec", "~> 3" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_ci_queue_0_rspec_3.gemfile.lock b/gemfiles/ruby_3.1_ci_queue_0_rspec_3.gemfile.lock index 90d427e0..90b3f633 100644 --- a/gemfiles/ruby_3.1_ci_queue_0_rspec_3.gemfile.lock +++ b/gemfiles/ruby_3.1_ci_queue_0_rspec_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -12,26 +13,25 @@ GEM rake thor (>= 0.14.0) ast (2.4.2) - ci-queue (0.47.0) + ci-queue (0.49.0) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2) os (1.1.4) parallel (1.24.0) @@ -44,7 +44,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -117,11 +119,11 @@ DEPENDENCIES ci-queue (~> 0) climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec (~> 3) rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_cucumber_3.gemfile b/gemfiles/ruby_3.1_cucumber_3.gemfile index 1f55b450..e3fb6988 100644 --- a/gemfiles/ruby_3.1_cucumber_3.gemfile +++ b/gemfiles/ruby_3.1_cucumber_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_cucumber_3.gemfile.lock b/gemfiles/ruby_3.1_cucumber_3.gemfile.lock index 923b1304..ed6da19e 100644 --- a/gemfiles/ruby_3.1_cucumber_3.gemfile.lock +++ b/gemfiles/ruby_3.1_cucumber_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -32,10 +33,9 @@ GEM cucumber-expressions (6.0.1) cucumber-tag_expressions (1.1.1) cucumber-wire (0.0.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -43,13 +43,13 @@ GEM docile (1.4.0) ffi (1.16.3) gherkin (5.1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2) multi_json (1.15.0) multi_test (1.1.0) @@ -64,7 +64,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -137,11 +139,11 @@ DEPENDENCIES climate_control cucumber (~> 3) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_cucumber_4.gemfile b/gemfiles/ruby_3.1_cucumber_4.gemfile index b6c68188..5177689d 100644 --- a/gemfiles/ruby_3.1_cucumber_4.gemfile +++ b/gemfiles/ruby_3.1_cucumber_4.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_cucumber_4.gemfile.lock b/gemfiles/ruby_3.1_cucumber_4.gemfile.lock index c4b957c8..67c6c507 100644 --- a/gemfiles/ruby_3.1_cucumber_4.gemfile.lock +++ b/gemfiles/ruby_3.1_cucumber_4.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -52,10 +53,9 @@ GEM cucumber-core (~> 7.1, >= 7.1.0) cucumber-cucumber-expressions (~> 10.1, >= 10.1.0) cucumber-messages (~> 12.2, >= 12.2.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -64,13 +64,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) minitest (5.22.3) msgpack (1.7.2) @@ -91,7 +91,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -170,11 +172,11 @@ DEPENDENCIES climate_control cucumber (~> 4) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_cucumber_5.gemfile b/gemfiles/ruby_3.1_cucumber_5.gemfile index a1173bf8..35ab0fca 100644 --- a/gemfiles/ruby_3.1_cucumber_5.gemfile +++ b/gemfiles/ruby_3.1_cucumber_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_cucumber_5.gemfile.lock b/gemfiles/ruby_3.1_cucumber_5.gemfile.lock index b5d24770..092304ed 100644 --- a/gemfiles/ruby_3.1_cucumber_5.gemfile.lock +++ b/gemfiles/ruby_3.1_cucumber_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -52,10 +53,9 @@ GEM cucumber-core (~> 8.0, >= 8.0.1) cucumber-cucumber-expressions (~> 10.3, >= 10.3.0) cucumber-messages (~> 13.0, >= 13.0.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -64,13 +64,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) minitest (5.22.3) msgpack (1.7.2) @@ -91,7 +91,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -170,11 +172,11 @@ DEPENDENCIES climate_control cucumber (~> 5) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_cucumber_6.gemfile b/gemfiles/ruby_3.1_cucumber_6.gemfile index dec66193..f88a12a6 100644 --- a/gemfiles/ruby_3.1_cucumber_6.gemfile +++ b/gemfiles/ruby_3.1_cucumber_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_cucumber_6.gemfile.lock b/gemfiles/ruby_3.1_cucumber_6.gemfile.lock index 1030a0e7..17c2dd9d 100644 --- a/gemfiles/ruby_3.1_cucumber_6.gemfile.lock +++ b/gemfiles/ruby_3.1_cucumber_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -53,10 +54,9 @@ GEM cucumber-core (~> 9.0, >= 9.0.1) cucumber-cucumber-expressions (~> 12.1, >= 12.1.1) cucumber-messages (~> 15.0, >= 15.0.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -65,13 +65,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) @@ -95,7 +95,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -174,11 +176,11 @@ DEPENDENCIES climate_control cucumber (~> 6) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_cucumber_7.gemfile b/gemfiles/ruby_3.1_cucumber_7.gemfile index e2444dd3..2d3a7768 100644 --- a/gemfiles/ruby_3.1_cucumber_7.gemfile +++ b/gemfiles/ruby_3.1_cucumber_7.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_cucumber_7.gemfile.lock b/gemfiles/ruby_3.1_cucumber_7.gemfile.lock index c5412026..aca75974 100644 --- a/gemfiles/ruby_3.1_cucumber_7.gemfile.lock +++ b/gemfiles/ruby_3.1_cucumber_7.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -45,23 +46,22 @@ GEM cucumber-wire (6.2.1) cucumber-core (~> 10.1, >= 10.1.0) cucumber-cucumber-expressions (~> 14.0, >= 14.0.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) mime-types-data (3.2024.0305) @@ -78,7 +78,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -153,11 +155,11 @@ DEPENDENCIES climate_control cucumber (~> 7) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_cucumber_8.gemfile b/gemfiles/ruby_3.1_cucumber_8.gemfile index 7c5e99fb..ba274849 100644 --- a/gemfiles/ruby_3.1_cucumber_8.gemfile +++ b/gemfiles/ruby_3.1_cucumber_8.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_cucumber_8.gemfile.lock b/gemfiles/ruby_3.1_cucumber_8.gemfile.lock index 91eaaf65..b408c074 100644 --- a/gemfiles/ruby_3.1_cucumber_8.gemfile.lock +++ b/gemfiles/ruby_3.1_cucumber_8.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -39,23 +40,22 @@ GEM cucumber-messages (~> 18.0, >= 18.0.0) cucumber-messages (18.0.0) cucumber-tag-expressions (4.1.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) mime-types-data (3.2024.0305) @@ -72,7 +72,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -147,11 +149,11 @@ DEPENDENCIES climate_control cucumber (~> 8) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_cucumber_9.gemfile b/gemfiles/ruby_3.1_cucumber_9.gemfile index 126475c4..47c6db1b 100644 --- a/gemfiles/ruby_3.1_cucumber_9.gemfile +++ b/gemfiles/ruby_3.1_cucumber_9.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_cucumber_9.gemfile.lock b/gemfiles/ruby_3.1_cucumber_9.gemfile.lock index 88b1978f..63726d45 100644 --- a/gemfiles/ruby_3.1_cucumber_9.gemfile.lock +++ b/gemfiles/ruby_3.1_cucumber_9.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -29,35 +30,34 @@ GEM multi_test (~> 1.1) sys-uname (~> 1.2) cucumber-ci-environment (10.0.1) - cucumber-core (13.0.1) + cucumber-core (13.0.2) cucumber-gherkin (>= 27, < 28) cucumber-messages (>= 20, < 23) cucumber-tag-expressions (> 5, < 7) - cucumber-cucumber-expressions (17.0.2) + cucumber-cucumber-expressions (17.1.0) bigdecimal cucumber-gherkin (27.0.0) cucumber-messages (>= 19.1.4, < 23) - cucumber-html-formatter (21.3.0) + cucumber-html-formatter (21.3.1) cucumber-messages (> 19, < 25) cucumber-messages (22.0.0) cucumber-tag-expressions (6.1.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mini_mime (1.1.5) msgpack (1.7.2) multi_test (1.1.0) @@ -72,7 +72,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -147,11 +149,11 @@ DEPENDENCIES climate_control cucumber (~> 9) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_minitest_5.gemfile b/gemfiles/ruby_3.1_minitest_5.gemfile index b30188da..17603638 100644 --- a/gemfiles/ruby_3.1_minitest_5.gemfile +++ b/gemfiles/ruby_3.1_minitest_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_minitest_5.gemfile.lock b/gemfiles/ruby_3.1_minitest_5.gemfile.lock index 3a1de845..535dff2b 100644 --- a/gemfiles/ruby_3.1_minitest_5.gemfile.lock +++ b/gemfiles/ruby_3.1_minitest_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,23 +15,22 @@ GEM ast (2.4.2) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -44,7 +44,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -116,12 +118,12 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace minitest (~> 5) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile b/gemfiles/ruby_3.1_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile index c9ee7fa3..da315644 100644 --- a/gemfiles/ruby_3.1_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile +++ b/gemfiles/ruby_3.1_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock b/gemfiles/ruby_3.1_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock index 96d8735c..f9db0468 100644 --- a/gemfiles/ruby_3.1_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock +++ b/gemfiles/ruby_3.1_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -28,10 +29,9 @@ GEM coderay (1.1.3) concurrent-ruby (1.2.3) connection_pool (2.4.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -41,13 +41,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) mutex_m (0.2.0) @@ -62,7 +62,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -139,12 +141,12 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace minitest (~> 5) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.1_rspec_3.gemfile b/gemfiles/ruby_3.1_rspec_3.gemfile index 6e1d4097..8a600225 100644 --- a/gemfiles/ruby_3.1_rspec_3.gemfile +++ b/gemfiles/ruby_3.1_rspec_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec", "~> 3" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.1_rspec_3.gemfile.lock b/gemfiles/ruby_3.1_rspec_3.gemfile.lock index cdb0bbb1..aa9e9de0 100644 --- a/gemfiles/ruby_3.1_rspec_3.gemfile.lock +++ b/gemfiles/ruby_3.1_rspec_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,23 +15,22 @@ GEM ast (2.4.2) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2) os (1.1.4) parallel (1.24.0) @@ -43,7 +43,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -115,11 +117,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec (~> 3) rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_activesupport_4.gemfile b/gemfiles/ruby_3.2_activesupport_4.gemfile index e0942bd4..82e35051 100644 --- a/gemfiles/ruby_3.2_activesupport_4.gemfile +++ b/gemfiles/ruby_3.2_activesupport_4.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_activesupport_4.gemfile.lock b/gemfiles/ruby_3.2_activesupport_4.gemfile.lock index 4d5c48ce..16516e87 100644 --- a/gemfiles/ruby_3.2_activesupport_4.gemfile.lock +++ b/gemfiles/ruby_3.2_activesupport_4.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -20,10 +21,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -32,13 +32,13 @@ GEM ffi (1.16.3) i18n (0.9.5) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -52,7 +52,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -128,11 +130,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_activesupport_5.gemfile b/gemfiles/ruby_3.2_activesupport_5.gemfile index c179d19f..c27b3fd3 100644 --- a/gemfiles/ruby_3.2_activesupport_5.gemfile +++ b/gemfiles/ruby_3.2_activesupport_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_activesupport_5.gemfile.lock b/gemfiles/ruby_3.2_activesupport_5.gemfile.lock index 0cfbb1a6..34b44728 100644 --- a/gemfiles/ruby_3.2_activesupport_5.gemfile.lock +++ b/gemfiles/ruby_3.2_activesupport_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -20,10 +21,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -32,13 +32,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -52,7 +52,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -128,11 +130,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_activesupport_6.gemfile b/gemfiles/ruby_3.2_activesupport_6.gemfile index b4b3dd02..f83569de 100644 --- a/gemfiles/ruby_3.2_activesupport_6.gemfile +++ b/gemfiles/ruby_3.2_activesupport_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_activesupport_6.gemfile.lock b/gemfiles/ruby_3.2_activesupport_6.gemfile.lock index 2453c312..3dade8f1 100644 --- a/gemfiles/ruby_3.2_activesupport_6.gemfile.lock +++ b/gemfiles/ruby_3.2_activesupport_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -21,10 +22,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -33,13 +33,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -53,7 +53,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -129,11 +131,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_activesupport_7.gemfile b/gemfiles/ruby_3.2_activesupport_7.gemfile index 408bceae..357a72c1 100644 --- a/gemfiles/ruby_3.2_activesupport_7.gemfile +++ b/gemfiles/ruby_3.2_activesupport_7.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_activesupport_7.gemfile.lock b/gemfiles/ruby_3.2_activesupport_7.gemfile.lock index ee33ffe3..1a68c818 100644 --- a/gemfiles/ruby_3.2_activesupport_7.gemfile.lock +++ b/gemfiles/ruby_3.2_activesupport_7.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -28,10 +29,9 @@ GEM coderay (1.1.3) concurrent-ruby (1.2.3) connection_pool (2.4.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -41,13 +41,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) mutex_m (0.2.0) @@ -62,7 +62,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -137,11 +139,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_ci_queue_0_minitest_5.gemfile b/gemfiles/ruby_3.2_ci_queue_0_minitest_5.gemfile index af228342..d50f9499 100644 --- a/gemfiles/ruby_3.2_ci_queue_0_minitest_5.gemfile +++ b/gemfiles/ruby_3.2_ci_queue_0_minitest_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_ci_queue_0_minitest_5.gemfile.lock b/gemfiles/ruby_3.2_ci_queue_0_minitest_5.gemfile.lock index 366ed043..b99cbca8 100644 --- a/gemfiles/ruby_3.2_ci_queue_0_minitest_5.gemfile.lock +++ b/gemfiles/ruby_3.2_ci_queue_0_minitest_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,26 +15,25 @@ GEM thor (>= 0.14.0) ast (2.4.2) builder (3.2.4) - ci-queue (0.47.0) + ci-queue (0.49.0) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) minitest-reporters (1.6.1) ansi @@ -52,7 +52,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -125,13 +127,13 @@ DEPENDENCIES ci-queue (~> 0) climate_control datadog-ci! - ddtrace minitest (~> 5) minitest-reporters (~> 1) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_ci_queue_0_rspec_3.gemfile b/gemfiles/ruby_3.2_ci_queue_0_rspec_3.gemfile index 92f54a22..7d35ef19 100644 --- a/gemfiles/ruby_3.2_ci_queue_0_rspec_3.gemfile +++ b/gemfiles/ruby_3.2_ci_queue_0_rspec_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec", "~> 3" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_ci_queue_0_rspec_3.gemfile.lock b/gemfiles/ruby_3.2_ci_queue_0_rspec_3.gemfile.lock index 90d427e0..90b3f633 100644 --- a/gemfiles/ruby_3.2_ci_queue_0_rspec_3.gemfile.lock +++ b/gemfiles/ruby_3.2_ci_queue_0_rspec_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -12,26 +13,25 @@ GEM rake thor (>= 0.14.0) ast (2.4.2) - ci-queue (0.47.0) + ci-queue (0.49.0) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2) os (1.1.4) parallel (1.24.0) @@ -44,7 +44,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -117,11 +119,11 @@ DEPENDENCIES ci-queue (~> 0) climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec (~> 3) rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_cucumber_3.gemfile b/gemfiles/ruby_3.2_cucumber_3.gemfile index 1f55b450..e3fb6988 100644 --- a/gemfiles/ruby_3.2_cucumber_3.gemfile +++ b/gemfiles/ruby_3.2_cucumber_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_cucumber_3.gemfile.lock b/gemfiles/ruby_3.2_cucumber_3.gemfile.lock index f90ca407..ed6da19e 100644 --- a/gemfiles/ruby_3.2_cucumber_3.gemfile.lock +++ b/gemfiles/ruby_3.2_cucumber_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -32,10 +33,9 @@ GEM cucumber-expressions (6.0.1) cucumber-tag_expressions (1.1.1) cucumber-wire (0.0.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -43,16 +43,13 @@ GEM docile (1.4.0) ffi (1.16.3) gherkin (5.1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) - libddwaf (1.14.0.0.0-arm64-darwin) - ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2) multi_json (1.15.0) multi_test (1.1.0) @@ -67,7 +64,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -134,18 +133,17 @@ GEM PLATFORMS aarch64-linux - arm64-darwin-22 DEPENDENCIES appraisal climate_control cucumber (~> 3) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_cucumber_4.gemfile b/gemfiles/ruby_3.2_cucumber_4.gemfile index b6c68188..5177689d 100644 --- a/gemfiles/ruby_3.2_cucumber_4.gemfile +++ b/gemfiles/ruby_3.2_cucumber_4.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_cucumber_4.gemfile.lock b/gemfiles/ruby_3.2_cucumber_4.gemfile.lock index 2fa7e46a..67c6c507 100644 --- a/gemfiles/ruby_3.2_cucumber_4.gemfile.lock +++ b/gemfiles/ruby_3.2_cucumber_4.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -52,10 +53,9 @@ GEM cucumber-core (~> 7.1, >= 7.1.0) cucumber-cucumber-expressions (~> 10.1, >= 10.1.0) cucumber-messages (~> 12.2, >= 12.2.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -64,16 +64,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) - libddwaf (1.14.0.0.0-arm64-darwin) - ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) minitest (5.22.3) msgpack (1.7.2) @@ -94,7 +91,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -166,7 +165,6 @@ GEM PLATFORMS aarch64-linux - arm64-darwin-22 DEPENDENCIES activesupport (< 7.1) @@ -174,11 +172,11 @@ DEPENDENCIES climate_control cucumber (~> 4) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_cucumber_5.gemfile b/gemfiles/ruby_3.2_cucumber_5.gemfile index a1173bf8..35ab0fca 100644 --- a/gemfiles/ruby_3.2_cucumber_5.gemfile +++ b/gemfiles/ruby_3.2_cucumber_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_cucumber_5.gemfile.lock b/gemfiles/ruby_3.2_cucumber_5.gemfile.lock index 021c301e..092304ed 100644 --- a/gemfiles/ruby_3.2_cucumber_5.gemfile.lock +++ b/gemfiles/ruby_3.2_cucumber_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -52,10 +53,9 @@ GEM cucumber-core (~> 8.0, >= 8.0.1) cucumber-cucumber-expressions (~> 10.3, >= 10.3.0) cucumber-messages (~> 13.0, >= 13.0.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -64,16 +64,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) - libddwaf (1.14.0.0.0-arm64-darwin) - ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) minitest (5.22.3) msgpack (1.7.2) @@ -94,7 +91,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -166,7 +165,6 @@ GEM PLATFORMS aarch64-linux - arm64-darwin-22 DEPENDENCIES activesupport (< 7.1) @@ -174,11 +172,11 @@ DEPENDENCIES climate_control cucumber (~> 5) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_cucumber_6.gemfile b/gemfiles/ruby_3.2_cucumber_6.gemfile index dec66193..f88a12a6 100644 --- a/gemfiles/ruby_3.2_cucumber_6.gemfile +++ b/gemfiles/ruby_3.2_cucumber_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_cucumber_6.gemfile.lock b/gemfiles/ruby_3.2_cucumber_6.gemfile.lock index b076ad39..17c2dd9d 100644 --- a/gemfiles/ruby_3.2_cucumber_6.gemfile.lock +++ b/gemfiles/ruby_3.2_cucumber_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -53,10 +54,9 @@ GEM cucumber-core (~> 9.0, >= 9.0.1) cucumber-cucumber-expressions (~> 12.1, >= 12.1.1) cucumber-messages (~> 15.0, >= 15.0.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -65,16 +65,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) - libddwaf (1.14.0.0.0-arm64-darwin) - ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) @@ -98,7 +95,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -170,7 +169,6 @@ GEM PLATFORMS aarch64-linux - arm64-darwin-22 DEPENDENCIES activesupport (< 7.1) @@ -178,11 +176,11 @@ DEPENDENCIES climate_control cucumber (~> 6) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_cucumber_7.gemfile b/gemfiles/ruby_3.2_cucumber_7.gemfile index e2444dd3..2d3a7768 100644 --- a/gemfiles/ruby_3.2_cucumber_7.gemfile +++ b/gemfiles/ruby_3.2_cucumber_7.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_cucumber_7.gemfile.lock b/gemfiles/ruby_3.2_cucumber_7.gemfile.lock index 2f8c0136..aca75974 100644 --- a/gemfiles/ruby_3.2_cucumber_7.gemfile.lock +++ b/gemfiles/ruby_3.2_cucumber_7.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -45,26 +46,22 @@ GEM cucumber-wire (6.2.1) cucumber-core (~> 10.1, >= 10.1.0) cucumber-cucumber-expressions (~> 14.0, >= 14.0.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) - libddwaf (1.14.0.0.0-arm64-darwin) - ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) mime-types-data (3.2024.0305) @@ -81,7 +78,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -150,18 +149,17 @@ GEM PLATFORMS aarch64-linux - arm64-darwin-22 DEPENDENCIES appraisal climate_control cucumber (~> 7) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_cucumber_8.gemfile b/gemfiles/ruby_3.2_cucumber_8.gemfile index 7c5e99fb..ba274849 100644 --- a/gemfiles/ruby_3.2_cucumber_8.gemfile +++ b/gemfiles/ruby_3.2_cucumber_8.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_cucumber_8.gemfile.lock b/gemfiles/ruby_3.2_cucumber_8.gemfile.lock index fc10cbd0..b408c074 100644 --- a/gemfiles/ruby_3.2_cucumber_8.gemfile.lock +++ b/gemfiles/ruby_3.2_cucumber_8.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -39,26 +40,22 @@ GEM cucumber-messages (~> 18.0, >= 18.0.0) cucumber-messages (18.0.0) cucumber-tag-expressions (4.1.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) - libddwaf (1.14.0.0.0-arm64-darwin) - ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) mime-types-data (3.2024.0305) @@ -75,7 +72,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -144,18 +143,17 @@ GEM PLATFORMS aarch64-linux - arm64-darwin-22 DEPENDENCIES appraisal climate_control cucumber (~> 8) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_cucumber_9.gemfile b/gemfiles/ruby_3.2_cucumber_9.gemfile index 126475c4..47c6db1b 100644 --- a/gemfiles/ruby_3.2_cucumber_9.gemfile +++ b/gemfiles/ruby_3.2_cucumber_9.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_cucumber_9.gemfile.lock b/gemfiles/ruby_3.2_cucumber_9.gemfile.lock index 88b1978f..63726d45 100644 --- a/gemfiles/ruby_3.2_cucumber_9.gemfile.lock +++ b/gemfiles/ruby_3.2_cucumber_9.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -29,35 +30,34 @@ GEM multi_test (~> 1.1) sys-uname (~> 1.2) cucumber-ci-environment (10.0.1) - cucumber-core (13.0.1) + cucumber-core (13.0.2) cucumber-gherkin (>= 27, < 28) cucumber-messages (>= 20, < 23) cucumber-tag-expressions (> 5, < 7) - cucumber-cucumber-expressions (17.0.2) + cucumber-cucumber-expressions (17.1.0) bigdecimal cucumber-gherkin (27.0.0) cucumber-messages (>= 19.1.4, < 23) - cucumber-html-formatter (21.3.0) + cucumber-html-formatter (21.3.1) cucumber-messages (> 19, < 25) cucumber-messages (22.0.0) cucumber-tag-expressions (6.1.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mini_mime (1.1.5) msgpack (1.7.2) multi_test (1.1.0) @@ -72,7 +72,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -147,11 +149,11 @@ DEPENDENCIES climate_control cucumber (~> 9) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_minitest_5.gemfile b/gemfiles/ruby_3.2_minitest_5.gemfile index b30188da..17603638 100644 --- a/gemfiles/ruby_3.2_minitest_5.gemfile +++ b/gemfiles/ruby_3.2_minitest_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_minitest_5.gemfile.lock b/gemfiles/ruby_3.2_minitest_5.gemfile.lock index 66157583..535dff2b 100644 --- a/gemfiles/ruby_3.2_minitest_5.gemfile.lock +++ b/gemfiles/ruby_3.2_minitest_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,26 +15,22 @@ GEM ast (2.4.2) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) - libddwaf (1.14.0.0.0-arm64-darwin) - ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -47,7 +44,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -114,18 +113,17 @@ GEM PLATFORMS aarch64-linux - arm64-darwin-22 DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace minitest (~> 5) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile b/gemfiles/ruby_3.2_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile index c9ee7fa3..da315644 100644 --- a/gemfiles/ruby_3.2_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile +++ b/gemfiles/ruby_3.2_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock b/gemfiles/ruby_3.2_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock index 96d8735c..f9db0468 100644 --- a/gemfiles/ruby_3.2_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock +++ b/gemfiles/ruby_3.2_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -28,10 +29,9 @@ GEM coderay (1.1.3) concurrent-ruby (1.2.3) connection_pool (2.4.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -41,13 +41,13 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) mutex_m (0.2.0) @@ -62,7 +62,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -139,12 +141,12 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace minitest (~> 5) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.2_rspec_3.gemfile b/gemfiles/ruby_3.2_rspec_3.gemfile index 6e1d4097..8a600225 100644 --- a/gemfiles/ruby_3.2_rspec_3.gemfile +++ b/gemfiles/ruby_3.2_rspec_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec", "~> 3" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.2_rspec_3.gemfile.lock b/gemfiles/ruby_3.2_rspec_3.gemfile.lock index c9253e48..aa9e9de0 100644 --- a/gemfiles/ruby_3.2_rspec_3.gemfile.lock +++ b/gemfiles/ruby_3.2_rspec_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,26 +15,22 @@ GEM ast (2.4.2) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) - libddwaf (1.14.0.0.0-arm64-darwin) - ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2) os (1.1.4) parallel (1.24.0) @@ -46,7 +43,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -113,17 +112,16 @@ GEM PLATFORMS aarch64-linux - arm64-darwin-22 DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec (~> 3) rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_activesupport_4.gemfile b/gemfiles/ruby_3.3_activesupport_4.gemfile index e0942bd4..82e35051 100644 --- a/gemfiles/ruby_3.3_activesupport_4.gemfile +++ b/gemfiles/ruby_3.3_activesupport_4.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_activesupport_4.gemfile.lock b/gemfiles/ruby_3.3_activesupport_4.gemfile.lock index a84ce514..d9ca4995 100644 --- a/gemfiles/ruby_3.3_activesupport_4.gemfile.lock +++ b/gemfiles/ruby_3.3_activesupport_4.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -20,10 +21,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -32,16 +32,16 @@ GEM ffi (1.16.3) i18n (0.9.5) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -55,7 +55,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -132,11 +134,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_activesupport_5.gemfile b/gemfiles/ruby_3.3_activesupport_5.gemfile index c179d19f..c27b3fd3 100644 --- a/gemfiles/ruby_3.3_activesupport_5.gemfile +++ b/gemfiles/ruby_3.3_activesupport_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_activesupport_5.gemfile.lock b/gemfiles/ruby_3.3_activesupport_5.gemfile.lock index 06a82744..0d6f02f2 100644 --- a/gemfiles/ruby_3.3_activesupport_5.gemfile.lock +++ b/gemfiles/ruby_3.3_activesupport_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -20,10 +21,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -32,16 +32,16 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -55,7 +55,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -132,11 +134,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_activesupport_6.gemfile b/gemfiles/ruby_3.3_activesupport_6.gemfile index b4b3dd02..f83569de 100644 --- a/gemfiles/ruby_3.3_activesupport_6.gemfile +++ b/gemfiles/ruby_3.3_activesupport_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_activesupport_6.gemfile.lock b/gemfiles/ruby_3.3_activesupport_6.gemfile.lock index 68e8fd96..e227b0b0 100644 --- a/gemfiles/ruby_3.3_activesupport_6.gemfile.lock +++ b/gemfiles/ruby_3.3_activesupport_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -21,10 +22,9 @@ GEM climate_control (1.2.0) coderay (1.1.3) concurrent-ruby (1.2.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -33,16 +33,16 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -56,7 +56,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -133,11 +135,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_activesupport_7.gemfile b/gemfiles/ruby_3.3_activesupport_7.gemfile index 408bceae..357a72c1 100644 --- a/gemfiles/ruby_3.3_activesupport_7.gemfile +++ b/gemfiles/ruby_3.3_activesupport_7.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_activesupport_7.gemfile.lock b/gemfiles/ruby_3.3_activesupport_7.gemfile.lock index 8d91f834..d2f174dd 100644 --- a/gemfiles/ruby_3.3_activesupport_7.gemfile.lock +++ b/gemfiles/ruby_3.3_activesupport_7.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -28,10 +29,9 @@ GEM coderay (1.1.3) concurrent-ruby (1.2.3) connection_pool (2.4.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -41,16 +41,16 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) mutex_m (0.2.0) @@ -65,7 +65,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -141,11 +143,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_ci_queue_0_minitest_5.gemfile b/gemfiles/ruby_3.3_ci_queue_0_minitest_5.gemfile index af228342..d50f9499 100644 --- a/gemfiles/ruby_3.3_ci_queue_0_minitest_5.gemfile +++ b/gemfiles/ruby_3.3_ci_queue_0_minitest_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_ci_queue_0_minitest_5.gemfile.lock b/gemfiles/ruby_3.3_ci_queue_0_minitest_5.gemfile.lock index 0836e4d3..e6a52eae 100644 --- a/gemfiles/ruby_3.3_ci_queue_0_minitest_5.gemfile.lock +++ b/gemfiles/ruby_3.3_ci_queue_0_minitest_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,29 +15,28 @@ GEM thor (>= 0.14.0) ast (2.4.2) builder (3.2.4) - ci-queue (0.47.0) + ci-queue (0.49.0) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) minitest-reporters (1.6.1) ansi @@ -55,7 +55,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -129,13 +131,13 @@ DEPENDENCIES ci-queue (~> 0) climate_control datadog-ci! - ddtrace minitest (~> 5) minitest-reporters (~> 1) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_ci_queue_0_rspec_3.gemfile b/gemfiles/ruby_3.3_ci_queue_0_rspec_3.gemfile index 92f54a22..7d35ef19 100644 --- a/gemfiles/ruby_3.3_ci_queue_0_rspec_3.gemfile +++ b/gemfiles/ruby_3.3_ci_queue_0_rspec_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec", "~> 3" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_ci_queue_0_rspec_3.gemfile.lock b/gemfiles/ruby_3.3_ci_queue_0_rspec_3.gemfile.lock index 780cb7c2..6030697c 100644 --- a/gemfiles/ruby_3.3_ci_queue_0_rspec_3.gemfile.lock +++ b/gemfiles/ruby_3.3_ci_queue_0_rspec_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -12,29 +13,28 @@ GEM rake thor (>= 0.14.0) ast (2.4.2) - ci-queue (0.47.0) + ci-queue (0.49.0) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2) os (1.1.4) parallel (1.24.0) @@ -47,7 +47,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -121,11 +123,11 @@ DEPENDENCIES ci-queue (~> 0) climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec (~> 3) rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_cucumber_3.gemfile b/gemfiles/ruby_3.3_cucumber_3.gemfile index 1f55b450..e3fb6988 100644 --- a/gemfiles/ruby_3.3_cucumber_3.gemfile +++ b/gemfiles/ruby_3.3_cucumber_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_cucumber_3.gemfile.lock b/gemfiles/ruby_3.3_cucumber_3.gemfile.lock index 413eef1a..659ffeea 100644 --- a/gemfiles/ruby_3.3_cucumber_3.gemfile.lock +++ b/gemfiles/ruby_3.3_cucumber_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -32,10 +33,9 @@ GEM cucumber-expressions (6.0.1) cucumber-tag_expressions (1.1.1) cucumber-wire (0.0.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -43,16 +43,16 @@ GEM docile (1.4.0) ffi (1.16.3) gherkin (5.1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2) multi_json (1.15.0) multi_test (1.1.0) @@ -67,7 +67,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -141,11 +143,11 @@ DEPENDENCIES climate_control cucumber (~> 3) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_cucumber_4.gemfile b/gemfiles/ruby_3.3_cucumber_4.gemfile index b6c68188..5177689d 100644 --- a/gemfiles/ruby_3.3_cucumber_4.gemfile +++ b/gemfiles/ruby_3.3_cucumber_4.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_cucumber_4.gemfile.lock b/gemfiles/ruby_3.3_cucumber_4.gemfile.lock index f4a62998..0707caff 100644 --- a/gemfiles/ruby_3.3_cucumber_4.gemfile.lock +++ b/gemfiles/ruby_3.3_cucumber_4.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -48,10 +49,9 @@ GEM cucumber-core (~> 7.0, >= 7.0.0) cucumber-cucumber-expressions (~> 10.1, >= 10.1.0) cucumber-messages (~> 12.1, >= 12.1.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -60,16 +60,16 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) minitest (5.22.3) msgpack (1.7.2) @@ -90,7 +90,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -170,11 +172,11 @@ DEPENDENCIES climate_control cucumber (~> 4) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_cucumber_5.gemfile b/gemfiles/ruby_3.3_cucumber_5.gemfile index a1173bf8..35ab0fca 100644 --- a/gemfiles/ruby_3.3_cucumber_5.gemfile +++ b/gemfiles/ruby_3.3_cucumber_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_cucumber_5.gemfile.lock b/gemfiles/ruby_3.3_cucumber_5.gemfile.lock index 667f3669..c99d67b3 100644 --- a/gemfiles/ruby_3.3_cucumber_5.gemfile.lock +++ b/gemfiles/ruby_3.3_cucumber_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -52,10 +53,9 @@ GEM cucumber-core (~> 8.0, >= 8.0.1) cucumber-cucumber-expressions (~> 10.3, >= 10.3.0) cucumber-messages (~> 13.0, >= 13.0.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -64,16 +64,16 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) minitest (5.22.3) msgpack (1.7.2) @@ -94,7 +94,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -174,11 +176,11 @@ DEPENDENCIES climate_control cucumber (~> 5) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_cucumber_6.gemfile b/gemfiles/ruby_3.3_cucumber_6.gemfile index dec66193..f88a12a6 100644 --- a/gemfiles/ruby_3.3_cucumber_6.gemfile +++ b/gemfiles/ruby_3.3_cucumber_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_cucumber_6.gemfile.lock b/gemfiles/ruby_3.3_cucumber_6.gemfile.lock index bc1ec721..465d1a23 100644 --- a/gemfiles/ruby_3.3_cucumber_6.gemfile.lock +++ b/gemfiles/ruby_3.3_cucumber_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -53,10 +54,9 @@ GEM cucumber-core (~> 9.0, >= 9.0.1) cucumber-cucumber-expressions (~> 12.1, >= 12.1.1) cucumber-messages (~> 15.0, >= 15.0.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -65,16 +65,16 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) middleware (0.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) @@ -98,7 +98,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -178,11 +180,11 @@ DEPENDENCIES climate_control cucumber (~> 6) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_cucumber_7.gemfile b/gemfiles/ruby_3.3_cucumber_7.gemfile index e2444dd3..2d3a7768 100644 --- a/gemfiles/ruby_3.3_cucumber_7.gemfile +++ b/gemfiles/ruby_3.3_cucumber_7.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_cucumber_7.gemfile.lock b/gemfiles/ruby_3.3_cucumber_7.gemfile.lock index 4d7ed20c..5cba339e 100644 --- a/gemfiles/ruby_3.3_cucumber_7.gemfile.lock +++ b/gemfiles/ruby_3.3_cucumber_7.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -45,26 +46,25 @@ GEM cucumber-wire (6.2.1) cucumber-core (~> 10.1, >= 10.1.0) cucumber-cucumber-expressions (~> 14.0, >= 14.0.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) mime-types-data (3.2024.0305) @@ -81,7 +81,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -157,11 +159,11 @@ DEPENDENCIES climate_control cucumber (~> 7) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_cucumber_8.gemfile b/gemfiles/ruby_3.3_cucumber_8.gemfile index 7c5e99fb..ba274849 100644 --- a/gemfiles/ruby_3.3_cucumber_8.gemfile +++ b/gemfiles/ruby_3.3_cucumber_8.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_cucumber_8.gemfile.lock b/gemfiles/ruby_3.3_cucumber_8.gemfile.lock index e4cc8982..a6134b8e 100644 --- a/gemfiles/ruby_3.3_cucumber_8.gemfile.lock +++ b/gemfiles/ruby_3.3_cucumber_8.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -39,26 +40,25 @@ GEM cucumber-messages (~> 18.0, >= 18.0.0) cucumber-messages (18.0.0) cucumber-tag-expressions (4.1.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) mime-types-data (3.2024.0305) @@ -75,7 +75,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -151,11 +153,11 @@ DEPENDENCIES climate_control cucumber (~> 8) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_cucumber_9.gemfile b/gemfiles/ruby_3.3_cucumber_9.gemfile index 126475c4..47c6db1b 100644 --- a/gemfiles/ruby_3.3_cucumber_9.gemfile +++ b/gemfiles/ruby_3.3_cucumber_9.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_cucumber_9.gemfile.lock b/gemfiles/ruby_3.3_cucumber_9.gemfile.lock index a6d637b0..84ceeb10 100644 --- a/gemfiles/ruby_3.3_cucumber_9.gemfile.lock +++ b/gemfiles/ruby_3.3_cucumber_9.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -29,38 +30,37 @@ GEM multi_test (~> 1.1) sys-uname (~> 1.2) cucumber-ci-environment (10.0.1) - cucumber-core (13.0.1) + cucumber-core (13.0.2) cucumber-gherkin (>= 27, < 28) cucumber-messages (>= 20, < 23) cucumber-tag-expressions (> 5, < 7) - cucumber-cucumber-expressions (17.0.2) + cucumber-cucumber-expressions (17.1.0) bigdecimal cucumber-gherkin (27.0.0) cucumber-messages (>= 19.1.4, < 23) - cucumber-html-formatter (21.3.0) + cucumber-html-formatter (21.3.1) cucumber-messages (> 19, < 25) cucumber-messages (22.0.0) cucumber-tag-expressions (6.1.0) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) mini_mime (1.1.5) msgpack (1.7.2) multi_test (1.1.0) @@ -75,7 +75,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -151,11 +153,11 @@ DEPENDENCIES climate_control cucumber (~> 9) datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_minitest_5.gemfile b/gemfiles/ruby_3.3_minitest_5.gemfile index b30188da..17603638 100644 --- a/gemfiles/ruby_3.3_minitest_5.gemfile +++ b/gemfiles/ruby_3.3_minitest_5.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_minitest_5.gemfile.lock b/gemfiles/ruby_3.3_minitest_5.gemfile.lock index a767e2c6..5943b851 100644 --- a/gemfiles/ruby_3.3_minitest_5.gemfile.lock +++ b/gemfiles/ruby_3.3_minitest_5.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,26 +15,25 @@ GEM ast (2.4.2) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) os (1.1.4) @@ -47,7 +47,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -120,12 +122,12 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace minitest (~> 5) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile b/gemfiles/ruby_3.3_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile index c9ee7fa3..da315644 100644 --- a/gemfiles/ruby_3.3_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile +++ b/gemfiles/ruby_3.3_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock b/gemfiles/ruby_3.3_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock index 3f6d2f84..2d077839 100644 --- a/gemfiles/ruby_3.3_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock +++ b/gemfiles/ruby_3.3_minitest_5_shoulda_context_2_shoulda_matchers_6.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -28,10 +29,9 @@ GEM coderay (1.1.3) concurrent-ruby (1.2.3) connection_pool (2.4.1) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) @@ -41,16 +41,16 @@ GEM ffi (1.16.3) i18n (1.14.4) concurrent-ruby (~> 1.0) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) minitest (5.22.3) msgpack (1.7.2) mutex_m (0.2.0) @@ -65,7 +65,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -143,12 +145,12 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace minitest (~> 5) os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec rspec-collection_matchers diff --git a/gemfiles/ruby_3.3_rspec_3.gemfile b/gemfiles/ruby_3.3_rspec_3.gemfile index 6e1d4097..8a600225 100644 --- a/gemfiles/ruby_3.3_rspec_3.gemfile +++ b/gemfiles/ruby_3.3_rspec_3.gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "ddtrace" gem "pry" gem "rake" gem "os" +gem "rake-compiler" gem "climate_control" gem "rspec", "~> 3" gem "rspec-collection_matchers" diff --git a/gemfiles/ruby_3.3_rspec_3.gemfile.lock b/gemfiles/ruby_3.3_rspec_3.gemfile.lock index 3a3407a7..fef5e438 100644 --- a/gemfiles/ruby_3.3_rspec_3.gemfile.lock +++ b/gemfiles/ruby_3.3_rspec_3.gemfile.lock @@ -1,7 +1,8 @@ PATH remote: .. specs: - datadog-ci (0.8.3) + datadog-ci (1.0.0.beta1) + datadog (~> 2.0.0.beta2) msgpack GEM @@ -14,26 +15,25 @@ GEM ast (2.4.2) climate_control (1.2.0) coderay (1.1.3) - ddtrace (1.21.0) - datadog-ci (~> 0.8.1) + datadog (2.0.0.beta2) debase-ruby_core_source (= 3.3.1) - libdatadog (~> 6.0.0.2.0) + libdatadog (~> 7.0.0.1.0) libddwaf (~> 1.14.0.0.0) msgpack debase-ruby_core_source (3.3.1) diff-lcs (1.5.1) docile (1.4.0) ffi (1.16.3) - json (2.7.1) + json (2.7.2) language_server-protocol (3.17.0.3) - libdatadog (6.0.0.2.0) - libdatadog (6.0.0.2.0-aarch64-linux) + libdatadog (7.0.0.1.0) + libdatadog (7.0.0.1.0-aarch64-linux) libddwaf (1.14.0.0.0-aarch64-linux) ffi (~> 1.0) libddwaf (1.14.0.0.0-arm64-darwin) ffi (~> 1.0) lint_roller (1.1.0) - method_source (1.0.0) + method_source (1.1.0) msgpack (1.7.2) os (1.1.4) parallel (1.24.0) @@ -46,7 +46,9 @@ GEM method_source (~> 1.0) racc (1.7.3) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) + rake-compiler (1.2.7) + rake redcarpet (3.6.0) regexp_parser (2.9.0) rexml (3.2.6) @@ -119,11 +121,11 @@ DEPENDENCIES appraisal climate_control datadog-ci! - ddtrace os pimpmychangelog (>= 0.1.2) pry rake + rake-compiler redcarpet rspec (~> 3) rspec-collection_matchers diff --git a/integration/app/Gemfile b/integration/app/Gemfile index adfe94ad..361ac69a 100644 --- a/integration/app/Gemfile +++ b/integration/app/Gemfile @@ -6,5 +6,4 @@ gem "pry" gem "rspec" gem "rake" gem "cucumber", "~> 7" -gem "ddtrace" gem "datadog-ci", path: "/vendor/datadog-ci" diff --git a/lib/datadog/ci.rb b/lib/datadog/ci.rb index 449ab36b..6024e891 100644 --- a/lib/datadog/ci.rb +++ b/lib/datadog/ci.rb @@ -364,6 +364,10 @@ def components def recorder components.ci_recorder end + + def itr_runner + components.itr + end end end end diff --git a/lib/datadog/ci/configuration/components.rb b/lib/datadog/ci/configuration/components.rb index 9977a401..329f9546 100644 --- a/lib/datadog/ci/configuration/components.rb +++ b/lib/datadog/ci/configuration/components.rb @@ -1,7 +1,10 @@ # frozen_string_literal: true require_relative "../ext/settings" +require_relative "../git/tree_uploader" require_relative "../itr/runner" +require_relative "../itr/coverage/transport" +require_relative "../itr/coverage/writer" require_relative "../test_visibility/flush" require_relative "../test_visibility/recorder" require_relative "../test_visibility/null_recorder" @@ -10,25 +13,34 @@ require_relative "../test_visibility/transport" require_relative "../transport/api/builder" require_relative "../transport/remote_settings_api" +require_relative "../worker" module Datadog module CI module Configuration # Adds CI behavior to Datadog trace components module Components - attr_reader :ci_recorder + attr_reader :ci_recorder, :itr def initialize(settings) # Activate CI mode if enabled if settings.ci.enabled activate_ci!(settings) else + @itr = nil @ci_recorder = TestVisibility::NullRecorder.new end super end + def shutdown!(replacement = nil) + super + + @ci_recorder&.shutdown! + @itr&.shutdown! + end + def activate_ci!(settings) # Configure ddtrace library for CI visibility mode # Deactivate telemetry @@ -49,10 +61,17 @@ def activate_ci!(settings) # transport creation writer_options = settings.ci.writer_options + coverage_writer = nil test_visibility_api = build_test_visibility_api(settings) if test_visibility_api - writer_options[:transport] = Datadog::CI::TestVisibility::Transport.new( + # setup writer for code coverage payloads + coverage_writer = ITR::Coverage::Writer.new( + transport: ITR::Coverage::Transport.new(api: test_visibility_api) + ) + + # configure tracing writer to send traces to CI visibility backend + writer_options[:transport] = TestVisibility::Transport.new( api: test_visibility_api, serializers_factory: serializers_factory(settings), dd_env: settings.env @@ -71,21 +90,36 @@ def activate_ci!(settings) settings.tracing.test_mode.writer_options = writer_options - itr = Datadog::CI::ITR::Runner.new( - enabled: settings.ci.enabled && settings.ci.itr_enabled - ) - remote_settings_api = Transport::RemoteSettingsApi.new( api: test_visibility_api, dd_env: settings.env ) + itr = ITR::Runner.new( + api: test_visibility_api, + dd_env: settings.env, + coverage_writer: coverage_writer, + enabled: settings.ci.enabled && settings.ci.itr_enabled + ) + + git_tree_uploader = Git::TreeUploader.new(api: test_visibility_api) + git_tree_upload_worker = if settings.ci.git_metadata_upload_enabled + Worker.new do |repository_url| + git_tree_uploader.call(repository_url) + end + else + DummyWorker.new + end + # CI visibility recorder global instance @ci_recorder = TestVisibility::Recorder.new( test_suite_level_visibility_enabled: !settings.ci.force_test_level_visibility, itr: itr, - remote_settings_api: remote_settings_api + remote_settings_api: remote_settings_api, + git_tree_upload_worker: git_tree_upload_worker ) + + @itr = itr end def build_test_visibility_api(settings) @@ -122,9 +156,9 @@ def build_test_visibility_api(settings) def serializers_factory(settings) if settings.ci.force_test_level_visibility - Datadog::CI::TestVisibility::Serializers::Factories::TestLevel + TestVisibility::Serializers::Factories::TestLevel else - Datadog::CI::TestVisibility::Serializers::Factories::TestSuiteLevel + TestVisibility::Serializers::Factories::TestSuiteLevel end end diff --git a/lib/datadog/ci/configuration/settings.rb b/lib/datadog/ci/configuration/settings.rb index 2e85a023..64a8d0e2 100644 --- a/lib/datadog/ci/configuration/settings.rb +++ b/lib/datadog/ci/configuration/settings.rb @@ -47,7 +47,7 @@ def self.add_settings!(base) o.after_set do |value| if value Datadog::Core.log_deprecation do - "The experimental_test_suite_level_visibility_enabled setting has no effect and will be removed in 1.0. " \ + "The experimental_test_suite_level_visibility_enabled setting has no effect and will be removed in 2.0. " \ "Test suite level visibility is now enabled by default. " \ "If you want to disable test suite level visibility set configuration.ci.force_test_level_visibility = true." end @@ -61,6 +61,12 @@ def self.add_settings!(base) o.default false end + option :git_metadata_upload_enabled do |o| + o.type :bool + o.env CI::Ext::Settings::ENV_GIT_METADATA_UPLOAD_ENABLED + o.default true + end + define_method(:instrument) do |integration_name, options = {}, &block| return unless enabled diff --git a/lib/datadog/ci/contrib/cucumber/configuration/settings.rb b/lib/datadog/ci/contrib/cucumber/configuration/settings.rb index 5a84ad29..38f21f48 100644 --- a/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +++ b/lib/datadog/ci/contrib/cucumber/configuration/settings.rb @@ -26,21 +26,6 @@ class Settings < Datadog::CI::Contrib::Settings Utils::Configuration.fetch_service_name(Ext::DEFAULT_SERVICE_NAME) end end - - # @deprecated Will be removed in 1.0 - option :operation_name do |o| - o.type :string - o.env Ext::ENV_OPERATION_NAME - o.default Ext::OPERATION_NAME - - o.after_set do |value| - if value && value != Ext::OPERATION_NAME - Datadog::Core.log_deprecation do - "The operation_name setting has no effect and will be removed in 1.0" - end - end - end - end end end end diff --git a/lib/datadog/ci/contrib/cucumber/ext.rb b/lib/datadog/ci/contrib/cucumber/ext.rb index f8043a1f..bf9b4f87 100644 --- a/lib/datadog/ci/contrib/cucumber/ext.rb +++ b/lib/datadog/ci/contrib/cucumber/ext.rb @@ -5,7 +5,7 @@ module CI module Contrib module Cucumber # Cucumber integration constants - # TODO: mark as `@public_api` when GA, to protect from resource and tag name changes. + # @public_api module Ext ENV_ENABLED = "DD_TRACE_CUCUMBER_ENABLED" DEFAULT_SERVICE_NAME = "cucumber" @@ -13,10 +13,6 @@ module Ext FRAMEWORK = "cucumber" STEP_SPAN_TYPE = "step" - - # TODO: remove in 1.0 - ENV_OPERATION_NAME = "DD_TRACE_CUCUMBER_OPERATION_NAME" - OPERATION_NAME = "cucumber.test" end end end diff --git a/lib/datadog/ci/contrib/cucumber/formatter.rb b/lib/datadog/ci/contrib/cucumber/formatter.rb index 310e58ad..4abc14b2 100644 --- a/lib/datadog/ci/contrib/cucumber/formatter.rb +++ b/lib/datadog/ci/contrib/cucumber/formatter.rb @@ -1,7 +1,8 @@ # frozen_string_literal: true require_relative "../../ext/test" -require_relative "../../utils/git" +require_relative "../../git/local_repository" +require_relative "../../utils/test_run" require_relative "ext" module Datadog @@ -55,25 +56,26 @@ def on_test_run_finished(event) def on_test_case_started(event) test_suite_name = test_suite_name(event.test_case) + # @type var tags: Hash[String, String] tags = { CI::Ext::Test::TAG_FRAMEWORK => Ext::FRAMEWORK, CI::Ext::Test::TAG_FRAMEWORK_VERSION => CI::Contrib::Cucumber::Integration.version.to_s, - CI::Ext::Test::TAG_SOURCE_FILE => Utils::Git.relative_to_root(event.test_case.location.file), + CI::Ext::Test::TAG_SOURCE_FILE => Git::LocalRepository.relative_to_root(event.test_case.location.file), CI::Ext::Test::TAG_SOURCE_START => event.test_case.location.line.to_s } + if (parameters = extract_parameters_hash(event.test_case)) + tags[CI::Ext::Test::TAG_PARAMETERS] = Utils::TestRun.test_parameters(arguments: parameters) + end + start_test_suite(test_suite_name) unless same_test_suite_as_current?(test_suite_name) - test_span = CI.start_test( + CI.start_test( event.test_case.name, test_suite_name, tags: tags, service: configuration[:service_name] ) - - if test_span && (parameters = extract_parameters_hash(event.test_case)) - test_span.set_parameters(parameters) - end end def on_test_case_finished(event) @@ -100,9 +102,8 @@ def on_test_step_finished(event) def test_suite_name(test_case) feature = if test_case.respond_to?(:feature) test_case.feature - elsif @ast_lookup - gherkin_doc = @ast_lookup.gherkin_document(test_case.location.file) - gherkin_doc.feature if gherkin_doc + else + @ast_lookup&.gherkin_document(test_case.location.file)&.feature end if feature @@ -150,19 +151,13 @@ def start_test_suite(test_suite_name) end def finish_current_test_suite - test_suite = @current_test_suite - return unless test_suite - - test_suite.finish + @current_test_suite&.finish @current_test_suite = nil end def same_test_suite_as_current?(test_suite_name) - test_suite = @current_test_suite - return false unless test_suite - - test_suite.name == test_suite_name + @current_test_suite&.name == test_suite_name end def extract_parameters_hash(test_case) diff --git a/lib/datadog/ci/contrib/cucumber/integration.rb b/lib/datadog/ci/contrib/cucumber/integration.rb index 1739a13c..bbbcf82c 100644 --- a/lib/datadog/ci/contrib/cucumber/integration.rb +++ b/lib/datadog/ci/contrib/cucumber/integration.rb @@ -17,8 +17,7 @@ class Integration register_as :cucumber def self.version - Gem.loaded_specs["cucumber"] \ - && Gem.loaded_specs["cucumber"].version + Gem.loaded_specs["cucumber"]&.version end def self.loaded? diff --git a/lib/datadog/ci/contrib/cucumber/patcher.rb b/lib/datadog/ci/contrib/cucumber/patcher.rb index 268404bf..a36e9b05 100644 --- a/lib/datadog/ci/contrib/cucumber/patcher.rb +++ b/lib/datadog/ci/contrib/cucumber/patcher.rb @@ -1,7 +1,9 @@ # frozen_string_literal: true require "datadog/tracing/contrib/patcher" + require_relative "instrumentation" +require_relative "step" module Datadog module CI @@ -19,6 +21,7 @@ def target_version def patch ::Cucumber::Runtime.include(Instrumentation) + ::Cucumber::Core::Test::Step.include(Datadog::CI::Contrib::Cucumber::Step) end end end diff --git a/lib/datadog/ci/contrib/cucumber/step.rb b/lib/datadog/ci/contrib/cucumber/step.rb new file mode 100644 index 00000000..90079c3b --- /dev/null +++ b/lib/datadog/ci/contrib/cucumber/step.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module Datadog + module CI + module Contrib + module Cucumber + # instruments Cucumber::Core::Test::Step from cucumber-ruby-core to change + module Step + def self.included(base) + base.prepend(InstanceMethods) + end + + module InstanceMethods + def execute(*args) + test_span = CI.active_test + if test_span&.skipped_by_itr? + @action.skip(*args) + else + super + end + end + end + end + end + end + end +end diff --git a/lib/datadog/ci/contrib/minitest/configuration/settings.rb b/lib/datadog/ci/contrib/minitest/configuration/settings.rb index d6bd0a61..38a20c1e 100644 --- a/lib/datadog/ci/contrib/minitest/configuration/settings.rb +++ b/lib/datadog/ci/contrib/minitest/configuration/settings.rb @@ -24,21 +24,6 @@ class Settings < Datadog::CI::Contrib::Settings Utils::Configuration.fetch_service_name(Ext::DEFAULT_SERVICE_NAME) end end - - # @deprecated Will be removed in 1.0 - option :operation_name do |o| - o.type :string - o.env Ext::ENV_OPERATION_NAME - o.default Ext::OPERATION_NAME - - o.after_set do |value| - if value && value != Ext::OPERATION_NAME - Datadog::Core.log_deprecation do - "The operation_name setting has no effect and will be removed in 1.0" - end - end - end - end end end end diff --git a/lib/datadog/ci/contrib/minitest/ext.rb b/lib/datadog/ci/contrib/minitest/ext.rb index 6fe194ce..0aa02251 100644 --- a/lib/datadog/ci/contrib/minitest/ext.rb +++ b/lib/datadog/ci/contrib/minitest/ext.rb @@ -5,17 +5,13 @@ module CI module Contrib module Minitest # Minitest integration constants - # TODO: mark as `@public_api` when GA, to protect from resource and tag name changes. + # @public_api module Ext ENV_ENABLED = "DD_TRACE_MINITEST_ENABLED" FRAMEWORK = "minitest" DEFAULT_SERVICE_NAME = "minitest" - - # TODO: remove in 1.0 - ENV_OPERATION_NAME = "DD_TRACE_MINITEST_OPERATION_NAME" - OPERATION_NAME = "minitest.test" end end end diff --git a/lib/datadog/ci/contrib/minitest/helpers.rb b/lib/datadog/ci/contrib/minitest/helpers.rb index 69f5173d..5a487661 100644 --- a/lib/datadog/ci/contrib/minitest/helpers.rb +++ b/lib/datadog/ci/contrib/minitest/helpers.rb @@ -25,8 +25,7 @@ def self.parallel?(klass) def self.extract_source_location_from_class(klass) return nil if klass.nil? || klass.name.nil? - source_location = klass.const_source_location(klass.name) - source_location.first unless source_location.nil? + klass.const_source_location(klass.name)&.first rescue nil end diff --git a/lib/datadog/ci/contrib/minitest/hooks.rb b/lib/datadog/ci/contrib/minitest/hooks.rb index 293efe6f..70cfa0d7 100644 --- a/lib/datadog/ci/contrib/minitest/hooks.rb +++ b/lib/datadog/ci/contrib/minitest/hooks.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require_relative "../../ext/test" +require_relative "../../git/local_repository" require_relative "ext" require_relative "helpers" @@ -24,17 +25,18 @@ def before_setup source_file, line_number = method(name).source_location - CI.start_test( + test_span = CI.start_test( name, test_suite_name, tags: { CI::Ext::Test::TAG_FRAMEWORK => Ext::FRAMEWORK, CI::Ext::Test::TAG_FRAMEWORK_VERSION => CI::Contrib::Minitest::Integration.version.to_s, - CI::Ext::Test::TAG_SOURCE_FILE => Utils::Git.relative_to_root(source_file), + CI::Ext::Test::TAG_SOURCE_FILE => Git::LocalRepository.relative_to_root(source_file), CI::Ext::Test::TAG_SOURCE_START => line_number.to_s }, service: datadog_configuration[:service_name] ) + skip(CI::Ext::Test::ITR_TEST_SKIP_REASON) if test_span&.skipped_by_itr? end def after_teardown diff --git a/lib/datadog/ci/contrib/minitest/integration.rb b/lib/datadog/ci/contrib/minitest/integration.rb index 66382afb..ce1cd89c 100644 --- a/lib/datadog/ci/contrib/minitest/integration.rb +++ b/lib/datadog/ci/contrib/minitest/integration.rb @@ -17,7 +17,7 @@ class Integration register_as :minitest def self.version - Gem.loaded_specs["minitest"] && Gem.loaded_specs["minitest"].version + Gem.loaded_specs["minitest"]&.version end def self.loaded? diff --git a/lib/datadog/ci/contrib/rspec/configuration/settings.rb b/lib/datadog/ci/contrib/rspec/configuration/settings.rb index 6195c2be..4e39211d 100644 --- a/lib/datadog/ci/contrib/rspec/configuration/settings.rb +++ b/lib/datadog/ci/contrib/rspec/configuration/settings.rb @@ -24,21 +24,6 @@ class Settings < Datadog::CI::Contrib::Settings Utils::Configuration.fetch_service_name(Ext::DEFAULT_SERVICE_NAME) end end - - # @deprecated Will be removed in 1.0 - option :operation_name do |o| - o.type :string - o.env Ext::ENV_OPERATION_NAME - o.default Ext::OPERATION_NAME - - o.after_set do |value| - if value && value != Ext::OPERATION_NAME - Datadog::Core.log_deprecation do - "The operation_name setting has no effect and will be removed in 1.0" - end - end - end - end end end end diff --git a/lib/datadog/ci/contrib/rspec/example.rb b/lib/datadog/ci/contrib/rspec/example.rb index 48dd8a38..9c18545e 100644 --- a/lib/datadog/ci/contrib/rspec/example.rb +++ b/lib/datadog/ci/contrib/rspec/example.rb @@ -1,7 +1,8 @@ # frozen_string_literal: true require_relative "../../ext/test" -require_relative "../../utils/git" +require_relative "../../git/local_repository" +require_relative "../../utils/test_run" require_relative "ext" module Datadog @@ -41,35 +42,36 @@ def run(*) tags: { CI::Ext::Test::TAG_FRAMEWORK => Ext::FRAMEWORK, CI::Ext::Test::TAG_FRAMEWORK_VERSION => CI::Contrib::RSpec::Integration.version.to_s, - CI::Ext::Test::TAG_SOURCE_FILE => Utils::Git.relative_to_root(metadata[:file_path]), - CI::Ext::Test::TAG_SOURCE_START => metadata[:line_number].to_s + CI::Ext::Test::TAG_SOURCE_FILE => Git::LocalRepository.relative_to_root(metadata[:file_path]), + CI::Ext::Test::TAG_SOURCE_START => metadata[:line_number].to_s, + CI::Ext::Test::TAG_PARAMETERS => Utils::TestRun.test_parameters( + metadata: {"scoped_id" => metadata[:scoped_id]} + ) }, service: datadog_configuration[:service_name] ) do |test_span| + metadata[:skip] = CI::Ext::Test::ITR_TEST_SKIP_REASON if test_span&.skipped_by_itr? + result = super - if test_span - test_span.set_parameters({}, {"scoped_id" => metadata[:scoped_id]}) - - case execution_result.status - when :passed - test_span.passed! - test_suite_span.passed! if test_suite_span - when :failed - test_span.failed!(exception: execution_result.exception) - test_suite_span.failed! if test_suite_span - else - # :pending or nil - test_span.skipped!( - reason: execution_result.pending_message, - exception: execution_result.pending_exception - ) - - test_suite_span.skipped! if test_suite_span - end + case execution_result.status + when :passed + test_span&.passed! + test_suite_span&.passed! + when :failed + test_span&.failed!(exception: execution_result.exception) + test_suite_span&.failed! + else + # :pending or nil + test_span&.skipped!( + reason: execution_result.pending_message, + exception: execution_result.pending_exception + ) + + test_suite_span&.skipped! end - test_suite_span.finish if test_suite_span + test_suite_span&.finish result end diff --git a/lib/datadog/ci/contrib/rspec/ext.rb b/lib/datadog/ci/contrib/rspec/ext.rb index 31106eee..fb26bad9 100644 --- a/lib/datadog/ci/contrib/rspec/ext.rb +++ b/lib/datadog/ci/contrib/rspec/ext.rb @@ -11,10 +11,6 @@ module Ext DEFAULT_SERVICE_NAME = "rspec" ENV_ENABLED = "DD_TRACE_RSPEC_ENABLED" - - # TODO: remove in 1.0 - ENV_OPERATION_NAME = "DD_TRACE_RSPEC_OPERATION_NAME" - OPERATION_NAME = "rspec.example" end end end diff --git a/lib/datadog/ci/contrib/rspec/integration.rb b/lib/datadog/ci/contrib/rspec/integration.rb index 339cf2be..c0279c79 100644 --- a/lib/datadog/ci/contrib/rspec/integration.rb +++ b/lib/datadog/ci/contrib/rspec/integration.rb @@ -17,8 +17,7 @@ class Integration register_as :rspec def self.version - Gem.loaded_specs["rspec-core"] \ - && Gem.loaded_specs["rspec-core"].version + Gem.loaded_specs["rspec-core"]&.version end def self.loaded? diff --git a/lib/datadog/ci/contrib/settings.rb b/lib/datadog/ci/contrib/settings.rb index 77097c22..73b8e832 100644 --- a/lib/datadog/ci/contrib/settings.rb +++ b/lib/datadog/ci/contrib/settings.rb @@ -11,9 +11,6 @@ class Settings option :enabled, default: true option :service_name - # @deprecated Will be removed in 1.0 - option :operation_name - def configure(options = {}) self.class.options.each do |name, _value| self[name] = options[name] if options.key?(name) diff --git a/lib/datadog/ci/ext/environment.rb b/lib/datadog/ci/ext/environment.rb index 5e53253c..5e3c0034 100644 --- a/lib/datadog/ci/ext/environment.rb +++ b/lib/datadog/ci/ext/environment.rb @@ -3,6 +3,8 @@ require_relative "git" require_relative "environment/extractor" +require_relative "../utils/git" + module Datadog module CI module Ext @@ -21,8 +23,6 @@ module Environment TAG_NODE_NAME = "ci.node.name" TAG_CI_ENV_VARS = "_dd.ci.env_vars" - HEX_NUMBER_REGEXP = /[0-9a-f]{40}/i.freeze - module_function def tags(env) @@ -57,24 +57,19 @@ def validate_repository_url(repo_url) end def validate_git_sha(git_sha) - message = "DD_GIT_COMMIT_SHA must be a full-length git SHA." + return if Utils::Git.valid_commit_sha?(git_sha) - if git_sha.nil? || git_sha.empty? - message += " No value was set and no SHA was automatically extracted." - Datadog.logger.error(message) - return - end + message = "DD_GIT_COMMIT_SHA must be a full-length git SHA." - if git_sha.length < Git::SHA_LENGTH - message += " Expected SHA length #{Git::SHA_LENGTH}, was #{git_sha.length}." - Datadog.logger.error(message) - return + message += if git_sha.nil? || git_sha.empty? + " No value was set and no SHA was automatically extracted." + elsif git_sha.length < Git::SHA_LENGTH + " Expected SHA length #{Git::SHA_LENGTH}, was #{git_sha.length}." + else + " Expected SHA to be a valid HEX number, got #{git_sha}." end - unless HEX_NUMBER_REGEXP =~ git_sha - message += " Expected SHA to be a valid HEX number, got #{git_sha}." - Datadog.logger.error(message) - end + Datadog.logger.error(message) end end end diff --git a/lib/datadog/ci/ext/environment/providers/base.rb b/lib/datadog/ci/ext/environment/providers/base.rb index 1b34cdc9..ee233107 100644 --- a/lib/datadog/ci/ext/environment/providers/base.rb +++ b/lib/datadog/ci/ext/environment/providers/base.rb @@ -103,7 +103,7 @@ def set_branch_and_tag @branch = @tag = nil # @type var branch_or_tag_string: untyped - if branch_or_tag_string && branch_or_tag_string.include?("tags/") + if branch_or_tag_string&.include?("tags/") @tag = branch_or_tag_string else @branch = branch_or_tag_string diff --git a/lib/datadog/ci/ext/environment/providers/bitbucket.rb b/lib/datadog/ci/ext/environment/providers/bitbucket.rb index d90b4535..f4a618fb 100644 --- a/lib/datadog/ci/ext/environment/providers/bitbucket.rb +++ b/lib/datadog/ci/ext/environment/providers/bitbucket.rb @@ -20,7 +20,7 @@ def provider_name end def pipeline_id - env["BITBUCKET_PIPELINE_UUID"] ? env["BITBUCKET_PIPELINE_UUID"].tr("{}", "") : nil + env["BITBUCKET_PIPELINE_UUID"]&.tr("{}", "") end def pipeline_name diff --git a/lib/datadog/ci/ext/environment/providers/local_git.rb b/lib/datadog/ci/ext/environment/providers/local_git.rb index b18ec708..2e68c87f 100644 --- a/lib/datadog/ci/ext/environment/providers/local_git.rb +++ b/lib/datadog/ci/ext/environment/providers/local_git.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require_relative "base" -require_relative "../../../utils/git" +require_relative "../../../git/local_repository" module Datadog module CI @@ -11,48 +11,23 @@ module Providers # As a fallback we try to fetch git information from the local git repository class LocalGit < Base def git_repository_url - Utils::Git.exec_git_command("git ls-remote --get-url") - rescue => e - Datadog.logger.debug( - "Unable to read git repository url: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}" - ) - nil + CI::Git::LocalRepository.git_repository_url end def git_commit_sha - Utils::Git.exec_git_command("git rev-parse HEAD") - rescue => e - Datadog.logger.debug( - "Unable to read git commit SHA: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}" - ) - nil + CI::Git::LocalRepository.git_commit_sha end def git_branch - Utils::Git.exec_git_command("git rev-parse --abbrev-ref HEAD") - rescue => e - Datadog.logger.debug( - "Unable to read git branch: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}" - ) - nil + CI::Git::LocalRepository.git_branch end def git_tag - Utils::Git.exec_git_command("git tag --points-at HEAD") - rescue => e - Datadog.logger.debug( - "Unable to read git tag: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}" - ) - nil + CI::Git::LocalRepository.git_tag end def git_commit_message - Utils::Git.exec_git_command("git show -s --format=%s") - rescue => e - Datadog.logger.debug( - "Unable to read git commit message: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}" - ) - nil + CI::Git::LocalRepository.git_commit_message end def git_commit_author_name @@ -80,12 +55,7 @@ def git_commit_committer_date end def workspace_path - Utils::Git.exec_git_command("git rev-parse --show-toplevel") - rescue => e - Datadog.logger.debug( - "Unable to read git base directory: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}" - ) - nil + CI::Git::LocalRepository.git_root end private @@ -105,48 +75,7 @@ def committer end def set_git_commit_users - # Get committer and author information in one command. - output = Utils::Git.exec_git_command("git show -s --format='%an\t%ae\t%at\t%cn\t%ce\t%ct'") - unless output - Datadog.logger.debug( - "Unable to read git commit users: git command output is nil" - ) - @author = @committer = NilUser.new - return - end - - author_name, author_email, author_timestamp, - committer_name, committer_email, committer_timestamp = output.split("\t").each(&:strip!) - - @author = GitUser.new(author_name, author_email, author_timestamp) - @committer = GitUser.new(committer_name, committer_email, committer_timestamp) - rescue => e - Datadog.logger.debug( - "Unable to read git commit users: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}" - ) - @author = @committer = NilUser.new - end - - class GitUser - attr_reader :name, :email, :timestamp - - def initialize(name, email, timestamp) - @name = name - @email = email - @timestamp = timestamp - end - - def date - return nil if timestamp.nil? - - Time.at(timestamp.to_i).utc.to_datetime.iso8601 - end - end - - class NilUser < GitUser - def initialize - super(nil, nil, nil) - end + @author, @committer = CI::Git::LocalRepository.git_commit_users end end end diff --git a/lib/datadog/ci/ext/settings.rb b/lib/datadog/ci/ext/settings.rb index a6d16a30..9e2bfaf4 100644 --- a/lib/datadog/ci/ext/settings.rb +++ b/lib/datadog/ci/ext/settings.rb @@ -11,6 +11,7 @@ module Settings ENV_EXPERIMENTAL_TEST_SUITE_LEVEL_VISIBILITY_ENABLED = "DD_CIVISIBILITY_EXPERIMENTAL_TEST_SUITE_LEVEL_VISIBILITY_ENABLED" ENV_FORCE_TEST_LEVEL_VISIBILITY = "DD_CIVISIBILITY_FORCE_TEST_LEVEL_VISIBILITY" ENV_ITR_ENABLED = "DD_CIVISIBILITY_ITR_ENABLED" + ENV_GIT_METADATA_UPLOAD_ENABLED = "DD_CIVISIBILITY_GIT_METADATA_UPLOAD_ENABLED" # Source: https://docs.datadoghq.com/getting_started/site/ DD_SITE_ALLOWLIST = [ diff --git a/lib/datadog/ci/ext/test.rb b/lib/datadog/ci/ext/test.rb index 7c548203..838f93c6 100644 --- a/lib/datadog/ci/ext/test.rb +++ b/lib/datadog/ci/ext/test.rb @@ -26,6 +26,9 @@ module Test # ITR tags TAG_ITR_TEST_SKIPPING_ENABLED = "test.itr.tests_skipping.enabled" TAG_ITR_TEST_SKIPPING_TYPE = "test.itr.tests_skipping.type" + TAG_ITR_TEST_SKIPPING_COUNT = "test.itr.tests_skipping.count" + TAG_ITR_SKIPPED_BY_ITR = "test.skipped_by_itr" + TAG_ITR_TESTS_SKIPPED = "_dd.ci.itr.tests_skipped" # Code coverage tags TAG_CODE_COVERAGE_ENABLED = "test.code_coverage.enabled" @@ -43,6 +46,7 @@ module Test # Environment runtime tags TAG_OS_ARCHITECTURE = "os.architecture" TAG_OS_PLATFORM = "os.platform" + TAG_OS_VERSION = "os.version" TAG_RUNTIME_NAME = "runtime.name" TAG_RUNTIME_VERSION = "runtime.version" @@ -53,6 +57,7 @@ module Test # could be either "test" or "suite" depending on whether we skip individual tests or whole suites # we use test skipping for Ruby ITR_TEST_SKIPPING_MODE = "test" + ITR_TEST_SKIP_REASON = "Skipped by Datadog's intelligent test runner" # test status as recognized by Datadog module Status diff --git a/lib/datadog/ci/ext/transport.rb b/lib/datadog/ci/ext/transport.rb index 3658abf0..c71ac7fd 100644 --- a/lib/datadog/ci/ext/transport.rb +++ b/lib/datadog/ci/ext/transport.rb @@ -23,7 +23,11 @@ module Transport TEST_VISIBILITY_INTAKE_HOST_PREFIX = "citestcycle-intake" TEST_VISIBILITY_INTAKE_PATH = "/api/v2/citestcycle" + TEST_COVERAGE_INTAKE_HOST_PREFIX = "citestcov-intake" + TEST_COVERAGE_INTAKE_PATH = "/api/v2/citestcov" + DD_API_HOST_PREFIX = "api" + DD_API_SETTINGS_PATH = "/api/v2/libraries/tests/services/setting" DD_API_SETTINGS_TYPE = "ci_app_test_service_libraries_settings" DD_API_SETTINGS_RESPONSE_DIG_KEYS = %w[data attributes].freeze @@ -33,8 +37,16 @@ module Transport DD_API_SETTINGS_RESPONSE_REQUIRE_GIT_KEY = "require_git" DD_API_SETTINGS_RESPONSE_DEFAULT = {DD_API_SETTINGS_RESPONSE_ITR_ENABLED_KEY => false}.freeze + DD_API_GIT_SEARCH_COMMITS_PATH = "/api/v2/git/repository/search_commits" + + DD_API_GIT_UPLOAD_PACKFILE_PATH = "/api/v2/git/repository/packfile" + + DD_API_SKIPPABLE_TESTS_PATH = "/api/v2/ci/tests/skippable" + DD_API_SKIPPABLE_TESTS_TYPE = "test_params" + CONTENT_TYPE_MESSAGEPACK = "application/msgpack" CONTENT_TYPE_JSON = "application/json" + CONTENT_TYPE_MULTIPART_FORM_DATA = "multipart/form-data" CONTENT_ENCODING_GZIP = "gzip" end end diff --git a/lib/datadog/ci/git/local_repository.rb b/lib/datadog/ci/git/local_repository.rb new file mode 100644 index 00000000..4c0ac47e --- /dev/null +++ b/lib/datadog/ci/git/local_repository.rb @@ -0,0 +1,238 @@ +# frozen_string_literal: true + +require "open3" +require "pathname" + +require_relative "user" + +module Datadog + module CI + module Git + module LocalRepository + COMMAND_RETRY_COUNT = 3 + + def self.root + return @root if defined?(@root) + + @root = git_root || Dir.pwd + end + + def self.relative_to_root(path) + return "" if path.nil? + + root_path = root + return path if root_path.nil? + + path = Pathname.new(File.expand_path(path)) + root_path = Pathname.new(root_path) + + path.relative_path_from(root_path).to_s + end + + def self.repository_name + return @repository_name if defined?(@repository_name) + + git_remote_url = git_repository_url + + # return git repository name from remote url without .git extension + last_path_segment = git_remote_url.split("/").last if git_remote_url + @repository_name = last_path_segment.gsub(".git", "") if last_path_segment + @repository_name ||= current_folder_name + rescue => e + log_failure(e, "git repository name") + @repository_name = current_folder_name + end + + def self.current_folder_name + File.basename(root) + end + + def self.git_repository_url + exec_git_command("git ls-remote --get-url") + rescue => e + log_failure(e, "git repository url") + nil + end + + def self.git_root + exec_git_command("git rev-parse --show-toplevel") + rescue => e + log_failure(e, "git root path") + nil + end + + def self.git_commit_sha + exec_git_command("git rev-parse HEAD") + rescue => e + log_failure(e, "git commit sha") + nil + end + + def self.git_branch + exec_git_command("git rev-parse --abbrev-ref HEAD") + rescue => e + log_failure(e, "git branch") + nil + end + + def self.git_tag + exec_git_command("git tag --points-at HEAD") + rescue => e + log_failure(e, "git tag") + nil + end + + def self.git_commit_message + exec_git_command("git show -s --format=%s") + rescue => e + log_failure(e, "git commit message") + nil + end + + def self.git_commit_users + # Get committer and author information in one command. + output = exec_git_command("git show -s --format='%an\t%ae\t%at\t%cn\t%ce\t%ct'") + unless output + Datadog.logger.debug( + "Unable to read git commit users: git command output is nil" + ) + nil_user = NilUser.new + return [nil_user, nil_user] + end + + author_name, author_email, author_timestamp, + committer_name, committer_email, committer_timestamp = output.split("\t").each(&:strip!) + + author = User.new(author_name, author_email, author_timestamp) + committer = User.new(committer_name, committer_email, committer_timestamp) + + [author, committer] + rescue => e + log_failure(e, "git commit users") + + nil_user = NilUser.new + [nil_user, nil_user] + end + + # returns maximum of 1000 latest commits in the last month + def self.git_commits + output = exec_git_command("git log --format=%H -n 1000 --since=\"1 month ago\"") + return [] if output.nil? + + output.split("\n") + rescue => e + log_failure(e, "git commits") + [] + end + + def self.git_commits_rev_list(included_commits:, excluded_commits:) + included_commits = filter_invalid_commits(included_commits).join(" ") + excluded_commits = filter_invalid_commits(excluded_commits).map! { |sha| "^#{sha}" }.join(" ") + + exec_git_command( + "git rev-list " \ + "--objects " \ + "--no-object-names " \ + "--filter=blob:none " \ + "--since=\"1 month ago\" " \ + "#{excluded_commits} #{included_commits}" + ) + rescue => e + log_failure(e, "git commits rev list") + nil + end + + def self.git_generate_packfiles(included_commits:, excluded_commits:, path:) + return nil unless File.exist?(path) + + commit_tree = git_commits_rev_list(included_commits: included_commits, excluded_commits: excluded_commits) + return nil if commit_tree.nil? + + basename = SecureRandom.hex(4) + + exec_git_command( + "git pack-objects --compression=9 --max-pack-size=3m #{path}/#{basename}", + stdin: commit_tree + ) + + basename + rescue => e + log_failure(e, "git generate packfiles") + nil + end + + def self.git_shallow_clone? + exec_git_command("git rev-parse --is-shallow-repository") == "true" + rescue => e + log_failure(e, "git shallow clone") + false + end + + def self.git_unshallow + exec_git_command( + "git fetch " \ + "--shallow-since=\"1 month ago\" " \ + "--update-shallow " \ + "--filter=\"blob:none\" " \ + "--recurse-submodules=no " \ + "$(git config --default origin --get clone.defaultRemoteName) $(git rev-parse HEAD)" + ) + rescue => e + log_failure(e, "git unshallow") + nil + end + + # makes .exec_git_command private to make sure that this method + # is not called from outside of this module with insecure parameters + class << self + private + + def filter_invalid_commits(commits) + commits.filter { |commit| Utils::Git.valid_commit_sha?(commit) } + end + + def exec_git_command(cmd, stdin: nil) + # Shell injection is alleviated by making sure that no outside modules call this method. + # It is called only internally with static parameters. + # no-dd-sa:ruby-security/shell-injection + out, status = Open3.capture2e(cmd, stdin_data: stdin) + + if status.nil? + retry_count = COMMAND_RETRY_COUNT + Datadog.logger.debug { "Opening pipe failed, starting retries..." } + while status.nil? && retry_count.positive? + # no-dd-sa:ruby-security/shell-injection + out, status = Open3.capture2e(cmd, stdin_data: stdin) + Datadog.logger.debug { "After retry status is [#{status}]" } + retry_count -= 1 + end + end + + if status.nil? || !status.success? + raise "Failed to run git command [#{cmd}] with input [#{stdin}] and output [#{out}]" + end + + # Sometimes Encoding.default_external is somehow set to US-ASCII which breaks + # commit messages with UTF-8 characters like emojis + # We force output's encoding to be UTF-8 in this case + # This is safe to do as UTF-8 is compatible with US-ASCII + if Encoding.default_external == Encoding::US_ASCII + out = out.force_encoding(Encoding::UTF_8) + end + out.strip! # There's always a "\n" at the end of the command output + + return nil if out.empty? + + out + end + + def log_failure(e, action) + Datadog.logger.debug( + "Unable to perform #{action}: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}" + ) + end + end + end + end + end +end diff --git a/lib/datadog/ci/git/packfiles.rb b/lib/datadog/ci/git/packfiles.rb new file mode 100644 index 00000000..d4c48acf --- /dev/null +++ b/lib/datadog/ci/git/packfiles.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +require "tmpdir" +require "fileutils" + +require_relative "local_repository" + +module Datadog + module CI + module Git + module Packfiles + def self.generate(included_commits:, excluded_commits:) + # @type var current_process_tmp_folder: String? + current_process_tmp_folder = nil + + Dir.mktmpdir do |tmpdir| + prefix = LocalRepository.git_generate_packfiles( + included_commits: included_commits, + excluded_commits: excluded_commits, + path: tmpdir + ) + + if prefix.nil? + # git pack-files command fails if tmpdir is mounted on + # a different device from the current process directory + # + # @type var current_process_tmp_folder: String + current_process_tmp_folder = File.join(Dir.pwd, "tmp", "packfiles") + FileUtils.mkdir_p(current_process_tmp_folder) + + prefix = LocalRepository.git_generate_packfiles( + included_commits: included_commits, + excluded_commits: excluded_commits, + path: current_process_tmp_folder + ) + + if prefix.nil? + Datadog.logger.debug("Packfiles generation failed twice, aborting") + break + end + + tmpdir = current_process_tmp_folder + end + + packfiles = Dir.entries(tmpdir) - %w[. ..] + if packfiles.empty? + Datadog.logger.debug("Empty packfiles list, aborting process") + break + end + + packfiles.each do |packfile_name| + next unless packfile_name.start_with?(prefix) + next unless packfile_name.end_with?(".pack") + + packfile_path = File.join(tmpdir, packfile_name) + + yield packfile_path + end + end + rescue => e + Datadog.logger.debug("Packfiles could not be generated, error: #{e}") + ensure + if current_process_tmp_folder && File.exist?(current_process_tmp_folder) + FileUtils.remove_entry(current_process_tmp_folder) + end + end + end + end + end +end diff --git a/lib/datadog/ci/git/search_commits.rb b/lib/datadog/ci/git/search_commits.rb new file mode 100644 index 00000000..2dcc78b3 --- /dev/null +++ b/lib/datadog/ci/git/search_commits.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +require "json" +require "set" + +require_relative "../ext/transport" +require_relative "../utils/git" + +module Datadog + module CI + module Git + class SearchCommits + class ApiError < StandardError; end + + attr_reader :api + + def initialize(api:) + @api = api + end + + def call(repository_url, commits) + raise ApiError, "test visibility API is not configured" if api.nil? + + http_response = api.api_request( + path: Ext::Transport::DD_API_GIT_SEARCH_COMMITS_PATH, + payload: request_payload(repository_url, commits) + ) + raise ApiError, "Failed to search commits: #{http_response.inspect}" unless http_response.ok? + + response_payload = parse_json_response(http_response) + extract_commits(response_payload) + end + + private + + def request_payload(repository_url, commits) + { + meta: { + repository_url: repository_url + }, + data: commits.filter_map do |commit| + next unless Utils::Git.valid_commit_sha?(commit) + + { + id: commit, + type: "commit" + } + end + }.to_json + end + + def parse_json_response(http_response) + JSON.parse(http_response.payload) + rescue JSON::ParserError => e + raise ApiError, "Failed to parse search commits response: #{e}. Payload was: #{http_response.payload}" + end + + def extract_commits(response_payload) + result = Set.new + + response_payload.fetch("data").each do |commit_json| + raise ApiError, "Invalid commit type response #{commit_json}" unless commit_json["type"] == "commit" + + commit_sha = commit_json["id"] + raise ApiError, "Invalid commit SHA response #{commit_sha}" unless Utils::Git.valid_commit_sha?(commit_sha) + + result.add(commit_sha) + end + + result + rescue KeyError => e + raise ApiError, "Malformed search commits response: #{e}. Payload was: #{response_payload}" + end + end + end + end +end diff --git a/lib/datadog/ci/git/tree_uploader.rb b/lib/datadog/ci/git/tree_uploader.rb new file mode 100644 index 00000000..43389090 --- /dev/null +++ b/lib/datadog/ci/git/tree_uploader.rb @@ -0,0 +1,90 @@ +# frozen_string_literal: true + +require "tmpdir" +require "fileutils" + +require_relative "local_repository" +require_relative "search_commits" +require_relative "upload_packfile" +require_relative "packfiles" + +module Datadog + module CI + module Git + class TreeUploader + attr_reader :api + + def initialize(api:) + @api = api + end + + def call(repository_url) + if api.nil? + Datadog.logger.debug("API is not configured, aborting git upload") + return + end + + Datadog.logger.debug { "Uploading git tree for repository #{repository_url}" } + + latest_commits = LocalRepository.git_commits + head_commit = latest_commits&.first + if head_commit.nil? + Datadog.logger.debug("Got empty latest commits list, aborting git upload") + return + end + + begin + # ask the backend for the list of commits it already has + known_commits, new_commits = fetch_known_commits_and_split(repository_url, latest_commits) + # if all commits are present in the backend, we don't need to upload anything + if new_commits.empty? + Datadog.logger.debug("No new commits to upload") + return + end + + # quite often we deal with shallow clones in CI environment + if LocalRepository.git_shallow_clone? && LocalRepository.git_unshallow + Datadog.logger.debug("Detected shallow clone and unshallowed the repository, repeating commits search") + + # re-run the search with the updated commit list after unshallowing + known_commits, new_commits = fetch_known_commits_and_split( + repository_url, + LocalRepository.git_commits + ) + end + rescue SearchCommits::ApiError => e + Datadog.logger.debug("SearchCommits failed with #{e}, aborting git upload") + return + end + + Datadog.logger.debug { "Uploading packfiles for commits: #{new_commits}" } + uploader = UploadPackfile.new( + api: api, + head_commit_sha: head_commit, + repository_url: repository_url + ) + Packfiles.generate(included_commits: new_commits, excluded_commits: known_commits) do |filepath| + uploader.call(filepath: filepath) + rescue UploadPackfile::ApiError => e + Datadog.logger.debug("Packfile upload failed with #{e}") + break + end + ensure + Datadog.logger.debug("Git tree upload finished") + end + + private + + # Split the latest commits list into known and new commits + # based on the backend response provided by /search_commits endpoint + def fetch_known_commits_and_split(repository_url, latest_commits) + Datadog.logger.debug { "Checking the latest commits list with backend: #{latest_commits}" } + backend_commits = SearchCommits.new(api: api).call(repository_url, latest_commits) + latest_commits.partition do |commit| + backend_commits.include?(commit) + end + end + end + end + end +end diff --git a/lib/datadog/ci/git/upload_packfile.rb b/lib/datadog/ci/git/upload_packfile.rb new file mode 100644 index 00000000..9ff23f53 --- /dev/null +++ b/lib/datadog/ci/git/upload_packfile.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +require "json" +require "securerandom" + +module Datadog + module CI + module Git + class UploadPackfile + class ApiError < StandardError; end + + attr_reader :api, :head_commit_sha, :repository_url + + def initialize(api:, head_commit_sha:, repository_url:) + @api = api + @head_commit_sha = head_commit_sha + @repository_url = repository_url + end + + def call(filepath:) + raise ApiError, "test visibility API is not configured" if api.nil? + + payload_boundary = SecureRandom.uuid + + filename = File.basename(filepath) + packfile_contents = read_file(filepath) + + payload = request_payload(payload_boundary, filename, packfile_contents) + content_type = "#{Ext::Transport::CONTENT_TYPE_MULTIPART_FORM_DATA}; boundary=#{payload_boundary}" + + http_response = api.api_request( + path: Ext::Transport::DD_API_GIT_UPLOAD_PACKFILE_PATH, + payload: payload, + headers: {Ext::Transport::HEADER_CONTENT_TYPE => content_type} + ) + + raise ApiError, "Failed to upload packfile: #{http_response.inspect}" unless http_response.ok? + end + + private + + def request_payload(boundary, filename, packfile_contents) + [ + "--#{boundary}", + 'Content-Disposition: form-data; name="pushedSha"', + "Content-Type: application/json", + "", + {data: {id: head_commit_sha, type: "commit"}, meta: {repository_url: repository_url}}.to_json, + "--#{boundary}", + "Content-Disposition: form-data; name=\"packfile\"; filename=\"#{filename}\"", + "Content-Type: application/octet-stream", + "", + packfile_contents, + "--#{boundary}--" + ].join("\r\n") + end + + def read_file(filepath) + File.read(filepath) + rescue => e + raise ApiError, "Failed to read packfile: #{e.message}" + end + end + end + end +end diff --git a/lib/datadog/ci/git/user.rb b/lib/datadog/ci/git/user.rb new file mode 100644 index 00000000..c7a5c1da --- /dev/null +++ b/lib/datadog/ci/git/user.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module Datadog + module CI + module Git + class User + attr_reader :name, :email, :timestamp + + def initialize(name, email, timestamp) + @name = name + @email = email + @timestamp = timestamp + end + + def date + return nil if timestamp.nil? + + Time.at(timestamp.to_i).utc.to_datetime.iso8601 + end + end + + class NilUser < User + def initialize + super(nil, nil, nil) + end + end + end + end +end diff --git a/lib/datadog/ci/itr/coverage/ddcov.rb b/lib/datadog/ci/itr/coverage/ddcov.rb new file mode 100644 index 00000000..65efda1d --- /dev/null +++ b/lib/datadog/ci/itr/coverage/ddcov.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Datadog + module CI + module ITR + module Coverage + # Placeholder for code coverage collection + # Implementation in ext/datadog_cov + class DDCov + end + end + end + end +end diff --git a/lib/datadog/ci/itr/coverage/event.rb b/lib/datadog/ci/itr/coverage/event.rb new file mode 100644 index 00000000..6e3d2a95 --- /dev/null +++ b/lib/datadog/ci/itr/coverage/event.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +require "msgpack" + +require_relative "../../git/local_repository" + +module Datadog + module CI + module ITR + module Coverage + class Event + attr_reader :test_id, :test_suite_id, :test_session_id, :coverage + + def initialize(test_id:, test_suite_id:, test_session_id:, coverage:) + @test_id = test_id + @test_suite_id = test_suite_id + @test_session_id = test_session_id + @coverage = coverage + end + + def valid? + valid = true + + [:test_id, :test_suite_id, :test_session_id, :coverage].each do |key| + next unless send(key).nil? + + Datadog.logger.warn("citestcov event is invalid: [#{key}] is nil. Event: #{self}") + valid = false + end + + valid + end + + def to_msgpack(packer = nil) + packer ||= MessagePack::Packer.new + + packer.write_map_header(4) + + packer.write("test_session_id") + packer.write(test_session_id.to_i) + + packer.write("test_suite_id") + packer.write(test_suite_id.to_i) + + packer.write("span_id") + packer.write(test_id.to_i) + + files = coverage.keys + packer.write("files") + packer.write_array_header(files.size) + + files.each do |filename| + packer.write_map_header(1) + packer.write("filename") + packer.write(Git::LocalRepository.relative_to_root(filename)) + end + end + + def to_s + "Coverage::Event[test_id=#{test_id}, test_suite_id=#{test_suite_id}, test_session_id=#{test_session_id}, coverage=#{coverage}]" + end + + # Return a human readable version of the event + def pretty_print(q) + q.group 0 do + q.breakable + q.text "Test ID: #{@test_id}\n" + q.text "Test Suite ID: #{@test_suite_id}\n" + q.text "Test Session ID: #{@test_session_id}\n" + q.group(2, "Files: [", "]\n") do + q.seplist @coverage.keys.each do |key| + q.text key + end + end + end + end + end + end + end + end +end diff --git a/lib/datadog/ci/itr/coverage/transport.rb b/lib/datadog/ci/itr/coverage/transport.rb new file mode 100644 index 00000000..e89cd906 --- /dev/null +++ b/lib/datadog/ci/itr/coverage/transport.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +require_relative "event" +require_relative "../../transport/event_platform_transport" + +module Datadog + module CI + module ITR + module Coverage + class Transport < Datadog::CI::Transport::EventPlatformTransport + private + + def send_payload(encoded_payload) + api.citestcov_request( + path: Ext::Transport::TEST_COVERAGE_INTAKE_PATH, + payload: encoded_payload + ) + end + + def encode_events(events) + events.filter_map do |event| + next unless event.valid? + + encoded = encoder.encode(event) + next if event_too_large?(event, encoded) + + encoded + end + end + + def write_payload_header(packer) + packer.write_map_header(2) + packer.write("version") + packer.write(2) + + packer.write("coverages") + end + end + end + end + end +end diff --git a/lib/datadog/ci/itr/coverage/writer.rb b/lib/datadog/ci/itr/coverage/writer.rb new file mode 100644 index 00000000..70644fb6 --- /dev/null +++ b/lib/datadog/ci/itr/coverage/writer.rb @@ -0,0 +1,108 @@ +# frozen_string_literal: true + +require "datadog/core/workers/async" +require "datadog/core/workers/queue" +require "datadog/core/workers/polling" + +require "datadog/core/buffer/cruby" +require "datadog/core/buffer/thread_safe" + +require "datadog/core/environment/ext" + +module Datadog + module CI + module ITR + module Coverage + class Writer + include Core::Workers::Queue + include Core::Workers::Polling + + attr_reader :transport + + DEFAULT_BUFFER_MAX_SIZE = 10_000 + DEFAULT_SHUTDOWN_TIMEOUT = 60 + + def initialize(transport:, options: {}) + @transport = transport + + # Workers::Polling settings + self.enabled = options.fetch(:enabled, true) + + # Workers::Async::Thread settings + self.fork_policy = Core::Workers::Async::Thread::FORK_POLICY_RESTART + + # Workers::IntervalLoop settings + self.loop_base_interval = options[:interval] if options.key?(:interval) + self.loop_back_off_ratio = options[:back_off_ratio] if options.key?(:back_off_ratio) + self.loop_back_off_max = options[:back_off_max] if options.key?(:back_off_max) + + @buffer_size = options.fetch(:buffer_size, DEFAULT_BUFFER_MAX_SIZE) + + self.buffer = buffer_klass.new(@buffer_size) + + @shutdown_timeout = options.fetch(:shutdown_timeout, DEFAULT_SHUTDOWN_TIMEOUT) + + @stopped = false + end + + def write(event) + return if @stopped + + # Start worker thread. If the process has forked, it will trigger #after_fork to + # reconfigure the worker accordingly. + perform + + enqueue(event) + end + + def perform(*events) + responses = transport.send_events(events) + + loop_back_off! if responses.find(&:server_error?) + + nil + end + + def stop(force_stop = false, timeout = @shutdown_timeout) + @stopped = true + + buffer.close if running? + + super + end + + def enqueue(event) + buffer.push(event) + end + + def dequeue + buffer.pop + end + + def work_pending? + !buffer.empty? + end + + def async? + true + end + + def after_fork + # In multiprocess environments, forks will share the same buffer until its written to. + # A.K.A. copy-on-write. We don't want forks to write events generated from another process. + # Instead, we reset it after the fork. (Make sure any enqueue operations happen after this.) + self.buffer = buffer_klass.new(@buffer_size) + end + + def buffer_klass + if Core::Environment::Ext::RUBY_ENGINE == "ruby" + Core::Buffer::CRuby + else + Core::Buffer::ThreadSafe + end + end + end + end + end + end +end diff --git a/lib/datadog/ci/itr/runner.rb b/lib/datadog/ci/itr/runner.rb index f78d8146..abd1f68f 100644 --- a/lib/datadog/ci/itr/runner.rb +++ b/lib/datadog/ci/itr/runner.rb @@ -1,8 +1,19 @@ # frozen_string_literal: true +require "pp" + +require "datadog/core/utils/forking" + require_relative "../ext/test" require_relative "../ext/transport" +require_relative "../git/local_repository" + +require_relative "../utils/parsing" + +require_relative "coverage/event" +require_relative "skippable" + module Datadog module CI module ITR @@ -10,26 +21,44 @@ module ITR # Integrates with backend to provide test impact analysis data and # skip tests that are not impacted by the changes class Runner + include Core::Utils::Forking + + attr_reader :correlation_id, :skippable_tests, :skipped_tests_count + def initialize( + dd_env:, + api: nil, + coverage_writer: nil, enabled: false ) @enabled = enabled + @api = api + @dd_env = dd_env + @test_skipping_enabled = false @code_coverage_enabled = false + @coverage_writer = coverage_writer + + @correlation_id = nil + @skippable_tests = [] + + @skipped_tests_count = 0 + @mutex = Mutex.new + Datadog.logger.debug("ITR Runner initialized with enabled: #{@enabled}") end - def configure(remote_configuration, test_session) + def configure(remote_configuration, test_session:, git_tree_upload_worker:) Datadog.logger.debug("Configuring ITR Runner with remote configuration: #{remote_configuration}") - @enabled = convert_to_bool( + @enabled = Utils::Parsing.convert_to_bool( remote_configuration.fetch(Ext::Transport::DD_API_SETTINGS_RESPONSE_ITR_ENABLED_KEY, false) ) - @test_skipping_enabled = @enabled && convert_to_bool( + @test_skipping_enabled = @enabled && Utils::Parsing.convert_to_bool( remote_configuration.fetch(Ext::Transport::DD_API_SETTINGS_RESPONSE_TESTS_SKIPPING_KEY, false) ) - @code_coverage_enabled = @enabled && convert_to_bool( + @code_coverage_enabled = @enabled && Utils::Parsing.convert_to_bool( remote_configuration.fetch(Ext::Transport::DD_API_SETTINGS_RESPONSE_CODE_COVERAGE_KEY, false) ) @@ -41,7 +70,11 @@ def configure(remote_configuration, test_session) # we skip tests, not suites test_session.set_tag(Ext::Test::TAG_ITR_TEST_SKIPPING_TYPE, Ext::Test::ITR_TEST_SKIPPING_MODE) + load_datadog_cov! if @code_coverage_enabled + Datadog.logger.debug("Configured ITR Runner with enabled: #{@enabled}, skipping_tests: #{@test_skipping_enabled}, code_coverage: #{@code_coverage_enabled}") + + fetch_skippable_tests(test_session: test_session, git_tree_upload_worker: git_tree_upload_worker) end def enabled? @@ -56,10 +89,114 @@ def code_coverage? @code_coverage_enabled end + def start_coverage(test) + return if !enabled? || !code_coverage? + + coverage_collector&.start + end + + def stop_coverage(test) + return if !enabled? || !code_coverage? + + coverage = coverage_collector&.stop + return if coverage.nil? || coverage.empty? + + return if test.skipped? + + test_source_file = test.source_file + + # cucumber's gherkin files are not covered by the code coverage collector + ensure_test_source_covered(test_source_file, coverage) unless test_source_file.nil? + + event = Coverage::Event.new( + test_id: test.id.to_s, + test_suite_id: test.test_suite_id.to_s, + test_session_id: test.test_session_id.to_s, + coverage: coverage + ) + + Datadog.logger.debug { "Writing coverage event \n #{event.pretty_inspect}" } + + write(event) + + event + end + + def mark_if_skippable(test) + return if !enabled? || !skipping_tests? + + skippable_test_id = Utils::TestRun.skippable_test_id(test.name, test.test_suite_name, test.parameters) + if @skippable_tests.include?(skippable_test_id) + test.set_tag(Ext::Test::TAG_ITR_SKIPPED_BY_ITR, "true") + + Datadog.logger.debug { "Marked test as skippable: #{skippable_test_id}" } + else + Datadog.logger.debug { "Test is not skippable: #{skippable_test_id}" } + end + end + + def count_skipped_test(test) + if forked? + Datadog.logger.warn { "ITR is not supported for forking test runners yet" } + return + end + + return if !test.skipped? || !test.skipped_by_itr? + + @mutex.synchronize do + @skipped_tests_count += 1 + end + end + + def write_test_session_tags(test_session) + return if !enabled? + + test_session.set_tag(Ext::Test::TAG_ITR_TESTS_SKIPPED, @skipped_tests_count.positive?.to_s) + test_session.set_tag(Ext::Test::TAG_ITR_TEST_SKIPPING_COUNT, @skipped_tests_count) + end + + def shutdown! + @coverage_writer&.stop + end + private - def convert_to_bool(value) - value.to_s == "true" + def write(event) + # skip sending events if writer is not configured + @coverage_writer&.write(event) + end + + def coverage_collector + Thread.current[:dd_coverage_collector] ||= Coverage::DDCov.new(root: Git::LocalRepository.root) + end + + def load_datadog_cov! + require "datadog_cov.#{RUBY_VERSION}_#{RUBY_PLATFORM}" + rescue LoadError => e + Datadog.logger.error("Failed to load coverage collector: #{e}. Code coverage will not be collected.") + + @code_coverage_enabled = false + end + + def ensure_test_source_covered(test_source_file, coverage) + absolute_test_source_file_path = File.join(Git::LocalRepository.root, test_source_file) + return if coverage.key?(absolute_test_source_file_path) + + coverage[absolute_test_source_file_path] = true + end + + def fetch_skippable_tests(test_session:, git_tree_upload_worker:) + return unless skipping_tests? + + # we can only request skippable tests if git metadata is already uploaded + git_tree_upload_worker.wait_until_done + + skippable_response = Skippable.new(api: @api, dd_env: @dd_env).fetch_skippable_tests(test_session) + @correlation_id = skippable_response.correlation_id + @skippable_tests = skippable_response.tests + + Datadog.logger.debug { "Fetched skippable tests: \n #{@skippable_tests}" } + Datadog.logger.debug { "ITR correlation ID: #{@correlation_id}" } end end end diff --git a/lib/datadog/ci/itr/skippable.rb b/lib/datadog/ci/itr/skippable.rb new file mode 100644 index 00000000..a1382ad0 --- /dev/null +++ b/lib/datadog/ci/itr/skippable.rb @@ -0,0 +1,106 @@ +# frozen_string_literal: true + +require "json" + +require_relative "../ext/transport" +require_relative "../ext/test" +require_relative "../utils/test_run" + +module Datadog + module CI + module ITR + class Skippable + class Response + def initialize(http_response) + @http_response = http_response + @json = nil + end + + def ok? + resp = @http_response + !resp.nil? && resp.ok? + end + + def correlation_id + payload.dig("meta", "correlation_id") + end + + def tests + res = Set.new + + payload.fetch("data", []) + .each do |test_data| + next unless test_data["type"] == Ext::Test::ITR_TEST_SKIPPING_MODE + + attrs = test_data["attributes"] || {} + res << Utils::TestRun.skippable_test_id(attrs["name"], attrs["suite"], attrs["parameters"]) + end + + res + end + + private + + def payload + cached = @json + return cached unless cached.nil? + + resp = @http_response + return @json = {} if resp.nil? || !ok? + + begin + @json = JSON.parse(resp.payload) + rescue JSON::ParserError => e + Datadog.logger.error("Failed to parse skippable tests response payload: #{e}. Payload was: #{resp.payload}") + @json = {} + end + end + end + + def initialize(dd_env:, api: nil) + @api = api + @dd_env = dd_env + end + + def fetch_skippable_tests(test_session) + api = @api + return Response.new(nil) unless api + + request_payload = payload(test_session) + Datadog.logger.debug("Fetching skippable tests with request: #{request_payload}") + + http_response = api.api_request( + path: Ext::Transport::DD_API_SKIPPABLE_TESTS_PATH, + payload: request_payload + ) + + Response.new(http_response) + end + + private + + def payload(test_session) + { + "data" => { + "type" => Ext::Transport::DD_API_SKIPPABLE_TESTS_TYPE, + "attributes" => { + "test_level" => Ext::Test::ITR_TEST_SKIPPING_MODE, + "service" => test_session.service, + "env" => @dd_env, + "repository_url" => test_session.git_repository_url, + "sha" => test_session.git_commit_sha, + "configurations" => { + Ext::Test::TAG_OS_PLATFORM => test_session.os_platform, + Ext::Test::TAG_OS_ARCHITECTURE => test_session.os_architecture, + Ext::Test::TAG_OS_VERSION => test_session.os_version, + Ext::Test::TAG_RUNTIME_NAME => test_session.runtime_name, + Ext::Test::TAG_RUNTIME_VERSION => test_session.runtime_version + } + } + } + }.to_json + end + end + end + end +end diff --git a/lib/datadog/ci/span.rb b/lib/datadog/ci/span.rb index 481c87e1..097fc710 100644 --- a/lib/datadog/ci/span.rb +++ b/lib/datadog/ci/span.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require "datadog/core/environment/platform" + require_relative "ext/test" require_relative "utils/test_run" @@ -151,6 +153,12 @@ def os_platform tracer_span.get_tag(Ext::Test::TAG_OS_PLATFORM) end + # Returns the OS version extracted from the environment. + # @return [String] OS version. + def os_version + tracer_span.get_tag(Ext::Test::TAG_OS_VERSION) + end + # Returns the runtime name extracted from the environment. # @return [String] runtime name. def runtime_name @@ -166,6 +174,7 @@ def runtime_version def set_environment_runtime_tags tracer_span.set_tag(Ext::Test::TAG_OS_ARCHITECTURE, ::RbConfig::CONFIG["host_cpu"]) tracer_span.set_tag(Ext::Test::TAG_OS_PLATFORM, ::RbConfig::CONFIG["host_os"]) + tracer_span.set_tag(Ext::Test::TAG_OS_VERSION, Core::Environment::Platform.kernel_release) tracer_span.set_tag(Ext::Test::TAG_RUNTIME_NAME, Core::Environment::Ext::LANG_ENGINE) tracer_span.set_tag(Ext::Test::TAG_RUNTIME_VERSION, Core::Environment::Ext::ENGINE_VERSION) tracer_span.set_tag(Ext::Test::TAG_COMMAND, Utils::TestRun.command) diff --git a/lib/datadog/ci/test.rb b/lib/datadog/ci/test.rb index c7e896f9..c7d936a2 100644 --- a/lib/datadog/ci/test.rb +++ b/lib/datadog/ci/test.rb @@ -3,6 +3,7 @@ require "json" require_relative "span" +require_relative "utils/test_run" module Datadog module CI @@ -18,9 +19,9 @@ def name # Finishes the current test. # @return [void] def finish - super - recorder.deactivate_test + + super end # Running test suite that this test is part of (if any). @@ -62,6 +63,12 @@ def source_file get_tag(Ext::Test::TAG_SOURCE_FILE) end + # Returns "true" if the test is skipped by the intelligent test runner. + # @return [Boolean] true if the test is skipped by the intelligent test runner, false otherwise. + def skipped_by_itr? + get_tag(Ext::Test::TAG_ITR_SKIPPED_BY_ITR) == "true" + end + # Sets the status of the span to "pass". # @return [void] def passed! @@ -89,7 +96,7 @@ def skipped!(exception: nil, reason: nil) record_test_result(Ext::Test::Status::SKIP) end - # Sets the parameters for this test (e.g. Cucumber example or RSpec shared specs). + # Sets the parameters for this test (e.g. Cucumber example or RSpec specs). # Parameters are needed to compute test fingerprint to distinguish between different tests having same names. # # @param [Hash] arguments the arguments that test accepts as key-value hash @@ -98,22 +105,21 @@ def skipped!(exception: nil, reason: nil) def set_parameters(arguments, metadata = {}) return if arguments.nil? - set_tag( - Ext::Test::TAG_PARAMETERS, - JSON.generate( - { - arguments: arguments, - metadata: metadata - } - ) - ) + set_tag(Ext::Test::TAG_PARAMETERS, Utils::TestRun.test_parameters(arguments: arguments, metadata: metadata)) + end + + # Gets the parameters for this test (e.g. Cucumber example or RSpec specs) as a serialized JSON. + # + # @return [String] the serialized JSON of the parameters + # @return [nil] if this test does not have parameters + def parameters + get_tag(Ext::Test::TAG_PARAMETERS) end private def record_test_result(datadog_status) - suite = test_suite - suite.record_test_result(datadog_status) if suite + test_suite&.record_test_result(datadog_status) end end end diff --git a/lib/datadog/ci/test_module.rb b/lib/datadog/ci/test_module.rb index 4fb8678b..5c44f0d1 100644 --- a/lib/datadog/ci/test_module.rb +++ b/lib/datadog/ci/test_module.rb @@ -14,9 +14,9 @@ class TestModule < ConcurrentSpan # Finishes this test module. # @return [void] def finish - super - recorder.deactivate_test_module + + super end end end diff --git a/lib/datadog/ci/test_session.rb b/lib/datadog/ci/test_session.rb index 7ffdefbc..125d014c 100644 --- a/lib/datadog/ci/test_session.rb +++ b/lib/datadog/ci/test_session.rb @@ -15,9 +15,9 @@ class TestSession < ConcurrentSpan # Finishes the current test session. # @return [void] def finish - super - recorder.deactivate_test_session + + super end # Return the test session's name which is equal to test command used diff --git a/lib/datadog/ci/test_suite.rb b/lib/datadog/ci/test_suite.rb index 59b8e43d..f5557d3d 100644 --- a/lib/datadog/ci/test_suite.rb +++ b/lib/datadog/ci/test_suite.rb @@ -26,9 +26,9 @@ def finish # we try to derive test suite status from execution stats if no status was set explicitly set_status_from_stats! if undefined? - super - recorder.deactivate_test_suite(name) + + super end end diff --git a/lib/datadog/ci/test_visibility/context/global.rb b/lib/datadog/ci/test_visibility/context/global.rb index c87430fc..35f1b0e4 100644 --- a/lib/datadog/ci/test_visibility/context/global.rb +++ b/lib/datadog/ci/test_visibility/context/global.rb @@ -55,9 +55,7 @@ def active_test_suite(test_suite_name) def service @mutex.synchronize do - # thank you RBS for this weirdness - test_session = @test_session - test_session.service if test_session + @test_session&.service end end diff --git a/lib/datadog/ci/test_visibility/null_recorder.rb b/lib/datadog/ci/test_visibility/null_recorder.rb index 87e1ebbb..5a83df3f 100644 --- a/lib/datadog/ci/test_visibility/null_recorder.rb +++ b/lib/datadog/ci/test_visibility/null_recorder.rb @@ -23,7 +23,7 @@ def trace_test(test_name, test_suite_name, service: nil, tags: {}, &block) skip_tracing(block) end - def trace(type, span_name, tags: {}, &block) + def trace(span_name, type: "span", tags: {}, &block) skip_tracing(block) end @@ -42,10 +42,13 @@ def active_test_module def active_test_suite(test_suite_name) end + def shutdown! + end + private def skip_tracing(block = nil) - block.call(nil) if block + block&.call(nil) end end end diff --git a/lib/datadog/ci/test_visibility/recorder.rb b/lib/datadog/ci/test_visibility/recorder.rb index 249e3b05..f21bb0b0 100644 --- a/lib/datadog/ci/test_visibility/recorder.rb +++ b/lib/datadog/ci/test_visibility/recorder.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require "datadog/tracing" +require "datadog/tracing/contrib/component" require "datadog/tracing/trace_digest" require "rbconfig" @@ -12,13 +13,14 @@ require_relative "../ext/app_types" require_relative "../ext/test" require_relative "../ext/environment" -require_relative "../utils/git" +require_relative "../git/local_repository" require_relative "../span" require_relative "../test" require_relative "../test_session" require_relative "../test_module" require_relative "../test_suite" +require_relative "../worker" module Datadog module CI @@ -29,8 +31,11 @@ class Recorder attr_reader :environment_tags, :test_suite_level_visibility_enabled def initialize( - itr:, remote_settings_api:, test_suite_level_visibility_enabled: false, - codeowners: Codeowners::Parser.new(Utils::Git.root).parse + itr:, + remote_settings_api:, + git_tree_upload_worker: DummyWorker.new, + test_suite_level_visibility_enabled: false, + codeowners: Codeowners::Parser.new(Git::LocalRepository.root).parse ) @test_suite_level_visibility_enabled = test_suite_level_visibility_enabled @@ -42,6 +47,11 @@ def initialize( @itr = itr @remote_settings_api = remote_settings_api + @git_tree_upload_worker = git_tree_upload_worker + end + + def shutdown! + @git_tree_upload_worker.stop end def start_test_session(service: nil, tags: {}) @@ -55,6 +65,7 @@ def start_test_session(service: nil, tags: {}) test_session = build_test_session(tracer_span, tags) + @git_tree_upload_worker.perform(test_session.git_repository_url) configure_library(test_session) test_session @@ -116,14 +127,19 @@ def trace_test(test_name, test_suite_name, service: nil, tags: {}, &block) test = build_test(tracer_span, tags) @local_context.activate_test(test) do - block.call(test) + on_test_started(test) + res = block.call(test) + on_test_finished(test) + res end end else tracer_span = start_datadog_tracer_span(test_name, span_options) - test = build_test(tracer_span, tags) + @local_context.activate_test(test) + on_test_started(test) + test end end @@ -168,10 +184,16 @@ def active_test_suite(test_suite_name) end def deactivate_test + test = active_test + on_test_finished(test) if test + @local_context.deactivate_test end def deactivate_test_session + test_session = active_test_session + on_test_session_finished(test_session) if test_session + @global_context.deactivate_test_session! end @@ -194,16 +216,34 @@ def configure_library(test_session) return unless itr_enabled? remote_configuration = @remote_settings_api.fetch_library_settings(test_session) - @itr.configure(remote_configuration.payload, test_session) + # sometimes we can skip code coverage for default branch if there are no changes in the repository + # backend needs git metadata uploaded for this test session to check if we can skip code coverage + if remote_configuration.require_git? + Datadog.logger.debug { "Library configuration endpoint requires git upload to be finished, waiting..." } + @git_tree_upload_worker.wait_until_done + + Datadog.logger.debug { "Requesting library configuration again..." } + remote_configuration = @remote_settings_api.fetch_library_settings(test_session) + + if remote_configuration.require_git? + Datadog.logger.debug { "git metadata upload did not complete in time when configuring library" } + end + end + + @itr.configure( + remote_configuration.payload, + test_session: test_session, + git_tree_upload_worker: @git_tree_upload_worker + ) end def skip_tracing(block = nil) - block.call(nil) if block + block&.call(nil) end # Sets trace's origin to ciapp-test def set_trace_origin(trace) - trace.origin = Ext::Test::CONTEXT_ORIGIN if trace + trace&.origin = Ext::Test::CONTEXT_ORIGIN end def build_test_session(tracer_span, tags) @@ -357,6 +397,21 @@ def validate_test_suite_level_visibility_correctness(test) end end end + + # TODO: use kind of event system to notify about test finished? + def on_test_finished(test) + @itr.stop_coverage(test) + @itr.count_skipped_test(test) + end + + def on_test_started(test) + @itr.mark_if_skippable(test) + @itr.start_coverage(test) + end + + def on_test_session_finished(test_session) + @itr.write_test_session_tags(test_session) + end end end end diff --git a/lib/datadog/ci/test_visibility/serializers/base.rb b/lib/datadog/ci/test_visibility/serializers/base.rb index 08658158..b32ddc26 100644 --- a/lib/datadog/ci/test_visibility/serializers/base.rb +++ b/lib/datadog/ci/test_visibility/serializers/base.rb @@ -241,7 +241,7 @@ def to_s end def to_integer(value) - value.to_i if value + value&.to_i end end end diff --git a/lib/datadog/ci/test_visibility/serializers/factories/test_level.rb b/lib/datadog/ci/test_visibility/serializers/factories/test_level.rb index d2cfe1ae..aca2bdb3 100644 --- a/lib/datadog/ci/test_visibility/serializers/factories/test_level.rb +++ b/lib/datadog/ci/test_visibility/serializers/factories/test_level.rb @@ -8,7 +8,7 @@ module CI module TestVisibility module Serializers module Factories - # This factory takes care of creating citestcycle serializers when test-level visibility is enabled + # This factory takes care of creating msgpack serializers when test-level visibility is enabled # NOTE: citestcycle is a protocol Datadog uses to submit test execution tracing information to CI visibility # backend module TestLevel diff --git a/lib/datadog/ci/test_visibility/serializers/factories/test_suite_level.rb b/lib/datadog/ci/test_visibility/serializers/factories/test_suite_level.rb index e787110f..f6f4c181 100644 --- a/lib/datadog/ci/test_visibility/serializers/factories/test_suite_level.rb +++ b/lib/datadog/ci/test_visibility/serializers/factories/test_suite_level.rb @@ -11,7 +11,7 @@ module CI module TestVisibility module Serializers module Factories - # This factory takes care of creating citestcycle serializers when test-suite-level visibility is enabled + # This factory takes care of creating msgpack serializers when test-suite-level visibility is enabled module TestSuiteLevel module_function diff --git a/lib/datadog/ci/test_visibility/transport.rb b/lib/datadog/ci/test_visibility/transport.rb index 45f79a17..4116d513 100644 --- a/lib/datadog/ci/test_visibility/transport.rb +++ b/lib/datadog/ci/test_visibility/transport.rb @@ -1,64 +1,32 @@ # frozen_string_literal: true -require "msgpack" -require "uri" - -require "datadog/core/encoding" require "datadog/core/environment/identity" -require "datadog/core/chunker" require_relative "serializers/factories/test_level" require_relative "../ext/transport" +require_relative "../transport/event_platform_transport" module Datadog module CI module TestVisibility - class Transport - # CI test cycle intake's limit is 5.1MB uncompressed - # We will use a bit more conservative value 5MB - DEFAULT_MAX_PAYLOAD_SIZE = 5 * 1024 * 1024 - - attr_reader :serializers_factory, - :api, - :max_payload_size, - :dd_env + class Transport < Datadog::CI::Transport::EventPlatformTransport + attr_reader :serializers_factory, :dd_env def initialize( api:, - dd_env: nil, + dd_env:, serializers_factory: Datadog::CI::TestVisibility::Serializers::Factories::TestLevel, max_payload_size: DEFAULT_MAX_PAYLOAD_SIZE ) + super(api: api, max_payload_size: max_payload_size) + @serializers_factory = serializers_factory - @max_payload_size = max_payload_size @dd_env = dd_env - @api = api end + # this method is needed for compatibility with Datadog::Tracing::Writer that uses this Transport def send_traces(traces) - return [] if traces.nil? || traces.empty? - - Datadog.logger.debug { "Sending #{traces.count} traces..." } - - encoded_events = encode_traces(traces) - if encoded_events.empty? - Datadog.logger.debug { "Empty encoded events list, skipping send" } - return [] - end - - responses = [] - Datadog::Core::Chunker.chunk_by_size(encoded_events, max_payload_size).map do |chunk| - encoded_payload = pack_events(chunk) - Datadog.logger.debug do - "Send chunk of #{chunk.count} events; payload size #{encoded_payload.size}" - end - - response = send_payload(encoded_payload) - - responses << response - end - - responses + send_events(traces) end private @@ -70,15 +38,9 @@ def send_payload(encoded_payload) ) end - def encode_traces(traces) + def encode_events(traces) traces.flat_map do |trace| - spans = trace.spans - # TODO: remove condition when 1.0 is released - if spans.respond_to?(:filter_map) - spans.filter_map { |span| encode_span(trace, span) } - else - spans.map { |span| encode_span(trace, span) }.reject(&:nil?) - end + trace.spans.filter_map { |span| encode_span(trace, span) } end end @@ -107,9 +69,7 @@ def encoder Datadog::Core::Encoding::MsgpackEncoder end - def pack_events(encoded_events) - packer = MessagePack::Packer.new - + def write_payload_header(packer) packer.write_map_header(3) # Set header with how many elements in the map packer.write("version") @@ -137,9 +97,6 @@ def pack_events(encoded_events) packer.write(Datadog::CI::VERSION::STRING) packer.write("events") - packer.write_array_header(encoded_events.size) - - (packer.buffer.to_a + encoded_events).join end end end diff --git a/lib/datadog/ci/transport/api/agentless.rb b/lib/datadog/ci/transport/api/agentless.rb index fb6ad7ac..f2c3ccad 100644 --- a/lib/datadog/ci/transport/api/agentless.rb +++ b/lib/datadog/ci/transport/api/agentless.rb @@ -10,10 +10,11 @@ module Api class Agentless < Base attr_reader :api_key - def initialize(api_key:, citestcycle_url:, api_url:) + def initialize(api_key:, citestcycle_url:, api_url:, citestcov_url:) @api_key = api_key @citestcycle_http = build_http_client(citestcycle_url, compress: true) @api_http = build_http_client(api_url, compress: false) + @citestcov_http = build_http_client(citestcov_url, compress: true) end def citestcycle_request(path:, payload:, headers: {}, verb: "post") @@ -28,6 +29,12 @@ def api_request(path:, payload:, headers: {}, verb: "post") perform_request(@api_http, path: path, payload: payload, headers: headers, verb: verb) end + def citestcov_request(path:, payload:, headers: {}, verb: "post") + super(path: path, payload: payload, headers: headers, verb: verb) + + perform_request(@citestcov_http, path: path, payload: @citestcov_payload, headers: headers, verb: verb) + end + private def perform_request(http_client, path:, payload:, headers:, verb:) diff --git a/lib/datadog/ci/transport/api/base.rb b/lib/datadog/ci/transport/api/base.rb index ff11e7e8..6da21327 100644 --- a/lib/datadog/ci/transport/api/base.rb +++ b/lib/datadog/ci/transport/api/base.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require "securerandom" + require_relative "../../ext/transport" module Datadog @@ -15,6 +17,27 @@ def citestcycle_request(path:, payload:, headers: {}, verb: "post") headers[Ext::Transport::HEADER_CONTENT_TYPE] ||= Ext::Transport::CONTENT_TYPE_MESSAGEPACK end + def citestcov_request(path:, payload:, headers: {}, verb: "post") + citestcov_request_boundary = ::SecureRandom.uuid + + headers[Ext::Transport::HEADER_CONTENT_TYPE] ||= + "#{Ext::Transport::CONTENT_TYPE_MULTIPART_FORM_DATA}; boundary=#{citestcov_request_boundary}" + + @citestcov_payload = [ + "--#{citestcov_request_boundary}", + 'Content-Disposition: form-data; name="event"; filename="event.json"', + "Content-Type: application/json", + "", + '{"dummy":true}', + "--#{citestcov_request_boundary}", + 'Content-Disposition: form-data; name="coverage1"; filename="coverage1.msgpack"', + "Content-Type: application/msgpack", + "", + payload, + "--#{citestcov_request_boundary}--" + ].join("\r\n") + end + def headers_with_default(headers) request_headers = default_headers request_headers.merge!(headers) diff --git a/lib/datadog/ci/transport/api/builder.rb b/lib/datadog/ci/transport/api/builder.rb index 8383b3a0..77ecd33e 100644 --- a/lib/datadog/ci/transport/api/builder.rb +++ b/lib/datadog/ci/transport/api/builder.rb @@ -24,7 +24,15 @@ def self.build_agentless_api(settings) api_url = settings.ci.agentless_url || "https://#{Ext::Transport::DD_API_HOST_PREFIX}.#{dd_site}:443" - Agentless.new(api_key: settings.api_key, citestcycle_url: citestcycle_url, api_url: api_url) + citestcov_url = settings.ci.agentless_url || + "https://#{Ext::Transport::TEST_COVERAGE_INTAKE_HOST_PREFIX}.#{dd_site}:443" + + Agentless.new( + api_key: settings.api_key, + citestcycle_url: citestcycle_url, + api_url: api_url, + citestcov_url: citestcov_url + ) end def self.build_evp_proxy_api(settings) diff --git a/lib/datadog/ci/transport/api/evp_proxy.rb b/lib/datadog/ci/transport/api/evp_proxy.rb index 8c93e32d..ca7639e4 100644 --- a/lib/datadog/ci/transport/api/evp_proxy.rb +++ b/lib/datadog/ci/transport/api/evp_proxy.rb @@ -38,6 +38,14 @@ def api_request(path:, payload:, headers: {}, verb: "post") perform_request(@agent_api_http, path: path, payload: payload, headers: headers, verb: verb) end + def citestcov_request(path:, payload:, headers: {}, verb: "post") + super(path: path, payload: payload, headers: headers, verb: verb) + + headers[Ext::Transport::HEADER_EVP_SUBDOMAIN] = Ext::Transport::TEST_COVERAGE_INTAKE_HOST_PREFIX + + perform_request(@agent_intake_http, path: path, payload: @citestcov_payload, headers: headers, verb: verb) + end + private def perform_request(http_client, path:, payload:, headers:, verb:) diff --git a/lib/datadog/ci/transport/event_platform_transport.rb b/lib/datadog/ci/transport/event_platform_transport.rb new file mode 100644 index 00000000..7728ec51 --- /dev/null +++ b/lib/datadog/ci/transport/event_platform_transport.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +require "msgpack" + +require "datadog/core/encoding" +require "datadog/core/chunker" + +module Datadog + module CI + module Transport + class EventPlatformTransport + DEFAULT_MAX_PAYLOAD_SIZE = 5 * 1024 * 1024 + + attr_reader :api, + :max_payload_size + + def initialize(api:, max_payload_size: DEFAULT_MAX_PAYLOAD_SIZE) + @api = api + @max_payload_size = max_payload_size + end + + def send_events(events) + return [] if events.nil? || events.empty? + + Datadog.logger.debug { "[#{self.class.name}] Sending #{events.count} events..." } + + encoded_events = encode_events(events) + if encoded_events.empty? + Datadog.logger.debug { "[#{self.class.name}] Empty encoded events list, skipping send" } + return [] + end + + responses = [] + + Datadog::Core::Chunker.chunk_by_size(encoded_events, max_payload_size).map do |chunk| + encoded_payload = pack_events(chunk) + Datadog.logger.debug do + "[#{self.class.name}] Send chunk of #{chunk.count} events; payload size #{encoded_payload.size}" + end + + response = send_payload(encoded_payload) + + responses << response + end + + responses + end + + private + + def encoder + Datadog::Core::Encoding::MsgpackEncoder + end + + def pack_events(encoded_events) + packer = MessagePack::Packer.new + + write_payload_header(packer) + + packer.write_array_header(encoded_events.count) + (packer.buffer.to_a + encoded_events).join + end + + def event_too_large?(event, encoded_event) + return false unless encoded_event.size > max_payload_size + + # This single event is too large, we can't flush it + Datadog.logger.warn("[#{self.class.name}] Dropping coverage event. Payload too large: '#{event.inspect}'") + Datadog.logger.warn(encoded_event) + + true + end + + def send_payload(encoded_payload) + raise NotImplementedError + end + + def encode_events(events) + raise NotImplementedError + end + + def write_payload_header(packer) + raise NotImplementedError + end + end + end + end +end diff --git a/lib/datadog/ci/transport/http.rb b/lib/datadog/ci/transport/http.rb index 5477669d..a00ff3bf 100644 --- a/lib/datadog/ci/transport/http.rb +++ b/lib/datadog/ci/transport/http.rb @@ -4,6 +4,7 @@ require "datadog/core/transport/http/adapters/net" require "datadog/core/transport/http/env" require "datadog/core/transport/request" +require "socket" require_relative "gzip" require_relative "../ext/transport" @@ -20,6 +21,8 @@ class HTTP :compress DEFAULT_TIMEOUT = 30 + MAX_RETRIES = 3 + INITIAL_BACKOFF = 1 def initialize(host:, timeout: DEFAULT_TIMEOUT, port: nil, ssl: true, compress: false) @host = host @@ -29,7 +32,7 @@ def initialize(host:, timeout: DEFAULT_TIMEOUT, port: nil, ssl: true, compress: @compress = compress.nil? ? false : compress end - def request(path:, payload:, headers:, verb: "post") + def request(path:, payload:, headers:, verb: "post", retries: MAX_RETRIES, backoff: INITIAL_BACKOFF) if compress headers[Ext::Transport::HEADER_CONTENT_ENCODING] = Ext::Transport::CONTENT_ENCODING_GZIP payload = Gzip.compress(payload) @@ -41,9 +44,7 @@ def request(path:, payload:, headers:, verb: "post") end response = ResponseDecorator.new( - adapter.call( - build_env(path: path, payload: payload, headers: headers, verb: verb) - ) + perform_http_call(path: path, payload: payload, headers: headers, verb: verb, retries: retries, backoff: backoff) ) Datadog.logger.debug do @@ -55,6 +56,25 @@ def request(path:, payload:, headers:, verb: "post") private + def perform_http_call(path:, payload:, headers:, verb:, retries: MAX_RETRIES, backoff: INITIAL_BACKOFF) + adapter.call( + build_env(path: path, payload: payload, headers: headers, verb: verb) + ) + rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, SocketError, Net::HTTPBadResponse => e + Datadog.logger.debug("Failed to send request with #{e} (#{e.message})") + + if retries.positive? + sleep(backoff) + + perform_http_call( + path: path, payload: payload, headers: headers, verb: verb, retries: retries - 1, backoff: backoff * 2 + ) + else + Datadog.logger.error("Failed to send request after #{MAX_RETRIES} retries") + raise e + end + end + def build_env(path:, payload:, headers:, verb:) env = Datadog::Core::Transport::HTTP::Env.new( Datadog::Core::Transport::Request.new @@ -67,16 +87,33 @@ def build_env(path:, payload:, headers:, verb:) end def adapter - @adapter ||= Datadog::Core::Transport::HTTP::Adapters::Net.new(host, port, timeout: timeout, ssl: ssl) + settings = AdapterSettings.new(hostname: host, port: port, ssl: ssl, timeout_seconds: timeout) + @adapter ||= Datadog::Core::Transport::HTTP::Adapters::Net.new(settings) end # this is needed because Datadog::Tracing::Writer is not fully compatiple with Datadog::Core::Transport - # TODO: remove before 1.0 when CI implements its own worker + # TODO: remove when CI implements its own worker class ResponseDecorator < ::SimpleDelegator def trace_count 0 end end + + class AdapterSettings + attr_reader :hostname, :port, :ssl, :timeout_seconds + + def initialize(hostname:, port: nil, ssl: true, timeout_seconds: nil) + @hostname = hostname + @port = port + @ssl = ssl + @timeout_seconds = timeout_seconds + end + + def ==(other) + hostname == other.hostname && port == other.port && ssl == other.ssl && + timeout_seconds == other.timeout_seconds + end + end end end end diff --git a/lib/datadog/ci/transport/remote_settings_api.rb b/lib/datadog/ci/transport/remote_settings_api.rb index 634339ca..03ac76a1 100644 --- a/lib/datadog/ci/transport/remote_settings_api.rb +++ b/lib/datadog/ci/transport/remote_settings_api.rb @@ -5,6 +5,7 @@ require "datadog/core/environment/identity" require_relative "../ext/transport" +require_relative "../utils/parsing" module Datadog module CI @@ -28,7 +29,7 @@ def payload return cached unless cached.nil? resp = @http_response - return @json = default_payload if resp.nil? || !resp.ok? + return @json = default_payload if resp.nil? || !ok? begin @json = JSON.parse(resp.payload).dig(*Ext::Transport::DD_API_SETTINGS_RESPONSE_DIG_KEYS) || @@ -39,6 +40,10 @@ def payload end end + def require_git? + Utils::Parsing.convert_to_bool(payload[Ext::Transport::DD_API_SETTINGS_RESPONSE_REQUIRE_GIT_KEY]) + end + private def default_payload @@ -46,7 +51,7 @@ def default_payload end end - def initialize(api: nil, dd_env: nil) + def initialize(dd_env:, api: nil) @api = api @dd_env = dd_env end @@ -81,10 +86,11 @@ def payload(test_session) "sha" => test_session.git_commit_sha, "test_level" => Ext::Test::ITR_TEST_SKIPPING_MODE, "configurations" => { - "os.platform" => test_session.os_platform, - "os.arch" => test_session.os_architecture, - "runtime.name" => test_session.runtime_name, - "runtime.version" => test_session.runtime_version + Ext::Test::TAG_OS_PLATFORM => test_session.os_platform, + Ext::Test::TAG_OS_ARCHITECTURE => test_session.os_architecture, + Ext::Test::TAG_OS_VERSION => test_session.os_version, + Ext::Test::TAG_RUNTIME_NAME => test_session.runtime_name, + Ext::Test::TAG_RUNTIME_VERSION => test_session.runtime_version } } } diff --git a/lib/datadog/ci/utils/configuration.rb b/lib/datadog/ci/utils/configuration.rb index 36450320..af559bae 100644 --- a/lib/datadog/ci/utils/configuration.rb +++ b/lib/datadog/ci/utils/configuration.rb @@ -1,13 +1,13 @@ # frozen_string_literal: true -require_relative "git" +require_relative "../git/local_repository" module Datadog module CI module Utils module Configuration def self.fetch_service_name(default) - Datadog.configuration.service_without_fallback || Git.repository_name || default + Datadog.configuration.service_without_fallback || CI::Git::LocalRepository.repository_name || default end end end diff --git a/lib/datadog/ci/utils/git.rb b/lib/datadog/ci/utils/git.rb index 859ca049..c6118030 100644 --- a/lib/datadog/ci/utils/git.rb +++ b/lib/datadog/ci/utils/git.rb @@ -7,6 +7,12 @@ module Datadog module CI module Utils module Git + def self.valid_commit_sha?(sha) + return false if sha.nil? + + sha.match?(/\A[0-9a-f]{40}\Z/) || sha.match?(/\A[0-9a-f]{64}\Z/) + end + def self.normalize_ref(ref) return nil if ref.nil? @@ -19,73 +25,6 @@ def self.normalize_ref(ref) def self.is_git_tag?(ref) !ref.nil? && ref.include?("tags/") end - - def self.root - return @root if defined?(@root) - - @root = exec_git_command("git rev-parse --show-toplevel") - rescue => e - Datadog.logger.debug( - "Unable to read git root: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}" - ) - @root = nil - end - - def self.relative_to_root(path) - return nil if path.nil? - - git_root = root - return path if git_root.nil? - - path = Pathname.new(File.expand_path(path)) - git_root = Pathname.new(git_root) - - path.relative_path_from(git_root).to_s - end - - def self.repository_name - return @repository_name if defined?(@repository_name) - - git_remote_url = exec_git_command("git ls-remote --get-url origin") - - # return git repository name from remote url without .git extension - last_path_segment = git_remote_url.split("/").last if git_remote_url - @repository_name = last_path_segment.gsub(".git", "") if last_path_segment - @repository_name ||= current_folder_name - rescue => e - Datadog.logger.debug( - "Unable to get git remote: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}" - ) - @repository_name = current_folder_name - end - - def self.current_folder_name - root_folder = root - if root_folder.nil? - File.basename(Dir.pwd) - else - File.basename(root_folder) - end - end - - def self.exec_git_command(cmd) - out, status = Open3.capture2e(cmd) - - raise "Failed to run git command #{cmd}: #{out}" unless status.success? - - # Sometimes Encoding.default_external is somehow set to US-ASCII which breaks - # commit messages with UTF-8 characters like emojis - # We force output's encoding to be UTF-8 in this case - # This is safe to do as UTF-8 is compatible with US-ASCII - if Encoding.default_external == Encoding::US_ASCII - out = out.force_encoding(Encoding::UTF_8) - end - out.strip! # There's always a "\n" at the end of the command output - - return nil if out.empty? - - out - end end end end diff --git a/lib/datadog/ci/utils/parsing.rb b/lib/datadog/ci/utils/parsing.rb new file mode 100644 index 00000000..e519935e --- /dev/null +++ b/lib/datadog/ci/utils/parsing.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require "open3" +require "pathname" + +module Datadog + module CI + module Utils + module Parsing + def self.convert_to_bool(value) + value.to_s.downcase == "true" + end + end + end + end +end diff --git a/lib/datadog/ci/utils/test_run.rb b/lib/datadog/ci/utils/test_run.rb index 1e41715e..eb494182 100644 --- a/lib/datadog/ci/utils/test_run.rb +++ b/lib/datadog/ci/utils/test_run.rb @@ -9,6 +9,19 @@ def self.command @command = "#{$0} #{ARGV.join(" ")}" end + + def self.skippable_test_id(test_name, suite, parameters = nil) + "#{suite}.#{test_name}.#{parameters}" + end + + def self.test_parameters(arguments: {}, metadata: {}) + JSON.generate( + { + arguments: arguments, + metadata: metadata + } + ) + end end end end diff --git a/lib/datadog/ci/version.rb b/lib/datadog/ci/version.rb index 185af81c..b2d7607b 100644 --- a/lib/datadog/ci/version.rb +++ b/lib/datadog/ci/version.rb @@ -3,16 +3,16 @@ module Datadog module CI module VERSION - MAJOR = "0" - MINOR = "8" - PATCH = "3" - PRE = nil + MAJOR = "1" + MINOR = "0" + PATCH = "0" + PRE = "beta1" BUILD = nil # PRE and BUILD above are modified for dev gems during gem build GHA workflow STRING = [MAJOR, MINOR, PATCH, PRE, BUILD].compact.join(".") - MINIMUM_RUBY_VERSION = "2.1.0" + MINIMUM_RUBY_VERSION = "2.7.0" # Restrict the installation of this gem with untested future versions of Ruby. # diff --git a/lib/datadog/ci/worker.rb b/lib/datadog/ci/worker.rb new file mode 100644 index 00000000..ed879946 --- /dev/null +++ b/lib/datadog/ci/worker.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require "datadog/core/worker" +require "datadog/core/workers/async" + +# general purpose async worker for CI +# executes given task once in separate thread +module Datadog + module CI + class Worker < Datadog::Core::Worker + include Datadog::Core::Workers::Async::Thread + + DEFAULT_SHUTDOWN_TIMEOUT = 60 + DEFAULT_WAIT_TIMEOUT = 60 + + def stop(timeout = DEFAULT_SHUTDOWN_TIMEOUT) + join(timeout) + end + + def wait_until_done(timeout = DEFAULT_WAIT_TIMEOUT) + join(timeout) + end + + def done? + started? && !running? + end + end + + class DummyWorker < Worker + def initialize + super { nil } + end + end + end +end diff --git a/sig/datadog/ci.rbs b/sig/datadog/ci.rbs index 34f91bf1..de8c3194 100644 --- a/sig/datadog/ci.rbs +++ b/sig/datadog/ci.rbs @@ -29,6 +29,8 @@ module Datadog def self.components: () -> Datadog::CI::Configuration::Components - def self.recorder: () -> Datadog::CI::TestVisibility::Recorder + def self.recorder: () -> (Datadog::CI::TestVisibility::Recorder | Datadog::CI::TestVisibility::NullRecorder) + + def self.itr_runner: () -> Datadog::CI::ITR::Runner? end end diff --git a/sig/datadog/ci/configuration/components.rbs b/sig/datadog/ci/configuration/components.rbs index 4e8bfad4..09f548c3 100644 --- a/sig/datadog/ci/configuration/components.rbs +++ b/sig/datadog/ci/configuration/components.rbs @@ -2,9 +2,11 @@ module Datadog module CI module Configuration module Components : Datadog::Core::Configuration::Components - @ci_recorder: Datadog::CI::TestVisibility::Recorder + @ci_recorder: Datadog::CI::TestVisibility::Recorder | Datadog::CI::TestVisibility::NullRecorder + @itr: Datadog::CI::ITR::Runner? - attr_reader ci_recorder: Datadog::CI::TestVisibility::Recorder + attr_reader ci_recorder: Datadog::CI::TestVisibility::Recorder | Datadog::CI::TestVisibility::NullRecorder + attr_reader itr: Datadog::CI::ITR::Runner? def initialize: (untyped settings) -> void diff --git a/sig/datadog/ci/contrib/cucumber/ext.rbs b/sig/datadog/ci/contrib/cucumber/ext.rbs index 18d81294..a28a4248 100644 --- a/sig/datadog/ci/contrib/cucumber/ext.rbs +++ b/sig/datadog/ci/contrib/cucumber/ext.rbs @@ -5,12 +5,8 @@ module Datadog module Ext ENV_ENABLED: String - ENV_OPERATION_NAME: String - FRAMEWORK: String - OPERATION_NAME: String - DEFAULT_SERVICE_NAME: String STEP_SPAN_TYPE: String diff --git a/sig/datadog/ci/contrib/cucumber/step.rbs b/sig/datadog/ci/contrib/cucumber/step.rbs new file mode 100644 index 00000000..4020f20b --- /dev/null +++ b/sig/datadog/ci/contrib/cucumber/step.rbs @@ -0,0 +1,16 @@ +module Datadog + module CI + module Contrib + module Cucumber + module Step + def self.included: (untyped base) -> untyped + + module InstanceMethods + prepend ::Cucumber::Core::Test::Step + def execute: (*untyped args) -> untyped + end + end + end + end + end +end diff --git a/sig/datadog/ci/contrib/minitest/ext.rbs b/sig/datadog/ci/contrib/minitest/ext.rbs index 8f4847c6..03c194b2 100644 --- a/sig/datadog/ci/contrib/minitest/ext.rbs +++ b/sig/datadog/ci/contrib/minitest/ext.rbs @@ -5,12 +5,8 @@ module Datadog module Ext ENV_ENABLED: String - ENV_OPERATION_NAME: String - FRAMEWORK: String - OPERATION_NAME: String - DEFAULT_SERVICE_NAME: String end end diff --git a/sig/datadog/ci/contrib/rspec/ext.rbs b/sig/datadog/ci/contrib/rspec/ext.rbs index 90eae92c..6024044e 100644 --- a/sig/datadog/ci/contrib/rspec/ext.rbs +++ b/sig/datadog/ci/contrib/rspec/ext.rbs @@ -7,9 +7,6 @@ module Datadog FRAMEWORK: String DEFAULT_SERVICE_NAME: String - - OPERATION_NAME: String - ENV_OPERATION_NAME: String end end end diff --git a/sig/datadog/ci/contrib/settings.rbs b/sig/datadog/ci/contrib/settings.rbs index ca38c544..7a731726 100644 --- a/sig/datadog/ci/contrib/settings.rbs +++ b/sig/datadog/ci/contrib/settings.rbs @@ -18,7 +18,6 @@ module Datadog # def enabled: () -> bool def service_name: () -> String - def operation_name: () -> String end end end diff --git a/sig/datadog/ci/ext/environment.rbs b/sig/datadog/ci/ext/environment.rbs index 73f8b132..9e875937 100644 --- a/sig/datadog/ci/ext/environment.rbs +++ b/sig/datadog/ci/ext/environment.rbs @@ -27,8 +27,6 @@ module Datadog TAG_CI_ENV_VARS: String - HEX_NUMBER_REGEXP: Regexp - PROVIDERS: ::Array[Array[String | Symbol]] def self?.tags: (untyped env) -> Hash[String, String] diff --git a/sig/datadog/ci/ext/environment/providers/local_git.rbs b/sig/datadog/ci/ext/environment/providers/local_git.rbs index ad44a33c..c7738d7a 100644 --- a/sig/datadog/ci/ext/environment/providers/local_git.rbs +++ b/sig/datadog/ci/ext/environment/providers/local_git.rbs @@ -4,28 +4,10 @@ module Datadog module Environment module Providers class LocalGit < Base - class GitUser - attr_reader name: String? - attr_reader email: String? - attr_reader timestamp: String? - - @name: String? - @email: String? - @timestamp: String? - - def initialize: (String? name, String? email, String? timestamp) -> void - - def date: () -> String? - end - - class NilUser < GitUser - def initialize: () -> void - end - private - @author: GitUser - @committer: GitUser + @author: Datadog::CI::Git::User + @committer: Datadog::CI::Git::User def git_repository_url: () -> String? @@ -51,9 +33,9 @@ module Datadog def workspace_path: () -> String? - def author: () -> GitUser + def author: () -> Datadog::CI::Git::User - def committer: () -> GitUser + def committer: () -> Datadog::CI::Git::User def set_git_commit_users: () -> void end diff --git a/sig/datadog/ci/ext/settings.rbs b/sig/datadog/ci/ext/settings.rbs index 2ead3eab..c8847c6c 100644 --- a/sig/datadog/ci/ext/settings.rbs +++ b/sig/datadog/ci/ext/settings.rbs @@ -8,6 +8,7 @@ module Datadog ENV_EXPERIMENTAL_TEST_SUITE_LEVEL_VISIBILITY_ENABLED: String ENV_FORCE_TEST_LEVEL_VISIBILITY: String ENV_ITR_ENABLED: String + ENV_GIT_METADATA_UPLOAD_ENABLED: String DD_SITE_ALLOWLIST: Array[String] end diff --git a/sig/datadog/ci/ext/test.rbs b/sig/datadog/ci/ext/test.rbs index 5b235a54..354694c5 100644 --- a/sig/datadog/ci/ext/test.rbs +++ b/sig/datadog/ci/ext/test.rbs @@ -36,6 +36,12 @@ module Datadog TAG_ITR_TEST_SKIPPING_TYPE: "test.itr.tests_skipping.type" + TAG_ITR_TEST_SKIPPING_COUNT: "test.itr.tests_skipping.count" + + TAG_ITR_SKIPPED_BY_ITR: "test.skipped_by_itr" + + TAG_ITR_TESTS_SKIPPED: "_dd.ci.itr.tests_skipped" + TAG_CODE_COVERAGE_ENABLED: "test.code_coverage.enabled" TAG_TEST_SESSION_ID: "_test.session_id" @@ -52,6 +58,8 @@ module Datadog TAG_OS_PLATFORM: "os.platform" + TAG_OS_VERSION: "os.version" + TAG_RUNTIME_NAME: "runtime.name" TAG_RUNTIME_VERSION: "runtime.version" @@ -62,6 +70,8 @@ module Datadog ITR_TEST_SKIPPING_MODE: "test" + ITR_TEST_SKIP_REASON: String + module Status PASS: "pass" diff --git a/sig/datadog/ci/ext/transport.rbs b/sig/datadog/ci/ext/transport.rbs index 59c9a935..12ea3544 100644 --- a/sig/datadog/ci/ext/transport.rbs +++ b/sig/datadog/ci/ext/transport.rbs @@ -26,9 +26,13 @@ module Datadog TEST_VISIBILITY_INTAKE_PATH: "/api/v2/citestcycle" + TEST_COVERAGE_INTAKE_HOST_PREFIX: "citestcov-intake" + + TEST_COVERAGE_INTAKE_PATH: "/api/v2/citestcov" + DD_API_HOST_PREFIX: "api" - DD_API_SETTINGS_PATH: "/api/v2/ci/libraries/tests/services/setting" + DD_API_SETTINGS_PATH: "/api/v2/libraries/tests/services/setting" DD_API_SETTINGS_TYPE: "ci_app_test_service_libraries_settings" @@ -44,10 +48,20 @@ module Datadog DD_API_SETTINGS_RESPONSE_DEFAULT: Hash[String, untyped] + DD_API_GIT_SEARCH_COMMITS_PATH: "/api/v2/git/repository/search_commits" + + DD_API_GIT_UPLOAD_PACKFILE_PATH: "/api/v2/git/repository/packfile" + + DD_API_SKIPPABLE_TESTS_PATH: "/api/v2/ci/tests/skippable" + + DD_API_SKIPPABLE_TESTS_TYPE: "test_params" + CONTENT_TYPE_MESSAGEPACK: "application/msgpack" CONTENT_TYPE_JSON: "application/json" + CONTENT_TYPE_MULTIPART_FORM_DATA: "multipart/form-data" + CONTENT_ENCODING_GZIP: "gzip" end end diff --git a/sig/datadog/ci/git/local_repository.rbs b/sig/datadog/ci/git/local_repository.rbs new file mode 100644 index 00000000..25f4db7e --- /dev/null +++ b/sig/datadog/ci/git/local_repository.rbs @@ -0,0 +1,52 @@ +module Datadog + module CI + module Git + module LocalRepository + COMMAND_RETRY_COUNT: 3 + + @root: String? + @repository_name: String? + + def self.root: -> String + + def self.repository_name: -> String + + def self.current_folder_name: -> String + + def self.relative_to_root: (String? path) -> String + + def self.git_repository_url: () -> String? + + def self.git_root: () -> String? + + def self.git_commit_sha: () -> String? + + def self.git_branch: () -> String? + + def self.git_tag: () -> String? + + def self.git_commit_message: () -> String? + + def self.git_commit_users: () -> Array[Datadog::CI::Git::User] + + def self.git_commits: () -> Array[String] + + def self.git_commits_rev_list: (included_commits: Enumerable[String], excluded_commits: Enumerable[String]) -> String? + + def self.git_generate_packfiles: (included_commits: Enumerable[String], excluded_commits: Enumerable[String], path: String) -> String? + + def self.git_shallow_clone?: () -> bool + + def self.git_unshallow: () -> String? + + private + + def self.filter_invalid_commits: (Enumerable[String] commits) -> Array[String] + + def self.exec_git_command: (String ref, ?stdin: String?) -> String? + + def self.log_failure: (StandardError e, String action) -> void + end + end + end +end diff --git a/sig/datadog/ci/git/packfiles.rbs b/sig/datadog/ci/git/packfiles.rbs new file mode 100644 index 00000000..615e2957 --- /dev/null +++ b/sig/datadog/ci/git/packfiles.rbs @@ -0,0 +1,9 @@ +module Datadog + module CI + module Git + module Packfiles + def self.generate: (included_commits: Enumerable[String], excluded_commits: Enumerable[String]) { (String) -> untyped } -> void + end + end + end +end diff --git a/sig/datadog/ci/git/search_commits.rbs b/sig/datadog/ci/git/search_commits.rbs new file mode 100644 index 00000000..e650957f --- /dev/null +++ b/sig/datadog/ci/git/search_commits.rbs @@ -0,0 +1,26 @@ +module Datadog + module CI + module Git + class SearchCommits + @api: Datadog::CI::Transport::Api::Base? + + attr_reader api: Datadog::CI::Transport::Api::Base? + + class ApiError < StandardError + end + + def initialize: (api: Datadog::CI::Transport::Api::Base?) -> void + + def call: (String repository_url, Array[String] commits) -> Set[String] + + private + + def request_payload: (String repository_url, Array[String] commits) -> String + + def parse_json_response: (Datadog::Core::Transport::Response response) -> Hash[String, untyped] + + def extract_commits: (Hash[String, untyped] response) -> Set[String] + end + end + end +end diff --git a/sig/datadog/ci/git/tree_uploader.rbs b/sig/datadog/ci/git/tree_uploader.rbs new file mode 100644 index 00000000..43eeb649 --- /dev/null +++ b/sig/datadog/ci/git/tree_uploader.rbs @@ -0,0 +1,18 @@ +module Datadog + module CI + module Git + class TreeUploader + @api: Datadog::CI::Transport::Api::Base? + + attr_reader api: Datadog::CI::Transport::Api::Base? + + def initialize: (api: Datadog::CI::Transport::Api::Base?) -> void + def call: (String repository_url) -> void + + private + + def fetch_known_commits_and_split: (String repository_url, Array[String] latest_commits) -> [Array[String], Array[String]] + end + end + end +end diff --git a/sig/datadog/ci/git/upload_packfile.rbs b/sig/datadog/ci/git/upload_packfile.rbs new file mode 100644 index 00000000..25d01ba2 --- /dev/null +++ b/sig/datadog/ci/git/upload_packfile.rbs @@ -0,0 +1,32 @@ +module Datadog + module CI + module Git + class UploadPackfile + @api: Datadog::CI::Transport::Api::Base? + + @head_commit_sha: String + + @repository_url: String + + class ApiError < StandardError + end + + attr_reader api: Datadog::CI::Transport::Api::Base? + + attr_reader head_commit_sha: String + + attr_reader repository_url: String + + def initialize: (api: Datadog::CI::Transport::Api::Base?, head_commit_sha: String, repository_url: String) -> void + + def call: (filepath: String) -> void + + private + + def request_payload: (String boundary, String filename, String packfile_contents) -> untyped + + def read_file: (String filepath) -> untyped + end + end + end +end diff --git a/sig/datadog/ci/git/user.rbs b/sig/datadog/ci/git/user.rbs new file mode 100644 index 00000000..ef630dae --- /dev/null +++ b/sig/datadog/ci/git/user.rbs @@ -0,0 +1,23 @@ +module Datadog + module CI + module Git + class User + attr_reader name: String? + attr_reader email: String? + attr_reader timestamp: String? + + @name: String? + @email: String? + @timestamp: String? + + def initialize: (String? name, String? email, String? timestamp) -> void + + def date: () -> String? + end + + class NilUser < User + def initialize: () -> void + end + end + end +end diff --git a/sig/datadog/ci/itr/coverage/ddcov.rbs b/sig/datadog/ci/itr/coverage/ddcov.rbs new file mode 100644 index 00000000..89426c10 --- /dev/null +++ b/sig/datadog/ci/itr/coverage/ddcov.rbs @@ -0,0 +1,16 @@ +module Datadog + module CI + module ITR + module Coverage + class DDCov + + def initialize: (root: String, ?mode: Symbol) -> void + + def start: () -> void + + def stop: () -> Hash[String, untyped] + end + end + end + end +end diff --git a/sig/datadog/ci/itr/coverage/event.rbs b/sig/datadog/ci/itr/coverage/event.rbs new file mode 100644 index 00000000..0e868934 --- /dev/null +++ b/sig/datadog/ci/itr/coverage/event.rbs @@ -0,0 +1,33 @@ +module Datadog + module CI + module ITR + module Coverage + class Event + @test_id: String + + @test_session_id: String + + @test_suite_id: String + + @coverage: Hash[String, untyped] + + attr_reader test_id: String + + attr_reader test_session_id: String + + attr_reader test_suite_id: String + + attr_reader coverage: Hash[String, untyped] + + def initialize: (test_id: String, test_suite_id: String, test_session_id: String, coverage: Hash[String, untyped]) -> void + + def valid?: () -> bool + + def to_msgpack: (?untyped? packer) -> untyped + + def pretty_inspect: () -> String + end + end + end + end +end diff --git a/sig/datadog/ci/itr/coverage/transport.rbs b/sig/datadog/ci/itr/coverage/transport.rbs new file mode 100644 index 00000000..b289d440 --- /dev/null +++ b/sig/datadog/ci/itr/coverage/transport.rbs @@ -0,0 +1,19 @@ +module Datadog + module CI + module ITR + module Coverage + class Transport < Datadog::CI::Transport::EventPlatformTransport + private + + def send_payload: (String payload) -> ::Datadog::CI::Transport::HTTP::ResponseDecorator + + def encode_events: (Array[Datadog::CI::ITR::Coverage::Event] events) -> ::Array[String] + + def pack_events: (Array[String] encoded_events) -> String + + def event_too_large?: (Datadog::CI::ITR::Coverage::Event event, String encoded_event) -> bool + end + end + end + end +end diff --git a/sig/datadog/ci/itr/coverage/writer.rbs b/sig/datadog/ci/itr/coverage/writer.rbs new file mode 100644 index 00000000..e3ac64d4 --- /dev/null +++ b/sig/datadog/ci/itr/coverage/writer.rbs @@ -0,0 +1,46 @@ +module Datadog + module CI + module ITR + module Coverage + class Writer + include Datadog::Core::Workers::Async::Thread + include Datadog::Core::Workers::Polling + include Datadog::Core::Workers::Queue + include Datadog::Core::Workers::IntervalLoop + + @transport: Datadog::CI::ITR::Coverage::Transport + + @buffer_size: Integer + + @shutdown_timeout: Integer + + @stopped: bool + + attr_reader transport: Datadog::CI::ITR::Coverage::Transport + + DEFAULT_BUFFER_MAX_SIZE: 10000 + + DEFAULT_SHUTDOWN_TIMEOUT: 60 + + def initialize: (transport: Datadog::CI::ITR::Coverage::Transport, ?options: ::Hash[untyped, untyped]) -> void + + def write: (Datadog::CI::ITR::Coverage::Event event) -> untyped + + def perform: (*Datadog::CI::ITR::Coverage::Event events) -> nil + + def stop: (?bool force_stop, ?Integer timeout) -> untyped + + def enqueue: (Datadog::CI::ITR::Coverage::Event event) -> untyped + + def dequeue: () -> ::Array[Datadog::CI::ITR::Coverage::Event] + + def async?: () -> true + + def after_fork: () -> untyped + + def buffer_klass: () -> untyped + end + end + end + end +end diff --git a/sig/datadog/ci/itr/runner.rbs b/sig/datadog/ci/itr/runner.rbs index 1944eeb7..abc0720e 100644 --- a/sig/datadog/ci/itr/runner.rbs +++ b/sig/datadog/ci/itr/runner.rbs @@ -2,23 +2,56 @@ module Datadog module CI module ITR class Runner + include Datadog::Core::Utils::Forking + @enabled: bool @test_skipping_enabled: bool @code_coverage_enabled: bool + @correlation_id: String + @skippable_tests: Array[String] + @coverage_writer: Datadog::CI::ITR::Coverage::Writer? + + @api: Datadog::CI::Transport::Api::Base? + @dd_env: String? - def initialize: (?enabled: bool) -> void + @skipped_tests_count: Integer + @mutex: Thread::Mutex - def configure: (Hash[String, untyped] remote_configuration, Datadog::CI::TestSession test_session) -> void + def initialize: (dd_env: String?, ?enabled: bool, coverage_writer: Datadog::CI::ITR::Coverage::Writer?, api: Datadog::CI::Transport::Api::Base?) -> void + + def configure: (Hash[String, untyped] remote_configuration, test_session: Datadog::CI::TestSession, git_tree_upload_worker: Datadog::CI::Worker) -> void def enabled?: () -> bool def skipping_tests?: () -> bool - def code_coverage: () -> bool + def code_coverage?: () -> bool + + def start_coverage: (Datadog::CI::Test test) -> void + + def stop_coverage: (Datadog::CI::Test test) -> Datadog::CI::ITR::Coverage::Event? + + def mark_if_skippable: (Datadog::CI::Test test) -> void + + def count_skipped_test: (Datadog::CI::Test test) -> void + + def write_test_session_tags: (Datadog::CI::TestSession test_session) -> void + + def shutdown!: () -> void private - def convert_to_bool: (untyped value) -> bool + def coverage_collector: () -> Datadog::CI::ITR::Coverage::DDCov? + + def load_datadog_cov!: () -> void + + def write: (Datadog::CI::ITR::Coverage::Event event) -> void + + def ensure_test_source_covered: (String test_source_file, Hash[String, untyped] coverage) -> void + + def fetch_skippable_tests: (test_session: Datadog::CI::TestSession, git_tree_upload_worker: Datadog::CI::Worker) -> void + + def increment_skipped_tests_counter: () -> void end end end diff --git a/sig/datadog/ci/itr/skippable.rbs b/sig/datadog/ci/itr/skippable.rbs new file mode 100644 index 00000000..15c81922 --- /dev/null +++ b/sig/datadog/ci/itr/skippable.rbs @@ -0,0 +1,35 @@ +module Datadog + module CI + module ITR + class Skippable + @api: Datadog::CI::Transport::Api::Base? + @dd_env: String? + + class Response + @http_response: Datadog::Core::Transport::HTTP::Adapters::Net::Response? + @json: Hash[String, untyped]? + + def initialize: (Datadog::Core::Transport::HTTP::Adapters::Net::Response? http_response) -> void + + def ok?: () -> bool + + def correlation_id: () -> String? + + def tests: () -> Set[String] + + private + + def payload: () -> Hash[String, untyped] + end + + def initialize: (?api: Datadog::CI::Transport::Api::Base?, dd_env: String?) -> void + + def fetch_skippable_tests: (Datadog::CI::TestSession test_session) -> Response + + private + + def payload: (Datadog::CI::TestSession test_session) -> String + end + end + end +end diff --git a/sig/datadog/ci/span.rbs b/sig/datadog/ci/span.rbs index cbf14fff..6be70c73 100644 --- a/sig/datadog/ci/span.rbs +++ b/sig/datadog/ci/span.rbs @@ -55,6 +55,8 @@ module Datadog def os_platform: () -> String? + def os_version: () -> String? + def runtime_name: () -> String? def runtime_version: () -> String? diff --git a/sig/datadog/ci/test.rbs b/sig/datadog/ci/test.rbs index ab77f7d0..00f9c925 100644 --- a/sig/datadog/ci/test.rbs +++ b/sig/datadog/ci/test.rbs @@ -7,7 +7,9 @@ module Datadog def test_suite_name: () -> String? def test_module_id: () -> String? def test_session_id: () -> String? + def skipped_by_itr?: () -> bool def source_file: () -> String? + def parameters: () -> String? private diff --git a/sig/datadog/ci/test_visibility/null_recorder.rbs b/sig/datadog/ci/test_visibility/null_recorder.rbs index 2f30a0c3..a9132de0 100644 --- a/sig/datadog/ci/test_visibility/null_recorder.rbs +++ b/sig/datadog/ci/test_visibility/null_recorder.rbs @@ -6,7 +6,7 @@ module Datadog def trace_test: (String span_name, String test_suite_name, ?service: String?, ?tags: Hash[untyped, untyped]) ?{ (nil span) -> untyped } -> untyped - def trace: (String type, String span_name, ?tags: Hash[untyped, untyped]) ?{ (nil) -> untyped } -> untyped + def trace: (String span_name, ?type: String, ?tags: Hash[untyped, untyped]) ?{ (Datadog::CI::Span span) -> untyped } -> untyped def start_test_session: (?service: String?, ?tags: Hash[untyped, untyped]) -> nil @@ -24,6 +24,8 @@ module Datadog def active_span: () -> nil + def shutdown!: () -> nil + private def skip_tracing: (?untyped block) -> nil diff --git a/sig/datadog/ci/test_visibility/recorder.rbs b/sig/datadog/ci/test_visibility/recorder.rbs index c2017750..f7bf5c54 100644 --- a/sig/datadog/ci/test_visibility/recorder.rbs +++ b/sig/datadog/ci/test_visibility/recorder.rbs @@ -10,11 +10,12 @@ module Datadog @itr: Datadog::CI::ITR::Runner @remote_settings_api: Datadog::CI::Transport::RemoteSettingsApi @codeowners: Datadog::CI::Codeowners::Matcher + @git_tree_upload_worker: Datadog::CI::Worker attr_reader environment_tags: Hash[String, String] attr_reader test_suite_level_visibility_enabled: bool - def initialize: (?test_suite_level_visibility_enabled: bool, ?codeowners: Datadog::CI::Codeowners::Matcher, itr: Datadog::CI::ITR::Runner, remote_settings_api: Datadog::CI::Transport::RemoteSettingsApi) -> void + def initialize: (?test_suite_level_visibility_enabled: bool, ?codeowners: Datadog::CI::Codeowners::Matcher, itr: Datadog::CI::ITR::Runner, remote_settings_api: Datadog::CI::Transport::RemoteSettingsApi, ?git_tree_upload_worker: Datadog::CI::Worker) -> void def trace_test: (String span_name, String test_suite_name, ?service: String?, ?tags: Hash[untyped, untyped]) ?{ (Datadog::CI::Test span) -> untyped } -> untyped @@ -46,6 +47,8 @@ module Datadog def itr_enabled?: () -> bool + def shutdown!: () -> void + private def configure_library: (Datadog::CI::TestSession test_session) -> void @@ -88,6 +91,12 @@ module Datadog def set_inherited_globals: (Hash[untyped, untyped] tags) -> void def validate_test_suite_level_visibility_correctness: (Datadog::CI::Test test) -> void + + def on_test_finished: (Datadog::CI::Test test) -> void + + def on_test_started: (Datadog::CI::Test test) -> void + + def on_test_session_finished: (Datadog::CI::TestSession test_session) -> void end end end diff --git a/sig/datadog/ci/test_visibility/transport.rbs b/sig/datadog/ci/test_visibility/transport.rbs index 20822d81..77ec7a0b 100644 --- a/sig/datadog/ci/test_visibility/transport.rbs +++ b/sig/datadog/ci/test_visibility/transport.rbs @@ -1,34 +1,25 @@ module Datadog module CI module TestVisibility - class Transport - DEFAULT_MAX_PAYLOAD_SIZE: Integer - + class Transport < Datadog::CI::Transport::EventPlatformTransport attr_reader serializers_factory: singleton(Datadog::CI::TestVisibility::Serializers::Factories::TestLevel) | singleton(Datadog::CI::TestVisibility::Serializers::Factories::TestSuiteLevel) attr_reader dd_env: String? - attr_reader api: Datadog::CI::Transport::Api::Base - attr_reader max_payload_size: Integer @dd_env: String? @serializers_factory: singleton(Datadog::CI::TestVisibility::Serializers::Factories::TestLevel) | singleton(Datadog::CI::TestVisibility::Serializers::Factories::TestSuiteLevel) - @max_payload_size: Integer def initialize: ( api: Datadog::CI::Transport::Api::Base, - ?dd_env: ::String?, + dd_env: ::String?, ?serializers_factory: singleton(Datadog::CI::TestVisibility::Serializers::Factories::TestLevel) | singleton(Datadog::CI::TestVisibility::Serializers::Factories::TestSuiteLevel), ?max_payload_size: Integer ) -> void - def send_traces: (Array[Datadog::Tracing::TraceSegment] traces) -> ::Array[Datadog::CI::Transport::HTTP::ResponseDecorator] - private def send_payload: (String encoded_payload) -> Datadog::CI::Transport::HTTP::ResponseDecorator - def pack_events: (Array[String] encoded_events) -> String - def encode_traces: (Array[Datadog::Tracing::TraceSegment] traces) -> ::Array[String] + def encode_events: (Array[Datadog::Tracing::TraceSegment] traces) -> ::Array[String] def encode_span: (Datadog::Tracing::TraceSegment trace, Datadog::Tracing::Span span) -> String? - def encoder: () -> singleton(Datadog::Core::Encoding::MsgpackEncoder) end end end diff --git a/sig/datadog/ci/transport/api/agentless.rbs b/sig/datadog/ci/transport/api/agentless.rbs index 04ae60da..df267e27 100644 --- a/sig/datadog/ci/transport/api/agentless.rbs +++ b/sig/datadog/ci/transport/api/agentless.rbs @@ -8,11 +8,18 @@ module Datadog @api_key: String @citestcycle_http: Datadog::CI::Transport::HTTP @api_http: Datadog::CI::Transport::HTTP + @citestcov_http: Datadog::CI::Transport::HTTP - def initialize: (api_key: String, citestcycle_url: String, api_url: String) -> void + def initialize: (api_key: String, citestcycle_url: String, api_url: String, citestcov_url: String) -> void def request: (path: String, payload: String, ?headers: Hash[String, String], ?verb: ::String) -> Datadog::CI::Transport::HTTP::ResponseDecorator + def citestcycle_request: (path: String, payload: String, ?headers: Hash[String, String], ?verb: ::String) -> Datadog::CI::Transport::HTTP::ResponseDecorator + + def api_request: (path: String, payload: String, ?headers: Hash[String, String], ?verb: ::String) -> Datadog::CI::Transport::HTTP::ResponseDecorator + + def citestcov_request: (path: String, payload: String, ?headers: Hash[String, String], ?verb: ::String) -> Datadog::CI::Transport::HTTP::ResponseDecorator + private def perform_request: (Datadog::CI::Transport::HTTP client, path: String, payload: String, headers: Hash[String, String], verb: ::String) -> Datadog::CI::Transport::HTTP::ResponseDecorator diff --git a/sig/datadog/ci/transport/api/base.rbs b/sig/datadog/ci/transport/api/base.rbs index 21cc7f49..cc31c503 100644 --- a/sig/datadog/ci/transport/api/base.rbs +++ b/sig/datadog/ci/transport/api/base.rbs @@ -3,10 +3,14 @@ module Datadog module Transport module Api class Base + @citestcov_payload: String + def api_request: (path: String, payload: String, ?headers: Hash[String, String], ?verb: ::String) -> untyped def citestcycle_request: (path: String, payload: String, ?headers: Hash[String, String], ?verb: ::String) -> untyped + def citestcov_request: (path: String, payload: String, ?headers: Hash[String, String], ?verb: ::String) -> untyped + private def headers_with_default: (Hash[String, String] headers) -> Hash[String, String] diff --git a/sig/datadog/ci/transport/api/evp_proxy.rbs b/sig/datadog/ci/transport/api/evp_proxy.rbs index 56d68f38..a5ad03c0 100644 --- a/sig/datadog/ci/transport/api/evp_proxy.rbs +++ b/sig/datadog/ci/transport/api/evp_proxy.rbs @@ -16,6 +16,8 @@ module Datadog def api_request: (path: String, payload: String, ?headers: Hash[String, String], ?verb: ::String) -> Datadog::CI::Transport::HTTP::ResponseDecorator + def citestcov_request: (path: String, payload: String, ?headers: Hash[String, String], ?verb: ::String) -> untyped + private def perform_request: (Datadog::CI::Transport::HTTP client, path: String, payload: String, headers: Hash[String, String], verb: ::String) -> Datadog::CI::Transport::HTTP::ResponseDecorator diff --git a/sig/datadog/ci/transport/event_platform_transport.rbs b/sig/datadog/ci/transport/event_platform_transport.rbs new file mode 100644 index 00000000..a06eec70 --- /dev/null +++ b/sig/datadog/ci/transport/event_platform_transport.rbs @@ -0,0 +1,33 @@ +module Datadog + module CI + module Transport + class EventPlatformTransport + DEFAULT_MAX_PAYLOAD_SIZE: Integer + + attr_reader api: Datadog::CI::Transport::Api::Base + attr_reader max_payload_size: Integer + + @api: Datadog::CI::Transport::Api::Base + @max_payload_size: Integer + + def initialize: (api: Datadog::CI::Transport::Api::Base, ?max_payload_size: Integer) -> void + + def send_events: (Array[untyped] events) -> ::Array[Datadog::CI::Transport::HTTP::ResponseDecorator] + + private + + def send_payload: (String payload) -> ::Datadog::CI::Transport::HTTP::ResponseDecorator + + def encoder: () -> singleton(Datadog::Core::Encoding::MsgpackEncoder) + + def encode_events: (Array[untyped] events) -> ::Array[String] + + def write_payload_header: (untyped packer) -> void + + def pack_events: (Array[String] encoded_events) -> String + + def event_too_large?: (untyped event, String encoded_event) -> bool + end + end + end +end diff --git a/sig/datadog/ci/transport/http.rbs b/sig/datadog/ci/transport/http.rbs index 1d0e6f0c..69154763 100644 --- a/sig/datadog/ci/transport/http.rbs +++ b/sig/datadog/ci/transport/http.rbs @@ -14,10 +14,12 @@ module Datadog attr_reader compress: bool DEFAULT_TIMEOUT: 30 + MAX_RETRIES: 3 + INITIAL_BACKOFF: 1 def initialize: (host: String, ?port: Integer?, ?ssl: bool, ?timeout: Integer, ?compress: bool) -> void - def request: (?verb: String, payload: String, headers: Hash[String, String], path: String) -> ResponseDecorator + def request: (?verb: String, payload: String, headers: Hash[String, String], path: String, ?retries: Integer, ?backoff: Integer) -> ResponseDecorator private @@ -25,7 +27,25 @@ module Datadog def build_env: (payload: String, headers: Hash[String, String], path: String, verb: String) -> Datadog::Core::Transport::HTTP::Env + def perform_http_call: (payload: String, headers: Hash[String, String], path: String, verb: String, ?retries: Integer, ?backoff: Integer) -> Datadog::Core::Transport::Response + + class AdapterSettings + attr_reader hostname: String + attr_reader port: Integer? + attr_reader ssl: bool + attr_reader timeout_seconds: Integer + + @hostname: String + @port: Integer? + @ssl: bool + @timeout_seconds: Integer + + def initialize: (hostname: String, ?port: Integer?, ?ssl: bool, ?timeout_seconds: Integer) -> void + end + class ResponseDecorator < ::SimpleDelegator + include Datadog::Core::Transport::Response + def initialize: (untyped anything) -> void def trace_count: () -> Integer end diff --git a/sig/datadog/ci/transport/remote_settings_api.rbs b/sig/datadog/ci/transport/remote_settings_api.rbs index cbf422a3..1c655f0e 100644 --- a/sig/datadog/ci/transport/remote_settings_api.rbs +++ b/sig/datadog/ci/transport/remote_settings_api.rbs @@ -12,6 +12,8 @@ module Datadog def payload: () -> Hash[String, untyped] + def require_git?: () -> bool + private def default_payload: () -> Hash[String, untyped] @@ -20,7 +22,7 @@ module Datadog @api: Datadog::CI::Transport::Api::Base? @dd_env: String? - def initialize: (?api: Datadog::CI::Transport::Api::Base?, ?dd_env: String?) -> void + def initialize: (?api: Datadog::CI::Transport::Api::Base?, dd_env: String?) -> void def fetch_library_settings: (Datadog::CI::TestSession test_session) -> Response diff --git a/sig/datadog/ci/utils/git.rbs b/sig/datadog/ci/utils/git.rbs index 9b33a668..e4138129 100644 --- a/sig/datadog/ci/utils/git.rbs +++ b/sig/datadog/ci/utils/git.rbs @@ -2,22 +2,11 @@ module Datadog module CI module Utils module Git - @root: String? - @repository_name: String? + def self.valid_commit_sha?: (String? sha) -> bool def self.normalize_ref: (String? name) -> String? def self.is_git_tag?: (String? ref) -> bool - - def self.exec_git_command: (String ref) -> String? - - def self.root: -> String? - - def self.repository_name: -> String - - def self.current_folder_name: -> String - - def self.relative_to_root: (String? path) -> String? end end end diff --git a/sig/datadog/ci/utils/parsing.rbs b/sig/datadog/ci/utils/parsing.rbs new file mode 100644 index 00000000..93b33aca --- /dev/null +++ b/sig/datadog/ci/utils/parsing.rbs @@ -0,0 +1,9 @@ +module Datadog + module CI + module Utils + module Parsing + def self.convert_to_bool: (untyped value) -> bool + end + end + end +end diff --git a/sig/datadog/ci/utils/test_run.rbs b/sig/datadog/ci/utils/test_run.rbs index c985f99b..71287469 100644 --- a/sig/datadog/ci/utils/test_run.rbs +++ b/sig/datadog/ci/utils/test_run.rbs @@ -5,6 +5,10 @@ module Datadog self.@command: String def self.command: () -> String + + def self.skippable_test_id: (String test_name, String? test_suite, ?String? parameters) -> String + + def self.test_parameters: (?arguments: Hash[untyped, untyped], ?metadata: Hash[untyped, untyped]) -> String end end end diff --git a/sig/datadog/ci/worker.rbs b/sig/datadog/ci/worker.rbs new file mode 100644 index 00000000..21b86c17 --- /dev/null +++ b/sig/datadog/ci/worker.rbs @@ -0,0 +1,22 @@ +module Datadog + module CI + class Worker < Datadog::Core::Worker + include Datadog::Core::Workers::Async::Thread::PrependedMethods + include Datadog::Core::Workers::Async::Thread + + DEFAULT_SHUTDOWN_TIMEOUT: 60 + + DEFAULT_WAIT_TIMEOUT: 60 + + def stop: (?Integer timeout) -> void + + def wait_until_done: (?Integer timeout) -> void + + def done?: () -> bool + end + + class DummyWorker < Worker + def initialize: () -> void + end + end +end diff --git a/spec/datadog/ci/configuration/components_spec.rb b/spec/datadog/ci/configuration/components_spec.rb index 62e00e90..3f8ec57e 100644 --- a/spec/datadog/ci/configuration/components_spec.rb +++ b/spec/datadog/ci/configuration/components_spec.rb @@ -29,8 +29,6 @@ end after do - components.telemetry.worker.stop(true) - components.telemetry.worker.join components.shutdown! end diff --git a/spec/datadog/ci/configuration/settings_spec.rb b/spec/datadog/ci/configuration/settings_spec.rb index 730f0aa4..5cea8e5a 100644 --- a/spec/datadog/ci/configuration/settings_spec.rb +++ b/spec/datadog/ci/configuration/settings_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Dummy Integration class FakeIntegration include Datadog::CI::Contrib::Integration @@ -258,6 +260,47 @@ def patcher end end + describe "#git_metadata_upload_enabled" do + subject(:git_metadata_upload_enabled) { settings.ci.git_metadata_upload_enabled } + + it { is_expected.to be true } + + context "when #{Datadog::CI::Ext::Settings::ENV_GIT_METADATA_UPLOAD_ENABLED}" do + around do |example| + ClimateControl.modify(Datadog::CI::Ext::Settings::ENV_GIT_METADATA_UPLOAD_ENABLED => enable) do + example.run + end + end + + context "is not defined" do + let(:enable) { nil } + + it { is_expected.to be true } + end + + context "is set to true" do + let(:enable) { "true" } + + it { is_expected.to be true } + end + + context "is set to false" do + let(:enable) { "false" } + + it { is_expected.to be false } + end + end + end + + describe "#git_metadata_upload_enabled=" do + it "updates the #enabled setting" do + expect { settings.ci.git_metadata_upload_enabled = false } + .to change { settings.ci.git_metadata_upload_enabled } + .from(true) + .to(false) + end + end + describe "#instrument" do let(:integration_name) { :fake } diff --git a/spec/datadog/ci/contrib/cucumber/features/CODEOWNERS b/spec/datadog/ci/contrib/cucumber/features/CODEOWNERS new file mode 100644 index 00000000..d2f00579 --- /dev/null +++ b/spec/datadog/ci/contrib/cucumber/features/CODEOWNERS @@ -0,0 +1 @@ +* @test-owner \ No newline at end of file diff --git a/spec/datadog/ci/contrib/cucumber/instrumentation_spec.rb b/spec/datadog/ci/contrib/cucumber/instrumentation_spec.rb index b4099f2a..c5dfae2b 100644 --- a/spec/datadog/ci/contrib/cucumber/instrumentation_spec.rb +++ b/spec/datadog/ci/contrib/cucumber/instrumentation_spec.rb @@ -3,9 +3,19 @@ require "cucumber" RSpec.describe "Cucumber formatter" do + let(:cucumber_features_root) { File.join(__dir__, "features") } + + before do + allow(Datadog::CI::Git::LocalRepository).to receive(:root).and_return(cucumber_features_root) + end + include_context "CI mode activated" do let(:integration_name) { :cucumber } let(:integration_options) { {service_name: "jalapenos"} } + + let(:itr_enabled) { true } + let(:code_coverage_enabled) { true } + let(:tests_skipping_enabled) { true } end let(:cucumber_8_or_above) { Gem::Version.new("8.0.0") <= Datadog::CI::Contrib::Cucumber::Integration.version } @@ -95,13 +105,13 @@ expect(scenario_span).to have_test_tag( :source_file, - "spec/datadog/ci/contrib/cucumber/features/passing.feature" + "passing.feature" ) expect(scenario_span).to have_test_tag(:source_start, "3") expect(scenario_span).to have_test_tag( :codeowners, - "[\"@DataDog/ruby-guild\", \"@DataDog/ci-app-libraries\"]" + "[\"@test-owner\"]" ) step_span = spans.find { |s| s.resource == "datadog" } @@ -141,6 +151,12 @@ Datadog::CI::Contrib::Cucumber::Integration.version.to_s ) expect(test_session_span).to have_pass_status + + # ITR + expect(test_session_span).to have_test_tag(:itr_test_skipping_enabled, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_type, "test") + expect(test_session_span).to have_test_tag(:itr_tests_skipped, "false") + expect(test_session_span).to have_test_tag(:itr_test_skipping_count, 0) end it "creates test module span" do @@ -176,6 +192,50 @@ expect(first_test_span).to have_test_tag(:test_suite_id, first_test_suite_span.id.to_s) expect(first_test_span).to have_test_tag(:suite, first_test_suite_span.name) end + + context "collecting coverage with features dir as root" do + before { skip if PlatformHelpers.jruby? } + + it "creates coverage events for each non-skipped test" do + expect(coverage_events).to have(1).item + + expect_coverage_events_belong_to_session(test_session_span) + expect_coverage_events_belong_to_suite(first_test_suite_span) + expect_coverage_events_belong_to_tests([test_spans.first]) + expect_non_empty_coverages + + feature_coverage = coverage_events.first.coverage + # expect cucumber features to have gherkin files and step definitions as covered files + expect(feature_coverage.size).to eq(2) + expect(feature_coverage.keys).to include( + match(%r{features/passing\.feature}), + match(%r{features/step_definitions/steps_#{run_id}\.rb}) + ) + end + end + + context "skipping a test" do + let(:itr_skippable_tests) do + Set.new([ + "Datadog integration at spec/datadog/ci/contrib/cucumber/features/passing.feature.cucumber scenario." + ]) + end + + it "skips the test" do + expect(test_spans).to have(4).items + expect(test_spans).to all have_skip_status + + itr_skipped_test = test_spans.find { |span| span.name == "cucumber scenario" } + expect(itr_skipped_test).to have_test_tag(:itr_skipped_by_itr, "true") + end + + it "sets session level tags" do + expect(test_session_span).to have_test_tag(:itr_test_skipping_enabled, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_type, "test") + expect(test_session_span).to have_test_tag(:itr_tests_skipped, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_count, 1) + end + end end context "executing a failing test suite" do @@ -228,6 +288,31 @@ expect(span).to have_pass_status end end + + context "skipping some tests" do + before do + skip("test parameters are not supported in cucumber 3") unless cucumber_4_or_above + end + + let(:itr_skippable_tests) do + Set.new([ + 'Datadog integration for parametrized tests at spec/datadog/ci/contrib/cucumber/features/with_parameters.feature.scenario with examples.{"arguments":{"num1":"0","num2":"1","total":"1"},"metadata":{}}', + 'Datadog integration for parametrized tests at spec/datadog/ci/contrib/cucumber/features/with_parameters.feature.scenario with examples.{"arguments":{"num1":"2","num2":"3","total":"5"},"metadata":{}}' + ]) + end + + it "skips the test" do + expect(test_spans).to have(3).items + expect(test_spans).to have_tag_values_no_order(:status, ["skip", "skip", "pass"]) + end + + it "sets session level tags" do + expect(test_session_span).to have_test_tag(:itr_test_skipping_enabled, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_type, "test") + expect(test_session_span).to have_test_tag(:itr_tests_skipped, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_count, 2) + end + end end context "executing several features at once" do diff --git a/spec/datadog/ci/contrib/minitest/instrumentation_spec.rb b/spec/datadog/ci/contrib/minitest/instrumentation_spec.rb index b92e2492..3525c774 100644 --- a/spec/datadog/ci/contrib/minitest/instrumentation_spec.rb +++ b/spec/datadog/ci/contrib/minitest/instrumentation_spec.rb @@ -31,6 +31,10 @@ def test_foo include_context "CI mode activated" do let(:integration_name) { :minitest } let(:integration_options) { {service_name: "ltest"} } + + let(:itr_enabled) { true } + let(:code_coverage_enabled) { true } + let(:tests_skipping_enabled) { true } end before do @@ -74,7 +78,7 @@ def test_foo :source_file, "spec/datadog/ci/contrib/minitest/instrumentation_spec.rb" ) - expect(span).to have_test_tag(:source_start, "47") + expect(span).to have_test_tag(:source_start, "51") expect(span).to have_test_tag( :codeowners, "[\"@DataDog/ruby-guild\", \"@DataDog/ci-app-libraries\"]" @@ -418,6 +422,13 @@ def test_pass_other :framework_version, Datadog::CI::Contrib::Minitest::Integration.version.to_s ) + + # ITR + expect(test_session_span).to have_test_tag(:itr_test_skipping_enabled, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_type, "test") + expect(test_session_span).to have_test_tag(:itr_tests_skipped, "false") + expect(test_session_span).to have_test_tag(:itr_test_skipping_count, 0) + expect(test_session_span).to have_pass_status end @@ -473,6 +484,65 @@ def test_pass_other expect(first_test_span).to have_test_tag(:test_module_id, test_module_span.id.to_s) expect(first_test_span).to have_test_tag(:test_suite_id, first_test_suite_span.id.to_s) end + + it "creates code coverage events" do + skip if PlatformHelpers.jruby? + + expect(coverage_events).to have(2).items + + expect_coverage_events_belong_to_session(test_session_span) + expect_coverage_events_belong_to_suite(first_test_suite_span) + expect_coverage_events_belong_to_tests(test_spans) + expect_non_empty_coverages + end + + context "when ITR skips tests" do + context "single skipped test" do + let(:itr_skippable_tests) do + Set.new(["SomeTest at spec/datadog/ci/contrib/minitest/instrumentation_spec.rb.test_pass."]) + end + + it "skips a single test" do + expect(test_spans).to have(2).items + expect(test_spans).to have_tag_values_no_order(:status, ["skip", "pass"]) + + expect(first_test_span).to have_test_tag(:itr_skipped_by_itr, "true") + expect(test_spans.last).not_to have_test_tag(:itr_skipped_by_itr) + end + + it "send test session level tags" do + expect(test_session_span).to have_test_tag(:itr_test_skipping_enabled, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_type, "test") + expect(test_session_span).to have_test_tag(:itr_tests_skipped, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_count, 1) + end + end + + context "multiple skipped tests" do + let(:itr_skippable_tests) do + Set.new( + [ + "SomeTest at spec/datadog/ci/contrib/minitest/instrumentation_spec.rb.test_pass.", + "SomeTest at spec/datadog/ci/contrib/minitest/instrumentation_spec.rb.test_pass_other." + ] + ) + end + + it "skips all tests" do + expect(test_spans).to have(2).items + expect(test_spans).to all have_skip_status + + expect(test_spans).to all have_test_tag(:itr_skipped_by_itr, "true") + end + + it "send test session level tags" do + expect(test_session_span).to have_test_tag(:itr_test_skipping_enabled, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_type, "test") + expect(test_session_span).to have_test_tag(:itr_tests_skipped, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_count, 2) + end + end + end end context "single test failed" do @@ -637,6 +707,44 @@ def test_b_2 ] ) end + + it "creates code coverage events" do + skip if PlatformHelpers.jruby? + + expect(coverage_events).to have(4).items + + expect_coverage_events_belong_to_session(test_session_span) + expect_coverage_events_belong_to_suites(test_suite_spans) + expect_coverage_events_belong_to_tests(test_spans) + expect_non_empty_coverages + end + + context "when ITR skips tests" do + let(:itr_skippable_tests) do + Set.new( + [ + "TestA at spec/datadog/ci/contrib/minitest/instrumentation_spec.rb (test_a_1 concurrently).test_a_1.", + "TestA at spec/datadog/ci/contrib/minitest/instrumentation_spec.rb (test_a_2 concurrently).test_a_2.", + "TestB at spec/datadog/ci/contrib/minitest/instrumentation_spec.rb (test_b_2 concurrently).test_b_2." + ] + ) + end + + it "skips given tests" do + expect(test_spans).to have(4).items + expect(test_spans).to have_tag_values_no_order(:status, ["skip", "skip", "skip", "pass"]) + + skipped = test_spans.select { |span| span.get_tag("status") == "skip" } + expect(skipped).to all have_test_tag(:itr_skipped_by_itr, "true") + end + + it "sends test session level tags" do + expect(test_session_span).to have_test_tag(:itr_test_skipping_enabled, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_type, "test") + expect(test_session_span).to have_test_tag(:itr_tests_skipped, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_count, 3) + end + end end context "skipped suite" do diff --git a/spec/datadog/ci/contrib/rspec/instrumentation_spec.rb b/spec/datadog/ci/contrib/rspec/instrumentation_spec.rb index 2337400c..16c38cfa 100644 --- a/spec/datadog/ci/contrib/rspec/instrumentation_spec.rb +++ b/spec/datadog/ci/contrib/rspec/instrumentation_spec.rb @@ -1,11 +1,6 @@ require "time" RSpec.describe "RSpec hooks" do - include_context "CI mode activated" do - let(:integration_name) { :rspec } - let(:integration_options) { {service_name: "lspec"} } - end - # Yields to a block in a new RSpec global context. All RSpec # test configuration and execution should be wrapped in this method. def with_new_rspec_environment @@ -20,88 +15,133 @@ def with_new_rspec_environment ::RSpec.world = old_world end - it "creates span for example" do - spec = with_new_rspec_environment do - RSpec.describe "some test" do - it "foo" do - # DO NOTHING - end - end.tap(&:run) - end - - expect(first_test_span.type).to eq(Datadog::CI::Ext::AppTypes::TYPE_TEST) - expect(first_test_span.service).to eq("lspec") + def devnull + File.new("/dev/null", "w") + end - expect(first_test_span.name).to eq("foo") - expect(first_test_span.resource).to eq("foo") + def rspec_session_run(with_failed_test: false, with_shared_test: false, with_shared_context: false) + with_new_rspec_environment do + spec = RSpec.describe "SomeTest" do + context "nested" do + it "foo" do + expect(1 + 1).to eq(2) + end - expect(first_test_span).to have_test_tag(:name, "foo") - expect(first_test_span).to have_test_tag(:suite, "some test at #{spec.file_path}") + if with_failed_test + it "fails" do + expect(1).to eq(2) + end + end - expect(first_test_span).to have_test_tag(:span_kind, "test") - expect(first_test_span).to have_test_tag(:type, "test") + if with_shared_test + require_relative "some_shared_examples" + include_examples "Testing shared examples", 2 + include_examples "Testing shared examples", 1 + end - expect(first_test_span).to have_test_tag(:framework, "rspec") - expect(first_test_span).to have_test_tag( - :framework_version, - Datadog::CI::Contrib::RSpec::Integration.version.to_s - ) + if with_shared_context + require_relative "some_shared_context" + include_context "Shared context" + end + end + end - expect(first_test_span).to have_pass_status + options = ::RSpec::Core::ConfigurationOptions.new(%w[--pattern none]) + ::RSpec::Core::Runner.new(options).run(devnull, devnull) - expect(first_test_span).to have_test_tag( - :source_file, - "spec/datadog/ci/contrib/rspec/instrumentation_spec.rb" - ) - expect(first_test_span).to have_test_tag(:source_start, "26") - expect(first_test_span).to have_test_tag( - :codeowners, - "[\"@DataDog/ruby-guild\", \"@DataDog/ci-app-libraries\"]" - ) + spec + end end - it "creates spans for several examples" do - expect(Datadog::CI::Ext::Environment).to receive(:tags).never + context "running individual tests" do + include_context "CI mode activated" do + let(:integration_name) { :rspec } + let(:integration_options) { {service_name: "lspec"} } + end - num_examples = 20 - with_new_rspec_environment do - RSpec.describe "many tests" do - num_examples.times do |n| - it n do + it "creates span for example" do + spec = with_new_rspec_environment do + RSpec.describe "some test" do + it "foo" do # DO NOTHING end - end - end.run + end.tap(&:run) + end + + expect(first_test_span.type).to eq(Datadog::CI::Ext::AppTypes::TYPE_TEST) + expect(first_test_span.service).to eq("lspec") + + expect(first_test_span.name).to eq("foo") + expect(first_test_span.resource).to eq("foo") + + expect(first_test_span).to have_test_tag(:name, "foo") + expect(first_test_span).to have_test_tag(:suite, "some test at #{spec.file_path}") + + expect(first_test_span).to have_test_tag(:span_kind, "test") + expect(first_test_span).to have_test_tag(:type, "test") + + expect(first_test_span).to have_test_tag(:framework, "rspec") + expect(first_test_span).to have_test_tag( + :framework_version, + Datadog::CI::Contrib::RSpec::Integration.version.to_s + ) + + expect(first_test_span).to have_pass_status + + expect(first_test_span).to have_test_tag( + :source_file, + "spec/datadog/ci/contrib/rspec/instrumentation_spec.rb" + ) + expect(first_test_span).to have_test_tag(:source_start, "65") + expect(first_test_span).to have_test_tag( + :codeowners, + "[\"@DataDog/ruby-guild\", \"@DataDog/ci-app-libraries\"]" + ) end - expect(test_spans).to have(num_examples).items - end + it "creates spans for several examples" do + expect(Datadog::CI::Ext::Environment).to receive(:tags).never - it "creates span for unnamed examples" do - with_new_rspec_environment do - RSpec.describe "some unnamed test" do - it {} - end.run + num_examples = 20 + with_new_rspec_environment do + RSpec.describe "many tests" do + num_examples.times do |n| + it n do + # DO NOTHING + end + end + end.run + end + + expect(test_spans).to have(num_examples).items end - expect(first_test_span).to have_test_tag(:name, /example at .+/) - end + it "creates span for unnamed examples" do + with_new_rspec_environment do + RSpec.describe "some unnamed test" do + it {} + end.run + end - it "creates span for deeply nested examples" do - spec = with_new_rspec_environment do - RSpec.describe "some nested test" do - context "1" do - context "2" do - context "3" do - context "4" do - context "5" do - context "6" do - context "7" do - context "8" do - context "9" do - context "10" do - it "foo" do - # DO NOTHING + expect(first_test_span).to have_test_tag(:name, /example at .+/) + end + + it "creates span for deeply nested examples" do + spec = with_new_rspec_environment do + RSpec.describe "some nested test" do + context "1" do + context "2" do + context "3" do + context "4" do + context "5" do + context "6" do + context "7" do + context "8" do + context "9" do + context "10" do + it "foo" do + # DO NOTHING + end end end end @@ -112,339 +152,311 @@ def with_new_rspec_environment end end end - end - end.tap(&:run) - end - - expect(first_test_span.resource).to eq("1 2 3 4 5 6 7 8 9 10 foo") - expect(first_test_span).to have_test_tag(:name, "1 2 3 4 5 6 7 8 9 10 foo") - expect(first_test_span).to have_test_tag(:suite, "some nested test at #{spec.file_path}") - end - - it "creates spans for example with instrumentation" do - with_new_rspec_environment do - RSpec.describe "some test" do - it "foo" do - Datadog::Tracing.trace("get_time") do - Time.now - end - end - end.tap(&:run) - end - - expect(test_spans).to have(1).items - expect(custom_spans).to have(1).items - expect(custom_spans).to all have_origin(Datadog::CI::Ext::Test::CONTEXT_ORIGIN) - end + end.tap(&:run) + end - context "catches failures" do - def expect_failure - expect(first_test_span).to have_fail_status - expect(first_test_span).to have_error - expect(first_test_span).to have_error_type - expect(first_test_span).to have_error_message - expect(first_test_span).to have_error_stack + expect(first_test_span.resource).to eq("1 2 3 4 5 6 7 8 9 10 foo") + expect(first_test_span).to have_test_tag(:name, "1 2 3 4 5 6 7 8 9 10 foo") + expect(first_test_span).to have_test_tag(:suite, "some nested test at #{spec.file_path}") end - it "within let" do + it "creates spans for example with instrumentation" do with_new_rspec_environment do - RSpec.describe "some failed test with let" do - let(:let_failure) { raise "failure" } - + RSpec.describe "some test" do it "foo" do - let_failure + Datadog::Tracing.trace("get_time") do + Time.now + end end - end.run + end.tap(&:run) end - expect_failure + expect(test_spans).to have(1).items + expect(custom_spans).to have(1).items + expect(custom_spans).to all have_origin(Datadog::CI::Ext::Test::CONTEXT_ORIGIN) end - it "within around" do - with_new_rspec_environment do - RSpec.describe "some failed test with around" do - around do |example| - example.run - raise "failure" - end - - it "foo" do - # DO NOTHING - end - end.run + context "catches failures" do + def expect_failure + expect(first_test_span).to have_fail_status + expect(first_test_span).to have_error + expect(first_test_span).to have_error_type + expect(first_test_span).to have_error_message + expect(first_test_span).to have_error_stack end - expect_failure - end + it "within let" do + with_new_rspec_environment do + RSpec.describe "some failed test with let" do + let(:let_failure) { raise "failure" } - it "within before" do - with_new_rspec_environment do - RSpec.describe "some failed test with before" do - before do - raise "failure" - end + it "foo" do + let_failure + end + end.run + end - it "foo" do - # DO NOTHING - end - end.run + expect_failure end - expect_failure - end + it "within around" do + with_new_rspec_environment do + RSpec.describe "some failed test with around" do + around do |example| + example.run + raise "failure" + end - it "within after" do - with_new_rspec_environment do - RSpec.describe "some failed test with after" do - after do - raise "failure" - end + it "foo" do + # DO NOTHING + end + end.run + end - it "foo" do - # DO NOTHING - end - end.run + expect_failure end - expect_failure - end - end + it "within before" do + with_new_rspec_environment do + RSpec.describe "some failed test with before" do + before do + raise "failure" + end - context "supports skipped examples" do - it "with skip: true" do - with_new_rspec_environment do - RSpec.describe "some skipped test" do - it "foo", skip: true do - expect(1 + 1).to eq(5) - end - end.run + it "foo" do + # DO NOTHING + end + end.run + end + + expect_failure end - expect(first_test_span).to have_test_tag(:name, "foo") + it "within after" do + with_new_rspec_environment do + RSpec.describe "some failed test with after" do + after do + raise "failure" + end - expect(first_test_span).to have_skip_status - expect(first_test_span).to have_test_tag(:skip_reason, "No reason given") - expect(first_test_span).not_to have_error - end + it "foo" do + # DO NOTHING + end + end.run + end - it "with skip: reason" do - with_new_rspec_environment do - RSpec.describe "some skipped test" do - it "foo", skip: "reason in it block" do - expect(1 + 1).to eq(5) - end - end.run + expect_failure end + end - expect(first_test_span).to have_test_tag(:name, "foo") + context "supports skipped examples" do + it "with skip: true" do + with_new_rspec_environment do + RSpec.describe "some skipped test" do + it "foo", skip: true do + expect(1 + 1).to eq(5) + end + end.run + end - expect(first_test_span).to have_skip_status - expect(first_test_span).to have_test_tag(:skip_reason, "reason in it block") - expect(first_test_span).not_to have_error - end + expect(first_test_span).to have_test_tag(:name, "foo") - it "with skip instead of it" do - with_new_rspec_environment do - RSpec.describe "some skipped test" do - skip "foo" do - expect(1 + 1).to eq(5) - end - end.run + expect(first_test_span).to have_skip_status + expect(first_test_span).to have_test_tag(:skip_reason, "No reason given") + expect(first_test_span).not_to have_error end - expect(first_test_span).to have_test_tag(:name, "foo") + it "with skip: reason" do + with_new_rspec_environment do + RSpec.describe "some skipped test" do + it "foo", skip: "reason in it block" do + expect(1 + 1).to eq(5) + end + end.run + end - expect(first_test_span).to have_skip_status - expect(first_test_span).to have_test_tag(:skip_reason, "No reason given") - expect(first_test_span).not_to have_error - end + expect(first_test_span).to have_test_tag(:name, "foo") - it "with xit" do - with_new_rspec_environment do - RSpec.describe "some skipped test" do - xit "foo" do - expect(1 + 1).to eq(5) - end - end.run + expect(first_test_span).to have_skip_status + expect(first_test_span).to have_test_tag(:skip_reason, "reason in it block") + expect(first_test_span).not_to have_error end - expect(first_test_span).to have_test_tag(:name, "foo") + it "with skip instead of it" do + with_new_rspec_environment do + RSpec.describe "some skipped test" do + skip "foo" do + expect(1 + 1).to eq(5) + end + end.run + end - expect(first_test_span).to have_skip_status - expect(first_test_span).to have_test_tag(:skip_reason, "Temporarily skipped with xit") - expect(first_test_span).not_to have_error - end + expect(first_test_span).to have_test_tag(:name, "foo") - it "with skip call" do - with_new_rspec_environment do - RSpec.describe "some skipped test" do - it "foo" do - skip - expect(1 + 1).to eq(5) - end - end.run + expect(first_test_span).to have_skip_status + expect(first_test_span).to have_test_tag(:skip_reason, "No reason given") + expect(first_test_span).not_to have_error end - expect(first_test_span).to have_test_tag(:name, "foo") + it "with xit" do + with_new_rspec_environment do + RSpec.describe "some skipped test" do + xit "foo" do + expect(1 + 1).to eq(5) + end + end.run + end - expect(first_test_span).to have_skip_status - expect(first_test_span).to have_test_tag(:skip_reason, "No reason given") - expect(first_test_span).not_to have_error - end + expect(first_test_span).to have_test_tag(:name, "foo") - it "with skip call and reason given" do - with_new_rspec_environment do - RSpec.describe "some skipped test" do - it "foo" do - skip("reason") - expect(1 + 1).to eq(5) - end - end.run + expect(first_test_span).to have_skip_status + expect(first_test_span).to have_test_tag(:skip_reason, "Temporarily skipped with xit") + expect(first_test_span).not_to have_error end - expect(first_test_span).to have_test_tag(:name, "foo") + it "with skip call" do + with_new_rspec_environment do + RSpec.describe "some skipped test" do + it "foo" do + skip + expect(1 + 1).to eq(5) + end + end.run + end - expect(first_test_span).to have_skip_status - expect(first_test_span).to have_test_tag(:skip_reason, "reason") - expect(first_test_span).not_to have_error - end + expect(first_test_span).to have_test_tag(:name, "foo") - it "with empty body" do - with_new_rspec_environment do - RSpec.describe "some skipped test" do - it "foo" - end.run + expect(first_test_span).to have_skip_status + expect(first_test_span).to have_test_tag(:skip_reason, "No reason given") + expect(first_test_span).not_to have_error end - expect(first_test_span).to have_test_tag(:name, "foo") - - expect(first_test_span).to have_skip_status - expect(first_test_span).to have_test_tag(:skip_reason, "Not yet implemented") - expect(first_test_span).not_to have_error - end - - it "with xcontext" do - with_new_rspec_environment do - RSpec.describe "some skipped test" do - xcontext "foo" do - it "bar" do + it "with skip call and reason given" do + with_new_rspec_environment do + RSpec.describe "some skipped test" do + it "foo" do + skip("reason") expect(1 + 1).to eq(5) end - end - end.run + end.run + end + + expect(first_test_span).to have_test_tag(:name, "foo") + + expect(first_test_span).to have_skip_status + expect(first_test_span).to have_test_tag(:skip_reason, "reason") + expect(first_test_span).not_to have_error end - expect(first_test_span).to have_test_tag(:name, "foo bar") + it "with empty body" do + with_new_rspec_environment do + RSpec.describe "some skipped test" do + it "foo" + end.run + end - expect(first_test_span).to have_skip_status - expect(first_test_span).to have_test_tag(:skip_reason, "Temporarily skipped with xcontext") - expect(first_test_span).not_to have_error - end + expect(first_test_span).to have_test_tag(:name, "foo") - it "with pending keyword and failure" do - with_new_rspec_environment do - RSpec.describe "some skipped test" do - it "foo", pending: "did not fix the math yet" do - expect(1 + 1).to eq(5) - end - end.run + expect(first_test_span).to have_skip_status + expect(first_test_span).to have_test_tag(:skip_reason, "Not yet implemented") + expect(first_test_span).not_to have_error end - expect(first_test_span).to have_test_tag(:name, "foo") + it "with xcontext" do + with_new_rspec_environment do + RSpec.describe "some skipped test" do + xcontext "foo" do + it "bar" do + expect(1 + 1).to eq(5) + end + end + end.run + end - expect(first_test_span).to have_skip_status - expect(first_test_span).to have_test_tag(:skip_reason, "did not fix the math yet") - expect(first_test_span).to have_error - end + expect(first_test_span).to have_test_tag(:name, "foo bar") - it "with pending keyword and passing" do - with_new_rspec_environment do - RSpec.describe "some skipped test" do - it "foo", pending: "did not fix the math yet" do - expect(1 + 1).to eq(2) - end - end.run + expect(first_test_span).to have_skip_status + expect(first_test_span).to have_test_tag(:skip_reason, "Temporarily skipped with xcontext") + expect(first_test_span).not_to have_error end - expect(first_test_span).to have_test_tag(:name, "foo") + it "with pending keyword and failure" do + with_new_rspec_environment do + RSpec.describe "some skipped test" do + it "foo", pending: "did not fix the math yet" do + expect(1 + 1).to eq(5) + end + end.run + end - expect(first_test_span).to have_fail_status - expect(first_test_span).to have_error - expect(first_test_span).to have_error_message("Expected example to fail since it is pending, but it passed.") - end + expect(first_test_span).to have_test_tag(:name, "foo") - it "with pending method, reason and failure" do - with_new_rspec_environment do - RSpec.describe "some skipped test" do - it "foo" do - pending("did not fix the math yet") - expect(1 + 1).to eq(5) - end - end.run + expect(first_test_span).to have_skip_status + expect(first_test_span).to have_test_tag(:skip_reason, "did not fix the math yet") + expect(first_test_span).to have_error end - expect(first_test_span).to have_test_tag(:name, "foo") - - expect(first_test_span).to have_skip_status - expect(first_test_span).to have_test_tag(:skip_reason, "did not fix the math yet") - expect(first_test_span).to have_error - end - end + it "with pending keyword and passing" do + with_new_rspec_environment do + RSpec.describe "some skipped test" do + it "foo", pending: "did not fix the math yet" do + expect(1 + 1).to eq(2) + end + end.run + end - context "with git root changed" do - before do - expect(Datadog::CI::Utils::Git).to receive(:root).and_return("#{Dir.pwd}/spec") - end + expect(first_test_span).to have_test_tag(:name, "foo") - it "provides source file path relative to git root" do - with_new_rspec_environment do - RSpec.describe "some test" do - it "foo" do - # DO NOTHING - end - end.tap(&:run) + expect(first_test_span).to have_fail_status + expect(first_test_span).to have_error + expect(first_test_span).to have_error_message("Expected example to fail since it is pending, but it passed.") end - expect(first_test_span).to have_test_tag( - :source_file, - "datadog/ci/contrib/rspec/instrumentation_spec.rb" - ) - end - end + it "with pending method, reason and failure" do + with_new_rspec_environment do + RSpec.describe "some skipped test" do + it "foo" do + pending("did not fix the math yet") + expect(1 + 1).to eq(5) + end + end.run + end - context "with rspec runner" do - def devnull - File.new("/dev/null", "w") + expect(first_test_span).to have_test_tag(:name, "foo") + + expect(first_test_span).to have_skip_status + expect(first_test_span).to have_test_tag(:skip_reason, "did not fix the math yet") + expect(first_test_span).to have_error + end end - def rspec_session_run(with_failed_test: false, with_shared_test: false) - with_new_rspec_environment do - spec = RSpec.describe "SomeTest" do - context "nested" do + context "with git root changed" do + before do + expect(Datadog::CI::Git::LocalRepository).to receive(:root).and_return("#{Dir.pwd}/spec") + end + + it "provides source file path relative to git root" do + with_new_rspec_environment do + RSpec.describe "some test" do it "foo" do # DO NOTHING end - - if with_failed_test - it "fails" do - expect(1).to eq(2) - end - end - - if with_shared_test - require_relative "some_shared_examples" - include_examples "Testing shared examples", 2 - include_examples "Testing shared examples", 1 - end - end + end.tap(&:run) end - options = ::RSpec::Core::ConfigurationOptions.new(%w[--pattern none]) - ::RSpec::Core::Runner.new(options).run(devnull, devnull) - - spec + expect(first_test_span).to have_test_tag( + :source_file, + "datadog/ci/contrib/rspec/instrumentation_spec.rb" + ) end end + end + + context "with rspec runner" do + include_context "CI mode activated" do + let(:integration_name) { :rspec } + let(:integration_options) { {service_name: "lspec"} } + end it "creates test session span" do rspec_session_run @@ -460,6 +472,14 @@ def rspec_session_run(with_failed_test: false, with_shared_test: false) Datadog::CI::Contrib::RSpec::Integration.version.to_s ) + expect(test_session_span).not_to have_test_tag(:code_coverage_enabled) + + # ITR + expect(test_session_span).not_to have_test_tag(:itr_test_skipping_enabled) + expect(test_session_span).not_to have_test_tag(:itr_test_skipping_type) + expect(test_session_span).not_to have_test_tag(:itr_tests_skipped) + expect(test_session_span).not_to have_test_tag(:itr_test_skipping_count) + expect(test_session_span).to have_pass_status end @@ -591,4 +611,107 @@ def rspec_skipped_session_run end end end + + context "with code coverage collected" do + before { skip if PlatformHelpers.jruby? } + + before do + allow(Datadog::CI::Git::LocalRepository).to receive(:root).and_return(__dir__) + end + + include_context "CI mode activated" do + let(:integration_name) { :rspec } + let(:integration_options) { {service_name: "lspec"} } + + let(:itr_enabled) { true } + let(:code_coverage_enabled) { true } + end + + it "collects code coverage" do + rspec_session_run(with_failed_test: true, with_shared_context: true) + + expect(test_session_span).not_to be_nil + expect(test_session_span).to have_test_tag(:code_coverage_enabled, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_type, "test") + expect(test_session_span).to have_test_tag(:itr_test_skipping_enabled, "false") + + expect(test_spans).to have(3).items + + expect(coverage_events).to have(3).items + expect_coverage_events_belong_to_session(test_session_span) + expect_coverage_events_belong_to_suite(first_test_suite_span) + expect_coverage_events_belong_to_tests(test_spans) + expect_non_empty_coverages + + # collects coverage from shared context files + shared_context_test = test_spans.find { |span| span.name == "nested is 42" } + shared_context_coverage = find_coverage_for_test(shared_context_test) + + expect(shared_context_coverage.coverage).to eq({ + File.join(__dir__, "some_shared_context.rb") => true + }) + end + end + + context "when skipping tests" do + include_context "CI mode activated" do + let(:integration_name) { :rspec } + let(:integration_options) { {service_name: "lspec"} } + + let(:itr_enabled) { true } + let(:tests_skipping_enabled) { true } + end + + context "skipped a single test" do + let(:itr_skippable_tests) do + Set.new([ + 'SomeTest at ./spec/datadog/ci/contrib/rspec/instrumentation_spec.rb.nested foo.{"arguments":{},"metadata":{"scoped_id":"1:1:1"}}' + ]) + end + + it "skips test" do + rspec_session_run(with_failed_test: true) + + expect(test_spans).to have(2).items + expect(test_spans).to have_tag_values_no_order(:status, ["skip", "fail"]) + + itr_skipped_test = test_spans.find { |span| span.name == "nested foo" } + expect(itr_skipped_test).to have_test_tag(:itr_skipped_by_itr, "true") + end + + it "sends test session level tags" do + rspec_session_run(with_failed_test: true) + + expect(test_session_span).to have_test_tag(:itr_test_skipping_enabled, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_type, "test") + expect(test_session_span).to have_test_tag(:itr_tests_skipped, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_count, 1) + end + end + + context "skipped all tests" do + let(:itr_skippable_tests) do + Set.new([ + 'SomeTest at ./spec/datadog/ci/contrib/rspec/instrumentation_spec.rb.nested foo.{"arguments":{},"metadata":{"scoped_id":"1:1:1"}}', + 'SomeTest at ./spec/datadog/ci/contrib/rspec/instrumentation_spec.rb.nested fails.{"arguments":{},"metadata":{"scoped_id":"1:1:2"}}' + ]) + end + + it "skips tests and suite" do + rspec_session_run(with_failed_test: true) + + expect(test_spans).to have(2).items + expect(test_spans).to all have_skip_status + expect(test_spans).to all have_test_tag(:itr_skipped_by_itr, "true") + expect(first_test_suite_span).to have_skip_status + end + + it "sends test session level tags" do + rspec_session_run(with_failed_test: true) + + expect(test_session_span).to have_test_tag(:itr_tests_skipped, "true") + expect(test_session_span).to have_test_tag(:itr_test_skipping_count, 2) + end + end + end end diff --git a/spec/datadog/ci/contrib/rspec/some_shared_context.rb b/spec/datadog/ci/contrib/rspec/some_shared_context.rb new file mode 100644 index 00000000..858bc9c7 --- /dev/null +++ b/spec/datadog/ci/contrib/rspec/some_shared_context.rb @@ -0,0 +1,7 @@ +RSpec.shared_context "Shared context" do + let(:expected_result) { 42 } + + it "is 42" do + expect(expected_result).to eq(42) + end +end diff --git a/spec/datadog/ci/git/local_repository_spec.rb b/spec/datadog/ci/git/local_repository_spec.rb new file mode 100644 index 00000000..a3c681cb --- /dev/null +++ b/spec/datadog/ci/git/local_repository_spec.rb @@ -0,0 +1,403 @@ +# frozen_string_literal: true + +require_relative "../../../../lib/datadog/ci/git/local_repository" + +RSpec.describe ::Datadog::CI::Git::LocalRepository do + let(:environment_variables) { {} } + + def with_custom_git_environment + ClimateControl.modify(environment_variables) do + yield + end + end + + describe ".root" do + subject { described_class.root } + + it { is_expected.to eq(Dir.pwd) } + + context "caches the result" do + before do + expect(Open3).to receive(:capture2e).never + end + + it "returns the same result" do + 2.times do + expect(described_class.root).to eq(Dir.pwd) + end + end + end + end + + describe ".relative_to_root" do + subject { described_class.relative_to_root(path) } + + context "when path is nil" do + let(:path) { nil } + + it { is_expected.to eq("") } + end + + context "when git root is nil" do + before do + allow(described_class).to receive(:root).and_return(nil) + end + + let(:path) { "foo/bar" } + + it { is_expected.to eq("foo/bar") } + end + + context "when git root is not nil" do + context "when path is absolute" do + before do + allow(described_class).to receive(:root).and_return("/foo/bar") + end + let(:path) { "/foo/bar/baz" } + + it { is_expected.to eq("baz") } + end + + context "when path is relative" do + before do + allow(described_class).to receive(:root).and_return("#{Dir.pwd}/foo/bar") + end + + let(:path) { "./baz" } + + it { is_expected.to eq("../../baz") } + end + end + end + + describe ".current_folder_name" do + subject { described_class.current_folder_name } + let(:path) { "/foo/bar" } + + before do + allow(described_class).to receive(:root).and_return(path) + end + + it { is_expected.to eq("bar") } + end + + describe ".repository_name" do + subject { described_class.repository_name } + + it { is_expected.to eq("datadog-ci-rb") } + + context "caches the result" do + before do + expect(Open3).to receive(:capture2e).never + end + + it "returns the same result" do + 2.times do + expect(described_class.root).to eq(Dir.pwd) + end + end + end + end + + describe ".git_repository_url" do + subject { described_class.git_repository_url } + + it { is_expected.to eq("git@github.com:DataDog/datadog-ci-rb.git") } + end + + describe ".git_commits" do + subject { described_class.git_commits } + + it "returns a list of git commit sha (this test will fail if there are no commits to this library in the past month)" do + expect(subject).to be_kind_of(Array) + expect(subject).not_to be_empty + expect(subject.first).to eq(described_class.git_commit_sha) + end + end + + describe ".git_commits_rev_list" do + # skip for jruby for now - old git version DD docker image + before { skip if PlatformHelpers.jruby? } + + let(:commits) { described_class.git_commits } + let(:included_commits) { commits[0..1] } + let(:excluded_commits) { commits[2..] } + + subject do + described_class.git_commits_rev_list(included_commits: included_commits, excluded_commits: excluded_commits) + end + + it "returns a list of commits that are reachable from included list but not reachable from excluded list" do + expect(subject).to include(included_commits.join("\n")) + end + + context "invalid commits" do + let(:included_commits) { [" | echo \"boo\" "] } + let(:excluded_commits) { [" | echo \"boo\" "] } + + it "returns nil" do + expect(subject).to be_nil + end + end + end + + describe ".git_generate_packfiles" do + # skip for jruby for now - old git version DD docker image + before { skip if PlatformHelpers.jruby? } + + let(:commits) { described_class.git_commits } + let(:included_commits) { commits[0..1] } + let(:excluded_commits) { commits[2..] } + + subject do + described_class.git_generate_packfiles( + included_commits: included_commits, + excluded_commits: excluded_commits, + path: tmpdir + ) + end + + context "temporary directory" do + let(:tmpdir) { Dir.mktmpdir } + + after do + FileUtils.remove_entry(tmpdir) + end + + it "generates packfiles in temp directory" do + expect(subject).to match(/^\h{8}$/) + packfiles = Dir.entries(tmpdir) - %w[. ..] + expect(packfiles).not_to be_empty + expect(packfiles).to all(match(/^\h{8}-\h{40}\.(pack|idx|rev)$/)) + end + end + + context "no such directory" do + let(:tmpdir) { " | echo \"boo\"" } + + it "returns nil" do + expect(subject).to be_nil + expect(File.exist?(tmpdir)).to be_falsey + end + end + end + + context "with git folder" do + include_context "with git fixture", "gitdir_with_commit" + + describe ".git_root" do + subject do + with_custom_git_environment do + described_class.git_root + end + end + + it { is_expected.to eq(File.join(Dir.pwd, "spec/support/fixtures/git")) } + end + + describe ".git_commit_sha" do + subject do + with_custom_git_environment do + described_class.git_commit_sha + end + end + + it { is_expected.to eq("c7f893648f656339f62fb7b4d8a6ecdf7d063835") } + end + + describe ".git_branch" do + subject do + with_custom_git_environment do + described_class.git_branch + end + end + + it { is_expected.to eq("master") } + end + + describe ".git_tag" do + subject do + with_custom_git_environment do + described_class.git_tag + end + end + + it { is_expected.to be_nil } + end + + describe ".git_commit_message" do + subject do + with_custom_git_environment do + described_class.git_commit_message + end + end + + it { is_expected.to eq("First commit with ❤️") } + end + + describe ".git_commit_users" do + subject do + with_custom_git_environment do + described_class.git_commit_users + end + end + + it "parses author and commiter from the latest commit" do + author, committer = subject + + expect(author.name).to eq("Friendly bot") + expect(author.email).to eq("bot@friendly.test") + expect(author.date).to eq("2011-02-16T13:00:00+00:00") + expect(committer.name).to eq("Andrey Marchenko") + expect(committer.email).to eq("andrey.marchenko@datadoghq.com") + expect(committer.date).to eq("2023-10-02T13:52:56+00:00") + end + end + + describe ".git_commits" do + subject do + with_custom_git_environment do + described_class.git_commits + end + end + + it "returns empty array as last commit was more than 1 month ago" do + expect(subject).to eq([]) + end + end + + describe ".git_commits_rev_list" do + let(:included_commits) { [] } + let(:excluded_commits) { [] } + + subject do + with_custom_git_environment do + described_class.git_commits_rev_list(included_commits: included_commits, excluded_commits: excluded_commits) + end + end + + it { is_expected.to be_nil } + end + end + + context "with git folder tagged" do + include_context "with git fixture", "gitdir_with_tag" + + describe ".git_tag" do + subject do + with_custom_git_environment do + described_class.git_tag + end + end + + it { is_expected.to eq("first-tag") } + end + end + + context "with shallow clone" do + before { skip("temporariliy skipped until development returns to main") } + + let(:tmpdir) { Dir.mktmpdir } + after { FileUtils.remove_entry(tmpdir) } + + before do + # shallow clone datadog-ci-rb repository + `cd #{tmpdir} && git clone --depth 1 https://github.com/DataDog/datadog-ci-rb` + end + + def with_shallow_clone_git_dir + ClimateControl.modify("GIT_DIR" => File.join(tmpdir, "datadog-ci-rb/.git")) do + yield + end + end + + describe ".git_shallow_clone?" do + subject do + with_shallow_clone_git_dir { described_class.git_shallow_clone? } + end + + it { is_expected.to be_truthy } + end + + describe ".git_commits" do + subject do + with_shallow_clone_git_dir { described_class.git_commits } + end + + it "returns a list of single git commit sha" do + expect(subject).to be_kind_of(Array) + expect(subject).not_to be_empty + expect(subject).to have(1).item + expect(subject.first).to match(/^\h{40}$/) + end + end + + describe ".git_unshallow" do + # skip for jruby for now - old git version DD docker image + before { skip if PlatformHelpers.jruby? } + + subject do + with_shallow_clone_git_dir { described_class.git_unshallow } + end + let(:commits) do + with_shallow_clone_git_dir { described_class.git_commits } + end + + it "unshallows the repository" do + expect(subject).to be_truthy + expect(commits.size).to be > 1 + end + end + end + + context "with full clone" do + let(:tmpdir) { Dir.mktmpdir } + after { FileUtils.remove_entry(tmpdir) } + + before do + # shallow clone datadog-ci-rb repository + `cd #{tmpdir} && git clone https://github.com/DataDog/datadog-ci-rb` + end + + def with_full_clone_git_dir + ClimateControl.modify("GIT_DIR" => File.join(tmpdir, "datadog-ci-rb/.git")) do + yield + end + end + + describe ".git_shallow_clone?" do + subject do + with_full_clone_git_dir { described_class.git_shallow_clone? } + end + + it { is_expected.to be_falsey } + end + end + + context "with failing command" do + describe ".git_commits" do + subject { described_class.git_commits } + + context "succeeds on retries" do + before do + expect(Open3).to receive(:capture2e).and_return([nil, nil], [+"sha1\nsha2", double(success?: true)]) + end + + it { is_expected.to eq(%w[sha1 sha2]) } + end + + context "fails on retries" do + before do + expect(Open3).to( + receive(:capture2e) + .and_return([nil, nil]) + .at_most(described_class::COMMAND_RETRY_COUNT + 1) + .times + ) + end + + it { is_expected.to eq([]) } + end + end + end +end diff --git a/spec/datadog/ci/git/packfiles_spec.rb b/spec/datadog/ci/git/packfiles_spec.rb new file mode 100644 index 00000000..07842e5a --- /dev/null +++ b/spec/datadog/ci/git/packfiles_spec.rb @@ -0,0 +1,95 @@ +# frozen_string_literal: true + +require_relative "../../../../lib/datadog/ci/git/packfiles" + +RSpec.describe ::Datadog::CI::Git::Packfiles do + # skip for jruby for now - old git version DD docker image + before { skip if PlatformHelpers.jruby? } + + let(:commits) { Datadog::CI::Git::LocalRepository.git_commits } + let(:included_commits) { commits[0..1] } + let(:excluded_commits) { commits[2..] } + + describe ".generate" do + it "yields packfile" do + expect do |b| + described_class.generate(included_commits: included_commits, excluded_commits: excluded_commits, &b) + end.to yield_with_args(/\/.+\h{8}-\h{40}\.pack$/) + end + + context "empty packfiles folder" do + before do + expect(Datadog::CI::Git::LocalRepository).to receive(:git_generate_packfiles).with( + included_commits: included_commits, + excluded_commits: excluded_commits, + path: String + ) do + "pref" + end + end + + it "does not yield anything" do + expect do |b| + described_class.generate(included_commits: included_commits, excluded_commits: excluded_commits, &b) + end.not_to yield_control + end + end + + context "something goes wrong" do + before do + expect(Dir).to receive(:mktmpdir).and_raise("error") + end + + it "does not yield anything" do + expect do |b| + described_class.generate(included_commits: included_commits, excluded_commits: excluded_commits, &b) + end.not_to yield_control + end + end + + context "tmp folder fails" do + let(:current_process_tmp_folder) { File.join(Dir.pwd, "tmp", "packfiles") } + let(:prefix) { "pref" } + + before do + expect(Datadog::CI::Git::LocalRepository).to receive(:git_generate_packfiles).with( + included_commits: included_commits, + excluded_commits: excluded_commits, + path: String + ).and_return(nil) + + expect(Datadog::CI::Git::LocalRepository).to receive(:git_generate_packfiles).with( + included_commits: included_commits, + excluded_commits: excluded_commits, + path: current_process_tmp_folder + ) do + File.write(File.join(current_process_tmp_folder, "#{prefix}-sha.idx"), "hello world") + File.write(File.join(current_process_tmp_folder, "other-sha.pack"), "hello world") + File.write(File.join(current_process_tmp_folder, "#{prefix}-sha.pack"), "hello world") + + prefix + end + end + + it "creates temporary folder in the current directory" do + expect do |b| + described_class.generate(included_commits: included_commits, excluded_commits: excluded_commits, &b) + end.to yield_with_args(/^#{current_process_tmp_folder}\/pref-sha.pack$/) + + expect(File.exist?(current_process_tmp_folder)).to be_falsey + end + end + + context "packfile generation fails" do + before do + allow(Datadog::CI::Git::LocalRepository).to receive(:git_generate_packfiles).and_return(nil) + end + + it "does not yield anything" do + expect do |b| + described_class.generate(included_commits: included_commits, excluded_commits: excluded_commits, &b) + end.not_to yield_control + end + end + end +end diff --git a/spec/datadog/ci/git/search_commits_spec.rb b/spec/datadog/ci/git/search_commits_spec.rb new file mode 100644 index 00000000..9bbadd36 --- /dev/null +++ b/spec/datadog/ci/git/search_commits_spec.rb @@ -0,0 +1,156 @@ +# frozen_string_literal: true + +require_relative "../../../../lib/datadog/ci/git/search_commits" + +RSpec.describe Datadog::CI::Git::SearchCommits do + let(:api) { double("api") } + subject(:search_commits) { described_class.new(api: api) } + + describe "#call" do + let(:repository_url) { "https://datadoghq.com/git/test.git" } + let(:commits) { ["c7f893648f656339f62fb7b4d8a6ecdf7d063835"] } + + context "when the API is not configured" do + let(:api) { nil } + + it "raises an error" do + expect { search_commits.call(repository_url, commits) } + .to raise_error(Datadog::CI::Git::SearchCommits::ApiError, "test visibility API is not configured") + end + end + + context "when the API is configured" do + before do + allow(api).to receive(:api_request).and_return(http_response) + end + + context "when the API request fails" do + let(:http_response) { double("http_response", ok?: false, inspect: "error message") } + + it "raises an error" do + expect { search_commits.call(repository_url, commits) } + .to raise_error(Datadog::CI::Git::SearchCommits::ApiError, "Failed to search commits: error message") + end + end + + context "when the API request is successful" do + let(:http_response) { double("http_response", ok?: true, payload: response_payload) } + let(:response_payload) do + { + data: [ + { + id: "c7f893648f656339f62fb7b4d8a6ecdf7d063835", + type: "commit" + } + ] + }.to_json + end + + it "returns the list of commit SHAs" do + expect(api).to receive(:api_request).with( + path: Datadog::CI::Ext::Transport::DD_API_GIT_SEARCH_COMMITS_PATH, + payload: "{\"meta\":{\"repository_url\":\"https://datadoghq.com/git/test.git\"},\"data\":[{\"id\":\"c7f893648f656339f62fb7b4d8a6ecdf7d063835\",\"type\":\"commit\"}]}" + ).and_return(http_response) + + expect(search_commits.call(repository_url, commits)).to eq(Set.new(["c7f893648f656339f62fb7b4d8a6ecdf7d063835"])) + end + + context "when the request contains an invalid commit SHA" do + let(:commits) { ["INVALID_SHA", "c7f893648f656339f62fb7b4d8a6ecdf7d063835"] } + + it "does not include the invalid commit SHA in the request" do + expect(api).to receive(:api_request).with( + path: Datadog::CI::Ext::Transport::DD_API_GIT_SEARCH_COMMITS_PATH, + payload: "{\"meta\":{\"repository_url\":\"https://datadoghq.com/git/test.git\"},\"data\":[{\"id\":\"c7f893648f656339f62fb7b4d8a6ecdf7d063835\",\"type\":\"commit\"}]}" + ).and_return(http_response) + + expect(search_commits.call(repository_url, commits)).to eq(Set.new(["c7f893648f656339f62fb7b4d8a6ecdf7d063835"])) + end + end + + context "when the response contains an invalid commit type" do + let(:response_payload) do + { + data: [ + { + id: "c7f893648f656339f62fb7b4d8a6ecdf7d063835", + type: "invalid" + } + ] + }.to_json + end + + it "raises an error" do + expect { search_commits.call(repository_url, commits) } + .to raise_error( + Datadog::CI::Git::SearchCommits::ApiError, + "Invalid commit type response {\"id\"=>\"c7f893648f656339f62fb7b4d8a6ecdf7d063835\", \"type\"=>\"invalid\"}" + ) + end + end + + context "when the response contains an invalid commit SHA" do + let(:response_payload) do + { + data: [ + { + id: "INVALID_SHA", + type: "commit" + } + ] + }.to_json + end + + it "raises an error" do + expect { search_commits.call(repository_url, commits) } + .to raise_error(Datadog::CI::Git::SearchCommits::ApiError, "Invalid commit SHA response INVALID_SHA") + end + end + + context "when the response is not a valid JSON" do + let(:response_payload) { "invalid json" } + + it "raises an error" do + expect { search_commits.call(repository_url, commits) } + .to raise_error( + Datadog::CI::Git::SearchCommits::ApiError, + "Failed to parse search commits response: unexpected token at 'invalid json'. Payload was: invalid json" + ) + end + end + + context "when the response is missing the data key" do + let(:response_payload) { {}.to_json } + + it "raises an error" do + expect { search_commits.call(repository_url, commits) } + .to raise_error( + Datadog::CI::Git::SearchCommits::ApiError, + "Malformed search commits response: key not found: \"data\". Payload was: {}" + ) + end + end + + context "when the response is missing the commit type" do + let(:response_payload) do + { + data: [ + { + id: "c7f893648f656339f62fb7b4d8a6ecdf7d063835" + } + ] + }.to_json + end + + it "raises an error" do + expect { search_commits.call(repository_url, commits) } + .to raise_error( + Datadog::CI::Git::SearchCommits::ApiError, + "Invalid commit type response {\"id\"=>\"c7f893648f656339f62fb7b4d8a6ecdf7d063835\"}" + ) + end + end + end + end + end +end diff --git a/spec/datadog/ci/git/tree_uploader_spec.rb b/spec/datadog/ci/git/tree_uploader_spec.rb new file mode 100644 index 00000000..19e9c55a --- /dev/null +++ b/spec/datadog/ci/git/tree_uploader_spec.rb @@ -0,0 +1,153 @@ +# frozen_string_literal: true + +require_relative "../../../../lib/datadog/ci/git/tree_uploader" + +RSpec.describe Datadog::CI::Git::TreeUploader do + let(:api) { double("api") } + subject(:tree_uploader) { described_class.new(api: api) } + + before do + allow(Datadog.logger).to receive(:debug) + end + + describe "#call" do + let(:repository_url) { "https://datadoghq.com/git/test.git" } + let(:latest_commits) { %w[c7f893648f656339f62fb7b4d8a6ecdf7d063835 13c988d4f15e06bcdd0b0af290086a3079cdadb0] } + let(:head_commit) { "c7f893648f656339f62fb7b4d8a6ecdf7d063835" } + let(:backend_commits) { %w[c7f893648f656339f62fb7b4d8a6ecdf7d063835] } + + let(:search_commits) { double("search_commits", call: backend_commits) } + + before do + allow(Datadog::CI::Git::SearchCommits).to receive(:new).with(api: api).and_return(search_commits) + end + + context "when the API is not configured" do + let(:api) { nil } + + it "logs a debug message and aborts the git upload" do + expect(Datadog.logger).to receive(:debug).with("API is not configured, aborting git upload") + + tree_uploader.call(repository_url) + end + end + + context "when API is configured" do + before do + expect(Datadog::CI::Git::LocalRepository).to receive(:git_commits).and_return(latest_commits) + end + + context "when the latest commits list is empty" do + let(:latest_commits) { [] } + + it "logs a debug message and aborts the git upload" do + expect(Datadog.logger).to receive(:debug).with("Got empty latest commits list, aborting git upload") + + tree_uploader.call(repository_url) + end + end + + context "when the backend commits search fails" do + before do + expect(search_commits).to receive(:call).and_raise(Datadog::CI::Git::SearchCommits::ApiError, "test error") + end + + it "logs a debug message and aborts the git upload" do + expect(Datadog.logger).to receive(:debug).with("SearchCommits failed with test error, aborting git upload") + + tree_uploader.call(repository_url) + end + end + + context "when all commits are known to the backend" do + let(:backend_commits) { latest_commits } + + it "logs a debug message and aborts the git upload" do + expect(Datadog.logger).to receive(:debug).with("No new commits to upload") + + tree_uploader.call(repository_url) + end + end + + context "when some commits are new" do + let(:upload_packfile) { double("upload_packfile", call: nil) } + + context "when the repository is shallow cloned" do + before do + expect(Datadog::CI::Git::LocalRepository).to receive(:git_shallow_clone?).and_return(true) + end + + context "when the unshallowing fails" do + before do + expect(Datadog::CI::Git::LocalRepository).to receive(:git_unshallow).and_return(nil) + end + + it "uploads what we can upload" do + expect(Datadog::CI::Git::Packfiles).to receive(:generate).with( + included_commits: %w[13c988d4f15e06bcdd0b0af290086a3079cdadb0], + excluded_commits: backend_commits + ).and_yield("packfile_path") + + tree_uploader.call(repository_url) + end + end + + context "when the unshallowing succeeds" do + before do + expect(Datadog::CI::Git::LocalRepository).to receive(:git_unshallow).and_return("unshallow_result") + expect(Datadog::CI::Git::LocalRepository).to receive(:git_commits).and_return( + latest_commits + %w[782d09e3fbfd8cf1b5c13f3eb9621362f9089ed5] + ) + end + + it "uploads the new commits" do + expect(Datadog::CI::Git::Packfiles).to receive(:generate).with( + included_commits: %w[13c988d4f15e06bcdd0b0af290086a3079cdadb0 782d09e3fbfd8cf1b5c13f3eb9621362f9089ed5], + excluded_commits: backend_commits + ).and_yield("packfile_path") + + tree_uploader.call(repository_url) + end + end + end + + context "when the repository is not shallow cloned" do + before do + expect(Datadog::CI::Git::LocalRepository).to receive(:git_shallow_clone?).and_return(false) + + expect(Datadog::CI::Git::Packfiles).to receive(:generate).with( + included_commits: latest_commits - backend_commits.to_a, + excluded_commits: backend_commits + ).and_yield("packfile_path") + + expect(Datadog::CI::Git::UploadPackfile).to receive(:new).with( + api: api, + head_commit_sha: head_commit, + repository_url: repository_url + ).and_return(upload_packfile) + end + + context "when the packfile upload fails" do + before do + expect(upload_packfile).to receive(:call).and_raise(Datadog::CI::Git::UploadPackfile::ApiError, "test error") + end + + it "logs a debug message and aborts the git upload" do + expect(Datadog.logger).to receive(:debug).with("Packfile upload failed with test error") + + tree_uploader.call(repository_url) + end + end + + context "when the packfile upload succeeds" do + it "uploads the new commits" do + expect(upload_packfile).to receive(:call).with(filepath: "packfile_path").and_return(nil) + + tree_uploader.call(repository_url) + end + end + end + end + end + end +end diff --git a/spec/datadog/ci/git/upload_packfile_spec.rb b/spec/datadog/ci/git/upload_packfile_spec.rb new file mode 100644 index 00000000..33584e81 --- /dev/null +++ b/spec/datadog/ci/git/upload_packfile_spec.rb @@ -0,0 +1,99 @@ +# frozen_string_literal: true + +require_relative "../../../../lib/datadog/ci/git/upload_packfile" + +RSpec.describe Datadog::CI::Git::UploadPackfile do + let(:api) { double("api") } + + subject(:upload_packfile) do + described_class.new(api: api, head_commit_sha: "HEAD", repository_url: "https://datadoghq.com/git/test.git") + end + + describe "#call" do + let(:filepath) { "nonexistent" } + + context "when the API is not configured" do + let(:api) { nil } + + it "raises an error" do + expect { upload_packfile.call(filepath: filepath) } + .to raise_error(Datadog::CI::Git::UploadPackfile::ApiError, "test visibility API is not configured") + end + end + + context "when the API is configured" do + before do + allow(api).to receive(:api_request).and_return(http_response) + end + let(:http_response) { double("http_response", ok?: true) } + + context "when file does not exist" do + let(:expected_error_message) do + if PlatformHelpers.jruby? + "Failed to read packfile: No such file or directory - nonexistent" + else + "Failed to read packfile: No such file or directory @ rb_sysopen - nonexistent" + end + end + + it "raises an error" do + expect { upload_packfile.call(filepath: filepath) } + .to raise_error( + Datadog::CI::Git::UploadPackfile::ApiError, + expected_error_message + ) + end + end + + context "when file exists" do + let(:tmpdir) { Dir.mktmpdir } + let(:filepath) { "#{tmpdir}/packfile.idx" } + + before do + File.write(filepath, "packfile contents") + end + + after do + FileUtils.remove_entry(tmpdir) + end + + context "when the API request fails" do + let(:http_response) { double("http_response", ok?: false, inspect: "error message") } + + it "raises an error" do + expect { upload_packfile.call(filepath: filepath) } + .to raise_error(Datadog::CI::Git::UploadPackfile::ApiError, "Failed to upload packfile: error message") + end + end + + context "when the API request is successful" do + before do + allow(SecureRandom).to receive(:uuid).and_return("boundary") + end + + it "uploads the packfile" do + expect(api).to receive(:api_request).with( + path: Datadog::CI::Ext::Transport::DD_API_GIT_UPLOAD_PACKFILE_PATH, + payload: [ + "--boundary", + 'Content-Disposition: form-data; name="pushedSha"', + "Content-Type: application/json", + "", + {data: {id: "HEAD", type: "commit"}, meta: {repository_url: "https://datadoghq.com/git/test.git"}}.to_json, + "--boundary", + 'Content-Disposition: form-data; name="packfile"; filename="packfile.idx"', + "Content-Type: application/octet-stream", + "", + "packfile contents", + "--boundary--" + ].join("\r\n"), + headers: {Datadog::CI::Ext::Transport::HEADER_CONTENT_TYPE => "multipart/form-data; boundary=boundary"} + ).and_return(http_response) + + upload_packfile.call(filepath: filepath) + end + end + end + end + end +end diff --git a/spec/datadog/ci/itr/coverage/event_spec.rb b/spec/datadog/ci/itr/coverage/event_spec.rb new file mode 100644 index 00000000..bb1ccbf0 --- /dev/null +++ b/spec/datadog/ci/itr/coverage/event_spec.rb @@ -0,0 +1,151 @@ +# frozen_string_literal: true + +require "pp" + +require_relative "../../../../../lib/datadog/ci/itr/coverage/event" + +RSpec.describe Datadog::CI::ITR::Coverage::Event do + subject do + described_class.new( + test_id: test_id, + test_suite_id: test_suite_id, + test_session_id: test_session_id, + coverage: coverage + ) + end + let(:test_id) { "1" } + let(:test_suite_id) { "2" } + let(:test_session_id) { "3" } + let(:coverage) { {"file.rb" => true} } + + describe "#valid?" do + it { is_expected.to be_valid } + + context "when test_id is nil" do + let(:test_id) { nil } + before do + expect(Datadog.logger).to receive(:warn).with(/citestcov event is invalid: \[test_id\] is nil. Event: .*/) + end + + it { is_expected.not_to be_valid } + end + + context "when test_suite_id is nil" do + let(:test_suite_id) { nil } + before do + expect(Datadog.logger).to receive(:warn).with(/citestcov event is invalid: \[test_suite_id\] is nil. Event: .*/) + end + + it { is_expected.not_to be_valid } + end + + context "when test_session_id is nil" do + let(:test_session_id) { nil } + before do + expect(Datadog.logger).to receive(:warn).with(/citestcov event is invalid: \[test_session_id\] is nil. Event: .*/) + end + + it { is_expected.not_to be_valid } + end + + context "when coverage is nil" do + let(:coverage) { nil } + before do + expect(Datadog.logger).to receive(:warn).with(/citestcov event is invalid: \[coverage\] is nil. Event: .*/) + end + + it { is_expected.not_to be_valid } + end + end + + describe "#to_msgpack" do + include_context "msgpack serializer" do + subject do + described_class.new( + test_id: test_id, + test_suite_id: test_suite_id, + test_session_id: test_session_id, + coverage: coverage + ) + end + end + + it "returns a msgpack representation of the event" do + expect(msgpack_json).to eq( + { + "test_session_id" => 3, + "test_suite_id" => 2, + "span_id" => 1, + "files" => [ + {"filename" => "file.rb"} + ] + } + ) + end + + context "when file paths are absolute" do + let(:coverage) do + { + File.expand_path(File.join(__dir__, "./project/file.rb")) => true + } + end + + it "converts all file paths to relative to the git root" do + expect(msgpack_json).to eq( + { + "test_session_id" => 3, + "test_suite_id" => 2, + "span_id" => 1, + "files" => [ + {"filename" => "spec/datadog/ci/itr/coverage/project/file.rb"} + ] + } + ) + end + end + + context "coverage in lines format" do + let(:coverage) { {"file.rb" => {1 => true, 2 => true, 3 => true}} } + + it "returns a msgpack representation of the event without lines information" do + expect(msgpack_json).to eq( + { + "test_session_id" => 3, + "test_suite_id" => 2, + "span_id" => 1, + "files" => [ + {"filename" => "file.rb"} + ] + } + ) + end + end + + context "multiple files" do + let(:coverage) { {"file.rb" => true, "file2.rb" => true} } + + it "returns a msgpack representation of the event" do + expect(msgpack_json).to eq( + { + "test_session_id" => 3, + "test_suite_id" => 2, + "span_id" => 1, + "files" => [ + {"filename" => "file.rb"}, + {"filename" => "file2.rb"} + ] + } + ) + end + end + end + + describe "#pretty_inspect" do + it "returns a human readable version of the event" do + expect(subject.pretty_inspect).to eq(" Test ID: 1\n" \ + "Test Suite ID: 2\n" \ + "Test Session ID: 3\n" \ + "Files: [file.rb]\n\n") + end + end +end diff --git a/spec/datadog/ci/itr/coverage/transport_spec.rb b/spec/datadog/ci/itr/coverage/transport_spec.rb new file mode 100644 index 00000000..31a231c4 --- /dev/null +++ b/spec/datadog/ci/itr/coverage/transport_spec.rb @@ -0,0 +1,160 @@ +require_relative "../../../../../lib/datadog/ci/itr/coverage/transport" + +RSpec.describe Datadog::CI::ITR::Coverage::Transport do + subject do + described_class.new( + api: api, + max_payload_size: max_payload_size + ) + end + + before do + allow(Datadog.logger).to receive(:warn) + end + + let(:max_payload_size) { 5 * 1024 * 1024 } + let(:api) { spy(:api) } + + let(:event) do + Datadog::CI::ITR::Coverage::Event.new( + test_id: "1", + test_suite_id: "2", + test_session_id: "3", + coverage: {"file.rb" => true} + ) + end + + describe "#send_events" do + context "with a single event" do + it "sends correct payload" do + subject.send_events([event]) + + expect(api).to have_received(:citestcov_request) do |args| + expect(args[:path]).to eq("/api/v2/citestcov") + + payload = MessagePack.unpack(args[:payload]) + expect(payload["version"]).to eq(2) + + events = payload["coverages"] + expect(events.count).to eq(1) + expect(events.first["span_id"]).to eq(event.test_id.to_i) + expect(events.first["test_suite_id"]).to eq(event.test_suite_id.to_i) + expect(events.first["test_session_id"]).to eq(event.test_session_id.to_i) + expect(events.first["files"]).to eq([{"filename" => "file.rb"}]) + end + end + end + + context "multiple events" do + let(:events) do + [ + event, + Datadog::CI::ITR::Coverage::Event.new( + test_id: "4", + test_suite_id: "5", + test_session_id: "6", + coverage: {"file.rb" => true, "file2.rb" => true} + ) + ] + end + it "sends all events" do + subject.send_events(events) + + expect(api).to have_received(:citestcov_request) do |args| + payload = MessagePack.unpack(args[:payload]) + payload_events = payload["coverages"] + expect(payload_events.count).to eq(events.count) + expect(payload_events.map { |e| e["span_id"] }).to eq(events.map(&:test_id).map(&:to_i)) + expect(payload_events.map { |e| e["files"] }).to eq( + [ + [{"filename" => "file.rb"}], + [{"filename" => "file.rb"}, {"filename" => "file2.rb"}] + ] + ) + end + end + + context "when some events are invalid" do + let(:events) do + [ + event, + Datadog::CI::ITR::Coverage::Event.new( + test_id: "4", + test_suite_id: nil, + test_session_id: "6", + coverage: {"file.rb" => true, "file2.rb" => true} + ) + ] + end + + it "filters out invalid events" do + subject.send_events(events) + + expect(api).to have_received(:citestcov_request) do |args| + payload = MessagePack.unpack(args[:payload]) + + events = payload["coverages"] + expect(events.count).to eq(1) + end + end + + it "logs warning that events were filtered out" do + subject.send_events(events) + + expect(Datadog.logger).to have_received(:warn).with( + "citestcov event is invalid: [test_suite_id] is nil. " \ + "Event: Coverage::Event[test_id=4, test_suite_id=, test_session_id=6, " \ + "coverage={\"file.rb\"=>true, \"file2.rb\"=>true}]" + ) + end + end + + context "when chunking is used" do + # one coverage event is approximately 75 bytes + let(:max_payload_size) { 100 } + + it "filters out invalid events" do + responses = subject.send_events(events) + + expect(api).to have_received(:citestcov_request).twice + expect(responses.count).to eq(2) + end + end + + context "when max_payload-size is too small" do + let(:max_payload_size) { 1 } + + it "does not send events that are larger than max size" do + subject.send_events(events) + + expect(api).not_to have_received(:citestcov_request) + end + end + end + + context "when all events are invalid" do + let(:events) do + [ + Datadog::CI::ITR::Coverage::Event.new( + test_id: "4", + test_suite_id: "5", + test_session_id: nil, + coverage: {"file.rb" => true, "file2.rb" => true} + ), + Datadog::CI::ITR::Coverage::Event.new( + test_id: "8", + test_suite_id: nil, + test_session_id: "6", + coverage: {"file.rb" => true, "file2.rb" => true} + ) + ] + end + + it "does not send anything" do + subject.send_events(events) + + expect(api).not_to have_received(:citestcov_request) + end + end + end +end diff --git a/spec/datadog/ci/itr/coverage/writer_spec.rb b/spec/datadog/ci/itr/coverage/writer_spec.rb new file mode 100644 index 00000000..ec19d9d8 --- /dev/null +++ b/spec/datadog/ci/itr/coverage/writer_spec.rb @@ -0,0 +1,317 @@ +# frozen_string_literal: true + +require_relative "../../../../../lib/datadog/ci/itr/coverage/writer" +require_relative "../../../../../lib/datadog/ci/itr/coverage/transport" + +RSpec.describe Datadog::CI::ITR::Coverage::Writer do + subject(:writer) { described_class.new(transport: transport, options: options) } + + let(:options) { {} } + let(:transport) { instance_double(Datadog::CI::ITR::Coverage::Transport) } + before do + allow(transport).to receive(:send_events).and_return([]) + end + + after { writer.stop(true, 0) } + + let(:buffer_klass) do + if PlatformHelpers.jruby? + Datadog::Core::Buffer::ThreadSafe + else + Datadog::Core::Buffer::CRuby + end + end + + it { expect(writer).to be_a_kind_of(Datadog::Core::Workers::Queue) } + it { expect(writer).to be_a_kind_of(Datadog::Core::Workers::Polling) } + + describe "#initialize" do + context "defaults" do + it do + is_expected.to have_attributes( + enabled?: true, + fork_policy: Datadog::Core::Workers::Async::Thread::FORK_POLICY_RESTART, + buffer: kind_of(buffer_klass) + ) + end + end + + context "given :enabled" do + let(:options) { {enabled: enabled} } + + context "as false" do + let(:enabled) { false } + + it { expect(writer.enabled?).to be false } + end + + context "as true" do + let(:enabled) { true } + + it { expect(writer.enabled?).to be true } + end + + context "as nil" do + let(:enabled) { nil } + + it { expect(writer.enabled?).to be false } + end + end + context "given :interval" do + let(:options) { {interval: interval} } + let(:interval) { double("interval") } + + it { expect(writer.loop_base_interval).to be interval } + end + + context "given :back_off_ratio" do + let(:options) { {back_off_ratio: back_off_ratio} } + let(:back_off_ratio) { double("back_off_ratio") } + + it { expect(writer.loop_back_off_ratio).to be back_off_ratio } + end + + context "given :back_off_max" do + let(:options) { {back_off_max: back_off_max} } + let(:back_off_max) { double("back_off_max") } + + it { expect(writer.loop_back_off_max).to be back_off_max } + end + + context "given :buffer_size" do + let(:options) { {buffer_size: buffer_size} } + let(:buffer_size) { double("buffer_size") } + let(:buffer) { instance_double(buffer_klass) } + + before do + expect(buffer_klass).to receive(:new) + .with(buffer_size) + .and_return(buffer) + end + + it { expect(writer.buffer).to be buffer } + end + end + + describe "#perform" do + subject(:perform) { writer.perform } + + after { writer.stop(true, 0) } + + it "starts a worker thread" do + perform + + expect(writer.send(:worker)).to be_a_kind_of(Thread) + expect(writer).to have_attributes( + run_async?: true, + running?: true, + started?: true, + forked?: false, + fork_policy: :restart, + result: nil + ) + end + end + + describe "#enqueue" do + subject(:enqueue) { writer.enqueue(event) } + + let(:event) { double("event") } + + before do + allow(writer.buffer).to receive(:push) + enqueue + end + + it { expect(writer.buffer).to have_received(:push).with(event) } + end + + describe "#dequeue" do + subject(:dequeue) { writer.dequeue } + + let(:events) { [double("event")] } + + before do + allow(writer.buffer).to receive(:pop) + .and_return(events) + end + + it { is_expected.to eq(events) } + end + + describe "#work_pending?" do + subject(:work_pending?) { writer.work_pending? } + + context "when the buffer is empty" do + it { is_expected.to be false } + end + + context "when the buffer is not empty" do + let(:event) { double("event") } + + before { writer.enqueue(event) } + + it { is_expected.to be true } + end + end + + describe "#write" do + subject(:write) { writer.write(event) } + + let(:event) { double("event") } + + it "starts a worker thread & queues the event" do + expect(writer.buffer).to receive(:push) + .with(event) + + expect { write }.to change { writer.running? } + .from(false) + .to(true) + end + end + + describe "#stop" do + before { skip if PlatformHelpers.jruby? } + + subject(:stop) { writer.stop } + + shared_context "shuts down the worker" do + before do + expect(writer.buffer).to receive(:close).at_least(:once) + + # Do this to prevent cleanup from breaking the test + allow(writer).to receive(:join) + .with(0) + .and_return(true) + + allow(writer).to receive(:join) + .with(described_class::DEFAULT_SHUTDOWN_TIMEOUT) + .and_return(true) + end + end + + context "when the worker has not been started" do + before do + expect(writer.buffer).to_not receive(:close) + allow(writer).to receive(:join) + .with(described_class::DEFAULT_SHUTDOWN_TIMEOUT) + .and_return(true) + end + + it { is_expected.to be false } + end + + context "when the worker has been started" do + include_context "shuts down the worker" + + before do + writer.perform + try_wait_until { writer.running? && writer.run_loop? } + end + + it { is_expected.to be true } + end + + context "called multiple times with graceful stop" do + include_context "shuts down the worker" + + before do + writer.perform + try_wait_until { writer.running? && writer.run_loop? } + end + + it do + expect(writer.stop).to be true + try_wait_until { !writer.running? } + expect(writer.stop).to be false + end + end + + context "given force_stop: true" do + subject(:stop) { writer.stop(true) } + + context "and the worker does not gracefully stop" do + before do + # Make it ignore graceful stops + expect(writer.buffer).to receive(:close) + allow(writer).to receive(:stop_loop).and_return(false) + allow(writer).to receive(:join).and_return(nil) + end + + context "after the worker has been started" do + before { writer.perform } + + it do + is_expected.to be true + + # Give thread time to be terminated + try_wait_until { !writer.running? } + + expect(writer.run_async?).to be false + expect(writer.running?).to be false + end + end + end + end + + context "given shutdown_timeout" do + let(:options) { {shutdown_timeout: 1000} } + include_context "shuts down the worker" + + context "and the worker has been started" do + before do + expect(writer).to receive(:join).with(1000).and_return(true) + + writer.perform + try_wait_until { writer.running? && writer.run_loop? } + end + + it { is_expected.to be true } + end + end + end + describe "integration tests" do + describe "forking" do + before { skip "Fork not supported on current platform" unless Process.respond_to?(:fork) } + let(:flushed_events) { [] } + + context "when the process forks and an event is written" do + let(:events) { [double("event"), double("event2")] } + + before do + allow(writer).to receive(:after_fork) + .and_call_original + allow(writer.transport).to receive(:send_events) + .and_return([]) + end + + after { expect(writer.stop).to be_truthy } + + it "does not drop any events" do + # Start writer in main process + writer.perform + + expect_in_fork do + # Queue up events, wait for worker to process them. + events.each { |event| writer.write(event) } + try_wait_until(seconds: 3) { !writer.work_pending? } + writer.stop + + # Verify state of the writer + expect(writer).to have_received(:after_fork).once + expect(writer.buffer).to be_empty + expect(writer.error?).to be false + + expect(writer.transport).to have_received(:send_events).at_most(events.length).times do |events| + flushed_events.concat(events) + end + + expect(events).to_not be_empty + expect(events).to have(events.length).items + expect(events).to include(*events) + end + end + end + end + end +end diff --git a/spec/datadog/ci/itr/runner_spec.rb b/spec/datadog/ci/itr/runner_spec.rb index 630e8ee9..897f7416 100644 --- a/spec/datadog/ci/itr/runner_spec.rb +++ b/spec/datadog/ci/itr/runner_spec.rb @@ -5,33 +5,44 @@ RSpec.describe Datadog::CI::ITR::Runner do let(:itr_enabled) { true } - subject(:runner) { described_class.new(enabled: itr_enabled) } + let(:api) { double("api") } + let(:writer) { spy("writer") } + let(:git_worker) { spy("git_worker") } - describe "#configure" do - let(:tracer_span) { Datadog::Tracing::SpanOperation.new("session") } - let(:test_session) { Datadog::CI::TestSession.new(tracer_span) } + let(:tracer_span) { Datadog::Tracing::SpanOperation.new("session") } + let(:test_session) { Datadog::CI::TestSession.new(tracer_span) } - before do - runner.configure(remote_configuration, test_session) - end + subject(:runner) { described_class.new(api: api, dd_env: "dd_env", coverage_writer: writer, enabled: itr_enabled) } + let(:configure) { runner.configure(remote_configuration, test_session: test_session, git_tree_upload_worker: git_worker) } + + before do + allow(writer).to receive(:write) + end + describe "#configure" do context "when remote configuration call failed" do let(:remote_configuration) { {"itr_enabled" => false} } it "configures the runner and test session" do + configure + expect(runner.enabled?).to be false expect(runner.skipping_tests?).to be false expect(runner.code_coverage?).to be false end end - context "when remote configuration call returned correct response" do + context "when remote configuration call returned correct response without tests skipping" do let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => true, "tests_skipping" => false} } + before do + configure + end + it "configures the runner" do expect(runner.enabled?).to be true expect(runner.skipping_tests?).to be false - expect(runner.code_coverage?).to be true + expect(runner.code_coverage?).to be(!PlatformHelpers.jruby?) # code coverage is not supported in JRuby end it "sets test session tags" do @@ -43,13 +54,44 @@ end end + context "when remote configuration call returned correct response with tests skipping" do + let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => true, "tests_skipping" => true} } + let(:skippable) do + instance_double( + Datadog::CI::ITR::Skippable, + fetch_skippable_tests: instance_double( + Datadog::CI::ITR::Skippable::Response, + correlation_id: "42", + tests: Set.new(["suite.test."]) + ) + ) + end + + before do + expect(Datadog::CI::ITR::Skippable).to receive(:new).and_return(skippable) + configure + end + + it "configures the runner" do + expect(runner.enabled?).to be true + expect(runner.skipping_tests?).to be true + + expect(runner.correlation_id).to eq("42") + expect(runner.skippable_tests).to eq(Set.new(["suite.test."])) + + expect(git_worker).to have_received(:wait_until_done) + end + end + context "when remote configuration call returned correct response with strings instead of bools" do let(:remote_configuration) { {"itr_enabled" => "true", "code_coverage" => "true", "tests_skipping" => "false"} } it "configures the runner" do + configure + expect(runner.enabled?).to be true expect(runner.skipping_tests?).to be false - expect(runner.code_coverage?).to be true + expect(runner.code_coverage?).to be(!PlatformHelpers.jruby?) # code coverage is not supported in JRuby end end @@ -57,10 +99,299 @@ let(:remote_configuration) { {} } it "configures the runner" do + configure + expect(runner.enabled?).to be false expect(runner.skipping_tests?).to be false expect(runner.code_coverage?).to be false end end end + + describe "#start_coverage" do + let(:test_tracer_span) { Datadog::Tracing::SpanOperation.new("test") } + let(:test_span) { Datadog::CI::Test.new(tracer_span) } + + before do + configure + end + + context "when code coverage is disabled" do + let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => false, "tests_skipping" => false} } + + it "does not start coverage" do + expect(runner).not_to receive(:coverage_collector) + + runner.start_coverage(test_span) + expect(runner.stop_coverage(test_span)).to be_nil + end + end + + context "when ITR is disabled" do + let(:remote_configuration) { {"itr_enabled" => false, "code_coverage" => false, "tests_skipping" => false} } + + it "does not start coverage" do + expect(runner).not_to receive(:coverage_collector) + + runner.start_coverage(test_span) + expect(runner.stop_coverage(test_span)).to be_nil + end + end + + context "when code coverage is enabled" do + let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => true, "tests_skipping" => false} } + + before do + skip("Code coverage is not supported in JRuby") if PlatformHelpers.jruby? + end + + it "starts coverage" do + expect(runner).to receive(:coverage_collector).twice.and_call_original + + runner.start_coverage(test_span) + expect(1 + 1).to eq(2) + coverage_event = runner.stop_coverage(test_span) + expect(coverage_event.coverage.size).to be > 0 + end + end + + context "when JRuby and code coverage is enabled" do + let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => true, "tests_skipping" => false} } + + before do + skip("Skipped for CRuby") unless PlatformHelpers.jruby? + end + + it "disables code coverage" do + expect(runner).not_to receive(:coverage_collector) + expect(runner.code_coverage?).to be(false) + + runner.start_coverage(test_span) + expect(runner.stop_coverage(test_span)).to be_nil + end + end + end + + describe "#stop_coverage" do + let(:test_tracer_span) { Datadog::Tracing::SpanOperation.new("test") } + let(:test_span) { Datadog::CI::Test.new(tracer_span) } + let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => true, "tests_skipping" => false} } + + before do + skip("Code coverage is not supported in JRuby") if PlatformHelpers.jruby? + + configure + + allow(test_span).to receive(:id).and_return(1) + allow(test_span).to receive(:test_suite_id).and_return(2) + allow(test_span).to receive(:test_session_id).and_return(3) + end + + it "creates coverage event and writes it" do + runner.start_coverage(test_span) + expect(1 + 1).to eq(2) + expect(runner.stop_coverage(test_span)).not_to be_nil + + expect(writer).to have_received(:write) do |event| + expect(event.test_id).to eq("1") + expect(event.test_suite_id).to eq("2") + expect(event.test_session_id).to eq("3") + + expect(event.coverage.size).to be > 0 + end + end + + context "when test is skipped" do + it "does not write coverage event" do + runner.start_coverage(test_span) + expect(1 + 1).to eq(2) + test_span.skipped! + + expect(runner.stop_coverage(test_span)).to be_nil + expect(writer).not_to have_received(:write) + end + end + + context "when coverage was not collected" do + it "does not write coverage event" do + expect(1 + 1).to eq(2) + + expect(runner.stop_coverage(test_span)).to be_nil + expect(writer).not_to have_received(:write) + end + end + end + + describe "#mark_if_skippable" do + subject { runner.mark_if_skippable(test_span) } + + context "when skipping tests" do + let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => true, "tests_skipping" => true} } + let(:skippable) do + instance_double( + Datadog::CI::ITR::Skippable, + fetch_skippable_tests: instance_double( + Datadog::CI::ITR::Skippable::Response, + correlation_id: "42", + tests: Set.new(["suite.test.", "suite2.test.", "suite.test3."]) + ) + ) + end + + before do + expect(Datadog::CI::ITR::Skippable).to receive(:new).and_return(skippable) + + configure + end + + context "when test is skippable" do + let(:test_span) do + Datadog::CI::Test.new( + Datadog::Tracing::SpanOperation.new("test", tags: {"test.name" => "test", "test.suite" => "suite"}) + ) + end + + it "marks test as skippable" do + expect { subject } + .to change { test_span.skipped_by_itr? } + .from(false) + .to(true) + end + end + + context "when test is not skippable" do + let(:test_span) do + Datadog::CI::Test.new( + Datadog::Tracing::SpanOperation.new("test", tags: {"test.name" => "test2", "test.suite" => "suite"}) + ) + end + + it "does not mark test as skippable" do + expect { subject } + .not_to change { test_span.skipped_by_itr? } + end + end + end + + context "when not skipping tests" do + let(:remote_configuration) { {"itr_enabled" => true, "code_coverage" => true, "tests_skipping" => false} } + + before do + configure + end + + let(:test_span) do + Datadog::CI::Test.new( + Datadog::Tracing::SpanOperation.new("test", tags: {"test.name" => "test", "test.suite" => "suite"}) + ) + end + + it "does not mark test as skippable" do + expect { subject } + .not_to change { test_span.skipped_by_itr? } + end + end + end + + describe "#count_skipped_test" do + subject { runner.count_skipped_test(test_span) } + + context "test is skipped by framework" do + let(:test_span) do + Datadog::CI::Test.new( + Datadog::Tracing::SpanOperation.new("test", tags: {"test.status" => "skip"}) + ) + end + + it "does not increment skipped tests count" do + expect { subject } + .not_to change { runner.skipped_tests_count } + end + end + + context "test is skipped by ITR" do + let(:test_span) do + Datadog::CI::Test.new( + Datadog::Tracing::SpanOperation.new("test", tags: {"test.status" => "skip", "test.skipped_by_itr" => "true"}) + ) + end + + it "increments skipped tests count" do + expect { subject } + .to change { runner.skipped_tests_count } + .from(0) + .to(1) + end + end + + context "test is not skipped" do + let(:test_span) do + Datadog::CI::Test.new( + Datadog::Tracing::SpanOperation.new("test") + ) + end + + it "does not increment skipped tests count" do + expect { subject } + .not_to change { runner.skipped_tests_count } + end + end + end + + describe "#write_test_session_tags" do + let(:test_session_span) do + Datadog::CI::TestSession.new( + Datadog::Tracing::SpanOperation.new("test_session") + ) + end + + before do + runner.count_skipped_test(test_span) + end + + subject { runner.write_test_session_tags(test_session_span) } + + let(:test_span) do + Datadog::CI::Test.new( + Datadog::Tracing::SpanOperation.new("test", tags: {"test.status" => "pass"}) + ) + end + + context "when ITR is enabled" do + context "when tests were not skipped" do + it "submits 0 skipped tests" do + subject + + expect(test_session_span.get_tag(Datadog::CI::Ext::Test::TAG_ITR_TESTS_SKIPPED)).to eq("false") + expect(test_session_span.get_tag(Datadog::CI::Ext::Test::TAG_ITR_TEST_SKIPPING_COUNT)).to eq(0) + end + end + + context "when tests were skipped" do + let(:test_span) do + Datadog::CI::Test.new( + Datadog::Tracing::SpanOperation.new("test", tags: {"test.status" => "skip", "test.skipped_by_itr" => "true"}) + ) + end + + it "submits number of skipped tests" do + subject + + expect(test_session_span.get_tag(Datadog::CI::Ext::Test::TAG_ITR_TESTS_SKIPPED)).to eq("true") + expect(test_session_span.get_tag(Datadog::CI::Ext::Test::TAG_ITR_TEST_SKIPPING_COUNT)).to eq(1) + end + end + end + + context "when ITR is disabled" do + let(:itr_enabled) { false } + + it "does not add ITR tags to the session" do + subject + + expect(test_session_span.get_tag(Datadog::CI::Ext::Test::TAG_ITR_TESTS_SKIPPED)).to be_nil + expect(test_session_span.get_tag(Datadog::CI::Ext::Test::TAG_ITR_TEST_SKIPPING_COUNT)).to be_nil + end + end + end end diff --git a/spec/datadog/ci/itr/skippable_spec.rb b/spec/datadog/ci/itr/skippable_spec.rb new file mode 100644 index 00000000..e778cb86 --- /dev/null +++ b/spec/datadog/ci/itr/skippable_spec.rb @@ -0,0 +1,180 @@ +# frozen_string_literal: true + +require_relative "../../../../lib/datadog/ci/itr/skippable" + +RSpec.describe Datadog::CI::ITR::Skippable do + let(:api) { spy("api") } + let(:dd_env) { "ci" } + + subject(:client) { described_class.new(api: api, dd_env: dd_env) } + + describe "#fetch_skippable_tests" do + let(:service) { "service" } + let(:tracer_span) do + Datadog::Tracing::SpanOperation.new("session", service: service).tap do |span| + span.set_tags({ + "git.repository_url" => "repository_url", + "git.branch" => "branch", + "git.commit.sha" => "commit_sha", + "os.platform" => "platform", + "os.architecture" => "arch", + "os.version" => "version", + "runtime.name" => "runtime_name", + "runtime.version" => "runtime_version" + }) + end + end + let(:test_session) { Datadog::CI::TestSession.new(tracer_span) } + + let(:path) { Datadog::CI::Ext::Transport::DD_API_SKIPPABLE_TESTS_PATH } + + it "requests the skippable tests" do + client.fetch_skippable_tests(test_session) + + expect(api).to have_received(:api_request) do |args| + expect(args[:path]).to eq(path) + + data = JSON.parse(args[:payload])["data"] + + expect(data["type"]).to eq(Datadog::CI::Ext::Transport::DD_API_SKIPPABLE_TESTS_TYPE) + + attributes = data["attributes"] + expect(attributes["service"]).to eq(service) + expect(attributes["env"]).to eq(dd_env) + expect(attributes["test_level"]).to eq("test") + expect(attributes["repository_url"]).to eq("repository_url") + expect(attributes["sha"]).to eq("commit_sha") + + configurations = attributes["configurations"] + expect(configurations["os.platform"]).to eq("platform") + expect(configurations["os.architecture"]).to eq("arch") + expect(configurations["os.version"]).to eq("version") + expect(configurations["runtime.name"]).to eq("runtime_name") + expect(configurations["runtime.version"]).to eq("runtime_version") + end + end + + context "parsing response" do + subject(:response) { client.fetch_skippable_tests(test_session) } + + context "when api is present" do + before do + allow(api).to receive(:api_request).and_return(http_response) + end + + context "when response is OK" do + let(:http_response) do + double( + "http_response", + ok?: true, + payload: { + "meta" => { + "correlation_id" => "correlation_id_123" + }, + "data" => [ + { + "id" => "123", + "type" => Datadog::CI::Ext::Test::ITR_TEST_SKIPPING_MODE, + "attributes" => { + "suite" => "test_suite_name", + "name" => "test_name", + "parameters" => "string", + "configurations" => { + "os.platform" => "linux", + "os.version" => "bionic", + "os.architecture" => "amd64", + "runtime.vendor" => "string", + "runtime.architecture" => "amd64" + } + } + } + ] + }.to_json + ) + end + + it "parses the response" do + expect(response.ok?).to be true + expect(response.correlation_id).to eq("correlation_id_123") + expect(response.tests).to eq(Set.new(["test_suite_name.test_name.string"])) + end + end + + context "when response is not OK" do + let(:http_response) do + double( + "http_response", + ok?: false, + payload: "" + ) + end + + it "parses the response" do + expect(response.ok?).to be false + expect(response.correlation_id).to be_nil + expect(response.tests).to be_empty + end + end + + context "when response is OK but JSON is malformed" do + let(:http_response) do + double( + "http_response", + ok?: true, + payload: "not json" + ) + end + + before do + expect(Datadog.logger).to receive(:error).with(/Failed to parse skippable tests response payload/) + end + + it "parses the response" do + expect(response.ok?).to be true + expect(response.correlation_id).to be_nil + expect(response.tests).to be_empty + end + end + + context "when response is OK but JSON has different format" do + let(:http_response) do + double( + "http_response", + ok?: true, + payload: { + "attributes" => { + "suite" => "test_suite_name", + "name" => "test_name", + "parameters" => "string", + "configurations" => { + "os.platform" => "linux", + "os.version" => "bionic", + "os.architecture" => "amd64", + "runtime.vendor" => "string", + "runtime.architecture" => "amd64" + } + } + }.to_json + ) + end + + it "parses the response" do + expect(response.ok?).to be true + expect(response.correlation_id).to be_nil + expect(response.tests).to be_empty + end + end + end + + context "when there is no api" do + let(:api) { nil } + + it "returns an empty response" do + expect(response.ok?).to be false + expect(response.correlation_id).to be_nil + expect(response.tests).to be_empty + end + end + end + end +end diff --git a/spec/datadog/ci/release_gem_spec.rb b/spec/datadog/ci/release_gem_spec.rb index 0ad4b85f..5708c587 100644 --- a/spec/datadog/ci/release_gem_spec.rb +++ b/spec/datadog/ci/release_gem_spec.rb @@ -27,6 +27,7 @@ |Steepfile |datadog-ci\.gemspec |docker-compose\.yml + |static-analysis\.datadog\.yml ) $ /x @@ -51,6 +52,7 @@ expect(files) .to match_array( `git ls-files -z` + .force_encoding(Encoding::UTF_8) .split("\x0") .reject { |f| f.match(directories_excluded) } .reject { |f| f.match(single_files_excluded) } diff --git a/spec/datadog/ci/span_spec.rb b/spec/datadog/ci/span_spec.rb index b7709d34..c352f2f3 100644 --- a/spec/datadog/ci/span_spec.rb +++ b/spec/datadog/ci/span_spec.rb @@ -191,6 +191,7 @@ it "sets the environment runtime tags" do expect(tracer_span).to receive(:set_tag).with("os.architecture", ::RbConfig::CONFIG["host_cpu"]) expect(tracer_span).to receive(:set_tag).with("os.platform", ::RbConfig::CONFIG["host_os"]) + expect(tracer_span).to receive(:set_tag).with("os.version", Datadog::Core::Environment::Platform.kernel_release) expect(tracer_span).to receive(:set_tag).with("runtime.name", Datadog::Core::Environment::Ext::LANG_ENGINE) expect(tracer_span).to receive(:set_tag).with("runtime.version", Datadog::Core::Environment::Ext::ENGINE_VERSION) expect(tracer_span).to receive(:set_tag).with("test.command", test_command) @@ -253,6 +254,14 @@ end end + describe "#os_version" do + it "returns the OS version" do + expect(tracer_span).to receive(:get_tag).with("os.version").and_return("version") + + expect(span.os_version).to eq("version") + end + end + describe "#runtime_name" do it "returns the runtime name" do expect(tracer_span).to receive(:get_tag).with("runtime.name").and_return("name") diff --git a/spec/datadog/ci/test_spec.rb b/spec/datadog/ci/test_spec.rb index f474145f..417686f0 100644 --- a/spec/datadog/ci/test_spec.rb +++ b/spec/datadog/ci/test_spec.rb @@ -99,6 +99,26 @@ it { is_expected.to eq("foo/bar.rb") } end + describe "#skipped_by_itr?" do + subject(:skipped_by_itr) { ci_test.skipped_by_itr? } + + context "when tag is set" do + before do + allow(tracer_span).to( + receive(:get_tag).with(Datadog::CI::Ext::Test::TAG_ITR_SKIPPED_BY_ITR).and_return("true") + ) + end + + it { is_expected.to be true } + end + + context "when tag is not set" do + before { allow(tracer_span).to receive(:get_tag).with(Datadog::CI::Ext::Test::TAG_ITR_SKIPPED_BY_ITR).and_return(nil) } + + it { is_expected.to be false } + end + end + describe "#set_parameters" do let(:parameters) { {"foo" => "bar", "baz" => "qux"} } @@ -189,4 +209,16 @@ end end end + + describe "#parameters" do + let(:parameters) { JSON.generate({arguments: {"foo" => "bar", "baz" => "qux"}, metadata: {}}) } + + before do + allow(tracer_span).to receive(:get_tag).with("test.parameters").and_return(parameters) + end + + it "returns the parameters" do + expect(ci_test.parameters).to eq(parameters) + end + end end diff --git a/spec/datadog/ci/test_visibility/null_recorder_spec.rb b/spec/datadog/ci/test_visibility/null_recorder_spec.rb index 4e89a59e..35ede237 100644 --- a/spec/datadog/ci/test_visibility/null_recorder_spec.rb +++ b/spec/datadog/ci/test_visibility/null_recorder_spec.rb @@ -43,7 +43,7 @@ recorder.trace_test("my test", "my suite") do |test_span| spy_under_test.call - test_span.passed! if test_span + test_span&.passed! end end @@ -68,10 +68,10 @@ let(:spy_under_test) { spy("spy") } before do - recorder.trace("step", "my step") do |span| + recorder.trace("my step", type: "step") do |span| spy_under_test.call - span.set_metric("my.metric", 42) if span + span&.set_metric("my.metric", 42) end end @@ -85,7 +85,7 @@ end context "without a block" do - subject { recorder.trace("step", "my step") } + subject { recorder.trace("my step", type: "step") } it { is_expected.to be_nil } end diff --git a/spec/datadog/ci/test_visibility/recorder_spec.rb b/spec/datadog/ci/test_visibility/recorder_spec.rb index 34bdd013..32079ba2 100644 --- a/spec/datadog/ci/test_visibility/recorder_spec.rb +++ b/spec/datadog/ci/test_visibility/recorder_spec.rb @@ -402,6 +402,23 @@ expect(subject).to have_test_tag("my.tag", "my_value") end + context "with git upload enabled and gitdb api spy" do + let(:git_metadata_upload_enabled) { true } + let(:search_commits) { double("search_commits") } + let(:tags) { {"test.framework" => "my-framework"} } + + it "starts git metadata upload" do + expect(Datadog::CI::Git::SearchCommits).to receive(:new).and_return(search_commits) + expect(search_commits).to receive(:call) do |repo_url, commits| + expect(repo_url).to eq("git@github.com:DataDog/datadog-ci-rb.git") + + commits + end + + subject + end + end + it_behaves_like "span with environment tags" it_behaves_like "span with default tags" it_behaves_like "span with runtime tags" @@ -716,41 +733,44 @@ end context "with ITR" do - include_context "CI mode activated" do - let(:itr_enabled) { true } - end + context "without require_git in settings response" do + include_context "CI mode activated" do + let(:itr_enabled) { true } + let(:tests_skipping_enabled) { true } + let(:code_coverage_enabled) { true } + end + + describe "#start_test_session" do + let(:service) { "my-service" } + let(:tags) { {"test.framework" => "my-framework", "my.tag" => "my_value"} } + + subject { recorder.start_test_session(service: service, tags: tags) } - before do - settings_http_response = double( - "http-response", - ok?: true, - payload: { - "data" => { - "attributes" => { - "itr_enabled" => true, - "tests_skipping" => true, - "code_coverage" => true - } - } - }.to_json - ) - allow_any_instance_of(Datadog::CI::Transport::RemoteSettingsApi).to receive(:fetch_library_settings).and_return( - Datadog::CI::Transport::RemoteSettingsApi::Response.new(settings_http_response) - ) + it "returns a new CI test_session span with ITR tags" do + expect(subject).to be_kind_of(Datadog::CI::TestSession) + expect(subject.service).to eq(service) + + expect(subject.skipping_tests?).to be true + expect(subject.code_coverage?).to be true + end + end end - describe "#start_test_session" do - let(:service) { "my-service" } - let(:tags) { {"test.framework" => "my-framework", "my.tag" => "my_value"} } + context "with require_git in settings response" do + include_context "CI mode activated" do + let(:itr_enabled) { true } + let(:tests_skipping_enabled) { true } + let(:code_coverage_enabled) { true } + let(:require_git) { true } + end - subject { recorder.start_test_session(service: service, tags: tags) } + describe "#start_test_session" do + let(:service) { "my-service" } + let(:tags) { {"test.framework" => "my-framework", "my.tag" => "my_value"} } - it "returns a new CI test_session span with ITR tags" do - expect(subject).to be_kind_of(Datadog::CI::TestSession) - expect(subject.service).to eq(service) + subject { recorder.start_test_session(service: service, tags: tags) } - expect(subject.skipping_tests?).to be true - expect(subject.code_coverage?).to be true + it { is_expected.not_to be_skipping_tests } end end end diff --git a/spec/datadog/ci/test_visibility/serializers/span_spec.rb b/spec/datadog/ci/test_visibility/serializers/span_spec.rb index 2e87290f..7041ad39 100644 --- a/spec/datadog/ci/test_visibility/serializers/span_spec.rb +++ b/spec/datadog/ci/test_visibility/serializers/span_spec.rb @@ -6,7 +6,7 @@ let(:integration_name) { :rspec } end - include_context "citestcycle serializer" do + include_context "msgpack serializer" do subject { described_class.new(trace_for_span(first_custom_span), first_custom_span) } end diff --git a/spec/datadog/ci/test_visibility/serializers/test_module_spec.rb b/spec/datadog/ci/test_visibility/serializers/test_module_spec.rb index b611d9e5..d27939d2 100644 --- a/spec/datadog/ci/test_visibility/serializers/test_module_spec.rb +++ b/spec/datadog/ci/test_visibility/serializers/test_module_spec.rb @@ -3,7 +3,7 @@ let(:integration_name) { :rspec } end - include_context "citestcycle serializer" do + include_context "msgpack serializer" do subject { described_class.new(trace_for_span(test_module_span), test_module_span) } end diff --git a/spec/datadog/ci/test_visibility/serializers/test_session_spec.rb b/spec/datadog/ci/test_visibility/serializers/test_session_spec.rb index f25ce073..70cb3196 100644 --- a/spec/datadog/ci/test_visibility/serializers/test_session_spec.rb +++ b/spec/datadog/ci/test_visibility/serializers/test_session_spec.rb @@ -3,7 +3,7 @@ let(:integration_name) { :rspec } end - include_context "citestcycle serializer" do + include_context "msgpack serializer" do subject { described_class.new(trace_for_span(test_session_span), test_session_span) } end diff --git a/spec/datadog/ci/test_visibility/serializers/test_suite_spec.rb b/spec/datadog/ci/test_visibility/serializers/test_suite_spec.rb index 56c61334..a853c009 100644 --- a/spec/datadog/ci/test_visibility/serializers/test_suite_spec.rb +++ b/spec/datadog/ci/test_visibility/serializers/test_suite_spec.rb @@ -3,7 +3,7 @@ let(:integration_name) { :rspec } end - include_context "citestcycle serializer" do + include_context "msgpack serializer" do subject { described_class.new(trace_for_span(first_test_suite_span), first_test_suite_span) } end diff --git a/spec/datadog/ci/test_visibility/serializers/test_v1_spec.rb b/spec/datadog/ci/test_visibility/serializers/test_v1_spec.rb index 88baa26f..d3a5fa24 100644 --- a/spec/datadog/ci/test_visibility/serializers/test_v1_spec.rb +++ b/spec/datadog/ci/test_visibility/serializers/test_v1_spec.rb @@ -6,7 +6,7 @@ let(:integration_name) { :rspec } end - include_context "citestcycle serializer" do + include_context "msgpack serializer" do subject { described_class.new(trace_for_span(span), span) } end diff --git a/spec/datadog/ci/test_visibility/serializers/test_v2_spec.rb b/spec/datadog/ci/test_visibility/serializers/test_v2_spec.rb index 217b3f54..f25e1621 100644 --- a/spec/datadog/ci/test_visibility/serializers/test_v2_spec.rb +++ b/spec/datadog/ci/test_visibility/serializers/test_v2_spec.rb @@ -6,7 +6,7 @@ let(:integration_name) { :rspec } end - include_context "citestcycle serializer" do + include_context "msgpack serializer" do subject { described_class.new(trace_for_span(first_test_span), first_test_span) } end diff --git a/spec/datadog/ci/test_visibility/transport_spec.rb b/spec/datadog/ci/test_visibility/transport_spec.rb index e3fe6b5c..d30bad37 100644 --- a/spec/datadog/ci/test_visibility/transport_spec.rb +++ b/spec/datadog/ci/test_visibility/transport_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require_relative "../../../../lib/datadog/ci/test_visibility/transport" RSpec.describe Datadog::CI::TestVisibility::Transport do @@ -24,14 +26,14 @@ let(:api) { spy(:api) } - describe "#send_traces" do + describe "#send_events" do context "with a single trace and a single span" do before do produce_test_trace end it "sends correct payload" do - subject.send_traces([trace]) + subject.send_events([trace]) expect(api).to have_received(:citestcycle_request) do |args| expect(args[:path]).to eq("/api/v2/citestcycle") @@ -48,6 +50,14 @@ expect(events.first["content"]["resource"]).to include("calculator_tests") end end + + it "returns responses" do + responses = subject.send_events([trace]) + + expect(responses.count).to eq(1) + # spy returns itself + expect(responses.first).to eq(api) + end end context "with dd_env defined" do @@ -57,7 +67,7 @@ end it "sends correct payload including env" do - subject.send_traces([trace]) + subject.send_events([trace]) expect(api).to have_received(:citestcycle_request) do |args| payload = MessagePack.unpack(args[:payload]) @@ -77,7 +87,7 @@ end it "sends event for each of spans" do - subject.send_traces(traces) + subject.send_events(traces) expect(api).to have_received(:citestcycle_request) do |args| payload = MessagePack.unpack(args[:payload]) @@ -95,7 +105,7 @@ end it "filters out invalid events" do - subject.send_traces(traces) + subject.send_events(traces) expect(api).to have_received(:citestcycle_request) do |args| payload = MessagePack.unpack(args[:payload]) @@ -109,7 +119,7 @@ end it "logs warning that events were filtered out" do - subject.send_traces(traces) + subject.send_events(traces) expect(Datadog.logger).to have_received(:warn).with( "Invalid event skipped: " \ @@ -125,7 +135,7 @@ let(:max_payload_size) { 2000 } it "filters out invalid events" do - responses = subject.send_traces(traces) + responses = subject.send_events(traces) expect(api).to have_received(:citestcycle_request).twice expect(responses.count).to eq(2) @@ -138,7 +148,7 @@ let(:max_payload_size) { 1 } it "does not send events that are larger than max size" do - subject.send_traces(traces) + subject.send_events(traces) expect(api).not_to have_received(:citestcycle_request) end @@ -153,7 +163,7 @@ end it "does not send anything" do - subject.send_traces(traces) + subject.send_events(traces) expect(api).not_to have_received(:citestcycle_request) end diff --git a/spec/datadog/ci/transport/api/agentless_spec.rb b/spec/datadog/ci/transport/api/agentless_spec.rb index 77ca6884..f49e3392 100644 --- a/spec/datadog/ci/transport/api/agentless_spec.rb +++ b/spec/datadog/ci/transport/api/agentless_spec.rb @@ -5,6 +5,7 @@ described_class.new( api_key: api_key, citestcycle_url: citestcycle_url, + citestcov_url: citestcov_url, api_url: api_url ) end @@ -14,6 +15,7 @@ context "malformed urls" do let(:citestcycle_url) { "" } let(:api_url) { "api.datadoghq.com" } + let(:citestcov_url) { "citestcov.datadoghq.com" } it { expect { subject }.to raise_error(/Invalid agentless mode URL:/) } end @@ -25,6 +27,9 @@ let(:api_url) { "http://localhost:5555" } let(:api_http) { double(:http) } + let(:citestcov_url) { "http://localhost:5555" } + let(:citestcov_http) { double(:http) } + before do expect(Datadog::CI::Transport::HTTP).to receive(:new).with( host: "localhost", @@ -39,6 +44,13 @@ ssl: false, compress: false ).and_return(api_http) + + expect(Datadog::CI::Transport::HTTP).to receive(:new).with( + host: "localhost", + port: 5555, + ssl: false, + compress: true + ).and_return(citestcov_http) end describe "#citestcycle_request" do @@ -69,6 +81,9 @@ let(:api_url) { "https://api.datadoghq.com:443" } let(:api_http) { double(:http) } + let(:citestcov_url) { "https://citestcov-intake.datadoghq.com:443" } + let(:citestcov_http) { double(:http) } + before do expect(Datadog::CI::Transport::HTTP).to receive(:new).with( host: "citestcycle-intake.datadoghq.com", @@ -83,6 +98,13 @@ ssl: true, compress: false ).and_return(api_http) + + expect(Datadog::CI::Transport::HTTP).to receive(:new).with( + host: "citestcov-intake.datadoghq.com", + port: 443, + ssl: true, + compress: true + ).and_return(citestcov_http) end describe "#citestcycle_request" do @@ -138,5 +160,47 @@ subject.api_request(path: "path", payload: "payload") end end + + describe "#citestcov_request" do + before do + expect(SecureRandom).to receive(:uuid).and_return("42") + end + + let(:expected_headers) do + { + "DD-API-KEY" => "api_key", + "Content-Type" => "multipart/form-data; boundary=42" + } + end + + let(:expected_payload) do + [ + "--42", + 'Content-Disposition: form-data; name="event"; filename="event.json"', + "Content-Type: application/json", + "", + '{"dummy":true}', + "--42", + 'Content-Disposition: form-data; name="coverage1"; filename="coverage1.msgpack"', + "Content-Type: application/msgpack", + "", + "payload", + "--42--" + ].join("\r\n") + end + + it "produces correct headers, constructs multipart payload, and forwards request to HTTP layer" do + allow(citestcov_http).to receive(:request) + + subject.citestcov_request(path: "path", payload: "payload") + + expect(citestcov_http).to have_received(:request) do |args| + expect(args[:path]).to eq("path") + expect(args[:verb]).to eq("post") + expect(args[:headers]).to eq(expected_headers) + expect(args[:payload]).to eq(expected_payload) + end + end + end end end diff --git a/spec/datadog/ci/transport/api/builder_spec.rb b/spec/datadog/ci/transport/api/builder_spec.rb index e966107b..b1570c97 100644 --- a/spec/datadog/ci/transport/api/builder_spec.rb +++ b/spec/datadog/ci/transport/api/builder_spec.rb @@ -37,7 +37,10 @@ it "creates and configures http client and Agentless api" do expect(Datadog::CI::Transport::Api::Agentless).to receive(:new).with( - api_key: "api_key", citestcycle_url: "https://citestcycle-intake.datadoghq.com:443", api_url: "https://api.datadoghq.com:443" + api_key: "api_key", + citestcycle_url: "https://citestcycle-intake.datadoghq.com:443", + api_url: "https://api.datadoghq.com:443", + citestcov_url: "https://citestcov-intake.datadoghq.com:443" ).and_return(api) expect(subject).to eq(api) @@ -48,7 +51,10 @@ it "configures transport to use intake URL from settings" do expect(Datadog::CI::Transport::Api::Agentless).to receive(:new).with( - api_key: "api_key", citestcycle_url: "http://localhost:5555", api_url: "http://localhost:5555" + api_key: "api_key", + citestcycle_url: "http://localhost:5555", + api_url: "http://localhost:5555", + citestcov_url: "http://localhost:5555" ).and_return(api) expect(subject).to eq(api) @@ -60,7 +66,10 @@ it "construct intake url using provided host" do expect(Datadog::CI::Transport::Api::Agentless).to receive(:new).with( - api_key: "api_key", citestcycle_url: "https://citestcycle-intake.datadoghq.eu:443", api_url: "https://api.datadoghq.eu:443" + api_key: "api_key", + citestcycle_url: "https://citestcycle-intake.datadoghq.eu:443", + api_url: "https://api.datadoghq.eu:443", + citestcov_url: "https://citestcov-intake.datadoghq.eu:443" ).and_return(api) expect(subject).to eq(api) @@ -80,8 +89,7 @@ hostname: "localhost", port: 5555, uds_path: nil, - timeout_seconds: 42, - deprecated_for_removal_transport_configuration_proc: nil + timeout_seconds: 42 ) end diff --git a/spec/datadog/ci/transport/api/evp_proxy_spec.rb b/spec/datadog/ci/transport/api/evp_proxy_spec.rb index 50a1c521..3fc432cf 100644 --- a/spec/datadog/ci/transport/api/evp_proxy_spec.rb +++ b/spec/datadog/ci/transport/api/evp_proxy_spec.rb @@ -12,8 +12,7 @@ hostname: "localhost", port: 5555, uds_path: nil, - timeout_seconds: 42, - deprecated_for_removal_transport_configuration_proc: nil + timeout_seconds: 42 ) end let(:intake_http) { double(:http) } @@ -38,6 +37,13 @@ } end + let(:citestcov_headers) do + { + "Content-Type" => "multipart/form-data; boundary=42", + "X-Datadog-EVP-Subdomain" => "citestcov-intake" + } + end + context "with evp proxy v2" do let(:path_prefix) { Datadog::CI::Ext::Transport::EVP_PROXY_V2_PATH_PREFIX } @@ -149,6 +155,39 @@ end end end + + describe "#citestcov_request" do + before do + expect(SecureRandom).to receive(:uuid).and_return("42") + end + + let(:expected_payload) do + [ + "--42", + 'Content-Disposition: form-data; name="event"; filename="event.json"', + "Content-Type: application/json", + "", + '{"dummy":true}', + "--42", + 'Content-Disposition: form-data; name="coverage1"; filename="coverage1.msgpack"', + "Content-Type: application/msgpack", + "", + "payload", + "--42--" + ].join("\r\n") + end + + it "produces correct headers, constructs multipart payload, and forwards request to HTTP layer" do + expect(intake_http).to receive(:request).with( + path: "/evp_proxy/v2/path", + payload: expected_payload, + verb: "post", + headers: citestcov_headers + ) + + subject.citestcov_request(path: "/path", payload: "payload") + end + end end context "with evp proxy v4" do diff --git a/spec/datadog/ci/transport/http_spec.rb b/spec/datadog/ci/transport/http_spec.rb index 69b6d01b..e9eca4d6 100644 --- a/spec/datadog/ci/transport/http_spec.rb +++ b/spec/datadog/ci/transport/http_spec.rb @@ -13,13 +13,14 @@ let(:adapter) { instance_double(::Datadog::Core::Transport::HTTP::Adapters::Net) } before do + settings = Datadog::CI::Transport::HTTP::AdapterSettings.new( + hostname: transport.host, + port: transport.port, + timeout_seconds: transport.timeout, + ssl: transport.ssl + ) allow(::Datadog::Core::Transport::HTTP::Adapters::Net).to receive(:new) - .with( - transport.host, - transport.port, - timeout: transport.timeout, - ssl: transport.ssl - ).and_return(adapter) + .with(settings).and_return(adapter) end end @@ -144,5 +145,32 @@ expect(response.code).to eq(200) end end + + context "when request fails" do + let(:request_options) { {backoff: 0} } + + context "when succeeds after retries" do + before do + expect(adapter).to receive(:call).and_raise(Errno::ECONNRESET).exactly(described_class::MAX_RETRIES).times + expect(adapter).to receive(:call).and_return(http_response) + end + + it "produces a response" do + is_expected.to be_a_kind_of(described_class::ResponseDecorator) + + expect(response.code).to eq(200) + end + end + + context "when retries are exhausted" do + before do + expect(adapter).to receive(:call).and_raise(Errno::ECONNRESET).exactly(described_class::MAX_RETRIES + 1).times + end + + it "raises" do + expect { response }.to raise_error(Errno::ECONNRESET) + end + end + end end end diff --git a/spec/datadog/ci/transport/remote_settings_api_spec.rb b/spec/datadog/ci/transport/remote_settings_api_spec.rb index faf31eaf..f9c52091 100644 --- a/spec/datadog/ci/transport/remote_settings_api_spec.rb +++ b/spec/datadog/ci/transport/remote_settings_api_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require_relative "../../../../lib/datadog/ci/transport/remote_settings_api" RSpec.describe Datadog::CI::Transport::RemoteSettingsApi do @@ -16,6 +18,7 @@ "git.commit.sha" => "commit_sha", "os.platform" => "platform", "os.architecture" => "arch", + "os.version" => "version", "runtime.name" => "runtime_name", "runtime.version" => "runtime_version" }) @@ -46,7 +49,8 @@ configurations = attributes["configurations"] expect(configurations["os.platform"]).to eq("platform") - expect(configurations["os.arch"]).to eq("arch") + expect(configurations["os.architecture"]).to eq("arch") + expect(configurations["os.version"]).to eq("version") expect(configurations["runtime.name"]).to eq("runtime_name") expect(configurations["runtime.version"]).to eq("runtime_version") end @@ -73,12 +77,13 @@ "code_coverage" => true, "tests_skipping" => false, "itr_enabled" => true, - "require_git" => false + "require_git" => require_git } } }.to_json ) end + let(:require_git) { false } it "parses the response" do expect(response.ok?).to be true @@ -86,8 +91,17 @@ "code_coverage" => true, "tests_skipping" => false, "itr_enabled" => true, - "require_git" => false + "require_git" => require_git }) + expect(response.require_git?).to be false + end + + context "when git is required" do + let(:require_git) { "True" } + + it "parses the response" do + expect(response.require_git?).to be true + end end end @@ -103,6 +117,7 @@ it "parses the response" do expect(response.ok?).to be false expect(response.payload).to eq("itr_enabled" => false) + expect(response.require_git?).to be false end end @@ -122,6 +137,7 @@ it "parses the response" do expect(response.ok?).to be true expect(response.payload).to eq("itr_enabled" => false) + expect(response.require_git?).to be false end end @@ -144,6 +160,7 @@ it "parses the response" do expect(response.ok?).to be true expect(response.payload).to eq("itr_enabled" => false) + expect(response.require_git?).to be false end end end @@ -154,6 +171,7 @@ it "returns an empty response" do expect(response.ok?).to be false expect(response.payload).to eq("itr_enabled" => false) + expect(response.require_git?).to be false end end end diff --git a/spec/datadog/ci/utils/configuration_spec.rb b/spec/datadog/ci/utils/configuration_spec.rb index 3a3dd358..0901885a 100644 --- a/spec/datadog/ci/utils/configuration_spec.rb +++ b/spec/datadog/ci/utils/configuration_spec.rb @@ -1,3 +1,7 @@ +# frozen_string_literal: true + +require_relative "../../../../lib/datadog/ci/utils/configuration" + RSpec.describe ::Datadog::CI::Utils::Configuration do describe ".fetch_service_name" do subject { described_class.fetch_service_name(default) } @@ -18,7 +22,7 @@ let(:service) { nil } before do - expect(::Datadog::CI::Utils::Git).to receive(:repository_name).and_return(repository_name) + expect(::Datadog::CI::Git::LocalRepository).to receive(:repository_name).and_return(repository_name) end context "when repository_name can be fetched" do diff --git a/spec/datadog/ci/utils/git_spec.rb b/spec/datadog/ci/utils/git_spec.rb index dfa185d7..95e5df73 100644 --- a/spec/datadog/ci/utils/git_spec.rb +++ b/spec/datadog/ci/utils/git_spec.rb @@ -1,4 +1,44 @@ RSpec.describe ::Datadog::CI::Utils::Git do + describe ".valid_commit_sha?" do + subject { described_class.valid_commit_sha?(sha) } + + context "when input is nil" do + let(:sha) { nil } + + it { is_expected.to be_falsey } + end + + context "when input is a valid sha" do + let(:sha) { "c7f893648f656339f62fb7b4d8a6ecdf7d063835" } + + it { is_expected.to be_truthy } + end + + context "when input is a valid sha256" do + let(:sha) { "1b9affbba072ba2e923797d3b2050b9b9c8baacf696f84ac9940282b5568c547" } + + it { is_expected.to be_truthy } + end + + context "when input is a several valid shas separated by newline" do + let(:sha) { "c7f893648f656339f62fb7b4d8a6ecdf7d063835\nc7f893648f656339f62fb7b4d8a6ecdf7d063835" } + + it { is_expected.to be_falsey } + end + + context "when input is a an invalid sha" do + let(:sha) { "c7f893648g656339f62fb7b4d8a6ecdf7d063835" } + + it { is_expected.to be_falsey } + end + + context "when input is too short to be valid" do + let(:sha) { "c7f893648f656339f62fb7b4d8a6ecdf7d06383" } + + it { is_expected.to be_falsey } + end + end + describe ".normalize_ref" do subject { described_class.normalize_ref(ref) } @@ -46,103 +86,4 @@ it { is_expected.to be_truthy } end end - - describe ".root" do - subject { described_class.root } - - it { is_expected.to eq(Dir.pwd) } - - context "caches the result" do - before do - expect(Open3).to receive(:capture2e).never - end - - it "returns the same result" do - 2.times do - expect(described_class.root).to eq(Dir.pwd) - end - end - end - end - - describe ".relative_to_root" do - subject { described_class.relative_to_root(path) } - - context "when path is nil" do - let(:path) { nil } - - it { is_expected.to be_nil } - end - - context "when git root is nil" do - before do - allow(described_class).to receive(:root).and_return(nil) - end - - let(:path) { "foo/bar" } - - it { is_expected.to eq("foo/bar") } - end - - context "when git root is not nil" do - context "when path is absolute" do - before do - allow(described_class).to receive(:root).and_return("/foo/bar") - end - let(:path) { "/foo/bar/baz" } - - it { is_expected.to eq("baz") } - end - - context "when path is relative" do - before do - allow(described_class).to receive(:root).and_return("#{Dir.pwd}/foo/bar") - end - - let(:path) { "./baz" } - - it { is_expected.to eq("../../baz") } - end - end - end - - describe ".current_folder_name" do - subject { described_class.current_folder_name } - let(:path) { "/foo/bar" } - - context "when git root is nil" do - before do - allow(described_class).to receive(:root).and_return(nil) - allow(Dir).to receive(:pwd).and_return(path) - end - - it { is_expected.to eq("bar") } - end - - context "when git root is not nil" do - before do - allow(described_class).to receive(:root).and_return(path) - end - - it { is_expected.to eq("bar") } - end - end - - describe ".repository_name" do - subject { described_class.repository_name } - - it { is_expected.to eq("datadog-ci-rb") } - - context "caches the result" do - before do - expect(Open3).to receive(:capture2e).never - end - - it "returns the same result" do - 2.times do - expect(described_class.root).to eq(Dir.pwd) - end - end - end - end end diff --git a/spec/datadog/ci/utils/test_run_spec.rb b/spec/datadog/ci/utils/test_run_spec.rb index 7f84b65e..b2e7b93d 100644 --- a/spec/datadog/ci/utils/test_run_spec.rb +++ b/spec/datadog/ci/utils/test_run_spec.rb @@ -6,4 +6,32 @@ it { is_expected.to eq("#{$0} #{ARGV.join(" ")}") } end + + describe ".skippable_test_id" do + subject { described_class.skippable_test_id(test_name, suite, parameters) } + + let(:test_name) { "test_name" } + let(:suite) { "suite" } + let(:parameters) { "parameters" } + + it { is_expected.to eq("suite.test_name.parameters") } + end + + describe ".test_parameters" do + subject { described_class.test_parameters(arguments: arguments, metadata: metadata) } + + let(:arguments) { {} } + let(:metadata) { {} } + + it "returns a JSON string" do + is_expected.to eq( + JSON.generate( + { + arguments: arguments, + metadata: metadata + } + ) + ) + end + end end diff --git a/spec/datadog/ci/worker_spec.rb b/spec/datadog/ci/worker_spec.rb new file mode 100644 index 00000000..ce118761 --- /dev/null +++ b/spec/datadog/ci/worker_spec.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +require_relative "../../../lib/datadog/ci/worker" + +RSpec.describe Datadog::CI::Worker do + let(:task) { spy("task") } + let(:work) { task.call } + + subject(:worker) { described_class.new { work } } + + describe "#perform" do + it "executes the task" do + worker.perform + worker.stop + + expect(task).to have_received(:call) + end + end + + describe "#done?" do + context "when the worker has not started" do + it { is_expected.not_to be_done } + end + + context "when the worker has started" do + context "when the worker is running" do + let(:queue) { Queue.new } + subject(:worker) { described_class.new { queue.pop } } + + it do + worker.perform + is_expected.not_to be_done + + queue << :done + worker.stop + + is_expected.to be_done + end + end + + context "when the worker has stopped" do + it do + worker.perform + worker.stop + + is_expected.to be_done + end + end + end + end + + describe "#wait_until_done" do + it "waits until the worker is done" do + worker.perform + worker.wait_until_done + + expect(worker).to be_done + end + end +end diff --git a/spec/ddcov/calculator/calculator.rb b/spec/ddcov/calculator/calculator.rb new file mode 100644 index 00000000..5ef2ede8 --- /dev/null +++ b/spec/ddcov/calculator/calculator.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require_relative "operations/add" +require_relative "operations/divide" +require_relative "operations/multiply" +require_relative "operations/subtract" + +class Calculator + def initialize + @adder = Add.new + @subtractor = Subtract.new + @multiplier = Multiply.new + @divider = Divide.new + end + + def add(a, b) + @adder.call(a, b) + end + + def subtract(a, b) + @subtractor.call(a, b) + end + + def multiply(a, b) + @multiplier.call(a, b) + end + + def divide(a, b) + @divider.call(a, b) + end +end diff --git "a/spec/ddcov/calculator/code_with_\342\235\244\357\270\217.rb" "b/spec/ddcov/calculator/code_with_\342\235\244\357\270\217.rb" new file mode 100644 index 00000000..708b0e5b --- /dev/null +++ "b/spec/ddcov/calculator/code_with_\342\235\244\357\270\217.rb" @@ -0,0 +1,5 @@ +class I❤️Ruby + def call + "I ❤️ Ruby" + end +end diff --git a/spec/ddcov/calculator/operations/add.rb b/spec/ddcov/calculator/operations/add.rb new file mode 100644 index 00000000..ad4ca3a1 --- /dev/null +++ b/spec/ddcov/calculator/operations/add.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class Add + def call(a, b) + a + b + end +end diff --git a/spec/ddcov/calculator/operations/divide.rb b/spec/ddcov/calculator/operations/divide.rb new file mode 100644 index 00000000..178b9a83 --- /dev/null +++ b/spec/ddcov/calculator/operations/divide.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +require_relative "helpers/calculator_logger" + +class Divide + prepend CalculatorLogger + + def call(a, b) + a / b + end +end diff --git a/spec/ddcov/calculator/operations/helpers/calculator_logger.rb b/spec/ddcov/calculator/operations/helpers/calculator_logger.rb new file mode 100644 index 00000000..e46399b8 --- /dev/null +++ b/spec/ddcov/calculator/operations/helpers/calculator_logger.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +module CalculatorLogger + def call(a, b) + res = super + + @log ||= [] + @log << "operation performed" + + res + end +end diff --git a/spec/ddcov/calculator/operations/multiply.rb b/spec/ddcov/calculator/operations/multiply.rb new file mode 100644 index 00000000..0290d969 --- /dev/null +++ b/spec/ddcov/calculator/operations/multiply.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class Multiply + def call(a, b) + a * b + end +end diff --git a/spec/ddcov/calculator/operations/subtract.rb b/spec/ddcov/calculator/operations/subtract.rb new file mode 100644 index 00000000..da667953 --- /dev/null +++ b/spec/ddcov/calculator/operations/subtract.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class Subtract + def call(a, b) + a - b + end +end diff --git a/spec/ddcov/ddcov_spec.rb b/spec/ddcov/ddcov_spec.rb new file mode 100644 index 00000000..8e4f50ca --- /dev/null +++ b/spec/ddcov/ddcov_spec.rb @@ -0,0 +1,221 @@ +# frozen_string_literal: true + +require "datadog_cov.#{RUBY_VERSION}_#{RUBY_PLATFORM}" + +require_relative "calculator/calculator" +require_relative "calculator/code_with_❤️" + +RSpec.describe Datadog::CI::ITR::Coverage::DDCov do + def absolute_path(path) + File.expand_path(File.join(__dir__, path)) + end + + subject { described_class.new(root: root, mode: mode) } + + describe "code coverage collection" do + let!(:calculator) { Calculator.new } + + context "in files mode" do + let(:mode) { :files } + + context "when allocating and starting coverage without a root" do + it "does not fail" do + cov = described_class.allocate + cov.start + expect(calculator.add(1, 2)).to eq(3) + + coverage = cov.stop + expect(coverage).to eq({}) + end + end + + context "when root is the calculator project dir" do + let(:root) { absolute_path("calculator") } + + it "collects code coverage including Calculator and operations" do + subject.start + + expect(calculator.add(1, 2)).to eq(3) + expect(calculator.subtract(1, 2)).to eq(-1) + + coverage = subject.stop + + expect(coverage.size).to eq(3) + expect(coverage.keys).to include( + absolute_path("calculator/calculator.rb"), + absolute_path("calculator/operations/add.rb"), + absolute_path("calculator/operations/subtract.rb") + ) + end + + it "does not support files with non-ASCII characters yet due to additional overhead of UTF-8 strings parsing" do + subject.start + expect(I❤️Ruby.new.call).to eq("I ❤️ Ruby") + coverage = subject.stop + expect(coverage.size).to eq(1) + # this string will have a bunch of UTF-8 codepoints in it + expect(coverage.keys.first).to include("calculator/code_with_") + end + end + + context "when root is in deeply nested dir" do + let(:root) { absolute_path("calculator/operations/suboperations") } + + it "does not fail but also does not collect coverages" do + subject.start + + expect(calculator.add(1, 2)).to eq(3) + expect(calculator.subtract(1, 2)).to eq(-1) + + coverage = subject.stop + + expect(coverage.size).to eq(0) + end + end + + context "when root is in the subdirectory of the project" do + let(:root) { absolute_path("calculator/operations") } + + it "collects code coverage including operations only" do + subject.start + + expect(calculator.add(1, 2)).to eq(3) + expect(calculator.subtract(1, 2)).to eq(-1) + + coverage = subject.stop + + expect(coverage.size).to eq(2) + expect(coverage.keys).to include( + absolute_path("calculator/operations/add.rb"), + absolute_path("calculator/operations/subtract.rb") + ) + end + + it "clears the coverage data after stopping" do + subject.start + expect(calculator.add(1, 2)).to eq(3) + coverage = subject.stop + expect(coverage.size).to eq(1) + expect(coverage.keys).to include(absolute_path("calculator/operations/add.rb")) + + subject.start + expect(calculator.subtract(1, 2)).to eq(-1) + coverage = subject.stop + expect(coverage.size).to eq(1) + expect(coverage.keys).to include(absolute_path("calculator/operations/subtract.rb")) + end + + it "does not track coverage when stopped" do + subject.start + expect(calculator.add(1, 2)).to eq(3) + subject.stop + + expect(calculator.subtract(1, 2)).to eq(-1) + + subject.start + expect(calculator.multiply(1, 2)).to eq(2) + coverage = subject.stop + expect(coverage.size).to eq(1) + expect(coverage.keys).to include(absolute_path("calculator/operations/multiply.rb")) + end + + it "does not fail if start called several times" do + subject.start + expect(calculator.add(1, 2)).to eq(3) + + subject.start + coverage = subject.stop + expect(coverage.size).to eq(1) + end + + it "does not fail if stop called several times" do + subject.start + expect(calculator.add(1, 2)).to eq(3) + coverage = subject.stop + expect(coverage.size).to eq(1) + + expect(subject.stop).to eq({}) + end + + it "tracks coverage in mixins" do + subject.start + expect(calculator.divide(6, 3)).to eq(2) + coverage = subject.stop + expect(coverage.size).to eq(2) + expect(coverage.keys).to include(absolute_path("calculator/operations/divide.rb")) + expect(coverage.keys).to include(absolute_path("calculator/operations/helpers/calculator_logger.rb")) + end + + context "multi threaded execution" do + def thread_local_cov + Thread.current[:datadog_ci_cov] ||= described_class.new(root: root) + end + + it "collects coverage for each thread separately" do + t1_queue = Queue.new + t2_queue = Queue.new + + t1 = Thread.new do + cov = thread_local_cov + cov.start + + t1_queue << :ready + expect(t2_queue.pop).to be(:ready) + + expect(calculator.add(1, 2)).to eq(3) + expect(calculator.multiply(1, 2)).to eq(2) + + t1_queue << :done + expect(t2_queue.pop).to be :done + + coverage = cov.stop + expect(coverage.size).to eq(2) + expect(coverage.keys).to include(absolute_path("calculator/operations/add.rb")) + expect(coverage.keys).to include(absolute_path("calculator/operations/multiply.rb")) + end + + t2 = Thread.new do + cov = thread_local_cov + cov.start + + t2_queue << :ready + expect(t1_queue.pop).to be(:ready) + + expect(calculator.subtract(1, 2)).to eq(-1) + + t2_queue << :done + expect(t1_queue.pop).to be :done + + coverage = cov.stop + expect(coverage.size).to eq(1) + expect(coverage.keys).to include(absolute_path("calculator/operations/subtract.rb")) + end + + [t1, t2].each(&:join) + end + end + end + end + + context "in lines mode" do + let(:mode) { :lines } + let(:root) { absolute_path("calculator") } + + it "collects code coverage with lines" do + subject.start + + expect(calculator.add(1, 2)).to eq(3) + expect(calculator.subtract(1, 2)).to eq(-1) + + coverage = subject.stop + + expect(coverage.size).to eq(3) + expect(coverage).to eq({ + absolute_path("calculator/calculator.rb") => {17 => true, 21 => true}, + absolute_path("calculator/operations/add.rb") => {5 => true}, + absolute_path("calculator/operations/subtract.rb") => {5 => true} + }) + end + end + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index e5f22d74..9b33f3a7 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -12,13 +12,15 @@ require_relative "support/gems_helpers" require_relative "support/tracer_helpers" require_relative "support/span_helpers" +require_relative "support/platform_helpers" +require_relative "support/synchronization_helpers" # shared contexts require_relative "support/contexts/ci_mode" require_relative "support/contexts/concurrency_test" require_relative "support/contexts/git_fixture" require_relative "support/contexts/extract_environment_tags" -require_relative "support/contexts/citestcycle_serializer" +require_relative "support/contexts/msgpack_serializer" require "rspec/collection_matchers" require "climate_control" @@ -61,6 +63,7 @@ def self.load_plugins RSpec.configure do |config| config.include TracerHelpers config.include SpanHelpers + config.include SynchronizationHelpers # Enable flags like --only-failures and --next-failure config.example_status_persistence_file_path = ".rspec_status" diff --git a/spec/support/contexts/ci_mode.rb b/spec/support/contexts/ci_mode.rb index 17da1f1b..54b02054 100644 --- a/spec/support/contexts/ci_mode.rb +++ b/spec/support/contexts/ci_mode.rb @@ -6,7 +6,11 @@ # let(:integration_options) { {service_name: "jalapenos"} } # end +require_relative "../coverage_helpers" + RSpec.shared_context "CI mode activated" do + include CoverageHelpers + let(:test_command) { "command" } let(:integration_name) { :no_instrument } let(:integration_options) { {} } @@ -14,20 +18,63 @@ let(:ci_enabled) { true } let(:force_test_level_visibility) { false } let(:itr_enabled) { false } + let(:code_coverage_enabled) { false } + let(:tests_skipping_enabled) { false } + let(:git_metadata_upload_enabled) { false } + let(:require_git) { false } + + let(:itr_correlation_id) { "itr_correlation_id" } + let(:itr_skippable_tests) { [] } + + let(:skippable_tests_response) do + instance_double( + Datadog::CI::ITR::Skippable::Response, + ok?: true, + correlation_id: itr_correlation_id, + tests: itr_skippable_tests + ) + end let(:recorder) { Datadog.send(:components).ci_recorder } before do + setup_test_coverage_writer! + allow_any_instance_of(Datadog::Core::Remote::Negotiation).to( receive(:endpoint?).with("/evp_proxy/v4/").and_return(true) ) allow(Datadog::CI::Utils::TestRun).to receive(:command).and_return(test_command) + allow_any_instance_of(Datadog::CI::Transport::RemoteSettingsApi).to receive(:fetch_library_settings).and_return( + instance_double( + Datadog::CI::Transport::RemoteSettingsApi::Response, + payload: { + "itr_enabled" => itr_enabled, + "code_coverage" => code_coverage_enabled, + "tests_skipping" => tests_skipping_enabled + }, + require_git?: require_git + ), + # This is for the second call to fetch_library_settings + instance_double( + Datadog::CI::Transport::RemoteSettingsApi::Response, + payload: { + "itr_enabled" => itr_enabled, + "code_coverage" => !code_coverage_enabled, + "tests_skipping" => !tests_skipping_enabled + }, + require_git?: !require_git + ) + ) + allow_any_instance_of(Datadog::CI::ITR::Skippable).to receive(:fetch_skippable_tests).and_return(skippable_tests_response) + allow_any_instance_of(Datadog::CI::ITR::Coverage::Transport).to receive(:send_events).and_return([]) + Datadog.configure do |c| c.ci.enabled = ci_enabled c.ci.force_test_level_visibility = force_test_level_visibility c.ci.itr_enabled = itr_enabled + c.ci.git_metadata_upload_enabled = git_metadata_upload_enabled unless integration_name == :no_instrument c.ci.instrument integration_name, integration_options end @@ -36,5 +83,8 @@ after do ::Datadog::Tracing.shutdown! + + Datadog::CI.send(:itr_runner)&.shutdown! + Datadog::CI.send(:recorder)&.shutdown! end end diff --git a/spec/support/contexts/citestcycle_serializer.rb b/spec/support/contexts/msgpack_serializer.rb similarity index 82% rename from spec/support/contexts/citestcycle_serializer.rb rename to spec/support/contexts/msgpack_serializer.rb index 33889029..eec6fc9d 100644 --- a/spec/support/contexts/citestcycle_serializer.rb +++ b/spec/support/contexts/msgpack_serializer.rb @@ -1,7 +1,7 @@ -# "citestcycle serializer" shared context uses serializer defined in `subject` +# "msgpack serializer" shared context uses serializer defined in `subject` # to serialize the data and then unpacks it to JSON. -RSpec.shared_context "citestcycle serializer" do +RSpec.shared_context "msgpack serializer" do subject {} let(:msgpack_jsons) do diff --git a/spec/support/coverage_helpers.rb b/spec/support/coverage_helpers.rb new file mode 100644 index 00000000..f74d3de1 --- /dev/null +++ b/spec/support/coverage_helpers.rb @@ -0,0 +1,69 @@ +require "datadog/ci" + +module CoverageHelpers + def coverage_events + @coverage_events ||= fetch_coverage_events + end + + def find_coverage_for_test(test_span) + coverage_events.find { |event| event.test_id == test_span.id.to_s } + end + + # Retrieves all traces in the current tracer instance. + # This method does not cache its results. + def fetch_coverage_events + runner.instance_variable_get(:@coverage_events) || [] + end + + # Remove all traces from the current tracer instance and + # busts cache of +#spans+ and +#span+. + def clear_coverage_events! + runner.instance_variable_set(:@coverage_events, []) + + @coverage_events = nil + end + + def setup_test_coverage_writer! + # DEV `*_any_instance_of` has concurrency issues when running with parallelism (e.g. JRuby). + # DEV Single object `allow` and `expect` work as intended with parallelism. + allow(Datadog::CI::ITR::Runner).to receive(:new).and_wrap_original do |method, **args, &block| + instance = method.call(**args, &block) + + write_lock = Mutex.new + allow(instance).to receive(:write) do |event| + instance.instance_exec do + write_lock.synchronize do + @coverage_events ||= [] + @coverage_events << event + end + end + end + + instance + end + end + + def runner + Datadog::CI.send(:itr_runner) + end + + def expect_coverage_events_belong_to_session(test_session_span) + expect(coverage_events.map(&:test_session_id)).to all eq(test_session_span.id.to_s) + end + + def expect_coverage_events_belong_to_suite(test_suite_span) + expect(coverage_events.map(&:test_suite_id)).to all eq(test_suite_span.id.to_s) + end + + def expect_coverage_events_belong_to_suites(test_suite_spans) + expect(coverage_events.map(&:test_suite_id).sort).to eq(test_suite_spans.map(&:id).map(&:to_s).sort) + end + + def expect_coverage_events_belong_to_tests(test_spans) + expect(coverage_events.map(&:test_id).sort).to eq(test_spans.map(&:id).map(&:to_s).sort) + end + + def expect_non_empty_coverages + expect(coverage_events.map(&:coverage).map(&:size)).to all be > 0 + end +end diff --git a/spec/support/fixtures/git/gitdir_with_tag/HEAD b/spec/support/fixtures/git/gitdir_with_tag/HEAD new file mode 100644 index 00000000..cb089cd8 --- /dev/null +++ b/spec/support/fixtures/git/gitdir_with_tag/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/spec/support/fixtures/git/gitdir_with_tag/config b/spec/support/fixtures/git/gitdir_with_tag/config new file mode 100644 index 00000000..0d0591c8 --- /dev/null +++ b/spec/support/fixtures/git/gitdir_with_tag/config @@ -0,0 +1,10 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = https://datadoghq.com/git/test.git + fetch = +refs/heads/*:refs/remotes/origin/* diff --git a/spec/support/fixtures/git/gitdir_with_tag/index b/spec/support/fixtures/git/gitdir_with_tag/index new file mode 100644 index 00000000..65d67515 Binary files /dev/null and b/spec/support/fixtures/git/gitdir_with_tag/index differ diff --git a/spec/support/fixtures/git/gitdir_with_tag/logs/HEAD b/spec/support/fixtures/git/gitdir_with_tag/logs/HEAD new file mode 100644 index 00000000..b4d0795d --- /dev/null +++ b/spec/support/fixtures/git/gitdir_with_tag/logs/HEAD @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 3e84e4841fc8f3c76e54fb1becaa8863a2cede30 Marco Costa 1623881249 -0700 commit (initial): First commit! +3e84e4841fc8f3c76e54fb1becaa8863a2cede30 9322ca1d57975b49b8c00b449d21b06660ce8b5b Marco Costa 1623954910 -0700 commit (amend): First commit! +9322ca1d57975b49b8c00b449d21b06660ce8b5b c7f893648f656339f62fb7b4d8a6ecdf7d063835 Andrey Marchenko 1696254776 +0200 commit (amend): First commit with ❤️ diff --git a/spec/support/fixtures/git/gitdir_with_tag/logs/refs/heads/master b/spec/support/fixtures/git/gitdir_with_tag/logs/refs/heads/master new file mode 100644 index 00000000..b4d0795d --- /dev/null +++ b/spec/support/fixtures/git/gitdir_with_tag/logs/refs/heads/master @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 3e84e4841fc8f3c76e54fb1becaa8863a2cede30 Marco Costa 1623881249 -0700 commit (initial): First commit! +3e84e4841fc8f3c76e54fb1becaa8863a2cede30 9322ca1d57975b49b8c00b449d21b06660ce8b5b Marco Costa 1623954910 -0700 commit (amend): First commit! +9322ca1d57975b49b8c00b449d21b06660ce8b5b c7f893648f656339f62fb7b4d8a6ecdf7d063835 Andrey Marchenko 1696254776 +0200 commit (amend): First commit with ❤️ diff --git a/spec/support/fixtures/git/gitdir_with_tag/objects/3e/84e4841fc8f3c76e54fb1becaa8863a2cede30 b/spec/support/fixtures/git/gitdir_with_tag/objects/3e/84e4841fc8f3c76e54fb1becaa8863a2cede30 new file mode 100644 index 00000000..19773e6e Binary files /dev/null and b/spec/support/fixtures/git/gitdir_with_tag/objects/3e/84e4841fc8f3c76e54fb1becaa8863a2cede30 differ diff --git a/spec/support/fixtures/git/gitdir_with_tag/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/spec/support/fixtures/git/gitdir_with_tag/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 new file mode 100644 index 00000000..adf64119 Binary files /dev/null and b/spec/support/fixtures/git/gitdir_with_tag/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 differ diff --git a/spec/support/fixtures/git/gitdir_with_tag/objects/93/22ca1d57975b49b8c00b449d21b06660ce8b5b b/spec/support/fixtures/git/gitdir_with_tag/objects/93/22ca1d57975b49b8c00b449d21b06660ce8b5b new file mode 100644 index 00000000..369fd39b Binary files /dev/null and b/spec/support/fixtures/git/gitdir_with_tag/objects/93/22ca1d57975b49b8c00b449d21b06660ce8b5b differ diff --git a/spec/support/fixtures/git/gitdir_with_tag/objects/c7/f893648f656339f62fb7b4d8a6ecdf7d063835 b/spec/support/fixtures/git/gitdir_with_tag/objects/c7/f893648f656339f62fb7b4d8a6ecdf7d063835 new file mode 100644 index 00000000..19b0a7a3 Binary files /dev/null and b/spec/support/fixtures/git/gitdir_with_tag/objects/c7/f893648f656339f62fb7b4d8a6ecdf7d063835 differ diff --git a/spec/support/fixtures/git/gitdir_with_tag/refs/heads/master b/spec/support/fixtures/git/gitdir_with_tag/refs/heads/master new file mode 100644 index 00000000..d65e3dc5 --- /dev/null +++ b/spec/support/fixtures/git/gitdir_with_tag/refs/heads/master @@ -0,0 +1 @@ +c7f893648f656339f62fb7b4d8a6ecdf7d063835 diff --git a/spec/support/fixtures/git/gitdir_with_tag/refs/tags/first-tag b/spec/support/fixtures/git/gitdir_with_tag/refs/tags/first-tag new file mode 100644 index 00000000..d65e3dc5 --- /dev/null +++ b/spec/support/fixtures/git/gitdir_with_tag/refs/tags/first-tag @@ -0,0 +1 @@ +c7f893648f656339f62fb7b4d8a6ecdf7d063835 diff --git a/spec/support/fixtures/git/gitdir_with_tag/refs/tags/v1.2.3 b/spec/support/fixtures/git/gitdir_with_tag/refs/tags/v1.2.3 new file mode 100644 index 00000000..a3c9fbdd --- /dev/null +++ b/spec/support/fixtures/git/gitdir_with_tag/refs/tags/v1.2.3 @@ -0,0 +1 @@ +3e84e4841fc8f3c76e54fb1becaa8863a2cede30 diff --git a/spec/support/platform_helpers.rb b/spec/support/platform_helpers.rb new file mode 100644 index 00000000..093b800f --- /dev/null +++ b/spec/support/platform_helpers.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require "os" + +module PlatformHelpers + module_function + + # Ruby runtime engines + + def mri? + RUBY_ENGINE == "ruby" + end + + def jruby? + RUBY_ENGINE == "jruby" + end + + def truffleruby? + RUBY_ENGINE == "truffleruby" + end + + def engine_version + version = defined?(RUBY_ENGINE_VERSION) ? RUBY_ENGINE_VERSION : RUBY_VERSION + Gem::Version.new(version) + end + + # Operating systems + + def linux? + OS.linux? + end + + def mac? + OS.mac? + end + + # Environment + + def ci? + ENV.key?("CI") + end + + # Feature support + + def supports_fork? + Process.respond_to?(:fork) + end +end diff --git a/spec/support/synchronization_helpers.rb b/spec/support/synchronization_helpers.rb new file mode 100644 index 00000000..3c7b094d --- /dev/null +++ b/spec/support/synchronization_helpers.rb @@ -0,0 +1,105 @@ +# frozen_string_literal: true + +require "tempfile" + +module SynchronizationHelpers + def expect_in_fork(fork_expectations: nil, timeout_seconds: 10) + fork_expectations ||= proc { |status:, stdout:, stderr:| + expect(status && status.success?).to be(true), "STDOUT:`#{stdout}` STDERR:`#{stderr}" + } + + fork_stdout = Tempfile.new("ddtrace-rspec-expect-in-fork-stdout") + fork_stderr = Tempfile.new("ddtrace-rspec-expect-in-fork-stderr") + begin + # Start in fork + pid = fork do + # Capture forked output + $stdout.reopen(fork_stdout) + $stderr.reopen(fork_stderr) # STDERR captures RSpec failures. We print it in case the fork fails on exit. + + yield + end + + fork_stderr.close + fork_stdout.close + + # Wait for fork to finish, retrieve its status. + # Enforce timeout to ensure test fork doesn't hang the test suite. + _, status = try_wait_until(seconds: timeout_seconds) { Process.wait2(pid, Process::WNOHANG) } + + stdout = File.read(fork_stdout.path) + stderr = File.read(fork_stderr.path) + + # Capture forked execution information + result = {status: status, stdout: stdout, stderr: stderr} + + # Expect fork and assertions to have completed successfully. + fork_expectations.call(**result) + + result + rescue => e + stdout ||= File.read(fork_stdout.path) + stderr ||= File.read(fork_stderr.path) + + puts stdout + warn stderr + + raise e + ensure + begin + Process.kill("KILL", pid) + rescue + nil + end # Prevent zombie processes on failure + + fork_stdout.unlink + fork_stderr.unlink + end + end + + # Waits for the condition provided by the block argument to return truthy. + # + # Waits for 5 seconds by default. + # + # Can be configured by setting either: + # * `seconds`, or + # * `attempts` and `backoff` + # + # @yieldreturn [Boolean] block executed until it returns truthy + # @param [Numeric] seconds number of seconds to wait + # @param [Integer] attempts number of attempts at checking the condition + # @param [Numeric] backoff wait time between condition checking attempts + def try_wait_until(seconds: nil, attempts: nil, backoff: nil) + raise "Provider either `seconds` or `attempts` & `backoff`, not both" if seconds && (attempts || backoff) + + if seconds + attempts = seconds * 10 + backoff = 0.1 + else + # 5 seconds by default, but respect the provide values if any. + attempts ||= 50 + backoff ||= 0.1 + end + + # It's common for tests to want to run simple tasks in a background thread + # but call this method without the thread having even time to start. + # + # We add an extra attempt, interleaved by `Thread.pass`, in order to allow for + # those simple cases to quickly succeed without a timed `sleep` call. This will + # save simple test one `backoff` seconds sleep cycle. + # + # The total configured timeout is not reduced. + (attempts + 1).times do |i| + result = yield(attempts) + return result if result + + if i == 0 + Thread.pass + else + sleep(backoff) + end + end + + raise("Wait time exhausted!") + end +end diff --git a/spec/support/tracer_helpers.rb b/spec/support/tracer_helpers.rb index baa7762c..3f279ead 100644 --- a/spec/support/tracer_helpers.rb +++ b/spec/support/tracer_helpers.rb @@ -35,8 +35,8 @@ def produce_test_trace( end end - Datadog::CI.active_test.set_tag("test_owner", "my_team") if Datadog::CI.active_test - Datadog::CI.active_test.set_metric("memory_allocations", 16) if Datadog::CI.active_test + Datadog::CI.active_test&.set_tag("test_owner", "my_team") + Datadog::CI.active_test&.set_metric("memory_allocations", 16) set_result(test, result: result, exception: exception, skip_reason: skip_reason) if test diff --git a/static-analysis.datadog.yml b/static-analysis.datadog.yml new file mode 100644 index 00000000..67a2b9d4 --- /dev/null +++ b/static-analysis.datadog.yml @@ -0,0 +1,6 @@ +rulesets: + - ruby-code-style + - ruby-security + - ruby-best-practices + - rails-best-practices +ignorePaths: [] diff --git a/vendor/rbs/cucumber/0/cucumber.rbs b/vendor/rbs/cucumber/0/cucumber.rbs index 891f2d16..91843eb5 100644 --- a/vendor/rbs/cucumber/0/cucumber.rbs +++ b/vendor/rbs/cucumber/0/cucumber.rbs @@ -25,6 +25,11 @@ class Cucumber::Core::Test::Result def exception: () -> untyped end +module Cucumber::Core::Test::Step + @action: untyped + def execute: (untyped args) -> untyped +end + class Cucumber::Formatter::AstLookup def initialize: (untyped config) -> void diff --git a/vendor/rbs/ddtrace/0/datadog/core/buffer/cruby.rbs b/vendor/rbs/ddtrace/0/datadog/core/buffer/cruby.rbs new file mode 100644 index 00000000..05b7430f --- /dev/null +++ b/vendor/rbs/ddtrace/0/datadog/core/buffer/cruby.rbs @@ -0,0 +1,10 @@ +module Datadog + module Core + module Buffer + class CRuby < Random + FIXNUM_MAX: untyped + def replace!: (untyped item) -> untyped + end + end + end +end diff --git a/vendor/rbs/ddtrace/0/datadog/core/buffer/random.rbs b/vendor/rbs/ddtrace/0/datadog/core/buffer/random.rbs new file mode 100644 index 00000000..72a00f85 --- /dev/null +++ b/vendor/rbs/ddtrace/0/datadog/core/buffer/random.rbs @@ -0,0 +1,8 @@ +module Datadog + module Core + module Buffer + class Random + end + end + end +end diff --git a/vendor/rbs/ddtrace/0/datadog/core/buffer/thread_safe.rbs b/vendor/rbs/ddtrace/0/datadog/core/buffer/thread_safe.rbs new file mode 100644 index 00000000..52f83646 --- /dev/null +++ b/vendor/rbs/ddtrace/0/datadog/core/buffer/thread_safe.rbs @@ -0,0 +1,8 @@ +module Datadog + module Core + module Buffer + class ThreadSafe < Datadog::Core::Buffer::Random + end + end + end +end diff --git a/vendor/rbs/ddtrace/0/datadog/core/configuration/agent_settings_resolver.rbs b/vendor/rbs/ddtrace/0/datadog/core/configuration/agent_settings_resolver.rbs index 73fce7dd..9eeba0c9 100644 --- a/vendor/rbs/ddtrace/0/datadog/core/configuration/agent_settings_resolver.rbs +++ b/vendor/rbs/ddtrace/0/datadog/core/configuration/agent_settings_resolver.rbs @@ -3,7 +3,7 @@ module Datadog module Configuration class AgentSettingsResolver class AgentSettings < ::Struct[untyped] - def initialize: (adapter: untyped, ssl: untyped, hostname: untyped, port: untyped, uds_path: untyped, timeout_seconds: untyped, deprecated_for_removal_transport_configuration_proc: untyped) -> void + def initialize: (adapter: untyped, ssl: untyped, hostname: untyped, port: untyped, uds_path: untyped, timeout_seconds: untyped) -> void def merge: (**::Hash[untyped, untyped] member_values) -> AgentSettingsResolver attr_reader adapter: untyped @@ -12,7 +12,6 @@ module Datadog attr_reader port: untyped attr_reader uds_path: untyped attr_reader timeout_seconds: untyped - attr_reader deprecated_for_removal_transport_configuration_proc: untyped end def self.call: (untyped settings, ?logger: untyped) -> untyped @@ -45,8 +44,6 @@ module Datadog def timeout_seconds: () -> untyped - def deprecated_for_removal_transport_configuration_proc: () -> (untyped | nil) - def uds_fallback: () -> untyped def should_use_uds_fallback?: () -> untyped diff --git a/vendor/rbs/ddtrace/0/datadog/core/environment/platform.rbs b/vendor/rbs/ddtrace/0/datadog/core/environment/platform.rbs new file mode 100644 index 00000000..ebfd15d0 --- /dev/null +++ b/vendor/rbs/ddtrace/0/datadog/core/environment/platform.rbs @@ -0,0 +1,12 @@ +module Datadog + module Core + module Environment + module Platform + def self?.hostname: () -> (untyped | nil) + def self?.kernel_name: () -> untyped + def self?.kernel_release: () -> (untyped | untyped | nil) + def self?.kernel_version: () -> (untyped | nil) + end + end + end +end diff --git a/vendor/rbs/ddtrace/0/datadog/core/transport/http/adapters/net.rbs b/vendor/rbs/ddtrace/0/datadog/core/transport/http/adapters/net.rbs index 52968f54..81acc736 100644 --- a/vendor/rbs/ddtrace/0/datadog/core/transport/http/adapters/net.rbs +++ b/vendor/rbs/ddtrace/0/datadog/core/transport/http/adapters/net.rbs @@ -14,7 +14,7 @@ module Datadog DEFAULT_TIMEOUT: 30 - def initialize: (?untyped? hostname, ?untyped? port, **untyped options) -> void + def initialize: (untyped agent_settings) -> void def self.build: (untyped agent_settings) -> untyped diff --git a/vendor/rbs/ddtrace/0/datadog/core/transport/response.rbs b/vendor/rbs/ddtrace/0/datadog/core/transport/response.rbs index 888e6756..a793675e 100644 --- a/vendor/rbs/ddtrace/0/datadog/core/transport/response.rbs +++ b/vendor/rbs/ddtrace/0/datadog/core/transport/response.rbs @@ -2,7 +2,7 @@ module Datadog module Core module Transport module Response - def payload: () -> nil + def payload: () -> String def ok?: () -> nil diff --git a/vendor/rbs/ddtrace/0/datadog/core/worker.rbs b/vendor/rbs/ddtrace/0/datadog/core/worker.rbs new file mode 100644 index 00000000..93eb887f --- /dev/null +++ b/vendor/rbs/ddtrace/0/datadog/core/worker.rbs @@ -0,0 +1,7 @@ +module Datadog + module Core + class Worker + def initialize: () { (untyped) -> untyped } -> void + end + end +end diff --git a/vendor/rbs/ddtrace/0/datadog/core/workers/async.rbs b/vendor/rbs/ddtrace/0/datadog/core/workers/async.rbs new file mode 100644 index 00000000..cc381ca0 --- /dev/null +++ b/vendor/rbs/ddtrace/0/datadog/core/workers/async.rbs @@ -0,0 +1,69 @@ +module Datadog + module Core + module Workers + module Async + module Thread + FORK_POLICY_STOP: :stop + + FORK_POLICY_RESTART: :restart + + SHUTDOWN_TIMEOUT: 1 + MUTEX_INIT: untyped + + def self.included: (untyped base) -> untyped + module PrependedMethods + def perform: (*untyped args) -> (untyped | nil) + end + + attr_reader error: untyped + + attr_reader result: untyped + + attr_writer fork_policy: untyped + + def join: (?untyped? timeout) -> (true | untyped) + + def terminate: () -> (false | true) + + def run_async?: () -> (false | untyped) + + def started?: () -> untyped + + def running?: () -> untyped + + def error?: () -> (false | untyped) + + def completed?: () -> untyped + + def failed?: () -> untyped + + def forked?: () -> untyped + + def fork_policy: () -> untyped + + attr_writer result: untyped + + def mutex: () -> untyped + + def after_fork: () -> nil + + private + + attr_reader pid: untyped + + def mutex_after_fork: () -> untyped + + def worker: () -> untyped + + def start_async: () ?{ () -> untyped } -> untyped + + def start_worker: () { () -> untyped } -> nil + + def stop_fork: () -> untyped + + def restart_after_fork: () ?{ () -> untyped } -> untyped + end + end + end + end +end diff --git a/vendor/rbs/ddtrace/0/datadog/core/workers/interval_loop.rbs b/vendor/rbs/ddtrace/0/datadog/core/workers/interval_loop.rbs new file mode 100644 index 00000000..21e58087 --- /dev/null +++ b/vendor/rbs/ddtrace/0/datadog/core/workers/interval_loop.rbs @@ -0,0 +1,52 @@ +module Datadog + module Core + module Workers + module IntervalLoop + BACK_OFF_RATIO: ::Float + + BACK_OFF_MAX: 5 + + BASE_INTERVAL: 1 + MUTEX_INIT: untyped + + def self.included: (untyped base) -> untyped + module PrependedMethods + def perform: (*untyped args) -> untyped + end + + def stop_loop: () -> (false | true) + + def work_pending?: () -> untyped + + def run_loop?: () -> (false | untyped) + + def loop_base_interval: () -> untyped + + def loop_back_off_ratio: () -> untyped + + def loop_back_off_max: () -> untyped + + def loop_wait_time: () -> untyped + + def loop_wait_time=: (untyped value) -> untyped + + def loop_back_off!: () -> untyped + def loop_wait_before_first_iteration?: () -> false + + attr_writer loop_back_off_max: untyped + + attr_writer loop_back_off_ratio: untyped + + attr_writer loop_base_interval: untyped + + def mutex: () -> untyped + + private + + def perform_loop: () { () -> untyped } -> (nil | untyped) + + def shutdown: () -> untyped + end + end + end +end diff --git a/vendor/rbs/ddtrace/0/datadog/core/workers/polling.rbs b/vendor/rbs/ddtrace/0/datadog/core/workers/polling.rbs new file mode 100644 index 00000000..7f4d8f9c --- /dev/null +++ b/vendor/rbs/ddtrace/0/datadog/core/workers/polling.rbs @@ -0,0 +1,21 @@ +module Datadog + module Core + module Workers + module Polling + SHUTDOWN_TIMEOUT: 1 + + def self.included: (Class | Module base) -> void + + module PrependedMethods + def perform: (*untyped args) -> untyped + end + + def stop: (?bool force_stop, ?::Integer timeout) -> untyped + + def enabled?: () -> bool + + def enabled=: (bool value) -> bool + end + end + end +end diff --git a/vendor/rbs/ddtrace/0/datadog/core/workers/queue.rbs b/vendor/rbs/ddtrace/0/datadog/core/workers/queue.rbs new file mode 100644 index 00000000..e538c89e --- /dev/null +++ b/vendor/rbs/ddtrace/0/datadog/core/workers/queue.rbs @@ -0,0 +1,21 @@ +module Datadog + module Core + module Workers + module Queue + def self.included: (untyped base) -> untyped + module PrependedMethods + def perform: (*untyped args) -> (untyped | nil) + end + + def buffer: () -> untyped + + def enqueue: (*untyped args) -> untyped + + def dequeue: () -> untyped + def work_pending?: () -> untyped + + attr_writer buffer: untyped + end + end + end +end diff --git a/vendor/rbs/open3/0/open3.rbs b/vendor/rbs/open3/0/open3.rbs index c46312ce..f4163daf 100644 --- a/vendor/rbs/open3/0/open3.rbs +++ b/vendor/rbs/open3/0/open3.rbs @@ -1,3 +1,3 @@ module Open3 - def self.capture2e: (String cmd) -> [String, Process::Status] + def self.capture2e: (String cmd, ?stdin_data: String?) -> [String, Process::Status] end