pdk 2.3.0 → 2.4.0

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.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1329 -1321
  3. data/LICENSE +201 -201
  4. data/README.md +163 -163
  5. data/exe/pdk +10 -10
  6. data/lib/pdk/analytics/client/google_analytics.rb +143 -143
  7. data/lib/pdk/analytics/client/noop.rb +25 -25
  8. data/lib/pdk/analytics/util.rb +19 -19
  9. data/lib/pdk/analytics.rb +30 -30
  10. data/lib/pdk/answer_file.rb +12 -12
  11. data/lib/pdk/bolt.rb +19 -19
  12. data/lib/pdk/cli/build.rb +82 -82
  13. data/lib/pdk/cli/bundle.rb +48 -48
  14. data/lib/pdk/cli/config/get.rb +26 -26
  15. data/lib/pdk/cli/config.rb +22 -22
  16. data/lib/pdk/cli/console.rb +148 -148
  17. data/lib/pdk/cli/convert.rb +52 -52
  18. data/lib/pdk/cli/env.rb +52 -52
  19. data/lib/pdk/cli/errors.rb +25 -25
  20. data/lib/pdk/cli/exec/command.rb +293 -293
  21. data/lib/pdk/cli/exec/interactive_command.rb +114 -114
  22. data/lib/pdk/cli/exec.rb +84 -84
  23. data/lib/pdk/cli/exec_group.rb +104 -104
  24. data/lib/pdk/cli/get/config.rb +24 -24
  25. data/lib/pdk/cli/get.rb +20 -20
  26. data/lib/pdk/cli/module/build.rb +12 -12
  27. data/lib/pdk/cli/module/generate.rb +47 -47
  28. data/lib/pdk/cli/module.rb +14 -14
  29. data/lib/pdk/cli/new/class.rb +32 -32
  30. data/lib/pdk/cli/new/defined_type.rb +32 -32
  31. data/lib/pdk/cli/new/fact.rb +29 -29
  32. data/lib/pdk/cli/new/function.rb +29 -29
  33. data/lib/pdk/cli/new/module.rb +53 -53
  34. data/lib/pdk/cli/new/provider.rb +29 -29
  35. data/lib/pdk/cli/new/task.rb +34 -34
  36. data/lib/pdk/cli/new/test.rb +52 -52
  37. data/lib/pdk/cli/new/transport.rb +27 -27
  38. data/lib/pdk/cli/new.rb +21 -21
  39. data/lib/pdk/cli/release/prep.rb +39 -39
  40. data/lib/pdk/cli/release/publish.rb +50 -50
  41. data/lib/pdk/cli/release.rb +194 -194
  42. data/lib/pdk/cli/remove/config.rb +80 -80
  43. data/lib/pdk/cli/remove.rb +20 -20
  44. data/lib/pdk/cli/set/config.rb +119 -119
  45. data/lib/pdk/cli/set.rb +20 -20
  46. data/lib/pdk/cli/test/unit.rb +90 -90
  47. data/lib/pdk/cli/test.rb +11 -11
  48. data/lib/pdk/cli/update.rb +64 -64
  49. data/lib/pdk/cli/util/command_redirector.rb +27 -27
  50. data/lib/pdk/cli/util/interview.rb +72 -72
  51. data/lib/pdk/cli/util/option_normalizer.rb +55 -55
  52. data/lib/pdk/cli/util/option_validator.rb +68 -68
  53. data/lib/pdk/cli/util/spinner.rb +13 -13
  54. data/lib/pdk/cli/util/update_manager_printer.rb +82 -82
  55. data/lib/pdk/cli/util.rb +305 -305
  56. data/lib/pdk/cli/validate.rb +116 -116
  57. data/lib/pdk/cli.rb +175 -175
  58. data/lib/pdk/config/analytics_schema.json +26 -26
  59. data/lib/pdk/config/errors.rb +5 -5
  60. data/lib/pdk/config/ini_file.rb +183 -183
  61. data/lib/pdk/config/ini_file_setting.rb +39 -39
  62. data/lib/pdk/config/json.rb +34 -34
  63. data/lib/pdk/config/json_schema_namespace.rb +142 -142
  64. data/lib/pdk/config/json_schema_setting.rb +53 -53
  65. data/lib/pdk/config/json_with_schema.rb +49 -49
  66. data/lib/pdk/config/namespace.rb +354 -354
  67. data/lib/pdk/config/setting.rb +135 -135
  68. data/lib/pdk/config/validator.rb +31 -31
  69. data/lib/pdk/config/yaml.rb +46 -46
  70. data/lib/pdk/config/yaml_with_schema.rb +59 -59
  71. data/lib/pdk/config.rb +390 -390
  72. data/lib/pdk/context/control_repo.rb +60 -60
  73. data/lib/pdk/context/module.rb +28 -28
  74. data/lib/pdk/context/none.rb +22 -22
  75. data/lib/pdk/context.rb +99 -99
  76. data/lib/pdk/control_repo.rb +90 -90
  77. data/lib/pdk/generate/defined_type.rb +43 -43
  78. data/lib/pdk/generate/fact.rb +25 -25
  79. data/lib/pdk/generate/function.rb +48 -48
  80. data/lib/pdk/generate/module.rb +352 -352
  81. data/lib/pdk/generate/provider.rb +28 -28
  82. data/lib/pdk/generate/puppet_class.rb +43 -43
  83. data/lib/pdk/generate/puppet_object.rb +232 -232
  84. data/lib/pdk/generate/task.rb +68 -68
  85. data/lib/pdk/generate/transport.rb +33 -33
  86. data/lib/pdk/generate.rb +24 -24
  87. data/lib/pdk/i18n.rb +4 -4
  88. data/lib/pdk/logger.rb +45 -45
  89. data/lib/pdk/module/build.rb +322 -322
  90. data/lib/pdk/module/convert.rb +296 -296
  91. data/lib/pdk/module/metadata.rb +202 -202
  92. data/lib/pdk/module/release.rb +260 -260
  93. data/lib/pdk/module/update.rb +131 -131
  94. data/lib/pdk/module/update_manager.rb +227 -227
  95. data/lib/pdk/module.rb +30 -30
  96. data/lib/pdk/report/event.rb +370 -370
  97. data/lib/pdk/report.rb +121 -121
  98. data/lib/pdk/template/fetcher/git.rb +85 -85
  99. data/lib/pdk/template/fetcher/local.rb +28 -28
  100. data/lib/pdk/template/fetcher.rb +98 -98
  101. data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +116 -116
  102. data/lib/pdk/template/renderer/v1/renderer.rb +132 -132
  103. data/lib/pdk/template/renderer/v1/template_file.rb +102 -102
  104. data/lib/pdk/template/renderer/v1.rb +25 -25
  105. data/lib/pdk/template/renderer.rb +96 -96
  106. data/lib/pdk/template/template_dir.rb +67 -67
  107. data/lib/pdk/template.rb +59 -59
  108. data/lib/pdk/tests/unit.rb +252 -252
  109. data/lib/pdk/util/bundler.rb +259 -259
  110. data/lib/pdk/util/changelog_generator.rb +137 -137
  111. data/lib/pdk/util/env.rb +47 -47
  112. data/lib/pdk/util/filesystem.rb +138 -138
  113. data/lib/pdk/util/git.rb +179 -179
  114. data/lib/pdk/util/json_finder.rb +85 -85
  115. data/lib/pdk/util/puppet_strings.rb +125 -125
  116. data/lib/pdk/util/puppet_version.rb +266 -266
  117. data/lib/pdk/util/ruby_version.rb +179 -179
  118. data/lib/pdk/util/template_uri.rb +295 -295
  119. data/lib/pdk/util/vendored_file.rb +93 -93
  120. data/lib/pdk/util/version.rb +43 -43
  121. data/lib/pdk/util/windows/api_types.rb +82 -82
  122. data/lib/pdk/util/windows/file.rb +36 -36
  123. data/lib/pdk/util/windows/process.rb +79 -79
  124. data/lib/pdk/util/windows/string.rb +16 -16
  125. data/lib/pdk/util/windows.rb +15 -15
  126. data/lib/pdk/util.rb +278 -277
  127. data/lib/pdk/validate/control_repo/control_repo_validator_group.rb +23 -23
  128. data/lib/pdk/validate/control_repo/environment_conf_validator.rb +98 -98
  129. data/lib/pdk/validate/external_command_validator.rb +208 -208
  130. data/lib/pdk/validate/internal_ruby_validator.rb +100 -100
  131. data/lib/pdk/validate/invokable_validator.rb +228 -228
  132. data/lib/pdk/validate/metadata/metadata_json_lint_validator.rb +86 -86
  133. data/lib/pdk/validate/metadata/metadata_syntax_validator.rb +78 -78
  134. data/lib/pdk/validate/metadata/metadata_validator_group.rb +20 -20
  135. data/lib/pdk/validate/puppet/puppet_epp_validator.rb +133 -133
  136. data/lib/pdk/validate/puppet/puppet_lint_validator.rb +66 -66
  137. data/lib/pdk/validate/puppet/puppet_syntax_validator.rb +137 -137
  138. data/lib/pdk/validate/puppet/puppet_validator_group.rb +21 -21
  139. data/lib/pdk/validate/ruby/ruby_rubocop_validator.rb +80 -80
  140. data/lib/pdk/validate/ruby/ruby_validator_group.rb +19 -19
  141. data/lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb +88 -88
  142. data/lib/pdk/validate/tasks/tasks_name_validator.rb +50 -50
  143. data/lib/pdk/validate/tasks/tasks_validator_group.rb +20 -20
  144. data/lib/pdk/validate/validator.rb +118 -118
  145. data/lib/pdk/validate/validator_group.rb +104 -104
  146. data/lib/pdk/validate/yaml/yaml_syntax_validator.rb +95 -95
  147. data/lib/pdk/validate/yaml/yaml_validator_group.rb +19 -19
  148. data/lib/pdk/validate.rb +94 -94
  149. data/lib/pdk/version.rb +4 -4
  150. data/lib/pdk.rb +76 -76
  151. data/locales/config.yaml +21 -21
  152. data/locales/pdk.pot +2094 -2094
  153. metadata +5 -6
