------- Forwarded Message -------
From: Norwid Behrnd <[email protected]>
Date: On Wednesday, June 3rd, 2026 at 20:50
Subject: ruby-chef-utils: diff for NMU version 19.2.12-0.1
To: [email protected] <[email protected]>, [email protected] 
<[email protected]>


> X-NMUDIFF-Version: 2.26.7
> 
> Control: tags 1123467 + patch
> Control: tags 1123467 + pending
> Control: tags 1127665 + patch
> Control: tags 1127665 + pending
> 
> 
> Dear maintainer,
> 
> I've prepared an NMU for ruby-chef-utils (versioned as 19.2.12-0.1, deposited 
> on https://mentors.debian.net/package/ruby-chef-utils/#upload-6). The diff
> is attached to this message.
> 
> I require a sponsor to have it uploaded.
> 
> Regards,
> Norwid
> 
> diffstat for ruby-chef-utils-16.12.3 ruby-chef-utils-19.2.12
> 
>  chef-utils.gemspec                     |   16 ++-
>  debian/changelog                       |    9 +
>  debian/control                         |    1
>  debian/gbp.conf                        |    4
>  debian/salsa-ci.yml                    |    3
>  debian/watch                           |    4
>  lib/chef-utils.rb                      |    3
>  lib/chef-utils/dist.rb                 |   58 ++++++++++++
>  lib/chef-utils/dsl/architecture.rb     |    2
>  lib/chef-utils/dsl/backend.rb          |   27 +++++
>  lib/chef-utils/dsl/cloud.rb            |   44 ++++++---
>  lib/chef-utils/dsl/default_paths.rb    |    2
>  lib/chef-utils/dsl/introspection.rb    |   13 ++
>  lib/chef-utils/dsl/os.rb               |    2
>  lib/chef-utils/dsl/path_sanity.rb      |    2
>  lib/chef-utils/dsl/platform.rb         |   17 +++
>  lib/chef-utils/dsl/platform_family.rb  |   22 ++++
>  lib/chef-utils/dsl/platform_version.rb |    2
>  lib/chef-utils/dsl/service.rb          |    2
>  lib/chef-utils/dsl/train_helpers.rb    |    2
>  lib/chef-utils/dsl/virtualization.rb   |   35 +++++++
>  lib/chef-utils/dsl/which.rb            |   12 +-
>  lib/chef-utils/dsl/windows.rb          |    4
>  lib/chef-utils/internal.rb             |    6 -
>  lib/chef-utils/mash.rb                 |   23 ++++
>  lib/chef-utils/parallel_map.rb         |  131 +++++++++++++++++++++++++++
>  lib/chef-utils/version.rb              |    4
>  spec/unit/dsl/architecture_spec.rb     |    2
>  spec/unit/dsl/cloud_spec.rb            |   11 +-
>  spec/unit/dsl/dsl_spec.rb              |    2
>  spec/unit/dsl/introspection_spec.rb    |   14 ++
>  spec/unit/dsl/os_spec.rb               |    2
>  spec/unit/dsl/path_sanity_spec.rb      |    4
>  spec/unit/dsl/platform_family_spec.rb  |   34 ++++---
>  spec/unit/dsl/platform_spec.rb         |   16 +++
>  spec/unit/dsl/service_spec.rb          |    2
>  spec/unit/dsl/virtualization_spec.rb   |    6 -
>  spec/unit/dsl/which_spec.rb            |    2
>  spec/unit/dsl/windows_spec.rb          |    2
>  spec/unit/mash_spec.rb                 |    2
>  spec/unit/parallel_map_spec.rb         |  156 
> +++++++++++++++++++++++++++++++++
>  41 files changed, 631 insertions(+), 74 deletions(-)
> 
> diff -Nru ruby-chef-utils-16.12.3/chef-utils.gemspec 
> ruby-chef-utils-19.2.12/chef-utils.gemspec
> --- ruby-chef-utils-16.12.3/chef-utils.gemspec        2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/chef-utils.gemspec        2026-06-03 
> 12:04:51.000000000 +0200
> @@ -10,17 +10,17 @@
>    spec.email         = ["[email protected]"]
> 
>    spec.summary       = %q{Basic utility functions for Core Chef Infra 
> development}
> -  spec.homepage      = "https://github.com/chef/chef/tree/master/chef-utils";
> +  spec.homepage      = "https://github.com/chef/chef/tree/main/chef-utils";
>    spec.license       = "Apache-2.0"
> 
> -  spec.required_ruby_version = ">= 2.6.0"
> +  spec.required_ruby_version = ">= 2.6"
> 
>    spec.metadata = {
>      "bug_tracker_uri" => "https://github.com/chef/chef/issues";,
> -    "changelog_uri" => 
> "https://github.com/chef/chef/blob/master/CHANGELOG.md";,
> -    "documentation_uri" => 
> "https://github.com/chef/chef/tree/master/chef-utils/README.md";,
> -    "homepage_uri" => "https://github.com/chef/chef/tree/master/chef-utils";,
> -    "source_code_uri" => 
> "https://github.com/chef/chef/tree/master/chef-utils";,
> +    "changelog_uri" => "https://github.com/chef/chef/blob/main/CHANGELOG.md";,
> +    "documentation_uri" => 
> "https://github.com/chef/chef/tree/main/chef-utils/README.md";,
> +    "homepage_uri" => "https://github.com/chef/chef/tree/main/chef-utils";,
> +    "source_code_uri" => "https://github.com/chef/chef/tree/main/chef-utils";,
>    }
> 
>    spec.require_paths = ["lib"]
> @@ -41,6 +41,10 @@
>    # ABSOLUTELY NO EXCEPTIONS
>    #
> 
> +  # concurrent-ruby is: 1. lightweight, 2. has zero deps, 3. is external to 
> chef
> +  # this is used for the parallel_map enumerable extension for lightweight 
> threading
> +  spec.add_dependency "concurrent-ruby"
> +
>    spec.files = %w{Rakefile LICENSE} + Dir.glob("*.gemspec") +
>      Dir.glob("{lib,spec}/**/*", File::FNM_DOTMATCH).reject { |f| 
> File.directory?(f) }
>  end
> diff -Nru ruby-chef-utils-16.12.3/debian/changelog 
> ruby-chef-utils-19.2.12/debian/changelog
> --- ruby-chef-utils-16.12.3/debian/changelog  2025-05-08 14:16:26.000000000 
> +0200
> +++ ruby-chef-utils-19.2.12/debian/changelog  2026-06-03 15:13:03.000000000 
> +0200
> @@ -1,3 +1,11 @@
> +ruby-chef-utils (19.2.12-0.1) unstable; urgency=medium
> +
> +  * Non-maintainer upload.
> +  * Manual upstream update and additional dependency (Closes: #1123467).
> +  * Reactivate d/watch (Closes: #1127665).
> +
> + -- Norwid Behrnd <[email protected]>  Wed, 03 Jun 2026 15:13:03 +0200
> +
>  ruby-chef-utils (16.12.3-3) unstable; urgency=medium
> 
>    * Team upload.
> @@ -13,6 +21,7 @@
> 
>   -- Lucas Kanashiro <[email protected]>  Thu, 08 May 2025 09:16:26 -0300
> 
> +
>  ruby-chef-utils (16.12.3-2) unstable; urgency=medium
> 
>    * Source-only upload for migration to testing
> diff -Nru ruby-chef-utils-16.12.3/debian/control 
> ruby-chef-utils-19.2.12/debian/control
> --- ruby-chef-utils-16.12.3/debian/control    2025-05-08 14:16:26.000000000 
> +0200
> +++ ruby-chef-utils-19.2.12/debian/control    2026-06-03 15:13:03.000000000 
> +0200
> @@ -6,6 +6,7 @@
>  Build-Depends: debhelper-compat (= 13),
>                 gem2deb (>= 1),
>                 rake,
> +               ruby-concurrent,
>                 ruby-rspec,
>                 ruby-fauxhai
>  Standards-Version: 4.7.2
> diff -Nru ruby-chef-utils-16.12.3/debian/gbp.conf 
> ruby-chef-utils-19.2.12/debian/gbp.conf
> --- ruby-chef-utils-16.12.3/debian/gbp.conf   1970-01-01 01:00:00.000000000 
> +0100
> +++ ruby-chef-utils-19.2.12/debian/gbp.conf   2026-06-03 15:13:03.000000000 
> +0200
> @@ -0,0 +1,4 @@
> +[DEFAULT]
> +debian-branch = debian/latest
> +upstream-branch = upstream/latest
> +pristine-tar = True
> diff -Nru ruby-chef-utils-16.12.3/debian/salsa-ci.yml 
> ruby-chef-utils-19.2.12/debian/salsa-ci.yml
> --- ruby-chef-utils-16.12.3/debian/salsa-ci.yml       2025-05-08 
> 14:16:26.000000000 +0200
> +++ ruby-chef-utils-19.2.12/debian/salsa-ci.yml       2026-06-03 
> 15:13:03.000000000 +0200
> @@ -1,4 +1,3 @@
>  ---
>  include:
> -  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
> -  - 
> https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
> +  - https://salsa.debian.org/ruby-team/meta/raw/master/salsa-ci.yml
> diff -Nru ruby-chef-utils-16.12.3/debian/watch 
> ruby-chef-utils-19.2.12/debian/watch
> --- ruby-chef-utils-16.12.3/debian/watch      2025-05-08 14:16:26.000000000 
> +0200
> +++ ruby-chef-utils-19.2.12/debian/watch      2026-06-03 15:13:03.000000000 
> +0200
> @@ -1,3 +1,3 @@
> -#version=4
> -#https://gemwatch.debian.net/chef-utils .*/chef-utils-(.*).tar.gz
> +version=4
> +https://gemwatch.debian.net/chef-utils .*/chef-utils-(.*).tar.gz
>  # See README.Source for downloading the gem from cinc project
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dist.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dist.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dist.rb    2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dist.rb    2026-06-03 
> 12:04:51.000000000 +0200
> @@ -15,6 +15,25 @@
>        PRODUCT = "Chef Automate"
>      end
> 
> +    class Cli
> +      # the chef-cli product name
> +      PRODUCT = "Chef CLI"
> +
> +      # the chef-cli gem
> +      GEM = "chef-cli"
> +    end
> +
> +    class Habitat
> +      # name of the Habitat product
> +      PRODUCT = "Chef Habitat"
> +
> +      # A short designation for the product
> +      SHORT = "habitat"
> +
> +      # The hab cli binary
> +      EXEC = "hab"
> +    end
> +
>      class Infra
>        # When referencing a product directly, like Chef (Now Chef Infra)
>        PRODUCT = "Chef Infra Client"
> @@ -42,6 +61,20 @@
>        # The suffix for Chef's /etc/chef, /var/chef and C:\\Chef directories
>        # "chef" => /etc/cinc, /var/cinc, C:\\cinc
>        DIR_SUFFIX = "chef"
> +
> +      # The client's gem
> +      GEM = "chef"
> +
> +      # The client's container image
> +      CONTAINER_REF = "chef/chef-hab"
> +    end
> +
> +    class Inspec
> +      # The InSpec product name
> +      PRODUCT = "Chef InSpec"
> +
> +      # The inspec binary
> +      EXEC = "inspec"
>      end
> 
>      class Org
> @@ -49,7 +82,7 @@
>        WEBSITE = "https://chef.io";
> 
>        # The downloads site
> -      DOWNLOADS_URL = "downloads.chef.io"
> +      DOWNLOADS_URL = "chef.io/downloads"
> 
>        # The legacy conf folder: C:/opscode/chef. Specifically the "opscode" 
> part
>        # DIR_SUFFIX is appended to it in code where relevant
> @@ -63,6 +96,12 @@
> 
>        # knife documentation page
>        KNIFE_DOCS = "https://docs.chef.io/workstation/knife/";
> +
> +      # the name of the overall infra product
> +      PRODUCT = "Chef Infra"
> +
> +      # Omnitruck URL
> +      OMNITRUCK_URL = "https://omnitruck.chef.io/install.sh";
>      end
> 
>      class Server
> @@ -77,6 +116,12 @@
> 
>        # The server's configuration utility
>        SERVER_CTL = "chef-server-ctl"
> +
> +      # The server`s docs URL
> +      SERVER_DOCS = "https://docs.chef.io/server/";
> +
> +      # OS user for server
> +      SYSTEM_USER = "opscode"
>      end
> 
>      class Solo
> @@ -87,6 +132,17 @@
>        EXEC = "chef-solo"
>      end
> 
> +    class Workstation
> +      # The full marketing name of the product
> +      PRODUCT = "Chef Workstation"
> +
> +      # The suffix for Chef Workstation's /opt/chef-workstation or 
> C:\\opscode\chef-workstation
> +      DIR_SUFFIX = "chef-workstation"
> +
> +      # Workstation banner/help text
> +      DOCS = "https://docs.chef.io/workstation/";
> +    end
> +
>      class Zero
>        # chef-zero executable
>        PRODUCT = "Chef Infra Zero"
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dsl/architecture.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dsl/architecture.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dsl/architecture.rb        
> 2021-04-09 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dsl/architecture.rb        
> 2026-06-03 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dsl/backend.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dsl/backend.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dsl/backend.rb     1970-01-01 
> 01:00:00.000000000 +0100
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dsl/backend.rb     2026-06-03 
> 12:04:51.000000000 +0200
> @@ -0,0 +1,27 @@
> +module ChefUtils
> +  module DSL
> +    module Backend
> +      include Internal
> +
> +      # Determine if the backend is local
> +      #
> +      # @param [Chef::Node] node the node to check
> +      #
> +      # @return [Boolean]
> +      #
> +      def local_mode?
> +        node["platform_backend"] == "local"
> +      end
> +
> +      # Determine if the backend is remote
> +      #
> +      # @param [Chef::Node] node the node to check
> +      #
> +      # @return [Boolean]
> +      #
> +      def target_mode?
> +        node["platform_backend"] != "local"
> +      end
> +    end
> +  end
> +end
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dsl/cloud.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dsl/cloud.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dsl/cloud.rb       2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dsl/cloud.rb       2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -23,7 +23,7 @@
>      module Cloud
>        include Internal
> 
> -      # Determine if the current node is "in the cloud".
> +      # Determine if the current node is running in a known cloud.
>        #
>        # @param [Chef::Node] node the node to check
>        # @since 15.8
> @@ -35,7 +35,18 @@
>          !node["cloud"].nil?
>        end
> 
> -      # Return true if the current current node is in EC2.
> +      # Determine if the current node is running in Alibaba Cloud
> +      #
> +      # @param [Chef::Node] node the node to check
> +      # @since 17.0
> +      #
> +      # @return [Boolean]
> +      #
> +      def alibaba?(node = __getnode)
> +        node.key?("alibaba")
> +      end
> +
> +      # Determine if the current node is running in AWS EC2.
>        #
>        # @param [Chef::Node] node the node to check
>        # @since 15.8
> @@ -46,7 +57,7 @@
>          node.key?("ec2")
>        end
> 
> -      # Return true if the current current node is in GCE.
> +      # Determine if the current node running in Google Compute Engine (GCE).
>        #
>        # @param [Chef::Node] node the node to check
>        # @since 15.8
> @@ -57,7 +68,7 @@
>          node.key?("gce")
>        end
> 
> -      # Return true if the current current node is in Rackspace.
> +      # Determine if the current node is running in Rackspace.
>        #
>        # @param [Chef::Node] node the node to check
>        # @since 15.8
> @@ -68,7 +79,7 @@
>          node.key?("rackspace")
>        end
> 
> -      # Return true if the current current node is in Eucalyptus.
> +      # Determine if the current node is running in Eucalyptus.
>        #
>        # @param [Chef::Node] node the node to check
>        # @since 15.8
> @@ -81,7 +92,7 @@
>        # chef-sugar backcompat method
>        alias_method :euca?, :eucalyptus?
> 
> -      # Return true if the current current node is in Linode.
> +      # Determine if the current node is running in Linode.
>        #
>        # @param [Chef::Node] node the node to check
>        # @since 15.8
> @@ -92,7 +103,7 @@
>          node.key?("linode")
>        end
> 
> -      # Return true if the current current node is in OpenStack.
> +      # Determine if the current node is running in OpenStack.
>        #
>        # @param [Chef::Node] node the node to check
>        # @since 15.8
> @@ -103,7 +114,7 @@
>          node.key?("openstack")
>        end
> 
> -      # Return true if the current current node is in Azure.
> +      # Determine if the current node is running in Microsoft Azure.
>        #
>        # @param [Chef::Node] node the node to check
>        # @since 15.8
> @@ -114,7 +125,7 @@
>          node.key?("azure")
>        end
> 
> -      # Return true if the current current node is in DigitalOcean.
> +      # Determine if the current node is running in DigitalOcean.
>        #
>        # @param [Chef::Node] node the node to check
>        # @since 15.8
> @@ -127,7 +138,7 @@
>        # chef-sugar backcompat method
>        alias_method :digitalocean?, :digital_ocean?
> 
> -      # Return true if the current current node is in SoftLayer.
> +      # Determine if the current node is running in SoftLayer (IBM Cloud).
>        #
>        # @param [Chef::Node] node the node to check
>        # @since 15.8
> @@ -138,6 +149,17 @@
>          node.key?("softlayer")
>        end
> 
> +      # Determine if the current node is running in Oracle Cloud 
> Infrastructure (OCI).
> +      #
> +      # @param [Chef::Node] node the node to check
> +      # @since 19.1
> +      #
> +      # @return [Boolean]
> +      #
> +      def oci?(node = __getnode)
> +        node.key?("oci")
> +      end
> +
>        extend self
>      end
>    end
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dsl/default_paths.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dsl/default_paths.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dsl/default_paths.rb       
> 2021-04-09 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dsl/default_paths.rb       
> 2026-06-03 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dsl/introspection.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dsl/introspection.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dsl/introspection.rb       
> 2021-04-09 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dsl/introspection.rb       
> 2026-06-03 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -29,6 +29,17 @@
>      module Introspection
>        include TrainHelpers
> 
> +      # Determine if the node is using the Chef Effortless pattern in which 
> the Chef Infra Client is packaged using Chef Habitat
> +      #
> +      # @param [Chef::Node] node the node to check
> +      # @since 17.0
> +      #
> +      # @return [Boolean]
> +      #
> +      def effortless?(node = __getnode)
> +        !!(node && node.read("chef_packages", "chef", "chef_effortless"))
> +      end
> +
>        # Determine if the node is a docker container.
>        #
>        # @param [Chef::Node] node the node to check
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dsl/os.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dsl/os.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dsl/os.rb  2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dsl/os.rb  2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dsl/path_sanity.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dsl/path_sanity.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dsl/path_sanity.rb 2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dsl/path_sanity.rb 2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dsl/platform_family.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dsl/platform_family.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dsl/platform_family.rb     
> 2021-04-09 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dsl/platform_family.rb     
> 2026-06-03 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -77,7 +77,7 @@
>        # @return [Boolean]
>        #
>        def macos?(node = __getnode)
> -        node["platform_family"] == "mac_os_x"
> +        node ? node["platform_family"] == "mac_os_x" : macos_ruby?
>        end
>        # chef-sugar backcompat method
>        alias_method :osx?, :macos?
> @@ -86,6 +86,17 @@
>        # chef-sugar backcompat method
>        alias_method :mac_os_x?, :macos?
> 
> +      # Determine if the Ruby VM is currently running on a Mac node (This is 
> useful primarily for internal use
> +      # by Chef Infra Client before the node object exists).
> +      #
> +      # @since 17.3
> +      #
> +      # @return [Boolean]
> +      #
> +      def macos_ruby?
> +        !!(RUBY_PLATFORM =~ /darwin/)
> +      end
> +
>        # Determine if the current node is a member of the 'rhel' platform 
> family (Red Hat, CentOS, Oracle or Scientific Linux, but NOT Amazon Linux or 
> Fedora).
>        #
>        # @param [Chef::Node] node the node to check
> @@ -259,12 +270,17 @@
>        # Determine if the Ruby VM is currently running on a Windows node 
> (ChefSpec can never stub
>        # this behavior, so this is useful for code which can never be parsed 
> on a non-Windows box).
>        #
> +      # April 2022 - Note that we changed the platform identifier from 
> 'mingw32' to 'mingw'
> +      # We did this because Ruby 3.1 introduces the new universal windows 
> platform of 'x64-mingw-ucrt'
> +      # We updated the existing regex snippet to capture both the 32-bit 
> platform and the new x64
> +      # universal platform
> +      #
>        # @since 15.5
>        #
>        # @return [Boolean]
>        #
>        def windows_ruby?
> -        !!(RUBY_PLATFORM =~ /mswin|mingw32|windows/)
> +        !!(RUBY_PLATFORM =~ /mswin|mingw|windows/)
>        end
> 
>        #
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dsl/platform.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dsl/platform.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dsl/platform.rb    2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dsl/platform.rb    2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -123,6 +123,21 @@
>        # chef-sugar backcompat method
>        alias_method :centos?, :centos_platform?
> 
> +      # Determine if the current node is CentOS Stream.
> +      #
> +      # @param [Chef::Node] node the node to check
> +      # @since 17.0
> +      #
> +      # @return [Boolean]
> +      #
> +      def centos_stream_platform?(node = __getnode)
> +        if node["os_release"]
> +          node.dig("os_release", "name") == "CentOS Stream"
> +        else
> +          node.dig("lsb", "id") == "CentOSStream"
> +        end
> +      end
> +
>        # Determine if the current node is Oracle Linux.
>        #
>        # @param [Chef::Node] node the node to check
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dsl/platform_version.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dsl/platform_version.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dsl/platform_version.rb    
> 2021-04-09 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dsl/platform_version.rb    
> 2026-06-03 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dsl/service.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dsl/service.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dsl/service.rb     2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dsl/service.rb     2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dsl/train_helpers.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dsl/train_helpers.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dsl/train_helpers.rb       
> 2021-04-09 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dsl/train_helpers.rb       
> 2026-06-03 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dsl/virtualization.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dsl/virtualization.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dsl/virtualization.rb      
> 2021-04-09 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dsl/virtualization.rb      
> 2026-06-03 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -140,6 +140,28 @@
>          node.dig("virtualization", "system") == "vmware" && 
> node.dig("virtualization", "role") == "host"
>        end
> 
> +      # Determine if the current node is virtualized on VMware Desktop 
> (Fusion/Player/Workstation).
> +      #
> +      # @param [Chef::Node] node
> +      # @since 17.9
> +      #
> +      # @return [Boolean]
> +      #
> +      def vmware_desktop?(node = __getnode)
> +        node.dig("virtualization", "system") == "vmware" && 
> node.dig("vmware", "host", "type") == "vmware_desktop"
> +      end
> +
> +      # Determine if the current node is virtualized on VMware vSphere (ESX).
> +      #
> +      # @param [Chef::Node] node
> +      # @since 17.9
> +      #
> +      # @return [Boolean]
> +      #
> +      def vmware_vsphere?(node = __getnode)
> +        node.dig("virtualization", "system") == "vmware" && 
> node.dig("vmware", "host", "type") == "vmware_vsphere"
> +      end
> +
>        # Determine if the current node is an openvz guest.
>        #
>        # @param [Chef::Node] node
> @@ -162,6 +184,17 @@
>          node.dig("virtualization", "system") == "openvz" && 
> node.dig("virtualization", "role") == "host"
>        end
> 
> +      # Determine if the current node is running under Microsoft Hyper-v.
> +      #
> +      # @param [Chef::Node] node
> +      # @since 18.5
> +      #
> +      # @return [Boolean]
> +      #
> +      def hyperv?(node = __getnode)
> +        node.dig("virtualization", "system") == "hyperv" && 
> node.dig("virtualization", "role") == "guest"
> +      end
> +
>        # Determine if the current node is running under any virtualization 
> environment
>        #
>        # @param [Chef::Node] node
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dsl/which.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dsl/which.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dsl/which.rb       2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dsl/which.rb       2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -46,11 +46,12 @@
>        #   end
>        #
>        # @param [Array<String>] list of commands to search for
> +      # @param [String,Array<String>] array of paths to look in first
>        # @param [String,Array<String>] array of extra paths to search through
>        # @return [String] the first match
>        #
> -      def which(*cmds, extra_path: nil, &block)
> -        where(*cmds, extra_path: extra_path, &block).first || false
> +      def which(*cmds, prepend_path: nil, extra_path: nil, &block)
> +        where(*cmds, prepend_path: prepend_path, extra_path: extra_path, 
> &block).first || false
>        end
> 
>        # Lookup all the instances of an an executable that can be found 
> through the systems search PATH.
> @@ -73,12 +74,13 @@
>        #   end
>        #
>        # @param [Array<String>] list of commands to search for
> +      # @param [String,Array<String>] array of paths to look in first
>        # @param [String,Array<String>] array of extra paths to search through
>        # @return [String] the first match
>        #
> -      def where(*cmds, extra_path: nil, &block)
> +      def where(*cmds, prepend_path: nil, extra_path: nil, &block)
>          extra_path ||= __extra_path
> -        paths = __env_path.split(File::PATH_SEPARATOR) + Array(extra_path)
> +        paths = Array(prepend_path) + __env_path.split(File::PATH_SEPARATOR) 
> + Array(extra_path)
>          paths.uniq!
>          exts = ENV["PATHEXT"] ? ENV["PATHEXT"].split(";") : []
>          exts.unshift("")
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/dsl/windows.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/dsl/windows.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/dsl/windows.rb     2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/dsl/windows.rb     2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -58,7 +58,7 @@
>          node["kernel"]["product_type"] == "Server"
>        end
> 
> -      # Determine the current Windows NT version. The NT version often 
> differs from the marketing version, but offers a good way to find desktop and 
> server releases that are based on the same codebase. IE: NT 6.3 is Windows 
> 8.1 and Windows 2012 R2.
> +      # Determine the current Windows NT version. The NT version often 
> differs from the marketing version, but offers a good way to find desktop and 
> server releases that are based on the same codebase. For example NT 6.3 
> corresponds to Windows 8.1 and Windows 2012 R2.
>        #
>        # @param [Chef::Node] node the node to check
>        # @since 15.8
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/internal.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/internal.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/internal.rb        2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/internal.rb        2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -70,7 +70,7 @@
>      #
>      def __env_path
>        if __transport_connection
> -        __transport_connection.run_command("echo $PATH").stdout || ""
> +        __transport_connection.run_command("echo $PATH").stdout.chomp || ""
>        else
>          ENV["PATH"] || ""
>        end
> @@ -84,7 +84,7 @@
>      #
>      def __transport_connection
>        # Software consumers MUST override this method with their own 
> implementation.  The default behavior here is subject to change.
> -      return Chef.run_context.transport_connection if defined?(Chef) && 
> Chef.respond_to?(:run_context) && Chef&.run_context&.transport_connection
> +      return Chef.run_context.transport_connection if defined?(Chef) && 
> Chef.respond_to?(:run_context) && Chef.run_context&.transport_connection
> 
>        nil
>      end
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/mash.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/mash.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/mash.rb    2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/mash.rb    2026-06-03 
> 12:04:51.000000000 +0200
> @@ -94,6 +94,10 @@
>        end
>      end
> 
> +    unless method_defined?(:regular_reader)
> +      alias_method :regular_reader, :[]
> +    end
> +
>      unless method_defined?(:regular_writer)
>        alias_method :regular_writer, :[]=
>      end
> @@ -102,6 +106,19 @@
>        alias_method :regular_update, :update
>      end
> 
> +    unless method_defined?(:regular_clear)
> +      alias_method :regular_clear, :clear
> +    end
> +
> +    unless method_defined?(:regular_delete)
> +      alias_method :regular_delete, :delete
> +    end
> +
> +    # @param key<Object> The key to get.
> +    def [](key)
> +      regular_reader(key)
> +    end
> +
>      # @param key<Object> The key to set.
>      # @param value<Object>
>      #   The value to set the key to.
> @@ -113,6 +130,12 @@
>      end
> 
>      # internal API for use by Chef's deep merge cache
> +    # @api private
> +    def internal_get(key)
> +      regular_reader(key)
> +    end
> +
> +    # internal API for use by Chef's deep merge cache
>      # @api private
>      def internal_set(key, value)
>        regular_writer(key, convert_value(value))
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/parallel_map.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/parallel_map.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/parallel_map.rb    1970-01-01 
> 01:00:00.000000000 +0100
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/parallel_map.rb    2026-06-03 
> 12:04:51.000000000 +0200
> @@ -0,0 +1,131 @@
> +# frozen_string_literal: true
> +#
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
> +# License:: Apache License, Version 2.0
> +#
> +# Licensed under the Apache License, Version 2.0 (the "License");
> +# you may not use this file except in compliance with the License.
> +# You may obtain a copy of the License at
> +#
> +#     http://www.apache.org/licenses/LICENSE-2.0
> +#
> +# Unless required by applicable law or agreed to in writing, software
> +# distributed under the License is distributed on an "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> +# See the License for the specific language governing permissions and
> +# limitations under the License.
> +#
> +
> +require "concurrent/executors"
> +require "concurrent/future"
> +require "singleton" unless defined?(Singleton)
> +
> +module ChefUtils
> +  #
> +  # This module contains ruby refinements that adds several methods to the 
> Enumerable
> +  # class which are useful for parallel processing.
> +  #
> +  module ParallelMap
> +    refine Enumerable do
> +
> +      # Enumerates through the collection in parallel using the thread pool 
> provided
> +      # or the default thread pool.  By using the default thread pool this 
> supports
> +      # recursively calling the method without deadlocking while using a 
> globally
> +      # fixed number of workers.  This method supports lazy collections.  It 
> returns
> +      # synchronously, waiting until all the work is done.  Failures are 
> only reported
> +      # after the collection has executed and only the first exception is 
> raised.
> +      #
> +      # (0..).lazy.parallel_map { |i| i*i }.first(5)
> +      #
> +      # @return [Array] output results
> +      #
> +      def parallel_map(pool: nil)
> +        return self unless block_given?
> +
> +        pool ||= ChefUtils::DefaultThreadPool.instance.pool
> +
> +        futures = map do |item|
> +          Concurrent::Future.execute(executor: pool) do
> +            yield item
> +          end
> +        end
> +
> +        futures.map(&:value!)
> +      end
> +
> +      # This has the same behavior as parallel_map but returns the 
> enumerator instead of
> +      # the return values.
> +      #
> +      # @return [Enumerable] the enumerable for method chaining
> +      #
> +      def parallel_each(pool: nil, &block)
> +        return self unless block_given?
> +
> +        parallel_map(pool: pool, &block)
> +
> +        self
> +      end
> +
> +      # The flat_each method is tightly coupled to the usage of parallel_map 
> within the
> +      # ChefFS implementation.  It is not itself a parallel method, but it 
> is used to
> +      # iterate through the 2nd level of nested structure, which is tied to 
> the nested
> +      # structures that ChefFS returns.
> +      #
> +      # This is different from Enumerable#flat_map because that behaves like 
> map.flatten(1) while
> +      # this behaves more like flatten(1).each.  We need this on an 
> Enumerable, so we have no
> +      # Enumerable#flatten method to call.
> +      #
> +      # [ [ 1, 2 ], [ 3, 4 ] ].flat_each(&block) calls block four times with 
> 1, 2, 3, 4
> +      #
> +      # [ [ 1, 2 ], [ 3, 4 ] ].flat_map(&block) calls block twice with [1, 
> 2] and [3,4]
> +      #
> +      def flat_each(&block)
> +        map do |value|
> +          if value.is_a?(Enumerable)
> +            value.each(&block)
> +          else
> +            yield value
> +          end
> +        end
> +      end
> +    end
> +  end
> +
> +  # The DefaultThreadPool has a fixed thread size and has no
> +  # queue of work and the behavior on failure to find a thread is for the
> +  # caller to run the work.  This contract means that the thread pool can
> +  # be called recursively without deadlocking and while keeping the fixed
> +  # number of threads (and not exponentially growing the thread pool with
> +  # the depth of recursion).
> +  #
> +  class DefaultThreadPool
> +    include Singleton
> +
> +    DEFAULT_THREAD_SIZE = 10
> +
> +    # Size of the thread pool, must be set before getting the thread pool or
> +    # calling parallel_map/parallel_each.  Does not (but could be modified 
> to)
> +    # support dynamic resizing. To get fully synchronous behavior set this 
> equal to
> +    # zero rather than one since the caller will get work if the threads are
> +    # busy.
> +    #
> +    # @return [Integer] number of threads
> +    attr_accessor :threads
> +
> +    # Memoizing accessor for the thread pool
> +    #
> +    # @return [Concurrent::ThreadPoolExecutor] the thread pool
> +    def pool
> +      @pool ||= Concurrent::ThreadPoolExecutor.new(
> +        min_threads: threads || DEFAULT_THREAD_SIZE,
> +        max_threads: threads || DEFAULT_THREAD_SIZE,
> +        max_queue: 0,
> +        # "synchronous" redefines the 0 in max_queue to mean 'no queue' 
> instead of 'infinite queue'
> +        # it does not mean synchronous execution (no threads) but 
> synchronous offload to the threads.
> +        synchronous: true,
> +        # this prevents deadlocks on recursive parallel usage
> +        fallback_policy: :caller_runs
> +      )
> +    end
> +  end
> +end
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils/version.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils/version.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils/version.rb 2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils/version.rb 2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,5 +1,5 @@
>  # frozen_string_literal: true
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -16,5 +16,5 @@
> 
>  module ChefUtils
>    CHEFUTILS_ROOT = File.expand_path("..", __dir__)
> -  VERSION = "16.12.3"
> +  VERSION = "19.2.12"
>  end
> diff -Nru ruby-chef-utils-16.12.3/lib/chef-utils.rb 
> ruby-chef-utils-19.2.12/lib/chef-utils.rb
> --- ruby-chef-utils-16.12.3/lib/chef-utils.rb 2021-04-09 10:56:49.000000000 
> +0200
> +++ ruby-chef-utils-19.2.12/lib/chef-utils.rb 2026-06-03 12:04:51.000000000 
> +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -17,6 +17,7 @@
>  #
> 
>  require_relative "chef-utils/dsl/architecture"
> +require_relative "chef-utils/dsl/backend"
>  require_relative "chef-utils/dsl/cloud"
>  require_relative "chef-utils/dsl/introspection"
>  require_relative "chef-utils/dsl/os"
> diff -Nru ruby-chef-utils-16.12.3/spec/unit/dsl/architecture_spec.rb 
> ruby-chef-utils-19.2.12/spec/unit/dsl/architecture_spec.rb
> --- ruby-chef-utils-16.12.3/spec/unit/dsl/architecture_spec.rb        
> 2021-04-09 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/spec/unit/dsl/architecture_spec.rb        
> 2026-06-03 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> diff -Nru ruby-chef-utils-16.12.3/spec/unit/dsl/cloud_spec.rb 
> ruby-chef-utils-19.2.12/spec/unit/dsl/cloud_spec.rb
> --- ruby-chef-utils-16.12.3/spec/unit/dsl/cloud_spec.rb       2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/spec/unit/dsl/cloud_spec.rb       2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -17,7 +17,6 @@
>  #
> 
>  require "spec_helper"
> -require "fauxhai"
> 
>  def cloud_reports_true_for(*args, node:)
>    args.each do |method|
> @@ -45,6 +44,10 @@
>      end
>    end
> 
> +  context "on alibaba" do
> +    cloud_reports_true_for(:cloud?, :alibaba?, node: { "alibaba" => {}, 
> "cloud" => {} })
> +  end
> +
>    context "on ec2" do
>      cloud_reports_true_for(:cloud?, :ec2?, node: { "ec2" => {}, "cloud" => 
> {} })
>    end
> @@ -81,6 +84,10 @@
>      cloud_reports_true_for(:cloud?, :softlayer?, node: { "softlayer" => {}, 
> "cloud" => {} })
>    end
> 
> +  context "on oci" do
> +    cloud_reports_true_for(:cloud?, :oci?, node: { "oci" => {}, "cloud" => 
> {} })
> +  end
> +
>    context "on virtualbox" do
>      it "does not return true for cloud?" do
>        expect(described_class.cloud?({ "virtualbox" => {}, "cloud" => nil 
> })).to be false
> diff -Nru ruby-chef-utils-16.12.3/spec/unit/dsl/dsl_spec.rb 
> ruby-chef-utils-19.2.12/spec/unit/dsl/dsl_spec.rb
> --- ruby-chef-utils-16.12.3/spec/unit/dsl/dsl_spec.rb 2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/spec/unit/dsl/dsl_spec.rb 2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> diff -Nru ruby-chef-utils-16.12.3/spec/unit/dsl/introspection_spec.rb 
> ruby-chef-utils-19.2.12/spec/unit/dsl/introspection_spec.rb
> --- ruby-chef-utils-16.12.3/spec/unit/dsl/introspection_spec.rb       
> 2021-04-09 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/spec/unit/dsl/introspection_spec.rb       
> 2026-06-03 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -32,6 +32,18 @@
> 
>    let(:test_instance) { IntrospectionTestClass.new(node) }
> 
> +  context "#effortless?" do
> +    # FIXME: use a real VividMash for these tests instead of stubbing
> +    it "is false by default" do
> +      expect(node).to receive(:read).with("chef_packages", "chef", 
> "chef_effortless").and_return(nil)
> +      expect(ChefUtils.effortless?(node)).to be false
> +    end
> +    it "is true when ohai reports a effortless" do
> +      expect(node).to receive(:read).with("chef_packages", "chef", 
> "chef_effortless").and_return(true)
> +      expect(ChefUtils.effortless?(node)).to be true
> +    end
> +  end
> +
>    context "#docker?" do
>      # FIXME: use a real VividMash for these tests instead of stubbing
>      it "is false by default" do
> diff -Nru ruby-chef-utils-16.12.3/spec/unit/dsl/os_spec.rb 
> ruby-chef-utils-19.2.12/spec/unit/dsl/os_spec.rb
> --- ruby-chef-utils-16.12.3/spec/unit/dsl/os_spec.rb  2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/spec/unit/dsl/os_spec.rb  2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> diff -Nru ruby-chef-utils-16.12.3/spec/unit/dsl/path_sanity_spec.rb 
> ruby-chef-utils-19.2.12/spec/unit/dsl/path_sanity_spec.rb
> --- ruby-chef-utils-16.12.3/spec/unit/dsl/path_sanity_spec.rb 2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/spec/unit/dsl/path_sanity_spec.rb 2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -79,7 +79,7 @@
>      end
> 
>      it "prepends to an existing path" do
> -      env = { "PATH" => 
> '%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\\'
>  }
> +      env = { "PATH" => 
> "%SystemRoot%\\system32;%SystemRoot%;%SystemRoot%\\System32\\Wbem;%SYSTEMROOT%\\System32\\WindowsPowerShell\\v1.0\\"
>  }
>        expect(test_instance.default_paths(env)).to 
> eql("#{Gem.bindir};#{RbConfig::CONFIG["bindir"]};%SystemRoot%\\system32;%SystemRoot%;%SystemRoot%\\System32\\Wbem;%SYSTEMROOT%\\System32\\WindowsPowerShell\\v1.0\\")
>      end
>    end
> diff -Nru ruby-chef-utils-16.12.3/spec/unit/dsl/platform_family_spec.rb 
> ruby-chef-utils-19.2.12/spec/unit/dsl/platform_family_spec.rb
> --- ruby-chef-utils-16.12.3/spec/unit/dsl/platform_family_spec.rb     
> 2021-04-09 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/spec/unit/dsl/platform_family_spec.rb     
> 2026-06-03 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -25,7 +25,7 @@
>        expect(described_class.send(method, node)).to be true
>      end
>    end
> -  (PLATFORM_FAMILY_HELPERS - [ :windows_ruby? ] - args).each do |method|
> +  (PLATFORM_FAMILY_HELPERS - %i{windows_ruby? macos_ruby?} - args).each do 
> |method|
>      it "reports false for #{method}" do
>        expect(described_class.send(method, node)).to be false
>      end
> @@ -41,7 +41,7 @@
>      end
>    end
> 
> -  ( PLATFORM_FAMILY_HELPERS - [ :windows_ruby? ]).each do |helper|
> +  ( PLATFORM_FAMILY_HELPERS - %i{windows_ruby? macos_ruby?}).each do |helper|
>      it "has the #{helper} in the ChefUtils module" do
>        expect(ChefUtils).to respond_to(helper)
>      end
> @@ -90,13 +90,13 @@
>    end
> 
>    context "on centos6" do
> -    let(:options) { { platform: "centos", version: "6.10" } }
> +    let(:options) { { platform: "centos", version: "6" } }
> 
>      pf_reports_true_for(:rhel?, :rpm_based?, :fedora_derived?, 
> :redhat_based?, :el?, :rhel6?)
>    end
> 
>    context "on centos7" do
> -    let(:options) { { platform: "centos", version: "7.7.1908" } }
> +    let(:options) { { platform: "centos", version: "7" } }
> 
>      pf_reports_true_for(:rhel?, :rpm_based?, :fedora_derived?, 
> :redhat_based?, :el?, :rhel7?)
>    end
> @@ -108,7 +108,7 @@
>    end
> 
>    context "on clearos7" do
> -    let(:options) { { platform: "clearos", version: "7.4" } }
> +    let(:options) { { platform: "clearos", version: "7" } }
> 
>      pf_reports_true_for(:rhel?, :rpm_based?, :fedora_derived?, 
> :redhat_based?, :el?, :rhel7?)
>    end
> @@ -156,25 +156,25 @@
>    end
> 
>    context "on oracle6" do
> -    let(:options) { { platform: "oracle", version: "6.10" } }
> +    let(:options) { { platform: "oracle", version: "6" } }
> 
>      pf_reports_true_for(:rhel?, :rpm_based?, :fedora_derived?, 
> :redhat_based?, :el?, :rhel6?)
>    end
> 
>    context "on oracle7" do
> -    let(:options) { { platform: "oracle", version: "7.6" } }
> +    let(:options) { { platform: "oracle", version: "7" } }
> 
>      pf_reports_true_for(:rhel?, :rpm_based?, :fedora_derived?, 
> :redhat_based?, :el?, :rhel7?)
>    end
> 
>    context "on redhat6" do
> -    let(:options) { { platform: "redhat", version: "6.10" } }
> +    let(:options) { { platform: "redhat", version: "6" } }
> 
>      pf_reports_true_for(:rhel?, :rpm_based?, :fedora_derived?, 
> :redhat_based?, :el?, :rhel6?)
>    end
> 
>    context "on redhat7" do
> -    let(:options) { { platform: "redhat", version: "7.6" } }
> +    let(:options) { { platform: "redhat", version: "7" } }
> 
>      pf_reports_true_for(:rhel?, :rpm_based?, :fedora_derived?, 
> :redhat_based?, :el?, :rhel7?)
>    end
> @@ -210,7 +210,7 @@
>    end
> 
>    context "node-independent windows APIs" do
> -    if RUBY_PLATFORM.match?(/mswin|mingw32|windows/)
> +    if RUBY_PLATFORM.match?(/mswin|mingw|windows/)
>        it "reports true for :windows_ruby?" do
>          expect(described_class.windows_ruby?).to be true
>        end
> @@ -220,4 +220,16 @@
>        end
>      end
>    end
> +
> +  context "node-independent mac APIs" do
> +    if RUBY_PLATFORM.match?(/darwin/)
> +      it "reports true for :macos_ruby?" do
> +        expect(described_class.macos_ruby?).to be true
> +      end
> +    else
> +      it "reports false for :macos_ruby?" do
> +        expect(described_class.macos_ruby?).to be false
> +      end
> +    end
> +  end
>  end
> diff -Nru ruby-chef-utils-16.12.3/spec/unit/dsl/platform_spec.rb 
> ruby-chef-utils-19.2.12/spec/unit/dsl/platform_spec.rb
> --- ruby-chef-utils-16.12.3/spec/unit/dsl/platform_spec.rb    2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/spec/unit/dsl/platform_spec.rb    2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -145,6 +145,20 @@
>      platform_reports_true_for(:centos?, :centos_platform?)
>    end
> 
> +  context "on centos stream w/o os_release" do
> +    let(:options) { { platform: "centos" } }
> +    let(:node) { { "platform" => "centos", "platform_version" => "8", 
> "platform_family" => "rhel", "os" => "linux", "lsb" => { "id" => 
> "CentOSStream" }, "os_release" => nil } }
> +
> +    platform_reports_true_for(:centos?, :centos_platform?, 
> :centos_stream_platform?)
> +  end
> +
> +  context "on centos stream w/ os_release" do
> +    let(:options) { { platform: "centos" } }
> +    let(:node) { { "platform" => "centos", "platform_version" => "8", 
> "platform_family" => "rhel", "os" => "linux", "os_release" => { "name" => 
> "CentOS Stream" } } }
> +
> +    platform_reports_true_for(:centos?, :centos_platform?, 
> :centos_stream_platform?)
> +  end
> +
>    context "on clearos" do
>      let(:options) { { platform: "clearos" } }
> 
> diff -Nru ruby-chef-utils-16.12.3/spec/unit/dsl/service_spec.rb 
> ruby-chef-utils-19.2.12/spec/unit/dsl/service_spec.rb
> --- ruby-chef-utils-16.12.3/spec/unit/dsl/service_spec.rb     2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/spec/unit/dsl/service_spec.rb     2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> diff -Nru ruby-chef-utils-16.12.3/spec/unit/dsl/virtualization_spec.rb 
> ruby-chef-utils-19.2.12/spec/unit/dsl/virtualization_spec.rb
> --- ruby-chef-utils-16.12.3/spec/unit/dsl/virtualization_spec.rb      
> 2021-04-09 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/spec/unit/dsl/virtualization_spec.rb      
> 2026-06-03 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> @@ -17,7 +17,6 @@
>  #
> 
>  require "spec_helper"
> -require "fauxhai"
> 
>  def virtualization_reports_true_for(*args, node:)
>    args.each do |method|
> @@ -45,6 +44,9 @@
>      end
>    end
> 
> +  context "on hyperv" do
> +    virtualization_reports_true_for(:guest?, :virtual?, :hyperv?, node: { 
> "virtualization" => { "system" => "hyperv", "role" => "guest" } })
> +  end
>    context "on kvm" do
>      virtualization_reports_true_for(:guest?, :virtual?, :kvm?, node: { 
> "virtualization" => { "system" => "kvm",  "role" => "guest" } })
>      virtualization_reports_true_for(:hypervisor?, :physical?, :kvm_host?, 
> node: { "virtualization" => { "system" => "kvm", "role" => "host" } })
> diff -Nru ruby-chef-utils-16.12.3/spec/unit/dsl/which_spec.rb 
> ruby-chef-utils-19.2.12/spec/unit/dsl/which_spec.rb
> --- ruby-chef-utils-16.12.3/spec/unit/dsl/which_spec.rb       2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/spec/unit/dsl/which_spec.rb       2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> diff -Nru ruby-chef-utils-16.12.3/spec/unit/dsl/windows_spec.rb 
> ruby-chef-utils-19.2.12/spec/unit/dsl/windows_spec.rb
> --- ruby-chef-utils-16.12.3/spec/unit/dsl/windows_spec.rb     2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/spec/unit/dsl/windows_spec.rb     2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,6 +1,6 @@
>  # frozen_string_literal: true
>  #
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> diff -Nru ruby-chef-utils-16.12.3/spec/unit/mash_spec.rb 
> ruby-chef-utils-19.2.12/spec/unit/mash_spec.rb
> --- ruby-chef-utils-16.12.3/spec/unit/mash_spec.rb    2021-04-09 
> 10:56:49.000000000 +0200
> +++ ruby-chef-utils-19.2.12/spec/unit/mash_spec.rb    2026-06-03 
> 12:04:51.000000000 +0200
> @@ -1,7 +1,7 @@
>  # frozen_string_literal: true
>  #
>  # Author:: Matthew Kent (<[email protected]>)
> -# Copyright:: Copyright (c) Chef Software Inc.
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
>  # License:: Apache License, Version 2.0
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
> diff -Nru ruby-chef-utils-16.12.3/spec/unit/parallel_map_spec.rb 
> ruby-chef-utils-19.2.12/spec/unit/parallel_map_spec.rb
> --- ruby-chef-utils-16.12.3/spec/unit/parallel_map_spec.rb    1970-01-01 
> 01:00:00.000000000 +0100
> +++ ruby-chef-utils-19.2.12/spec/unit/parallel_map_spec.rb    2026-06-03 
> 12:04:51.000000000 +0200
> @@ -0,0 +1,156 @@
> +# frozen_string_literal: true
> +#
> +# Copyright:: Copyright (c) 2009-2026 Progress Software Corporation and/or 
> its subsidiaries or affiliates. All Rights Reserved.
> +# License:: Apache License, Version 2.0
> +#
> +# Licensed under the Apache License, Version 2.0 (the "License");
> +# you may not use this file except in compliance with the License.
> +# You may obtain a copy of the License at
> +#
> +#     http://www.apache.org/licenses/LICENSE-2.0
> +#
> +# Unless required by applicable law or agreed to in writing, software
> +# distributed under the License is distributed on an "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> +# See the License for the specific language governing permissions and
> +# limitations under the License.
> +#
> +
> +require "chef-utils/parallel_map"
> +
> +using ChefUtils::ParallelMap
> +
> +RSpec.describe ChefUtils::ParallelMap do
> +
> +  shared_examples_for "common parallel API tests" do
> +
> +    before(:each) do
> +      ChefUtils::DefaultThreadPool.instance.instance_variable_set(:@pool, 
> nil)
> +      ChefUtils::DefaultThreadPool.instance.threads = threads
> +    end
> +
> +    after(:each) do
> +      ChefUtils::DefaultThreadPool.instance.instance_variable_set(:@pool, 
> nil)
> +    end
> +
> +    it "parallel_map runs in parallel" do
> +      # this is implicitly also testing that we run in the caller when we 
> exhaust threads by running threads+1
> +      val = threads + 1
> +      ret = []
> +      start = Time.now
> +      (1..val).parallel_map do |i|
> +        loop do
> +          if val == i
> +            ret << i
> +            val -= 1
> +            break
> +          end
> +          # we spin for quite awhile to wait for very slow testers if we 
> have to
> +          if Time.now - start > 30
> +            raise "timed out; deadlocked due to lack of parallelization?"
> +          end
> +
> +          # need to sleep a tiny bit to let other threads schedule
> +          sleep 0.000001
> +        end
> +      end
> +      expected = (1..threads + 1).to_a.reverse
> +      expect(ret).to eql(expected)
> +    end
> +
> +    it "parallel_each runs in parallel" do
> +      # this is implicitly also testing that we run in the caller when we 
> exhaust threads by running threads+1
> +      val = threads + 1
> +      ret = []
> +      start = Time.now
> +      (1..val).parallel_each do |i|
> +        loop do
> +          if val == i
> +            ret << i
> +            val -= 1
> +            break
> +          end
> +          # we spin for quite awhile to wait for very slow testers if we 
> have to
> +          if Time.now - start > 30
> +            raise "timed out; deadlocked due to lack of parallelization?"
> +          end
> +
> +          # need to sleep a tiny bit to let other threads schedule
> +          sleep 0.000001
> +        end
> +      end
> +      expected = (1..threads + 1).to_a.reverse
> +      expect(ret).to eql(expected)
> +    end
> +
> +    it "parallel_map throws exceptions" do
> +      expect { (0..10).parallel_map { |i| raise "boom" } }.to 
> raise_error(RuntimeError)
> +    end
> +
> +    it "parallel_each throws exceptions" do
> +      expect { (0..10).parallel_each { |i| raise "boom" } }.to 
> raise_error(RuntimeError)
> +    end
> +
> +    it "parallel_map runs" do
> +      ans = Timeout.timeout(30) do
> +        (1..10).parallel_map { |i| i }
> +      end
> +      expect(ans).to eql((1..10).to_a)
> +    end
> +
> +    it "parallel_each runs" do
> +      Timeout.timeout(30) do
> +        (1..10).parallel_each { |i| i }
> +      end
> +    end
> +
> +    it "recursive parallel_map will not deadlock" do
> +      ans = Timeout.timeout(30) do
> +        (1..2).parallel_map { |i| (1..2).parallel_map { |i| i } }
> +      end
> +      expect(ans).to eql([[1, 2], [1, 2]])
> +    end
> +
> +    it "recursive parallel_each will not deadlock" do
> +      Timeout.timeout(30) do
> +        (1..2).parallel_each { |i| (1..2).parallel_each { |i| i } }
> +      end
> +    end
> +
> +    it "parallel_map is lazy" do
> +      ans = Timeout.timeout(30) do
> +        (1..).lazy.parallel_map { |i| i }.first(5)
> +      end
> +      expect(ans).to eql((1..5).to_a)
> +    end
> +
> +    it "parallel_each is lazy" do
> +      Timeout.timeout(30) do
> +        (1..).lazy.parallel_each { |i| i }.first(5)
> +      end
> +    end
> +  end
> +
> +  context "with 10 threads" do
> +    let(:threads) { 10 }
> +    it_behaves_like "common parallel API tests"
> +  end
> +
> +  context "with 0 threads" do
> +    let(:threads) { 0 }
> +    it_behaves_like "common parallel API tests"
> +  end
> +
> +  context "with 1 threads" do
> +    let(:threads) { 1 }
> +    it_behaves_like "common parallel API tests"
> +  end
> +
> +  context "flat_each" do
> +    it "runs each over items which are nested one level" do
> +      sum = 0
> +      [ [ 1, 2 ], [3, 4]].flat_each { |i| sum += i }
> +      expect(sum).to eql(10)
> +    end
> +  end
> +end
>

Reply via email to