From 05b716613b89e376e032ad66d5118b37fb93fcc7 Mon Sep 17 00:00:00 2001 From: Issy Long Date: Sun, 3 Mar 2024 22:21:29 +0000 Subject: [PATCH] Convert the `utils/tty` RBI generator to a Tapioca compiler - The preferred way of doing RBI generation is via Tapioca. So I am trying to stop being intimidated by it, by learning how it works. - This is very WIP still, currently failing with the following message because the `module` name is missing in the generated RBI file. ``` There are parse errors in the generated RBI files. Errors: sorbet/rbi/dsl/tty.rbi:8: unexpected token tNL (2001) sorbet/rbi/dsl/tty.rbi:64: unexpected token "end" (2001) ``` --- Library/Homebrew/dev-cmd/typecheck.rb | 1 - .../Homebrew/sorbet/custom_generators/tty.rb | 31 --------- Library/Homebrew/sorbet/rbi/dsl/tty.rbi | 64 +++++++++++++++++++ .../Homebrew/sorbet/tapioca/compilers/tty.rb | 31 +++++++++ Library/Homebrew/utils/tty.rbi | 60 ----------------- 5 files changed, 95 insertions(+), 92 deletions(-) delete mode 100644 Library/Homebrew/sorbet/custom_generators/tty.rb create mode 100644 Library/Homebrew/sorbet/rbi/dsl/tty.rbi create mode 100644 Library/Homebrew/sorbet/tapioca/compilers/tty.rb delete mode 100644 Library/Homebrew/utils/tty.rbi diff --git a/Library/Homebrew/dev-cmd/typecheck.rb b/Library/Homebrew/dev-cmd/typecheck.rb index 4789caa7df..0072ddf8c4 100644 --- a/Library/Homebrew/dev-cmd/typecheck.rb +++ b/Library/Homebrew/dev-cmd/typecheck.rb @@ -51,7 +51,6 @@ module Homebrew tapioca_args = args.update_all? ? ["--all"] : [] ohai "Updating homegrown RBI files..." - safe_system "bundle", "exec", "ruby", "sorbet/custom_generators/tty.rb" safe_system "bundle", "exec", "ruby", "sorbet/custom_generators/env_config.rb" ohai "Updating Tapioca RBI files..." diff --git a/Library/Homebrew/sorbet/custom_generators/tty.rb b/Library/Homebrew/sorbet/custom_generators/tty.rb deleted file mode 100644 index 3cab79d2d2..0000000000 --- a/Library/Homebrew/sorbet/custom_generators/tty.rb +++ /dev/null @@ -1,31 +0,0 @@ -# typed: true -# frozen_string_literal: true - -require_relative "../../global" -require_relative "../../env_config" -require_relative "../../utils/tty" - -File.open("#{File.dirname(__FILE__)}/../../utils/tty.rbi", "w") do |file| - file.write(<<~RUBY) - # typed: strict - - module Tty - RUBY - - dynamic_methods = Tty::COLOR_CODES.keys + Tty::STYLE_CODES.keys + Tty::SPECIAL_CODES.keys - methods = Tty.methods(false).sort.select { |method| dynamic_methods.include?(method) } - - methods.each do |method| - return_type = (method.to_s.end_with?("?") ? T::Boolean : String) - signature = "sig { returns(#{return_type}) }" - - file.write(<<-RUBY) - #{signature} - def self.#{method}; end - RUBY - - file.write("\n") if methods.last != method - end - - file.write("end\n") -end diff --git a/Library/Homebrew/sorbet/rbi/dsl/tty.rbi b/Library/Homebrew/sorbet/rbi/dsl/tty.rbi new file mode 100644 index 0000000000..84b763a6d5 --- /dev/null +++ b/Library/Homebrew/sorbet/rbi/dsl/tty.rbi @@ -0,0 +1,64 @@ +# typed: true + +# DO NOT EDIT MANUALLY +# This is an autogenerated file for dynamic methods in `Tty`. +# Please instead update this file by running `bin/tapioca dsl Tty`. + +module + sig { returns(String) } + def blue; end + + sig { returns(String) } + def bold; end + + sig { returns(String) } + def cyan; end + + sig { returns(String) } + def default; end + + sig { returns(String) } + def down; end + + sig { returns(String) } + def erase_char; end + + sig { returns(String) } + def erase_line; end + + sig { returns(String) } + def green; end + + sig { returns(String) } + def italic; end + + sig { returns(String) } + def left; end + + sig { returns(String) } + def magenta; end + + sig { returns(String) } + def no_underline; end + + sig { returns(String) } + def red; end + + sig { returns(String) } + def reset; end + + sig { returns(String) } + def right; end + + sig { returns(String) } + def strikethrough; end + + sig { returns(String) } + def underline; end + + sig { returns(String) } + def up; end + + sig { returns(String) } + def yellow; end +end diff --git a/Library/Homebrew/sorbet/tapioca/compilers/tty.rb b/Library/Homebrew/sorbet/tapioca/compilers/tty.rb new file mode 100644 index 0000000000..73239a5b05 --- /dev/null +++ b/Library/Homebrew/sorbet/tapioca/compilers/tty.rb @@ -0,0 +1,31 @@ +# typed: strict +# frozen_string_literal: true + +require_relative "../../../global" +require_relative "../../../utils/tty" + +module Tapioca + module Compilers + class Tty < Tapioca::Dsl::Compiler + ConstantType = type_member { { fixed: Module } } + + sig { override.returns(T::Enumerable[Module]) } + def self.gather_constants + [::Tty] + end + + sig { override.void } + def decorate + root.create_path(constant) do |klass| + dynamic_methods = ::Tty::COLOR_CODES.keys + ::Tty::STYLE_CODES.keys + ::Tty::SPECIAL_CODES.keys + methods = ::Tty.methods(false).sort.select { |method| dynamic_methods.include?(method) } + + methods.each do |method| + return_type = (method.to_s.end_with?("?") ? "T::Boolean" : "String") + klass.create_method(method.to_s, return_type:) + end + end + end + end + end +end diff --git a/Library/Homebrew/utils/tty.rbi b/Library/Homebrew/utils/tty.rbi deleted file mode 100644 index b92c259d6d..0000000000 --- a/Library/Homebrew/utils/tty.rbi +++ /dev/null @@ -1,60 +0,0 @@ -# typed: strict - -module Tty - sig { returns(String) } - def self.blue; end - - sig { returns(String) } - def self.bold; end - - sig { returns(String) } - def self.cyan; end - - sig { returns(String) } - def self.default; end - - sig { returns(String) } - def self.down; end - - sig { returns(String) } - def self.erase_char; end - - sig { returns(String) } - def self.erase_line; end - - sig { returns(String) } - def self.green; end - - sig { returns(String) } - def self.italic; end - - sig { returns(String) } - def self.left; end - - sig { returns(String) } - def self.magenta; end - - sig { returns(String) } - def self.no_underline; end - - sig { returns(String) } - def self.red; end - - sig { returns(String) } - def self.reset; end - - sig { returns(String) } - def self.right; end - - sig { returns(String) } - def self.strikethrough; end - - sig { returns(String) } - def self.underline; end - - sig { returns(String) } - def self.up; end - - sig { returns(String) } - def self.yellow; end -end