Sha256: a47be0c51ae5fc1b2fd814946ac75a7fe679817029d61df73ab15ab4d61b313a

Contents?: true

Size: 1.92 KB

Versions: 3

Compression:

Stored size: 1.92 KB

Contents

# typed: strict
# frozen_string_literal: true

module Bhook
  class Directory
    extend T::Sig

    GIT_DIR = '.git'
    MD_EXT = '.md'

    sig { params(src_path: Pathname, out_path: Pathname).returns(Bhook::Directory) }
    def self.new_root_directory(src_path, out_path)
      new(src_path, out_path, Git.open(src_path), Bhook::Config.new(src_path))
    end

    sig { params(src_path: Pathname, out_path: Pathname, git: Git::Base, config: Bhook::Config).void }
    def initialize(src_path, out_path, git, config)
      @src_path = src_path
      @out_path = T.let(out_path.join(src_path.basename), Pathname)
      @git = git
      @config = config
      @sub_dirs = T.let([], T::Array[Directory])
      @md_files = T.let([], T::Array[MdFile])
      build_next_level_nodes
    end

    sig { params(theme: Theme).void }
    def write!(theme)
      FileUtils.mkdir_p(@out_path)
      L.debug("mkdir: #{@out_path}")
      @sub_dirs.each { |dir| dir.write!(theme) }
      @md_files.map do |file|
        Thread.new { file.write!(theme) }
      end.each(&:join)
    end

    sig { returns(T::Array[MdFile]) }
    def all_md_files
      @md_files + @sub_dirs.map(&:all_md_files).flatten
    end

    sig { returns(String) }
    def to_s
      @src_path.to_s
    end

    private

    sig { void }
    def build_next_level_nodes
      children = @src_path.children
      children.delete(@src_path.join(GIT_DIR))
      build_nodes(children)
    end

    sig { params(children: T::Array[Pathname]).void }
    def build_nodes(children)
      file_threads = []
      children.each do |child_path|
        if child_path.directory?
          @sub_dirs << Directory.new(child_path, @out_path, @git, @config)
        elsif child_path.extname == MD_EXT && !@config.excluded?(child_path)
          file_threads << Thread.new { MdFile.new(child_path, @out_path, @git, @config) }
        end
      end
      file_threads.each { |thread| @md_files << thread.value }
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
bhook-0.2.2 lib/bhook/directory.rb
bhook-0.2.1 lib/bhook/directory.rb
bhook-0.2.0 lib/bhook/directory.rb