pdk 3.0.1 → 3.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +23 -1
- data/lib/pdk/cli/build.rb +0 -2
- data/lib/pdk/cli/bundle.rb +0 -2
- data/lib/pdk/cli/console.rb +0 -2
- data/lib/pdk/cli/convert.rb +3 -3
- data/lib/pdk/cli/env.rb +0 -2
- data/lib/pdk/cli/new/class.rb +0 -2
- data/lib/pdk/cli/new/defined_type.rb +0 -2
- data/lib/pdk/cli/new/fact.rb +0 -2
- data/lib/pdk/cli/new/function.rb +0 -2
- data/lib/pdk/cli/new/module.rb +0 -2
- data/lib/pdk/cli/new/provider.rb +0 -2
- data/lib/pdk/cli/new/task.rb +0 -2
- data/lib/pdk/cli/new/test.rb +0 -2
- data/lib/pdk/cli/release/prep.rb +0 -2
- data/lib/pdk/cli/release/publish.rb +0 -2
- data/lib/pdk/cli/release.rb +0 -8
- data/lib/pdk/cli/test/unit.rb +0 -2
- data/lib/pdk/cli/update.rb +3 -3
- data/lib/pdk/cli/util.rb +0 -38
- data/lib/pdk/cli/validate.rb +0 -7
- data/lib/pdk/cli.rb +0 -2
- data/lib/pdk/config/namespace.rb +3 -3
- data/lib/pdk/config/setting.rb +3 -3
- data/lib/pdk/config.rb +0 -80
- data/lib/pdk/module/convert.rb +7 -2
- data/lib/pdk/module/metadata.rb +1 -1
- data/lib/pdk/module/update_manager.rb +29 -3
- data/lib/pdk/report/event.rb +1 -1
- data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +10 -13
- data/lib/pdk/template/renderer/v1/renderer.rb +3 -1
- data/lib/pdk/template.rb +0 -3
- data/lib/pdk/util/filesystem.rb +10 -0
- data/lib/pdk/version.rb +2 -2
- data/lib/pdk.rb +0 -14
- metadata +2 -49
- data/lib/pdk/analytics/client/google_analytics.rb +0 -141
- data/lib/pdk/analytics/client/noop.rb +0 -25
- data/lib/pdk/analytics/util.rb +0 -18
- data/lib/pdk/analytics.rb +0 -30
- data/lib/pdk/config/analytics_schema.json +0 -26
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 61c49c154cc69ce1e3c47ddfdd089b42c9c4c5e610bfb2e6caf3256939a16d5d
|
|
4
|
+
data.tar.gz: 420c70b35bfaf64077b990f6853bfc92062659fc7ba36379cb053232b99313a5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3e2e8f1e63a936c310459a67a14b632e00a4ac1694fa4cc77f2849b3d19bf09cc9a5e4a19d7ce3e3a0eb6493a31141c76a72bc98d30cbb4eb7ffd1f5d3da7ca0
|
|
7
|
+
data.tar.gz: fe219a60e2cf9f7263e1b8fd8e721f143349aa3f03125649e551f9978ae3a9012c4b051f21b2707a266ed31a67772ad6c3cef026f1c5a1a0dadaf8257dc888dc
|
data/CHANGELOG.md
CHANGED
|
@@ -5,7 +5,29 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
|
|
6
6
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org).
|
|
7
7
|
|
|
8
|
-
## [v3.0
|
|
8
|
+
## [v3.2.0](https://github.com/puppetlabs/pdk/tree/v3.2.0) - 2024-05-02
|
|
9
|
+
|
|
10
|
+
[Full Changelog](https://github.com/puppetlabs/pdk/compare/v3.1.0...v3.2.0)
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- (CAT-1807) Remove analytics from the PDK [#1339](https://github.com/puppetlabs/pdk/pull/1339) ([david22swan](https://github.com/david22swan))
|
|
15
|
+
|
|
16
|
+
## [v3.1.0](https://github.com/puppetlabs/pdk/tree/v3.1.0) - 2024-04-11
|
|
17
|
+
|
|
18
|
+
[Full Changelog](https://github.com/puppetlabs/pdk/compare/v3.0.1...v3.1.0)
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- Allow `pdk convert` and `pdk update` to work in a ControlRepo context [#1310](https://github.com/puppetlabs/pdk/pull/1310) ([garrettrowell](https://github.com/garrettrowell))
|
|
23
|
+
- Support executable templates [#1289](https://github.com/puppetlabs/pdk/pull/1289) ([nabertrand](https://github.com/nabertrand))
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- (CAT-1796) Fix missing locale gem [#1337](https://github.com/puppetlabs/pdk/pull/1337) ([LukasAud](https://github.com/LukasAud))
|
|
28
|
+
- (CAT-1703) Convert concurrent-ruby from a pin to a pessimistic constraint [#1312](https://github.com/puppetlabs/pdk/pull/1312) ([david22swan](https://github.com/david22swan))
|
|
29
|
+
|
|
30
|
+
## [v3.0.1](https://github.com/puppetlabs/pdk/tree/v3.0.1) - 2023-12-13
|
|
9
31
|
|
|
10
32
|
[Full Changelog](https://github.com/puppetlabs/pdk/compare/v3.0.0...v3.0.1)
|
|
11
33
|
|
data/lib/pdk/cli/build.rb
CHANGED
data/lib/pdk/cli/bundle.rb
CHANGED
|
@@ -23,8 +23,6 @@ module PDK
|
|
|
23
23
|
screen_view_name << args[0] if args.size >= 1
|
|
24
24
|
screen_view_name << args[1] if args.size >= 2 && args[0] == 'exec'
|
|
25
25
|
|
|
26
|
-
PDK::CLI::Util.analytics_screen_view(screen_view_name.join('_'))
|
|
27
|
-
|
|
28
26
|
# Ensure that the correct Ruby is activated before running command.
|
|
29
27
|
puppet_env = PDK::CLI::Util.puppet_from_opts_or_env({})
|
|
30
28
|
PDK::Util::RubyVersion.use(puppet_env[:ruby_version])
|
data/lib/pdk/cli/console.rb
CHANGED
|
@@ -34,8 +34,6 @@ module PDK
|
|
|
34
34
|
|
|
35
35
|
PDK::CLI::Util.validate_puppet_version_opts(processed_options)
|
|
36
36
|
|
|
37
|
-
PDK::CLI::Util.analytics_screen_view('console', args)
|
|
38
|
-
|
|
39
37
|
# TODO: figure out if we need to remove default configs set by puppet
|
|
40
38
|
# so it is scoped for the module only
|
|
41
39
|
# "--environmentpath"...
|
data/lib/pdk/cli/convert.rb
CHANGED
|
@@ -18,7 +18,9 @@ module PDK
|
|
|
18
18
|
# Write the context information to the debug log
|
|
19
19
|
PDK.context.to_debug_log
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
unless PDK.context.is_a?(PDK::Context::Module) || PDK.context.is_a?(PDK::Context::ControlRepo)
|
|
22
|
+
raise PDK::CLI::ExitWithError, '`pdk convert` can only be run from inside a valid module directory.'
|
|
23
|
+
end
|
|
22
24
|
|
|
23
25
|
raise PDK::CLI::ExitWithError, 'You can not specify --noop and --force when converting a module' if opts[:noop] && opts[:force]
|
|
24
26
|
|
|
@@ -31,8 +33,6 @@ module PDK
|
|
|
31
33
|
|
|
32
34
|
PDK::CLI::Util.validate_template_opts(opts)
|
|
33
35
|
|
|
34
|
-
PDK::CLI::Util.analytics_screen_view('convert', opts)
|
|
35
|
-
|
|
36
36
|
if opts[:'skip-interview'] && opts[:'full-interview']
|
|
37
37
|
PDK.logger.info 'Ignoring --full-interview and continuing with --skip-interview.'
|
|
38
38
|
opts[:'full-interview'] = false
|
data/lib/pdk/cli/env.rb
CHANGED
|
@@ -17,8 +17,6 @@ module PDK
|
|
|
17
17
|
|
|
18
18
|
PDK::CLI::Util.validate_puppet_version_opts(opts)
|
|
19
19
|
|
|
20
|
-
PDK::CLI::Util.analytics_screen_view('env')
|
|
21
|
-
|
|
22
20
|
# Ensure that the correct Ruby is activated before running command.
|
|
23
21
|
puppet_env = PDK::CLI::Util.puppet_from_opts_or_env(opts)
|
|
24
22
|
PDK::Util::RubyVersion.use(puppet_env[:ruby_version])
|
data/lib/pdk/cli/new/class.rb
CHANGED
|
@@ -22,8 +22,6 @@ module PDK
|
|
|
22
22
|
|
|
23
23
|
raise PDK::CLI::ExitWithError, format("'%{name}' is not a valid class name", name: class_name) unless Util::OptionValidator.valid_class_name?(class_name)
|
|
24
24
|
|
|
25
|
-
PDK::CLI::Util.analytics_screen_view('new_class', opts)
|
|
26
|
-
|
|
27
25
|
updates = PDK::Generate::PuppetClass.new(PDK.context, class_name, opts).run
|
|
28
26
|
PDK::CLI::Util::UpdateManagerPrinter.print_summary(updates, tense: :past)
|
|
29
27
|
end
|
|
@@ -20,8 +20,6 @@ module PDK
|
|
|
20
20
|
|
|
21
21
|
raise PDK::CLI::ExitWithError, format("'%{name}' is not a valid defined type name", name: defined_type_name) unless Util::OptionValidator.valid_defined_type_name?(defined_type_name)
|
|
22
22
|
|
|
23
|
-
PDK::CLI::Util.analytics_screen_view('new_defined_type', opts)
|
|
24
|
-
|
|
25
23
|
require 'pdk/generate/defined_type'
|
|
26
24
|
|
|
27
25
|
updates = PDK::Generate::DefinedType.new(PDK.context, defined_type_name, opts).run
|
data/lib/pdk/cli/new/fact.rb
CHANGED
|
@@ -17,8 +17,6 @@ module PDK
|
|
|
17
17
|
|
|
18
18
|
raise PDK::CLI::ExitWithError, format("'%{name}' is not a valid fact name", name: fact_name) unless Util::OptionValidator.valid_fact_name?(fact_name)
|
|
19
19
|
|
|
20
|
-
PDK::CLI::Util.analytics_screen_view('new_fact', opts)
|
|
21
|
-
|
|
22
20
|
require 'pdk/generate/fact'
|
|
23
21
|
|
|
24
22
|
updates = PDK::Generate::Fact.new(PDK.context, fact_name, opts).run
|
data/lib/pdk/cli/new/function.rb
CHANGED
|
@@ -18,8 +18,6 @@ module PDK
|
|
|
18
18
|
|
|
19
19
|
raise PDK::CLI::ExitWithError, format("'%{name}' is not a valid function name", name: function_name) unless Util::OptionValidator.valid_function_name?(function_name)
|
|
20
20
|
|
|
21
|
-
PDK::CLI::Util.analytics_screen_view('new_function', opts)
|
|
22
|
-
|
|
23
21
|
require 'pdk/generate/function'
|
|
24
22
|
updates = PDK::Generate::Function.new(PDK.context, function_name, opts).run
|
|
25
23
|
PDK::CLI::Util::UpdateManagerPrinter.print_summary(updates, tense: :past)
|
data/lib/pdk/cli/new/module.rb
CHANGED
|
@@ -22,8 +22,6 @@ module PDK
|
|
|
22
22
|
|
|
23
23
|
PDK::CLI::Util.validate_template_opts(opts)
|
|
24
24
|
|
|
25
|
-
PDK::CLI::Util.analytics_screen_view('new_module', opts)
|
|
26
|
-
|
|
27
25
|
if opts[:'skip-interview'] && opts[:'full-interview']
|
|
28
26
|
PDK.logger.info 'Ignoring --full-interview and continuing with --skip-interview.'
|
|
29
27
|
opts[:'full-interview'] = false
|
data/lib/pdk/cli/new/provider.rb
CHANGED
|
@@ -17,8 +17,6 @@ module PDK
|
|
|
17
17
|
|
|
18
18
|
raise PDK::CLI::ExitWithError, format("'%{name}' is not a valid provider name", name: provider_name) unless Util::OptionValidator.valid_provider_name?(provider_name)
|
|
19
19
|
|
|
20
|
-
PDK::CLI::Util.analytics_screen_view('new_provider', opts)
|
|
21
|
-
|
|
22
20
|
require 'pdk/generate/provider'
|
|
23
21
|
|
|
24
22
|
updates = PDK::Generate::Provider.new(PDK.context, provider_name, opts).run
|
data/lib/pdk/cli/new/task.rb
CHANGED
|
@@ -24,8 +24,6 @@ module PDK
|
|
|
24
24
|
|
|
25
25
|
raise PDK::CLI::ExitWithError, format("'%{name}' is not a valid task name", name: task_name) unless Util::OptionValidator.valid_task_name?(task_name)
|
|
26
26
|
|
|
27
|
-
PDK::CLI::Util.analytics_screen_view('new_task', opts)
|
|
28
|
-
|
|
29
27
|
updates = PDK::Generate::Task.new(PDK.context, task_name, opts).run
|
|
30
28
|
PDK::CLI::Util::UpdateManagerPrinter.print_summary(updates, tense: :past)
|
|
31
29
|
end
|
data/lib/pdk/cli/new/test.rb
CHANGED
|
@@ -39,8 +39,6 @@ module PDK
|
|
|
39
39
|
begin
|
|
40
40
|
generator, obj = PDK::Util::PuppetStrings.find_object(object_name)
|
|
41
41
|
|
|
42
|
-
PDK::CLI::Util.analytics_screen_view('new_test', opts)
|
|
43
|
-
|
|
44
42
|
updates = generator.new(PDK.context, obj['name'], opts.merge(spec_only: true)).run
|
|
45
43
|
PDK::CLI::Util::UpdateManagerPrinter.print_summary(updates, tense: :past)
|
|
46
44
|
rescue PDK::Util::PuppetStrings::NoObjectError
|
data/lib/pdk/cli/release/prep.rb
CHANGED
data/lib/pdk/cli/release.rb
CHANGED
|
@@ -41,8 +41,6 @@ module PDK
|
|
|
41
41
|
|
|
42
42
|
Release.prepare_interview(opts) unless opts[:force]
|
|
43
43
|
|
|
44
|
-
Release.send_analytics('release', opts)
|
|
45
|
-
|
|
46
44
|
release = PDK::Module::Release.new(nil, opts)
|
|
47
45
|
|
|
48
46
|
Release.module_compatibility_checks!(release, opts)
|
|
@@ -81,12 +79,6 @@ module PDK
|
|
|
81
79
|
end
|
|
82
80
|
end
|
|
83
81
|
|
|
84
|
-
# Send_analytics for the given command and Cri options
|
|
85
|
-
def self.send_analytics(command, opts)
|
|
86
|
-
# Don't pass tokens to analytics
|
|
87
|
-
PDK::CLI::Util.analytics_screen_view(command, opts.reject { |k, _| k == :'forge-token' })
|
|
88
|
-
end
|
|
89
|
-
|
|
90
82
|
def self.prepare_interview(opts)
|
|
91
83
|
questions = []
|
|
92
84
|
|
data/lib/pdk/cli/test/unit.rb
CHANGED
|
@@ -34,8 +34,6 @@ module PDK
|
|
|
34
34
|
|
|
35
35
|
PDK::CLI::Util.module_version_check
|
|
36
36
|
|
|
37
|
-
PDK::CLI::Util.analytics_screen_view('test_unit', opts)
|
|
38
|
-
|
|
39
37
|
# Ensure that the bundled gems are up to date and correct Ruby is activated before running or listing tests.
|
|
40
38
|
puppet_env = PDK::CLI::Util.puppet_from_opts_or_env(opts)
|
|
41
39
|
PDK::Util::RubyVersion.use(puppet_env[:ruby_version])
|
data/lib/pdk/cli/update.rb
CHANGED
|
@@ -14,7 +14,9 @@ module PDK
|
|
|
14
14
|
# Write the context information to the debug log
|
|
15
15
|
PDK.context.to_debug_log
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
unless PDK.context.is_a?(PDK::Context::Module) || PDK.context.is_a?(PDK::Context::ControlRepo)
|
|
18
|
+
raise PDK::CLI::ExitWithError, '`pdk update` can only be run from inside a valid module directory.'
|
|
19
|
+
end
|
|
18
20
|
|
|
19
21
|
raise PDK::CLI::ExitWithError, 'This module does not appear to be PDK compatible. To make the module compatible with PDK, run `pdk convert`.' unless PDK::Util.module_pdk_compatible?
|
|
20
22
|
|
|
@@ -31,8 +33,6 @@ module PDK
|
|
|
31
33
|
end
|
|
32
34
|
end
|
|
33
35
|
|
|
34
|
-
PDK::CLI::Util.analytics_screen_view('update', opts)
|
|
35
|
-
|
|
36
36
|
updater = PDK::Module::Update.new(PDK.context.root_path, opts)
|
|
37
37
|
|
|
38
38
|
if updater.pinned_to_puppetlabs_template_tag?
|
data/lib/pdk/cli/util.rb
CHANGED
|
@@ -245,44 +245,6 @@ module PDK
|
|
|
245
245
|
raise PDK::CLI::ExitWithError, '--template-url may not be used to specify paths containing #\'s.'
|
|
246
246
|
end
|
|
247
247
|
module_function :validate_template_opts
|
|
248
|
-
|
|
249
|
-
def analytics_screen_view(screen_name, opts = {})
|
|
250
|
-
require 'pdk/analytics'
|
|
251
|
-
|
|
252
|
-
dimensions = {
|
|
253
|
-
ruby_version: RUBY_VERSION
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
cmd_opts = opts.dup.reject do |_, v|
|
|
257
|
-
v.nil? || (v.respond_to?(:empty?) && v.empty?)
|
|
258
|
-
end
|
|
259
|
-
|
|
260
|
-
if (format_args = cmd_opts.delete(:format))
|
|
261
|
-
formats = PDK::CLI::Util::OptionNormalizer.report_formats(format_args)
|
|
262
|
-
dimensions[:output_format] = formats.map { |r| r[:method].to_s.delete_prefix('write_') }.sort.uniq.join(',')
|
|
263
|
-
else
|
|
264
|
-
dimensions[:output_format] = 'default'
|
|
265
|
-
end
|
|
266
|
-
|
|
267
|
-
safe_opts = [:'puppet-version', :'pe-version']
|
|
268
|
-
safe_bools = [true, false]
|
|
269
|
-
redacted_opts = cmd_opts.map do |k, v|
|
|
270
|
-
value = if safe_bools.include?(v) || safe_opts.include?(k)
|
|
271
|
-
v
|
|
272
|
-
else
|
|
273
|
-
'redacted'
|
|
274
|
-
end
|
|
275
|
-
"#{k}=#{value}"
|
|
276
|
-
end
|
|
277
|
-
dimensions[:cli_options] = redacted_opts.join(',') unless redacted_opts.empty?
|
|
278
|
-
|
|
279
|
-
ignored_env_vars = ['PDK_ANALYTICS_CONFIG', 'PDK_DISABLE_ANALYTICS']
|
|
280
|
-
env_vars = PDK::Util::Env.select { |k, _| k.start_with?('PDK_') && !ignored_env_vars.include?(k) }.map { |k, v| "#{k}=#{v}" }
|
|
281
|
-
dimensions[:env_vars] = env_vars.join(',') unless env_vars.empty?
|
|
282
|
-
|
|
283
|
-
PDK.analytics.screen_view(screen_name, **dimensions)
|
|
284
|
-
end
|
|
285
|
-
module_function :analytics_screen_view
|
|
286
248
|
end
|
|
287
249
|
end
|
|
288
250
|
end
|
data/lib/pdk/cli/validate.rb
CHANGED
|
@@ -29,7 +29,6 @@ module PDK
|
|
|
29
29
|
require 'pdk/validate'
|
|
30
30
|
|
|
31
31
|
if opts[:list]
|
|
32
|
-
PDK::CLI::Util.analytics_screen_view('validate', opts)
|
|
33
32
|
PDK.logger.info(format('Available validators: %{validator_names}', validator_names: PDK::Validate.validator_names.join(', ')))
|
|
34
33
|
exit 0
|
|
35
34
|
end
|
|
@@ -75,12 +74,6 @@ module PDK
|
|
|
75
74
|
end
|
|
76
75
|
validators_to_run = PDK::Validate.validator_names if validators_to_run.nil?
|
|
77
76
|
|
|
78
|
-
if validators_to_run.sort == PDK::Validate.validator_names.sort
|
|
79
|
-
PDK::CLI::Util.analytics_screen_view('validate', opts)
|
|
80
|
-
else
|
|
81
|
-
PDK::CLI::Util.analytics_screen_view(['validate', validators_to_run.sort].flatten.join('_'), opts)
|
|
82
|
-
end
|
|
83
|
-
|
|
84
77
|
# Subsequent arguments are targets.
|
|
85
78
|
targets.concat(args.to_a[1..]) if args.length > 1
|
|
86
79
|
|
data/lib/pdk/cli.rb
CHANGED
|
@@ -16,7 +16,6 @@ module Cri
|
|
|
16
16
|
class CriExitException
|
|
17
17
|
def initialize(is_error:)
|
|
18
18
|
@is_error = is_error
|
|
19
|
-
PDK.analytics.event('CLI', 'invalid command', label: PDK::CLI.anonymised_args.join(' ')) if error?
|
|
20
19
|
end
|
|
21
20
|
end
|
|
22
21
|
end
|
|
@@ -56,7 +55,6 @@ module PDK
|
|
|
56
55
|
|
|
57
56
|
def self.run(args)
|
|
58
57
|
@args = args
|
|
59
|
-
PDK::Config.analytics_config_interview! unless PDK::Util::Env['PDK_DISABLE_ANALYTICS'] || PDK::Config.analytics_config_exist?
|
|
60
58
|
@base_cmd.run(args)
|
|
61
59
|
rescue PDK::CLI::ExitWithError => e
|
|
62
60
|
PDK.logger.send(e.log_level, e.message)
|
data/lib/pdk/config/namespace.rb
CHANGED
|
@@ -24,7 +24,7 @@ module PDK
|
|
|
24
24
|
# a child of (defaults to nil).
|
|
25
25
|
# @option params [self] :persistent_defaults whether default values should be persisted
|
|
26
26
|
# to disk when evaluated. By default they are not persisted to disk. This is typically
|
|
27
|
-
# used for settings which a randomly generated, instead of being deterministic, e.g.
|
|
27
|
+
# used for settings which a randomly generated, instead of being deterministic, e.g. module_defaults author
|
|
28
28
|
# @param block [Proc] a block that is evaluated within the new instance.
|
|
29
29
|
def initialize(name = nil, file: nil, parent: nil, persistent_defaults: false, &block)
|
|
30
30
|
@file = PDK::Util::Filesystem.expand_path(file) unless file.nil?
|
|
@@ -162,7 +162,7 @@ module PDK
|
|
|
162
162
|
new_hash = {}
|
|
163
163
|
settings.each_pair { |k, v| new_hash[k] = v.value }
|
|
164
164
|
@mounts.each_pair { |k, mount_point| new_hash[k] = mount_point.to_h if mount_point.include_in_parent? }
|
|
165
|
-
new_hash.delete_if { |_k, v| v.nil? }
|
|
165
|
+
new_hash.delete_if { |_k, v| v.nil? }
|
|
166
166
|
new_hash
|
|
167
167
|
end
|
|
168
168
|
|
|
@@ -238,7 +238,7 @@ module PDK
|
|
|
238
238
|
# Returns true when filter is nil.
|
|
239
239
|
# Returns true if the filter is exactly the same name as the setting.
|
|
240
240
|
# Returns true if the name is a sub-key of the filter e.g.
|
|
241
|
-
# Given a filter of user.module_defaults, `user.module_defaults.author` will return true, but `user.
|
|
241
|
+
# Given a filter of user.module_defaults, `user.module_defaults.author` will return true, but `user.pdk_feature_flags.requested` will return false.
|
|
242
242
|
#
|
|
243
243
|
# @param name [String] The setting name to test.
|
|
244
244
|
# @param filter [String] The filter used to test on the name.
|
data/lib/pdk/config/setting.rb
CHANGED
|
@@ -9,9 +9,9 @@ module PDK
|
|
|
9
9
|
#
|
|
10
10
|
# @example
|
|
11
11
|
#
|
|
12
|
-
# PDK::Config::Namespace.new('
|
|
13
|
-
# setting :
|
|
14
|
-
# validate PDK::Config::Validator.
|
|
12
|
+
# PDK::Config::Namespace.new('module_defaults') do
|
|
13
|
+
# setting :author do
|
|
14
|
+
# validate PDK::Config::Validator.string
|
|
15
15
|
# default_to { false }
|
|
16
16
|
# end
|
|
17
17
|
# end
|
data/lib/pdk/config.rb
CHANGED
|
@@ -19,7 +19,6 @@ module PDK
|
|
|
19
19
|
# @option options [String] 'system.module_defaults.path' Path to the system module answers PDK configuration file
|
|
20
20
|
# @option options [String] 'user.path' Path to the user PDK configuration file
|
|
21
21
|
# @option options [String] 'user.module_defaults.path' Path to the user module answers PDK configuration file
|
|
22
|
-
# @option options [String] 'user.analytics.path' Path to the user analytics PDK configuration file
|
|
23
22
|
# @option options [PDK::Context::AbstractContext] 'context' The context that the configuration should be created in
|
|
24
23
|
def initialize(options = nil)
|
|
25
24
|
options = {} if options.nil?
|
|
@@ -28,7 +27,6 @@ module PDK
|
|
|
28
27
|
'system.module_defaults.path' => PDK::Config.system_answers_path,
|
|
29
28
|
'user.path' => PDK::Config.user_config_path,
|
|
30
29
|
'user.module_defaults.path' => PDK::AnswerFile.default_answer_file_path,
|
|
31
|
-
'user.analytics.path' => PDK::Config.analytics_config_path,
|
|
32
30
|
'context' => PDK.context
|
|
33
31
|
}.merge(options)
|
|
34
32
|
end
|
|
@@ -51,27 +49,6 @@ module PDK
|
|
|
51
49
|
@user_config ||= PDK::Config::JSON.new('user', file: local_options['user.path']) do
|
|
52
50
|
mount :module_defaults, PDK::Config::JSON.new(file: local_options['user.module_defaults.path'])
|
|
53
51
|
|
|
54
|
-
# Due to the json-schema gem having issues with Windows based paths, and only supporting Draft 05 (or less) do
|
|
55
|
-
# not use JSON validation yet. Once PDK drops support for EOL rubies, we will be able to use the json_schemer gem
|
|
56
|
-
# Which has much more modern support
|
|
57
|
-
# Reference - https://github.com/puppetlabs/pdk/pull/777
|
|
58
|
-
# Reference - https://tickets.puppetlabs.com/browse/PDK-1526
|
|
59
|
-
mount :analytics, PDK::Config::YAML.new(file: local_options['user.analytics.path'], persistent_defaults: true) do
|
|
60
|
-
setting :disabled do
|
|
61
|
-
validate PDK::Config::Validator.boolean
|
|
62
|
-
default_to { PDK::Config.bolt_analytics_config.fetch('disabled', true) }
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
setting 'user-id' do
|
|
66
|
-
validate PDK::Config::Validator.uuid
|
|
67
|
-
default_to do
|
|
68
|
-
require 'securerandom'
|
|
69
|
-
|
|
70
|
-
PDK::Config.bolt_analytics_config.fetch('user-id', SecureRandom.uuid)
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
52
|
# Display the feature flags
|
|
76
53
|
mount :pdk_feature_flags, PDK::Config::Namespace.new('pdk_feature_flags') do
|
|
77
54
|
setting 'available' do
|
|
@@ -191,18 +168,6 @@ module PDK
|
|
|
191
168
|
deep_set_object(value, options[:force], send(all_scopes[scope_name]), *names[1..])
|
|
192
169
|
end
|
|
193
170
|
|
|
194
|
-
def self.bolt_analytics_config
|
|
195
|
-
file = PDK::Util::Filesystem.expand_path('~/.puppetlabs/bolt/analytics.yaml')
|
|
196
|
-
PDK::Config::YAML.new(file: file)
|
|
197
|
-
rescue PDK::Config::LoadError => e
|
|
198
|
-
PDK.logger.debug format('Unable to load %{file}: %{message}', file: file, message: e.message)
|
|
199
|
-
PDK::Config::YAML.new
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
def self.analytics_config_path
|
|
203
|
-
PDK::Util::Env['PDK_ANALYTICS_CONFIG'] || File.join(File.dirname(PDK::Util.configdir), 'puppet', 'analytics.yml')
|
|
204
|
-
end
|
|
205
|
-
|
|
206
171
|
def self.user_config_path
|
|
207
172
|
File.join(PDK::Util.configdir, 'user_config.json')
|
|
208
173
|
end
|
|
@@ -224,51 +189,6 @@ module PDK
|
|
|
224
189
|
File.join(json_schemas_path, "#{name}_schema.json")
|
|
225
190
|
end
|
|
226
191
|
|
|
227
|
-
def self.analytics_config_exist?
|
|
228
|
-
PDK::Util::Filesystem.file?(analytics_config_path)
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
def self.analytics_config_interview!
|
|
232
|
-
require 'pdk/cli/util'
|
|
233
|
-
|
|
234
|
-
return unless PDK::CLI::Util.interactive?
|
|
235
|
-
|
|
236
|
-
pre_message =
|
|
237
|
-
format('PDK collects anonymous usage information to help us understand how ' \
|
|
238
|
-
'it is being used and make decisions on how to improve it. You can ' \
|
|
239
|
-
'find out more about what data we collect and how it is used in the ' \
|
|
240
|
-
"PDK documentation at %{url}.\n", url: 'https://puppet.com/docs/pdk/latest/pdk_install.html')
|
|
241
|
-
post_message =
|
|
242
|
-
format('You can opt in or out of the usage data collection at any time by ' \
|
|
243
|
-
'editing the analytics configuration file at %{path} and changing ' \
|
|
244
|
-
"the '%{key}' value.", path: PDK::Config.analytics_config_path, key: 'disabled')
|
|
245
|
-
|
|
246
|
-
questions = [
|
|
247
|
-
{
|
|
248
|
-
name: 'enabled',
|
|
249
|
-
question: 'Do you consent to the collection of anonymous PDK usage information?',
|
|
250
|
-
type: :yes
|
|
251
|
-
}
|
|
252
|
-
]
|
|
253
|
-
|
|
254
|
-
require 'pdk/cli/util/interview'
|
|
255
|
-
|
|
256
|
-
PDK.logger.info(text: pre_message, wrap: true)
|
|
257
|
-
prompt = TTY::Prompt.new(help_color: :cyan)
|
|
258
|
-
interview = PDK::CLI::Util::Interview.new(prompt)
|
|
259
|
-
interview.add_questions(questions)
|
|
260
|
-
answers = interview.run
|
|
261
|
-
|
|
262
|
-
if answers.nil?
|
|
263
|
-
PDK.logger.info 'No answer given, opting out of analytics collection.'
|
|
264
|
-
PDK.config.set(['user', 'analytics', 'disabled'], true)
|
|
265
|
-
else
|
|
266
|
-
PDK.config.set(['user', 'analytics', 'disabled'], !answers['enabled'])
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
PDK.logger.info(text: post_message, wrap: true)
|
|
270
|
-
end
|
|
271
|
-
|
|
272
192
|
private
|
|
273
193
|
|
|
274
194
|
# :nocov: This is a private method and is tested elsewhere
|
data/lib/pdk/module/convert.rb
CHANGED
|
@@ -148,7 +148,7 @@ module PDK
|
|
|
148
148
|
module_name = new_metadata.nil? ? 'new-module' : new_metadata.data['name']
|
|
149
149
|
metadata_for_render = new_metadata.nil? ? {} : new_metadata.data
|
|
150
150
|
|
|
151
|
-
template_dir.render_new_module(module_name, metadata_for_render) do |relative_file_path, file_content, file_status|
|
|
151
|
+
template_dir.render_new_module(module_name, metadata_for_render) do |relative_file_path, file_content, file_status, file_executable|
|
|
152
152
|
absolute_file_path = File.join(module_dir, relative_file_path)
|
|
153
153
|
case file_status
|
|
154
154
|
when :unmanage
|
|
@@ -156,12 +156,17 @@ module PDK
|
|
|
156
156
|
when :delete
|
|
157
157
|
update_manager.remove_file(absolute_file_path)
|
|
158
158
|
when :init
|
|
159
|
-
|
|
159
|
+
if convert? && !PDK::Util::Filesystem.exist?(absolute_file_path)
|
|
160
|
+
update_manager.add_file(absolute_file_path, file_content)
|
|
161
|
+
update_manager.make_file_executable(absolute_file_path) if file_executable
|
|
162
|
+
end
|
|
160
163
|
when :manage
|
|
161
164
|
if PDK::Util::Filesystem.exist?(absolute_file_path)
|
|
162
165
|
update_manager.modify_file(absolute_file_path, file_content)
|
|
166
|
+
update_manager.make_file_executable(absolute_file_path) if file_executable && !PDK::Util::Filesystem.executable?(absolute_file_path)
|
|
163
167
|
else
|
|
164
168
|
update_manager.add_file(absolute_file_path, file_content)
|
|
169
|
+
update_manager.make_file_executable(absolute_file_path) if file_executable
|
|
165
170
|
end
|
|
166
171
|
end
|
|
167
172
|
end
|
data/lib/pdk/module/metadata.rb
CHANGED
|
@@ -117,7 +117,7 @@ module PDK
|
|
|
117
117
|
def to_json(*_args)
|
|
118
118
|
require 'json'
|
|
119
119
|
|
|
120
|
-
JSON.pretty_generate(@data.dup.delete_if { |_key, value| value.nil? })
|
|
120
|
+
JSON.pretty_generate(@data.dup.delete_if { |_key, value| value.nil? })
|
|
121
121
|
end
|
|
122
122
|
|
|
123
123
|
def write!(path)
|
|
@@ -11,6 +11,7 @@ module PDK
|
|
|
11
11
|
@modified_files = Set.new
|
|
12
12
|
@added_files = Set.new
|
|
13
13
|
@removed_files = Set.new
|
|
14
|
+
@executable_files = Set.new
|
|
14
15
|
@diff_cache = {}
|
|
15
16
|
end
|
|
16
17
|
|
|
@@ -37,6 +38,13 @@ module PDK
|
|
|
37
38
|
@removed_files << path
|
|
38
39
|
end
|
|
39
40
|
|
|
41
|
+
# Store a pending file execute mode change.
|
|
42
|
+
#
|
|
43
|
+
# @param path [String] The path to the file to be made executable.
|
|
44
|
+
def make_file_executable(path)
|
|
45
|
+
@executable_files << path
|
|
46
|
+
end
|
|
47
|
+
|
|
40
48
|
# Generate a summary of the changes that will be applied to the module.
|
|
41
49
|
#
|
|
42
50
|
# @raise (see #calculate_diffs)
|
|
@@ -49,7 +57,8 @@ module PDK
|
|
|
49
57
|
{
|
|
50
58
|
added: @added_files,
|
|
51
59
|
removed: @removed_files.select { |f| PDK::Util::Filesystem.exist?(f) },
|
|
52
|
-
modified: @diff_cache.compact
|
|
60
|
+
modified: @diff_cache.compact,
|
|
61
|
+
'made executable': @executable_files
|
|
53
62
|
}
|
|
54
63
|
end
|
|
55
64
|
|
|
@@ -60,7 +69,8 @@ module PDK
|
|
|
60
69
|
def changes?
|
|
61
70
|
!changes[:added].empty? ||
|
|
62
71
|
!changes[:removed].empty? ||
|
|
63
|
-
changes[:modified].any? { |_, value| !value.nil? }
|
|
72
|
+
changes[:modified].any? { |_, value| !value.nil? } ||
|
|
73
|
+
!changes[:'made executable'].empty?
|
|
64
74
|
end
|
|
65
75
|
|
|
66
76
|
# Check if the update manager will change the specified file upon sync.
|
|
@@ -72,13 +82,15 @@ module PDK
|
|
|
72
82
|
def changed?(path)
|
|
73
83
|
changes[:added].any? { |add| add[:path] == path } ||
|
|
74
84
|
changes[:removed].include?(path) ||
|
|
75
|
-
changes[:modified].key?(path)
|
|
85
|
+
changes[:modified].key?(path) ||
|
|
86
|
+
changes[:'made executable'].include?(path)
|
|
76
87
|
end
|
|
77
88
|
|
|
78
89
|
def clear!
|
|
79
90
|
@modified_files.clear
|
|
80
91
|
@added_files.clear
|
|
81
92
|
@removed_files.clear
|
|
93
|
+
@executable_files.clear
|
|
82
94
|
nil
|
|
83
95
|
end
|
|
84
96
|
|
|
@@ -100,6 +112,10 @@ module PDK
|
|
|
100
112
|
files_to_write.each do |file|
|
|
101
113
|
write_file(file[:path], file[:content])
|
|
102
114
|
end
|
|
115
|
+
|
|
116
|
+
@executable_files.each do |file|
|
|
117
|
+
update_execute_bits(file)
|
|
118
|
+
end
|
|
103
119
|
end
|
|
104
120
|
|
|
105
121
|
# Remove a file from disk.
|
|
@@ -215,6 +231,16 @@ module PDK
|
|
|
215
231
|
|
|
216
232
|
output.join($INPUT_RECORD_SEPARATOR)
|
|
217
233
|
end
|
|
234
|
+
|
|
235
|
+
# Set the execute bits on a file
|
|
236
|
+
def update_execute_bits(path)
|
|
237
|
+
require 'pdk/util/filesystem'
|
|
238
|
+
|
|
239
|
+
PDK.logger.debug(format("making '%{path}' executable", path: path))
|
|
240
|
+
PDK::Util::Filesystem.make_executable(path)
|
|
241
|
+
rescue Errno::EACCES
|
|
242
|
+
raise PDK::CLI::ExitWithError, format("You do not have permission to make '%{path}' executable", path: path)
|
|
243
|
+
end
|
|
218
244
|
end
|
|
219
245
|
end
|
|
220
246
|
end
|
data/lib/pdk/report/event.rb
CHANGED
|
@@ -43,7 +43,6 @@ module PDK
|
|
|
43
43
|
# @api private
|
|
44
44
|
def config_for(dest_path, sync_config_path = nil)
|
|
45
45
|
require 'pdk/util'
|
|
46
|
-
require 'pdk/analytics'
|
|
47
46
|
|
|
48
47
|
module_root = PDK::Util.module_root
|
|
49
48
|
sync_config_path ||= File.join(module_root, '.sync.yml') unless module_root.nil?
|
|
@@ -56,22 +55,20 @@ module PDK
|
|
|
56
55
|
@config = conf_defaults
|
|
57
56
|
@config.deep_merge!(@sync_config, knockout_prefix: '---') unless @sync_config.nil?
|
|
58
57
|
end
|
|
59
|
-
file_config = @config.fetch(
|
|
58
|
+
file_config = @config.fetch('common', {}).clone
|
|
60
59
|
file_config['module_metadata'] = @module_metadata
|
|
61
60
|
file_config.merge!(@config.fetch(dest_path, {})) unless dest_path.nil?
|
|
62
61
|
file_config.merge!(@config).tap do |c|
|
|
63
62
|
if uri.default?
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
PDK.analytics.event('TemplateDir', 'file', label: dest_path, value: file_value)
|
|
63
|
+
if c['unmanaged']
|
|
64
|
+
'unmanaged'
|
|
65
|
+
elsif c['delete']
|
|
66
|
+
'deleted'
|
|
67
|
+
elsif @sync_config&.key?(dest_path)
|
|
68
|
+
'customized'
|
|
69
|
+
else
|
|
70
|
+
'default'
|
|
71
|
+
end
|
|
75
72
|
end
|
|
76
73
|
end
|
|
77
74
|
end
|
|
@@ -95,7 +95,9 @@ module PDK
|
|
|
95
95
|
end
|
|
96
96
|
end
|
|
97
97
|
|
|
98
|
-
|
|
98
|
+
dest_executable = config['manage_execute_permissions'] && PDK::Util::Filesystem.executable?(File.join(template_loc, template_file))
|
|
99
|
+
|
|
100
|
+
yield dest_path, dest_content, dest_status, dest_executable
|
|
99
101
|
end
|
|
100
102
|
end
|
|
101
103
|
# :nocov:
|
data/lib/pdk/template.rb
CHANGED
|
@@ -44,9 +44,6 @@ module PDK
|
|
|
44
44
|
template_dir = TemplateDir.instance(uri, fetcher.path, context)
|
|
45
45
|
template_dir.metadata = fetcher.metadata
|
|
46
46
|
|
|
47
|
-
template_type = uri.default? ? 'default' : 'custom'
|
|
48
|
-
PDK.analytics.event('TemplateDir', 'initialize', label: template_type)
|
|
49
|
-
|
|
50
47
|
yield template_dir
|
|
51
48
|
end
|
|
52
49
|
nil
|
data/lib/pdk/util/filesystem.rb
CHANGED
|
@@ -27,6 +27,11 @@ module PDK
|
|
|
27
27
|
end
|
|
28
28
|
module_function :read_file
|
|
29
29
|
|
|
30
|
+
def make_executable(file)
|
|
31
|
+
FileUtils.chmod('a+x', file)
|
|
32
|
+
end
|
|
33
|
+
module_function :make_executable
|
|
34
|
+
|
|
30
35
|
# :nocov:
|
|
31
36
|
# These methods just wrap core Ruby functionality and
|
|
32
37
|
# can be ignored for code coverage
|
|
@@ -133,6 +138,11 @@ module PDK
|
|
|
133
138
|
end
|
|
134
139
|
end
|
|
135
140
|
module_function :mv
|
|
141
|
+
|
|
142
|
+
def executable?(*args)
|
|
143
|
+
File.executable?(*args)
|
|
144
|
+
end
|
|
145
|
+
module_function :executable?
|
|
136
146
|
# :nocov:
|
|
137
147
|
end
|
|
138
148
|
end
|
data/lib/pdk/version.rb
CHANGED
data/lib/pdk.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
module PDK
|
|
2
|
-
autoload :Analytics, 'pdk/analytics'
|
|
3
2
|
autoload :AnswerFile, 'pdk/answer_file'
|
|
4
3
|
autoload :Bolt, 'pdk/bolt'
|
|
5
4
|
autoload :Config, 'pdk/config'
|
|
@@ -58,17 +57,4 @@ module PDK
|
|
|
58
57
|
|
|
59
58
|
requested_feature_flags.include?(flagname)
|
|
60
59
|
end
|
|
61
|
-
|
|
62
|
-
def self.analytics
|
|
63
|
-
@analytics ||= PDK::Analytics.build_client(
|
|
64
|
-
logger: PDK.logger,
|
|
65
|
-
disabled: PDK::Util::Env['PDK_DISABLE_ANALYTICS'] || PDK.config.get_within_scopes('analytics.disabled', ['user', 'system']),
|
|
66
|
-
user_id: PDK.config.get_within_scopes('analytics.user-id', ['user', 'system']),
|
|
67
|
-
app_id: "UA-139917834-#{PDK::Util.development_mode? ? '2' : '1'}",
|
|
68
|
-
client: :google_analytics,
|
|
69
|
-
app_name: 'pdk',
|
|
70
|
-
app_version: PDK::VERSION,
|
|
71
|
-
app_installer: PDK::Util.package_install? ? 'package' : 'gem'
|
|
72
|
-
)
|
|
73
|
-
end
|
|
74
60
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pdk
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.0
|
|
4
|
+
version: 3.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Puppet, Inc.
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2024-05-09 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -204,48 +204,6 @@ dependencies:
|
|
|
204
204
|
- - "~>"
|
|
205
205
|
- !ruby/object:Gem::Version
|
|
206
206
|
version: '0.5'
|
|
207
|
-
- !ruby/object:Gem::Dependency
|
|
208
|
-
name: concurrent-ruby
|
|
209
|
-
requirement: !ruby/object:Gem::Requirement
|
|
210
|
-
requirements:
|
|
211
|
-
- - '='
|
|
212
|
-
- !ruby/object:Gem::Version
|
|
213
|
-
version: 1.1.10
|
|
214
|
-
type: :runtime
|
|
215
|
-
prerelease: false
|
|
216
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
217
|
-
requirements:
|
|
218
|
-
- - '='
|
|
219
|
-
- !ruby/object:Gem::Version
|
|
220
|
-
version: 1.1.10
|
|
221
|
-
- !ruby/object:Gem::Dependency
|
|
222
|
-
name: facter
|
|
223
|
-
requirement: !ruby/object:Gem::Requirement
|
|
224
|
-
requirements:
|
|
225
|
-
- - "~>"
|
|
226
|
-
- !ruby/object:Gem::Version
|
|
227
|
-
version: '4.0'
|
|
228
|
-
type: :runtime
|
|
229
|
-
prerelease: false
|
|
230
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
231
|
-
requirements:
|
|
232
|
-
- - "~>"
|
|
233
|
-
- !ruby/object:Gem::Version
|
|
234
|
-
version: '4.0'
|
|
235
|
-
- !ruby/object:Gem::Dependency
|
|
236
|
-
name: httpclient
|
|
237
|
-
requirement: !ruby/object:Gem::Requirement
|
|
238
|
-
requirements:
|
|
239
|
-
- - "~>"
|
|
240
|
-
- !ruby/object:Gem::Version
|
|
241
|
-
version: 2.8.3
|
|
242
|
-
type: :runtime
|
|
243
|
-
prerelease: false
|
|
244
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
245
|
-
requirements:
|
|
246
|
-
- - "~>"
|
|
247
|
-
- !ruby/object:Gem::Version
|
|
248
|
-
version: 2.8.3
|
|
249
207
|
- !ruby/object:Gem::Dependency
|
|
250
208
|
name: deep_merge
|
|
251
209
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -273,10 +231,6 @@ files:
|
|
|
273
231
|
- README.md
|
|
274
232
|
- exe/pdk
|
|
275
233
|
- lib/pdk.rb
|
|
276
|
-
- lib/pdk/analytics.rb
|
|
277
|
-
- lib/pdk/analytics/client/google_analytics.rb
|
|
278
|
-
- lib/pdk/analytics/client/noop.rb
|
|
279
|
-
- lib/pdk/analytics/util.rb
|
|
280
234
|
- lib/pdk/answer_file.rb
|
|
281
235
|
- lib/pdk/bolt.rb
|
|
282
236
|
- lib/pdk/cli.rb
|
|
@@ -321,7 +275,6 @@ files:
|
|
|
321
275
|
- lib/pdk/cli/util/update_manager_printer.rb
|
|
322
276
|
- lib/pdk/cli/validate.rb
|
|
323
277
|
- lib/pdk/config.rb
|
|
324
|
-
- lib/pdk/config/analytics_schema.json
|
|
325
278
|
- lib/pdk/config/errors.rb
|
|
326
279
|
- lib/pdk/config/ini_file.rb
|
|
327
280
|
- lib/pdk/config/ini_file_setting.rb
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
require 'pdk'
|
|
2
|
-
|
|
3
|
-
module PDK
|
|
4
|
-
module Analytics
|
|
5
|
-
module Client
|
|
6
|
-
class GoogleAnalytics
|
|
7
|
-
PROTOCOL_VERSION = 1
|
|
8
|
-
TRACKING_URL = 'https://google-analytics.com/collect'.freeze
|
|
9
|
-
CUSTOM_DIMENSIONS = {
|
|
10
|
-
operating_system: :cd1,
|
|
11
|
-
output_format: :cd2,
|
|
12
|
-
ruby_version: :cd3,
|
|
13
|
-
cli_options: :cd4,
|
|
14
|
-
env_vars: :cd5
|
|
15
|
-
}.freeze
|
|
16
|
-
|
|
17
|
-
attr_reader :user_id, :logger, :app_name, :app_id, :app_version, :app_installer
|
|
18
|
-
|
|
19
|
-
def initialize(opts)
|
|
20
|
-
# lazy-load expensive gem code
|
|
21
|
-
require 'concurrent/configuration'
|
|
22
|
-
require 'concurrent/future'
|
|
23
|
-
require 'httpclient'
|
|
24
|
-
require 'locale'
|
|
25
|
-
require 'pdk/analytics/util'
|
|
26
|
-
|
|
27
|
-
@http = HTTPClient.new
|
|
28
|
-
@user_id = opts[:user_id]
|
|
29
|
-
@executor = Concurrent.global_io_executor
|
|
30
|
-
@os = PDK::Analytics::Util.fetch_os_async
|
|
31
|
-
@logger = opts[:logger]
|
|
32
|
-
@app_name = opts[:app_name]
|
|
33
|
-
@app_id = opts[:app_id]
|
|
34
|
-
@app_version = opts[:app_version]
|
|
35
|
-
@app_installer = opts[:app_installer]
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def screen_view(screen, **kwargs)
|
|
39
|
-
custom_dimensions = walk_keys(kwargs) do |k|
|
|
40
|
-
CUSTOM_DIMENSIONS[k] || raise(format("Unknown analytics key '%{key}'", key: k))
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
screen_view_params = {
|
|
44
|
-
# Type
|
|
45
|
-
t: 'screenview',
|
|
46
|
-
# Screen Name
|
|
47
|
-
cd: screen
|
|
48
|
-
}.merge(custom_dimensions)
|
|
49
|
-
|
|
50
|
-
submit(base_params.merge(screen_view_params))
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def event(category, action, label: nil, value: nil, **kwargs)
|
|
54
|
-
custom_dimensions = walk_keys(kwargs) do |k|
|
|
55
|
-
CUSTOM_DIMENSIONS[k] || raise(format("Unknown analytics key '%{key}'", key: k))
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
event_params = {
|
|
59
|
-
# Type
|
|
60
|
-
t: 'event',
|
|
61
|
-
# Event Category
|
|
62
|
-
ec: category,
|
|
63
|
-
# Event Action
|
|
64
|
-
ea: action
|
|
65
|
-
}.merge(custom_dimensions)
|
|
66
|
-
|
|
67
|
-
# Event Label
|
|
68
|
-
event_params[:el] = label if label
|
|
69
|
-
# Event Value
|
|
70
|
-
event_params[:ev] = value if value
|
|
71
|
-
|
|
72
|
-
submit(base_params.merge(event_params))
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def submit(params)
|
|
76
|
-
# Handle analytics submission in the background to avoid blocking the
|
|
77
|
-
# app or polluting the log with errors
|
|
78
|
-
Concurrent::Future.execute(executor: @executor) do
|
|
79
|
-
require 'json'
|
|
80
|
-
|
|
81
|
-
logger.debug "Submitting analytics: #{JSON.pretty_generate(params)}"
|
|
82
|
-
@http.post(TRACKING_URL, params)
|
|
83
|
-
logger.debug 'Completed analytics submission'
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# These parameters have terrible names. See this page for complete documentation:
|
|
88
|
-
# https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters
|
|
89
|
-
def base_params
|
|
90
|
-
require 'locale'
|
|
91
|
-
|
|
92
|
-
{
|
|
93
|
-
v: PROTOCOL_VERSION,
|
|
94
|
-
# Client ID
|
|
95
|
-
cid: user_id,
|
|
96
|
-
# Tracking ID
|
|
97
|
-
tid: app_id,
|
|
98
|
-
# Application Name
|
|
99
|
-
an: app_name,
|
|
100
|
-
# Application Version
|
|
101
|
-
av: app_version,
|
|
102
|
-
# Application Installer ID
|
|
103
|
-
aiid: app_installer,
|
|
104
|
-
# Anonymize IPs
|
|
105
|
-
aip: true,
|
|
106
|
-
# User locale
|
|
107
|
-
ul: Locale.current.to_rfc,
|
|
108
|
-
# Custom Dimension 1 (Operating System)
|
|
109
|
-
cd1: @os.value
|
|
110
|
-
}
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
# If the user is running a very fast command, there may not be time for
|
|
114
|
-
# analytics submission to complete before the command is finished. In
|
|
115
|
-
# that case, we give a little buffer for any stragglers to finish up.
|
|
116
|
-
# 250ms strikes a balance between accomodating slower networks while not
|
|
117
|
-
# introducing a noticeable "hang".
|
|
118
|
-
def finish
|
|
119
|
-
@executor.shutdown
|
|
120
|
-
@executor.wait_for_termination(0.25)
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
private
|
|
124
|
-
|
|
125
|
-
def walk_keys(data, &block)
|
|
126
|
-
case data
|
|
127
|
-
when Hash
|
|
128
|
-
data.each_with_object({}) do |(k, v), acc|
|
|
129
|
-
v = walk_keys(v, &block)
|
|
130
|
-
acc[yield(k)] = v
|
|
131
|
-
end
|
|
132
|
-
when Array
|
|
133
|
-
data.map { |v| walk_keys(v, &block) }
|
|
134
|
-
else
|
|
135
|
-
data
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
end
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
require 'pdk'
|
|
2
|
-
|
|
3
|
-
module PDK
|
|
4
|
-
module Analytics
|
|
5
|
-
module Client
|
|
6
|
-
class Noop
|
|
7
|
-
attr_reader :logger
|
|
8
|
-
|
|
9
|
-
def initialize(opts)
|
|
10
|
-
@logger = opts[:logger]
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def screen_view(screen, **_kwargs)
|
|
14
|
-
logger.debug "Skipping submission of '#{screen}' screenview because analytics is disabled"
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def event(category, action, **_kwargs)
|
|
18
|
-
logger.debug "Skipping submission of '#{category} #{action}' event because analytics is disabled"
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def finish; end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
data/lib/pdk/analytics/util.rb
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
require 'pdk'
|
|
2
|
-
|
|
3
|
-
module PDK
|
|
4
|
-
module Analytics
|
|
5
|
-
module Util
|
|
6
|
-
def self.fetch_os_async
|
|
7
|
-
require 'concurrent/configuration'
|
|
8
|
-
require 'concurrent/future'
|
|
9
|
-
|
|
10
|
-
Concurrent::Future.execute(executor: :io) do
|
|
11
|
-
os = Facter.value('os')
|
|
12
|
-
|
|
13
|
-
os.nil? ? 'unknown' : "#{os['name']} #{os.fetch('release', {}).fetch('major', '')}".strip
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
data/lib/pdk/analytics.rb
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
require 'pdk'
|
|
2
|
-
|
|
3
|
-
autoload :Logger, 'logger'
|
|
4
|
-
|
|
5
|
-
module PDK
|
|
6
|
-
module Analytics
|
|
7
|
-
autoload :Util, 'pdk/analytics/util'
|
|
8
|
-
|
|
9
|
-
module Client
|
|
10
|
-
autoload :Noop, 'pdk/analytics/client/noop'
|
|
11
|
-
autoload :GoogleAnalytics, 'pdk/analytics/client/google_analytics'
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def self.build_client(opts = {})
|
|
15
|
-
opts[:logger] ||= ::Logger.new($stderr)
|
|
16
|
-
opts[:client] ||= :noop
|
|
17
|
-
|
|
18
|
-
if opts[:disabled]
|
|
19
|
-
opts[:logger].debug 'Analytics opt-out is set, analytics will be disabled'
|
|
20
|
-
opts[:client] = :noop
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
client_const = opts[:client].to_s.split('_').map(&:capitalize).join
|
|
24
|
-
PDK::Analytics::Client.const_get(client_const).new(opts)
|
|
25
|
-
rescue StandardError => e
|
|
26
|
-
opts[:logger].debug "Failed to initialize analytics client, analytics will be disabled: #{e}"
|
|
27
|
-
PDK::Analytics::Client::Noop.new(opts)
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"definitions": {},
|
|
3
|
-
"$schema": "http://json-schema.org/draft-06/schema#",
|
|
4
|
-
"$id": "http://puppet.com/schema/does_not_exist.json",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"title": "The PDK Analytics YAML Schema",
|
|
7
|
-
"properties": {
|
|
8
|
-
"disabled": {
|
|
9
|
-
"$id": "#/properties/disabled",
|
|
10
|
-
"type": "boolean",
|
|
11
|
-
"title": "Disabled property",
|
|
12
|
-
"examples": [
|
|
13
|
-
false
|
|
14
|
-
]
|
|
15
|
-
},
|
|
16
|
-
"user-id": {
|
|
17
|
-
"$id": "#/properties/user-id",
|
|
18
|
-
"type": "string",
|
|
19
|
-
"title": "The User-id for analytics",
|
|
20
|
-
"examples": [
|
|
21
|
-
"cb9ed65f-37dc-48d8-9863-8bd09cbb61c7"
|
|
22
|
-
],
|
|
23
|
-
"pattern": "^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}$"
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|