lib/pdk/module/convert.rb in pdk-2.4.0 vs lib/pdk/module/convert.rb in pdk-2.5.0
- old
+ new
@@ -1,296 +1,296 @@
-require 'pdk'
-
-module PDK
- module Module
- class Convert
- def self.invoke(module_dir, options)
- new(module_dir, options).run
- end
-
- attr_reader :module_dir
-
- attr_reader :options
-
- def initialize(module_dir, options = {})
- @module_dir = module_dir
- @options = options
- end
-
- def convert?
- instance_of?(PDK::Module::Convert)
- end
-
- def run
- stage_changes!
-
- unless update_manager.changes?
- if adding_tests?
- add_tests!
- print_result 'Convert completed'
- else
- require 'pdk/report'
-
- PDK::Report.default_target.puts(_('No changes required.'))
- end
-
- return
- end
-
- print_summary
-
- full_report('convert_report.txt') unless update_manager.changes[:modified].empty?
-
- return if noop?
-
- unless force?
- require 'pdk/cli/util'
-
- PDK.logger.info _(
- 'Module conversion is a potentially destructive action. ' \
- 'Ensure that you have committed your module to a version control ' \
- 'system or have a backup, and review the changes above before continuing.',
- )
- continue = PDK::CLI::Util.prompt_for_yes(_('Do you want to continue and make these changes to your module?'))
- return unless continue
- end
-
- # Remove these files straight away as these changes are not something
- # that the user needs to review.
- update_manager.unlink_file('Gemfile.lock')
- update_manager.unlink_file(File.join('.bundle', 'config'))
-
- update_manager.sync_changes!
-
- require 'pdk/util/bundler'
- PDK::Util::Bundler.ensure_bundle!
-
- add_tests! if adding_tests?
-
- print_result 'Convert completed'
- end
-
- def noop?
- options[:noop]
- end
-
- def force?
- options[:force]
- end
-
- def add_tests?
- options[:'add-tests']
- end
-
- def adding_tests?
- add_tests? && missing_tests?
- end
-
- def missing_tests?
- !available_test_generators.empty?
- end
-
- def available_test_generators
- # Only select generators which can run and have no pre-existing files
- test_generators.select do |gen|
- if gen.can_run?
- gen.template_files.none? { |_, dst_path| PDK::Util::Filesystem.exist?(File.join(gen.context.root_path, dst_path)) }
- else
- false
- end
- end
- end
-
- def test_generators(context = PDK.context)
- return @test_generators unless @test_generators.nil?
- require 'pdk/util/puppet_strings'
-
- test_gens = PDK::Util::PuppetStrings.all_objects.map do |generator, objects|
- (objects || []).map do |obj|
- generator.new(context, obj['name'], spec_only: true)
- end
- end
-
- @test_generators = test_gens.flatten
- end
-
- def stage_tests!(manager)
- available_test_generators.each do |gen|
- gen.stage_changes(manager)
- end
- manager
- end
-
- def add_tests!
- update_manager.clear!
- stage_tests!(update_manager)
-
- if update_manager.changes?
- update_manager.sync_changes!
- print_summary
- else
- PDK::Report.default_target.puts(_('No test changes required.'))
- end
- end
-
- def stage_changes!(context = PDK.context)
- require 'pdk/util/filesystem'
-
- metadata_path = File.join(module_dir, 'metadata.json')
-
- PDK::Template.with(template_uri, context) do |template_dir|
- new_metadata = update_metadata(metadata_path, template_dir.metadata)
- if options[:noop] && new_metadata.nil?
- update_manager.add_file(metadata_path, '')
- elsif PDK::Util::Filesystem.file?(metadata_path)
- update_manager.modify_file(metadata_path, new_metadata.to_json)
- else
- update_manager.add_file(metadata_path, new_metadata.to_json)
- end
-
- # new_metadata == nil when creating a new module but with --noop@
- module_name = new_metadata.nil? ? 'new-module' : new_metadata.data['name']
- metadata_for_render = new_metadata.nil? ? {} : new_metadata.data
-
- template_dir.render_new_module(module_name, metadata_for_render) do |relative_file_path, file_content, file_status|
- absolute_file_path = File.join(module_dir, relative_file_path)
- case file_status
- when :unmanage
- PDK.logger.debug(_("skipping '%{path}'") % { path: absolute_file_path })
- when :delete
- update_manager.remove_file(absolute_file_path)
- when :init
- if convert? && !PDK::Util::Filesystem.exist?(absolute_file_path)
- update_manager.add_file(absolute_file_path, file_content)
- end
- when :manage
- if PDK::Util::Filesystem.exist?(absolute_file_path)
- update_manager.modify_file(absolute_file_path, file_content)
- else
- update_manager.add_file(absolute_file_path, file_content)
- end
- end
- end
- end
- rescue ArgumentError => e
- raise PDK::CLI::ExitWithError, e
- end
-
- def update_manager
- require 'pdk/module/update_manager'
-
- @update_manager ||= PDK::Module::UpdateManager.new
- end
-
- def template_uri
- require 'pdk/util/template_uri'
-
- @template_uri ||= PDK::Util::TemplateURI.new(options)
- end
-
- def update_metadata(metadata_path, template_metadata)
- require 'pdk/generate/module'
- require 'pdk/util/filesystem'
- require 'pdk/module/metadata'
-
- if PDK::Util::Filesystem.file?(metadata_path)
- unless PDK::Util::Filesystem.readable?(metadata_path)
- raise PDK::CLI::ExitWithError, _('Unable to update module metadata; %{path} exists but it is not readable.') % {
- path: metadata_path,
- }
- end
-
- begin
- metadata = PDK::Module::Metadata.from_file(metadata_path)
- new_values = PDK::Module::Metadata::DEFAULTS.select do |key, _|
- !metadata.data.key?(key) || metadata.data[key].nil? ||
- (key == 'requirements' && metadata.data[key].empty?)
- end
- metadata.update!(new_values)
- rescue ArgumentError
- metadata = PDK::Generate::Module.prepare_metadata(options) unless options[:noop]
- end
- elsif PDK::Util::Filesystem.exist?(metadata_path)
- raise PDK::CLI::ExitWithError, _('Unable to update module metadata; %{path} exists but it is not a file.') % {
- path: metadata_path,
- }
- else
- return if options[:noop]
-
- project_dir = File.basename(Dir.pwd)
- options[:module_name] = project_dir.split('-', 2).compact[-1]
- options[:prompt] = false
- options[:'skip-interview'] = true if options[:force]
-
- metadata = PDK::Generate::Module.prepare_metadata(options)
- end
-
- metadata.update!(template_metadata)
- metadata
- end
-
- def summary
- summary = {}
- update_manager.changes.each do |category, update_category|
- if update_category.respond_to?(:keys)
- updated_files = update_category.keys
- else
- begin
- updated_files = update_category.map { |file| file[:path] }
- rescue TypeError
- updated_files = update_category.to_a
- end
- end
-
- summary[category] = updated_files
- end
-
- summary
- end
-
- def print_summary
- require 'pdk/report'
-
- footer = false
-
- summary.keys.each do |category|
- next if summary[category].empty?
-
- PDK::Report.default_target.puts(_("\n%{banner}") % { banner: generate_banner("Files to be #{category}", 40) })
- PDK::Report.default_target.puts(summary[category])
- footer = true
- end
-
- PDK::Report.default_target.puts(_("\n%{banner}") % { banner: generate_banner('', 40) }) if footer
- end
-
- def print_result(banner_text)
- require 'pdk/report'
-
- PDK::Report.default_target.puts(_("\n%{banner}") % { banner: generate_banner(banner_text, 40) })
- summary_to_print = summary.map { |k, v| "#{v.length} files #{k}" unless v.empty? }.compact
- PDK::Report.default_target.puts(_("\n%{summary}\n\n") % { summary: "#{summary_to_print.join(', ')}." })
- end
-
- def full_report(path)
- require 'pdk/report'
-
- report = ["/* Report generated by PDK at #{Time.now} */"]
- report.concat(update_manager.changes[:modified].map { |_, diff| "\n\n\n#{diff}" })
- PDK::Util::Filesystem.write_file(path, report.join)
- PDK::Report.default_target.puts(_("\nYou can find a report of differences in %{path}.\n\n") % { path: path })
- end
-
- def generate_banner(text, width = 80)
- padding = width - text.length
- banner = ''
- padding_char = '-'
-
- (padding / 2.0).ceil.times { banner << padding_char }
- banner << text
- (padding / 2.0).floor.times { banner << padding_char }
-
- banner
- end
- end
- end
-end
+require 'pdk'
+
+module PDK
+ module Module
+ class Convert
+ def self.invoke(module_dir, options)
+ new(module_dir, options).run
+ end
+
+ attr_reader :module_dir
+
+ attr_reader :options
+
+ def initialize(module_dir, options = {})
+ @module_dir = module_dir
+ @options = options
+ end
+
+ def convert?
+ instance_of?(PDK::Module::Convert)
+ end
+
+ def run
+ stage_changes!
+
+ unless update_manager.changes?
+ if adding_tests?
+ add_tests!
+ print_result 'Convert completed'
+ else
+ require 'pdk/report'
+
+ PDK::Report.default_target.puts(_('No changes required.'))
+ end
+
+ return
+ end
+
+ print_summary
+
+ full_report('convert_report.txt') unless update_manager.changes[:modified].empty?
+
+ return if noop?
+
+ unless force?
+ require 'pdk/cli/util'
+
+ PDK.logger.info _(
+ 'Module conversion is a potentially destructive action. ' \
+ 'Ensure that you have committed your module to a version control ' \
+ 'system or have a backup, and review the changes above before continuing.',
+ )
+ continue = PDK::CLI::Util.prompt_for_yes(_('Do you want to continue and make these changes to your module?'))
+ return unless continue
+ end
+
+ # Remove these files straight away as these changes are not something
+ # that the user needs to review.
+ update_manager.unlink_file('Gemfile.lock')
+ update_manager.unlink_file(File.join('.bundle', 'config'))
+
+ update_manager.sync_changes!
+
+ require 'pdk/util/bundler'
+ PDK::Util::Bundler.ensure_bundle!
+
+ add_tests! if adding_tests?
+
+ print_result 'Convert completed'
+ end
+
+ def noop?
+ options[:noop]
+ end
+
+ def force?
+ options[:force]
+ end
+
+ def add_tests?
+ options[:'add-tests']
+ end
+
+ def adding_tests?
+ add_tests? && missing_tests?
+ end
+
+ def missing_tests?
+ !available_test_generators.empty?
+ end
+
+ def available_test_generators
+ # Only select generators which can run and have no pre-existing files
+ test_generators.select do |gen|
+ if gen.can_run?
+ gen.template_files.none? { |_, dst_path| PDK::Util::Filesystem.exist?(File.join(gen.context.root_path, dst_path)) }
+ else
+ false
+ end
+ end
+ end
+
+ def test_generators(context = PDK.context)
+ return @test_generators unless @test_generators.nil?
+ require 'pdk/util/puppet_strings'
+
+ test_gens = PDK::Util::PuppetStrings.all_objects.map do |generator, objects|
+ (objects || []).map do |obj|
+ generator.new(context, obj['name'], spec_only: true)
+ end
+ end
+
+ @test_generators = test_gens.flatten
+ end
+
+ def stage_tests!(manager)
+ available_test_generators.each do |gen|
+ gen.stage_changes(manager)
+ end
+ manager
+ end
+
+ def add_tests!
+ update_manager.clear!
+ stage_tests!(update_manager)
+
+ if update_manager.changes?
+ update_manager.sync_changes!
+ print_summary
+ else
+ PDK::Report.default_target.puts(_('No test changes required.'))
+ end
+ end
+
+ def stage_changes!(context = PDK.context)
+ require 'pdk/util/filesystem'
+
+ metadata_path = File.join(module_dir, 'metadata.json')
+
+ PDK::Template.with(template_uri, context) do |template_dir|
+ new_metadata = update_metadata(metadata_path, template_dir.metadata)
+ if options[:noop] && new_metadata.nil?
+ update_manager.add_file(metadata_path, '')
+ elsif PDK::Util::Filesystem.file?(metadata_path)
+ update_manager.modify_file(metadata_path, new_metadata.to_json)
+ else
+ update_manager.add_file(metadata_path, new_metadata.to_json)
+ end
+
+ # new_metadata == nil when creating a new module but with --noop@
+ module_name = new_metadata.nil? ? 'new-module' : new_metadata.data['name']
+ metadata_for_render = new_metadata.nil? ? {} : new_metadata.data
+
+ template_dir.render_new_module(module_name, metadata_for_render) do |relative_file_path, file_content, file_status|
+ absolute_file_path = File.join(module_dir, relative_file_path)
+ case file_status
+ when :unmanage
+ PDK.logger.debug(_("skipping '%{path}'") % { path: absolute_file_path })
+ when :delete
+ update_manager.remove_file(absolute_file_path)
+ when :init
+ if convert? && !PDK::Util::Filesystem.exist?(absolute_file_path)
+ update_manager.add_file(absolute_file_path, file_content)
+ end
+ when :manage
+ if PDK::Util::Filesystem.exist?(absolute_file_path)
+ update_manager.modify_file(absolute_file_path, file_content)
+ else
+ update_manager.add_file(absolute_file_path, file_content)
+ end
+ end
+ end
+ end
+ rescue ArgumentError => e
+ raise PDK::CLI::ExitWithError, e
+ end
+
+ def update_manager
+ require 'pdk/module/update_manager'
+
+ @update_manager ||= PDK::Module::UpdateManager.new
+ end
+
+ def template_uri
+ require 'pdk/util/template_uri'
+
+ @template_uri ||= PDK::Util::TemplateURI.new(options)
+ end
+
+ def update_metadata(metadata_path, template_metadata)
+ require 'pdk/generate/module'
+ require 'pdk/util/filesystem'
+ require 'pdk/module/metadata'
+
+ if PDK::Util::Filesystem.file?(metadata_path)
+ unless PDK::Util::Filesystem.readable?(metadata_path)
+ raise PDK::CLI::ExitWithError, _('Unable to update module metadata; %{path} exists but it is not readable.') % {
+ path: metadata_path,
+ }
+ end
+
+ begin
+ metadata = PDK::Module::Metadata.from_file(metadata_path)
+ new_values = PDK::Module::Metadata::DEFAULTS.select do |key, _|
+ !metadata.data.key?(key) || metadata.data[key].nil? ||
+ (key == 'requirements' && metadata.data[key].empty?)
+ end
+ metadata.update!(new_values)
+ rescue ArgumentError
+ metadata = PDK::Generate::Module.prepare_metadata(options) unless options[:noop]
+ end
+ elsif PDK::Util::Filesystem.exist?(metadata_path)
+ raise PDK::CLI::ExitWithError, _('Unable to update module metadata; %{path} exists but it is not a file.') % {
+ path: metadata_path,
+ }
+ else
+ return if options[:noop]
+
+ project_dir = File.basename(Dir.pwd)
+ options[:module_name] = project_dir.split('-', 2).compact[-1]
+ options[:prompt] = false
+ options[:'skip-interview'] = true if options[:force]
+
+ metadata = PDK::Generate::Module.prepare_metadata(options)
+ end
+
+ metadata.update!(template_metadata)
+ metadata
+ end
+
+ def summary
+ summary = {}
+ update_manager.changes.each do |category, update_category|
+ if update_category.respond_to?(:keys)
+ updated_files = update_category.keys
+ else
+ begin
+ updated_files = update_category.map { |file| file[:path] }
+ rescue TypeError
+ updated_files = update_category.to_a
+ end
+ end
+
+ summary[category] = updated_files
+ end
+
+ summary
+ end
+
+ def print_summary
+ require 'pdk/report'
+
+ footer = false
+
+ summary.keys.each do |category|
+ next if summary[category].empty?
+
+ PDK::Report.default_target.puts(_("\n%{banner}") % { banner: generate_banner("Files to be #{category}", 40) })
+ PDK::Report.default_target.puts(summary[category])
+ footer = true
+ end
+
+ PDK::Report.default_target.puts(_("\n%{banner}") % { banner: generate_banner('', 40) }) if footer
+ end
+
+ def print_result(banner_text)
+ require 'pdk/report'
+
+ PDK::Report.default_target.puts(_("\n%{banner}") % { banner: generate_banner(banner_text, 40) })
+ summary_to_print = summary.map { |k, v| "#{v.length} files #{k}" unless v.empty? }.compact
+ PDK::Report.default_target.puts(_("\n%{summary}\n\n") % { summary: "#{summary_to_print.join(', ')}." })
+ end
+
+ def full_report(path)
+ require 'pdk/report'
+
+ report = ["/* Report generated by PDK at #{Time.now} */"]
+ report.concat(update_manager.changes[:modified].map { |_, diff| "\n\n\n#{diff}" })
+ PDK::Util::Filesystem.write_file(path, report.join)
+ PDK::Report.default_target.puts(_("\nYou can find a report of differences in %{path}.\n\n") % { path: path })
+ end
+
+ def generate_banner(text, width = 80)
+ padding = width - text.length
+ banner = ''
+ padding_char = '-'
+
+ (padding / 2.0).ceil.times { banner << padding_char }
+ banner << text
+ (padding / 2.0).floor.times { banner << padding_char }
+
+ banner
+ end
+ end
+ end
+end