ruby-pwsh 0.10.3 → 0.11.0.rc.1
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 +4 -4
- data/.rubocop.yml +16 -38
- data/lib/puppet/provider/dsc_base_provider/dsc_base_provider.rb +20 -20
- data/lib/pwsh/version.rb +1 -1
- data/lib/pwsh/windows_powershell.rb +2 -2
- data/lib/pwsh.rb +31 -34
- data/spec/acceptance/dsc/basic.rb +4 -0
- data/spec/acceptance/dsc/cim_instances.rb +3 -4
- data/spec/acceptance/dsc/class.rb +3 -3
- data/spec/acceptance/dsc/complex.rb +2 -2
- data/spec/acceptance/support/setup_winrm.ps1 +6 -0
- data/spec/unit/puppet/provider/dsc_base_provider/dsc_base_provider_spec.rb +171 -113
- data/spec/unit/pwsh/util_spec.rb +100 -93
- data/spec/unit/pwsh/version_spec.rb +2 -2
- data/spec/unit/pwsh/windows_powershell_spec.rb +18 -13
- data/spec/unit/pwsh_spec.rb +61 -63
- metadata +6 -5
data/spec/unit/pwsh/util_spec.rb
CHANGED
@@ -3,7 +3,90 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
RSpec.describe Pwsh::Util do
|
6
|
-
|
6
|
+
let(:snake_case_string) { 'this_is_a_string' }
|
7
|
+
let(:pascal_case_string) { 'ThisIsAString' }
|
8
|
+
let(:kebab_case_string) { 'this-is-a-string' }
|
9
|
+
let(:camel_case_string) { 'thisIsAString' }
|
10
|
+
let(:snake_case_hash_in_an_array) do
|
11
|
+
[
|
12
|
+
'just a string',
|
13
|
+
{
|
14
|
+
some_key: 'a value'
|
15
|
+
},
|
16
|
+
1,
|
17
|
+
{
|
18
|
+
another_key: {
|
19
|
+
nested_key: 1,
|
20
|
+
nested_array: [
|
21
|
+
1,
|
22
|
+
'another string',
|
23
|
+
{ super_nested_key: 'value' }
|
24
|
+
]
|
25
|
+
}
|
26
|
+
}
|
27
|
+
]
|
28
|
+
end
|
29
|
+
let(:snake_case_hash) do
|
30
|
+
{
|
31
|
+
a: 1,
|
32
|
+
apple_butter: %w[a b c],
|
33
|
+
some_key_value: {
|
34
|
+
nested_key: 1,
|
35
|
+
another_nested_key: 2
|
36
|
+
}
|
37
|
+
}
|
38
|
+
end
|
39
|
+
let(:pascal_case_hash_in_an_array) do
|
40
|
+
[
|
41
|
+
'just a string',
|
42
|
+
{
|
43
|
+
SomeKey: 'a value'
|
44
|
+
},
|
45
|
+
1,
|
46
|
+
{
|
47
|
+
AnotherKey: {
|
48
|
+
NestedKey: 1,
|
49
|
+
NestedArray: [
|
50
|
+
1,
|
51
|
+
'another string',
|
52
|
+
{ SuperNestedKey: 'value' }
|
53
|
+
]
|
54
|
+
}
|
55
|
+
}
|
56
|
+
]
|
57
|
+
end
|
58
|
+
let(:pascal_case_hash) do
|
59
|
+
{
|
60
|
+
A: 1,
|
61
|
+
AppleButter: %w[a b c],
|
62
|
+
SomeKeyValue: {
|
63
|
+
NestedKey: 1,
|
64
|
+
AnotherNestedKey: 2
|
65
|
+
}
|
66
|
+
}
|
67
|
+
end
|
68
|
+
let(:kebab_case_hash) do
|
69
|
+
{
|
70
|
+
a: 1,
|
71
|
+
'apple-butter': %w[a b c],
|
72
|
+
'some-key-value': {
|
73
|
+
'nested-key': 1,
|
74
|
+
'another-nested-key': 2
|
75
|
+
}
|
76
|
+
}
|
77
|
+
end
|
78
|
+
let(:camel_case_hash) do
|
79
|
+
{
|
80
|
+
a: 1,
|
81
|
+
appleButter: %w[a b c],
|
82
|
+
someKeyValue: {
|
83
|
+
nestedKey: 1,
|
84
|
+
anotherNestedKey: 2
|
85
|
+
}
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '.invalid_directories?' do
|
7
90
|
let(:valid_path_a) { 'C:/some/folder' }
|
8
91
|
let(:valid_path_b) { 'C:/another/folder' }
|
9
92
|
let(:valid_paths) { 'C:/some/folder;C:/another/folder' }
|
@@ -56,90 +139,7 @@ RSpec.describe Pwsh::Util do
|
|
56
139
|
end
|
57
140
|
end
|
58
141
|
|
59
|
-
|
60
|
-
{
|
61
|
-
a: 1,
|
62
|
-
appleButter: %w[a b c],
|
63
|
-
someKeyValue: {
|
64
|
-
nestedKey: 1,
|
65
|
-
anotherNestedKey: 2
|
66
|
-
}
|
67
|
-
}
|
68
|
-
end
|
69
|
-
let(:kebab_case_hash) do
|
70
|
-
{
|
71
|
-
a: 1,
|
72
|
-
'apple-butter': %w[a b c],
|
73
|
-
'some-key-value': {
|
74
|
-
'nested-key': 1,
|
75
|
-
'another-nested-key': 2
|
76
|
-
}
|
77
|
-
}
|
78
|
-
end
|
79
|
-
let(:pascal_case_hash) do
|
80
|
-
{
|
81
|
-
A: 1,
|
82
|
-
AppleButter: %w[a b c],
|
83
|
-
SomeKeyValue: {
|
84
|
-
NestedKey: 1,
|
85
|
-
AnotherNestedKey: 2
|
86
|
-
}
|
87
|
-
}
|
88
|
-
end
|
89
|
-
let(:pascal_case_hash_in_an_array) do
|
90
|
-
[
|
91
|
-
'just a string',
|
92
|
-
{
|
93
|
-
SomeKey: 'a value'
|
94
|
-
},
|
95
|
-
1,
|
96
|
-
{
|
97
|
-
AnotherKey: {
|
98
|
-
NestedKey: 1,
|
99
|
-
NestedArray: [
|
100
|
-
1,
|
101
|
-
'another string',
|
102
|
-
{ SuperNestedKey: 'value' }
|
103
|
-
]
|
104
|
-
}
|
105
|
-
}
|
106
|
-
]
|
107
|
-
end
|
108
|
-
let(:snake_case_hash) do
|
109
|
-
{
|
110
|
-
a: 1,
|
111
|
-
apple_butter: %w[a b c],
|
112
|
-
some_key_value: {
|
113
|
-
nested_key: 1,
|
114
|
-
another_nested_key: 2
|
115
|
-
}
|
116
|
-
}
|
117
|
-
end
|
118
|
-
let(:snake_case_hash_in_an_array) do
|
119
|
-
[
|
120
|
-
'just a string',
|
121
|
-
{
|
122
|
-
some_key: 'a value'
|
123
|
-
},
|
124
|
-
1,
|
125
|
-
{
|
126
|
-
another_key: {
|
127
|
-
nested_key: 1,
|
128
|
-
nested_array: [
|
129
|
-
1,
|
130
|
-
'another string',
|
131
|
-
{ super_nested_key: 'value' }
|
132
|
-
]
|
133
|
-
}
|
134
|
-
}
|
135
|
-
]
|
136
|
-
end
|
137
|
-
let(:camel_case_string) { 'thisIsAString' }
|
138
|
-
let(:kebab_case_string) { 'this-is-a-string' }
|
139
|
-
let(:pascal_case_string) { 'ThisIsAString' }
|
140
|
-
let(:snake_case_string) { 'this_is_a_string' }
|
141
|
-
|
142
|
-
context '.snake_case' do
|
142
|
+
describe '.snake_case' do
|
143
143
|
it 'converts a string to snake_case' do
|
144
144
|
expect(described_class.snake_case(camel_case_string)).to eq snake_case_string
|
145
145
|
expect(described_class.snake_case(kebab_case_string)).to eq snake_case_string
|
@@ -147,7 +147,7 @@ RSpec.describe Pwsh::Util do
|
|
147
147
|
end
|
148
148
|
end
|
149
149
|
|
150
|
-
|
150
|
+
describe '.snake_case_hash_keys' do
|
151
151
|
it 'snake_cases the keys in a passed hash' do
|
152
152
|
expect(described_class.snake_case_hash_keys(camel_case_hash)).to eq snake_case_hash
|
153
153
|
expect(described_class.snake_case_hash_keys(kebab_case_hash)).to eq snake_case_hash
|
@@ -156,7 +156,7 @@ RSpec.describe Pwsh::Util do
|
|
156
156
|
end
|
157
157
|
end
|
158
158
|
|
159
|
-
|
159
|
+
describe '.pascal_case' do
|
160
160
|
it 'converts a string to PascalCase' do
|
161
161
|
expect(described_class.pascal_case(camel_case_string)).to eq pascal_case_string
|
162
162
|
expect(described_class.pascal_case(kebab_case_string)).to eq pascal_case_string
|
@@ -164,7 +164,7 @@ RSpec.describe Pwsh::Util do
|
|
164
164
|
end
|
165
165
|
end
|
166
166
|
|
167
|
-
|
167
|
+
describe '.pascal_case_hash_keys' do
|
168
168
|
it 'PascalCases the keys in a passed hash' do
|
169
169
|
expect(described_class.pascal_case_hash_keys(camel_case_hash)).to eq pascal_case_hash
|
170
170
|
expect(described_class.pascal_case_hash_keys(kebab_case_hash)).to eq pascal_case_hash
|
@@ -173,7 +173,7 @@ RSpec.describe Pwsh::Util do
|
|
173
173
|
end
|
174
174
|
end
|
175
175
|
|
176
|
-
|
176
|
+
describe '.symbolize_hash_keys' do
|
177
177
|
let(:array_with_string_keys_in_hashes) do
|
178
178
|
[
|
179
179
|
'just a string',
|
@@ -218,7 +218,7 @@ RSpec.describe Pwsh::Util do
|
|
218
218
|
end
|
219
219
|
end
|
220
220
|
|
221
|
-
|
221
|
+
describe '.escape_quotes' do
|
222
222
|
it 'handles single quotes' do
|
223
223
|
expect(described_class.escape_quotes("The 'Cats' go 'meow'!")).to match(/The ''Cats'' go ''meow''!/)
|
224
224
|
end
|
@@ -232,11 +232,11 @@ RSpec.describe Pwsh::Util do
|
|
232
232
|
end
|
233
233
|
|
234
234
|
it 'handles dollar signs' do
|
235
|
-
expect(described_class.escape_quotes(
|
235
|
+
expect(described_class.escape_quotes('This should show $foo variable')).to match(/This should show \$foo variable/)
|
236
236
|
end
|
237
237
|
end
|
238
238
|
|
239
|
-
|
239
|
+
describe '.format_powershell_value' do
|
240
240
|
let(:ruby_array) { ['string', 1, :symbol, true] }
|
241
241
|
let(:powershell_array) { "@('string', 1, symbol, $true)" }
|
242
242
|
let(:ruby_hash) do
|
@@ -253,32 +253,39 @@ RSpec.describe Pwsh::Util do
|
|
253
253
|
}
|
254
254
|
end
|
255
255
|
let(:powershell_hash) { "@{string = 'string'; number = 1; symbol = some_symbol; boolean = $true; nested_hash = @{another_string = 'foo'; another_number = 2; array = @(1, 2, 3)}}" }
|
256
|
+
|
256
257
|
it 'returns a symbol as a non-interpolated string' do
|
257
258
|
expect(described_class.format_powershell_value(:apple)).to eq('apple')
|
258
259
|
end
|
260
|
+
|
259
261
|
it 'returns a number as a non interpolated string' do
|
260
262
|
expect(described_class.format_powershell_value(101)).to eq('101')
|
261
263
|
expect(described_class.format_powershell_value(1.1)).to eq('1.1')
|
262
264
|
end
|
265
|
+
|
263
266
|
it 'returns boolean values as the appropriate PowerShell automatic variable' do
|
264
267
|
expect(described_class.format_powershell_value(true)).to eq('$true')
|
265
268
|
expect(described_class.format_powershell_value(:false)).to eq('$false') # rubocop:disable Lint/BooleanSymbol
|
266
269
|
end
|
270
|
+
|
267
271
|
it 'returns a string as an escaped string' do
|
268
272
|
expect(described_class.format_powershell_value('some string')).to eq("'some string'")
|
269
273
|
end
|
274
|
+
|
270
275
|
it 'returns an array as a string representing a PowerShell array' do
|
271
276
|
expect(described_class.format_powershell_value(ruby_array)).to eq(powershell_array)
|
272
277
|
end
|
278
|
+
|
273
279
|
it 'returns a hash as a string representing a PowerShell hash' do
|
274
280
|
expect(described_class.format_powershell_value(ruby_hash)).to eq(powershell_hash)
|
275
281
|
end
|
282
|
+
|
276
283
|
it 'raises an error if an unknown type is passed' do
|
277
284
|
expect { described_class.format_powershell_value(described_class) }.to raise_error(/unsupported type Module/)
|
278
285
|
end
|
279
286
|
end
|
280
287
|
|
281
|
-
|
288
|
+
describe '.custom_powershell_property' do
|
282
289
|
it 'returns a powershell hash with the name and expression keys' do
|
283
290
|
expect(described_class.custom_powershell_property('apple', '$_.SomeValue / 5')).to eq("@{Name = 'apple'; Expression = {$_.SomeValue / 5}}")
|
284
291
|
end
|
@@ -4,7 +4,7 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
RSpec.describe Pwsh do
|
6
6
|
it 'has a version number' do
|
7
|
-
expect(described_class::VERSION).not_to
|
8
|
-
expect(described_class::VERSION).to
|
7
|
+
expect(described_class::VERSION).not_to be_nil
|
8
|
+
expect(described_class::VERSION).to be_a(String)
|
9
9
|
end
|
10
10
|
end
|
@@ -6,7 +6,7 @@ RSpec.describe Pwsh::WindowsPowerShell do
|
|
6
6
|
describe '.version' do
|
7
7
|
context 'on non-Windows platforms', unless: Pwsh::Util.on_windows? do
|
8
8
|
it 'is not defined' do
|
9
|
-
expect(defined?(described_class.version)).to
|
9
|
+
expect(defined?(described_class.version)).to be_nil
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
@@ -18,7 +18,7 @@ RSpec.describe Pwsh::WindowsPowerShell do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'calls the Windows PowerShell three registry path' do
|
21
|
-
reg_key = instance_double(
|
21
|
+
reg_key = instance_double(bob)
|
22
22
|
allow(reg_key).to receive(:[]).with('PowerShellVersion').and_return('5.0.10514.6')
|
23
23
|
allow_any_instance_of(Win32::Registry).to receive(:open).with('SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine', Win32::Registry::KEY_READ | 0x100).and_yield(reg_key)
|
24
24
|
|
@@ -26,7 +26,7 @@ RSpec.describe Pwsh::WindowsPowerShell do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'does not call Windows PowerShell one registry path' do
|
29
|
-
reg_key = instance_double(
|
29
|
+
reg_key = instance_double(bob)
|
30
30
|
allow(reg_key).to receive(:[]).with('PowerShellVersion').and_return('5.0.10514.6')
|
31
31
|
allow_any_instance_of(Win32::Registry).to receive(:open).with('SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine', Win32::Registry::KEY_READ | 0x100).and_yield(reg_key)
|
32
32
|
expect_any_instance_of(Win32::Registry).not_to receive(:open).with('SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine', Win32::Registry::KEY_READ | 0x100)
|
@@ -43,7 +43,7 @@ RSpec.describe Pwsh::WindowsPowerShell do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
it 'calls the Windows PowerShell one registry path' do
|
46
|
-
reg_key = instance_double(
|
46
|
+
reg_key = instance_double(bob)
|
47
47
|
allow(reg_key).to receive(:[]).with('PowerShellVersion').and_return('2.0')
|
48
48
|
allow_any_instance_of(Win32::Registry).to receive(:open).with('SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine',
|
49
49
|
Win32::Registry::KEY_READ | 0x100).and_yield(reg_key)
|
@@ -54,14 +54,14 @@ RSpec.describe Pwsh::WindowsPowerShell do
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
context 'when Windows PowerShell
|
57
|
+
context 'when Windows PowerShell is not installed' do
|
58
58
|
it 'returns nil and not throw' do
|
59
59
|
allow_any_instance_of(Win32::Registry).to receive(:open).with('SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine',
|
60
60
|
Win32::Registry::KEY_READ | 0x100).and_raise(Win32::Registry::Error.new(2), 'nope')
|
61
61
|
allow_any_instance_of(Win32::Registry).to receive(:open).with('SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine',
|
62
62
|
Win32::Registry::KEY_READ | 0x100).and_raise(Win32::Registry::Error.new(2), 'nope')
|
63
63
|
|
64
|
-
expect(described_class.version).to
|
64
|
+
expect(described_class.version).to be_nil
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
@@ -70,7 +70,7 @@ RSpec.describe Pwsh::WindowsPowerShell do
|
|
70
70
|
describe '.compatible_version?' do
|
71
71
|
context 'on non-Windows platforms', unless: Pwsh::Util.on_windows? do
|
72
72
|
it 'returns false' do
|
73
|
-
expect(described_class.compatible_version?).to
|
73
|
+
expect(described_class.compatible_version?).to be(false)
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
@@ -78,37 +78,42 @@ RSpec.describe Pwsh::WindowsPowerShell do
|
|
78
78
|
context 'when the Windows PowerShell major version is nil' do
|
79
79
|
it 'returns false' do
|
80
80
|
expect(described_class).to receive(:version).and_return(nil)
|
81
|
-
expect(described_class.compatible_version?).to
|
81
|
+
expect(described_class.compatible_version?).to be(false)
|
82
82
|
end
|
83
83
|
end
|
84
|
+
|
84
85
|
context 'when the Windows PowerShell major version is less than two' do
|
85
86
|
it 'returns false' do
|
86
87
|
expect(described_class).to receive(:version).and_return('1.0')
|
87
|
-
expect(described_class.compatible_version?).to
|
88
|
+
expect(described_class.compatible_version?).to be(false)
|
88
89
|
end
|
89
90
|
end
|
91
|
+
|
90
92
|
context 'when the Windows PowerShell major version is two' do
|
91
93
|
it 'returns true if .NET 3.5 is installed' do
|
92
94
|
expect(described_class).to receive(:version).and_return('2.0')
|
93
95
|
allow_any_instance_of(Win32::Registry).to receive(:open).with('SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5', Win32::Registry::KEY_READ | 0x100).and_yield
|
94
|
-
expect(described_class.compatible_version?).to
|
96
|
+
expect(described_class.compatible_version?).to be(true)
|
95
97
|
end
|
98
|
+
|
96
99
|
it 'returns false if .NET 3.5 is not installed' do
|
97
100
|
expect(described_class).to receive(:version).and_return('2.0')
|
98
101
|
allow_any_instance_of(Win32::Registry).to receive(:open).with('SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5', Win32::Registry::KEY_READ | 0x100).and_raise(Win32::Registry::Error, 1)
|
99
|
-
expect(described_class.compatible_version?).to
|
102
|
+
expect(described_class.compatible_version?).to be(false)
|
100
103
|
end
|
101
104
|
end
|
105
|
+
|
102
106
|
context 'when the Windows PowerShell major version is three' do
|
103
107
|
it 'returns true' do
|
104
108
|
expect(described_class).to receive(:version).and_return('3.0')
|
105
|
-
expect(described_class.compatible_version?).to
|
109
|
+
expect(described_class.compatible_version?).to be(true)
|
106
110
|
end
|
107
111
|
end
|
112
|
+
|
108
113
|
context 'when the Windows PowerShell major version is greater than three' do
|
109
114
|
it 'returns true' do
|
110
115
|
expect(described_class).to receive(:version).and_return('4.0')
|
111
|
-
expect(described_class.compatible_version?).to
|
116
|
+
expect(described_class.compatible_version?).to be(true)
|
112
117
|
end
|
113
118
|
end
|
114
119
|
end
|