@@ -1,116 +1,116 @@
1
- require 'pdk'
2
-
3
- module PDK
4
- module Template
5
- module Renderer
6
- module V1
7
- # The old templating code in the PDK passed through a TemplateDir object. This class mimics the methods
8
- # of that old class so that existing custom templates will still function with the newer refactor templating code.
9
- # Methods which have no use in custom templates exist but do no nothing, for example `def render; end`
10
- #
11
- # @see https://raw.githubusercontent.com/puppetlabs/pdk/4ffd58062c77ad1e54d2fe16b16015f7207bcee8/lib/pdk/module/template_dir/base.rb
12
- # :nocov: This class is tested in the packaging and acceptance testing suites
13
- class LegacyTemplateDir
14
- attr_accessor :module_metadata
15
- attr_reader :uri
16
-
17
- def initialize(context, uri, path, module_metadata = {})
18
- @uri = uri
19
- @module_metadata = module_metadata
20
- @context = context
21
- @path = path
22
- end
23
-
24
- def metadata; end
25
-
26
- def render; end
27
-
28
- def object_template_for; end
29
-
30
- def object_config
31
- config_for(nil)
32
- end
33
-
34
- # Generate a hash of data to be used when rendering the specified
35
- # template.
36
- #
37
- # @param dest_path [String] The destination path of the file that the
38
- # data is for, relative to the root of the module.
39
- #
40
- # @return [Hash] The data that will be available to the template via the
41
- # `@configs` instance variable.
42
- #
43
- # @api private
44
- def config_for(dest_path, sync_config_path = nil)
45
- require 'pdk/util'
46
- require 'pdk/analytics'
47
-
48
- module_root = PDK::Util.module_root
49
- sync_config_path ||= File.join(module_root, '.sync.yml') unless module_root.nil?
50
- config_path = File.join(@path, 'config_defaults.yml')
51
-
52
- if @config.nil?
53
- require 'deep_merge'
54
- conf_defaults = read_config(config_path)
55
- @sync_config = read_config(sync_config_path) unless sync_config_path.nil?
56
- @config = conf_defaults
57
- @config.deep_merge!(@sync_config, knockout_prefix: '---') unless @sync_config.nil?
58
- end
59
- file_config = @config.fetch(:global, {})
60
- file_config['module_metadata'] = @module_metadata
61
- file_config.merge!(@config.fetch(dest_path, {})) unless dest_path.nil?
62
- file_config.merge!(@config).tap do |c|
63
- if uri.default?
64
- file_value = if c['unmanaged']
65
- 'unmanaged'
66
- elsif c['delete']
67
- 'deleted'
68
- elsif @sync_config && @sync_config.key?(dest_path)
69
- 'customized'
70
- else
71
- 'default'
72
- end
73
-
74
- PDK.analytics.event('TemplateDir', 'file', label: dest_path, value: file_value)
75
- end
76
- end
77
- end
78
-
79
- # Generates a hash of data from a given yaml file location.
80
- #
81
- # @param loc [String] The path of the yaml config file.
82
- #
83
- # @warn If the specified path is not a valid yaml file. Returns an empty Hash
84
- # if so.
85
- #
86
- # @return [Hash] The data that has been read in from the given yaml file.
87
- #
88
- # @api private
89
- def read_config(loc)
90
- if PDK::Util::Filesystem.file?(loc) && PDK::Util::Filesystem.readable?(loc)
91
- require 'yaml'
92
-
93
- begin
94
- YAML.safe_load(PDK::Util::Filesystem.read_file(loc), [], [], true)
95
- rescue Psych::SyntaxError => e
96
- PDK.logger.warn _("'%{file}' is not a valid YAML file: %{problem} %{context} at line %{line} column %{column}") % {
97
- file: loc,
98
- problem: e.problem,
99
- context: e.context,
100
- line: e.line,
101
- column: e.column,
102
- }
103
- {}
104
- end
105
- else
106
- {}
107
- end
108
- end
109
-
110
- def template_path(_uri); end
111
- end
112
- # :nocov:
113
- end
114
- end
115
- end
116
- end
1
+ require 'pdk'
2
+
3
+ module PDK
4
+ module Template
5
+ module Renderer
6
+ module V1
7
+ # The old templating code in the PDK passed through a TemplateDir object. This class mimics the methods
8
+ # of that old class so that existing custom templates will still function with the newer refactor templating code.
9
+ # Methods which have no use in custom templates exist but do no nothing, for example `def render; end`
10
+ #
11
+ # @see https://raw.githubusercontent.com/puppetlabs/pdk/4ffd58062c77ad1e54d2fe16b16015f7207bcee8/lib/pdk/module/template_dir/base.rb
12
+ # :nocov: This class is tested in the packaging and acceptance testing suites
13
+ class LegacyTemplateDir
14
+ attr_accessor :module_metadata
15
+ attr_reader :uri
16
+
17
+ def initialize(context, uri, path, module_metadata = {})
18
+ @uri = uri
19
+ @module_metadata = module_metadata
20
+ @context = context
21
+ @path = path
22
+ end
23
+
24
+ def metadata; end
25
+
26
+ def render; end
27
+
28
+ def object_template_for; end
29
+
30
+ def object_config
31
+ config_for(nil)
32
+ end
33
+
34
+ # Generate a hash of data to be used when rendering the specified
35
+ # template.
36
+ #
37
+ # @param dest_path [String] The destination path of the file that the
38
+ # data is for, relative to the root of the module.
39
+ #
40
+ # @return [Hash] The data that will be available to the template via the
41
+ # `@configs` instance variable.
42
+ #
43
+ # @api private
44
+ def config_for(dest_path, sync_config_path = nil)
45
+ require 'pdk/util'
46
+ require 'pdk/analytics'
47
+
48
+ module_root = PDK::Util.module_root
49
+ sync_config_path ||= File.join(module_root, '.sync.yml') unless module_root.nil?
50
+ config_path = File.join(@path, 'config_defaults.yml')
51
+
52
+ if @config.nil?
53
+ require 'deep_merge'
54
+ conf_defaults = read_config(config_path)
55
+ @sync_config = read_config(sync_config_path) unless sync_config_path.nil?
56
+ @config = conf_defaults
57
+ @config.deep_merge!(@sync_config, knockout_prefix: '---') unless @sync_config.nil?
58
+ end
59
+ file_config = @config.fetch(:global, {})
60
+ file_config['module_metadata'] = @module_metadata
61
+ file_config.merge!(@config.fetch(dest_path, {})) unless dest_path.nil?
62
+ file_config.merge!(@config).tap do |c|
63
+ if uri.default?
64
+ file_value = if c['unmanaged']
65
+ 'unmanaged'
66
+ elsif c['delete']
67
+ 'deleted'
68
+ elsif @sync_config && @sync_config.key?(dest_path)
69
+ 'customized'
70
+ else
71
+ 'default'
72
+ end
73
+
74
+ PDK.analytics.event('TemplateDir', 'file', label: dest_path, value: file_value)
75
+ end
76
+ end
77
+ end
78
+
79
+ # Generates a hash of data from a given yaml file location.
80
+ #
81
+ # @param loc [String] The path of the yaml config file.
82
+ #
83
+ # @warn If the specified path is not a valid yaml file. Returns an empty Hash
84
+ # if so.
85
+ #
86
+ # @return [Hash] The data that has been read in from the given yaml file.
87
+ #
88
+ # @api private
89
+ def read_config(loc)
90
+ if PDK::Util::Filesystem.file?(loc) && PDK::Util::Filesystem.readable?(loc)
91
+ require 'yaml'
92
+
93
+ begin
94
+ YAML.safe_load(PDK::Util::Filesystem.read_file(loc), [], [], true)
95
+ rescue Psych::SyntaxError => e
96
+ PDK.logger.warn _("'%{file}' is not a valid YAML file: %{problem} %{context} at line %{line} column %{column}") % {
97
+ file: loc,
98
+ problem: e.problem,
99
+ context: e.context,
100
+ line: e.line,
101
+ column: e.column,
102
+ }
103
+ {}
104
+ end
105
+ else
106
+ {}
107
+ end
108
+ end
109
+
110
+ def template_path(_uri); end
111
+ end
112
+ # :nocov:
113
+ end
114
+ end
115
+ end
116
+ end
@@ -1,132 +1,132 @@
1
- require 'pdk'
2
- require 'pdk/template/renderer'
3
-
4
- module PDK
5
- module Template
6
- module Renderer
7
- module V1
8
- class Renderer < PDK::Template::Renderer::AbstractRenderer
9
- # @see PDK::Template::Renderer::AbstractRenderer.render
10
- def render(template_type, _name, options = {})
11
- render_module(options) { |*args| yield(*args) } if template_type == PDK::Template::MODULE_TEMPLATE_TYPE
12
- end
13
-
14
- # @see PDK::Template::Renderer::AbstractRenderer.has_single_item?
15
- def has_single_item?(item_path) # rubocop:disable Naming/PredicateName
16
- PDK::Util::Filesystem.exist?(single_item_path(item_path))
17
- end
18
-
19
- # @see PDK::Template::Renderer::AbstractRenderer.render_single_item
20
- def render_single_item(relative_file_path, template_data_hash)
21
- template_file = single_item_path(relative_file_path)
22
- return nil unless PDK::Util::Filesystem.file?(template_file) && PDK::Util::Filesystem.readable?(template_file)
23
-
24
- PDK.logger.debug(_("Rendering '%{template}'...") % { template: template_file })
25
- new_template_file(template_file, template_data_hash).render
26
- end
27
-
28
- # Returns the full path for a single item
29
- #
30
- # @param item_path [String] The path of the single item to render
31
- # @return [String]
32
- # @api private
33
- #:nocov:
34
- def single_item_path(item_path)
35
- File.join(template_root, 'object_templates', item_path)
36
- end
37
- #:nocov:
38
-
39
- # Helper method used during testing
40
- #:nocov:
41
- # @api private
42
- def new_template_file(template_file, template_data_hash)
43
- TemplateFile.new(template_file, template_data_hash)
44
- end
45
- #:nocov:
46
-
47
- # Helper method used during testing
48
- #:nocov:
49
- # @api private
50
- def new_legacy_template_dir(context, uri, path, module_metadata = {})
51
- LegacyTemplateDir.new(context, uri, path, module_metadata)
52
- end
53
- #:nocov:
54
-
55
- # Renders a new module
56
- #
57
- # @param options [Hash{Object => Object}] A list of options to pass through to the renderer. See PDK::Template::TemplateDir helper methods for other options
58
- # @see #render
59
- # @api private
60
- #:nocov: This is tested in acceptance and packaging tests
61
- def render_module(options = {})
62
- require 'pdk/template/renderer/v1/template_file'
63
-
64
- moduleroot_dir = File.join(template_root, 'moduleroot')
65
- moduleroot_init = File.join(template_root, 'moduleroot_init')
66
-
67
- dirs = [moduleroot_dir]
68
- dirs << moduleroot_init if options[:include_first_time]
69
-
70
- legacy_template_dir = new_legacy_template_dir(context, template_uri, template_root, options[:module_metadata] || {})
71
-
72
- files_in_template(dirs).each do |template_file, template_loc|
73
- template_file = template_file.to_s
74
- PDK.logger.debug(_("Rendering '%{template}'...") % { template: template_file })
75
- dest_path = template_file.sub(%r{\.erb\Z}, '')
76
- config = legacy_template_dir.config_for(dest_path)
77
-
78
- dest_status = if template_loc.start_with?(moduleroot_init)
79
- :init
80
- else
81
- :manage
82
- end
83
-
84
- if config['unmanaged']
85
- dest_status = :unmanage
86
- elsif config['delete']
87
- dest_status = :delete
88
- else
89
- begin
90
- dest_content = new_template_file(File.join(template_loc, template_file), configs: config, template_dir: legacy_template_dir).render
91
- rescue => error
92
- error_msg = _(
93
- "Failed to render template '%{template}'\n" \
94
- '%{exception}: %{message}',
95
- ) % { template: template_file, exception: error.class, message: error.message }
96
- raise PDK::CLI::FatalError, error_msg
97
- end
98
- end
99
-
100
- yield dest_path, dest_content, dest_status
101
- end
102
- end
103
- #:nocov:
104
-
105
- # Returns all files in the given template directories
106
- #
107
- # @param dirs [Array[String]] Directories to search in
108
- # @param glob_suffix [Array[String]] File glob to use when searching for files. Defaults to ['**', '*']
109
- #
110
- # @return [Hash{String => String}] Key is the template file relative path and the value is the absolute path to the template directory
111
- # @api private
112
- def files_in_template(dirs, glob_suffix = ['**', '*'])
113
- temp_paths = []
114
- dirlocs = []
115
- dirs.each do |dir|
116
- raise ArgumentError, _("The directory '%{dir}' doesn't exist") % { dir: dir } unless PDK::Util::Filesystem.directory?(dir)
117
- temp_paths += PDK::Util::Filesystem.glob(File.join(dir, *glob_suffix), File::FNM_DOTMATCH).select do |template_path|
118
- if PDK::Util::Filesystem.file?(template_path) && !PDK::Util::Filesystem.symlink?(template_path)
119
- dirlocs << dir
120
- end
121
- end
122
- temp_paths.map do |template_path|
123
- template_path.sub!(%r{\A#{Regexp.escape(dir)}#{Regexp.escape(File::SEPARATOR)}}, '')
124
- end
125
- end
126
- Hash[temp_paths.zip dirlocs]
127
- end
128
- end
129
- end
130
- end
131
- end
132
- end
1
+ require 'pdk'
2
+ require 'pdk/template/renderer'
3
+
4
+ module PDK
5
+ module Template
6
+ module Renderer
7
+ module V1
8
+ class Renderer < PDK::Template::Renderer::AbstractRenderer
9
+ # @see PDK::Template::Renderer::AbstractRenderer.render
10
+ def render(template_type, _name, options = {})
11
+ render_module(options) { |*args| yield(*args) } if template_type == PDK::Template::MODULE_TEMPLATE_TYPE
12
+ end
13
+
14
+ # @see PDK::Template::Renderer::AbstractRenderer.has_single_item?
15
+ def has_single_item?(item_path) # rubocop:disable Naming/PredicateName
16
+ PDK::Util::Filesystem.exist?(single_item_path(item_path))
17
+ end
18
+
19
+ # @see PDK::Template::Renderer::AbstractRenderer.render_single_item
20
+ def render_single_item(relative_file_path, template_data_hash)
21
+ template_file = single_item_path(relative_file_path)
22
+ return nil unless PDK::Util::Filesystem.file?(template_file) && PDK::Util::Filesystem.readable?(template_file)
23
+
24
+ PDK.logger.debug(_("Rendering '%{template}'...") % { template: template_file })
25
+ new_template_file(template_file, template_data_hash).render
26
+ end
27
+
28
+ # Returns the full path for a single item
29
+ #
30
+ # @param item_path [String] The path of the single item to render
31
+ # @return [String]
32
+ # @api private
33
+ #:nocov:
34
+ def single_item_path(item_path)
35
+ File.join(template_root, 'object_templates', item_path)
36
+ end
37
+ #:nocov:
38
+
39
+ # Helper method used during testing
40
+ #:nocov:
41
+ # @api private
42
+ def new_template_file(template_file, template_data_hash)
43
+ TemplateFile.new(template_file, template_data_hash)
44
+ end
45
+ #:nocov:
46
+
47
+ # Helper method used during testing
48
+ #:nocov:
49
+ # @api private
50
+ def new_legacy_template_dir(context, uri, path, module_metadata = {})
51
+ LegacyTemplateDir.new(context, uri, path, module_metadata)
52
+ end
53
+ #:nocov:
54
+
55
+ # Renders a new module
56
+ #
57
+ # @param options [Hash{Object => Object}] A list of options to pass through to the renderer. See PDK::Template::TemplateDir helper methods for other options
58
+ # @see #render
59
+ # @api private
60
+ #:nocov: This is tested in acceptance and packaging tests
61
+ def render_module(options = {})
62
+ require 'pdk/template/renderer/v1/template_file'
63
+
64
+ moduleroot_dir = File.join(template_root, 'moduleroot')
65
+ moduleroot_init = File.join(template_root, 'moduleroot_init')
66
+
67
+ dirs = [moduleroot_dir]
68
+ dirs << moduleroot_init if options[:include_first_time]
69
+
70
+ legacy_template_dir = new_legacy_template_dir(context, template_uri, template_root, options[:module_metadata] || {})
71
+
72
+ files_in_template(dirs).each do |template_file, template_loc|
73
+ template_file = template_file.to_s
74
+ PDK.logger.debug(_("Rendering '%{template}'...") % { template: template_file })
75
+ dest_path = template_file.sub(%r{\.erb\Z}, '')
76
+ config = legacy_template_dir.config_for(dest_path)
77
+
78
+ dest_status = if template_loc.start_with?(moduleroot_init)
79
+ :init
80
+ else
81
+ :manage
82
+ end
83
+
84
+ if config['unmanaged']
85
+ dest_status = :unmanage
86
+ elsif config['delete']
87
+ dest_status = :delete
88
+ else
89
+ begin
90
+ dest_content = new_template_file(File.join(template_loc, template_file), configs: config, template_dir: legacy_template_dir).render
91
+ rescue => error
92
+ error_msg = _(
93
+ "Failed to render template '%{template}'\n" \
94
+ '%{exception}: %{message}',
95
+ ) % { template: template_file, exception: error.class, message: error.message }
96
+ raise PDK::CLI::FatalError, error_msg
97
+ end
98
+ end
99
+
100
+ yield dest_path, dest_content, dest_status
101
+ end
102
+ end
103
+ #:nocov:
104
+
105
+ # Returns all files in the given template directories
106
+ #
107
+ # @param dirs [Array[String]] Directories to search in
108
+ # @param glob_suffix [Array[String]] File glob to use when searching for files. Defaults to ['**', '*']
109
+ #
110
+ # @return [Hash{String => String}] Key is the template file relative path and the value is the absolute path to the template directory
111
+ # @api private
112
+ def files_in_template(dirs, glob_suffix = ['**', '*'])
113
+ temp_paths = []
114
+ dirlocs = []
115
+ dirs.each do |dir|
116
+ raise ArgumentError, _("The directory '%{dir}' doesn't exist") % { dir: dir } unless PDK::Util::Filesystem.directory?(dir)
117
+ temp_paths += PDK::Util::Filesystem.glob(File.join(dir, *glob_suffix), File::FNM_DOTMATCH).select do |template_path|
118
+ if PDK::Util::Filesystem.file?(template_path) && !PDK::Util::Filesystem.symlink?(template_path)
119
+ dirlocs << dir
120
+ end
121
+ end
122
+ temp_paths.map do |template_path|
123
+ template_path.sub!(%r{\A#{Regexp.escape(dir)}#{Regexp.escape(File::SEPARATOR)}}, '')
124
+ end
125
+ end
126
+ Hash[temp_paths.zip dirlocs]
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end