pdk 1.14.0 → 1.14.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 +31 -0
- data/lib/pdk.rb +63 -8
- data/lib/pdk/analytics.rb +14 -28
- data/lib/pdk/analytics/client/google_analytics.rb +2 -0
- data/lib/pdk/analytics/client/noop.rb +2 -0
- data/lib/pdk/analytics/util.rb +2 -0
- data/lib/pdk/answer_file.rb +2 -21
- data/lib/pdk/cli.rb +25 -13
- data/lib/pdk/cli/errors.rb +2 -0
- data/lib/pdk/cli/exec.rb +5 -0
- data/lib/pdk/cli/exec/command.rb +10 -6
- data/lib/pdk/cli/exec/interactive_command.rb +1 -1
- data/lib/pdk/cli/exec_group.rb +2 -0
- data/lib/pdk/cli/module/generate.rb +1 -1
- data/lib/pdk/cli/new/module.rb +8 -1
- data/lib/pdk/cli/new/test.rb +0 -1
- data/lib/pdk/cli/test/unit.rb +0 -3
- data/lib/pdk/cli/util.rb +24 -13
- data/lib/pdk/cli/util/command_redirector.rb +3 -2
- data/lib/pdk/cli/util/interview.rb +2 -1
- data/lib/pdk/cli/util/option_normalizer.rb +2 -0
- data/lib/pdk/cli/util/option_validator.rb +2 -0
- data/lib/pdk/cli/validate.rb +0 -1
- data/lib/pdk/config.rb +19 -13
- data/lib/pdk/config/json.rb +1 -1
- data/lib/pdk/config/json_schema_namespace.rb +3 -4
- data/lib/pdk/config/json_schema_setting.rb +1 -1
- data/lib/pdk/config/json_with_schema.rb +1 -2
- data/lib/pdk/config/namespace.rb +2 -0
- data/lib/pdk/config/setting.rb +2 -0
- data/lib/pdk/config/validator.rb +31 -0
- data/lib/pdk/config/yaml.rb +1 -2
- data/lib/pdk/config/yaml_with_schema.rb +1 -1
- data/lib/pdk/generate.rb +19 -13
- data/lib/pdk/generate/defined_type.rb +1 -1
- data/lib/pdk/generate/module.rb +1 -1
- data/lib/pdk/generate/provider.rb +2 -2
- data/lib/pdk/generate/puppet_class.rb +1 -1
- data/lib/pdk/generate/puppet_object.rb +2 -0
- data/lib/pdk/generate/task.rb +1 -1
- data/lib/pdk/generate/transport.rb +1 -1
- data/lib/pdk/logger.rb +1 -4
- data/lib/pdk/module.rb +7 -0
- data/lib/pdk/module/build.rb +2 -0
- data/lib/pdk/module/convert.rb +2 -0
- data/lib/pdk/module/metadata.rb +2 -1
- data/lib/pdk/module/templatedir.rb +2 -0
- data/lib/pdk/module/update.rb +1 -1
- data/lib/pdk/module/update_manager.rb +2 -0
- data/lib/pdk/report.rb +3 -1
- data/lib/pdk/report/event.rb +2 -0
- data/lib/pdk/template_file.rb +1 -0
- data/lib/pdk/tests/unit.rb +8 -3
- data/lib/pdk/util.rb +25 -7
- data/lib/pdk/util/bundler.rb +2 -0
- data/lib/pdk/util/env.rb +30 -0
- data/lib/pdk/util/filesystem.rb +4 -1
- data/lib/pdk/util/git.rb +3 -1
- data/lib/pdk/util/puppet_strings.rb +4 -2
- data/lib/pdk/util/puppet_version.rb +11 -1
- data/lib/pdk/util/ruby_version.rb +1 -0
- data/lib/pdk/util/template_uri.rb +2 -0
- data/lib/pdk/util/vendored_file.rb +2 -0
- data/lib/pdk/util/version.rb +2 -0
- data/lib/pdk/util/windows.rb +1 -0
- data/lib/pdk/util/windows/api_types.rb +32 -0
- data/lib/pdk/util/windows/process.rb +79 -0
- data/lib/pdk/validate.rb +24 -5
- data/lib/pdk/validate/base_validator.rb +2 -0
- data/lib/pdk/validate/metadata/metadata_json_lint.rb +1 -1
- data/lib/pdk/validate/metadata/metadata_syntax.rb +1 -1
- data/lib/pdk/validate/metadata_validator.rb +1 -3
- data/lib/pdk/validate/puppet/puppet_epp.rb +2 -2
- data/lib/pdk/validate/puppet/puppet_lint.rb +1 -1
- data/lib/pdk/validate/puppet/puppet_syntax.rb +2 -2
- data/lib/pdk/validate/puppet_validator.rb +1 -4
- data/lib/pdk/validate/ruby/rubocop.rb +1 -1
- data/lib/pdk/validate/ruby_validator.rb +1 -2
- data/lib/pdk/validate/tasks/metadata_lint.rb +1 -1
- data/lib/pdk/validate/tasks/name.rb +1 -1
- data/lib/pdk/validate/tasks_validator.rb +1 -3
- data/lib/pdk/validate/yaml/syntax.rb +1 -1
- data/lib/pdk/validate/yaml_validator.rb +1 -2
- data/lib/pdk/version.rb +1 -1
- data/locales/pdk.pot +243 -207
- metadata +7 -4
data/lib/pdk/module/build.rb
CHANGED
data/lib/pdk/module/convert.rb
CHANGED
data/lib/pdk/module/metadata.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'pdk
|
1
|
+
require 'pdk'
|
2
2
|
|
3
3
|
module PDK
|
4
4
|
module Module
|
@@ -108,6 +108,7 @@ module PDK
|
|
108
108
|
raise ArgumentError, _('Invalid JSON in metadata.json: %{msg}') % { msg: e.message }
|
109
109
|
end
|
110
110
|
|
111
|
+
require 'pdk/util'
|
111
112
|
data['template-url'] = PDK::Util::TemplateURI.default_template_uri.metadata_format if PDK::Util.package_install? && data['template-url'] == PDK::Util::TemplateURI::PACKAGED_TEMPLATE_KEYWORD
|
112
113
|
new(data)
|
113
114
|
end
|
data/lib/pdk/module/update.rb
CHANGED
data/lib/pdk/report.rb
CHANGED
data/lib/pdk/report/event.rb
CHANGED
data/lib/pdk/template_file.rb
CHANGED
data/lib/pdk/tests/unit.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'pdk'
|
2
|
+
|
1
3
|
module PDK
|
2
4
|
module Test
|
3
5
|
class Unit
|
@@ -38,9 +40,7 @@ module PDK
|
|
38
40
|
|
39
41
|
command = PDK::CLI::Exec::InteractiveCommand.new(*cmd_with_args(task)).tap do |c|
|
40
42
|
c.context = :module
|
41
|
-
c.environment = environment
|
42
|
-
key == 'CI_SPEC_OPTIONS'
|
43
|
-
end
|
43
|
+
c.environment = environment
|
44
44
|
end
|
45
45
|
|
46
46
|
command.execute!
|
@@ -95,6 +95,11 @@ module PDK
|
|
95
95
|
spinner_msg = options[:parallel] ? _('Running unit tests in parallel.') : _('Running unit tests.')
|
96
96
|
|
97
97
|
if options[:interactive]
|
98
|
+
environment['CI_SPEC_OPTIONS'] = if options[:verbose]
|
99
|
+
'--format documentation'
|
100
|
+
else
|
101
|
+
'--format progress'
|
102
|
+
end
|
98
103
|
result = interactive_rake(cmd(tests, options), environment)
|
99
104
|
return result[:exit_code]
|
100
105
|
end
|
data/lib/pdk/util.rb
CHANGED
@@ -1,13 +1,30 @@
|
|
1
|
+
require 'pdk'
|
2
|
+
|
1
3
|
# PDK::Util::Windows can not be lazy loaded because it conditionally requires
|
2
4
|
# other files on Windows only. This can probably be fixed up with a later
|
3
5
|
# refactoring.
|
4
6
|
require 'pdk/util/windows'
|
5
7
|
|
8
|
+
autoload :Pathname, 'pathname'
|
9
|
+
|
6
10
|
module PDK
|
7
11
|
module Util
|
12
|
+
autoload :Bundler, 'pdk/util/bundler'
|
13
|
+
autoload :Env, 'pdk/util/env'
|
14
|
+
autoload :Filesystem, 'pdk/util/filesystem'
|
15
|
+
autoload :Git, 'pdk/util/git'
|
16
|
+
autoload :PuppetStrings, 'pdk/util/puppet_strings'
|
17
|
+
autoload :PuppetVersion, 'pdk/util/puppet_version'
|
18
|
+
autoload :RubyVersion, 'pdk/util/ruby_version'
|
19
|
+
autoload :TemplateURI, 'pdk/util/template_uri'
|
20
|
+
autoload :VendoredFile, 'pdk/util/vendored_file'
|
21
|
+
autoload :Version, 'pdk/util/version'
|
22
|
+
|
8
23
|
MODULE_FOLDERS = %w[
|
9
24
|
manifests
|
10
|
-
lib
|
25
|
+
lib/puppet
|
26
|
+
lib/puppet_x
|
27
|
+
lib/facter
|
11
28
|
tasks
|
12
29
|
facts.d
|
13
30
|
functions
|
@@ -102,7 +119,7 @@ module PDK
|
|
102
119
|
# @return [String] Fully qualified path to per-user PDK cachedir.
|
103
120
|
def cachedir
|
104
121
|
if Gem.win_platform?
|
105
|
-
File.join(
|
122
|
+
File.join(PDK::Util::Env['LOCALAPPDATA'], 'PDK', 'cache')
|
106
123
|
else
|
107
124
|
File.join(Dir.home, '.pdk', 'cache')
|
108
125
|
end
|
@@ -111,9 +128,9 @@ module PDK
|
|
111
128
|
|
112
129
|
def configdir
|
113
130
|
if Gem.win_platform?
|
114
|
-
File.join(
|
131
|
+
File.join(PDK::Util::Env['LOCALAPPDATA'], 'PDK')
|
115
132
|
else
|
116
|
-
File.join(
|
133
|
+
File.join(PDK::Util::Env.fetch('XDG_CONFIG_HOME', File.join(Dir.home, '.config')), 'pdk')
|
117
134
|
end
|
118
135
|
end
|
119
136
|
module_function :configdir
|
@@ -143,12 +160,13 @@ module PDK
|
|
143
160
|
module_function :module_fixtures_dir
|
144
161
|
|
145
162
|
# Returns true or false depending on if any of the common directories in a module
|
146
|
-
# are found in the
|
163
|
+
# are found in the specified directory. If a directory is not specified, the current
|
164
|
+
# working directory is used.
|
147
165
|
#
|
148
166
|
# @return [boolean] True if any folders from MODULE_FOLDERS are found in the current dir,
|
149
167
|
# false otherwise.
|
150
|
-
def in_module_root?
|
151
|
-
PDK::Util::MODULE_FOLDERS.any? { |dir|
|
168
|
+
def in_module_root?(path = Dir.pwd)
|
169
|
+
PDK::Util::MODULE_FOLDERS.any? { |dir| PDK::Util::Filesystem.directory?(File.join(path, dir)) }
|
152
170
|
end
|
153
171
|
module_function :in_module_root?
|
154
172
|
|
data/lib/pdk/util/bundler.rb
CHANGED
data/lib/pdk/util/env.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'pdk'
|
2
|
+
require 'forwardable'
|
3
|
+
|
4
|
+
module PDK
|
5
|
+
module Util
|
6
|
+
class Env
|
7
|
+
class << self
|
8
|
+
extend Forwardable
|
9
|
+
|
10
|
+
def_delegators :env_hash, :[], :key?, :fetch, :select, :reject
|
11
|
+
|
12
|
+
def []=(key, value)
|
13
|
+
if Gem.win_platform?
|
14
|
+
PDK::Util::Windows::Process.set_environment_variable(key, value)
|
15
|
+
else
|
16
|
+
ENV[key] = value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def env_hash
|
21
|
+
if Gem.win_platform?
|
22
|
+
PDK::Util::Windows::Process.environment_hash
|
23
|
+
else
|
24
|
+
ENV
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/pdk/util/filesystem.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
+
require 'pdk'
|
2
|
+
|
1
3
|
module PDK
|
2
4
|
module Util
|
3
5
|
module Filesystem
|
4
6
|
def write_file(path, content)
|
5
|
-
raise ArgumentError
|
7
|
+
raise ArgumentError, _('content must be a String') unless content.is_a?(String)
|
8
|
+
raise ArgumentError, _('path must be a String or Pathname') unless path.is_a?(String) || path.respond_to?(:to_path)
|
6
9
|
|
7
10
|
# Harmonize newlines across platforms.
|
8
11
|
content = content.encode(universal_newline: true)
|
data/lib/pdk/util/git.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'pdk'
|
2
|
+
|
1
3
|
module PDK
|
2
4
|
module Util
|
3
5
|
class GitError < StandardError
|
@@ -108,7 +110,7 @@ module PDK
|
|
108
110
|
}
|
109
111
|
end
|
110
112
|
|
111
|
-
matching_refs = output[:stdout].split(
|
113
|
+
matching_refs = output[:stdout].split(%r{\r?\n}).map { |r| r.split("\t") }
|
112
114
|
matching_ref = matching_refs.find { |_sha, remote_ref| remote_ref == "refs/tags/#{ref}" || remote_ref == "refs/remotes/origin/#{ref}" || remote_ref == "refs/heads/#{ref}" }
|
113
115
|
raise PDK::CLI::ExitWithError, _('Unable to find a branch or tag named "%{ref}" in %{repo}') % { ref: ref, repo: repo } if matching_ref.nil?
|
114
116
|
matching_ref.first
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'pdk'
|
2
|
+
|
1
3
|
module PDK
|
2
4
|
module Util
|
3
5
|
module PuppetStrings
|
@@ -89,7 +91,7 @@ module PDK
|
|
89
91
|
def self.all_objects
|
90
92
|
require 'pdk/generate'
|
91
93
|
|
92
|
-
generators = PDK::Generate
|
94
|
+
generators = PDK::Generate.generators.select do |gen|
|
93
95
|
gen.respond_to?(:puppet_strings_type) && !gen.puppet_strings_type.nil?
|
94
96
|
end
|
95
97
|
|
@@ -114,7 +116,7 @@ module PDK
|
|
114
116
|
def self.find_generator(type)
|
115
117
|
require 'pdk/generate'
|
116
118
|
|
117
|
-
PDK::Generate
|
119
|
+
PDK::Generate.generators.find do |gen|
|
118
120
|
gen.respond_to?(:puppet_strings_type) && gen.puppet_strings_type == type
|
119
121
|
end
|
120
122
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'pdk'
|
2
|
+
|
1
3
|
module PDK
|
2
4
|
module Util
|
3
5
|
class PuppetVersion
|
@@ -42,7 +44,13 @@ module PDK
|
|
42
44
|
latest
|
43
45
|
end
|
44
46
|
|
45
|
-
def
|
47
|
+
def puppet_dev_fetched?
|
48
|
+
!@puppet_dev_fetched.nil?
|
49
|
+
end
|
50
|
+
|
51
|
+
def fetch_puppet_dev(options = {})
|
52
|
+
return if options[:run] == :once && puppet_dev_fetched?
|
53
|
+
|
46
54
|
require 'pdk/util/git'
|
47
55
|
require 'fileutils'
|
48
56
|
|
@@ -74,6 +82,8 @@ module PDK
|
|
74
82
|
|
75
83
|
# Reset local repo to latest
|
76
84
|
reset_result = PDK::Util::Git.git('-C', puppet_dev_path, 'reset', '--hard', 'origin/master')
|
85
|
+
|
86
|
+
@puppet_dev_fetched = true
|
77
87
|
return if reset_result[:exit_code].zero?
|
78
88
|
|
79
89
|
PDK.logger.error reset_result[:stdout]
|
data/lib/pdk/util/version.rb
CHANGED
data/lib/pdk/util/windows.rb
CHANGED
@@ -2,6 +2,13 @@ require 'ffi'
|
|
2
2
|
require 'pdk/util/windows/string'
|
3
3
|
|
4
4
|
module PDK::Util::Windows::APITypes
|
5
|
+
module ::FFI::Library
|
6
|
+
def attach_function_private(*args)
|
7
|
+
attach_function(*args)
|
8
|
+
private args[0]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
5
12
|
class ::FFI::Pointer
|
6
13
|
def self.from_string_to_wide_string(str, &_block)
|
7
14
|
str = PDK::Util::Windows::String.wide_string(str)
|
@@ -28,6 +35,26 @@ module PDK::Util::Windows::APITypes
|
|
28
35
|
}
|
29
36
|
raise
|
30
37
|
end
|
38
|
+
|
39
|
+
def read_arbitrary_wide_string_up_to(max_char_length = 512, null_terminator = :single_null, encode_options = {})
|
40
|
+
unless [:single_null, :double_null].include?(null_terminator)
|
41
|
+
raise ArgumentError, _(
|
42
|
+
'Unable to read wide strings with %{null_terminator} terminal nulls',
|
43
|
+
) % { null_terminator: null_terminator }
|
44
|
+
end
|
45
|
+
|
46
|
+
terminator_width = (null_terminator == :single_null) ? 1 : 2
|
47
|
+
reader_method = (null_terminator == :single_null) ? :get_uint16 : :get_uint32
|
48
|
+
|
49
|
+
# Look for the null_terminator; if found, read up to that null
|
50
|
+
# (exclusive)
|
51
|
+
(0...max_char_length - terminator_width).each do |i|
|
52
|
+
return read_wide_string(i, Encoding::UTF_8, encode_options) if send(reader_method, (i * 2)).zero?
|
53
|
+
end
|
54
|
+
|
55
|
+
# String is longer than the max, read just up to the max
|
56
|
+
read_wide_string(max_char_length, Encoding::UTF_8, encode_options)
|
57
|
+
end
|
31
58
|
end
|
32
59
|
|
33
60
|
# FFI Types
|
@@ -47,4 +74,9 @@ module PDK::Util::Windows::APITypes
|
|
47
74
|
# 8 bits per byte
|
48
75
|
FFI.typedef :uchar, :byte
|
49
76
|
FFI.typedef :uint16, :wchar
|
77
|
+
|
78
|
+
# FFI bool can be only 1 byte at times,
|
79
|
+
# Win32 BOOL is a signed int, and is always 4 bytes, even on x64
|
80
|
+
# https://blogs.msdn.com/b/oldnewthing/archive/2011/03/28/10146459.aspx
|
81
|
+
FFI.typedef :int32, :win32_bool
|
50
82
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'pdk/util/windows'
|
2
|
+
|
3
|
+
module PDK::Util::Windows::Process
|
4
|
+
require 'ffi'
|
5
|
+
extend PDK::Util::Windows::String
|
6
|
+
extend FFI::Library
|
7
|
+
|
8
|
+
def environment_hash
|
9
|
+
env_ptr = GetEnvironmentStringsW()
|
10
|
+
|
11
|
+
contains_unicode_replacement = ->(string) do
|
12
|
+
return false unless string.include?("\uFFFD")
|
13
|
+
|
14
|
+
PDK.logger.warning _(
|
15
|
+
'Discarding environment variable %{string} which contains invalid ' \
|
16
|
+
'bytes',
|
17
|
+
) % { string: string }
|
18
|
+
true
|
19
|
+
end
|
20
|
+
|
21
|
+
# pass :invalid => :replace to the Ruby String#encode to use replacement
|
22
|
+
# characters
|
23
|
+
pairs = env_ptr.read_arbitrary_wide_string_up_to(65_534, :double_null, invalid: :replace)
|
24
|
+
.split(?\x00)
|
25
|
+
.reject { |env_str| env_str.nil? || env_str.empty? || env_str[0] == '=' }
|
26
|
+
.reject { |env_str| contains_unicode_replacement.call(env_str) }
|
27
|
+
.map { |env_pair| env_pair.split('=', 2) }
|
28
|
+
Hash[pairs]
|
29
|
+
ensure
|
30
|
+
if env_ptr && !env_ptr.null?
|
31
|
+
if FreeEnvironmentStringsW(env_ptr) == PDK::Util::Windows::WIN32_FALSE
|
32
|
+
PDK.logger.debug _('FreeEnvironmentStringsW memory leak')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
module_function :environment_hash
|
37
|
+
|
38
|
+
def set_environment_variable(name, val)
|
39
|
+
raise ArgumentError, _('Environment variable name must not be nil or empty') if name.nil? || name.empty?
|
40
|
+
|
41
|
+
FFI::MemoryPointer.from_string_to_wide_string(name) do |name_ptr|
|
42
|
+
if val.nil?
|
43
|
+
if SetEnvironmentVariableW(name_ptr, FFI::MemoryPointer::NULL) == PDK::Util::Windows::WIN32_FALSE
|
44
|
+
raise _('Failed to remove environment variable: %{name}') % { name: name }
|
45
|
+
end
|
46
|
+
else
|
47
|
+
FFI::MemoryPointer.from_string_to_wide_string(val) do |val_ptr|
|
48
|
+
if SetEnvironmentVariableW(name_ptr, val_ptr) == PDK::Util::Windows::WIN32_FALSE
|
49
|
+
raise _('Failed to set environment variaible: %{name}') % { name: name }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
module_function :set_environment_variable
|
56
|
+
|
57
|
+
ffi_convention :stdcall
|
58
|
+
|
59
|
+
# https://msdn.microsoft.com/en-us/library/windows/desktop/ms683187(v=vs.85).aspx
|
60
|
+
# LPTCH GetEnvironmentStrings(void);
|
61
|
+
ffi_lib :kernel32
|
62
|
+
attach_function_private :GetEnvironmentStringsW, [], :pointer
|
63
|
+
|
64
|
+
# https://msdn.microsoft.com/en-us/library/windows/desktop/ms683151(v=vs.85).aspx
|
65
|
+
# BOOL FreeEnvironmentStrings(
|
66
|
+
# _In_ LPTCH lpszEnvironmentBlock
|
67
|
+
# );
|
68
|
+
ffi_lib :kernel32
|
69
|
+
attach_function_private :FreeEnvironmentStringsW, [:pointer], :win32_bool
|
70
|
+
|
71
|
+
# https://msdn.microsoft.com/en-us/library/windows/desktop/ms686206(v=vs.85).aspx
|
72
|
+
# BOOL WINAPI SetEnvironmentVariableW(
|
73
|
+
# _In_ LPCTSTR lpName,
|
74
|
+
# _In_opt_ LPCTSTR lpValue
|
75
|
+
# );
|
76
|
+
ffi_lib :kernel32
|
77
|
+
attach_function_private :SetEnvironmentVariableW, [:lpcwstr, :lpcwstr],
|
78
|
+
:win32_bool
|
79
|
+
end
|