ruby-pwsh 0.6.2 → 0.7.3

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: bde547f250bf8294f79418a4f2bdb085745ca28ccf9063ad5e8f9ebd64d65e06
4
- data.tar.gz: 5b8a638232f9b385dec03c585dbd499b91c04df1d3a3e08fbab895668fea4760
3
+ metadata.gz: e1fe9e2ecf92d6aee9019d08c83f4f7305b01bc71b83f9e9e5257731ff9896ae
4
+ data.tar.gz: b74e7adfde169c6e680ade91be04a587d67bf2345ded1f1ce0cd0a6b72984122
5
5
  SHA512:
6
- metadata.gz: 245d16db7ea15ff1d7fab3b23ddfb6eb13934062126043c0ec1cc9d3b824e2fe1635ec39b89f352925d8022fdc1ab0b140d085ba60631959302c5960bdd68080
7
- data.tar.gz: 7e2f20f08be81c6b72bcd8bd96736ab99cf4b8ebc4d7c0e1eaca5ce6906356be2c9fd6c459cc2ebdb2c704c024996f4214312b148191ce7959fa0318e7282a00
6
+ metadata.gz: 519329615ad73d4f7f07a96ea89dc9e1716aee185481e8644ae8d8f1f688fb91acf70ac53b0fe1f38533b5bf1e475e3f9f3cf6feb79a222af9c7dc5ca19af2a9
7
+ data.tar.gz: dbbbac000ca3ee3fd3f27e86592e76a9ae676e82aadc07fda35281774d835621f33880d435ae6abb70bf4e6c79f03c6396f88416c413c95a5dc77419dbdde037
data/CHANGELOG.md CHANGED
@@ -2,6 +2,54 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org).
4
4
 
