ruby-pwsh 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd8ad4546d9fbdc7bf62c17f8132adb9647e311e9e3319b22b5161f924fd94c3
4
- data.tar.gz: c607771ae691c4593b839cc1134d3e0fcc15b0a454eef93a3b146301d13b3411
3
+ metadata.gz: eb7a2c9a103865f74de54ae3a977a70382a2b18ff2e1f8f830b25ef50f4ba1d2
4
+ data.tar.gz: 7ca9acbd7478367673a8f761a0b51ddf5f0359246b3ca72f7fe9b8e4c3da34a6
5
5
  SHA512:
6
- metadata.gz: e8efb9f23a1fe2302369938416d08e463c4c5e088712dac293b10f0e8abc09431f91057039f95f918382e4775b932da4ab270901591f58d834a01c1d784d4fe6
7
- data.tar.gz: 788c3c601d46c37478b41abe5a068eac7da7c0912ec71f703841f4d462a3363d2c613bbeb8356b6a38b21a3870eec0d567e4bfa2d2892a40aadd1e4a62dc38e1
6
+ metadata.gz: 830c6e92076e50675f1ce02445f9fd9952545987af24e152bb164b11223d35d47d3619c997bf51b9b09293b22d69d2c832e689f59cfbad1118663203af374046
7
+ data.tar.gz: 5e107bcb95cc294f2c421d565c3376b21a7272b4bd4e4c32684f4481577398e2fa54c5005f8e6d990a7d9ffebf2db5eca5dbdb7eba2b2c7ddb2660ca65315f04
data/.rubocop.yml CHANGED
@@ -18,6 +18,9 @@ AllCops:
18
18
  Style/ClassAndModuleChildren:
19
19
  Enabled: false
20
20
 
21
+ Layout/LineLength:
22
+ Max: 196
23
+
21
24
  ####################################################
22
25
  # Cops below here due for deprecation
23
26
  ####################################################
@@ -5,7 +5,7 @@ require 'ruby-pwsh'
5
5
  require 'pathname'
6
6
  require 'json'
7
7
 
8
- class Puppet::Provider::DscBaseProvider
8
+ class Puppet::Provider::DscBaseProvider # rubocop:disable Metrics/ClassLength
9
9
  # Initializes the provider, preparing the instance variables which cache:
10
10
  # - the canonicalized resources across calls
11
11
  # - query results
@@ -244,6 +244,7 @@ class Puppet::Provider::DscBaseProvider
244
244
  script_content = ps_script_content(resource)
245
245
  context.debug("Script:\n #{redact_secrets(script_content)}")
246
246
  output = ps_manager.execute(remove_secret_identifiers(script_content))[:stdout]
247
+
247
248
  if output.nil?
248
249
  context.err('Nothing returned')
249
250
  return nil
@@ -256,8 +257,10 @@ class Puppet::Provider::DscBaseProvider
256
257
  return nil
257
258
  end
258
259
  context.debug("raw data received: #{data.inspect}")
260
+ collision_error_matcher = /The Invoke-DscResource cmdlet is in progress and must return before Invoke-DscResource can be invoked/
259
261
 
260
262
  error = data['errormessage']
263
+
261
264
  unless error.nil? || error.empty?
262
265
  # NB: We should have a way to stop processing this resource *now* without blowing up the whole Puppet run
263
266
  # Raising an error stops processing but blows things up while context.err alerts but continues to process
@@ -267,6 +270,11 @@ class Puppet::Provider::DscBaseProvider
267
270
  @logon_failures << name_hash[:dsc_psdscrunascredential].dup
268
271
  # This is a hack to handle the query cache to prevent a second lookup
269
272
  @cached_query_results << name_hash # if fetch_cached_hashes(@cached_query_results, [data]).empty?
273
+ elsif error.match?(collision_error_matcher)
274
+ context.notice('Invoke-DscResource collision detected: Please stagger the timing of your Puppet runs as this can lead to unexpected behaviour.')
275
+ retry_invoke_dsc_resource(context, 5, 60, collision_error_matcher) do
276
+ data = ps_manager.execute(remove_secret_identifiers(script_content))[:stdout]
277
+ end
270
278
  else
271
279
  context.err(error)
272
280
  end
@@ -276,6 +284,43 @@ class Puppet::Provider::DscBaseProvider
276
284
  data
277
285
  end
278
286
 
