Bug#1134471: RFS: ruby-chef-utils/19.2.12-0.1 [RC] -- Basic utility functions for Core Chef Infra development

Norwid Behrnd <[email protected]>
Newsgroups gmane.linux.debian.devel.mentors
Message-ID <GjYlOzAjLcE1CRONlAFL2Ax0dpuG1jYai3A8an-P08KETtoRlFD6SbjAiYOoATd_OqDtduWY1POCiTnnl3L5r24ZhfhAP-hKgwOjtcd2f7g=__22525.9940301598$1780732313$gmane$org@protonmail.com>
------- 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
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.