sorbet: Autogenerate the RBI file for utils/tty.rb

- Sort of. It's not via Parlour, because I read the docs and all it says
  about dynamically generating things is "of course it's better to do
  that", no examples. I tried my best, but Bo's work on `attr.rb` was
  mind-boggling.
- Instead, let's add a simple but functional generator script that I
  actually understand, as an alternative to maintaining these RBI files
  for dynamic methods manually, so that we can get rid of some use of
  `srb rbi hidden-definitions` since that's deprecated.
- TODO: Run this script as part of `brew typecheck --update` so it gets
  updated with all the other RBI files periodically.
- Follow up to PR 14651.
This commit is contained in:
Issy Long 2023-03-05 23:57:56 +00:00
parent 19a696fc8f
commit 1295904986
No known key found for this signature in database
GPG Key ID: 8247C390DADC67D4
4 changed files with 120 additions and 70 deletions

View File

@ -0,0 +1,30 @@
# typed: true
# frozen_string_literal: true
require_relative "../../utils/tty"
File.open("#{File.dirname(__FILE__)}/../../utils/tty.rbi", "w") do |file|
file.write(<<~RUBY)
# typed: strict
# frozen_string_literal: true
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") unless methods.last == method
end
file.write("end\n")
end

View File

@ -8488,46 +8488,6 @@ class TracePoint
def parameters(); end def parameters(); end
end end
module Tty
def self.blue(); end
def self.bold(); end
def self.cyan(); end
def self.default(); end
def self.down(); end
def self.erase_char(); end
def self.erase_line(); end
def self.green(); end
def self.italic(); end
def self.left(); end
def self.magenta(); end
def self.no_underline(); end
def self.red(); end
def self.reset(); end
def self.right(); end
def self.strikethrough(); end
def self.underline(); end
def self.up(); end
def self.yellow(); end
end
module URI module URI
include ::URI::RFC2396_REGEXP include ::URI::RFC2396_REGEXP
end end

View File

@ -9,6 +9,36 @@ require "env_config"
module Tty module Tty
@stream = $stdout @stream = $stdout
COLOR_CODES = {
red: 31,
green: 32,
yellow: 33,
blue: 34,
magenta: 35,
cyan: 36,
default: 39,
}.freeze
STYLE_CODES = {
reset: 0,
bold: 1,
italic: 3,
underline: 4,
strikethrough: 9,
no_underline: 24,
}.freeze
SPECIAL_CODES = {
up: "1A",
down: "1B",
right: "1C",
left: "1D",
erase_line: "K",
erase_char: "P",
}.freeze
CODES = COLOR_CODES.merge(STYLE_CODES).freeze
class << self class << self
extend T::Sig extend T::Sig
@ -42,36 +72,6 @@ module Tty
(w = width).zero? ? string.to_s : (string.to_s[0, w - 4] || "") (w = width).zero? ? string.to_s : (string.to_s[0, w - 4] || "")
end end
COLOR_CODES = {
red: 31,
green: 32,
yellow: 33,
blue: 34,
magenta: 35,
cyan: 36,
default: 39,
}.freeze
STYLE_CODES = {
reset: 0,
bold: 1,
italic: 3,
underline: 4,
strikethrough: 9,
no_underline: 24,
}.freeze
SPECIAL_CODES = {
up: "1A",
down: "1B",
right: "1C",
left: "1D",
erase_line: "K",
erase_char: "P",
}.freeze
CODES = COLOR_CODES.merge(STYLE_CODES).freeze
sig { returns(String) } sig { returns(String) }
def current_escape_sequence def current_escape_sequence
return "" if @escape_sequence.nil? return "" if @escape_sequence.nil?

View File

@ -0,0 +1,60 @@
# 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