287
+ # Retries Invoke-DscResource when returned error matches error regex supplied as param.
288
+ # @param context [Object] the Puppet runtime context to operate in and send feedback to
289
+ # @param max_retry_count [Int] max number of times to retry Invoke-DscResource
290
+ # @param retry_wait_interval_secs [Int] Time delay between retries
291
+ # @param error_matcher [String] the regex pattern to match with error
292
+ def retry_invoke_dsc_resource(context, max_retry_count, retry_wait_interval_secs, error_matcher)
293
+ try = 0
294
+ while try < max_retry_count
295
+ try += 1
296
+ # notify and wait for retry interval
297
+ context.notice("Sleeping for #{retry_wait_interval_secs} seconds.")
298
+ sleep retry_wait_interval_secs
299
+ # notify and retry
300
+ context.notice("Retrying: attempt #{try} of #{max_retry_count}.")
301
+ data = JSON.parse(yield)
302
+ # if no error, break
303
+ if data['errormessage'].nil?
304
+ break
305
+ # check if error matches error matcher supplied
306
+ elsif data['errormessage'].match?(error_matcher)
307
+ # if last attempt, return error
308
+ if try == max_retry_count
309
+ context.notice("Attempt #{try} of #{max_retry_count} failed. No more retries.")
310
+ # all attempts failed, raise error
311
+ return context.err(data['errormessage'])
312
+ end
313
+ # if not last attempt, notify, continue and retry
314
+ context.notice("Attempt #{try} of #{max_retry_count} failed.")
315
+ next
316
+ else
317
+ # if we get an unexpected error, return
318
+ return context.err(data['errormessage'])
319
+ end
320
+ end
321
+ data
322
+ end
323
+
279
324
  # Determine if the DSC Resource is in the desired state, invoking the `Test` method unless it's
280
325
  # already been run for the resource, in which case reuse the result instead of checking for each
281
326
  # property. This behavior is only triggered if the validation_mode is set to resource; by default
@@ -666,7 +711,7 @@ class Puppet::Provider::DscBaseProvider
666
711
  # @param resource [Hash] a hash with the information needed to run `Invoke-DscResource`
667
712
  # @return [String] A multi-line string which sets the PSModulePath at the system level
668
713
  def munge_psmodulepath(resource)
669
- vendor_path = resource[:vendored_modules_path].tr('/', '\\')
714
+ vendor_path = resource[:vendored_modules_path]&.tr('/', '\\')
670
715
  <<~MUNGE_PSMODULEPATH.strip
671
716
  $UnmungedPSModulePath = [System.Environment]::GetEnvironmentVariable('PSModulePath','machine')
672
717
  $MungedPSModulePath = $env:PSModulePath + ';#{vendor_path}'
data/lib/pwsh/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Pwsh
4
4
  # The version of the ruby-pwsh gem
5
- VERSION = '1.0.1'
5
+ VERSION = '1.1.0'
6
6
  end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ if ENV['COVERAGE'] == 'yes'
4
+ begin
5
+ require 'simplecov'
6
+ require 'simplecov-console'
7
+
8
+ SimpleCov.formatters = [
9
+ SimpleCov::Formatter::HTMLFormatter,
10
+ SimpleCov::Formatter::Console
11
+ ]
12
+
13
+ SimpleCov.start do
14
+ track_files 'lib/**/*.rb'
15
+
16
+ add_filter '/spec'
17
+ add_filter 'lib/pwsh/version.rb'
18
+
19
+ # do not track vendored files
20
+ add_filter '/vendor'
21
+ add_filter '/.vendor'
22
+ end
23
+ rescue LoadError
24
+ raise 'Add the simplecov & simplecov-console gems to Gemfile to enable this task'
25
+ end
26
+ end
27
+
3
28
  require 'bundler/setup'
4
29
  require 'ruby-pwsh'
5
30
 
@@ -2,23 +2,24 @@
2
2
 
3
3
  require 'spec_helper'
4
4
  require 'puppet/type'
5
+ require 'puppet/resource_api'
5
6
  require 'puppet/provider/dsc_base_provider/dsc_base_provider'
6
7
  require 'json'
7
8
 
8
9
  RSpec.describe Puppet::Provider::DscBaseProvider do
9
10
  subject(:provider) { described_class.new }
10
11
 
