Module: PDK::Util

Defined in:
lib/pdk/util.rb,
lib/pdk/util/env.rb,
lib/pdk/util/git.rb,
lib/pdk/util/bundler.rb,
lib/pdk/util/version.rb,
lib/pdk/util/windows.rb,
lib/pdk/util/filesystem.rb,
lib/pdk/util/json_finder.rb,
lib/pdk/util/ruby_version.rb,
lib/pdk/util/template_uri.rb,
lib/pdk/util/windows/file.rb,
lib/pdk/util/vendored_file.rb,
lib/pdk/util/puppet_strings.rb,
lib/pdk/util/puppet_version.rb,
lib/pdk/util/windows/string.rb,
lib/pdk/util/windows/process.rb,
lib/pdk/util/windows/api_types.rb,
lib/pdk/util/changelog_generator.rb

Defined Under Namespace

Modules: Bundler, ChangelogGenerator, Filesystem, Git, PuppetStrings, Version, Windows Classes: Env, GitError, JSONFinder, PuppetVersion, RubyVersion, TemplateURI, VendoredFile

Constant Summary collapse

MODULE_FOLDERS =
['manifests', 'lib/puppet', 'lib/puppet_x', 'lib/facter', 'tasks', 'facts.d', 'functions', 'types'].freeze

Class Method Summary collapse

Class Method Details

.cachedirString

Returns the fully qualified path to a per-user PDK cachedir.



125
126
127
128
129
130
131
# File 'lib/pdk/util.rb', line 125

def cachedir
  if Gem.win_platform?
    File.join(PDK::Util::Env['LOCALAPPDATA'], 'PDK', 'cache')
  else
    File.join(Dir.home, '.pdk', 'cache')
  end
end

.canonical_path(path) ⇒ String

Return an expanded, absolute path



78
79
80
81
82
83
84
85
86
# File 'lib/pdk/util.rb', line 78

def canonical_path(path)
  if Gem.win_platform?
    raise PDK::CLI::FatalError, format("Cannot resolve a full path to '%{path}', as it does not currently exist.", path: path) unless PDK::Util::Filesystem.exist?(path)

    PDK::Util::Windows::File.get_long_pathname(path)
  else
    PDK::Util::Filesystem.expand_path(path)
  end
end

.configdirObject



134
135
136
137
138
139
140
# File 'lib/pdk/util.rb', line 134

def configdir
  if Gem.win_platform?
    File.join(PDK::Util::Env['LOCALAPPDATA'], 'PDK')
  else
    File.join(PDK::Util::Env.fetch('XDG_CONFIG_HOME', File.join(Dir.home, '.config')), 'pdk')
  end
end

.deep_duplicate(object) ⇒ Object

Does a deep copy instead of a shallow copy of an object.



257
258
259
260
261
262
263
264
265
266
267
268
# File 'lib/pdk/util.rb', line 257

def deep_duplicate(object)
  case object
  when Array
    object.map { |item| deep_duplicate(item) }
  when Hash
    hash = object.dup
    hash.each_pair { |key, value| hash[key] = deep_duplicate(value) }
    hash
  else
    object
  end
end

.development_mode?Boolean



96
97
98
99
100
# File 'lib/pdk/util.rb', line 96

def development_mode?
  require 'pdk/util/version'

  !PDK::Util::Version.git_ref.nil? || PDK::VERSION.end_with?('.pre')
end

.exit_process(exit_code) ⇒ Object

Calls Kernel.exit with an exitcode



32
33
34
# File 'lib/pdk/util.rb', line 32

def exit_process(exit_code)
  exit exit_code
end

.find_all_json_in(text) ⇒ Array<Hash>

Iterate through possible JSON documents for all valid JSON



202
203
204
# File 'lib/pdk/util.rb', line 202

def find_all_json_in(text)
  PDK::Util::JSONFinder.new(text).objects
end

.find_first_json_in(text) ⇒ Hash?

Iterate through possible JSON documents until we find one that is valid.



192
193
194
# File 'lib/pdk/util.rb', line 192

def find_first_json_in(text)
  find_all_json_in(text).first
end

.find_upwards(target, start_dir = nil) ⇒ String?

Searches upwards from current working directory for the given target file.



45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/pdk/util.rb', line 45

def find_upwards(target, start_dir = nil)
  previous = nil
  current  = PDK::Util::Filesystem.expand_path(start_dir || Dir.pwd)

  until !PDK::Util::Filesystem.directory?(current) || current == previous
    filename = File.join(current, target)
    return filename if PDK::Util::Filesystem.file?(filename)

    previous = current
    current = PDK::Util::Filesystem.expand_path('..', current)
  end
