Class: ContextSpook::Generator::Context

Inherits:
Object
  • Object
show all
Includes:
Term::ANSIColor, Tins::DSLAccessor, Tins::Scope
Defined in:
lib/context_spook/generator.rb

Overview

The Context class represents and manages project context data, providing structured storage for file contents, command outputs, variables, and metadata that can be serialized to JSON for AI assistance.

Instance Method Summary collapse

Constructor Details

#initialize(&block) ⇒ Context

The initialize method sets up the object by evaluating a block in the object’s context.



89
90
91
# File 'lib/context_spook/generator.rb', line 89

def initialize(&block)
  block and instance_eval(&block)
end

Instance Method Details

#as_jsonHash

The as_json method converts the context’s files, commands, and metadata into a hash representation.



248
249
250
251
252
253
254
255
# File 'lib/context_spook/generator.rb', line 248

def as_json(*)
  {
    files:,
    commands:,
    metadata:,
    variables:
  }
end

#command(shell_command, tags: nil) ⇒ Hash

The command method executes a shell command and stores its result.

This method runs a given shell command and records the output, exit code, working directory, and optional tags in the commands hash.

with the command

and metadata



216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
# File 'lib/context_spook/generator.rb', line 216

def command(shell_command, tags: nil)
  output = `#{shell_command}`
  exit_code = $?&.exitstatus.to_i
  if exit_code != 0
    STDERR.puts color(208) { "Executing #{shell_command.inspect} resulted in exit code #{exit_code}." }
  end
  commands[shell_command] = {
    namespace: scope_top,
    output:,
    exit_code:,
    working_directory: Dir.pwd,
    tags: (Array(tags) if tags),
  }.compact
  output_size = Tins::Unit.format(
    output.size, format: '%.2f %U', unit: ?b, prefix: 1024
  )
  STDERR.puts "Executed #{shell_command.inspect} with output (%s) for context." % output_size
  nil
end

#file(filename, tags: nil) ⇒ Hash

The file method associates a file with the current scope and stores its content.

It reads the specified file and creates an entry in the files hash with the file’s content, along with its namespace and optional tags.



182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/context_spook/generator.rb', line 182

def file(filename, tags: nil)
  content = File.read(filename)
  files[filename] = {
    namespace: scope_top,
    content:,
    size: content.size,
    lines: content.lines.size,
    tags: (Array(tags) if tags),
  }.compact
  file_size = Tins::Unit.format(
    content.size, format: '%.2f %U', unit: ?b, prefix: 1024
  )
  STDERR.puts "Read #{filename.inspect} (%s) for context." % file_size
  nil
rescue Errno::ENOENT => e
  STDERR.puts color(208) { "Reading #{filename.inspect} caused #{e.class}: #{e}" }
end

#json(filename) ⇒ Object?

The json method reads and parses a JSON file, returning the parsed data structure.

This method attempts to load a JSON file from the specified path and returns the resulting Ruby data structure. It provides verbose output about the file size when successfully reading the file. In case of file not found errors, it outputs a colored warning message to standard error and returns nil.



154
155
156
157
158
159
160
161
162
163
# File 'lib/context_spook/generator.rb', line 154

def json(filename)
  file_size = Tins::Unit.format(
    File.size(filename), format: '%.2f %U', unit: ?b, prefix: 1024
  )
  STDERR.puts "Read #{filename.inspect} as JSON (%s) for context." % file_size
  JSON.load_file(filename)
rescue Errno::ENOENT => e
  STDERR.puts color(208) { "Reading #{filename.inspect} as JSON caused #{e.class}: #{e}" }
  nil
end

#meta(**m) ⇒ Object

The meta method assigns metadata key-value pairs to the metadata hash.



135
136
137
138
139
140
# File 'lib/context_spook/generator.rb', line 135

def meta(**m)
  m.each do |name, value|
    [name.to_sym] = value
  end
  nil
end

#namespace(name) {|block| ... } ⇒ Object

The namespace method creates a scoped block with a given name.

Yields:

  • (block)

    executes the block within the created scope



98
99
100
101
102
103
104
# File 'lib/context_spook/generator.rb', line 98

def namespace(name, &block)
  name = name.to_sym
  scope_block(name) do
    instance_eval(&block)
  end
  nil
end

#sizeInteger

The size method calculates and returns the byte size of the JSON representation of the context.

This method determines the size in bytes of the JSON-serialized version of the context object, which is useful for understanding the total data payload being sent to an AI assistant.

context



266
267
268
# File 'lib/context_spook/generator.rb', line 266

def size
  to_json.size
end

#variable(**v) ⇒ Object

The variable method assigns key-value pairs to the variables hash.

values



118
119
120
121
122
123
# File 'lib/context_spook/generator.rb', line 118

def variable(**v)
  v.each do |name, value|
    variables[name.to_sym] = value
  end
  nil
end