11
- let(:context) { instance_double(Puppet::ResourceApi::PuppetContext) }
12
- let(:type) { instance_double(Puppet::ResourceApi::TypeDefinition) }
12
+ let(:context) { instance_double(Puppet::ResourceApi::BaseContext, 'context') }
13
+ let(:type) { instance_double(Puppet::ResourceApi::TypeDefinition, 'typedef') }
13
14
  let(:ps_manager) { instance_double(Pwsh::Manager) }
14
15
  let(:execute_response) { { stdout: nil, stderr: nil, exitcode: 0 } }
15
16
 
16
17
  # Reset the caches after each run
17
18
  after do
18
- described_class.instance_variable_set(:@cached_canonicalized_resource, [])
19
- described_class.instance_variable_set(:@cached_query_results, [])
20
- described_class.instance_variable_set(:@cached_test_results, [])
21
- described_class.instance_variable_set(:@logon_failures, [])
19
+ provider.instance_variable_set(:@cached_canonicalized_resource, [])
20
+ provider.instance_variable_set(:@cached_query_results, [])
21
+ provider.instance_variable_set(:@cached_test_results, [])
22
+ provider.instance_variable_set(:@logon_failures, [])
22
23
  end
23
24
 
24
25
  describe '.initialize' do
@@ -28,27 +29,30 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
28
29
  end
29
30
 
30
31
  it 'initializes the cached_canonicalized_resource instance variable' do
31
- expect(described_class.instance_variable_get(:@cached_canonicalized_resource)).to eq([])
32
+ expect(provider.instance_variable_get(:@cached_canonicalized_resource)).to eq([])
32
33
  end
33
34
 
34
35
  it 'initializes the cached_query_results instance variable' do
35
- expect(described_class.instance_variable_get(:@cached_query_results)).to eq([])
36
+ expect(provider.instance_variable_get(:@cached_query_results)).to eq([])
36
37
  end
37
38
 
38
39
  it 'initializes the cached_test_results instance variable' do
39
- expect(described_class.instance_variable_get(:@cached_test_results)).to eq([])
40
+ expect(provider.instance_variable_get(:@cached_test_results)).to eq([])
40
41
  end
41
42
 
42
43
  it 'initializes the logon_failures instance variable' do
43
- expect(described_class.instance_variable_get(:@logon_failures)).to eq([])
44
+ expect(provider.instance_variable_get(:@logon_failures)).to eq([])
44
45
  end
45
46
  end
46
47
 
47
48
  describe '.cached_test_results' do
48
49
  let(:cache_value) { %w[foo bar] }
49
50
 
51
+ before do
52
+ provider.instance_variable_set(:@cached_test_results, cache_value)
53
+ end
54
+
50
55
  it 'returns the value of the @cached_test_results instance variable' do
51
- described_class.instance_variable_set(:@cached_test_results, cache_value)
52
56
  expect(provider.cached_test_results).to eq(cache_value)
53
57
  end
54
58
  end
@@ -237,11 +241,11 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
237
241
 
238
242
  describe '.get' do
239
243
  after do
240
- described_class.instance_variable_set(:@cached_canonicalized_resource, [])
244
+ provider.instance_variable_set(:@cached_canonicalized_resource, [])
241
245
  end
242
246
 
243
247
  it 'checks the cached results, returning if one exists for the specified names' do
244
- described_class.instance_variable_set(:@cached_canonicalized_resource, [])
248
+ provider.instance_variable_set(:@cached_canonicalized_resource, [])
245
249
  allow(context).to receive(:debug)
246
250
  expect(provider).to receive(:fetch_cached_hashes).with([], [{ name: 'foo' }]).and_return([{ name: 'foo', property: 'bar' }])
247
251
  expect(provider).not_to receive(:invoke_get_method)
@@ -249,7 +253,7 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
249
253
  end
250
254
 
251
255
  it 'adds mandatory properties to the name hash when calling invoke_get_method' do
252
- described_class.instance_variable_set(:@cached_canonicalized_resource, [{ name: 'foo', property: 'bar', dsc_some_parameter: 'baz' }])
256
+ provider.instance_variable_set(:@cached_canonicalized_resource, [{ name: 'foo', property: 'bar', dsc_some_parameter: 'baz' }])
253
257
  allow(context).to receive(:debug)
254
258
  expect(provider).to receive(:fetch_cached_hashes).with([], [{ name: 'foo' }]).and_return([])
255
259
  expect(provider).to receive(:namevar_attributes).and_return([:name]).exactly(3).times
@@ -530,7 +534,7 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
530
534
  end
531
535
 
532
536
  after do
