Class: Ace::Review::Molecules::FeedbackDirectoryManager

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/review/molecules/feedback_directory_manager.rb

Overview

Manages feedback directory structure and file organization.

Handles creation of feedback directories, archiving of resolved items, and listing of feedback files.

Directory structure:

{base_path}/
  feedback/
    {id}-{slug}.s.md
    {id}-{slug}.s.md
    _archived/
      {id}-{slug}.s.md

Examples:

Ensure directories exist

manager = FeedbackDirectoryManager.new
manager.ensure_directory("/project")     #=> "/project/feedback"
manager.ensure_archive("/project")       #=> "/project/feedback/_archived"

Archive a resolved item

manager.archive("/project/feedback/abc123-bug-fix.s.md")
#=> { success: true, path: "/project/feedback/_archived/abc123-bug-fix.s.md" }

Constant Summary collapse

FEEDBACK_DIR =

Subdirectory name for feedback files

"feedback"
ARCHIVE_DIR =

Subdirectory name for archived files

"_archived"
FILE_EXTENSION =

File extension for feedback files

".s.md"

Instance Method Summary collapse

Instance Method Details

#archive(file_path) ⇒ Hash

Archive a feedback file by moving it to the _archived subdirectory

Parameters:

  • file_path (String)

    Path to the feedback file to archive

Returns:

  • (Hash)

    Result with :success and :path or :error



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/ace/review/molecules/feedback_directory_manager.rb', line 80

def archive(file_path)
  validate_archive_inputs(file_path)

  # Determine the archive destination
  feedback_dir = File.dirname(file_path)
  archive_dir = File.join(feedback_dir, ARCHIVE_DIR)
  filename = File.basename(file_path)
  dest_path = File.join(archive_dir, filename)

  # Ensure archive directory exists
  FileUtils.mkdir_p(archive_dir)

  # Move file to archive
  FileUtils.mv(file_path, dest_path)

  {success: true, path: dest_path}
rescue Errno::ENOENT
  {success: false, error: "File not found: #{file_path}"}
rescue Errno::EACCES
  {success: false, error: "Permission denied: #{file_path}"}
rescue => e
  {success: false, error: "Failed to archive file: #{e.message}"}
end

#archive_exists?(base_path) ⇒ Boolean

Check if the archive directory exists

Parameters:

  • base_path (String)

    The base project path

Returns:

  • (Boolean)

    True if archive directory exists



142
143
144
# File 'lib/ace/review/molecules/feedback_directory_manager.rb', line 142

def archive_exists?(base_path)
  Dir.exist?(archive_path(base_path))
end

#archive_path(base_path) ⇒ String

Get the archive directory path for a base path

Parameters:

  • base_path (String)

    The base project path

Returns:

  • (String)

    The archive directory path



52
53
54
# File 'lib/ace/review/molecules/feedback_directory_manager.rb', line 52

def archive_path(base_path)
  File.join(base_path, FEEDBACK_DIR, ARCHIVE_DIR)
end

#count_files(directory) ⇒ Hash

Count feedback files in a directory

Parameters:

  • directory (String)

    The feedback directory

  • include_archived (Boolean)

    Whether to include archived files

Returns:

  • (Hash)

    Counts with :active, :archived, and :total keys



151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/ace/review/molecules/feedback_directory_manager.rb', line 151

def count_files(directory)
  return {active: 0, archived: 0, total: 0} unless Dir.exist?(directory)

  active = Dir.glob(File.join(directory, "*#{FILE_EXTENSION}")).count
  archived = 0

  archive_dir = File.join(directory, ARCHIVE_DIR)
  if Dir.exist?(archive_dir)
    archived = Dir.glob(File.join(archive_dir, "*#{FILE_EXTENSION}")).count
  end

  {active: active, archived: archived, total: active + archived}
end

#ensure_archive(base_path) ⇒ String

Ensure the archive directory exists

Parameters:

  • base_path (String)

    The base project path

Returns:

  • (String)

    The archive directory path



70
71
72
73
74
# File 'lib/ace/review/molecules/feedback_directory_manager.rb', line 70

def ensure_archive(base_path)
  path = archive_path(base_path)
  FileUtils.mkdir_p(path)
  path
end

#ensure_directory(base_path) ⇒ String

Ensure the feedback directory exists

Parameters:

  • base_path (String)

    The base project path

Returns:

  • (String)

    The feedback directory path



60
61
62
63
64
# File 'lib/ace/review/molecules/feedback_directory_manager.rb', line 60

def ensure_directory(base_path)
  path = feedback_path(base_path)
  FileUtils.mkdir_p(path)
  path
end

#exists?(base_path) ⇒ Boolean

Check if a feedback directory exists

Parameters:

  • base_path (String)

    The base project path

Returns:

  • (Boolean)

    True if feedback directory exists



134
135
136
# File 'lib/ace/review/molecules/feedback_directory_manager.rb', line 134

def exists?(base_path)
  Dir.exist?(feedback_path(base_path))
end

#feedback_path(base_path) ⇒ String

Get the feedback directory path for a base path

Parameters:

  • base_path (String)

    The base project path

Returns:

  • (String)

    The feedback directory path



44
45
46
# File 'lib/ace/review/molecules/feedback_directory_manager.rb', line 44

def feedback_path(base_path)
  File.join(base_path, FEEDBACK_DIR)
end

#list_files(directory, include_archived: false) ⇒ Array<String>

List all feedback files in a directory

Parameters:

  • directory (String)

    The feedback directory to list

  • include_archived (Boolean) (defaults to: false)

    Whether to include archived files (default: false)

Returns:

  • (Array<String>)

    Array of file paths



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/ace/review/molecules/feedback_directory_manager.rb', line 109

def list_files(directory, include_archived: false)
  return [] unless Dir.exist?(directory)

  files = []

  # List files in main directory (excluding _archived subdirectory)
  main_files = Dir.glob(File.join(directory, "*#{FILE_EXTENSION}"))
  files.concat(main_files)

  # Include archived files if requested
  if include_archived
    archive_dir = File.join(directory, ARCHIVE_DIR)
    if Dir.exist?(archive_dir)
      archived_files = Dir.glob(File.join(archive_dir, "*#{FILE_EXTENSION}"))
      files.concat(archived_files)
    end
  end

  files.sort
end