tasks/fact_generator/fact_creator.rb
#!/usr/bin/env ruby
# frozen_string_literal: true
require 'json'
require 'pathname'
require 'fileutils'
require 'erb'
ROOT_DIR = Pathname.new(File.expand_path('../..', __dir__)) unless defined?(ROOT_DIR)
require "#{ROOT_DIR}/tasks/fact_generator/path"
require "#{ROOT_DIR}/lib/framework/logging/multilogger"
require "#{ROOT_DIR}/lib/framework/logging/legacy_logger"
require "#{ROOT_DIR}/lib/framework/logging/logger"
class FactCreator
def initialize
@log = Facter::Log.new(self)
end
def create_facts
facts_json_string = File.read(File.join(ROOT_DIR, 'tasks', 'fact_generator', 'facts.json'))
facts = JSON.parse(facts_json_string)
facts.each do |fact|
operating_system = fact['os']
fact_name = fact['fact_name']
create_fact(operating_system, fact_name)
end
end
def create_fact(operating_system, fact_name)
@log.info("Creating fact with name #{fact_name} for os #{operating_system}")
path = create_directory_path(operating_system, fact_name)
create_directory_structure(path)
create_fact_files(path, fact_name, operating_system)
end
private
def create_directory_path(operating_system, fact_name)
fact_tokens = fact_name.split('.')
fact_tokens = fact_tokens.first(fact_tokens.size - 1)
fact_directory = File.join(ROOT_DIR, 'lib', 'facts', operating_system, fact_tokens)
fact_spec_directory = File.join(ROOT_DIR, 'spec', 'facter', 'facts', operating_system, fact_tokens)
Path.new(fact_directory, fact_spec_directory)
end
def create_directory_structure(path)
FileUtils.mkdir_p(path.fact) unless File.directory?(path.fact)
FileUtils.mkdir_p(path.spec) unless File.directory?(path.spec)
end
def create_fact_files(path, fact_name, operating_system)
create_fact_file(path.fact, fact_name, operating_system)
create_spec_file(path.spec, fact_name, operating_system)
end
def create_fact_file(fact_path, fact_name, operating_system)
fact_tokens = fact_name.split('.')
fact_file_name = fact_tokens.reverse.first + '.rb'
fact_file_with_path = File.join(fact_path, fact_file_name)
return if File.exist?(fact_file_with_path)
fact_file = File.new(File.join(fact_path, fact_file_name), 'w')
fact_class_content = create_fact_from_template(fact_name, operating_system)
fact_file.write(fact_class_content)
end
def create_spec_file(spec_path, fact_name, operating_system)
fact_tokens = fact_name.split('.')
spec_file_name = fact_tokens.reverse.first + '_spec.rb'
spec_file_with_path = File.join(spec_path, spec_file_name)
return if File.exist?(spec_file_with_path)
spec_file = File.new(File.join(spec_path, spec_file_name), 'w')
spec_class_content = create_spec_from_template(fact_name, operating_system)
spec_file.write(spec_class_content)
end
def create_fact_from_template(fact_name, operating_system)
delimiters = ['.', '_']
fact_tokens = fact_name.split(Regexp.union(delimiters))
template = ERB.new(File.read(File.join(ROOT_DIR, 'tasks', 'fact_generator', 'fact.erb')))
os_name = operating_system.capitalize
camelcase_fact_name = fact_tokens.map(&:capitalize).join('')
template.result(binding)
end
def create_spec_from_template(fact_name, operating_system)
delimiters = ['.', '_']
fact_tokens = fact_name.split(Regexp.union(delimiters))
template = ERB.new(File.read(File.join(ROOT_DIR, 'tasks', 'fact_generator', 'fact_spec.erb')))
os_name = operating_system.capitalize
camelcase_fact_name = fact_tokens.map(&:capitalize).join('')
template.result(binding)
end
end