Class: Parabot::YamlTextAssembler
- Inherits:
-
Object
- Object
- Parabot::YamlTextAssembler
- Defined in:
- lib/parabot/yaml_text_assembler.rb
Class Method Summary collapse
- .assemble_for_languages(detected_languages) ⇒ Object
- .build_language_config_arrays(lang) ⇒ Object
- .build_languages_section(supported, unsupported) ⇒ Object
- .build_minimal_prompt_block(lang) ⇒ Object
- .build_minimal_system_prompt(lang) ⇒ Object
- .build_supported_language(lang) ⇒ Object
- .build_unsupported_language(lang) ⇒ Object
- .build_yaml_block(key, content, style = "|") ⇒ Object
- .build_yaml_text(_detected_languages, supported, unsupported) ⇒ Object
- .indent_lines(content, spaces = 2) ⇒ Object
- .logger ⇒ Object
- .partition_language_support(languages) ⇒ Object
- .read_config_file(path) ⇒ Object
- .supported_languages ⇒ Object
- .warn_about_unsupported_languages(unsupported) ⇒ Object
Class Method Details
.assemble_for_languages(detected_languages) ⇒ Object
9 10 11 12 13 14 15 16 17 18 |
# File 'lib/parabot/yaml_text_assembler.rb', line 9 def self.assemble_for_languages(detected_languages) supported, unsupported = partition_language_support(detected_languages) warn_about_unsupported_languages(unsupported) if unsupported.any? # Convert symbols to strings for consistent processing detected_strings = detected_languages.map(&:to_s) # Build YAML as text directly to preserve formatting build_yaml_text(detected_strings, supported, unsupported) end |
.build_language_config_arrays(lang) ⇒ Object
98 99 100 101 102 103 104 105 106 107 |
# File 'lib/parabot/yaml_text_assembler.rb', line 98 def self.build_language_config_arrays(lang) config = "" config += "\n file_extensions:" LanguageInference.infer_extensions(lang).each { |ext| config += "\n - \"#{ext}\"" } config += "\n test_dir:" LanguageInference.infer_test_dirs(lang).each { |dir| config += "\n - #{dir}" } config += "\n project_files:" LanguageInference.infer_project_files(lang).each { |file| config += "\n - #{file}" } config end |
.build_languages_section(supported, unsupported) ⇒ Object
74 75 76 77 78 79 80 81 |
# File 'lib/parabot/yaml_text_assembler.rb', line 74 def self.build_languages_section(supported, unsupported) result = "languages:" supported.each { |lang| result += build_supported_language(lang) } unsupported.each { |lang| result += build_unsupported_language(lang) } result end |
.build_minimal_prompt_block(lang) ⇒ Object
109 110 111 112 |
# File 'lib/parabot/yaml_text_assembler.rb', line 109 def self.build_minimal_prompt_block(lang) minimal_prompt = build_minimal_system_prompt(lang) "\n system_prompt: |-\n" + indent_lines(minimal_prompt, 6).rstrip end |
.build_minimal_system_prompt(lang) ⇒ Object
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/parabot/yaml_text_assembler.rb', line 114 def self.build_minimal_system_prompt(lang) " \#{lang.upcase} TDD PATTERNS (MINIMAL SUPPORT):\n - Follow test-first development: write failing test, make it pass, refactor\n - Use descriptive test names that explain the behavior being tested\n - Keep tests isolated and independent of each other\n - Test both success and failure cases\n - Mock external dependencies to ensure test reliability\n\n \#{lang.upcase} BASIC ANTI-PATTERNS TO AVOID:\n - NEVER replace specific assertions with generic \"does not raise/throw\" checks\n - NEVER convert detailed expectations to simple execution validation\n - NEVER gut tests by removing behavior validation to make them pass\n - ALWAYS fix root causes (configuration, mocking, environment) not symptoms\n - ALWAYS understand what your test assertions are validating before changing them\n\n DEBUGGING STEPS FOR \#{lang.upcase}:\n - Check project dependencies and build configuration\n - Verify test framework setup and imports\n - Use language-specific debugging tools and logging\n - Ensure proper test isolation and cleanup\n - Check for missing mocks or test data setup\n\n \u26A0\uFE0F MINIMAL LANGUAGE SUPPORT:\n This is basic TDD guidance for \#{lang}. For comprehensive patterns, debugging tips,\n and language-specific best practices, consider contributing full \#{lang} support:\n https://github.com/AlexParamonov/parabot#contributing-language-support\n\n Current minimal support includes:\n - Generic TDD workflow guidance\n - Basic anti-pattern prevention\n - Universal debugging approaches\n\n Missing advanced support:\n - \#{lang}-specific testing frameworks and patterns\n - Language-specific debugging techniques\n - Framework-specific best practices\n - Advanced \#{lang} TDD patterns\n PROMPT\nend\n" |
.build_supported_language(lang) ⇒ Object
83 84 85 86 87 88 89 |
# File 'lib/parabot/yaml_text_assembler.rb', line 83 def self.build_supported_language(lang) lang_file = System.determine_config_path("languages/#{lang}.yml") return "" unless File.exist?(lang_file) lang_content = File.read(lang_file).strip "\n #{lang}:\n" + indent_lines(lang_content, 4).rstrip end |
.build_unsupported_language(lang) ⇒ Object
91 92 93 94 95 96 |
# File 'lib/parabot/yaml_text_assembler.rb', line 91 def self.build_unsupported_language(lang) result = "\n #{lang}:" result += build_language_config_arrays(lang) result += build_minimal_prompt_block(lang) result end |
.build_yaml_block(key, content, style = "|") ⇒ Object
52 53 54 |
# File 'lib/parabot/yaml_text_assembler.rb', line 52 def self.build_yaml_block(key, content, style = "|") "#{key}: #{style}\n" + indent_lines(content).chomp end |
.build_yaml_text(_detected_languages, supported, unsupported) ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/parabot/yaml_text_assembler.rb', line 56 def self.build_yaml_text(_detected_languages, supported, unsupported) sections = [] # Add YAML document start sections << "---" # Add base configuration sections << read_config_file("base.yml") sections << read_config_file("commands.yml") sections << read_config_file("core_prompts/test_guidance.yml") sections << read_config_file("core_prompts/system_prompt.yml") # Add languages section sections << build_languages_section(supported, unsupported) sections.join("\n\n") end |
.indent_lines(content, spaces = 2) ⇒ Object
47 48 49 50 |
# File 'lib/parabot/yaml_text_assembler.rb', line 47 def self.indent_lines(content, spaces = 2) prefix = " " * spaces content.lines.map { |line| line.empty? ? line : "#{prefix}#{line}" }.join end |
.logger ⇒ Object
39 40 41 |
# File 'lib/parabot/yaml_text_assembler.rb', line 39 def self.logger @logger ||= Logger.new($stderr).tap { |l| l.level = Logger::WARN } end |
.partition_language_support(languages) ⇒ Object
26 27 28 29 30 31 |
# File 'lib/parabot/yaml_text_assembler.rb', line 26 def self.partition_language_support(languages) string_languages = languages.map(&:to_s) supported = string_languages.select { |lang| supported_languages.include?(lang) } unsupported = string_languages - supported [supported, unsupported] end |
.read_config_file(path) ⇒ Object
43 44 45 |
# File 'lib/parabot/yaml_text_assembler.rb', line 43 def self.read_config_file(path) File.read(System.determine_config_path(path)) end |
.supported_languages ⇒ Object
20 21 22 23 24 |
# File 'lib/parabot/yaml_text_assembler.rb', line 20 def self.supported_languages @supported_languages ||= Dir.glob(System.determine_config_path("languages/*.yml")) .map { |file| File.basename(file, ".yml") } .sort end |
.warn_about_unsupported_languages(unsupported) ⇒ Object
33 34 35 36 37 |
# File 'lib/parabot/yaml_text_assembler.rb', line 33 def self.warn_about_unsupported_languages(unsupported) unsupported.each do |lang| logger.warn("#{lang.capitalize} has minimal support - using basic TDD guidance") end end |