Sha256: e75dc77db7b8c4e4e0bb7690d1d85487906d7e67b45d60dbb8dcdbad686edeeb

Contents?: true

Size: 1.78 KB

Versions: 97

Compression:

Stored size: 1.78 KB

Contents

module CC
  class Workspace
    class PathTree
      class DirNode
        def initialize(root_path, children = {})
          @root_path = root_path.dup.freeze
          @children = children.each_with_object({}) do |(k, v), memo|
            memo[k.clone] = v.clone
          end
        end

        def clone
          self.class.new(root_path, children)
        end

        def all_paths
          if populated?
            children.values.flat_map(&:all_paths)
          else
            [File.join(root_path, File::SEPARATOR)]
          end
        end

        def populated?
          children.present?
        end

        def remove(head = nil, *tail)
          return if head.nil? && tail.empty?
          populate_direct_children

          if (child = children[head])
            child.remove(*tail)
            children.delete(head) if !child.populated? || tail.empty?
          end
        end

        def add(head = nil, *tail)
          return if head.nil? && tail.empty?

          if (entry = find_direct_child(head))
            children[entry.basename.to_s.dup.freeze] ||= PathTree.node_for_pathname(entry)
            children[entry.basename.to_s.dup.freeze].add(*tail)
          else
            Analyzer.logger.debug("Couldn't include because part of path doesn't exist: #{File.join(root_path, head)}")
          end
        end

        private

        attr_reader :children, :root_path

        def populate_direct_children
          return if populated?

          Pathname.new(root_path).each_child do |child_path|
            children[child_path.basename.to_s] = PathTree.node_for_pathname(child_path)
          end
        end

        def find_direct_child(name)
          Pathname.new(root_path).children.detect { |c| c.basename.to_s == name }
        end
      end
    end
  end
end

Version data entries

97 entries across 97 versions & 2 rubygems

Version Path
codeclimate-0.85.12 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.85.11 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.85.10 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.85.9 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.85.8 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.85.7 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.85.6 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.85.5 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.85.4 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.85.3 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.85.2 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.85.1 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.85.0 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.84.0 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.83.0 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.82.0 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.81.0 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.80.0 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.79.0 lib/cc/workspace/path_tree/dir_node.rb
codeclimate-0.78.1 lib/cc/workspace/path_tree/dir_node.rb