5
+ ## [0.7.3](https://github.com/puppetlabs/ruby-pwsh/tree/0.7.3) (2021-02-03)
6
+
7
+ [Full Changelog](https://github.com/puppetlabs/ruby-pwsh/compare/0.7.2...0.7.3)
8
+
9
+ ### Fixed
10
+
11
+ - \(MAINT\) Place nil check when assigning is\_same [\#101](https://github.com/puppetlabs/ruby-pwsh/pull/101) ([bwilcox](https://github.com/bwilcox))
12
+
13
+ ## [0.7.2](https://github.com/puppetlabs/ruby-pwsh/tree/0.7.2) (2021-02-03)
14
+
15
+ [Full Changelog](https://github.com/puppetlabs/ruby-pwsh/compare/0.7.1...0.7.2)
16
+
17
+ ### Fixed
18
+
19
+ - \(GH-97\) Memoize class variables in initialize [\#98](https://github.com/puppetlabs/ruby-pwsh/pull/98) ([michaeltlombardi](https://github.com/michaeltlombardi))
20
+ - \(MAINT\) Ensure is\_same check works for nil manifest values [\#96](https://github.com/puppetlabs/ruby-pwsh/pull/96) ([bwilcox](https://github.com/bwilcox))
21
+
22
+ ## [0.7.1](https://github.com/puppetlabs/ruby-pwsh/tree/0.7.1) (2021-02-02)
23
+
24
+ [Full Changelog](https://github.com/puppetlabs/ruby-pwsh/compare/0.7.0...0.7.1)
25
+
26
+ ### Fixed
27
+
28
+ - \(MAINT\) Correctly canonicalize enumerable values in dsc [\#92](https://github.com/puppetlabs/ruby-pwsh/pull/92) ([michaeltlombardi](https://github.com/michaeltlombardi))
29
+ - \(MAINT\) Ensure vendored path check works with mix of module builds [\#91](https://github.com/puppetlabs/ruby-pwsh/pull/91) ([michaeltlombardi](https://github.com/michaeltlombardi))
30
+ - \(GH-84\) Fix empty array parameter check [\#90](https://github.com/puppetlabs/ruby-pwsh/pull/90) ([michaeltlombardi](https://github.com/michaeltlombardi))
31
+ - \(MAINT\) Minor fixes to CIM instance handling [\#89](https://github.com/puppetlabs/ruby-pwsh/pull/89) ([michaeltlombardi](https://github.com/michaeltlombardi))
32
+
33
+ ## [0.7.0](https://github.com/puppetlabs/ruby-pwsh/tree/0.7.0) (2021-01-20)
34
+
35
+ [Full Changelog](https://github.com/puppetlabs/ruby-pwsh/compare/0.6.3...0.7.0)
36
+
37
+ ### Added
38
+
39
+ - \(GH-75\) Including module name in vendored module path [\#85](https://github.com/puppetlabs/ruby-pwsh/pull/85) ([pmcmaw](https://github.com/pmcmaw))
40
+
41
+ ### Fixed
42
+
43
+ - Make root module path use puppetized module name [\#86](https://github.com/puppetlabs/ruby-pwsh/pull/86) ([michaeltlombardi](https://github.com/michaeltlombardi))
44
+
45
+ ## [0.6.3](https://github.com/puppetlabs/ruby-pwsh/tree/0.6.3) (2020-12-16)
46
+
47
+ [Full Changelog](https://github.com/puppetlabs/ruby-pwsh/compare/0.6.2...0.6.3)
48
+
49
+ ### Fixed
50
+
51
+ - \(MAINT\) Add handling for when dsc\_ensure is stripped [\#78](https://github.com/puppetlabs/ruby-pwsh/pull/78) ([michaeltlombardi](https://github.com/michaeltlombardi))
52
+
5
53
  ## [0.6.2](https://github.com/puppetlabs/ruby-pwsh/tree/0.6.2) (2020-12-09)
6
54
 
7
55
  [Full Changelog](https://github.com/puppetlabs/ruby-pwsh/compare/0.6.1...0.6.2)
@@ -11,9 +11,9 @@ class Puppet::Provider::DscBaseProvider
11
11
  # - query results
12
12
  # - logon failures
13
13
  def initialize
14
- @@cached_canonicalized_resource = []
15
- @@cached_query_results = []
16
- @@logon_failures = []
14
+ @@cached_canonicalized_resource ||= []
15
+ @@cached_query_results ||= []
16
+ @@logon_failures ||= []
17
17
  super
18
18
  end
19
19
 
@@ -61,7 +61,8 @@ class Puppet::Provider::DscBaseProvider
61
61
  downcased_result = recursively_downcase(canonicalized)
62
62
  downcased_resource = recursively_downcase(r)
63
63
  downcased_result.each do |key, value|
64
- canonicalized[key] = r[key] unless downcased_resource[key] == value
64
+ is_same = value.is_a?(Enumerable) & !downcased_resource[key].nil? ? downcased_resource[key].sort == value.sort : downcased_resource[key] == value
65
+ canonicalized[key] = r[key] unless is_same
65
66
  canonicalized.delete(key) unless downcased_resource.keys.include?(key)
66
67
  end
67
68
  # Cache the actually canonicalized resource separately
@@ -143,7 +144,8 @@ class Puppet::Provider::DscBaseProvider
143
144
  # HACK: If the DSC Resource is ensurable but doesn't report a default value
144
145
  # for ensure, we assume it to be `Present` - this is the most common pattern.
145
146
  should_ensure = should[:dsc_ensure].nil? ? 'Present' : should[:dsc_ensure].to_s
146
- is_ensure = is[:dsc_ensure].to_s
147
+ # HACK: Sometimes dsc_ensure is removed???? If it's gone, pretend it's absent??
148
+ is_ensure = is[:dsc_ensure].nil? ? 'Absent' : is[:dsc_ensure].to_s
147
149
 
148
150
  if is_ensure == 'Absent' && should_ensure == 'Present'
149
151
  context.creating(name) do
@@ -357,17 +359,49 @@ class Puppet::Provider::DscBaseProvider
357
359
  # Because Puppet adds all of the modules to the LOAD_PATH we can be sure that the appropriate module lives here during an apply;
358
360
  # PROBLEM: This currently uses the downcased name, we need to capture the module name in the metadata I think.
359
361
  # During a Puppet agent run, the code lives in the cache so we can use the file expansion to discover the correct folder.
360
- root_module_path = $LOAD_PATH.select { |path| path.match?(%r{#{resource[:dscmeta_module_name].downcase}/lib}) }.first
362
+ # This handles setting the vendored_modules_path to include the puppet module name; we now add the puppet module name into the
363
+ # path to allow multiple modules to with shared dsc_resources to be installed side by side
364
+ # The old vendored_modules_path: puppet_x/dsc_resources
365
+ # The new vendored_modules_path: puppet_x/<module_name>/dsc_resources
366
+ root_module_path = $LOAD_PATH.select { |path| path.match?(%r{#{puppetize_name(resource[:dscmeta_module_name])}/lib}) }.first
361
367
  resource[:vendored_modules_path] = if root_module_path.nil?
362
- File.expand_path(Pathname.new(__FILE__).dirname + '../../../' + 'puppet_x/dsc_resources') # rubocop:disable Style/StringConcatenation
368
+ File.expand_path(Pathname.new(__FILE__).dirname + '../../../' + "puppet_x/#{puppetize_name(resource[:dscmeta_module_name])}/dsc_resources") # rubocop:disable Style/StringConcatenation
363
369
  else
364
- File.expand_path("#{root_module_path}/puppet_x/dsc_resources")
370
+ File.expand_path("#{root_module_path}/puppet_x/#{puppetize_name(resource[:dscmeta_module_name])}/dsc_resources")
365
371
  end
372
+
373
+ # Check for the old vendored_modules_path second - if there is a mix of modules with the old and new pathing,
374
+ # checking for this first will always work and so the more specific search will never run.
375
+ unless File.exist? resource[:vendored_modules_path]
376
+ resource[:vendored_modules_path] = if root_module_path.nil?
377
+ File.expand_path(Pathname.new(__FILE__).dirname + '../../../' + 'puppet_x/dsc_resources') # rubocop:disable Style/StringConcatenation
378
+ else
379
+ File.expand_path("#{root_module_path}/puppet_x/dsc_resources")
380
+ end
381
+ end
382
+
383
+ # A warning is thrown if the something went wrong and the file was not created
384
+ raise "Unable to find expected vendored DSC Resource #{resource[:vendored_modules_path]}" unless File.exist? resource[:vendored_modules_path]
385
+
366
386
  resource[:attributes] = nil
387
+
367
388
  context.debug("should_to_resource: #{resource.inspect}")
368
389
  resource
369
390
  end
370
391
 
392
+ # Return a String containing a puppetized name. A puppetized name is a string that only
393
+ # includes lowercase letters, digits, underscores and cannot start with a digit.
394
+ #
395
+ # @return [String] with a puppeized module name
396
+ def puppetize_name(name)
397
+ # Puppet module names must be lower case
398
+ name = name.downcase
399
+ # Puppet module names must only include lowercase letters, digits and underscores
400
+ name = name.gsub(/[^a-z0-9_]/, '_')
401
+ # Puppet module names must not start with a number so if it does, append the letter 'a' to the name. Eg: '7zip' becomes 'a7zip'
402
+ name = name.match?(/^\d/) ? "a#{name}" : name # rubocop:disable Lint/UselessAssignment
403
+ end
404
+
371
405
  # Return a UUID with the dashes turned into underscores to enable the specifying of guaranteed-unique
372
406
  # variables in the PowerShell script.
373
407
  #
@@ -504,8 +538,8 @@ class Puppet::Provider::DscBaseProvider
504
538
  'user' => property_hash[:value]['user'],
505
539
  'password' => escape_quotes(property_hash[:value]['password'].unwrap)
506
540
  }
507
- instantiated_variables.merge!(variable_name => credential_hash)
508
541
  credentials_block << format_pscredential(variable_name, credential_hash)
542
+ instantiated_variables.merge!(variable_name => credential_hash)
509
543
  end
510
544
  credentials_block.join("\n")
511
545
  credentials_block == [] ? '' : credentials_block
@@ -532,6 +566,7 @@ class Puppet::Provider::DscBaseProvider
532
566
  cim_instances_block = []
533
567
  resource[:parameters].each do |_property_name, property_hash|
534
568
  next unless property_hash[:mof_is_embedded]
569
+ next if property_hash[:mof_type] == 'PSCredential' # Credentials are handled separately
535
570
 
536
571
  # strip dsc_ from the beginning of the property name declaration
537
572
  # name = property_name.to_s.gsub(/^dsc_/, '').to_sym
@@ -542,10 +577,10 @@ class Puppet::Provider::DscBaseProvider
542
577
  unless cim_instance_hashes.count.zero?
543
578
  cim_instance_hashes.each do |instance|
544
579
  variable_name = random_variable_name
545
- instantiated_variables.merge!(variable_name => instance)
546
580
  class_name = instance['cim_instance_type']
547
581
  properties = instance.reject { |k, _v| k == 'cim_instance_type' }
548
582
  cim_instances_block << format_ciminstance(variable_name, class_name, properties)
583
+ instantiated_variables.merge!(variable_name => instance)
549
584
  end
550
585
  end
551
586
  # We have to handle arrays of CIM instances slightly differently
@@ -553,14 +588,14 @@ class Puppet::Provider::DscBaseProvider
553
588
  class_name = property_hash[:mof_type].gsub('[]', '')
554
589
  property_hash[:value].each do |hash|
555
590
  variable_name = random_variable_name
556
- instantiated_variables.merge!(variable_name => hash)
557
591
  cim_instances_block << format_ciminstance(variable_name, class_name, hash)
592
+ instantiated_variables.merge!(variable_name => hash)
558
593
  end
559
594
  else
560
595
  variable_name = random_variable_name
561
- instantiated_variables.merge!(variable_name => property_hash[:value])
562
596
  class_name = property_hash[:mof_type]
563
597
  cim_instances_block << format_ciminstance(variable_name, class_name, property_hash[:value])
598
+ instantiated_variables.merge!(variable_name => property_hash[:value])
564
599
  end
565
600
  end
566
601
  cim_instances_block == [] ? '' : cim_instances_block.join("\n")
@@ -643,7 +678,7 @@ class Puppet::Provider::DscBaseProvider
643
678
  params_block = params_block.gsub("'[DateTime]", "[DateTime]'")
644
679
  # HACK: Handle intentionally empty arrays - need to strongly type them because
645
680
  # CIM instances do not do a consistent job of casting an empty array properly.
646
- empty_array_parameters = resource[:parameters].select { |_k, v| v[:value].empty? }
681
+ empty_array_parameters = resource[:parameters].select { |_k, v| v[:value].is_a?(Array) && v[:value].empty? }
647
682
  empty_array_parameters.each do |name, properties|
648
683
  param_block_name = name.to_s.gsub(/^dsc_/, '')
649
684
  params_block = params_block.gsub("#{param_block_name} = @()", "#{param_block_name} = [#{properties[:mof_type]}]@()")
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 = '0.6.2'
5
+ VERSION = '0.7.3'
6
6
  end
data/metadata.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "puppetlabs-pwshlib",
3
- "version": "0.6.2",
3
+ "version": "0.7.3",
4
4
  "author": "puppetlabs",
5
5
  "summary": "Provide library code for interoperating with PowerShell.",
6
6
  "license": "MIT",
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: 0.6.2
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet, Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-10 00:00:00.000000000 Z
11
+ date: 2021-02-03 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: PowerShell code manager for ruby.
14
14
  email: