class Lutaml::Cli::InteractiveShell::QueryCommands
def cmd_find(args)
def cmd_find(args) if args.empty? puts OutputFormatter.warning("Usage: find CLASS_NAME") return end query = args.join(" ") results = repository.search(query, types: [:class]) if results[:class].empty? puts OutputFormatter.warning("No classes found matching '#{query}'") else puts OutputFormatter.colorize( "Found #{results[:class].size} class(es):", :cyan ) display_class_results(results[:class]) end end
def cmd_results(_args)
def cmd_results(_args) if last_results.nil? || last_results.empty? puts OutputFormatter.warning("No previous results") else puts OutputFormatter.colorize( "Last results (#{last_results.size}):", :cyan ) last_results.each_with_index do |item, i| puts " #{i + 1}. #{item}" end end end
def cmd_search(args)
def cmd_search(args) if args.empty? puts OutputFormatter.warning("Usage: search QUERY") return end query = args.join(" ") results = repository.search(query) if results.values.all?(&:empty?) puts OutputFormatter.warning("No results found for '#{query}'") else display_search_results(results) end end
def cmd_show(args)
def cmd_show(args) if args.empty? puts OutputFormatter.warning( "Usage: show class QNAME | show package PATH | show NUMBER", ) return end subcommand = args[0].downcase case subcommand when "class" show_class(args[1..].join(" ")) when "package" show_package(args[1..].join(" ")) when /^\d+$/ show_numbered_result(subcommand.to_i) else show_class(args.join(" ")) end end
def display_association_results(items)
def display_association_results(items) items.each do |item| icon = config[:icons] ? "#{EnhancedFormatter::ICONS[:association]} " : "" puts " #{icon}#{item[:source]} → #{item[:target]}" end end
def display_attribute_results(items)
def display_attribute_results(items) items.each do |item| puts " - #{item[:class_name]}::#{item[:attribute_name]} : " \ "#{item[:type]}" end end
def display_class_attributes(cls)
def display_class_attributes(cls) puts "" puts OutputFormatter.colorize("Attributes:", :yellow) cls.attributes.each do |attr| puts " - #{attr.name}: #{attr.type}" end end
def display_class_plain(cls, qname)
def display_class_plain(cls, qname) puts OutputFormatter.colorize("Class: #{qname}", :cyan) puts "=" * 50 puts "" puts "Name: #{cls.name}" display_class_attributes(cls) if has_displayable_attributes?(cls) end
def display_class_results(items)
def display_class_results(items) self.last_results = items items.each_with_index do |qname, i| icon = config[:icons] ? "#{EnhancedFormatter::ICONS[:class]} " : "" puts " #{i + 1}. #{icon}#{qname}" end puts "" puts "Use 'show NUMBER' to view details" end
def display_package_classes(path)
def display_package_classes(path) classes = repository.classes_in_package(path) puts OutputFormatter.colorize("Classes (#{classes.size}):", :yellow) classes.each do |cls| icon = config[:icons] ? "#{EnhancedFormatter::ICONS[:class]} " : "" puts " #{icon}#{cls.name}" end end
def display_package_contents(pkg, path)
def display_package_contents(pkg, path) puts OutputFormatter.colorize("Package: #{path}", :cyan) puts "=" * 50 puts "" puts "Name: #{pkg.name}" puts "" display_package_classes(path) end
def display_search_results(results)
def display_search_results(results) results.each do |type, items| next if items.empty? puts "" puts OutputFormatter.colorize( "#{type.to_s.capitalize} Results (#{items.size}):", :cyan ) case type when :class display_class_results(items) when :attribute display_attribute_results(items) when :association display_association_results(items) end end end
def has_displayable_attributes?(cls)
def has_displayable_attributes?(cls) cls.is_a?(Lutaml::Uml::Classifier) && cls.attributes && !cls.attributes.empty? end
def show_class(qname)
def show_class(qname) cls = repository.find_class(qname) unless cls puts OutputFormatter.error("Class not found: #{qname}") return end if config[:icons] puts EnhancedFormatter.format_class_details_enhanced(cls) else display_class_plain(cls, qname) end end
def show_numbered_result(number)
def show_numbered_result(number) if last_results.nil? || last_results.empty? puts OutputFormatter.warning("No previous results") return end index = number - 1 if index.negative? || index >= last_results.size puts OutputFormatter.error("Invalid result number: #{number}") return end show_class(last_results[index]) end
def show_package(path)
def show_package(path) nav = shell.navigation path = nav.resolve_path(path) pkg = repository.find_package(path) unless pkg puts OutputFormatter.error("Package not found: #{path}") return end display_package_contents(pkg, path) end