rbs 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (132) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +28 -0
  3. data/.gitignore +12 -0
  4. data/.rubocop.yml +15 -0
  5. data/BSDL +22 -0
  6. data/CHANGELOG.md +9 -0
  7. data/COPYING +56 -0
  8. data/Gemfile +6 -0
  9. data/README.md +93 -0
  10. data/Rakefile +142 -0
  11. data/bin/annotate-with-rdoc +157 -0
  12. data/bin/console +14 -0
  13. data/bin/query-rdoc +103 -0
  14. data/bin/setup +10 -0
  15. data/bin/sort +89 -0
  16. data/bin/test_runner.rb +16 -0
  17. data/docs/CONTRIBUTING.md +97 -0
  18. data/docs/sigs.md +148 -0
  19. data/docs/stdlib.md +152 -0
  20. data/docs/syntax.md +528 -0
  21. data/exe/rbs +7 -0
  22. data/lib/rbs.rb +64 -0
  23. data/lib/rbs/ast/annotation.rb +27 -0
  24. data/lib/rbs/ast/comment.rb +27 -0
  25. data/lib/rbs/ast/declarations.rb +395 -0
  26. data/lib/rbs/ast/members.rb +362 -0
  27. data/lib/rbs/buffer.rb +50 -0
  28. data/lib/rbs/builtin_names.rb +55 -0
  29. data/lib/rbs/cli.rb +558 -0
  30. data/lib/rbs/constant.rb +26 -0
  31. data/lib/rbs/constant_table.rb +150 -0
  32. data/lib/rbs/definition.rb +170 -0
  33. data/lib/rbs/definition_builder.rb +919 -0
  34. data/lib/rbs/environment.rb +281 -0
  35. data/lib/rbs/environment_loader.rb +136 -0
  36. data/lib/rbs/environment_walker.rb +124 -0
  37. data/lib/rbs/errors.rb +187 -0
  38. data/lib/rbs/location.rb +102 -0
  39. data/lib/rbs/method_type.rb +123 -0
  40. data/lib/rbs/namespace.rb +91 -0
  41. data/lib/rbs/parser.y +1344 -0
  42. data/lib/rbs/prototype/rb.rb +553 -0
  43. data/lib/rbs/prototype/rbi.rb +587 -0
  44. data/lib/rbs/prototype/runtime.rb +381 -0
  45. data/lib/rbs/substitution.rb +46 -0
  46. data/lib/rbs/test.rb +26 -0
  47. data/lib/rbs/test/errors.rb +61 -0
  48. data/lib/rbs/test/hook.rb +294 -0
  49. data/lib/rbs/test/setup.rb +58 -0
  50. data/lib/rbs/test/spy.rb +325 -0
  51. data/lib/rbs/test/test_helper.rb +183 -0
  52. data/lib/rbs/test/type_check.rb +254 -0
  53. data/lib/rbs/type_name.rb +70 -0
  54. data/lib/rbs/types.rb +936 -0
  55. data/lib/rbs/variance_calculator.rb +138 -0
  56. data/lib/rbs/vendorer.rb +47 -0
  57. data/lib/rbs/version.rb +3 -0
  58. data/lib/rbs/writer.rb +269 -0
  59. data/lib/ruby/signature.rb +7 -0
  60. data/rbs.gemspec +46 -0
  61. data/stdlib/abbrev/abbrev.rbs +60 -0
  62. data/stdlib/base64/base64.rbs +71 -0
  63. data/stdlib/benchmark/benchmark.rbs +372 -0
  64. data/stdlib/builtin/array.rbs +1997 -0
  65. data/stdlib/builtin/basic_object.rbs +280 -0
  66. data/stdlib/builtin/binding.rbs +177 -0
  67. data/stdlib/builtin/builtin.rbs +45 -0
  68. data/stdlib/builtin/class.rbs +145 -0
  69. data/stdlib/builtin/comparable.rbs +116 -0
  70. data/stdlib/builtin/complex.rbs +400 -0
  71. data/stdlib/builtin/constants.rbs +37 -0
  72. data/stdlib/builtin/data.rbs +5 -0
  73. data/stdlib/builtin/deprecated.rbs +2 -0
  74. data/stdlib/builtin/dir.rbs +413 -0
  75. data/stdlib/builtin/encoding.rbs +607 -0
  76. data/stdlib/builtin/enumerable.rbs +404 -0
  77. data/stdlib/builtin/enumerator.rbs +260 -0
  78. data/stdlib/builtin/errno.rbs +781 -0
  79. data/stdlib/builtin/errors.rbs +582 -0
  80. data/stdlib/builtin/exception.rbs +194 -0
  81. data/stdlib/builtin/false_class.rbs +40 -0
  82. data/stdlib/builtin/fiber.rbs +68 -0
  83. data/stdlib/builtin/fiber_error.rbs +12 -0
  84. data/stdlib/builtin/file.rbs +1076 -0
  85. data/stdlib/builtin/file_test.rbs +59 -0
  86. data/stdlib/builtin/float.rbs +696 -0
  87. data/stdlib/builtin/gc.rbs +243 -0
  88. data/stdlib/builtin/hash.rbs +1029 -0
  89. data/stdlib/builtin/integer.rbs +707 -0
  90. data/stdlib/builtin/io.rbs +683 -0
  91. data/stdlib/builtin/kernel.rbs +576 -0
  92. data/stdlib/builtin/marshal.rbs +161 -0
  93. data/stdlib/builtin/match_data.rbs +271 -0
  94. data/stdlib/builtin/math.rbs +369 -0
  95. data/stdlib/builtin/method.rbs +185 -0
  96. data/stdlib/builtin/module.rbs +1104 -0
  97. data/stdlib/builtin/nil_class.rbs +82 -0
  98. data/stdlib/builtin/numeric.rbs +409 -0
  99. data/stdlib/builtin/object.rbs +824 -0
  100. data/stdlib/builtin/proc.rbs +429 -0
  101. data/stdlib/builtin/process.rbs +1227 -0
  102. data/stdlib/builtin/random.rbs +267 -0
  103. data/stdlib/builtin/range.rbs +226 -0
  104. data/stdlib/builtin/rational.rbs +424 -0
  105. data/stdlib/builtin/rb_config.rbs +57 -0
  106. data/stdlib/builtin/regexp.rbs +1083 -0
  107. data/stdlib/builtin/ruby_vm.rbs +14 -0
  108. data/stdlib/builtin/signal.rbs +55 -0
  109. data/stdlib/builtin/string.rbs +1901 -0
  110. data/stdlib/builtin/string_io.rbs +284 -0
  111. data/stdlib/builtin/struct.rbs +40 -0
  112. data/stdlib/builtin/symbol.rbs +228 -0
  113. data/stdlib/builtin/thread.rbs +1108 -0
  114. data/stdlib/builtin/thread_group.rbs +23 -0
  115. data/stdlib/builtin/time.rbs +1047 -0
  116. data/stdlib/builtin/trace_point.rbs +290 -0
  117. data/stdlib/builtin/true_class.rbs +46 -0
  118. data/stdlib/builtin/unbound_method.rbs +153 -0
  119. data/stdlib/builtin/warning.rbs +17 -0
  120. data/stdlib/coverage/coverage.rbs +62 -0
  121. data/stdlib/csv/csv.rbs +773 -0
  122. data/stdlib/erb/erb.rbs +392 -0
  123. data/stdlib/find/find.rbs +40 -0
  124. data/stdlib/ipaddr/ipaddr.rbs +247 -0
  125. data/stdlib/json/json.rbs +335 -0
  126. data/stdlib/pathname/pathname.rbs +1093 -0
  127. data/stdlib/prime/integer-extension.rbs +23 -0
  128. data/stdlib/prime/prime.rbs +188 -0
  129. data/stdlib/securerandom/securerandom.rbs +9 -0
  130. data/stdlib/set/set.rbs +301 -0
  131. data/stdlib/tmpdir/tmpdir.rbs +53 -0
  132. metadata +292 -0