end

.gem_install?Boolean



103
104
105
# File 'lib/pdk/util.rb', line 103

def gem_install?
  !(package_install? || development_mode?)
end

.in_module_root?(path = Dir.pwd) ⇒ boolean

Returns true or false depending on if any of the common directories in a module are found in the specified directory. If a directory is not specified, the current working directory is used.



181
182
183
184
# File 'lib/pdk/util.rb', line 181

def in_module_root?(path = Dir.pwd)
  PDK::Util::MODULE_FOLDERS.any? { |dir| PDK::Util::Filesystem.directory?(File.join(path, dir)) } ||
    PDK::Util::Filesystem.file?(File.join(path, 'metadata.json'))
end

.make_tmpdir_name(base) ⇒ String

Generate a name for a temporary directory.



64
65
66
67
68
69
70
# File 'lib/pdk/util.rb', line 64

def make_tmpdir_name(base)
  require 'tmpdir'

  t = Time.now.strftime('%Y%m%d')
  name = "#{base}#{t}-#{Process.pid}-#{rand(0x100000000).to_s(36)}"
  File.join(Dir.tmpdir, name)
end

.module_fixtures_dirString

The module's fixtures directory for spec testing



169
170
171
172
# File 'lib/pdk/util.rb', line 169

def module_fixtures_dir
  dir = module_root
  File.join(module_root, 'spec', 'fixtures') unless dir.nil?
end

.module_metadata(module_path = nil) ⇒ Object

TO-DO: Refactor replacement of lib/pdk/module/build.rb:metadata to use this function instead



223
224
225
226
227
# File 'lib/pdk/util.rb', line 223

def (module_path = nil)
  require 'pdk/module/metadata'
  module_path ||= module_root
  PDK::Module::.from_file(File.join(module_path, 'metadata.json')).data
end

.module_pdk_compatible?(module_path = nil) ⇒ Boolean

TO-DO: Refactor replacement of lib/pdk/module/build.rb:module_pdk_compatible? to use this function instead



232
233
234
# File 'lib/pdk/util.rb', line 232

def module_pdk_compatible?(module_path = nil)
  ['pdk-version', 'template-url'].any? { |key| (module_path).key?(key) }
end

.module_pdk_versionObject



237
238
239
240
241
242
243
244
245
246
247
248
# File 'lib/pdk/util.rb', line 237

def module_pdk_version
   = 

  if .nil? || .fetch('pdk-version', nil).nil?
    nil
  else
    ['pdk-version'].split.first
  end
rescue ArgumentError => e
  PDK.logger.error(e)
  nil
end

.module_rootString?

Returns path to the root of the module being worked on.



157
158
159
160
161
162
163
164
# File 'lib/pdk/util.rb', line 157

def module_root
   = find_upwards('metadata.json')
  if 
    File.dirname()
  elsif in_module_root?
    Dir.pwd
  end
end

.package_cachedirObject



117
118
119
# File 'lib/pdk/util.rb', line 117

def package_cachedir
  File.join(pdk_package_basedir, 'share', 'cache')
end

.package_install?Boolean



89
90
91
92
93
# File 'lib/pdk/util.rb', line 89

def package_install?
  require 'pdk/util/version'

  !PDK::Util::Version.version_file.nil?
end

.pdk_package_basedirObject



108
109
110
111
112
113
114
# File 'lib/pdk/util.rb', line 108

def pdk_package_basedir
  raise PDK::CLI::FatalError, 'Package basedir requested for non-package install.' unless package_install?

  require 'pdk/util/version'

  File.dirname(PDK::Util::Version.version_file)
end

.system_configdirObject



143
144
145
146
147
148
149
150
# File 'lib/pdk/util.rb', line 143

def system_configdir
  return @system_configdir unless @system_configdir.nil?
  return @system_configdir = File.join(File::SEPARATOR, 'opt', 'puppetlabs', 'pdk', 'config') unless Gem.win_platform?

  return @system_configdir = File.join(PDK::Util::Env['ProgramData'], 'PuppetLabs', 'PDK') unless PDK::Util::Env['ProgramData'].nil?

  @system_configdir = File.join(PDK::Util::Env['AllUsersProfile'], 'PuppetLabs', 'PDK')
end

.targets_relative_to_pwd(targets) ⇒ Array<String>

Returns the targets' paths relative to the working directory



210
211
212
213
214
215
216
217
218
# File 'lib/pdk/util.rb', line 210

def targets_relative_to_pwd(targets)
  targets.map do |t|
    if Pathname.new(t).absolute?
      Pathname.new(t).relative_path_from(Pathname.pwd)
    else
      t
    end
  end
end