533
- described_class.instance_variable_set(:@cached_query_results, nil)
537
+ provider.instance_variable_set(:@cached_query_results, [])
534
538
  end
535
539
 
536
540
  context 'when the invocation script returns data without errors' do
@@ -557,7 +561,7 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
557
561
 
558
562
  it 'caches the result' do
559
563
  expect { result }.not_to raise_error
560
- expect(described_class.instance_variable_get(:@cached_query_results)).to eq([result])
564
+ expect(provider.instance_variable_get(:@cached_query_results)).to eq([result])
561
565
  end
562
566
 
563
567
  it 'removes unrelated properties from the result' do
@@ -719,7 +723,7 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
719
723
  end
720
724
 
721
725
  after do
722
- described_class.instance_variable_set(:@logon_failures, [])
726
+ provider.instance_variable_set(:@logon_failures, [])
723
727
  end
724
728
 
725
729
  it 'errors specifically for a logon failure and returns nil' do
@@ -728,12 +732,12 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
728
732
 
729
733
  it 'caches the logon failure' do
730
734
  expect { result }.not_to raise_error
731
- expect(described_class.instance_variable_get(:@logon_failures)).to eq([credential_hash])
735
+ expect(provider.instance_variable_get(:@logon_failures)).to eq([credential_hash])
732
736
  end
733
737
 
734
738
  it 'caches the query results' do
735
739
  expect { result }.not_to raise_error
736
- expect(described_class.instance_variable_get(:@cached_query_results)).to eq([name_hash])
740
+ expect(provider.instance_variable_get(:@cached_query_results)).to eq([name_hash])
737
741
  end
738
742
  end
739
743
 
@@ -790,6 +794,44 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
790
794
  end
791
795
  end
792
796
 
797
+ context 'when the invocation script errors with a collision' do
798
+ it 'writes a notice via context and applies successfully on retry' do
799
+ expect(ps_manager).to receive(:execute).and_return({ stdout: '{"errormessage": "The Invoke-DscResource cmdlet is in progress and must return before Invoke-DscResource can be invoked"}' })
800
+ expect(context).to receive(:notice).with(/Invoke-DscResource collision detected: Please stagger the timing of your Puppet runs as this can lead to unexpected behaviour./).once
801
+ expect(context).to receive(:notice).with('Sleeping for 60 seconds.').twice
802
+ expect(context).to receive(:notice).with(/Retrying: attempt [1-2] of 5/).twice
803
+ expect(ps_manager).to receive(:execute).and_return({ stdout: '{"errormessage": "The Invoke-DscResource cmdlet is in progress and must return before Invoke-DscResource can be invoked"}' })
804
+ expect(context).to receive(:notice).with('Attempt 1 of 5 failed.')
805
+ allow(provider).to receive(:sleep)
806
+ expect(ps_manager).to receive(:execute).and_return({ stdout: '{"errormessage": null}' })
807
+ expect { result }.not_to raise_error
808
+ end
809
+
810
+ it 'writes a error via context and fails to apply when all retry attempts used' do
811
+ expect(ps_manager).to receive(:execute).and_return({ stdout: '{"errormessage": "The Invoke-DscResource cmdlet is in progress and must return before Invoke-DscResource can be invoked"}' })
812
+ .exactly(5).times
813
+ expect(context).to receive(:notice).with(/Invoke-DscResource collision detected: Please stagger the timing of your Puppet runs as this can lead to unexpected behaviour./).once
814
+ expect(context).to receive(:notice).with('Sleeping for 60 seconds.').exactly(5).times
815
+ expect(context).to receive(:notice).with(/Retrying: attempt [1-6] of 5/).exactly(5).times
816
+ expect(ps_manager).to receive(:execute).and_return({ stdout: '{"errormessage": "The Invoke-DscResource cmdlet is in progress and must return before Invoke-DscResource can be invoked"}' })
817
+ expect(context).to receive(:notice).with(/Attempt [1-6] of 5 failed/).exactly(5).times
818
+ expect(context).to receive(:err).with(/The Invoke-DscResource cmdlet is in progress and must return before Invoke-DscResource can be invoked/)
819
+ allow(provider).to receive(:sleep)
820
+ expect(result).to be_nil
821
+ end
822
+
823
+ it 'writes an error via context and fails to apply when encountering an unexpected error' do
824
+ expect(ps_manager).to receive(:execute).and_return({ stdout: '{"errormessage": "The Invoke-DscResource cmdlet is in progress and must return before Invoke-DscResource can be invoked"}' })
825
+ expect(context).to receive(:notice).with(/Invoke-DscResource collision detected: Please stagger the timing of your Puppet runs as this can lead to unexpected behaviour./).once
826
+ expect(context).to receive(:notice).with('Sleeping for 60 seconds.').once
827
+ expect(context).to receive(:notice).with(/Retrying: attempt 1 of 5/).once
828
+ allow(provider).to receive(:sleep)
829
+ expect(ps_manager).to receive(:execute).and_return({ stdout: '{"errormessage": "Some unexpected error"}' }).once
830
+ expect(context).to receive(:err).with(/Some unexpected error/)
831
+ expect(result).to be_nil
832
+ end
833
+ end
834
+
793
835
  context 'when the invocation script returns data without errors' do
