Class: ContextSpook::Generator::Context
- Inherits:
-
Object
- Object
- ContextSpook::Generator::Context
- 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
-
#as_json ⇒ Hash
The as_json method converts the context’s files, commands, and metadata into a hash representation.
-
#command(shell_command, tags: nil) ⇒ Hash
The command method executes a shell command and stores its result.
-
#file(filename, tags: nil) ⇒ Hash
The file method associates a file with the current scope and stores its content.
-
#initialize(&block) ⇒ Context
constructor
The initialize method sets up the object by evaluating a block in the object’s context.
-
#json(filename) ⇒ Object?
The json method reads and parses a JSON file, returning the parsed data structure.
-
#meta(**m) ⇒ Object
The meta method assigns metadata key-value pairs to the metadata hash.
-
#namespace(name) {|block| ... } ⇒ Object
The namespace method creates a scoped block with a given name.
-
#size ⇒ Integer
The size method calculates and returns the byte size of the JSON representation of the context.
-
#variable(**v) ⇒ Object
The variable method assigns key-value pairs to the variables hash.
Constructor Details
#initialize(&block) ⇒ Context
The initialize method sets up the object by evaluating a block in the object’s context.
90 91 92 |
# File 'lib/context_spook/generator.rb', line 90 def initialize(&block) block and instance_eval(&block) end |
Instance Method Details
#as_json ⇒ Hash
The as_json method converts the context’s files, commands, and metadata into a hash representation.
250 251 252 253 254 255 256 257 |
# File 'lib/context_spook/generator.rb', line 250 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
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 |
# File 'lib/context_spook/generator.rb', line 218 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() if ), }.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.
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
# File 'lib/context_spook/generator.rb', line 183 def file(filename, tags: nil) content = File.read(filename) files[filename] = { namespace: scope_top, content:, size: content.size, lines: content.lines.size, content_types: MIME::Types.type_for(filename).map(&:content_type).full?, tags: (Array() if ), }.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.
155 156 157 158 159 160 161 162 163 164 |
# File 'lib/context_spook/generator.rb', line 155 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.
136 137 138 139 140 141 |
# File 'lib/context_spook/generator.rb', line 136 def (**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.
99 100 101 102 103 104 105 |
# File 'lib/context_spook/generator.rb', line 99 def namespace(name, &block) name = name.to_sym scope_block(name) do instance_eval(&block) end nil end |
#size ⇒ Integer
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
268 269 270 |
# File 'lib/context_spook/generator.rb', line 268 def size to_json.size end |
#variable(**v) ⇒ Object
The variable method assigns key-value pairs to the variables hash.
values
119 120 121 122 123 124 |
# File 'lib/context_spook/generator.rb', line 119 def variable(**v) v.each do |name, value| variables[name.to_sym] = value end nil end |