module EacLauncher class Context include ::Eac::SimpleCache DEFAULT_PROJECTS_ROOT = '.'.freeze DEFAULT_SETTINGS_FILE = ::File.join(ENV['HOME'], '.config', 'eac_launcher', 'settings.yml') DEFAULT_CACHE_ROOT = ::File.join(ENV['HOME'], '.cache', 'eac_launcher') class << self attr_writer :current def current @current ||= default end def default @default ||= Context.new end end attr_reader :root, :settings, :cache_root attr_accessor :publish_options def initialize(options = {}) @options = options.with_indifferent_access @root = ::EacLauncher::Instances::Base.new(build_option(:projects_root), nil) @settings = ::EacLauncher::Context::Settings.new(build_option(:settings_file)) @cache_root = build_option(:cache_root) @publish_options = { new: false, confirm: false, stereotype: nil } end def instance(to_root_path) instances.find { |i| i.to_root_path == to_root_path } end private def build_option(key) @options[key] || env_option(key) || default_option(key) end def env_option(key) ENV["EAC_LAUNCHER_#{key}".underscore.upcase] end def default_option(key) self.class.const_get("DEFAULT_#{key}".underscore.upcase) end def projects_uncached r = {} instances.each do |i| r[i.basename] ||= [] r[i.basename] << i end r.map { |name, instances| ::EacLauncher::Project.new(name, instances) } .select { |p| include_project?(p) } end def instances_uncached instance_instances(root) end def instance_instances(i) r = [] r << i if include_instance?(i) r += i.children.flat_map { |c| instance_instances(c) } r end def include_project?(p) !@settings.excluded_projects.include?(p.name) end def include_instance?(i) i.project? && !@settings.excluded_projects.include?(i.project_name) end end end