pdk 2.7.1 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +36 -0
- data/README.md +10 -50
- data/lib/pdk/analytics/client/google_analytics.rb +22 -26
- data/lib/pdk/analytics/util.rb +0 -1
- data/lib/pdk/analytics.rb +1 -1
- data/lib/pdk/bolt.rb +1 -0
- data/lib/pdk/cli/build.rb +53 -56
- data/lib/pdk/cli/bundle.rb +34 -33
- data/lib/pdk/cli/console.rb +136 -134
- data/lib/pdk/cli/convert.rb +39 -41
- data/lib/pdk/cli/env.rb +49 -47
- data/lib/pdk/cli/errors.rb +1 -2
- data/lib/pdk/cli/exec/command.rb +23 -29
- data/lib/pdk/cli/exec/interactive_command.rb +7 -12
- data/lib/pdk/cli/exec.rb +4 -11
- data/lib/pdk/cli/exec_group.rb +3 -2
- data/lib/pdk/cli/get/config.rb +21 -19
- data/lib/pdk/cli/get.rb +15 -13
- data/lib/pdk/cli/new/class.rb +22 -22
- data/lib/pdk/cli/new/defined_type.rb +22 -22
- data/lib/pdk/cli/new/fact.rb +19 -19
- data/lib/pdk/cli/new/function.rb +20 -20
- data/lib/pdk/cli/new/module.rb +40 -38
- data/lib/pdk/cli/new/provider.rb +19 -19
- data/lib/pdk/cli/new/task.rb +23 -23
- data/lib/pdk/cli/new/test.rb +50 -48
- data/lib/pdk/cli/new/transport.rb +18 -18
- data/lib/pdk/cli/new.rb +11 -9
- data/lib/pdk/cli/release/prep.rb +27 -25
- data/lib/pdk/cli/release/publish.rb +39 -37
- data/lib/pdk/cli/release.rb +152 -149
- data/lib/pdk/cli/remove/config.rb +63 -60
- data/lib/pdk/cli/remove.rb +15 -13
- data/lib/pdk/cli/set/config.rb +91 -89
- data/lib/pdk/cli/set.rb +15 -13
- data/lib/pdk/cli/test/unit.rb +71 -69
- data/lib/pdk/cli/test.rb +9 -7
- data/lib/pdk/cli/update.rb +33 -38
- data/lib/pdk/cli/util/command_redirector.rb +10 -1
- data/lib/pdk/cli/util/interview.rb +11 -4
- data/lib/pdk/cli/util/option_normalizer.rb +3 -5
- data/lib/pdk/cli/util/option_validator.rb +7 -9
- data/lib/pdk/cli/util/update_manager_printer.rb +4 -4
- data/lib/pdk/cli/util.rb +32 -48
- data/lib/pdk/cli/validate.rb +98 -96
- data/lib/pdk/cli.rb +124 -120
- data/lib/pdk/config/ini_file.rb +4 -3
- data/lib/pdk/config/ini_file_setting.rb +6 -10
- data/lib/pdk/config/json.rb +1 -0
- data/lib/pdk/config/json_schema_namespace.rb +5 -10
- data/lib/pdk/config/json_schema_setting.rb +3 -5
- data/lib/pdk/config/json_with_schema.rb +2 -4
- data/lib/pdk/config/namespace.rb +22 -14
- data/lib/pdk/config/setting.rb +5 -6
- data/lib/pdk/config/task_schema.json +116 -0
- data/lib/pdk/config/validator.rb +4 -4
- data/lib/pdk/config/yaml.rb +3 -8
- data/lib/pdk/config/yaml_with_schema.rb +4 -12
- data/lib/pdk/config.rb +47 -51
- data/lib/pdk/context/control_repo.rb +3 -2
- data/lib/pdk/context/module.rb +2 -2
- data/lib/pdk/context/none.rb +2 -2
- data/lib/pdk/context.rb +4 -5
- data/lib/pdk/control_repo.rb +3 -4
- data/lib/pdk/generate/defined_type.rb +3 -3
- data/lib/pdk/generate/fact.rb +3 -2
- data/lib/pdk/generate/function.rb +5 -4
- data/lib/pdk/generate/module.rb +91 -106
- data/lib/pdk/generate/provider.rb +5 -4
- data/lib/pdk/generate/puppet_class.rb +3 -3
- data/lib/pdk/generate/puppet_object.rb +9 -12
- data/lib/pdk/generate/task.rb +11 -10
- data/lib/pdk/generate/transport.rb +8 -7
- data/lib/pdk/generate.rb +1 -1
- data/lib/pdk/logger.rb +3 -2
- data/lib/pdk/module/build.rb +34 -49
- data/lib/pdk/module/convert.rb +13 -22
- data/lib/pdk/module/metadata.rb +53 -61
- data/lib/pdk/module/release.rb +19 -25
- data/lib/pdk/module/update.rb +4 -13
- data/lib/pdk/module/update_manager.rb +18 -25
- data/lib/pdk/module.rb +1 -1
- data/lib/pdk/monkey_patches.rb +268 -0
- data/lib/pdk/report/event.rb +12 -37
- data/lib/pdk/report.rb +11 -7
- data/lib/pdk/template/fetcher/git.rb +7 -8
- data/lib/pdk/template/fetcher/local.rb +1 -0
- data/lib/pdk/template/fetcher.rb +4 -2
- data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +4 -9
- data/lib/pdk/template/renderer/v1/renderer.rb +19 -20
- data/lib/pdk/template/renderer/v1/template_file.rb +4 -8
- data/lib/pdk/template/renderer/v1.rb +1 -1
- data/lib/pdk/template/renderer.rb +1 -0
- data/lib/pdk/template/template_dir.rb +3 -3
- data/lib/pdk/template.rb +2 -6
- data/lib/pdk/tests/unit.rb +36 -25
- data/lib/pdk/util/bundler.rb +10 -14
- data/lib/pdk/util/changelog_generator.rb +15 -12
- data/lib/pdk/util/env.rb +1 -0
- data/lib/pdk/util/filesystem.rb +18 -17
- data/lib/pdk/util/git.rb +16 -21
- data/lib/pdk/util/json_finder.rb +7 -6
- data/lib/pdk/util/puppet_strings.rb +1 -1
- data/lib/pdk/util/puppet_version.rb +21 -68
- data/lib/pdk/util/ruby_version.rb +9 -13
- data/lib/pdk/util/template_uri.rb +17 -29
- data/lib/pdk/util/vendored_file.rb +5 -18
- data/lib/pdk/util/windows/api_types.rb +70 -64
- data/lib/pdk/util/windows/file.rb +31 -27
- data/lib/pdk/util/windows/process.rb +59 -61
- data/lib/pdk/util/windows/string.rb +19 -12
- data/lib/pdk/util.rb +13 -21
- data/lib/pdk/validate/control_repo/control_repo_validator_group.rb +1 -1
- data/lib/pdk/validate/control_repo/environment_conf_validator.rb +25 -25
- data/lib/pdk/validate/external_command_validator.rb +6 -1
- data/lib/pdk/validate/internal_ruby_validator.rb +5 -4
- data/lib/pdk/validate/invokable_validator.rb +30 -20
- data/lib/pdk/validate/metadata/metadata_json_lint_validator.rb +12 -14
- data/lib/pdk/validate/metadata/metadata_syntax_validator.rb +13 -15
- data/lib/pdk/validate/metadata/metadata_validator_group.rb +1 -1
- data/lib/pdk/validate/puppet/puppet_epp_validator.rb +16 -18
- data/lib/pdk/validate/puppet/puppet_lint_validator.rb +14 -14
- data/lib/pdk/validate/puppet/puppet_plan_syntax_validator.rb +1 -1
- data/lib/pdk/validate/puppet/puppet_syntax_validator.rb +16 -18
- data/lib/pdk/validate/puppet/puppet_validator_group.rb +1 -1
- data/lib/pdk/validate/ruby/ruby_rubocop_validator.rb +10 -11
- data/lib/pdk/validate/ruby/ruby_validator_group.rb +1 -1
- data/lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb +19 -24
- data/lib/pdk/validate/tasks/tasks_name_validator.rb +11 -13
- data/lib/pdk/validate/tasks/tasks_validator_group.rb +1 -1
- data/lib/pdk/validate/validator.rb +4 -2
- data/lib/pdk/validate/validator_group.rb +6 -3
- data/lib/pdk/validate/yaml/yaml_syntax_validator.rb +27 -36
- data/lib/pdk/validate/yaml/yaml_validator_group.rb +1 -1
- data/lib/pdk/validate.rb +6 -6
- data/lib/pdk/version.rb +2 -2
- data/lib/pdk.rb +12 -12
- metadata +27 -35
- data/lib/pdk/cli/config/get.rb +0 -26
- data/lib/pdk/cli/config.rb +0 -22
- data/lib/pdk/cli/module/build.rb +0 -12
- data/lib/pdk/cli/module/generate.rb +0 -47
- data/lib/pdk/cli/module.rb +0 -14
@@ -47,9 +47,9 @@ module PDK
|
|
47
47
|
calculate_diffs
|
48
48
|
|
49
49
|
{
|
50
|
-
added:
|
51
|
-
removed:
|
52
|
-
modified: @diff_cache.
|
50
|
+
added: @added_files,
|
51
|
+
removed: @removed_files.select { |f| PDK::Util::Filesystem.exist?(f) },
|
52
|
+
modified: @diff_cache.compact
|
53
53
|
}
|
54
54
|
end
|
55
55
|
|
@@ -115,16 +115,13 @@ module PDK
|
|
115
115
|
require 'pdk/util/filesystem'
|
116
116
|
|
117
117
|
if PDK::Util::Filesystem.file?(path)
|
118
|
-
PDK.logger.debug("unlinking '%{path}'"
|
118
|
+
PDK.logger.debug(format("unlinking '%{path}'", path: path))
|
119
119
|
PDK::Util::Filesystem.rm(path)
|
120
120
|
else
|
121
|
-
PDK.logger.debug("'%{path}': already gone"
|
121
|
+
PDK.logger.debug(format("'%{path}': already gone", path: path))
|
122
122
|
end
|
123
|
-
rescue => e
|
124
|
-
raise PDK::CLI::ExitWithError, "Unable to remove '%{path}': %{message}"
|
125
|
-
path: path,
|
126
|
-
message: e.message,
|
127
|
-
}
|
123
|
+
rescue StandardError => e
|
124
|
+
raise PDK::CLI::ExitWithError, format("Unable to remove '%{path}': %{message}", path: path, message: e.message)
|
128
125
|
end
|
129
126
|
|
130
127
|
private
|
@@ -140,9 +137,7 @@ module PDK
|
|
140
137
|
@modified_files.each do |file|
|
141
138
|
next if @diff_cache.key?(file[:path])
|
142
139
|
|
143
|
-
unless PDK::Util::Filesystem.readable?(file[:path])
|
144
|
-
raise PDK::CLI::ExitWithError, "Unable to open '%{path}' for reading" % { path: file[:path] }
|
145
|
-
end
|
140
|
+
raise PDK::CLI::ExitWithError, format("Unable to open '%{path}' for reading", path: file[:path]) unless PDK::Util::Filesystem.readable?(file[:path])
|
146
141
|
|
147
142
|
old_content = PDK::Util::Filesystem.read_file(file[:path])
|
148
143
|
file_diff = unified_diff(file[:path], old_content, file[:content])
|
@@ -160,10 +155,10 @@ module PDK
|
|
160
155
|
require 'pdk/util/filesystem'
|
161
156
|
|
162
157
|
PDK::Util::Filesystem.mkdir_p(File.dirname(path))
|
163
|
-
PDK.logger.debug("writing '%{path}'"
|
158
|
+
PDK.logger.debug(format("writing '%{path}'", path: path))
|
164
159
|
PDK::Util::Filesystem.write_file(path, content)
|
165
160
|
rescue Errno::EACCES
|
166
|
-
raise PDK::CLI::ExitWithError, "You do not have permission to write to '%{path}'"
|
161
|
+
raise PDK::CLI::ExitWithError, format("You do not have permission to write to '%{path}'", path: path)
|
167
162
|
end
|
168
163
|
|
169
164
|
# Generate a unified diff of the changes to be made to a file.
|
@@ -203,19 +198,17 @@ module PDK
|
|
203
198
|
file_length_difference = 0
|
204
199
|
|
205
200
|
diffs.each do |piece|
|
206
|
-
|
207
|
-
|
208
|
-
file_length_difference = hunk.file_length_difference
|
201
|
+
hunk = Diff::LCS::Hunk.new(old_lines, new_lines, piece, lines_of_context, file_length_difference)
|
202
|
+
file_length_difference = hunk.file_length_difference
|
209
203
|
|
210
|
-
|
204
|
+
next unless oldhunk
|
211
205
|
|
212
|
-
|
213
|
-
|
206
|
+
# If the hunk overlaps with the oldhunk, merge them.
|
207
|
+
next if lines_of_context.positive? && hunk.merge(oldhunk)
|
214
208
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
end
|
209
|
+
output << oldhunk.diff(:unified)
|
210
|
+
ensure
|
211
|
+
oldhunk = hunk
|
219
212
|
end
|
220
213
|
|
221
214
|
output << oldhunk.diff(:unified)
|
data/lib/pdk/module.rb
CHANGED
@@ -0,0 +1,268 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OS
|
4
|
+
# Os detection: Are we on Windows?
|
5
|
+
def self.windows?
|
6
|
+
(/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
# Patch childprocess so that it is Ruby 3 compliant.
|
11
|
+
# This could be removed if the following PR is ever merged
|
12
|
+
# and released:
|
13
|
+
# https://github.com/enkessler/childprocess/pull/185
|
14
|
+
module ChildProcess
|
15
|
+
class << self
|
16
|
+
def build(*args)
|
17
|
+
case os
|
18
|
+
when :macosx, :linux, :solaris, :bsd, :cygwin, :aix
|
19
|
+
if posix_spawn?
|
20
|
+
Unix::PosixSpawnProcess.new(*args)
|
21
|
+
elsif jruby?
|
22
|
+
JRuby::Process.new(*args)
|
23
|
+
else
|
24
|
+
Unix::ForkExecProcess.new(*args)
|
25
|
+
end
|
26
|
+
when :windows
|
27
|
+
Windows::Process.new(*args)
|
28
|
+
else
|
29
|
+
raise Error, "unsupported platform #{platform_name.inspect}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class AbstractProcess
|
35
|
+
def initialize(*args)
|
36
|
+
raise ArgumentError, "all arguments must be String: #{args.inspect}" unless args.all?(String)
|
37
|
+
|
38
|
+
@args = args
|
39
|
+
@started = false
|
40
|
+
@exit_code = nil
|
41
|
+
@io = nil
|
42
|
+
@cwd = nil
|
43
|
+
@detach = false
|
44
|
+
@duplex = false
|
45
|
+
@leader = false
|
46
|
+
@environment = {}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
if OS.windows?
|
51
|
+
module Windows
|
52
|
+
module Lib
|
53
|
+
extend FFI::Library
|
54
|
+
def self.msvcrt_name
|
55
|
+
RbConfig::CONFIG['RUBY_SO_NAME'][/msvc\w+/] || 'ucrtbase'
|
56
|
+
end
|
57
|
+
|
58
|
+
ffi_lib 'kernel32', msvcrt_name
|
59
|
+
ffi_convention :stdcall
|
60
|
+
|
61
|
+
# We have to redefine the function declarations so that they are available
|
62
|
+
# with the patched ffi_lib.
|
63
|
+
enum :wait_status, [
|
64
|
+
:wait_object_0, 0, # rubocop:disable Naming/VariableNumber
|
65
|
+
:wait_timeout, 0x102,
|
66
|
+
:wait_abandoned, 0x80,
|
67
|
+
:wait_failed, 0xFFFFFFFF
|
68
|
+
]
|
69
|
+
|
70
|
+
#
|
71
|
+
# BOOL WINAPI CreateProcess(
|
72
|
+
# __in_opt LPCTSTR lpApplicationName,
|
73
|
+
# __inout_opt LPTSTR lpCommandLine,
|
74
|
+
# __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
|
75
|
+
# __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
|
76
|
+
# __in BOOL bInheritHandles,
|
77
|
+
# __in DWORD dwCreationFlags,
|
78
|
+
# __in_opt LPVOID lpEnvironment,
|
79
|
+
# __in_opt LPCTSTR lpCurrentDirectory,
|
80
|
+
# __in LPSTARTUPINFO lpStartupInfo,
|
81
|
+
# __out LPPROCESS_INFORMATION lpProcessInformation
|
82
|
+
# );
|
83
|
+
#
|
84
|
+
|
85
|
+
attach_function :create_process, :CreateProcessW, [
|
86
|
+
:pointer,
|
87
|
+
:buffer_inout,
|
88
|
+
:pointer,
|
89
|
+
:pointer,
|
90
|
+
:bool,
|
91
|
+
:ulong,
|
92
|
+
:pointer,
|
93
|
+
:pointer,
|
94
|
+
:pointer,
|
95
|
+
:pointer
|
96
|
+
], :bool
|
97
|
+
|
98
|
+
#
|
99
|
+
# DWORD WINAPI FormatMessage(
|
100
|
+
# __in DWORD dwFlags,
|
101
|
+
# __in_opt LPCVOID lpSource,
|
102
|
+
# __in DWORD dwMessageId,
|
103
|
+
# __in DWORD dwLanguageId,
|
104
|
+
# __out LPTSTR lpBuffer,
|
105
|
+
# __in DWORD nSize,
|
106
|
+
# __in_opt va_list *Arguments
|
107
|
+
# );
|
108
|
+
#
|
109
|
+
|
110
|
+
attach_function :format_message, :FormatMessageA, [
|
111
|
+
:ulong,
|
112
|
+
:pointer,
|
113
|
+
:ulong,
|
114
|
+
:ulong,
|
115
|
+
:pointer,
|
116
|
+
:ulong,
|
117
|
+
:pointer
|
118
|
+
], :ulong
|
119
|
+
|
120
|
+
attach_function :close_handle, :CloseHandle, [:pointer], :bool
|
121
|
+
|
122
|
+
#
|
123
|
+
# HANDLE WINAPI OpenProcess(
|
124
|
+
# __in DWORD dwDesiredAccess,
|
125
|
+
# __in BOOL bInheritHandle,
|
126
|
+
# __in DWORD dwProcessId
|
127
|
+
# );
|
128
|
+
#
|
129
|
+
|
130
|
+
attach_function :open_process, :OpenProcess, [:ulong, :bool, :ulong], :pointer
|
131
|
+
|
132
|
+
#
|
133
|
+
# HANDLE WINAPI CreateJobObject(
|
134
|
+
# _In_opt_ LPSECURITY_ATTRIBUTES lpJobAttributes,
|
135
|
+
# _In_opt_ LPCTSTR lpName
|
136
|
+
# );
|
137
|
+
#
|
138
|
+
|
139
|
+
attach_function :create_job_object, :CreateJobObjectA, [:pointer, :pointer], :pointer
|
140
|
+
|
141
|
+
#
|
142
|
+
# BOOL WINAPI AssignProcessToJobObject(
|
143
|
+
# _In_ HANDLE hJob,
|
144
|
+
# _In_ HANDLE hProcess
|
145
|
+
# );
|
146
|
+
|
147
|
+
attach_function :assign_process_to_job_object, :AssignProcessToJobObject, [:pointer, :pointer], :bool
|
148
|
+
|
149
|
+
#
|
150
|
+
# BOOL WINAPI SetInformationJobObject(
|
151
|
+
# _In_ HANDLE hJob,
|
152
|
+
# _In_ JOBOBJECTINFOCLASS JobObjectInfoClass,
|
153
|
+
# _In_ LPVOID lpJobObjectInfo,
|
154
|
+
# _In_ DWORD cbJobObjectInfoLength
|
155
|
+
# );
|
156
|
+
#
|
157
|
+
|
158
|
+
attach_function :set_information_job_object, :SetInformationJobObject, [:pointer, :int, :pointer, :ulong], :bool
|
159
|
+
|
160
|
+
#
|
161
|
+
#
|
162
|
+
# DWORD WINAPI WaitForSingleObject(
|
163
|
+
# __in HANDLE hHandle,
|
164
|
+
# __in DWORD dwMilliseconds
|
165
|
+
# );
|
166
|
+
#
|
167
|
+
|
168
|
+
attach_function :wait_for_single_object, :WaitForSingleObject, [:pointer, :ulong], :wait_status, blocking: true
|
169
|
+
|
170
|
+
#
|
171
|
+
# BOOL WINAPI GetExitCodeProcess(
|
172
|
+
# __in HANDLE hProcess,
|
173
|
+
# __out LPDWORD lpExitCode
|
174
|
+
# );
|
175
|
+
#
|
176
|
+
|
177
|
+
attach_function :get_exit_code, :GetExitCodeProcess, [:pointer, :pointer], :bool
|
178
|
+
|
179
|
+
#
|
180
|
+
# BOOL WINAPI GenerateConsoleCtrlEvent(
|
181
|
+
# __in DWORD dwCtrlEvent,
|
182
|
+
# __in DWORD dwProcessGroupId
|
183
|
+
# );
|
184
|
+
#
|
185
|
+
|
186
|
+
attach_function :generate_console_ctrl_event, :GenerateConsoleCtrlEvent, [:ulong, :ulong], :bool
|
187
|
+
|
188
|
+
#
|
189
|
+
# BOOL WINAPI TerminateProcess(
|
190
|
+
# __in HANDLE hProcess,
|
191
|
+
# __in UINT uExitCode
|
192
|
+
# );
|
193
|
+
#
|
194
|
+
|
195
|
+
attach_function :terminate_process, :TerminateProcess, [:pointer, :uint], :bool
|
196
|
+
|
197
|
+
#
|
198
|
+
# intptr_t _get_osfhandle(
|
199
|
+
# int fd
|
200
|
+
# );
|
201
|
+
#
|
202
|
+
|
203
|
+
attach_function :get_osfhandle, :_get_osfhandle, [:int], :intptr_t
|
204
|
+
|
205
|
+
#
|
206
|
+
# int _open_osfhandle (
|
207
|
+
# intptr_t osfhandle,
|
208
|
+
# int flags
|
209
|
+
# );
|
210
|
+
#
|
211
|
+
|
212
|
+
attach_function :open_osfhandle, :_open_osfhandle, [:pointer, :int], :int
|
213
|
+
|
214
|
+
# BOOL WINAPI SetHandleInformation(
|
215
|
+
# __in HANDLE hObject,
|
216
|
+
# __in DWORD dwMask,
|
217
|
+
# __in DWORD dwFlags
|
218
|
+
# );
|
219
|
+
|
220
|
+
attach_function :set_handle_information, :SetHandleInformation, [:pointer, :ulong, :ulong], :bool
|
221
|
+
|
222
|
+
# BOOL WINAPI GetHandleInformation(
|
223
|
+
# __in HANDLE hObject,
|
224
|
+
# __out LPDWORD lpdwFlags
|
225
|
+
# );
|
226
|
+
|
227
|
+
attach_function :get_handle_information, :GetHandleInformation, [:pointer, :pointer], :bool
|
228
|
+
|
229
|
+
# BOOL WINAPI CreatePipe(
|
230
|
+
# __out PHANDLE hReadPipe,
|
231
|
+
# __out PHANDLE hWritePipe,
|
232
|
+
# __in_opt LPSECURITY_ATTRIBUTES lpPipeAttributes,
|
233
|
+
# __in DWORD nSize
|
234
|
+
# );
|
235
|
+
|
236
|
+
attach_function :create_pipe, :CreatePipe, [:pointer, :pointer, :pointer, :ulong], :bool
|
237
|
+
|
238
|
+
#
|
239
|
+
# HANDLE WINAPI GetCurrentProcess(void);
|
240
|
+
#
|
241
|
+
|
242
|
+
attach_function :current_process, :GetCurrentProcess, [], :pointer
|
243
|
+
|
244
|
+
#
|
245
|
+
# BOOL WINAPI DuplicateHandle(
|
246
|
+
# __in HANDLE hSourceProcessHandle,
|
247
|
+
# __in HANDLE hSourceHandle,
|
248
|
+
# __in HANDLE hTargetProcessHandle,
|
249
|
+
# __out LPHANDLE lpTargetHandle,
|
250
|
+
# __in DWORD dwDesiredAccess,
|
251
|
+
# __in BOOL bInheritHandle,
|
252
|
+
# __in DWORD dwOptions
|
253
|
+
# );
|
254
|
+
#
|
255
|
+
|
256
|
+
attach_function :_duplicate_handle, :DuplicateHandle, [
|
257
|
+
:pointer,
|
258
|
+
:pointer,
|
259
|
+
:pointer,
|
260
|
+
:pointer,
|
261
|
+
:ulong,
|
262
|
+
:bool,
|
263
|
+
:ulong
|
264
|
+
], :bool
|
265
|
+
end
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
data/lib/pdk/report/event.rb
CHANGED
@@ -194,13 +194,9 @@ module PDK
|
|
194
194
|
# @raise [ArgumentError] if the value is nil, an empty String, or not
|
195
195
|
# a String.
|
196
196
|
def sanitise_file(value)
|
197
|
-
if value.nil? || (value.is_a?(String) && value.empty?)
|
198
|
-
raise ArgumentError, 'File not specified.'
|
199
|
-
end
|
197
|
+
raise ArgumentError, 'File not specified.' if value.nil? || (value.is_a?(String) && value.empty?)
|
200
198
|
|
201
|
-
unless value.is_a?(String)
|
202
|
-
raise ArgumentError, 'File must be a String.'
|
203
|
-
end
|
199
|
+
raise ArgumentError, 'File must be a String.' unless value.is_a?(String)
|
204
200
|
|
205
201
|
require 'pathname'
|
206
202
|
require 'pdk/util'
|
@@ -234,22 +230,13 @@ module PDK
|
|
234
230
|
# @raise [ArgumentError] if the value is nil, an empty String, or not
|
235
231
|
# a String or Symbol representation of a valid state.
|
236
232
|
def sanitise_state(value)
|
237
|
-
if value.nil? || (value.is_a?(String) && value.empty?)
|
238
|
-
raise ArgumentError, 'State not specified.'
|
239
|
-
end
|
233
|
+
raise ArgumentError, 'State not specified.' if value.nil? || (value.is_a?(String) && value.empty?)
|
240
234
|
|
241
235
|
value = value.to_sym if value.is_a?(String)
|
242
|
-
unless value.is_a?(Symbol)
|
243
|
-
raise ArgumentError, 'State must be a Symbol, not %{type}' % { type: value.class }
|
244
|
-
end
|
236
|
+
raise ArgumentError, format('State must be a Symbol, not %{type}', type: value.class) unless value.is_a?(Symbol)
|
245
237
|
|
246
238
|
valid_states = [:passed, :error, :failure, :skipped]
|
247
|
-
unless valid_states.include?(value)
|
248
|
-
raise ArgumentError, 'Invalid state %{state}. Valid states are: %{valid}.' % {
|
249
|
-
state: value.inspect,
|
250
|
-
valid: valid_states.map(&:inspect).join(', '),
|
251
|
-
}
|
252
|
-
end
|
239
|
+
raise ArgumentError, format('Invalid state %{state}. Valid states are: %{valid}.', state: value.inspect, valid: valid_states.map(&:inspect).join(', ')) unless valid_states.include?(value)
|
253
240
|
|
254
241
|
value
|
255
242
|
end
|
@@ -263,9 +250,7 @@ module PDK
|
|
263
250
|
#
|
264
251
|
# @raise [ArgumentError] if the value is nil or an empty String.
|
265
252
|
def sanitise_source(value)
|
266
|
-
if value.nil? || (value.is_a?(String) && value.empty?)
|
267
|
-
raise ArgumentError, 'Source not specified.'
|
268
|
-
end
|
253
|
+
raise ArgumentError, 'Source not specified.' if value.nil? || (value.is_a?(String) && value.empty?)
|
269
254
|
|
270
255
|
value.to_s
|
271
256
|
end
|
@@ -284,13 +269,9 @@ module PDK
|
|
284
269
|
valid_types << Fixnum # rubocop:disable Lint/UnifiedInteger
|
285
270
|
end
|
286
271
|
|
287
|
-
unless valid_types.include?(value.class)
|
288
|
-
raise ArgumentError, 'Line must be an Integer or a String representation of an Integer.'
|
289
|
-
end
|
272
|
+
raise ArgumentError, 'Line must be an Integer or a String representation of an Integer.' unless valid_types.include?(value.class)
|
290
273
|
|
291
|
-
if value.is_a?(String) && value !~
|
292
|
-
raise ArgumentError, 'The line number can contain only the digits 0-9.'
|
293
|
-
end
|
274
|
+
raise ArgumentError, 'The line number can contain only the digits 0-9.' if value.is_a?(String) && value !~ /\A[0-9]+\Z/
|
294
275
|
|
295
276
|
value.to_i
|
296
277
|
end
|
@@ -309,13 +290,9 @@ module PDK
|
|
309
290
|
valid_types << Fixnum # rubocop:disable Lint/UnifiedInteger
|
310
291
|
end
|
311
292
|
|
312
|
-
unless valid_types.include?(value.class)
|
313
|
-
raise ArgumentError, 'Column must be an Integer or a String representation of an Integer.'
|
314
|
-
end
|
293
|
+
raise ArgumentError, 'Column must be an Integer or a String representation of an Integer.' unless valid_types.include?(value.class)
|
315
294
|
|
316
|
-
if value.is_a?(String) && value !~
|
317
|
-
raise ArgumentError, 'The column number can contain only the digits 0-9.'
|
318
|
-
end
|
295
|
+
raise ArgumentError, 'The column number can contain only the digits 0-9.' if value.is_a?(String) && value !~ /\A[0-9]+\Z/
|
319
296
|
|
320
297
|
value.to_i
|
321
298
|
end
|
@@ -331,14 +308,12 @@ module PDK
|
|
331
308
|
|
332
309
|
valid_types = [Array]
|
333
310
|
|
334
|
-
unless valid_types.include?(value.class)
|
335
|
-
raise ArgumentError, 'Trace must be an Array of stack trace lines.'
|
336
|
-
end
|
311
|
+
raise ArgumentError, 'Trace must be an Array of stack trace lines.' unless valid_types.include?(value.class)
|
337
312
|
|
338
313
|
# Drop any stacktrace lines that include '/gems/' in the path or
|
339
314
|
# are the original rspec binstub lines
|
340
315
|
value.reject do |line|
|
341
|
-
(
|
316
|
+
line.include?('/gems/') || line.include?('bin/rspec:')
|
342
317
|
end
|
343
318
|
end
|
344
319
|
|
data/lib/pdk/report.rb
CHANGED
@@ -6,7 +6,7 @@ module PDK
|
|
6
6
|
|
7
7
|
# @return [Array<String>] the list of supported report formats.
|
8
8
|
def self.formats
|
9
|
-
@report_formats ||=
|
9
|
+
@report_formats ||= ['junit', 'text'].freeze
|
10
10
|
end
|
11
11
|
|
12
12
|
# @return [Symbol] the method name of the default report format.
|
@@ -60,9 +60,9 @@ module PDK
|
|
60
60
|
testsuite = REXML::Element.new('testsuite')
|
61
61
|
testsuite.attributes['name'] = testsuite_name
|
62
62
|
testsuite.attributes['tests'] = testcases.length
|
63
|
-
testsuite.attributes['errors'] = testcases.
|
64
|
-
testsuite.attributes['failures'] = testcases.
|
65
|
-
testsuite.attributes['skipped'] = testcases.
|
63
|
+
testsuite.attributes['errors'] = testcases.count(&:error?)
|
64
|
+
testsuite.attributes['failures'] = testcases.count(&:failure?)
|
65
|
+
testsuite.attributes['skipped'] = testcases.count(&:skipped?)
|
66
66
|
testsuite.attributes['time'] = 0
|
67
67
|
testsuite.attributes['timestamp'] = Time.now.strftime('%Y-%m-%dT%H:%M:%S')
|
68
68
|
testsuite.attributes['hostname'] = Socket.gethostname
|
@@ -93,13 +93,17 @@ module PDK
|
|
93
93
|
# This report is designed for interactive use by a human and so excludes
|
94
94
|
# all passing events in order to be consise.
|
95
95
|
#
|
96
|
-
# @param target [
|
97
|
-
#
|
96
|
+
# @param target [String, IO] The IO target to write the report to.
|
97
|
+
# If a String is provided, the report will be written to a file with the given path.
|
98
|
+
# If an IO object is provided, the report will be written to the IO object.
|
99
|
+
# If no target is provided, the default target PDK::Report.default_target will be used.
|
100
|
+
#
|
101
|
+
# @return [void]
|
98
102
|
def write_text(target = self.class.default_target)
|
99
103
|
coverage_report = nil
|
100
104
|
report = []
|
101
105
|
|
102
|
-
events.
|
106
|
+
events.each_value do |tool_events|
|
103
107
|
tool_events.each do |event|
|
104
108
|
if event.rspec_puppet_coverage?
|
105
109
|
coverage_report = event.to_text
|
@@ -14,6 +14,7 @@ module PDK
|
|
14
14
|
# @see PDK::Template::Fetcher::AbstractTemplateFetcher.fetch!
|
15
15
|
def fetch!
|
16
16
|
return if fetched
|
17
|
+
|
17
18
|
super
|
18
19
|
|
19
20
|
# Default metadata for all git fetching methods
|
@@ -22,9 +23,7 @@ module PDK
|
|
22
23
|
# We don't do a checkout of local-path repos. There are lots of edge
|
23
24
|
# cases or user un-expectations.
|
24
25
|
if PDK::Util::Git.work_tree?(uri.shell_path)
|
25
|
-
PDK.logger.warn "Repository '%{repo}' has a work-tree; skipping git reset."
|
26
|
-
repo: uri.shell_path,
|
27
|
-
}
|
26
|
+
PDK.logger.warn format("Repository '%{repo}' has a work-tree; skipping git reset.", repo: uri.shell_path)
|
28
27
|
@path = uri.shell_path
|
29
28
|
@temporary = false
|
30
29
|
@metadata['template-ref'] = describe_path_and_ref(@path)
|
@@ -49,7 +48,7 @@ module PDK
|
|
49
48
|
unless clone_result[:exit_code].zero?
|
50
49
|
PDK.logger.error clone_result[:stdout]
|
51
50
|
PDK.logger.error clone_result[:stderr]
|
52
|
-
raise PDK::CLI::FatalError, "Unable to clone git repository at '%{repo}' into '%{dest}'."
|
51
|
+
raise PDK::CLI::FatalError, format("Unable to clone git repository at '%{repo}' into '%{dest}'.", repo: origin_repo, dest: temp_dir)
|
53
52
|
end
|
54
53
|
@path = PDK::Util.canonical_path(temp_dir)
|
55
54
|
|
@@ -63,22 +62,22 @@ module PDK
|
|
63
62
|
|
64
63
|
PDK.logger.error reset_result[:stdout]
|
65
64
|
PDK.logger.error reset_result[:stderr]
|
66
|
-
raise PDK::CLI::FatalError, "Unable to checkout '%{ref}' of git repository at '%{path}'."
|
65
|
+
raise PDK::CLI::FatalError, format("Unable to checkout '%{ref}' of git repository at '%{path}'.", ref: git_ref, path: temp_dir)
|
67
66
|
end
|
68
67
|
else
|
69
|
-
PDK.logger.warn "Uncommitted changes found when attempting to checkout '%{ref}' of git repository at '%{path}'; skipping git reset."
|
68
|
+
PDK.logger.warn format("Uncommitted changes found when attempting to checkout '%{ref}' of git repository at '%{path}'; skipping git reset.", ref: git_ref, path: temp_dir)
|
70
69
|
@metadata['template-ref'] = describe_path_and_ref(temp_dir)
|
71
70
|
end
|
72
71
|
end
|
73
72
|
|
74
73
|
private
|
75
74
|
|
76
|
-
|
75
|
+
# :nocov: This is a just a wrapper for another method
|
77
76
|
def describe_path_and_ref(path, ref = nil)
|
78
77
|
require 'pdk/util/git'
|
79
78
|
PDK::Util::Git.describe(File.join(path, '.git'), ref)
|
80
79
|
end
|
81
|
-
|
80
|
+
# :nocov:
|
82
81
|
end
|
83
82
|
end
|
84
83
|
end
|
data/lib/pdk/template/fetcher.rb
CHANGED
@@ -13,6 +13,7 @@ module PDK
|
|
13
13
|
# @return [PDK::Template::Fetcher::AbstractTemplateFetcher] An instance of a class which implements the AbstractFetcher class
|
14
14
|
def self.instance(uri, options = {})
|
15
15
|
return Git.new(uri, options) if Git.fetchable?(uri, options)
|
16
|
+
|
16
17
|
Local.new(uri, options)
|
17
18
|
end
|
18
19
|
|
@@ -35,7 +36,8 @@ module PDK
|
|
35
36
|
# @raise [ArgumentError] If no block is given to this method.
|
36
37
|
# @return [void]
|
37
38
|
def self.with(uri, options = {})
|
38
|
-
raise ArgumentError, '%{class_name}.with must be passed a block.'
|
39
|
+
raise ArgumentError, format('%{class_name}.with must be passed a block.', class_name: name) unless block_given?
|
40
|
+
|
39
41
|
fetcher = instance(uri, options)
|
40
42
|
|
41
43
|
begin
|
@@ -78,7 +80,7 @@ module PDK
|
|
78
80
|
@metadata = {
|
79
81
|
'pdk-version' => PDK::Util::Version.version_string,
|
80
82
|
'template-url' => nil,
|
81
|
-
'template-ref' => nil
|
83
|
+
'template-ref' => nil
|
82
84
|
}
|
83
85
|
@fetched = false
|
84
86
|
@temporary = false
|
@@ -65,7 +65,7 @@ module PDK
|
|
65
65
|
'unmanaged'
|
66
66
|
elsif c['delete']
|
67
67
|
'deleted'
|
68
|
-
elsif @sync_config
|
68
|
+
elsif @sync_config&.key?(dest_path)
|
69
69
|
'customized'
|
70
70
|
else
|
71
71
|
'default'
|
@@ -91,15 +91,10 @@ module PDK
|
|
91
91
|
require 'yaml'
|
92
92
|
|
93
93
|
begin
|
94
|
-
YAML.safe_load(PDK::Util::Filesystem.read_file(loc), [], [], true)
|
94
|
+
YAML.safe_load(PDK::Util::Filesystem.read_file(loc), permitted_classes: [], permitted_symbols: [], aliases: true)
|
95
95
|
rescue Psych::SyntaxError => e
|
96
|
-
PDK.logger.warn "'%{file}' is not a valid YAML file: %{problem} %{context} at line %{line} column %{column}"
|
97
|
-
|
98
|
-
problem: e.problem,
|
99
|
-
context: e.context,
|
100
|
-
line: e.line,
|
101
|
-
column: e.column,
|
102
|
-
}
|
96
|
+
PDK.logger.warn format("'%{file}' is not a valid YAML file: %{problem} %{context} at line %{line} column %{column}", file: loc, problem: e.problem, context: e.context, line: e.line,
|
97
|
+
column: e.column)
|
103
98
|
{}
|
104
99
|
end
|
105
100
|
else
|