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,7 @@
1
+ STDERR.puts "🚨🚨 ruby-signature is renamed to rbs. require 'rbs' instead of 'ruby/signature'. 🚨🚨"
2
+
3
+ require "rbs"
4
+
5
+ module Ruby
6
+ Signature = RBS
7
+ end
@@ -0,0 +1,46 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "rbs/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rbs"
8
+ spec.version = RBS::VERSION
9
+ spec.authors = ["Soutaro Matsumoto"]
10
+ spec.email = ["matsumoto@soutaro.com"]
11
+
12
+ spec.summary = %q{Type signature for Ruby.}
13
+ spec.description = %q{RBS is the language for type signatures for Ruby and standard library definitions.}
14
+ spec.homepage = "https://github.com/ruby/rbs"
15
+ spec.licenses = ['BSD-2-Clause', 'Ruby']
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ if spec.respond_to?(:metadata)
20
+ spec.metadata["homepage_uri"] = spec.homepage
21
+ spec.metadata["source_code_uri"] = "https://github.com/ruby/rbs.git"
22
+ spec.metadata["changelog_uri"] = "https://github.com/ruby/rbs/blob/master/CHANGELOG.md"
23
+ else
24
+ raise "RubyGems 2.0 or newer is required to protect against " \
25
+ "public gem pushes."
26
+ end
27
+
28
+ # Specify which files should be added to the gem when it is released.
29
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
30
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
31
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
32
+ end
33
+ spec.files << "lib/rbs/parser.rb"
34
+ spec.bindir = "exe"
35
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
36
+ spec.require_paths = ["lib"]
37
+
38
+ spec.add_development_dependency "bundler"
39
+ spec.add_development_dependency "rake", "~> 13.0"
40
+ spec.add_development_dependency "minitest", "~> 5.0"
41
+ spec.add_development_dependency "racc", "~> 1.4.16"
42
+ spec.add_development_dependency "rubocop"
43
+ spec.add_development_dependency "rubocop-rubycw"
44
+ spec.add_development_dependency "minitest-reporters", "~> 1.3.6"
45
+ spec.add_development_dependency "json", "~> 2.3.0"
46
+ end
@@ -0,0 +1,60 @@
1
+ # Calculates the set of unambiguous abbreviations for a given set of strings.
2
+ #
3
+ # require 'abbrev'
4
+ # require 'pp'
5
+ #
6
+ # pp Abbrev.abbrev(['ruby'])
7
+ # #=> {"ruby"=>"ruby", "rub"=>"ruby", "ru"=>"ruby", "r"=>"ruby"}
8
+ #
9
+ # pp Abbrev.abbrev(%w{ ruby rules })
10
+ #
11
+ # *Generates:*
12
+ # { "ruby" => "ruby",
13
+ # "rub" => "ruby",
14
+ # "rules" => "rules",
15
+ # "rule" => "rules",
16
+ # "rul" => "rules" }
17
+ #
18
+ # It also provides an array core extension, Array#abbrev.
19
+ #
20
+ # pp %w{ summer winter }.abbrev
21
+ #
22
+ # *Generates:*
23
+ # { "summer" => "summer",
24
+ # "summe" => "summer",
25
+ # "summ" => "summer",
26
+ # "sum" => "summer",
27
+ # "su" => "summer",
28
+ # "s" => "summer",
29
+ # "winter" => "winter",
30
+ # "winte" => "winter",
31
+ # "wint" => "winter",
32
+ # "win" => "winter",
33
+ # "wi" => "winter",
34
+ # "w" => "winter" }
35
+ #
36
+ module Abbrev
37
+ # Given a set of strings, calculate the set of unambiguous abbreviations for
38
+ # those strings, and return a hash where the keys are all the possible
39
+ # abbreviations and the values are the full strings.
40
+ #
41
+ # Thus, given `words` is "car" and "cone", the keys pointing to "car" would be
42
+ # "ca" and "car", while those pointing to "cone" would be "co", "con", and
43
+ # "cone".
44
+ #
45
+ # require 'abbrev'
46
+ #
47
+ # Abbrev.abbrev(%w{ car cone })
48
+ # #=> {"ca"=>"car", "con"=>"cone", "co"=>"cone", "car"=>"car", "cone"=>"cone"}
49
+ #
50
+ # The optional `pattern` parameter is a pattern or a string. Only input strings
51
+ # that match the pattern or start with the string are included in the output
52
+ # hash.
53
+ #
54
+ # Abbrev.abbrev(%w{car box cone crab}, /b/)
55
+ # #=> {"box"=>"box", "bo"=>"box", "b"=>"box", "crab" => "crab"}
56
+ #
57
+ # Abbrev.abbrev(%w{car box cone}, 'ca')
58
+ # #=> {"car"=>"car", "ca"=>"car"}
59
+ def self?.abbrev: (Array[String], ?String | Regexp | nil) -> Hash[String, String]
60
+ end
@@ -0,0 +1,71 @@
1
+ # The Base64 module provides for the encoding (#encode64, #strict_encode64,
2
+ # #urlsafe_encode64) and decoding (#decode64, #strict_decode64,
3
+ # #urlsafe_decode64) of binary data using a Base64 representation.
4
+ #
5
+ # ## Example
6
+ #
7
+ # A simple encoding and decoding.
8
+ #
9
+ # require "base64"
10
+ #
11
+ # enc = Base64.encode64('Send reinforcements')
12
+ # # -> "U2VuZCByZWluZm9yY2VtZW50cw==\n"
13
+ # plain = Base64.decode64(enc)
14
+ # # -> "Send reinforcements"
15
+ #
16
+ # The purpose of using base64 to encode data is that it translates any binary
17
+ # data into purely printable characters.
18
+ #
19
+ module Base64
20
+ # Returns the Base64-decoded version of `str`. This method complies with RFC
21
+ # 2045. Characters outside the base alphabet are ignored.
22
+ #
23
+ # require 'base64'
24
+ # str = 'VGhpcyBpcyBsaW5lIG9uZQpUaGlzIG' +
25
+ # 'lzIGxpbmUgdHdvClRoaXMgaXMgbGlu' +
26
+ # 'ZSB0aHJlZQpBbmQgc28gb24uLi4K'
27
+ # puts Base64.decode64(str)
28
+ #
29
+ # *Generates:*
30
+ #
31
+ # This is line one
32
+ # This is line two
33
+ # This is line three
34
+ # And so on...
35
+ def self?.decode64: (String str) -> String
36
+
37
+ # Returns the Base64-encoded version of `bin`. This method complies with RFC
38
+ # 2045. Line feeds are added to every 60 encoded characters.
39
+ #
40
+ # require 'base64'
41
+ # Base64.encode64("Now is the time for all good coders\nto learn Ruby")
42
+ #
43
+ # *Generates:*
44
+ #
45
+ # Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g
46
+ # UnVieQ==
47
+ def self?.encode64: (String bin) -> String
48
+
49
+ # Returns the Base64-decoded version of `str`. This method complies with RFC
50
+ # 4648. ArgumentError is raised if `str` is incorrectly padded or contains
51
+ # non-alphabet characters. Note that CR or LF are also rejected.
52
+ def self?.strict_decode64: (String str) -> String
53
+
54
+ # Returns the Base64-encoded version of `bin`. This method complies with RFC
55
+ # 4648. No line feeds are added.
56
+ def self?.strict_encode64: (String bin) -> String
57
+
58
+ # Returns the Base64-decoded version of `str`. This method complies with ``Base
59
+ # 64 Encoding with URL and Filename Safe Alphabet'' in RFC 4648. The alphabet
60
+ # uses '-' instead of '+' and '_' instead of '/'.
61
+ #
62
+ # The padding character is optional. This method accepts both correctly-padded
63
+ # and unpadded input. Note that it still rejects incorrectly-padded input.
64
+ def self?.urlsafe_decode64: (String str) -> String
65
+
66
+ # Returns the Base64-encoded version of `bin`. This method complies with ``Base
67
+ # 64 Encoding with URL and Filename Safe Alphabet'' in RFC 4648. The alphabet
68
+ # uses '-' instead of '+' and '_' instead of '/'. Note that the result can still
69
+ # contain '='. You can remove the padding by setting `padding` as false.
70
+ def self?.urlsafe_encode64: (String bin, ?padding: bool) -> String
71
+ end
@@ -0,0 +1,372 @@
1
+ # The Benchmark module provides methods to measure and report the time used to
2
+ # execute Ruby code.
3
+ #
4
+ # * Measure the time to construct the string given by the expression
5
+ # `"a"*1_000_000_000`:
6
+ #
7
+ # require 'benchmark'
8
+ #
9
+ # puts Benchmark.measure { "a"*1_000_000_000 }
10
+ #
11
+ # On my machine (OSX 10.8.3 on i5 1.7 GHz) this generates:
12
+ #
13
+ # 0.350000 0.400000 0.750000 ( 0.835234)
14
+ #
15
+ # This report shows the user CPU time, system CPU time, the sum of the user
16
+ # and system CPU times, and the elapsed real time. The unit of time is
17
+ # seconds.
18
+ #
19
+ # * Do some experiments sequentially using the #bm method:
20
+ #
21
+ # require 'benchmark'
22
+ #
23
+ # n = 5000000
24
+ # Benchmark.bm do |x|
25
+ # x.report { for i in 1..n; a = "1"; end }
26
+ # x.report { n.times do ; a = "1"; end }
27
+ # x.report { 1.upto(n) do ; a = "1"; end }
28
+ # end
29
+ #
30
+ # The result:
31
+ #
32
+ # user system total real
33
+ # 1.010000 0.000000 1.010000 ( 1.014479)
34
+ # 1.000000 0.000000 1.000000 ( 0.998261)
35
+ # 0.980000 0.000000 0.980000 ( 0.981335)
36
+ #
37
+ # * Continuing the previous example, put a label in each report:
38
+ #
39
+ # require 'benchmark'
40
+ #
41
+ # n = 5000000
42
+ # Benchmark.bm(7) do |x|
43
+ # x.report("for:") { for i in 1..n; a = "1"; end }
44
+ # x.report("times:") { n.times do ; a = "1"; end }
45
+ # x.report("upto:") { 1.upto(n) do ; a = "1"; end }
46
+ # end
47
+ #
48
+ #
49
+ # The result:
50
+ #
51
+ # user system total real
52
+ # for: 1.010000 0.000000 1.010000 ( 1.015688)
53
+ # times: 1.000000 0.000000 1.000000 ( 1.003611)
54
+ # upto: 1.030000 0.000000 1.030000 ( 1.028098)
55
+ #
56
+ # * The times for some benchmarks depend on the order in which items are run.
57
+ # These differences are due to the cost of memory allocation and garbage
58
+ # collection. To avoid these discrepancies, the #bmbm method is provided.
59
+ # For example, to compare ways to sort an array of floats:
60
+ #
61
+ # require 'benchmark'
62
+ #
63
+ # array = (1..1000000).map { rand }
64
+ #
65
+ # Benchmark.bmbm do |x|
66
+ # x.report("sort!") { array.dup.sort! }
67
+ # x.report("sort") { array.dup.sort }
68
+ # end
69
+ #
70
+ # The result:
71
+ #
72
+ # Rehearsal -----------------------------------------
73
+ # sort! 1.490000 0.010000 1.500000 ( 1.490520)
74
+ # sort 1.460000 0.000000 1.460000 ( 1.463025)
75
+ # -------------------------------- total: 2.960000sec
76
+ #
77
+ # user system total real
78
+ # sort! 1.460000 0.000000 1.460000 ( 1.460465)
79
+ # sort 1.450000 0.010000 1.460000 ( 1.448327)
80
+ #
81
+ # * Report statistics of sequential experiments with unique labels, using the
82
+ # #benchmark method:
83
+ #
84
+ # require 'benchmark'
85
+ # include Benchmark # we need the CAPTION and FORMAT constants
86
+ #
87
+ # n = 5000000
88
+ # Benchmark.benchmark(CAPTION, 7, FORMAT, ">total:", ">avg:") do |x|
89
+ # tf = x.report("for:") { for i in 1..n; a = "1"; end }
90
+ # tt = x.report("times:") { n.times do ; a = "1"; end }
91
+ # tu = x.report("upto:") { 1.upto(n) do ; a = "1"; end }
92
+ # [tf+tt+tu, (tf+tt+tu)/3]
93
+ # end
94
+ #
95
+ # The result:
96
+ #
97
+ # user system total real
98
+ # for: 0.950000 0.000000 0.950000 ( 0.952039)
99
+ # times: 0.980000 0.000000 0.980000 ( 0.984938)
100
+ # upto: 0.950000 0.000000 0.950000 ( 0.946787)
101
+ # >total: 2.880000 0.000000 2.880000 ( 2.883764)
102
+ # >avg: 0.960000 0.000000 0.960000 ( 0.961255)
103
+ #
104
+ #
105
+ module Benchmark
106
+ # Invokes the block with a Benchmark::Report object, which may be used to
107
+ # collect and report on the results of individual benchmark tests. Reserves
108
+ # `label_width` leading spaces for labels on each line. Prints `caption` at the
109
+ # top of the report, and uses `format` to format each line. Returns an array of
110
+ # Benchmark::Tms objects.
111
+ #
112
+ # If the block returns an array of Benchmark::Tms objects, these will be used to
113
+ # format additional lines of output. If `labels` parameter are given, these are
114
+ # used to label these extra lines.
115
+ #
116
+ # *Note*: Other methods provide a simpler interface to this one, and are
117
+ # suitable for nearly all benchmarking requirements. See the examples in
118
+ # Benchmark, and the #bm and #bmbm methods.
119
+ #
120
+ # Example:
121
+ #
122
+ # require 'benchmark'
123
+ # include Benchmark # we need the CAPTION and FORMAT constants
124
+ #
125
+ # n = 5000000
126
+ # Benchmark.benchmark(CAPTION, 7, FORMAT, ">total:", ">avg:") do |x|
127
+ # tf = x.report("for:") { for i in 1..n; a = "1"; end }
128
+ # tt = x.report("times:") { n.times do ; a = "1"; end }
129
+ # tu = x.report("upto:") { 1.upto(n) do ; a = "1"; end }
130
+ # [tf+tt+tu, (tf+tt+tu)/3]
131
+ # end
132
+ #
133
+ # Generates:
134
+ #
135
+ # user system total real
136
+ # for: 0.970000 0.000000 0.970000 ( 0.970493)
137
+ # times: 0.990000 0.000000 0.990000 ( 0.989542)
138
+ # upto: 0.970000 0.000000 0.970000 ( 0.972854)
139
+ # >total: 2.930000 0.000000 2.930000 ( 2.932889)
140
+ # >avg: 0.976667 0.000000 0.976667 ( 0.977630)
141
+ #
142
+ def self?.benchmark: (String caption, ?Integer? label_width, ?String? format, *String labels) { (Report report) -> (Array[Tms] | void) } -> ::Array[Benchmark::Tms]
143
+
144
+ # A simple interface to the #benchmark method, #bm generates sequential reports
145
+ # with labels. `label_width` and `labels` parameters have the same meaning as
146
+ # for #benchmark.
147
+ #
148
+ # require 'benchmark'
149
+ #
150
+ # n = 5000000
151
+ # Benchmark.bm(7) do |x|
152
+ # x.report("for:") { for i in 1..n; a = "1"; end }
153
+ # x.report("times:") { n.times do ; a = "1"; end }
154
+ # x.report("upto:") { 1.upto(n) do ; a = "1"; end }
155
+ # end
156
+ #
157
+ # Generates:
158
+ #
159
+ # user system total real
160
+ # for: 0.960000 0.000000 0.960000 ( 0.957966)
161
+ # times: 0.960000 0.000000 0.960000 ( 0.960423)
162
+ # upto: 0.950000 0.000000 0.950000 ( 0.954864)
163
+ #
164
+ def self?.bm: (?Integer label_width, *String labels) { (Report report) -> void } -> ::Array[Benchmark::Tms]
165
+
166
+ # Sometimes benchmark results are skewed because code executed earlier
167
+ # encounters different garbage collection overheads than that run later. #bmbm
168
+ # attempts to minimize this effect by running the tests twice, the first time as
169
+ # a rehearsal in order to get the runtime environment stable, the second time
170
+ # for real. GC.start is executed before the start of each of the real timings;
171
+ # the cost of this is not included in the timings. In reality, though, there's
172
+ # only so much that #bmbm can do, and the results are not guaranteed to be
173
+ # isolated from garbage collection and other effects.
174
+ #
175
+ # Because #bmbm takes two passes through the tests, it can calculate the
176
+ # required label width.
177
+ #
178
+ # require 'benchmark'
179
+ #
180
+ # array = (1..1000000).map { rand }
181
+ #
182
+ # Benchmark.bmbm do |x|
183
+ # x.report("sort!") { array.dup.sort! }
184
+ # x.report("sort") { array.dup.sort }
185
+ # end
186
+ #
187
+ # Generates:
188
+ #
189
+ # Rehearsal -----------------------------------------
190
+ # sort! 1.440000 0.010000 1.450000 ( 1.446833)
191
+ # sort 1.440000 0.000000 1.440000 ( 1.448257)
192
+ # -------------------------------- total: 2.890000sec
193
+ #
194
+ # user system total real
195
+ # sort! 1.460000 0.000000 1.460000 ( 1.458065)
196
+ # sort 1.450000 0.000000 1.450000 ( 1.455963)
197
+ #
198
+ # #bmbm yields a Benchmark::Job object and returns an array of Benchmark::Tms
199
+ # objects.
200
+ #
201
+ def self?.bmbm: (?Integer width) { (Job job) -> void } -> ::Array[Benchmark::Tms]
202
+
203
+ # Returns the time used to execute the given block as a Benchmark::Tms object.
204
+ # Takes `label` option.
205
+ #
206
+ # require 'benchmark'
207
+ #
208
+ # n = 1000000
209
+ #
210
+ # time = Benchmark.measure do
211
+ # n.times { a = "1" }
212
+ # end
213
+ # puts time
214
+ #
215
+ # Generates:
216
+ #
217
+ # 0.220000 0.000000 0.220000 ( 0.227313)
218
+ #
219
+ def self?.measure: (?String label) { () -> void } -> Benchmark::Tms
220
+
221
+ # Returns the elapsed real time used to execute the given block.
222
+ #
223
+ def self?.realtime: () { () -> void } -> Float
224
+ end
225
+
226
+ Benchmark::BENCHMARK_VERSION: String
227
+
228
+ # The default caption string (heading above the output times).
229
+ #
230
+ Benchmark::CAPTION: String
231
+
232
+ # The default format string used to display times. See also
233
+ # Benchmark::Tms#format.
234
+ #
235
+ Benchmark::FORMAT: String
236
+
237
+ class Benchmark::Job
238
+ # Prints the `label` and measured time for the block,
239
+ # formatted by `format`. See Tms#format for the
240
+ # formatting rules.
241
+ def item: (?String label) { () -> void } -> self
242
+
243
+ # An array of 2-element arrays, consisting of label and block pairs.
244
+ def list: () -> ::Array[untyped]
245
+
246
+ alias report item
247
+
248
+ # Length of the widest label in the #list.
249
+ def width: () -> Integer
250
+ end
251
+
252
+ class Benchmark::Report
253
+ # Prints the `label` and measured time for the block,
254
+ # formatted by `format`. See Tms#format for the
255
+ # formatting rules.
256
+ def item: (?String label, *untyped format) { () -> void } -> Tms
257
+
258
+ # An array of Benchmark::Tms objects representing each item.
259
+ def list: () -> ::Array[Benchmark::Tms]
260
+
261
+ alias report item
262
+ end
263
+
264
+ # A data object, representing the times associated with a benchmark measurement.
265
+ #
266
+ class Benchmark::Tms
267
+ # Returns a new Tms object obtained by memberwise multiplication of the
268
+ # individual times for this Tms object by `x`.
269
+ #
270
+ def *: (untyped x) -> untyped
271
+
272
+ # Returns a new Tms object obtained by memberwise summation of the individual
273
+ # times for this Tms object with those of the `other` Tms object. This method
274
+ # and #/() are useful for taking statistics.
275
+ #
276
+ def +: (untyped other) -> untyped
277
+
278
+ # Returns a new Tms object obtained by memberwise subtraction of the individual
279
+ # times for the `other` Tms object from those of this Tms object.
280
+ #
281
+ def -: (untyped other) -> untyped
282
+
283
+ # Returns a new Tms object obtained by memberwise division of the individual
284
+ # times for this Tms object by `x`. This method and #+() are useful for taking
285
+ # statistics.
286
+ #
287
+ def /: (untyped x) -> untyped
288
+
289
+ # Returns a new Tms object whose times are the sum of the times for this Tms
290
+ # object, plus the time required to execute the code block (`blk`).
291
+ #
292
+ def add: () { (*untyped) -> untyped } -> untyped
293
+
294
+ # An in-place version of #add. Changes the times of this Tms object by making it
295
+ # the sum of the times for this Tms object, plus the time required to execute
296
+ # the code block (`blk`).
297
+ #
298
+ def add!: () { (*untyped) -> untyped } -> untyped
299
+
300
+ # System CPU time of children
301
+ #
302
+ def cstime: () -> Float
303
+
304
+ # User CPU time of children
305
+ #
306
+ def cutime: () -> Float
307
+
308
+ # Returns the contents of this Tms object as a formatted string, according to a
309
+ # `format` string like that passed to Kernel.format. In addition, #format
310
+ # accepts the following extensions:
311
+ #
312
+ # `%u`
313
+ # : Replaced by the user CPU time, as reported by Tms#utime.
314
+ # `%y`
315
+ # : Replaced by the system CPU time, as reported by #stime (Mnemonic: y of
316
+ # "s*y*stem")
317
+ # `%U`
318
+ # : Replaced by the children's user CPU time, as reported by Tms#cutime
319
+ # `%Y`
320
+ # : Replaced by the children's system CPU time, as reported by Tms#cstime
321
+ # `%t`
322
+ # : Replaced by the total CPU time, as reported by Tms#total
323
+ # `%r`
324
+ # : Replaced by the elapsed real time, as reported by Tms#real
325
+ # `%n`
326
+ # : Replaced by the label string, as reported by Tms#label (Mnemonic: n of
327
+ # "*n*ame")
328
+ #
329
+ #
330
+ # If `format` is not given, FORMAT is used as default value, detailing the user,
331
+ # system and real elapsed time.
332
+ #
333
+ def format: (?String format, *untyped args) -> String
334
+
335
+ # Label
336
+ #
337
+ def label: () -> String
338
+
339
+ # Elapsed real time
340
+ #
341
+ def real: () -> Float
342
+
343
+ # System CPU time
344
+ #
345
+ def stime: () -> Float
346
+
347
+ # Returns a new 6-element array, consisting of the label, user CPU time, system
348
+ # CPU time, children's user CPU time, children's system CPU time and elapsed
349
+ # real time.
350
+ #
351
+ def to_a: () -> untyped
352
+
353
+ # Same as #format.
354
+ #
355
+ def to_s: () -> String
356
+
357
+ # Total time, that is `utime` + `stime` + `cutime` + `cstime`
358
+ #
359
+ def total: () -> Float
360
+
361
+ # User CPU time
362
+ #
363
+ def utime: () -> Float
364
+ end
365
+
366
+ # Default caption, see also Benchmark::CAPTION
367
+ #
368
+ Benchmark::Tms::CAPTION: String
369
+
370
+ # Default format string, see also Benchmark::FORMAT
371
+ #
372
+ Benchmark::Tms::FORMAT: String