lib/pdk/context.rb in pdk-2.4.0 vs lib/pdk/context.rb in pdk-2.5.0
- old
+ new
@@ -1,99 +1,99 @@
-require 'pdk'
-
-module PDK
- module Context
- autoload :None, 'pdk/context/none'
- autoload :Module, 'pdk/context/module'
- autoload :ControlRepo, 'pdk/context/control_repo'
-
- # Automatically determines the PDK Context given a path. Create will continue up the directory tree until it
- # finds a valid context
- # @return [PDK::Context::AbstractContext] Returns a PDK::Context::None if the context could not be determined
- def self.create(context_path)
- return PDK::Context::None.new(context_path) unless PDK::Util::Filesystem.directory?(context_path)
-
- previous = nil
- current = PDK::Util::Filesystem.expand_path(context_path)
- until !PDK::Util::Filesystem.directory?(current) || current == previous
- # Control Repo detection
- return PDK::Context::ControlRepo.new(current, context_path) if PDK.feature_flag?('controlrepo') && PDK::ControlRepo.control_repo_root?(current)
-
- # Puppet Module detection
- metadata_file = File.join(current, 'metadata.json')
- if PDK::Util::Filesystem.file?(metadata_file) || PDK::Util.in_module_root?(context_path)
- return PDK::Context::Module.new(current, context_path)
- end
-
- previous = current
- current = PDK::Util::Filesystem.expand_path('..', current)
- end
- PDK::Context::None.new(context_path)
- end
-
- # Abstract class which all PDK Contexts will subclass from.
- # @abstract
- class AbstractContext
- # The root of this context, for example the module root when inside a module. This can be different from context_path
- # For example a Module context_path could be /path/to/module/manifests/ but the root_path will be /path/to/module as
- # that is the root of the Module context. Defaults to the context_path if not set.
- # @return [String]
- def root_path
- @root_path || @context_path
- end
-
- # The path used to create this context, for example the current working directory. This can be different from root_path
- # For example a Module context_path could be /path/to/module/manifests/ but the root_path will be /path/to/module as
- # that is the root of the Module context
- # @return [String]
- attr_reader :context_path
-
- # @param context_path [String] The path where this context was created from e.g. Dir.pwd
- def initialize(context_path)
- @context_path = context_path
- @root_path = nil
- end
-
- # Whether the current context is compatible with the PDK e.g. in a Module context, whether it has the correct metadata.json content
- # @return [Boolean] Default is not compatible
- def pdk_compatible?
- false
- end
-
- # The friendly name to display for this context
- # @api private
- # @abstract
- def display_name; end
-
- # The context which this context is in. For example a Module Context (/controlrepo/site/profile) can be inside of a Control Repo context (/controlrepo)
- # The default is to search in the parent directory of this context
- # @return [PDK::Context::AbstractContext, Nil] Returns the parent context or nil if there is no parent.
- def parent_context
- # Default detection is just look for the context in the parent directory of this context
- @parent_context || PDK::Context.create(File.dirname(root_path))
- end
-
- # Writes the current context information, and parent contexts, to the PDK Debug Logger.
- # This is mainly used by the PDK CLI when in debug mode to assist users to figure out why the PDK is misbehaving.
- # @api private
- def to_debug_log
- current = self
- depth = 1
- loop do
- PDK.logger.debug("Detected #{current.display_name} at #{current.root_path.nil? ? current.context_path : current.root_path}")
- current = current.parent_context
- break if current.nil?
- depth += 1
- # Circuit breaker in case there are circular references
- break if depth > 20
- end
- nil
- end
-
- #:nocov: There's nothing to test here
- def to_s
- "#<#{self.class}:#{object_id}>#{context_path}"
- end
- #:nocov:
- end
- end
-end
+require 'pdk'
+
+module PDK
+ module Context
+ autoload :None, 'pdk/context/none'
+ autoload :Module, 'pdk/context/module'
+ autoload :ControlRepo, 'pdk/context/control_repo'
+
+ # Automatically determines the PDK Context given a path. Create will continue up the directory tree until it
+ # finds a valid context
+ # @return [PDK::Context::AbstractContext] Returns a PDK::Context::None if the context could not be determined
+ def self.create(context_path)
+ return PDK::Context::None.new(context_path) unless PDK::Util::Filesystem.directory?(context_path)
+
+ previous = nil
+ current = PDK::Util::Filesystem.expand_path(context_path)
+ until !PDK::Util::Filesystem.directory?(current) || current == previous
+ # Control Repo detection
+ return PDK::Context::ControlRepo.new(current, context_path) if PDK.feature_flag?('controlrepo') && PDK::ControlRepo.control_repo_root?(current)
+
+ # Puppet Module detection
+ metadata_file = File.join(current, 'metadata.json')
+ if PDK::Util::Filesystem.file?(metadata_file) || PDK::Util.in_module_root?(context_path)
+ return PDK::Context::Module.new(current, context_path)
+ end
+
+ previous = current
+ current = PDK::Util::Filesystem.expand_path('..', current)
+ end
+ PDK::Context::None.new(context_path)
+ end
+
+ # Abstract class which all PDK Contexts will subclass from.
+ # @abstract
+ class AbstractContext
+ # The root of this context, for example the module root when inside a module. This can be different from context_path
+ # For example a Module context_path could be /path/to/module/manifests/ but the root_path will be /path/to/module as
+ # that is the root of the Module context. Defaults to the context_path if not set.
+ # @return [String]
+ def root_path
+ @root_path || @context_path
+ end
+
+ # The path used to create this context, for example the current working directory. This can be different from root_path
+ # For example a Module context_path could be /path/to/module/manifests/ but the root_path will be /path/to/module as
+ # that is the root of the Module context
+ # @return [String]
+ attr_reader :context_path
+
+ # @param context_path [String] The path where this context was created from e.g. Dir.pwd
+ def initialize(context_path)
+ @context_path = context_path
+ @root_path = nil
+ end
+
+ # Whether the current context is compatible with the PDK e.g. in a Module context, whether it has the correct metadata.json content
+ # @return [Boolean] Default is not compatible
+ def pdk_compatible?
+ false
+ end
+
+ # The friendly name to display for this context
+ # @api private
+ # @abstract
+ def display_name; end
+
+ # The context which this context is in. For example a Module Context (/controlrepo/site/profile) can be inside of a Control Repo context (/controlrepo)
+ # The default is to search in the parent directory of this context
+ # @return [PDK::Context::AbstractContext, Nil] Returns the parent context or nil if there is no parent.
+ def parent_context
+ # Default detection is just look for the context in the parent directory of this context
+ @parent_context || PDK::Context.create(File.dirname(root_path))
+ end
+
+ # Writes the current context information, and parent contexts, to the PDK Debug Logger.
+ # This is mainly used by the PDK CLI when in debug mode to assist users to figure out why the PDK is misbehaving.
+ # @api private
+ def to_debug_log
+ current = self
+ depth = 1
+ loop do
+ PDK.logger.debug("Detected #{current.display_name} at #{current.root_path.nil? ? current.context_path : current.root_path}")
+ current = current.parent_context
+ break if current.nil?
+ depth += 1
+ # Circuit breaker in case there are circular references
+ break if depth > 20
+ end
+ nil
+ end
+
+ #:nocov: There's nothing to test here
+ def to_s
+ "#<#{self.class}:#{object_id}>#{context_path}"
+ end
+ #:nocov:
+ end
+ end
+end