794
836
  it 'filters for the correct properties to invoke and returns the results' do
795
837
  expect(ps_manager).to receive(:execute).with("Script: #{apply_props}").and_return({ stdout: '{"in_desired_state": true, "errormessage": null}' })
@@ -981,11 +1023,11 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
981
1023
  end
982
1024
 
983
1025
  describe '.invoke_test_method' do
984
- subject(:result) { provider.invoke_test_method(context, name, expect(subject).to) }
1026
+ subject(:result) { provider.invoke_test_method(context, name, should_hash) }
985
1027
 
986
1028
  let(:name) { { name: 'foo', dsc_name: 'bar' } }
987
- let(:should) { name.merge(dsc_ensure: 'present') }
988
- let(:test_properties) { expect(subject).to.reject { |k, _v| k == :name } }
1029
+ let(:should_hash) { name.merge(dsc_ensure: 'present') }
1030
+ let(:test_properties) { should_hash.reject { |k, _v| k == :name } }
989
1031
  let(:invoke_dsc_resource_data) { nil }
990
1032
 
991
1033
  before do
@@ -995,7 +1037,7 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
995
1037
  end
996
1038
 
997
1039
  after do
998
- described_class.instance_variable_set(:@cached_test_results, [])
1040
+ provider.instance_variable_set(:@cached_test_results, [])
999
1041
  end
1000
1042
 
1001
1043
  context 'when something went wrong calling Invoke-DscResource' do
@@ -1043,7 +1085,7 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
1043
1085
 
1044
1086
  describe '.instantiated_variables' do
1045
1087
  after do
1046
- described_class.instance_variable_set(:@instantiated_variables, [])
1088
+ provider.instance_variable_set(:@instantiated_variables, [])
1047
1089
  end
1048
1090
 
1049
1091
  it 'sets the instantiated_variables instance variable to {} if not initialized' do
@@ -1051,20 +1093,20 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
1051
1093
  end
1052
1094
 
1053
1095
  it 'returns the instantiated_variables instance variable if already initialized' do
1054
- described_class.instance_variable_set(:@instantiated_variables, { foo: 'bar' })
1096
+ provider.instance_variable_set(:@instantiated_variables, { foo: 'bar' })
1055
1097
  expect(provider.instantiated_variables).to eq({ foo: 'bar' })
1056
1098
  end
1057
1099
  end
1058
1100
 
1059
1101
  describe '.clear_instantiated_variables!' do
1060
1102
  after do
1061
- described_class.instance_variable_set(:@instantiated_variables, [])
1103
+ provider.instance_variable_set(:@instantiated_variables, [])
1062
1104
  end
1063
1105
 
1064
1106
  it 'sets the instantiated_variables instance variable to {}' do
1065
- described_class.instance_variable_set(:@instantiated_variables, { foo: 'bar' })
1107
+ provider.instance_variable_set(:@instantiated_variables, { foo: 'bar' })
1066
1108
  expect { provider.clear_instantiated_variables! }.not_to raise_error
1067
- expect(described_class.instance_variable_get(:@instantiated_variables)).to eq({})
1109
+ expect(provider.instance_variable_get(:@instantiated_variables)).to eq({})
1068
1110
  end
1069
1111
  end
1070
1112
 
@@ -1087,16 +1129,16 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
1087
1129
  end
1088
1130
 
1089
1131
  after do
1090
- described_class.instance_variable_set(:@logon_failures, [])
1132
+ provider.instance_variable_set(:@logon_failures, [])
1091
1133
  end
1092
1134
 