@@ -0,0 +1,194 @@
1
+ # Descendants of class [Exception](Exception) are used
2
+ # to communicate between
3
+ # [Kernel\#raise](https://ruby-doc.org/core-2.6.3/Kernel.html#method-i-raise)
4
+ # and `rescue` statements in `begin ... end` blocks.
5
+ # [Exception](Exception) objects carry information
6
+ # about the exception – its type (the exception’s class name), an optional
7
+ # descriptive string, and optional traceback information.
8
+ # [Exception](Exception) subclasses may add additional
9
+ # information like
10
+ # [NameError\#name](https://ruby-doc.org/core-2.6.3/NameError.html#method-i-name)
11
+ # .
12
+ #
13
+ # Programs may make subclasses of
14
+ # [Exception](Exception), typically of
15
+ # [StandardError](https://ruby-doc.org/core-2.6.3/StandardError.html) or
16
+ # [RuntimeError](https://ruby-doc.org/core-2.6.3/RuntimeError.html), to
17
+ # provide custom classes and add additional information. See the subclass
18
+ # list below for defaults for `raise` and `rescue` .
19
+ #
20
+ # When an exception has been raised but not yet handled (in `rescue`,
21
+ # `ensure`, `at_exit` and `END` blocks) the global variable `$!` will
22
+ # contain the current exception and `$@` contains the current exception’s
23
+ # backtrace.
24
+ #
25
+ # It is recommended that a library should have one subclass of
26
+ # [StandardError](https://ruby-doc.org/core-2.6.3/StandardError.html) or
27
+ # [RuntimeError](https://ruby-doc.org/core-2.6.3/RuntimeError.html) and
28
+ # have specific exception types inherit from it. This allows the user to
29
+ # rescue a generic exception type to catch all exceptions the library may
30
+ # raise even if future versions of the library add new exception
31
+ # subclasses.
32
+ #
33
+ # For example:
34
+ #
35
+ # ```ruby
36
+ # class MyLibrary
37
+ # class Error < RuntimeError
38
+ # end
39
+ #
40
+ # class WidgetError < Error
41
+ # end
42
+ #
43
+ # class FrobError < Error
44
+ # end
45
+ #
46
+ # end
47
+ # ```
48
+ #
49
+ # To handle both WidgetError and FrobError the library user can rescue
50
+ # MyLibrary::Error.
51
+ #
52
+ # The built-in subclasses of [Exception](Exception)
53
+ # are:
54
+ #
55
+ # - [NoMemoryError](https://ruby-doc.org/core-2.6.3/NoMemoryError.html)
56
+ #
57
+ # - [ScriptError](https://ruby-doc.org/core-2.6.3/ScriptError.html)
58
+ #
59
+ # - [LoadError](https://ruby-doc.org/core-2.6.3/LoadError.html)
60
+ #
61
+ # - [NotImplementedError](https://ruby-doc.org/core-2.6.3/NotImplementedError.html)
62
+ #
63
+ # - [SyntaxError](https://ruby-doc.org/core-2.6.3/SyntaxError.html)
64
+ #
65
+ # - [SecurityError](https://ruby-doc.org/core-2.6.3/SecurityError.html)
66
+ #
67
+ # - [SignalException](https://ruby-doc.org/core-2.6.3/SignalException.html)
68
+ #
69
+ # - [Interrupt](https://ruby-doc.org/core-2.6.3/Interrupt.html)
70
+ #
71
+ # - [StandardError](https://ruby-doc.org/core-2.6.3/StandardError.html)
72
+ # -- default for `rescue`
73
+ #
74
+ # - [ArgumentError](https://ruby-doc.org/core-2.6.3/ArgumentError.html)
75
+ #
76
+ # - [UncaughtThrowError](https://ruby-doc.org/core-2.6.3/UncaughtThrowError.html)
77
+ #
78
+ # - [EncodingError](https://ruby-doc.org/core-2.6.3/EncodingError.html)
79
+ #
80
+ # - [FiberError](https://ruby-doc.org/core-2.6.3/FiberError.html)
81
+ #
82
+ # - [IOError](https://ruby-doc.org/core-2.6.3/IOError.html)
83
+ #
84
+ # - [EOFError](https://ruby-doc.org/core-2.6.3/EOFError.html)
85
+ #
86
+ # - [IndexError](https://ruby-doc.org/core-2.6.3/IndexError.html)
87
+ #
88
+ # - [KeyError](https://ruby-doc.org/core-2.6.3/KeyError.html)
89
+ #
90
+ # - [StopIteration](https://ruby-doc.org/core-2.6.3/StopIteration.html)
91
+ #
92
+ # - [LocalJumpError](https://ruby-doc.org/core-2.6.3/LocalJumpError.html)
93
+ #
94
+ # - [NameError](https://ruby-doc.org/core-2.6.3/NameError.html)
95
+ #
96
+ # - [NoMethodError](https://ruby-doc.org/core-2.6.3/NoMethodError.html)
97
+ #
98
+ # - [RangeError](https://ruby-doc.org/core-2.6.3/RangeError.html)
99
+ #
100
+ # - [FloatDomainError](https://ruby-doc.org/core-2.6.3/FloatDomainError.html)
101
+ #
102
+ # - [RegexpError](https://ruby-doc.org/core-2.6.3/RegexpError.html)
103
+ #
104
+ # - [RuntimeError](https://ruby-doc.org/core-2.6.3/RuntimeError.html)
105
+ # -- default for `raise`
106
+ #
107
+ # - [FrozenError](https://ruby-doc.org/core-2.6.3/FrozenError.html)
108
+ #
109
+ # - [SystemCallError](https://ruby-doc.org/core-2.6.3/SystemCallError.html)
110
+ #
111
+ # - Errno::\*
112
+ #
113
+ # - [ThreadError](https://ruby-doc.org/core-2.6.3/ThreadError.html)
114
+ #
115
+ # - [TypeError](https://ruby-doc.org/core-2.6.3/TypeError.html)
116
+ #
117
+ # - [ZeroDivisionError](https://ruby-doc.org/core-2.6.3/ZeroDivisionError.html)
118
+ #
119
+ # - [SystemExit](https://ruby-doc.org/core-2.6.3/SystemExit.html)
120
+ #
121
+ # - [SystemStackError](https://ruby-doc.org/core-2.6.3/SystemStackError.html)
122
+ #
123
+ # - fatal – impossible to rescue
124
+ class Exception < Object
125
+ def self.to_tty?: () -> bool
126
+
127
+ def self.exception: (?String msg) -> Exception
128
+
129
+ def ==: (untyped arg0) -> bool
130
+
131
+ # Returns any backtrace associated with the exception. The backtrace is an
132
+ # array of strings, each containing either “filename:lineNo: in \`method”‘
133
+ # or “filename:lineNo.”
134
+ #
135
+ # ```ruby
136
+ # def a
137
+ # raise "boom"
138
+ # end
139
+ #
140
+ # def b
141
+ # a()
142
+ # end
143
+ #
144
+ # begin
145
+ # b()
146
+ # rescue => detail
147
+ # print detail.backtrace.join("\n")
148
+ # end
149
+ # ```
150
+ #
151
+ # *produces:*
152
+ #
153
+ # prog.rb:2:in `a'
154
+ # prog.rb:6:in `b'
155
+ # prog.rb:10
156
+ def backtrace: () -> ::Array[String]?
157
+
158
+ # Returns any backtrace associated with the exception. This method is
159
+ # similar to
160
+ # [\#backtrace](Exception.downloaded.ruby_doc#method-i-backtrace), but
161
+ # the backtrace is an array of
162
+ # [Thread::Backtrace::Location](https://ruby-doc.org/core-2.6.3/Thread/Backtrace/Location.html)
163
+ # .
164
+ #
165
+ # Now, this method is not affected by
166
+ # [\#set\_backtrace](Exception.downloaded.ruby_doc#method-i-set_backtrace)
167
+ # .
168
+ def backtrace_locations: () -> ::Array[Thread::Backtrace::Location]?
169
+
170
+ # Returns the previous exception ($\!) at the time this exception was
171
+ # raised. This is useful for wrapping exceptions and retaining the
172
+ # original exception information.
173
+ def cause: () -> Exception?
174
+
175
+ def exception: () -> self
176
+ | (String arg0) -> Exception
177
+
178
+ def initialize: (?String arg0) -> void
179
+
180
+ # Return this exception’s class name and message.
181
+ def inspect: () -> String
182
+
183
+ # Returns the result of invoking `exception.to_s` . Normally this returns
184
+ # the exception’s message or name.
185
+ def message: () -> String
186
+
187
+ def set_backtrace: (String | ::Array[String] arg0) -> ::Array[String]
188
+
189
+ # Returns exception’s message (or the name of the exception if no message
190
+ # is set).
191
+ def to_s: () -> String
192
+
193
+ def full_message: (?highlight: bool, ?order: :top | :bottom) -> String
194
+ end
@@ -0,0 +1,40 @@
1
+ # The global value `false` is the only instance of class FalseClass and
2
+ # represents a logically false value in boolean expressions. The class provides
3
+ # operators allowing `false` to participate correctly in logical expressions.
4
+ #
5
+ class FalseClass
6
+ public
7
+
8
+ def !: () -> bool
9
+
10
+ # And---Returns `false`. *obj* is always evaluated as it is the argument to a
11
+ # method call---there is no short-circuit evaluation in this case.
12
+ #
13
+ def &: (untyped obj) -> bool
14
+
15
+ # Case Equality -- For class Object, effectively the same as calling `#==`, but
16
+ # typically overridden by descendants to provide meaningful semantics in `case`
17
+ # statements.
18
+ #
19
+ def ===: (false) -> true
20
+ | (untyped obj) -> bool
21
+
22
+ # Exclusive Or---If *obj* is `nil` or `false`, returns `false`; otherwise,
23
+ # returns `true`.
24
+ #
25
+ def ^: (nil) -> false
26
+ | (false) -> false
27
+ | (untyped obj) -> bool
28
+
29
+ alias inspect to_s
30
+
31
+ # The string representation of `false` is "false".
32
+ #
33
+ def to_s: () -> "false"
34
+
35
+ # Or---Returns `false` if *obj* is `nil` or `false`; `true` otherwise.
36
+ #
37
+ def |: (nil) -> false
38
+ | (false) -> false
39
+ | (untyped obj) -> bool
40
+ end
@@ -0,0 +1,68 @@
1
+ # Fibers are primitives for implementing light weight cooperative
2
+ # concurrency in Ruby. Basically they are a means of creating code blocks
3
+ # that can be paused and resumed, much like threads. The main difference
4
+ # is that they are never preempted and that the scheduling must be done by
5
+ # the programmer and not the VM.
6
+ #
7
+ # As opposed to other stackless light weight concurrency models, each
8
+ # fiber comes with a stack. This enables the fiber to be paused from
9
+ # deeply nested function calls within the fiber block. See the ruby(1)
10
+ # manpage to configure the size of the fiber stack(s).
11
+ #
12
+ # When a fiber is created it will not run automatically. Rather it must be
13
+ # explicitly asked to run using the `Fiber#resume` method. The code
14
+ # running inside the fiber can give up control by calling `Fiber.yield` in
15
+ # which case it yields control back to caller (the caller of the
16
+ # `Fiber#resume` ).
17
+ #
18
+ # Upon yielding or termination the [Fiber](Fiber)
19
+ # returns the value of the last executed expression
20
+ #
21
+ # For instance:
22
+ #
23
+ # ```ruby
24
+ # fiber = Fiber.new do
25
+ # Fiber.yield 1
26
+ # 2
27
+ # end
28
+ #
29
+ # puts fiber.resume
30
+ # puts fiber.resume
31
+ # puts fiber.resume
32
+ # ```
33
+ #
34
+ # *produces*
35
+ #
36
+ # 1
37
+ # 2
38
+ # FiberError: dead fiber called
39
+ #
40
+ # The `Fiber#resume` method accepts an arbitrary number of parameters, if
41
+ # it is the first call to `resume` then they will be passed as block
42
+ # arguments. Otherwise they will be the return value of the call to
43
+ # `Fiber.yield`
44
+ #
45
+ # Example:
46
+ #
47
+ # ```ruby
48
+ # fiber = Fiber.new do |first|
49
+ # second = Fiber.yield first + 2
50
+ # end
51
+ #
52
+ # puts fiber.resume 10
53
+ # puts fiber.resume 14
54
+ # puts fiber.resume 18
55
+ # ```
56
+ #
57
+ # *produces*
58
+ #
59
+ # 12
60
+ # 14
61
+ # FiberError: dead fiber called
62
+ class Fiber < Object
63
+ def self.yield: (*untyped args) -> untyped
64
+
65
+ def initialize: () { () -> void } -> Fiber
66
+
67
+ def resume: (*untyped args) -> untyped
68
+ end
@@ -0,0 +1,12 @@
1
+ # Raised when an invalid operation is attempted on a
2
+ # [Fiber](https://ruby-doc.org/core-2.6.3/Fiber.html), in particular when
3
+ # attempting to call/resume a dead fiber, attempting to yield from the
4
+ # root fiber, or calling a fiber across threads.
5
+ #
6
+ # ```ruby
7
+ # fiber = Fiber.new{}
8
+ # fiber.resume #=> nil
9
+ # fiber.resume #=> FiberError: dead fiber called
10
+ # ```
11
+ class FiberError < StandardError
12
+ end
@@ -0,0 +1,1076 @@
1
+ # A File is an abstraction of any file object accessible by the program and is
2
+ # closely associated with class IO. File includes the methods of module
3
+ # FileTest as class methods, allowing you to write (for example)
4
+ # `File.exist?("foo")`.
5
+ #
6
+ # In the description of File methods, *permission bits* are a platform-specific
7
+ # set of bits that indicate permissions of a file. On Unix-based systems,
8
+ # permissions are viewed as a set of three octets, for the owner, the group, and
9
+ # the rest of the world. For each of these entities, permissions may be set to
10
+ # read, write, or execute the file:
11
+ #
12
+ # The permission bits `0644` (in octal) would thus be interpreted as read/write
13
+ # for owner, and read-only for group and other. Higher-order bits may also be
14
+ # used to indicate the type of file (plain, directory, pipe, socket, and so on)
15
+ # and various other special features. If the permissions are for a directory,
16
+ # the meaning of the execute bit changes; when set the directory can be
17
+ # searched.
18
+ #
19
+ # On non-Posix operating systems, there may be only the ability to make a file
20
+ # read-only or read-write. In this case, the remaining permission bits will be
21
+ # synthesized to resemble typical values. For instance, on Windows NT the
22
+ # default permission bits are `0644`, which means read/write for owner,
23
+ # read-only for all others. The only change that can be made is to make the file
24
+ # read-only, which is reported as `0444`.
25
+ #
26
+ # Various constants for the methods in File can be found in File::Constants.
27
+ #
28
+ class File < IO
29
+ # Opens the file named by `filename` according to the given `mode` and returns a
30
+ # new File object.
31
+ #
32
+ # See IO.new for a description of `mode` and `opt`.
33
+ #
34
+ # If a file is being created, permission bits may be given in `perm`. These
35
+ # mode and permission bits are platform dependent; on Unix systems, see open(2)
36
+ # and chmod(2) man pages for details.
37
+ #
38
+ # The new File object is buffered mode (or non-sync mode), unless `filename` is
39
+ # a tty. See IO#flush, IO#fsync, IO#fdatasync, and IO#sync= about sync mode.
40
+ #
41
+ # ### Examples
42
+ #
43
+ # f = File.new("testfile", "r")
44
+ # f = File.new("newfile", "w+")
45
+ # f = File.new("newfile", File::CREAT|File::TRUNC|File::RDWR, 0644)
46
+ #
47
+ def initialize: (string | _ToPath | int file_name, ?(string | int) mode, ?int perm) -> File
48
+
49
+ # Converts a pathname to an absolute pathname. Relative paths are referenced
50
+ # from the current working directory of the process unless *dir_string* is
51
+ # given, in which case it will be used as the starting point. If the given
52
+ # pathname starts with a ```~`'' it is NOT expanded, it is treated as a normal
53
+ # directory name.
54
+ #
55
+ # File.absolute_path("~oracle/bin") #=> "<relative_path>/~oracle/bin"
56
+ #
57
+ def self.absolute_path: (string | _ToPath file_name, ?(string | _ToPath) dir_string) -> String
58
+
59
+ # Returns `true` if `file_name` is an absolute path, and `false` otherwise.
60
+ #
61
+ # File.absolute_path?("c:/foo") #=> false (on Linux), true (on Windows)
62
+ #
63
+ # # arglists 💪👽🚨 << Delete this section
64
+ # File.absolute_path?(file_name) -> true or false
65
+ #
66
+ def self.absolute_path?: (string | _ToPath file_name) -> bool
67
+
68
+ # Returns the last access time for the named file as a Time object.
69
+ #
70
+ # *file_name* can be an IO object.
71
+ #
72
+ # File.atime("testfile") #=> Wed Apr 09 08:51:48 CDT 2003
73
+ #
74
+ def self.atime: (string | _ToPath | IO file_name) -> Time
75
+
76
+ # Returns the last component of the filename given in *file_name* (after first
77
+ # stripping trailing separators), which can be formed using both File::SEPARATOR
78
+ # and File::ALT_SEPARATOR as the separator when File::ALT_SEPARATOR is not
79
+ # `nil`. If *suffix* is given and present at the end of *file_name*, it is
80
+ # removed. If *suffix* is ".*", any extension will be removed.
81
+ #
82
+ # File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb"
83
+ # File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby"
84
+ # File.basename("/home/gumby/work/ruby.rb", ".*") #=> "ruby"
85
+ #
86
+ def self.basename: (string | _ToPath file_name, ?string suffix) -> String
87
+
88
+ def self.birthtime: (string | _ToPath | IO file_name) -> Time
89
+
90
+ # Returns `true` if the named file is a block device.
91
+ #
92
+ # *file_name* can be an IO object.
93
+ #
94
+ def self.blockdev?: (string | _ToPath | IO file_name) -> bool
95
+
96
+ # Returns `true` if the named file is a character device.
97
+ #
98
+ # *file_name* can be an IO object.
99
+ #
100
+ def self.chardev?: (string | _ToPath | IO file_name) -> bool
101
+
102
+ # Changes permission bits on the named file(s) to the bit pattern represented by
103
+ # *mode_int*. Actual effects are operating system dependent (see the beginning
104
+ # of this section). On Unix systems, see `chmod(2)` for details. Returns the
105
+ # number of files processed.
106
+ #
107
+ # File.chmod(0644, "testfile", "out") #=> 2
108
+ #
109
+ def self.chmod: (int mode, *(string | _ToPath) file_name) -> Integer
110
+
111
+ # Changes the owner and group of the named file(s) to the given numeric owner
112
+ # and group id's. Only a process with superuser privileges may change the owner
113
+ # of a file. The current owner of a file may change the file's group to any
114
+ # group to which the owner belongs. A `nil` or -1 owner or group id is ignored.
115
+ # Returns the number of files processed.
116
+ #
117
+ # File.chown(nil, 100, "testfile")
118
+ #
119
+ def self.chown: (int? owner, int? group, *(string | _ToPath) file_name) -> Integer
120
+
121
+ # Returns the change time for the named file (the time at which directory
122
+ # information about the file was changed, not the file itself).
123
+ #
124
+ # *file_name* can be an IO object.
125
+ #
126
+ # Note that on Windows (NTFS), returns creation time (birth time).
127
+ #
128
+ # File.ctime("testfile") #=> Wed Apr 09 08:53:13 CDT 2003
129
+ #
130
+ def self.ctime: (string | _ToPath | IO file_name) -> Time
131
+
132
+ # Deletes the named files, returning the number of names passed as arguments.
133
+ # Raises an exception on any error. Since the underlying implementation relies
134
+ # on the `unlink(2)` system call, the type of exception raised depends on its
135
+ # error type (see https://linux.die.net/man/2/unlink) and has the form of e.g.
136
+ # Errno::ENOENT.
137
+ #
138
+ # See also Dir::rmdir.
139
+ #
140
+ alias self.delete self.unlink
141
+
142
+ # Returns `true` if the named file is a directory, or a symlink that points at a
143
+ # directory, and `false` otherwise.
144
+ #
145
+ # *file_name* can be an IO object.
146
+ #
147
+ # File.directory?(".")
148
+ #
149
+ def self.directory?: (string | _ToPath | IO path) -> bool
150
+
151
+ # Returns all components of the filename given in *file_name* except the last
152
+ # one (after first stripping trailing separators). The filename can be formed
153
+ # using both File::SEPARATOR and File::ALT_SEPARATOR as the separator when
154
+ # File::ALT_SEPARATOR is not `nil`.
155
+ #
156
+ # File.dirname("/home/gumby/work/ruby.rb") #=> "/home/gumby/work"
157
+ #
158
+ def self.dirname: (string | _ToPath file_name) -> String
159
+
160
+ # Returns `true` if the named file exists and has a zero size.
161
+ #
162
+ # *file_name* can be an IO object.
163
+ #
164
+ alias self.empty? self.zero?
165
+
166
+ # Returns `true` if the named file is executable by the effective user and group
167
+ # id of this process. See eaccess(3).
168
+ #
169
+ # Windows does not support execute permissions separately from read permissions.
170
+ # On Windows, a file is only considered executable if it ends in .bat, .cmd,
171
+ # .com, or .exe.
172
+ #
173
+ # Note that some OS-level security features may cause this to return true even
174
+ # though the file is not executable by the effective user/group.
175
+ #
176
+ def self.executable?: (string | _ToPath file_name) -> bool
177
+
178
+ # Returns `true` if the named file is executable by the real user and group id
179
+ # of this process. See access(3).
180
+ #
181
+ # Windows does not support execute permissions separately from read permissions.
182
+ # On Windows, a file is only considered executable if it ends in .bat, .cmd,
183
+ # .com, or .exe.
184
+ #
185
+ # Note that some OS-level security features may cause this to return true even
186
+ # though the file is not executable by the real user/group.
187
+ #
188
+ def self.executable_real?: (string | _ToPath file_name) -> bool
189
+
190
+ # Return `true` if the named file exists.
191
+ #
192
+ # *file_name* can be an IO object.
193
+ #
194
+ # "file exists" means that stat() or fstat() system call is successful.
195
+ #
196
+ def self.exist?: (string | _ToPath | IO file_name) -> bool
197
+
198
+ # Deprecated method. Don't use.
199
+ #
200
+ alias self.exists? self.exist?
201
+
202
+ # Converts a pathname to an absolute pathname. Relative paths are referenced
203
+ # from the current working directory of the process unless `dir_string` is
204
+ # given, in which case it will be used as the starting point. The given pathname
205
+ # may start with a ```~`'', which expands to the process owner's home directory
206
+ # (the environment variable `HOME` must be set correctly). ```~`*user*'' expands
207
+ # to the named user's home directory.
208
+ #
209
+ # File.expand_path("~oracle/bin") #=> "/home/oracle/bin"
210
+ #
211
+ # A simple example of using `dir_string` is as follows.
212
+ # File.expand_path("ruby", "/usr/bin") #=> "/usr/bin/ruby"
213
+ #
214
+ # A more complex example which also resolves parent directory is as follows.
215
+ # Suppose we are in bin/mygem and want the absolute path of lib/mygem.rb.
216
+ #
217
+ # File.expand_path("../../lib/mygem.rb", __FILE__)
218
+ # #=> ".../path/to/project/lib/mygem.rb"
219
+ #
220
+ # So first it resolves the parent of __FILE__, that is bin/, then go to the
221
+ # parent, the root of the project and appends `lib/mygem.rb`.
222
+ #
223
+ def self.expand_path: (string | _ToPath file_name, ?(string | _ToPath) dir_string) -> String
224
+
225
+ # Returns the extension (the portion of file name in `path` starting from the
226
+ # last period).
227
+ #
228
+ # If `path` is a dotfile, or starts with a period, then the starting dot is not
229
+ # dealt with the start of the extension.
230
+ #
231
+ # An empty string will also be returned when the period is the last character in
232
+ # `path`.
233
+ #
234
+ # On Windows, trailing dots are truncated.
235
+ #
236
+ # File.extname("test.rb") #=> ".rb"
237
+ # File.extname("a/b/d/test.rb") #=> ".rb"
238
+ # File.extname(".a/b/d/test.rb") #=> ".rb"
239
+ # File.extname("foo.") #=> "" on Windows
240
+ # File.extname("foo.") #=> "." on non-Windows
241
+ # File.extname("test") #=> ""
242
+ # File.extname(".profile") #=> ""
243
+ # File.extname(".profile.sh") #=> ".sh"
244
+ #
245
+ def self.extname: (string | _ToPath path) -> String
246
+
247
+ # Returns `true` if the named `file` exists and is a regular file.
248
+ #
249
+ # `file` can be an IO object.
250
+ #
251
+ # If the `file` argument is a symbolic link, it will resolve the symbolic link
252
+ # and use the file referenced by the link.
253
+ #
254
+ def self.file?: (string | _ToPath | IO file) -> bool
255
+
256
+ # Returns true if `path` matches against `pattern`. The pattern is not a
257
+ # regular expression; instead it follows rules similar to shell filename
258
+ # globbing. It may contain the following metacharacters:
259
+ #
260
+ # `*`
261
+ # : Matches any file. Can be restricted by other values in the glob.
262
+ # Equivalent to `/ .* /x` in regexp.
263
+ #
264
+ # `*`
265
+ # : Matches all files regular files
266
+ # `c*`
267
+ # : Matches all files beginning with `c`
268
+ # `*c`
269
+ # : Matches all files ending with `c`
270
+ # `*c*`
271
+ # : Matches all files that have `c` in them (including at the beginning or
272
+ # end).
273
+ #
274
+ #
275
+ # To match hidden files (that start with a `.` set the File::FNM_DOTMATCH
276
+ # flag.
277
+ #
278
+ # `**`
279
+ # : Matches directories recursively or files expansively.
280
+ #
281
+ # `?`
282
+ # : Matches any one character. Equivalent to `/.{1}/` in regexp.
283
+ #
284
+ # `[set]`
285
+ # : Matches any one character in `set`. Behaves exactly like character sets
286
+ # in Regexp, including set negation (`[^a-z]`).
287
+ #
288
+ # ` \ `
289
+ # : Escapes the next metacharacter.
290
+ #
291
+ # `{a,b}`
292
+ # : Matches pattern a and pattern b if File::FNM_EXTGLOB flag is enabled.
293
+ # Behaves like a Regexp union (`(?:a|b)`).
294
+ #
295
+ #
296
+ # `flags` is a bitwise OR of the `FNM_XXX` constants. The same glob pattern and
297
+ # flags are used by Dir::glob.
298
+ #
299
+ # Examples:
300
+ #
301
+ # File.fnmatch('cat', 'cat') #=> true # match entire string
302
+ # File.fnmatch('cat', 'category') #=> false # only match partial string
303
+ #
304
+ # File.fnmatch('c{at,ub}s', 'cats') #=> false # { } isn't supported by default
305
+ # File.fnmatch('c{at,ub}s', 'cats', File::FNM_EXTGLOB) #=> true # { } is supported on FNM_EXTGLOB
306
+ #
307
+ # File.fnmatch('c?t', 'cat') #=> true # '?' match only 1 character
308
+ # File.fnmatch('c??t', 'cat') #=> false # ditto
309
+ # File.fnmatch('c*', 'cats') #=> true # '*' match 0 or more characters
310
+ # File.fnmatch('c*t', 'c/a/b/t') #=> true # ditto
311
+ # File.fnmatch('ca[a-z]', 'cat') #=> true # inclusive bracket expression
312
+ # File.fnmatch('ca[^t]', 'cat') #=> false # exclusive bracket expression ('^' or '!')
313
+ #
314
+ # File.fnmatch('cat', 'CAT') #=> false # case sensitive
315
+ # File.fnmatch('cat', 'CAT', File::FNM_CASEFOLD) #=> true # case insensitive
316
+ # File.fnmatch('cat', 'CAT', File::FNM_SYSCASE) #=> true or false # depends on the system default
317
+ #
318
+ # File.fnmatch('?', '/', File::FNM_PATHNAME) #=> false # wildcard doesn't match '/' on FNM_PATHNAME
319
+ # File.fnmatch('*', '/', File::FNM_PATHNAME) #=> false # ditto
320
+ # File.fnmatch('[/]', '/', File::FNM_PATHNAME) #=> false # ditto
321
+ #
322
+ # File.fnmatch('\?', '?') #=> true # escaped wildcard becomes ordinary
323
+ # File.fnmatch('\a', 'a') #=> true # escaped ordinary remains ordinary
324
+ # File.fnmatch('\a', '\a', File::FNM_NOESCAPE) #=> true # FNM_NOESCAPE makes '\' ordinary
325
+ # File.fnmatch('[\?]', '?') #=> true # can escape inside bracket expression
326
+ #
327
+ # File.fnmatch('*', '.profile') #=> false # wildcard doesn't match leading
328
+ # File.fnmatch('*', '.profile', File::FNM_DOTMATCH) #=> true # period by default.
329
+ # File.fnmatch('.*', '.profile') #=> true
330
+ #
331
+ # rbfiles = '**' '/' '*.rb' # you don't have to do like this. just write in single string.
332
+ # File.fnmatch(rbfiles, 'main.rb') #=> false
333
+ # File.fnmatch(rbfiles, './main.rb') #=> false
334
+ # File.fnmatch(rbfiles, 'lib/song.rb') #=> true
335
+ # File.fnmatch('**.rb', 'main.rb') #=> true
336
+ # File.fnmatch('**.rb', './main.rb') #=> false
337
+ # File.fnmatch('**.rb', 'lib/song.rb') #=> true
338
+ # File.fnmatch('*', 'dave/.profile') #=> true
339
+ #
340
+ # pattern = '*' '/' '*'
341
+ # File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME) #=> false
342
+ # File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME | File::FNM_DOTMATCH) #=> true
343
+ #
344
+ # pattern = '**' '/' 'foo'
345
+ # File.fnmatch(pattern, 'a/b/c/foo', File::FNM_PATHNAME) #=> true
346
+ # File.fnmatch(pattern, '/a/b/c/foo', File::FNM_PATHNAME) #=> true
347
+ # File.fnmatch(pattern, 'c:/a/b/c/foo', File::FNM_PATHNAME) #=> true
348
+ # File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME) #=> false
349
+ # File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME | File::FNM_DOTMATCH) #=> true
350
+ #
351
+ def self.fnmatch: (string pattern, string | _ToPath path, ?int flags) -> bool
352
+
353
+ # Returns true if `path` matches against `pattern`. The pattern is not a
354
+ # regular expression; instead it follows rules similar to shell filename
355
+ # globbing. It may contain the following metacharacters:
356
+ #
357
+ # `*`
358
+ # : Matches any file. Can be restricted by other values in the glob.
359
+ # Equivalent to `/ .* /x` in regexp.
360
+ #
361
+ # `*`
362
+ # : Matches all files regular files
363
+ # `c*`
364
+ # : Matches all files beginning with `c`
365
+ # `*c`
366
+ # : Matches all files ending with `c`
367
+ # `*c*`
368
+ # : Matches all files that have `c` in them (including at the beginning or
369
+ # end).
370
+ #
371
+ #
372
+ # To match hidden files (that start with a `.` set the File::FNM_DOTMATCH
373
+ # flag.
374
+ #
375
+ # `**`
376
+ # : Matches directories recursively or files expansively.
377
+ #
378
+ # `?`
379
+ # : Matches any one character. Equivalent to `/.{1}/` in regexp.
380
+ #
381
+ # `[set]`
382
+ # : Matches any one character in `set`. Behaves exactly like character sets
383
+ # in Regexp, including set negation (`[^a-z]`).
384
+ #
385
+ # ` \ `
386
+ # : Escapes the next metacharacter.
387
+ #
388
+ # `{a,b}`
389
+ # : Matches pattern a and pattern b if File::FNM_EXTGLOB flag is enabled.
390
+ # Behaves like a Regexp union (`(?:a|b)`).
391
+ #
392
+ #
393
+ # `flags` is a bitwise OR of the `FNM_XXX` constants. The same glob pattern and
394
+ # flags are used by Dir::glob.
395
+ #
396
+ # Examples:
397
+ #
398
+ # File.fnmatch('cat', 'cat') #=> true # match entire string
399
+ # File.fnmatch('cat', 'category') #=> false # only match partial string
400
+ #
401
+ # File.fnmatch('c{at,ub}s', 'cats') #=> false # { } isn't supported by default
402
+ # File.fnmatch('c{at,ub}s', 'cats', File::FNM_EXTGLOB) #=> true # { } is supported on FNM_EXTGLOB
403
+ #
404
+ # File.fnmatch('c?t', 'cat') #=> true # '?' match only 1 character
405
+ # File.fnmatch('c??t', 'cat') #=> false # ditto
406
+ # File.fnmatch('c*', 'cats') #=> true # '*' match 0 or more characters
407
+ # File.fnmatch('c*t', 'c/a/b/t') #=> true # ditto
408
+ # File.fnmatch('ca[a-z]', 'cat') #=> true # inclusive bracket expression
409
+ # File.fnmatch('ca[^t]', 'cat') #=> false # exclusive bracket expression ('^' or '!')
410
+ #
411
+ # File.fnmatch('cat', 'CAT') #=> false # case sensitive
412
+ # File.fnmatch('cat', 'CAT', File::FNM_CASEFOLD) #=> true # case insensitive
413
+ # File.fnmatch('cat', 'CAT', File::FNM_SYSCASE) #=> true or false # depends on the system default
414
+ #
415
+ # File.fnmatch('?', '/', File::FNM_PATHNAME) #=> false # wildcard doesn't match '/' on FNM_PATHNAME
416
+ # File.fnmatch('*', '/', File::FNM_PATHNAME) #=> false # ditto
417
+ # File.fnmatch('[/]', '/', File::FNM_PATHNAME) #=> false # ditto
418
+ #
419
+ # File.fnmatch('\?', '?') #=> true # escaped wildcard becomes ordinary
420
+ # File.fnmatch('\a', 'a') #=> true # escaped ordinary remains ordinary
421
+ # File.fnmatch('\a', '\a', File::FNM_NOESCAPE) #=> true # FNM_NOESCAPE makes '\' ordinary
422
+ # File.fnmatch('[\?]', '?') #=> true # can escape inside bracket expression
423
+ #
424
+ # File.fnmatch('*', '.profile') #=> false # wildcard doesn't match leading
425
+ # File.fnmatch('*', '.profile', File::FNM_DOTMATCH) #=> true # period by default.
426
+ # File.fnmatch('.*', '.profile') #=> true
427
+ #
428
+ # rbfiles = '**' '/' '*.rb' # you don't have to do like this. just write in single string.
429
+ # File.fnmatch(rbfiles, 'main.rb') #=> false
430
+ # File.fnmatch(rbfiles, './main.rb') #=> false
431
+ # File.fnmatch(rbfiles, 'lib/song.rb') #=> true
432
+ # File.fnmatch('**.rb', 'main.rb') #=> true
433
+ # File.fnmatch('**.rb', './main.rb') #=> false
434
+ # File.fnmatch('**.rb', 'lib/song.rb') #=> true
435
+ # File.fnmatch('*', 'dave/.profile') #=> true
436
+ #
437
+ # pattern = '*' '/' '*'
438
+ # File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME) #=> false
439
+ # File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME | File::FNM_DOTMATCH) #=> true
440
+ #
441
+ # pattern = '**' '/' 'foo'
442
+ # File.fnmatch(pattern, 'a/b/c/foo', File::FNM_PATHNAME) #=> true
443
+ # File.fnmatch(pattern, '/a/b/c/foo', File::FNM_PATHNAME) #=> true
444
+ # File.fnmatch(pattern, 'c:/a/b/c/foo', File::FNM_PATHNAME) #=> true
445
+ # File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME) #=> false
446
+ # File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME | File::FNM_DOTMATCH) #=> true
447
+ #
448
+ alias self.fnmatch? self.fnmatch
449
+
450
+ # Identifies the type of the named file; the return string is one of ```file`'',
451
+ # ```directory`'', ```characterSpecial`'', ```blockSpecial`'', ```fifo`'',
452
+ # ```link`'', ```socket`'', or ```unknown`''.
453
+ #
454
+ # File.ftype("testfile") #=> "file"
455
+ # File.ftype("/dev/tty") #=> "characterSpecial"
456
+ # File.ftype("/tmp/.X11-unix/X0") #=> "socket"
457
+ #
458
+ def self.ftype: (string | _ToPath file_name) -> String
459
+
460
+ # Returns `true` if the named file exists and the effective group id of the
461
+ # calling process is the owner of the file. Returns `false` on Windows.
462
+ #
463
+ # *file_name* can be an IO object.
464
+ #
465
+ def self.grpowned?: (string | _ToPath | IO file_name) -> bool
466
+
467
+ # Returns `true` if the named files are identical.
468
+ #
469
+ # *file_1* and *file_2* can be an IO object.
470
+ #
471
+ # open("a", "w") {}
472
+ # p File.identical?("a", "a") #=> true
473
+ # p File.identical?("a", "./a") #=> true
474
+ # File.link("a", "b")
475
+ # p File.identical?("a", "b") #=> true
476
+ # File.symlink("a", "c")
477
+ # p File.identical?("a", "c") #=> true
478
+ # open("d", "w") {}
479
+ # p File.identical?("a", "d") #=> false
480
+ #
481
+ def self.identical?: (string | _ToPath | IO file_1, string | _ToPath | IO file_2) -> bool
482
+
483
+ # Returns a new string formed by joining the strings using `"/"`.
484
+ #
485
+ # File.join("usr", "mail", "gumby") #=> "usr/mail/gumby"
486
+ #
487
+ def self.join: (*string) -> String
488
+
489
+ # Equivalent to File::chmod, but does not follow symbolic links (so it will
490
+ # change the permissions associated with the link, not the file referenced by
491
+ # the link). Often not available.
492
+ #
493
+ def self.lchmod: (int mode, *(string | _ToPath) file_name) -> Integer
494
+
495
+ # Equivalent to File::chown, but does not follow symbolic links (so it will
496
+ # change the owner associated with the link, not the file referenced by the
497
+ # link). Often not available. Returns number of files in the argument list.
498
+ #
499
+ def self.lchown: (int? owner, int? group, *(string | _ToPath) file_name) -> Integer
500
+
501
+ # Creates a new name for an existing file using a hard link. Will not overwrite
502
+ # *new_name* if it already exists (raising a subclass of SystemCallError). Not
503
+ # available on all platforms.
504
+ #
505
+ # File.link("testfile", ".testfile") #=> 0
506
+ # IO.readlines(".testfile")[0] #=> "This is line one\n"
507
+ #
508
+ def self.link: (string | _ToPath old_name, string | _ToPath new_name) -> 0
509
+
510
+ # Same as File::stat, but does not follow the last symbolic link. Instead,
511
+ # reports on the link itself.
512
+ #
513
+ # File.symlink("testfile", "link2test") #=> 0
514
+ # File.stat("testfile").size #=> 66
515
+ # File.lstat("link2test").size #=> 8
516
+ # File.stat("link2test").size #=> 66
517
+ #
518
+ def self.lstat: (string | _ToPath file_name) -> File::Stat
519
+
520
+ # Sets the access and modification times of each named file to the first two
521
+ # arguments. If a file is a symlink, this method acts upon the link itself as
522
+ # opposed to its referent; for the inverse behavior, see File.utime. Returns the
523
+ # number of file names in the argument list.
524
+ #
525
+ def self.lutime: ((Time | Numeric) atime, (Time | Numeric) mtime, *(string | _ToPath) file_name) -> Integer
526
+
527
+ # Creates a FIFO special file with name *file_name*. *mode* specifies the
528
+ # FIFO's permissions. It is modified by the process's umask in the usual way:
529
+ # the permissions of the created file are (mode & ~umask).
530
+ #
531
+ def self.mkfifo: ((string | _ToPath) file_name, ?int mode) -> 0
532
+
533
+ # Returns the modification time for the named file as a Time object.
534
+ #
535
+ # *file_name* can be an IO object.
536
+ #
537
+ # File.mtime("testfile") #=> Tue Apr 08 12:58:04 CDT 2003
538
+ #
539
+ def self.mtime: (string | _ToPath | IO file_name) -> Time
540
+
541
+ # Returns `true` if the named file exists and the effective used id of the
542
+ # calling process is the owner of the file.
543
+ #
544
+ # *file_name* can be an IO object.
545
+ #
546
+ def self.owned?: (string | _ToPath | IO file_name) -> bool
547
+
548
+ # Returns the string representation of the path
549
+ #
550
+ # File.path("/dev/null") #=> "/dev/null"
551
+ # File.path(Pathname.new("/tmp")) #=> "/tmp"
552
+ #
553
+ def self.path: (string | _ToPath path) -> String
554
+
555
+ # Returns `true` if the named file is a pipe.
556
+ #
557
+ # *file_name* can be an IO object.
558
+ #
559
+ def self.pipe?: (string | _ToPath | IO file_name) -> bool
560
+
561
+ # Returns `true` if the named file is readable by the effective user and group
562
+ # id of this process. See eaccess(3).
563
+ #
564
+ # Note that some OS-level security features may cause this to return true even
565
+ # though the file is not readable by the effective user/group.
566
+ #
567
+ def self.readable?: (string | _ToPath file_name) -> bool
568
+
569
+ # Returns `true` if the named file is readable by the real user and group id of
570
+ # this process. See access(3).
571
+ #
572
+ # Note that some OS-level security features may cause this to return true even
573
+ # though the file is not readable by the real user/group.
574
+ #
575
+ def self.readable_real?: (string | _ToPath file_name) -> bool
576
+
577
+ # Returns the name of the file referenced by the given link. Not available on
578
+ # all platforms.
579
+ #
580
+ # File.symlink("testfile", "link2test") #=> 0
581
+ # File.readlink("link2test") #=> "testfile"
582
+ #
583
+ def self.readlink: (string | _ToPath link_name) -> String
584
+
585
+ # Returns the real (absolute) pathname of *pathname* in the actual filesystem.
586
+ # The real pathname doesn't contain symlinks or useless dots.
587
+ #
588
+ # If *dir_string* is given, it is used as a base directory for interpreting
589
+ # relative pathname instead of the current directory.
590
+ #
591
+ # The last component of the real pathname can be nonexistent.
592
+ #
593
+ def self.realdirpath: (string | _ToPath pathname, ?(string | _ToPath) dir_string) -> String
594
+
595
+ # Returns the real (absolute) pathname of *pathname* in the actual filesystem
596
+ # not containing symlinks or useless dots.
597
+ #
598
+ # If *dir_string* is given, it is used as a base directory for interpreting
599
+ # relative pathname instead of the current directory.
600
+ #
601
+ # All components of the pathname must exist when this method is called.
602
+ #
603
+ def self.realpath: (string | _ToPath pathname, ?(string | _ToPath) dir_string) -> String
604
+
605
+ # Renames the given file to the new name. Raises a SystemCallError if the file
606
+ # cannot be renamed.
607
+ #
608
+ # File.rename("afile", "afile.bak") #=> 0
609
+ #
610
+ def self.rename: (string | _ToPath old_name, string | _ToPath new_name) -> 0
611
+
612
+ # Returns `true` if the named file has the setgid bit set.
613
+ #
614
+ # *file_name* can be an IO object.
615
+ #
616
+ def self.setgid?: (string | _ToPath | IO file_name) -> bool
617
+
618
+ # Returns `true` if the named file has the setuid bit set.
619
+ #
620
+ # *file_name* can be an IO object.
621
+ #
622
+ def self.setuid?: (string | _ToPath | IO file_name) -> bool
623
+
624
+ # Returns the size of `file_name`.
625
+ #
626
+ # *file_name* can be an IO object.
627
+ #
628
+ def self.size: (string | _ToPath | IO file_name) -> Integer
629
+
630
+ # Returns `nil` if `file_name` doesn't exist or has zero size, the size of the
631
+ # file otherwise.
632
+ #
633
+ # *file_name* can be an IO object.
634
+ #
635
+ def self.size?: (string | _ToPath | IO file_name) -> Integer?
636
+
637
+ # Returns `true` if the named file is a socket.
638
+ #
639
+ # *file_name* can be an IO object.
640
+ #
641
+ def self.socket?: (string | _ToPath | IO file_name) -> bool
642
+
643
+ # Splits the given string into a directory and a file component and returns them
644
+ # in a two-element array. See also File::dirname and File::basename.
645
+ #
646
+ # File.split("/home/gumby/.profile") #=> ["/home/gumby", ".profile"]
647
+ #
648
+ def self.split: (string | _ToPath file_name) -> [String, String]
649
+
650
+ # Returns a File::Stat object for the named file (see File::Stat).
651
+ #
652
+ # File.stat("testfile").mtime #=> Tue Apr 08 12:58:04 CDT 2003
653
+ #
654
+ def self.stat: (string | _ToPath file_name) -> File::Stat
655
+
656
+ # Returns `true` if the named file has the sticky bit set.
657
+ #
658
+ # *file_name* can be an IO object.
659
+ #
660
+ def self.sticky?: (string | _ToPath | IO file_name) -> bool
661
+
662
+ # Creates a symbolic link called *new_name* for the existing file *old_name*.
663
+ # Raises a NotImplemented exception on platforms that do not support symbolic
664
+ # links.
665
+ #
666
+ # File.symlink("testfile", "link2test") #=> 0
667
+ #
668
+ def self.symlink: (string | _ToPath old_name, string | _ToPath new_name) -> 0
669
+
670
+ # Returns `true` if the named file is a symbolic link.
671
+ #
672
+ def self.symlink?: (string | _ToPath file_name) -> bool
673
+
674
+ # Truncates the file *file_name* to be at most *integer* bytes long. Not
675
+ # available on all platforms.
676
+ #
677
+ # f = File.new("out", "w")
678
+ # f.write("1234567890") #=> 10
679
+ # f.close #=> nil
680
+ # File.truncate("out", 5) #=> 0
681
+ # File.size("out") #=> 5
682
+ #
683
+ def self.truncate: (string | _ToPath file_name, int length) -> 0
684
+
685
+ # Returns the current umask value for this process. If the optional argument is
686
+ # given, set the umask to that value and return the previous value. Umask values
687
+ # are *subtracted* from the default permissions, so a umask of `0222` would make
688
+ # a file read-only for everyone.
689
+ #
690
+ # File.umask(0006) #=> 18
691
+ # File.umask #=> 6
692
+ #
693
+ def self.umask: (?int umask) -> Integer
694
+
695
+ # Deletes the named files, returning the number of names passed as arguments.
696
+ # Raises an exception on any error. Since the underlying implementation relies
697
+ # on the `unlink(2)` system call, the type of exception raised depends on its
698
+ # error type (see https://linux.die.net/man/2/unlink) and has the form of e.g.
699
+ # Errno::ENOENT.
700
+ #
701
+ # See also Dir::rmdir.
702
+ #
703
+ def self.unlink: (*(string | _ToPath) file_name) -> Integer
704
+
705
+ # Sets the access and modification times of each named file to the first two
706
+ # arguments. If a file is a symlink, this method acts upon its referent rather
707
+ # than the link itself; for the inverse behavior see File.lutime. Returns the
708
+ # number of file names in the argument list.
709
+ #
710
+ def self.utime: ((Time | Numeric) atime, (Time | Numeric) mtime, *(string | _ToPath) file_name) -> Integer
711
+
712
+ # If *file_name* is readable by others, returns an integer representing the file
713
+ # permission bits of *file_name*. Returns `nil` otherwise. The meaning of the
714
+ # bits is platform dependent; on Unix systems, see `stat(2)`.
715
+ #
716
+ # *file_name* can be an IO object.
717
+ #
718
+ # File.world_readable?("/etc/passwd") #=> 420
719
+ # m = File.world_readable?("/etc/passwd")
720
+ # sprintf("%o", m) #=> "644"
721
+ #
722
+ def self.world_readable?: (string | _ToPath | IO file_name) -> Integer?
723
+
724
+ # If *file_name* is writable by others, returns an integer representing the file
725
+ # permission bits of *file_name*. Returns `nil` otherwise. The meaning of the
726
+ # bits is platform dependent; on Unix systems, see `stat(2)`.
727
+ #
728
+ # *file_name* can be an IO object.
729
+ #
730
+ # File.world_writable?("/tmp") #=> 511
731
+ # m = File.world_writable?("/tmp")
732
+ # sprintf("%o", m) #=> "777"
733
+ #
734
+ def self.world_writable?: (string | _ToPath | IO file_name) -> Integer?
735
+
736
+ # Returns `true` if the named file is writable by the effective user and group
737
+ # id of this process. See eaccess(3).
738
+ #
739
+ # Note that some OS-level security features may cause this to return true even
740
+ # though the file is not writable by the effective user/group.
741
+ #
742
+ def self.writable?: (string | _ToPath file_name) -> bool
743
+
744
+ # Returns `true` if the named file is writable by the real user and group id of
745
+ # this process. See access(3).
746
+ #
747
+ # Note that some OS-level security features may cause this to return true even
748
+ # though the file is not writable by the real user/group.
749
+ #
750
+ def self.writable_real?: (string | _ToPath file_name) -> bool
751
+
752
+ # Returns `true` if the named file exists and has a zero size.
753
+ #
754
+ # *file_name* can be an IO object.
755
+ #
756
+ def self.zero?: (string | _ToPath | IO file_name) -> bool
757
+
758
+ public
759
+
760
+ # Returns the last access time (a Time object) for *file*, or epoch if *file*
761
+ # has not been accessed.
762
+ #
763
+ # File.new("testfile").atime #=> Wed Dec 31 18:00:00 CST 1969
764
+ #
765
+ def atime: () -> Time
766
+
767
+ # Returns the birth time for *file*.
768
+ #
769
+ # File.new("testfile").birthtime #=> Wed Apr 09 08:53:14 CDT 2003
770
+ #
771
+ # If the platform doesn't have birthtime, raises NotImplementedError.
772
+ #
773
+ def birthtime: () -> Time
774
+
775
+ # Changes permission bits on *file* to the bit pattern represented by
776
+ # *mode_int*. Actual effects are platform dependent; on Unix systems, see
777
+ # `chmod(2)` for details. Follows symbolic links. Also see File#lchmod.
778
+ #
779
+ # f = File.new("out", "w");
780
+ # f.chmod(0644) #=> 0
781
+ #
782
+ def chmod: (int mode) -> (0 | nil)
783
+
784
+ # Changes the owner and group of *file* to the given numeric owner and group
785
+ # id's. Only a process with superuser privileges may change the owner of a file.
786
+ # The current owner of a file may change the file's group to any group to which
787
+ # the owner belongs. A `nil` or -1 owner or group id is ignored. Follows
788
+ # symbolic links. See also File#lchown.
789
+ #
790
+ # File.new("testfile").chown(502, 1000)
791
+ #
792
+ def chown: (int? owner, int? group) -> (0 | nil)
793
+
794
+ # Returns the change time for *file* (that is, the time directory information
795
+ # about the file was changed, not the file itself).
796
+ #
797
+ # Note that on Windows (NTFS), returns creation time (birth time).
798
+ #
799
+ # File.new("testfile").ctime #=> Wed Apr 09 08:53:14 CDT 2003
800
+ #
801
+ def ctime: () -> Time
802
+
803
+ # Locks or unlocks a file according to *locking_constant* (a logical *or* of the
804
+ # values in the table below). Returns `false` if File::LOCK_NB is specified and
805
+ # the operation would otherwise have blocked. Not available on all platforms.
806
+ #
807
+ # Locking constants (in class File):
808
+ #
809
+ # LOCK_EX | Exclusive lock. Only one process may hold an
810
+ # | exclusive lock for a given file at a time.
811
+ # ----------+------------------------------------------------
812
+ # LOCK_NB | Don't block when locking. May be combined
813
+ # | with other lock options using logical or.
814
+ # ----------+------------------------------------------------
815
+ # LOCK_SH | Shared lock. Multiple processes may each hold a
816
+ # | shared lock for a given file at the same time.
817
+ # ----------+------------------------------------------------
818
+ # LOCK_UN | Unlock.
819
+ #
820
+ # Example:
821
+ #
822
+ # # update a counter using write lock
823
+ # # don't use "w" because it truncates the file before lock.
824
+ # File.open("counter", File::RDWR|File::CREAT, 0644) {|f|
825
+ # f.flock(File::LOCK_EX)
826
+ # value = f.read.to_i + 1
827
+ # f.rewind
828
+ # f.write("#{value}\n")
829
+ # f.flush
830
+ # f.truncate(f.pos)
831
+ # }
832
+ #
833
+ # # read the counter using read lock
834
+ # File.open("counter", "r") {|f|
835
+ # f.flock(File::LOCK_SH)
836
+ # p f.read
837
+ # }
838
+ #
839
+ def flock: (int locking_constant) -> (0 | false)
840
+
841
+ # Same as IO#stat, but does not follow the last symbolic link. Instead, reports
842
+ # on the link itself.
843
+ #
844
+ # File.symlink("testfile", "link2test") #=> 0
845
+ # File.stat("testfile").size #=> 66
846
+ # f = File.new("link2test")
847
+ # f.lstat.size #=> 8
848
+ # f.stat.size #=> 66
849
+ #
850
+ def lstat: () -> (File::Stat | nil)
851
+
852
+ # Returns the modification time for *file*.
853
+ #
854
+ # File.new("testfile").mtime #=> Wed Apr 09 08:53:14 CDT 2003
855
+ #
856
+ def mtime: () -> Time
857
+
858
+ # Returns the pathname used to create *file* as a string. Does not normalize the
859
+ # name.
860
+ #
861
+ # The pathname may not point to the file corresponding to *file*. For instance,
862
+ # the pathname becomes void when the file has been moved or deleted.
863
+ #
864
+ # This method raises IOError for a *file* created using File::Constants::TMPFILE
865
+ # because they don't have a pathname.
866
+ #
867
+ # File.new("testfile").path #=> "testfile"
868
+ # File.new("/tmp/../tmp/xxx", "w").path #=> "/tmp/../tmp/xxx"
869
+ #
870
+ def path: () -> String
871
+
872
+ # Returns the size of *file* in bytes.
873
+ #
874
+ # File.new("testfile").size #=> 66
875
+ #
876
+ def size: () -> Integer
877
+
878
+ # Returns the pathname used to create *file* as a string. Does not normalize the
879
+ # name.
880
+ #
881
+ # The pathname may not point to the file corresponding to *file*. For instance,
882
+ # the pathname becomes void when the file has been moved or deleted.
883
+ #
884
+ # This method raises IOError for a *file* created using File::Constants::TMPFILE
885
+ # because they don't have a pathname.
886
+ #
887
+ # File.new("testfile").path #=> "testfile"
888
+ # File.new("/tmp/../tmp/xxx", "w").path #=> "/tmp/../tmp/xxx"
889
+ #
890
+ alias to_path path
891
+
892
+ # Truncates *file* to at most *integer* bytes. The file must be opened for
893
+ # writing. Not available on all platforms.
894
+ #
895
+ # f = File.new("out", "w")
896
+ # f.syswrite("1234567890") #=> 10
897
+ # f.truncate(5) #=> 0
898
+ # f.close() #=> nil
899
+ # File.size("out") #=> 5
900
+ #
901
+ def truncate: (int length) -> 0
902
+ end
903
+
904
+ # platform specific alternative separator
905
+ #
906
+ #
907
+ File::ALT_SEPARATOR: String?
908
+
909
+ # path list separator
910
+ #
911
+ #
912
+ File::PATH_SEPARATOR: String
913
+
914
+ # separates directory parts in path
915
+ #
916
+ #
917
+ File::SEPARATOR: String
918
+
919
+ # separates directory parts in path
920
+ #
921
+ #
922
+ File::Separator: String
923
+
924
+ module File::Constants
925
+ end
926
+
927
+ File::Constants::APPEND: Integer
928
+
929
+ File::Constants::BINARY: Integer
930
+
931
+ File::Constants::CREAT: Integer
932
+
933
+ File::Constants::DIRECT: Integer
934
+
935
+ File::Constants::DSYNC: Integer
936
+
937
+ File::Constants::EXCL: Integer
938
+
939
+ File::Constants::FNM_CASEFOLD: Integer
940
+
941
+ File::Constants::FNM_DOTMATCH: Integer
942
+
943
+ File::Constants::FNM_EXTGLOB: Integer
944
+
945
+ File::Constants::FNM_NOESCAPE: Integer
946
+
947
+ File::Constants::FNM_PATHNAME: Integer
948
+
949
+ File::Constants::FNM_SHORTNAME: Integer
950
+
951
+ File::Constants::FNM_SYSCASE: Integer
952
+
953
+ File::Constants::LOCK_EX: Integer
954
+
955
+ File::Constants::LOCK_NB: Integer
956
+
957
+ File::Constants::LOCK_SH: Integer
958
+
959
+ File::Constants::LOCK_UN: Integer
960
+
961
+ File::Constants::NOATIME: Integer
962
+
963
+ File::Constants::NOCTTY: Integer
964
+
965
+ File::Constants::NOFOLLOW: Integer
966
+
967
+ File::Constants::NONBLOCK: Integer
968
+
969
+ File::Constants::NULL: String
970
+
971
+ File::Constants::RDONLY: Integer
972
+
973
+ File::Constants::RDWR: Integer
974
+
975
+ File::Constants::RSYNC: Integer
976
+
977
+ File::Constants::SHARE_DELETE: Integer
978
+
979
+ File::Constants::SYNC: Integer
980
+
981
+ File::Constants::TMPFILE: Integer
982
+
983
+ File::Constants::TRUNC: Integer
984
+
985
+ File::Constants::WRONLY: Integer
986
+
987
+ class File::Stat < Object
988
+ include Comparable
989
+
990
+ def initialize: (String file) -> Object
991
+ def <=>: (File::Stat other) -> Integer?
992
+
993
+ def atime: () -> Time
994
+
995
+ def birthtime: () -> Time
996
+
997
+ def blksize: () -> Integer?
998
+
999
+ def blockdev?: () -> bool
1000
+
1001
+ def blocks: () -> Integer?
1002
+
1003
+ def chardev?: () -> bool
1004
+
1005
+ def ctime: () -> Time
1006
+
1007
+ def dev: () -> Integer
1008
+
1009
+ def dev_major: () -> Integer
1010
+
1011
+ def dev_minor: () -> Integer
1012
+
1013
+ def directory?: () -> bool
1014
+
1015
+ def executable?: () -> bool
1016
+
1017
+ def executable_real?: () -> bool
1018
+
1019
+ def file?: () -> bool
1020
+
1021
+ def ftype: () -> String
1022
+
1023
+ def gid: () -> Integer
1024
+
1025
+ def grpowned?: () -> bool
1026
+
1027
+ def ino: () -> Integer
1028
+
1029
+ def inspect: () -> String
1030
+
1031
+ def mode: () -> Integer
1032
+
1033
+ def mtime: () -> Time
1034
+
1035
+ def nlink: () -> Integer
1036
+
1037
+ def owned?: () -> bool
1038
+
1039
+ def pipe?: () -> bool
1040
+
1041
+ def rdev: () -> Integer?
1042
+
1043
+ def rdev_major: () -> Integer
1044
+
1045
+ def rdev_minor: () -> Integer
1046
+
1047
+ def read: (?Integer length, ?String outbuf) -> String
1048
+
1049
+ def readable?: () -> bool
1050
+
1051
+ def readable_real?: () -> bool
1052
+
1053
+ def setgid?: () -> bool
1054
+
1055
+ def setuid?: () -> bool
1056
+
1057
+ def size: () -> Integer
1058
+
1059
+ def socket?: () -> bool
1060
+
1061
+ def sticky?: () -> bool
1062
+
1063
+ def symlink?: () -> bool
1064
+
1065
+ def uid: () -> Integer
1066
+
1067
+ def world_readable?: () -> Integer?
1068
+
1069
+ def world_writable?: () -> Integer?
1070
+
1071
+ def writable?: () -> bool
1072
+
1073
+ def writable_real?: () -> bool
1074
+
1075
+ def zero?: () -> bool
1076
+ end