Sha256: 8f7e79dacc2a1ef34af13329b9e74376d98f13502e0b029f88701a58bbe3eb8a

Contents?: true

Size: 1.77 KB

Versions: 1

Compression:

Stored size: 1.77 KB

Contents

require 'tsort'

module Codependency
  class Graph < Hash

    ##
    # Add the given file to this graph. Creates a new entry in the
    # graph, the key of which is the relative path to this file and
    # the value is the array of relative paths to its dependencies.
    # Any dependent files will also be recursively added to this
    # graph.
    def require( string )
      file = path_to( string ).to_path

      self[ file ] ||= parser.parse( file ).map do |short|
        path_to( path[ short ] ).to_path
      end
      self[ file ].each { |f| self.require( f ) unless key?( f ) }
    end
    alias :<< :require

    ##
    # Returns the sorted list of files as determined by this graph,
    # relative to the calling file.
    def files
      tsort
    end

    ##
    # The path set for this dependency graph.
    def path
      @path ||= Path.new parser.extensions
    end

    ##
    # The file parser for this dependency graph.
    def parser
      @parser ||= Parser.new
    end

    private

    include TSort

    ##
    # tsort interface
    alias :tsort_each_node :each_key

    ##
    # tsort interface
    def tsort_each_child( node, &block )
      fetch( node ).each( &block )
    end

    ##
    # The current working directory of this graph. All paths in the graph
    # will be relative to this path.
    def root
      @root ||= Pathname.getwd
    end

    ##
    # Calculates the relative path from one path the `#root` path. Accepts
    # a string, returns a Pathname object populated with the relative path.
    def path_to( string )
      path = Pathname( string )
      path = path.expand_path
      path = path.relative_path_from( root )

      if path.to_path.start_with?( '.' )
        path
      else
        Pathname( File.join( '.', path.to_path ) )
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
codependency-2.3.0 lib/codependency/graph.rb