1093
1135
  it 'returns false if there have been no failed logons with the username/password combination' do
1094
- described_class.instance_variable_set(:@logon_failures, [bad_credential_hash])
1136
+ provider.instance_variable_set(:@logon_failures, [bad_credential_hash])
1095
1137
  expect(provider.logon_failed_already?(good_credential_hash)).to be(false)
1096
1138
  end
1097
1139
 
1098
1140
  it 'returns true if the username/password specified are found in the logon_failures instance variable' do
1099
- described_class.instance_variable_set(:@logon_failures, [good_credential_hash, bad_credential_hash])
1141
+ provider.instance_variable_set(:@logon_failures, [good_credential_hash, bad_credential_hash])
1100
1142
  expect(provider.logon_failed_already?(bad_credential_hash)).to be(true)
1101
1143
  end
1102
1144
  end
@@ -1437,16 +1479,18 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
1437
1479
  context 'when the resource does not have the dscmeta_resource_implementation key' do
1438
1480
  let(:test_resource) { {} }
1439
1481
 
1440
- it 'returns nil' do
1441
- expect(result).to be_nil
1482
+ it 'sets $UnmungedPSModulePath to the current PSModulePath' do
1483
+ # since https://github.com/puppetlabs/ruby-pwsh/pull/261 we load vendored path for MOF resources as well
1484
+ expect(result).to match(/\$UnmungedPSModulePath = .+GetEnvironmentVariable.+PSModulePath.+machine/)
1442
1485
  end
1443
1486
  end
1444
1487
 
1445
1488
  context "when the resource's dscmeta_resource_implementation is not 'Class'" do
1446
1489
  let(:test_resource) { { dscmeta_resource_implementation: 'MOF' } }
1447
1490
 
1448
- it 'returns nil' do
1449
- expect(result).to be_nil
1491
+ # since https://github.com/puppetlabs/ruby-pwsh/pull/261 we load vendored path for MOF resources as well
1492
+ it 'sets $UnmungedPSModulePath to the current PSModulePath' do
1493
+ expect(result).to match(/\$UnmungedPSModulePath = .+GetEnvironmentVariable.+PSModulePath.+machine/)
1450
1494
  end
1451
1495
  end
1452
1496
 
@@ -1510,7 +1554,7 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
1510
1554
  end
1511
1555
 
1512
1556
  after do
1513
- described_class.instance_variable_set(:@instantiated_variables, [])
1557
+ provider.instance_variable_set(:@instantiated_variables, [])
1514
1558
  end
1515
1559
 
1516
1560
  it 'writes the ruby representation of the credentials as the value of a key named for the new variable into the instantiated_variables cache' do
@@ -1543,7 +1587,7 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
1543
1587
  subject(:result) { provider.prepare_cim_instances(test_resource) }
1544
1588
 
1545
1589
  after do
1546
- described_class.instance_variable_set(:@instantiated_variables, [])
1590
+ provider.instance_variable_set(:@instantiated_variables, [])
1547
1591
  end
1548
1592
 
1549
1593
  context 'when a cim instance is passed without nested cim instances' do
@@ -1652,7 +1696,7 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
1652
1696
 
1653
1697
  describe '.format_ciminstance' do
1654
1698
  after do
1655
- described_class.instance_variable_set(:@instantiated_variables, [])
1699
+ provider.instance_variable_set(:@instantiated_variables, [])
1656
1700
  end
1657
1701
 
1658
1702
  it 'defines and returns a new cim instance as a PowerShell variable, passing the class name and property hash' do
@@ -1668,7 +1712,7 @@ RSpec.describe Puppet::Provider::DscBaseProvider do
1668
1712
  end
1669
1713
 
1670
1714
  it 'interpolates variables in the case of a cim instance containing a nested instance' do
1671
- described_class.instance_variable_set(:@instantiated_variables, { 'SomeVariable' => { 'bar' => 'ope' } })
1715
+ provider.instance_variable_set(:@instantiated_variables, { 'SomeVariable' => { 'bar' => 'ope' } })
1672
1716
  property_hash = { 'foo' => { 'bar' => 'ope' } }
1673
1717
  expect(provider.format_ciminstance('foo', 'SomeClass', property_hash)).to match(/@\{'foo' = \$SomeVariable\}/)
1674
1718
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-pwsh
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet, Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-12-13 00:00:00.000000000 Z
11
+ date: 2024-01-31 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: PowerShell code manager for ruby.
14
14
  email: