Add type signatures for Pathname extensions.
This commit is contained in:
parent
650ec514c1
commit
580d915cb4
@ -1,4 +1,4 @@
|
|||||||
# typed: false
|
# typed: true
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "resource"
|
require "resource"
|
||||||
@ -7,15 +7,17 @@ require "metafiles"
|
|||||||
module DiskUsageExtension
|
module DiskUsageExtension
|
||||||
extend T::Sig
|
extend T::Sig
|
||||||
|
|
||||||
|
sig { returns(Integer) }
|
||||||
def disk_usage
|
def disk_usage
|
||||||
return @disk_usage if @disk_usage
|
return @disk_usage if defined?(@disk_usage)
|
||||||
|
|
||||||
compute_disk_usage
|
compute_disk_usage
|
||||||
@disk_usage
|
@disk_usage
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(Integer) }
|
||||||
def file_count
|
def file_count
|
||||||
return @file_count if @file_count
|
return @file_count if defined?(@file_count)
|
||||||
|
|
||||||
compute_disk_usage
|
compute_disk_usage
|
||||||
@file_count
|
@file_count
|
||||||
@ -32,6 +34,7 @@ module DiskUsageExtension
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
sig { void }
|
||||||
def compute_disk_usage
|
def compute_disk_usage
|
||||||
if symlink? && !exist?
|
if symlink? && !exist?
|
||||||
@file_count = 1
|
@file_count = 1
|
||||||
@ -82,6 +85,12 @@ class Pathname
|
|||||||
BOTTLE_EXTNAME_RX = /(\.[a-z0-9_]+\.bottle\.(\d+\.)?tar\.gz)$/.freeze
|
BOTTLE_EXTNAME_RX = /(\.[a-z0-9_]+\.bottle\.(\d+\.)?tar\.gz)$/.freeze
|
||||||
|
|
||||||
# Moves a file from the original location to the {Pathname}'s.
|
# Moves a file from the original location to the {Pathname}'s.
|
||||||
|
sig do
|
||||||
|
params(sources: T.any(
|
||||||
|
Resource, Resource::Partial, String, Pathname,
|
||||||
|
T::Array[T.any(String, Pathname)], T::Hash[T.any(String, Pathname), String]
|
||||||
|
)).void
|
||||||
|
end
|
||||||
def install(*sources)
|
def install(*sources)
|
||||||
sources.each do |src|
|
sources.each do |src|
|
||||||
case src
|
case src
|
||||||
@ -107,6 +116,7 @@ class Pathname
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { params(src: T.any(String, Pathname), new_basename: String).void }
|
||||||
def install_p(src, new_basename)
|
def install_p(src, new_basename)
|
||||||
raise Errno::ENOENT, src.to_s unless File.symlink?(src) || File.exist?(src)
|
raise Errno::ENOENT, src.to_s unless File.symlink?(src) || File.exist?(src)
|
||||||
|
|
||||||
@ -130,6 +140,11 @@ class Pathname
|
|||||||
private :install_p
|
private :install_p
|
||||||
|
|
||||||
# Creates symlinks to sources in this folder.
|
# Creates symlinks to sources in this folder.
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
sources: T.any(String, Pathname, T::Array[T.any(String, Pathname)], T::Hash[T.any(String, Pathname), String]),
|
||||||
|
).void
|
||||||
|
end
|
||||||
def install_symlink(*sources)
|
def install_symlink(*sources)
|
||||||
sources.each do |src|
|
sources.each do |src|
|
||||||
case src
|
case src
|
||||||
@ -156,21 +171,25 @@ class Pathname
|
|||||||
alias old_write write
|
alias old_write write
|
||||||
|
|
||||||
# We assume this pathname object is a file, obviously.
|
# We assume this pathname object is a file, obviously.
|
||||||
def write(content, *open_args)
|
sig { params(content: String, offset: Integer, open_args: T::Hash[Symbol, T.untyped]).returns(Integer) }
|
||||||
|
def write(content, offset = 0, open_args = {})
|
||||||
raise "Will not overwrite #{self}" if exist?
|
raise "Will not overwrite #{self}" if exist?
|
||||||
|
|
||||||
dirname.mkpath
|
dirname.mkpath
|
||||||
open("w", *open_args) { |f| f.write(content) }
|
|
||||||
|
old_write(content, offset, open_args)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Only appends to a file that is already created.
|
# Only appends to a file that is already created.
|
||||||
def append_lines(content, *open_args)
|
sig { params(content: String, open_args: T.untyped).void }
|
||||||
|
def append_lines(content, **open_args)
|
||||||
raise "Cannot append file that doesn't exist: #{self}" unless exist?
|
raise "Cannot append file that doesn't exist: #{self}" unless exist?
|
||||||
|
|
||||||
open("a", *open_args) { |f| f.puts(content) }
|
T.unsafe(self).open("a", **open_args) { |f| f.puts(content) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# @note This always overwrites.
|
# @note This always overwrites.
|
||||||
|
sig { params(content: String).void }
|
||||||
def atomic_write(content)
|
def atomic_write(content)
|
||||||
old_stat = stat if exist?
|
old_stat = stat if exist?
|
||||||
File.atomic_write(self) do |file|
|
File.atomic_write(self) do |file|
|
||||||
@ -220,8 +239,9 @@ class Pathname
|
|||||||
alias extname_old extname
|
alias extname_old extname
|
||||||
|
|
||||||
# Extended to support common double extensions.
|
# Extended to support common double extensions.
|
||||||
def extname(path = to_s)
|
sig { returns(String) }
|
||||||
basename = File.basename(path)
|
def extname
|
||||||
|
basename = File.basename(self)
|
||||||
|
|
||||||
bottle_ext = basename[BOTTLE_EXTNAME_RX, 1]
|
bottle_ext = basename[BOTTLE_EXTNAME_RX, 1]
|
||||||
return bottle_ext if bottle_ext
|
return bottle_ext if bottle_ext
|
||||||
@ -236,14 +256,16 @@ class Pathname
|
|||||||
end
|
end
|
||||||
|
|
||||||
# For filetypes we support, returns basename without extension.
|
# For filetypes we support, returns basename without extension.
|
||||||
|
sig { returns(String) }
|
||||||
def stem
|
def stem
|
||||||
File.basename((path = to_s), extname(path))
|
File.basename(self, extname)
|
||||||
end
|
end
|
||||||
|
|
||||||
# I don't trust the children.length == 0 check particularly, not to mention
|
# I don't trust the children.length == 0 check particularly, not to mention
|
||||||
# it is slow to enumerate the whole directory just to see if it is empty,
|
# it is slow to enumerate the whole directory just to see if it is empty,
|
||||||
# instead rely on good ol' libc and the filesystem
|
# instead rely on good ol' libc and the filesystem
|
||||||
# @private
|
# @private
|
||||||
|
sig { returns(T::Boolean) }
|
||||||
def rmdir_if_possible
|
def rmdir_if_possible
|
||||||
rmdir
|
rmdir
|
||||||
true
|
true
|
||||||
@ -259,21 +281,25 @@ class Pathname
|
|||||||
end
|
end
|
||||||
|
|
||||||
# @private
|
# @private
|
||||||
|
sig { returns(Version) }
|
||||||
def version
|
def version
|
||||||
require "version"
|
require "version"
|
||||||
Version.parse(basename)
|
Version.parse(basename)
|
||||||
end
|
end
|
||||||
|
|
||||||
# @private
|
# @private
|
||||||
|
sig { returns(T::Boolean) }
|
||||||
def text_executable?
|
def text_executable?
|
||||||
/^#!\s*\S+/ =~ open("r") { |f| f.read(1024) }
|
/^#!\s*\S+/.match?(open("r") { |f| f.read(1024) })
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
def sha256
|
def sha256
|
||||||
require "digest/sha2"
|
require "digest/sha2"
|
||||||
Digest::SHA256.file(self).hexdigest
|
Digest::SHA256.file(self).hexdigest
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { params(expected: T.nilable(Checksum)).void }
|
||||||
def verify_checksum(expected)
|
def verify_checksum(expected)
|
||||||
raise ChecksumMissingError if expected.nil? || expected.empty?
|
raise ChecksumMissingError if expected.nil? || expected.empty?
|
||||||
|
|
||||||
@ -283,7 +309,12 @@ class Pathname
|
|||||||
|
|
||||||
alias to_str to_s
|
alias to_str to_s
|
||||||
|
|
||||||
def cd
|
sig do
|
||||||
|
type_parameters(:U).params(
|
||||||
|
_block: T.proc.params(path: Pathname).returns(T.type_parameter(:U)),
|
||||||
|
).returns(T.type_parameter(:U))
|
||||||
|
end
|
||||||
|
def cd(&_block)
|
||||||
Dir.chdir(self) { yield self }
|
Dir.chdir(self) { yield self }
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -382,6 +413,14 @@ class Pathname
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Writes an exec script that invokes a Java jar.
|
# Writes an exec script that invokes a Java jar.
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
target_jar: T.any(String, Pathname),
|
||||||
|
script_name: T.any(String, Pathname),
|
||||||
|
java_opts: String,
|
||||||
|
java_version: T.nilable(String),
|
||||||
|
).returns(Integer)
|
||||||
|
end
|
||||||
def write_jar_script(target_jar, script_name, java_opts = "", java_version: nil)
|
def write_jar_script(target_jar, script_name, java_opts = "", java_version: nil)
|
||||||
(self/script_name).write <<~EOS
|
(self/script_name).write <<~EOS
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
@ -431,11 +470,14 @@ require "extend/os/pathname"
|
|||||||
|
|
||||||
# @private
|
# @private
|
||||||
module ObserverPathnameExtension
|
module ObserverPathnameExtension
|
||||||
|
extend T::Sig
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
extend T::Sig
|
extend T::Sig
|
||||||
|
|
||||||
include Context
|
include Context
|
||||||
|
|
||||||
|
sig { returns(Integer) }
|
||||||
attr_accessor :n, :d
|
attr_accessor :n, :d
|
||||||
|
|
||||||
sig { void }
|
sig { void }
|
||||||
@ -444,16 +486,21 @@ module ObserverPathnameExtension
|
|||||||
@put_verbose_trimmed_warning = false
|
@put_verbose_trimmed_warning = false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns(Integer) }
|
||||||
def total
|
def total
|
||||||
n + d
|
n + d
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { returns([Integer, Integer]) }
|
||||||
|
|
||||||
def counts
|
def counts
|
||||||
[n, d]
|
[n, d]
|
||||||
end
|
end
|
||||||
|
|
||||||
MAXIMUM_VERBOSE_OUTPUT = 100
|
MAXIMUM_VERBOSE_OUTPUT = 100
|
||||||
|
private_constant :MAXIMUM_VERBOSE_OUTPUT
|
||||||
|
|
||||||
|
sig { returns(T::Boolean) }
|
||||||
def verbose?
|
def verbose?
|
||||||
return super unless ENV["CI"]
|
return super unless ENV["CI"]
|
||||||
return false unless super
|
return false unless super
|
||||||
@ -470,34 +517,40 @@ module ObserverPathnameExtension
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { void }
|
||||||
def unlink
|
def unlink
|
||||||
super
|
super
|
||||||
puts "rm #{self}" if ObserverPathnameExtension.verbose?
|
puts "rm #{self}" if ObserverPathnameExtension.verbose?
|
||||||
ObserverPathnameExtension.n += 1
|
ObserverPathnameExtension.n += 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { void }
|
||||||
def mkpath
|
def mkpath
|
||||||
super
|
super
|
||||||
puts "mkdir -p #{self}" if ObserverPathnameExtension.verbose?
|
puts "mkdir -p #{self}" if ObserverPathnameExtension.verbose?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { void }
|
||||||
def rmdir
|
def rmdir
|
||||||
super
|
super
|
||||||
puts "rmdir #{self}" if ObserverPathnameExtension.verbose?
|
puts "rmdir #{self}" if ObserverPathnameExtension.verbose?
|
||||||
ObserverPathnameExtension.d += 1
|
ObserverPathnameExtension.d += 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { params(src: Pathname).void }
|
||||||
def make_relative_symlink(src)
|
def make_relative_symlink(src)
|
||||||
super
|
super
|
||||||
puts "ln -s #{src.relative_path_from(dirname)} #{basename}" if ObserverPathnameExtension.verbose?
|
puts "ln -s #{src.relative_path_from(dirname)} #{basename}" if ObserverPathnameExtension.verbose?
|
||||||
ObserverPathnameExtension.n += 1
|
ObserverPathnameExtension.n += 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { void }
|
||||||
def install_info
|
def install_info
|
||||||
super
|
super
|
||||||
puts "info #{self}" if ObserverPathnameExtension.verbose?
|
puts "info #{self}" if ObserverPathnameExtension.verbose?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sig { void }
|
||||||
def uninstall_info
|
def uninstall_info
|
||||||
super
|
super
|
||||||
puts "uninfo #{self}" if ObserverPathnameExtension.verbose?
|
puts "uninfo #{self}" if ObserverPathnameExtension.verbose?
|
||||||
|
|||||||
19
Library/Homebrew/extend/pathname.rbi
Normal file
19
Library/Homebrew/extend/pathname.rbi
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# typed: strict
|
||||||
|
|
||||||
|
module DiskUsageExtension
|
||||||
|
include Kernel
|
||||||
|
|
||||||
|
def exist?; end
|
||||||
|
|
||||||
|
def symlink?; end
|
||||||
|
|
||||||
|
def resolved_path; end
|
||||||
|
end
|
||||||
|
|
||||||
|
module ObserverPathnameExtension
|
||||||
|
include Kernel
|
||||||
|
|
||||||
|
def dirname; end
|
||||||
|
|
||||||
|
def basename; end
|
||||||
|
end
|
||||||
@ -16,6 +16,18 @@ class IO
|
|||||||
def self.open(fd, mode='r', opt=nil, &blk); end
|
def self.open(fd, mode='r', opt=nil, &blk); end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class Pathname
|
||||||
|
# https://github.com/sorbet/sorbet/pull/3729
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
owner: T.nilable(Integer),
|
||||||
|
group: T.nilable(Integer),
|
||||||
|
)
|
||||||
|
.returns(Integer)
|
||||||
|
end
|
||||||
|
def chown(owner, group); end
|
||||||
|
end
|
||||||
|
|
||||||
module FileUtils
|
module FileUtils
|
||||||
# https://github.com/sorbet/sorbet/pull/3730
|
# https://github.com/sorbet/sorbet/pull/3730
|
||||||
module_function
|
module_function
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user