Class: Ace::Support::Items::Molecules::DirectoryScanner

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/support/items/molecules/directory_scanner.rb

Overview

Recursively scans an item root directory for item spec files. Returns ScanResult objects with folder and ID metadata.

Item directories follow the convention: id-slug/ Item spec files match a configurable glob pattern within those directories.

The id_extractor proc allows customizing how IDs are extracted from folder names. Default: matches 6-char b36ts IDs (e.g., “8ppq7w-dark-mode”) Custom: can match type-marked IDs (e.g., “8pp.t.q7w-fix-login”)

Constant Summary collapse

DEFAULT_ID_EXTRACTOR =

Default extractor for 6-char raw b36ts IDs

->(folder_name) {
  match = folder_name.match(/^([0-9a-z]{6})-?(.*)$/)
  return nil unless match

  id = match[1]
  slug = match[2].empty? ? folder_name : match[2]
  [id, slug]
}

Instance Method Summary collapse

Constructor Details

#initialize(root_dir, file_pattern:, id_extractor: nil) ⇒ DirectoryScanner

Returns a new instance of DirectoryScanner.

Parameters:

  • root_dir (String)

    Root directory to scan

  • file_pattern (String)

    Glob pattern for spec files (e.g., “*.idea.s.md”)

  • id_extractor (Proc, nil) (defaults to: nil)

    Custom proc to extract [id, slug] from folder name. Receives folder_name string, returns [id, slug] array or nil if no match.



35
36
37
38
39
# File 'lib/ace/support/items/molecules/directory_scanner.rb', line 35

def initialize(root_dir, file_pattern:, id_extractor: nil)
  @root_dir = root_dir
  @file_pattern = file_pattern
  @id_extractor = id_extractor || DEFAULT_ID_EXTRACTOR
end

Instance Method Details

#scanArray<ScanResult>

Scan root directory recursively for items

Returns:

  • (Array<ScanResult>)

    List of scan results, sorted by ID (chronological)



43
44
45
46
47
48
49
# File 'lib/ace/support/items/molecules/directory_scanner.rb', line 43

def scan
  return [] unless Dir.exist?(@root_dir)

  results = []
  scan_directory(@root_dir, results)
  results.sort_by(&:id)
end