Class: ContextSpook::Generator::Context
- Inherits:
-
Object
- Object
- ContextSpook::Generator::Context
- Includes:
- TOON, VerbosePuts, 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 Attribute Summary collapse
-
#generator ⇒ ContextSpook::Generator
readonly
The generator method returns the generator object associated with this context.
Instance Method Summary collapse
-
#as_json(*ignored) ⇒ 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(generator:, &block) ⇒ Context
constructor
The initialize method sets up the object by evaluating the provided 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.
-
#yaml(filename) ⇒ Object?
The yaml method reads and parses a YAML file, returning the resulting data structure.
Methods included from TOON
#to_toon, #toon_example, #toon_size
Methods included from VerbosePuts
Constructor Details
#initialize(generator:, &block) ⇒ Context
The initialize method sets up the object by evaluating the provided block in the object's context.
130 131 132 133 134 135 136 137 |
# File 'lib/context_spook/generator.rb', line 130 def initialize(generator:, &block) @generator = generator block and instance_eval(&block) (format: generator.format) if generator.format == 'TOON' (toon_example: toon_example) end end |
Instance Attribute Details
#generator ⇒ ContextSpook::Generator (readonly)
The generator method returns the generator object associated with this context.
144 145 146 |
# File 'lib/context_spook/generator.rb', line 144 def generator @generator end |
Instance Method Details
#as_json(*ignored) ⇒ Hash
The as_json method converts the context's files, commands, and metadata into a hash representation.
335 336 337 338 339 340 341 342 |
# File 'lib/context_spook/generator.rb', line 335 def as_json(*ignored) { 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
298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/context_spook/generator.rb', line 298 def command(shell_command, tags: nil) output = `#{shell_command}` exit_code = $?&.exitstatus.to_i if exit_code != 0 verbose_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 ) verbose_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.
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
# File 'lib/context_spook/generator.rb', line 261 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 ) verbose_puts "Read #{filename.inspect} (%s) for context." % file_size nil rescue Errno::ENOENT => e verbose_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.
209 210 211 212 213 214 215 216 217 218 |
# File 'lib/context_spook/generator.rb', line 209 def json(filename) file_size = Tins::Unit.format( File.size(filename), format: '%.2f %U', unit: ?b, prefix: 1024 ) verbose_puts "Read #{filename.inspect} as JSON (%s) for context." % file_size JSON.load_file(filename) rescue Errno::ENOENT, JSON::ParserError => e verbose_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.
190 191 192 193 194 195 |
# File 'lib/context_spook/generator.rb', line 190 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.
153 154 155 156 157 158 159 |
# File 'lib/context_spook/generator.rb', line 153 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
353 354 355 |
# File 'lib/context_spook/generator.rb', line 353 def size to_json.size end |
#variable(**v) ⇒ Object
The variable method assigns key-value pairs to the variables hash.
values
173 174 175 176 177 178 |
# File 'lib/context_spook/generator.rb', line 173 def variable(**v) v.each do |name, value| variables[name.to_sym] = value end nil end |
#yaml(filename) ⇒ Object?
The yaml method reads and parses a YAML file, returning the resulting data structure.
This method attempts to load a YAML 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 or YAML syntax errors, it outputs a colored warning message to standard error and returns nil.
233 234 235 236 237 238 239 240 241 242 |
# File 'lib/context_spook/generator.rb', line 233 def yaml(filename) file_size = Tins::Unit.format( File.size(filename), format: '%.2f %U', unit: ?b, prefix: 1024 ) verbose_puts "Read #{filename.inspect} as YAML (%s) for context." % file_size YAML.load_file(filename) rescue Errno::ENOENT, Psych::SyntaxError => e verbose_puts color(208) { "Reading #{filename.inspect} as YAML caused #{e.class}: #{e}" } nil end |