New Upstream Release - ruby-pdf-reader
Ready changes
Summary
Merged new upstream version: 2.11.0 (was: 2.4.1).
Resulting package
Built on 2023-02-25T16:40 (took 18m58s)
The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:
apt install -t fresh-releases ruby-pdf-reader
Diff
diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml
index 3d1900b..2153521 100644
--- a/.buildkite/pipeline.yml
+++ b/.buildkite/pipeline.yml
@@ -1,27 +1,44 @@
steps:
- - command: "auto/run-specs"
- label: "rspec (1.9.3)"
+ - command: "auto/run-sorbet"
+ label: ":sorbet:"
+ env:
+ DOCKER_IMAGE: "ruby"
+ RUBY_VERSION: "2.7"
+
+ - command: "auto/run-require-strict-typing"
+ label: "typed: strict"
env:
DOCKER_IMAGE: "ruby"
- RUBY_VERSION: "1.9.3"
+ RUBY_VERSION: "2.7"
+
+ - command: "auto/run-quality"
+ label: "quality"
+ env:
+ DOCKER_IMAGE: "ruby"
+ RUBY_VERSION: "2.7"
+
+ - wait
- command: "auto/run-specs"
label: "rspec (2.0)"
env:
DOCKER_IMAGE: "ruby"
RUBY_VERSION: "2.0"
+ BUNDLE_GEMFILE: "/work/Gemfile-legacy"
- command: "auto/run-specs"
label: "rspec (2.1)"
env:
DOCKER_IMAGE: "ruby"
RUBY_VERSION: "2.1"
+ BUNDLE_GEMFILE: "/work/Gemfile-legacy"
- command: "auto/run-specs"
label: "rspec (2.2)"
env:
DOCKER_IMAGE: "ruby"
RUBY_VERSION: "2.2"
+ BUNDLE_GEMFILE: "/work/Gemfile-legacy"
- command: "auto/run-specs"
label: "rspec (2.3)"
@@ -53,6 +70,18 @@ steps:
DOCKER_IMAGE: "ruby"
RUBY_VERSION: "2.7"
+ - command: "auto/run-specs"
+ label: "rspec (3.0)"
+ env:
+ DOCKER_IMAGE: "ruby"
+ RUBY_VERSION: "3.0"
+
+ - command: "auto/run-specs"
+ label: "rspec (3.1)"
+ env:
+ DOCKER_IMAGE: "ruby"
+ RUBY_VERSION: "3.1"
+
- command: "auto/run-specs"
label: "rspec (jruby-9.1)"
env:
@@ -65,3 +94,8 @@ steps:
DOCKER_IMAGE: "jruby"
RUBY_VERSION: "9.2"
+ - command: "auto/run-specs"
+ label: "rspec (jruby-9.3)"
+ env:
+ DOCKER_IMAGE: "jruby"
+ RUBY_VERSION: "9.3"
diff --git a/.gitignore b/.gitignore
index 6cf8445..53a8d1b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
doc
pkg
Gemfile.lock
+Gemfile-legacy.lock
.idea
.rbx
*.gem
diff --git a/.parlour b/.parlour
new file mode 100644
index 0000000..50c6b5a
--- /dev/null
+++ b/.parlour
@@ -0,0 +1,9 @@
+output_file:
+ rbi: rbi/pdf-reader.rbi
+
+
+parser:
+ included_paths:
+ - lib
+ excluded_paths:
+ - lib/pdf/reader/parser.rb
diff --git a/CHANGELOG b/CHANGELOG
index b932ed7..a16a5d7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,71 @@
+v2.11.0 (26th October 2022)
+- Various bug fixes
+- Expanded sorbet type annotations
+
+v2.10.0 (12th May 2022)
+- Various bug fixes
+- Expanded sorbet type annotations
+
+v2.9.2 (20th February 2022)
+- Fix PDF::Reader::ObjectHash#page_references to return an Array of PDF::Reader::Reference (http://github.com/yob/pdf-reader/pull/444)
+
+v2.9.1 (4th February 2022)
+- Fix exception in Page#walk introduced in 2.9.0 (http://github.com/yob/pdf-reader/pull/442)
+- Other small bug fixes
+
+v2.9.0 (24th January 2022)
+- Support additional encryption standards (http://github.com/yob/pdf-reader/pull/419)
+- Return CropBox correctly from Page#rectangles (https://github.com/yob/pdf-reader/pull/420)
+- For sorbet users, additional type annotations are included in the gem
+
+v2.8.0 (28th Decemeber 2021)
+- Add PDF::Reader::Page#runs for extracting text from a page with positioning metadata (http://github.com/yob/pdf-reader/pull/411)
+- Add options to PDF::Reader::Page#text to make some behaviour configurable (http://github.com/yob/pdf-reader/pull/411)
+ - including extracting the text for only part of the page
+- Improve text positioning and extraction for Type3 fonts (http://github.com/yob/pdf-reader/pull/412)
+- Skip extracting text that is positioned outside the page (http://github.com/yob/pdf-reader/pull/413)
+- Fix occasional crash when reading some streams (http://github.com/yob/pdf-reader/pull/405)
+
+v2.7.0 (13th December 2021)
+- Include RBI type files in the gem
+ - Downstream users of pdf-reader who also use sorbet *should* find many parts of the API will
+ now be typed checked by sorbet
+- Fix glyph positioning in some rotation scenarios (http://github.com/yob/pdf-reader/pull/403)
+ - Improved text extraction on some rotated pages, and rotated text on normal pages
+- Add PDF::Reader::Page#rectangles (http://github.com/yob/pdf-reader/pull/402)
+ - Returns page boxes (MediaBox, etc) with rotation applied, and as PORO rather than arrays of numbers
+- Add PDF::Reader::Page#origin (http://github.com/yob/pdf-reader/pull/400)
+- Add PDF::Reader::Page#{height,width} (http://github.com/yob/pdf-reader/pull/399)
+- Overlap filter should only drop characters that overlap *and* match (http://github.com/yob/pdf-reader/pull/401)
+
+v2.6.0 (12th November 2021)
+- Text extraction improvements
+ - Improved text layout on pages with a variety of font sizes (http://github.com/yob/pdf-reader/pull/355)
+ - Fixed text positioning for some rotated pages (http://github.com/yob/pdf-reader/pull/356)
+ - Improved character width calculation for PDFs using built-in (non-embedded) ZapfDingbats (http://github.com/yob/pdf-reader/pull/373)
+ - Skip zero-width characters (http://github.com/yob/pdf-reader/pull/372)
+- Performance improvements
+ - Reduced memory pressure when decoding TIFF images (http://github.com/yob/pdf-reader/pull/360)
+ - Optional dependency on ascii81_native gem for faster processing of files using the ascii85 filter (http://github.com/yob/pdf-reader/pull/359)
+- Successfully parse more files
+ - Gracefully handle some non-spec compliant CR/LF issues (http://github.com/yob/pdf-reader/pull/364)
+ - Fix parsing of some escape sequences in content streams (http://github.com/yob/pdf-reader/pull/368)
+ - Increase the amount of junk bytes we detect and skip at the end of a file (382)
+ - Ignore "/Prev 0" in trailers (http://github.com/yob/pdf-reader/pull/383)
+ - Fix parsing of some inline images (BI ID EI tokens) (http://github.com/yob/pdf-reader/pull/389)
+ - Gracefully handle some xref tables that incorrectly start with 1 (http://github.com/yob/pdf-reader/pull/384)
+
+v2.5.0 (6th June 2021)
+- bump minimum ruby version to 2.0
+- Correctly handle trascoding to UTF-8 from some fonts that use a difference table [#344](https://github.com/yob/pdf-reader/pull/344/)
+- Fix some character spacing issues with the TJ operator [#343](https://github.com/yob/pdf-reader/pull/343)
+- Fix crash with some encrypted PDFs [#348](https://github.com/yob/pdf-reader/pull/348/)
+- Fix positions of text on some PDFs with pages rotated 90° [#350](https://github.com/yob/pdf-reader/pull/350/)
+
+v2.4.2 (28th January 2021)
+- relax ASCII85 dependency to allow 1.x
+- improved support for decompressing objects with slightly malformed zlib data
+
v.2.4.1 (24th September 2020)
- Re-vendor font metrics from Adobe to clarify their license
diff --git a/Gemfile b/Gemfile
index b4e2a20..bccc2f6 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,3 +1,8 @@
source "https://rubygems.org"
gemspec
+
+# We require sorbet here rather than in the gemspec so we can avoid loading it in CI
+# for rubies < 2.3
+gem "sorbet", "0.5.10001"
+gem 'parlour'
diff --git a/Gemfile-legacy b/Gemfile-legacy
new file mode 100644
index 0000000..1104bce
--- /dev/null
+++ b/Gemfile-legacy
@@ -0,0 +1,5 @@
+source "https://rubygems.org"
+
+gemspec
+
+# This Gemfile is used in the CI environment for ruby < 2.3, where sorbet can't be loaded
diff --git a/README.md b/README.md
index d556070..aa79bd2 100644
--- a/README.md
+++ b/README.md
@@ -166,6 +166,19 @@ http://groups.google.com/group/pdf-reader
The easiest way to explain how this works in practice is to show some examples.
Check out the examples/ directory for a few files.
+# Alternate Decoder
+
+For PDF files containing Ascii85 streams, the [ascii85_native](https://github.com/AnomalousBit/ascii85_native) gem can be used for increased performance. If the ascii85_native gem is detected, pdf-reader will automatically use the gem.
+
+First, run `gem install ascii85_native` and then require the gem alongside pdf-reader:
+
+```ruby
+require "pdf-reader"
+require "ascii85_native"
+```
+
+Another way of enabling native Ascii85 decoding is to place `gem 'ascii85_native'` in your project's `Gemfile`.
+
# Known Limitations
Occasionally some text cannot be extracted properly due to the way it has been
@@ -176,7 +189,9 @@ little UTF-8 friendly box to indicate an unrecognisable character.
* PDF::Reader Code Repository: http://github.com/yob/pdf-reader
-* PDF Specification: http://www.adobe.com/devnet/pdf/pdf_reference.html
+* PDF Specification: https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf
+
+* Adobe PDF Developer Resources: http://www.adobe.com/devnet/pdf/pdf_reference.html
* PDF Tutorial Slide Presentations: https://web.archive.org/web/20150110042057/http://home.comcast.net/~jk05/presentations/PDFTutorials.html
diff --git a/Rakefile b/Rakefile
index 69e418a..011ecc9 100644
--- a/Rakefile
+++ b/Rakefile
@@ -14,7 +14,7 @@ desc "Run cane to check quality metrics"
Cane::RakeTask.new(:quality) do |cane|
cane.abc_max = 20
cane.style_measure = 100
- cane.max_violations = 31
+ cane.max_violations = 33
cane.use Morecane::EncodingCheck, :encoding_glob => "{app,lib,spec}/**/*.rb"
end
diff --git a/auto/run-quality b/auto/run-quality
new file mode 100755
index 0000000..ceb4370
--- /dev/null
+++ b/auto/run-quality
@@ -0,0 +1,5 @@
+#! /bin/bash -eu
+#
+# Run the tests
+
+$(dirname $0)/with-ruby rake quality
diff --git a/auto/run-require-strict-typing b/auto/run-require-strict-typing
new file mode 100755
index 0000000..7c3a62e
--- /dev/null
+++ b/auto/run-require-strict-typing
@@ -0,0 +1,5 @@
+#! /bin/bash -eu
+#
+# Confirm recent ruby files use strict typing
+
+$(dirname $0)/with-ruby ./scripts/require-strict-typing
diff --git a/auto/run-sorbet b/auto/run-sorbet
new file mode 100755
index 0000000..3012ad4
--- /dev/null
+++ b/auto/run-sorbet
@@ -0,0 +1,7 @@
+#! /bin/bash -eu
+#
+# Run the tests
+
+# The extra flags to sorbet are a workaround to allow be to declare type hints for constants in the RBI file
+
+$(dirname $0)/with-ruby srb tc --max-threads=1 --stress-incremental-resolver
diff --git a/auto/run-specs b/auto/run-specs
index f16b5ec..76d013d 100755
--- a/auto/run-specs
+++ b/auto/run-specs
@@ -2,4 +2,4 @@
#
# Run the tests
-$(dirname $0)/with-ruby rake
+$(dirname $0)/with-ruby rspec
diff --git a/auto/with-ruby b/auto/with-ruby
index 3b82819..033ecad 100755
--- a/auto/with-ruby
+++ b/auto/with-ruby
@@ -7,6 +7,7 @@ cd $(dirname $0)/..
docker_image="${DOCKER_IMAGE:=ruby}"
ruby_version="${RUBY_VERSION:-2.7}"
docker_volume_name="pdf-reader-gem-cache-${docker_image}${ruby_version}"
+gemfile="${BUNDLE_GEMFILE:=/work/Gemfile}"
docker volume create ${docker_volume_name} > /dev/null
@@ -16,6 +17,7 @@ docker run \
-w /work \
--entrypoint /work/auto/bundle-exec \
--rm \
+ -e BUNDLE_GEMFILE=${gemfile} \
-i \
-t ${docker_image}:${ruby_version} \
"${@-bash}"
diff --git a/debian/changelog b/debian/changelog
index 21303f2..8f1e213 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+ruby-pdf-reader (2.11.0-1) UNRELEASED; urgency=low
+
+ * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk> Sat, 25 Feb 2023 16:36:21 -0000
+
ruby-pdf-reader (2.4.1-1) unstable; urgency=medium
* New upstream version 2.4.1
diff --git a/debian/patches/0004-spec_fix_requires.patch b/debian/patches/0004-spec_fix_requires.patch
index 3547db5..2c303d3 100644
--- a/debian/patches/0004-spec_fix_requires.patch
+++ b/debian/patches/0004-spec_fix_requires.patch
@@ -4,9 +4,12 @@ Description: fix requires in spec/
Author: Cédric Boutillier <cedric.boutillier@gmail.com>
Last-Update: 2011-09-06
---- a/spec/spec_helper.rb
-+++ b/spec/spec_helper.rb
-@@ -1,9 +1,10 @@
+Index: ruby-pdf-reader.git/spec/spec_helper.rb
+===================================================================
+--- ruby-pdf-reader.git.orig/spec/spec_helper.rb
++++ ruby-pdf-reader.git/spec/spec_helper.rb
+@@ -1,10 +1,11 @@
+ # typed: strict
# coding: utf-8
-require "rubygems"
diff --git a/debian/patches/0006-spec_add_require_yaml.patch b/debian/patches/0006-spec_add_require_yaml.patch
index 81f2f37..f755adb 100644
--- a/debian/patches/0006-spec_add_require_yaml.patch
+++ b/debian/patches/0006-spec_add_require_yaml.patch
@@ -3,9 +3,11 @@ Author: Cédric Boutillier <cedric.boutillier@gmail.com>
Bug: https://github.com/yob/pdf-reader/issues/49
Last-Update: 2012-02-23
---- a/spec/spec_helper.rb
-+++ b/spec/spec_helper.rb
-@@ -9,6 +9,7 @@
+Index: ruby-pdf-reader.git/spec/spec_helper.rb
+===================================================================
+--- ruby-pdf-reader.git.orig/spec/spec_helper.rb
++++ ruby-pdf-reader.git/spec/spec_helper.rb
+@@ -10,6 +10,7 @@ require 'pdf/reader'
require 'timeout'
require 'singleton'
require 'digest/md5'
diff --git a/examples/extract_fonts.rb b/examples/extract_fonts.rb
index 82c9b05..260cb93 100755
--- a/examples/extract_fonts.rb
+++ b/examples/extract_fonts.rb
@@ -17,8 +17,8 @@ module ExtractFonts
return count if page.fonts.nil? || page.fonts.empty?
page.fonts.each do |label, font|
- next if complete_refs[font]
- complete_refs[font] = true
+ next if complete_refs[label]
+ complete_refs[label] = true
process_font(page, font)
@@ -39,7 +39,7 @@ module ExtractFonts
when :TrueType, :CIDFontType2 then
ExtractFonts::TTF.new(page.objects, font).save("#{font[:BaseFont]}.ttf")
else
- $stderr.puts "unsupported font type #{font[:Subtype]}"
+ $stderr.puts "unsupported font type #{font[:Subtype]} for #{font[:BaseFont]}"
end
end
@@ -68,10 +68,15 @@ module ExtractFonts
end
end
-filename = File.expand_path(File.dirname(__FILE__)) + "/../spec/data/cairo-unicode.pdf"
+if ARGV.size == 0 # default file name
+ ARGV << File.expand_path(File.join(File.dirname(__dir__), "spec", "data", "cairo-unicode.pdf"))
+end
+
extractor = ExtractFonts::Extractor.new
-PDF::Reader.open(filename) do |reader|
- page = reader.page(1)
- extractor.page(page)
+ARGV.each do |arg|
+ PDF::Reader.open(arg) do |reader|
+ page = reader.page(1)
+ extractor.page(page)
+ end
end
diff --git a/examples/rspec.rb b/examples/rspec.rb
index 3fdffa7..593d1df 100644
--- a/examples/rspec.rb
+++ b/examples/rspec.rb
@@ -1,5 +1,6 @@
#!/usr/bin/env ruby
# coding: utf-8
+# typed: ignore
# Basic RSpec of a generated PDF
#
diff --git a/lib/pdf-reader.rb b/lib/pdf-reader.rb
index 4a76715..c990f81 100644
--- a/lib/pdf-reader.rb
+++ b/lib/pdf-reader.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
require "pdf/reader"
diff --git a/lib/pdf/reader.rb b/lib/pdf/reader.rb
index 0ac514b..96bef30 100644
--- a/lib/pdf/reader.rb
+++ b/lib/pdf/reader.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
################################################################################
@@ -111,19 +112,27 @@ module PDF
#
# reader = PDF::Reader.new("somefile.pdf", :password => "apples")
#
+ # Using this method directly is supported, but it's more common to use
+ # `PDF::Reader.open`
+ #
def initialize(input, opts = {})
@cache = PDF::Reader::ObjectCache.new
opts.merge!(:cache => @cache)
@objects = PDF::Reader::ObjectHash.new(input, opts)
end
+ # Return a Hash with some basic information about the PDF file
+ #
def info
- dict = @objects.deref(@objects.trailer[:Info])
+ dict = @objects.deref_hash(@objects.trailer[:Info]) || {}
doc_strings_to_utf8(dict)
end
+ # Return a String with extra XML metadata provided by the author of the PDF file. Not
+ # always present.
+ #
def metadata
- stream = @objects.deref(root[:Metadata])
+ stream = @objects.deref_stream(root[:Metadata])
if stream.nil?
nil
else
@@ -133,20 +142,24 @@ module PDF
end
end
+ # To number of pages in this PDF
+ #
def page_count
- pages = @objects.deref(root[:Pages])
+ pages = @objects.deref_hash(root[:Pages])
unless pages.kind_of?(::Hash)
- raise MalformedPDFError, 'Pages structure is missing'
+ raise MalformedPDFError, "Pages structure is missing #{pages.class}"
end
- @page_count ||= @objects.deref(pages[:Count])
+ @page_count ||= @objects.deref_integer(pages[:Count]) || 0
end
+ # The PDF version this file uses
+ #
def pdf_version
@objects.pdf_version
end
- # syntactic sugar for opening a PDF file. Accepts the same arguments
- # as new().
+ # syntactic sugar for opening a PDF file and the most common approach. Accepts the
+ # same arguments as new().
#
# PDF::Reader.open("somefile.pdf") do |reader|
# puts reader.pdf_version
@@ -169,7 +182,7 @@ module PDF
#
# reader.pages.each do |page|
# puts page.fonts
- # puts page.images
+ # puts page.rectangles
# puts page.text
# end
#
@@ -177,6 +190,8 @@ module PDF
# methods available on each page
#
def pages
+ return [] if page_count <= 0
+
(1..self.page_count).map do |num|
begin
PDF::Reader::Page.new(@objects, num, :cache => @cache)
@@ -221,16 +236,24 @@ module PDF
when Array then
obj.map { |item| doc_strings_to_utf8(item) }
when String then
- if obj[0,2].unpack("C*") == [254, 255]
+ if has_utf16_bom?(obj)
utf16_to_utf8(obj)
else
pdfdoc_to_utf8(obj)
end
else
- @objects.deref(obj)
+ obj
end
end
+ def has_utf16_bom?(str)
+ first_bytes = str[0,2]
+
+ return false if first_bytes.nil?
+
+ first_bytes.unpack("C*") == [254, 255]
+ end
+
# TODO find a PDF I can use to spec this behaviour
#
def pdfdoc_to_utf8(obj)
@@ -242,28 +265,23 @@ module PDF
# String#encode
#
def utf16_to_utf8(obj)
- str = obj[2, obj.size]
+ str = obj[2, obj.size].to_s
str = str.unpack("n*").pack("U*")
str.force_encoding("utf-8")
str
end
def root
- @root ||= begin
- obj = @objects.deref(@objects.trailer[:Root])
- unless obj.kind_of?(::Hash)
- raise MalformedPDFError, "PDF malformed, trailer Root should be a dictionary"
- end
- obj
- end
+ @root ||= @objects.deref_hash(@objects.trailer[:Root]) || {}
end
end
end
################################################################################
-require 'pdf/reader/resource_methods'
+require 'pdf/reader/resources'
require 'pdf/reader/buffer'
+require 'pdf/reader/bounding_rectangle_runs_filter'
require 'pdf/reader/cid_widths'
require 'pdf/reader/cmap'
require 'pdf/reader/encoding'
@@ -286,18 +304,26 @@ require 'pdf/reader/object_hash'
require 'pdf/reader/object_stream'
require 'pdf/reader/pages_strategy'
require 'pdf/reader/parser'
+require 'pdf/reader/point'
require 'pdf/reader/print_receiver'
+require 'pdf/reader/rectangle'
require 'pdf/reader/reference'
require 'pdf/reader/register_receiver'
+require 'pdf/reader/no_text_filter'
require 'pdf/reader/null_security_handler'
-require 'pdf/reader/standard_security_handler'
-require 'pdf/reader/standard_security_handler_v5'
+require 'pdf/reader/security_handler_factory'
+require 'pdf/reader/standard_key_builder'
+require 'pdf/reader/key_builder_v5'
+require 'pdf/reader/aes_v2_security_handler'
+require 'pdf/reader/aes_v3_security_handler'
+require 'pdf/reader/rc4_security_handler'
require 'pdf/reader/unimplemented_security_handler'
require 'pdf/reader/stream'
require 'pdf/reader/text_run'
+require 'pdf/reader/type_check'
require 'pdf/reader/page_state'
require 'pdf/reader/page_text_receiver'
require 'pdf/reader/token'
require 'pdf/reader/xref'
-require 'pdf/reader/orientation_detector'
require 'pdf/reader/page'
+require 'pdf/reader/validating_receiver'
diff --git a/lib/pdf/reader/aes_v2_security_handler.rb b/lib/pdf/reader/aes_v2_security_handler.rb
new file mode 100644
index 0000000..a76b12c
--- /dev/null
+++ b/lib/pdf/reader/aes_v2_security_handler.rb
@@ -0,0 +1,41 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+require 'digest/md5'
+
+class PDF::Reader
+
+ # Decrypts data using the AESV2 algorithim defined in the PDF spec. Requires
+ # a decryption key, which is usually generated by PDF::Reader::StandardKeyBuilder
+ #
+ class AesV2SecurityHandler
+
+ def initialize(key)
+ @encrypt_key = key
+ end
+
+ ##7.6.2 General Encryption Algorithm
+ #
+ # Algorithm 1: Encryption of data using the AES-128-CBC algorithm
+ #
+ # version == 4 and CFM == AESV2
+ #
+ # buf - a string to decrypt
+ # ref - a PDF::Reader::Reference for the object to decrypt
+ #
+ def decrypt( buf, ref )
+ objKey = @encrypt_key.dup
+ (0..2).each { |e| objKey << (ref.id >> e*8 & 0xFF ) }
+ (0..1).each { |e| objKey << (ref.gen >> e*8 & 0xFF ) }
+ objKey << 'sAlT' # Algorithm 1, b)
+ length = objKey.length < 16 ? objKey.length : 16
+ cipher = OpenSSL::Cipher.new("AES-#{length << 3}-CBC")
+ cipher.decrypt
+ cipher.key = Digest::MD5.digest(objKey)[0,length]
+ cipher.iv = buf[0..15]
+ cipher.update(buf[16..-1]) + cipher.final
+ end
+
+ end
+end
diff --git a/lib/pdf/reader/aes_v3_security_handler.rb b/lib/pdf/reader/aes_v3_security_handler.rb
new file mode 100644
index 0000000..3794731
--- /dev/null
+++ b/lib/pdf/reader/aes_v3_security_handler.rb
@@ -0,0 +1,38 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+require 'digest'
+require 'openssl'
+
+class PDF::Reader
+
+ # Decrypts data using the AESV3 algorithim defined in the PDF 1.7, Extension Level 3 spec.
+ # Requires a decryption key, which is usually generated by PDF::Reader::KeyBuilderV5
+ #
+ class AesV3SecurityHandler
+
+ def initialize(key)
+ @encrypt_key = key
+ @cipher = "AES-256-CBC"
+ end
+
+ ##7.6.2 General Encryption Algorithm
+ #
+ # Algorithm 1: Encryption of data using the RC4 or AES algorithms
+ #
+ # used to decrypt RC4/AES encrypted PDF streams (buf)
+ #
+ # buf - a string to decrypt
+ # ref - a PDF::Reader::Reference for the object to decrypt
+ #
+ def decrypt( buf, ref )
+ cipher = OpenSSL::Cipher.new(@cipher)
+ cipher.decrypt
+ cipher.key = @encrypt_key.dup
+ cipher.iv = buf[0..15]
+ cipher.update(buf[16..-1]) + cipher.final
+ end
+
+ end
+end
diff --git a/lib/pdf/reader/bounding_rectangle_runs_filter.rb b/lib/pdf/reader/bounding_rectangle_runs_filter.rb
new file mode 100644
index 0000000..0524195
--- /dev/null
+++ b/lib/pdf/reader/bounding_rectangle_runs_filter.rb
@@ -0,0 +1,16 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+class PDF::Reader
+
+ # Filter our text/characters that are positioned outside a rectangle. Usually the page
+ # MediaBox or CropBox, but could be a user specified rectangle too
+ class BoundingRectangleRunsFilter
+
+ def self.runs_within_rect(runs, rect)
+ runs.select { |run| rect.contains?(run.origin) }
+ end
+ end
+end
+
diff --git a/lib/pdf/reader/buffer.rb b/lib/pdf/reader/buffer.rb
index d1a9a69..5263499 100644
--- a/lib/pdf/reader/buffer.rb
+++ b/lib/pdf/reader/buffer.rb
@@ -1,4 +1,5 @@
# coding: ASCII-8BIT
+# typed: strict
# frozen_string_literal: true
################################################################################
@@ -48,6 +49,18 @@ class PDF::Reader
ID = "ID"
FWD_SLASH = "/"
NULL_BYTE = "\x00"
+ CR = "\r"
+ LF = "\n"
+ CRLF = "\r\n"
+ WHITE_SPACE = [LF, CR, ' ']
+
+ # Quite a few PDFs have trailing junk.
+ # This can be several k of nuls in some cases
+ # Allow for this here
+ TRAILING_BYTECOUNT = 5000
+
+ # must match whole tokens
+ DIGITS_ONLY = %r{\A\d+\z}
attr_reader :pos
@@ -86,9 +99,12 @@ class PDF::Reader
#
# options:
#
- # :skip_eol - if true, the IO stream is advanced past a CRLF or LF that
- # is sitting under the io cursor.
- #
+ # :skip_eol - if true, the IO stream is advanced past a CRLF, CR or LF
+ # that is sitting under the io cursor.
+ # Note:
+ # Skipping a bare CR is not spec-compliant.
+ # This is because the data may start with LF.
+ # However we check for CRLF first, so the ambiguity is avoided.
def read(bytes, opts = {})
reset_pos
@@ -97,9 +113,9 @@ class PDF::Reader
str = @io.read(2)
if str.nil?
return nil
- elsif str == "\r\n"
+ elsif str == CRLF # This MUST be done before checking for CR alone
# do nothing
- elsif str[0,1] == "\n"
+ elsif str[0, 1] == LF || str[0, 1] == CR # LF or CR alone
@io.seek(-1, IO::SEEK_CUR)
else
@io.seek(-2, IO::SEEK_CUR)
@@ -127,8 +143,10 @@ class PDF::Reader
#
def find_first_xref_offset
check_size_is_non_zero
- @io.seek(-1024, IO::SEEK_END) rescue @io.seek(0)
- data = @io.read(1024)
+ @io.seek(-TRAILING_BYTECOUNT, IO::SEEK_END) rescue @io.seek(0)
+ data = @io.read(TRAILING_BYTECOUNT)
+
+ raise MalformedPDFError, "PDF does not contain EOF marker" if data.nil?
# the PDF 1.7 spec (section #3.4) says that EOL markers can be either \r, \n, or both.
lines = data.split(/[\n\r]+/).reverse
@@ -136,7 +154,12 @@ class PDF::Reader
raise MalformedPDFError, "PDF does not contain EOF marker" if eof_index.nil?
raise MalformedPDFError, "PDF EOF marker does not follow offset" if eof_index >= lines.size-1
- lines[eof_index+1].to_i
+ offset = lines[eof_index+1].to_i
+
+ # a byte offset < 0 doesn't make much sense. This is unlikely to happen, but in theory some
+ # corrupted PDFs might have a line that looks like a negative int preceding the `%%EOF`
+ raise MalformedPDFError, "invalid xref offset" if offset < 0
+ offset
end
private
@@ -217,45 +240,73 @@ class PDF::Reader
return if @tokens.size < 3
return if @tokens[2] != "R"
- if @tokens[0].match(/\d+/) && @tokens[1].match(/\d+/)
- @tokens[0] = PDF::Reader::Reference.new(@tokens[0].to_i, @tokens[1].to_i)
- @tokens[1] = nil
- @tokens[2] = nil
- @tokens.compact!
+ token_one = @tokens[0]
+ token_two = @tokens[1]
+ if token_one.is_a?(String) && token_two.is_a?(String) && token_one.match(DIGITS_ONLY) && token_two.match(DIGITS_ONLY)
+ @tokens[0] = PDF::Reader::Reference.new(token_one.to_i, token_two.to_i)
+ @tokens.delete_at(2)
+ @tokens.delete_at(1)
end
end
+ # Extract data between ID and EI
+ # If the EI follows white-space the space is dropped from the data
+ # The EI must followed by white-space or end of buffer
+ # This is to reduce the chance of accidentally matching an embedded EI
def prepare_inline_token
- str = "".dup
-
- buffer = []
-
- until buffer[0] =~ /\s|\0/ && buffer[1, 2] == ["E", "I"]
+ idstart = @io.pos
+ prevchr = ''
+ eisize = 0 # how many chars in the end marker
+ seeking = 'E' # what are we looking for now?
+ loop do
chr = @io.read(1)
- buffer << chr
-
- if buffer.length > 3
- str << buffer.shift
+ break if chr.nil?
+ case seeking
+ when 'E'
+ if chr == 'E'
+ seeking = 'I'
+ if WHITE_SPACE.include? prevchr
+ eisize = 3 # include whitespace in delimiter, i.e. drop from data
+ else # assume the EI immediately follows the data
+ eisize = 2 # leave prevchr in data
+ end
+ end
+ when 'I'
+ if chr == 'I'
+ seeking = ''
+ else
+ seeking = 'E'
+ end
+ when ''
+ if WHITE_SPACE.include? chr
+ eisize += 1 # Drop trailer
+ break
+ else
+ seeking = 'E'
+ end
end
+ prevchr = chr.is_a?(String) ? chr : ''
end
-
- str << NULL_BYTE if buffer.first == NULL_BYTE
-
- @tokens << string_token(str)
- @io.seek(-3, IO::SEEK_CUR) unless chr.nil?
+ unless seeking == ''
+ raise MalformedPDFError, "EI terminator not found"
+ end
+ eiend = @io.pos
+ @io.seek(idstart, IO::SEEK_SET)
+ str = @io.read(eiend - eisize - idstart) # get the ID content
+ @tokens << str.freeze if str
end
# if we're currently inside a hex string, read hex nibbles until
# we find a closing >
#
def prepare_hex_token
+ finished = :false
str = "".dup
- finished = false
- while !finished
+ until finished == :true
byte = @io.getbyte
if byte.nil?
- finished = true # unbalanced params
+ finished = :true # unbalanced params
elsif (48..57).include?(byte) || (65..90).include?(byte) || (97..122).include?(byte)
str << byte
elsif byte <= 32
@@ -264,7 +315,7 @@ class PDF::Reader
@tokens << str if str.size > 0
@tokens << ">" if byte != 0x3E # '>'
@tokens << byte.chr
- finished = true
+ finished = :true
end
end
end
@@ -311,14 +362,17 @@ class PDF::Reader
def prepare_regular_token
tok = "".dup
- while byte = @io.getbyte
+ loop do
+ byte = @io.getbyte
+
case byte
+ when nil
+ break
when 0x25
# comment, ignore everything until the next EOL char
- done = false
- while !done
- byte = @io.getbyte
- done = true if byte.nil? || byte == 0x0A || byte == 0x0D
+ loop do
+ commentbyte = @io.getbyte
+ break if commentbyte.nil? || commentbyte == 0x0A || commentbyte == 0x0D
end
when *TOKEN_WHITESPACE
# white space, token finished
@@ -388,15 +442,5 @@ class PDF::Reader
byte
end
- # for a handful of tokens we want to tell the parser how to convert them
- # into higher level tokens. This methods adds a to_token() method
- # to tokens that should remain as strings.
- #
- def string_token(token)
- def token.to_token
- to_s
- end
- token
- end
end
end
diff --git a/lib/pdf/reader/cid_widths.rb b/lib/pdf/reader/cid_widths.rb
index 7cf3dd2..2d98ee7 100644
--- a/lib/pdf/reader/cid_widths.rb
+++ b/lib/pdf/reader/cid_widths.rb
@@ -1,8 +1,7 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
-#
-
require 'forwardable'
class PDF::Reader
@@ -32,10 +31,10 @@ class PDF::Reader
params << array.shift
if params.size == 2 && params.last.is_a?(Array)
- widths.merge! parse_first_form(params.first, params.last)
+ widths.merge! parse_first_form(params.first.to_i, Array(params.last))
params = []
elsif params.size == 3
- widths.merge! parse_second_form(params[0], params[1], params[2])
+ widths.merge! parse_second_form(params[0].to_i, params[1].to_i, params[2].to_i)
params = []
end
end
@@ -53,6 +52,10 @@ class PDF::Reader
# this is the form 10 20 123 where all index between 10 and 20 have width 123
def parse_second_form(first, final, width)
+ if first > final
+ raise MalformedPDFError, "CidWidths: #{first} must be less than #{final}"
+ end
+
(first..final).inject({}) { |accum, index|
accum[index] = width
accum
diff --git a/lib/pdf/reader/cmap.rb b/lib/pdf/reader/cmap.rb
index 5f6de5b..dd758c6 100644
--- a/lib/pdf/reader/cmap.rb
+++ b/lib/pdf/reader/cmap.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
################################################################################
@@ -32,16 +33,17 @@ class PDF::Reader
# extracting various useful information.
#
class CMap # :nodoc:
+
CMAP_KEYWORDS = {
- "begincodespacerange" => 1,
- "endcodespacerange" => 1,
- "beginbfchar" => 1,
- "endbfchar" => 1,
- "beginbfrange" => 1,
- "endbfrange" => 1,
- "begin" => 1,
- "begincmap" => 1,
- "def" => 1
+ "begincodespacerange" => :noop,
+ "endcodespacerange" => :noop,
+ "beginbfchar" => :noop,
+ "endbfchar" => :noop,
+ "beginbfrange" => :noop,
+ "endbfrange" => :noop,
+ "begin" => :noop,
+ "begincmap" => :noop,
+ "def" => :noop
}
attr_reader :map
@@ -51,30 +53,6 @@ class PDF::Reader
process_data(data)
end
- def process_data(data)
- parser = build_parser(data)
- mode = nil
- instructions = []
-
- while token = parser.parse_token(CMAP_KEYWORDS)
- if token == "beginbfchar"
- mode = :char
- elsif token == "endbfchar"
- process_bfchar_instructions(instructions)
- instructions = []
- mode = nil
- elsif token == "beginbfrange"
- mode = :range
- elsif token == "endbfrange"
- process_bfrange_instructions(instructions)
- instructions = []
- mode = nil
- elsif mode == :char || mode == :range
- instructions << token
- end
- end
- end
-
def size
@map.size
end
@@ -84,13 +62,40 @@ class PDF::Reader
# Returns an array of Integers.
#
def decode(c)
- # TODO: implement the conversion
- return c unless Integer === c
- @map[c]
+ @map.fetch(c, [])
end
private
+ def process_data(data, initial_mode = :none)
+ parser = build_parser(data)
+ mode = initial_mode
+ instructions = []
+
+ while token = parser.parse_token(CMAP_KEYWORDS)
+ if token.is_a?(String) || token.is_a?(Array)
+ if token == "beginbfchar"
+ mode = :char
+ elsif token == "endbfchar"
+ process_bfchar_instructions(instructions)
+ instructions = []
+ mode = :none
+ elsif token == "beginbfrange"
+ mode = :range
+ elsif token == "endbfrange"
+ process_bfrange_instructions(instructions)
+ instructions = []
+ mode = :none
+ elsif mode == :char
+ instructions << token.to_s
+ elsif mode == :range
+ instructions << token
+ end
+ end
+ end
+ end
+
+
def build_parser(instructions)
buffer = Buffer.new(StringIO.new(instructions))
Parser.new(buffer)
@@ -105,7 +110,6 @@ class PDF::Reader
# exception when we try converting broken UTF-16 to UTF-8
#
def str_to_int(str)
- return nil if str.nil? || str.size == 0
unpacked_string = if str.bytesize == 1 # UTF-8
str.unpack("C*")
else # UTF-16
@@ -113,12 +117,15 @@ class PDF::Reader
end
result = []
while unpacked_string.any? do
- if unpacked_string.size >= 2 && unpacked_string[0] > 0xD800 && unpacked_string[0] < 0xDBFF
+ if unpacked_string.size >= 2 &&
+ unpacked_string.first.to_i > 0xD800 &&
+ unpacked_string.first.to_i < 0xDBFF
# this is a Unicode UTF-16 "Surrogate Pair" see Unicode Spec. Chapter 3.7
# lets convert to a UTF-32. (the high bit is between 0xD800-0xDBFF, the
# low bit is between 0xDC00-0xDFFF) for example: U+1D44E (U+D835 U+DC4E)
- points = [unpacked_string.shift, unpacked_string.shift]
- result << (points[0] - 0xD800) * 0x400 + (points[1] - 0xDC00) + 0x10000
+ point_one = unpacked_string.shift.to_i
+ point_two = unpacked_string.shift.to_i
+ result << (point_one - 0xD800) * 0x400 + (point_two - 0xDC00) + 0x10000
else
result << unpacked_string.shift
end
@@ -128,9 +135,11 @@ class PDF::Reader
def process_bfchar_instructions(instructions)
instructions.each_slice(2) do |one, two|
- find = str_to_int(one)
- replace = str_to_int(two)
- @map[find.first] = replace
+ find = str_to_int(one.to_s)
+ replace = str_to_int(two.to_s)
+ if find.any? && replace.any?
+ @map[find.first.to_i] = replace
+ end
end
end
@@ -141,30 +150,36 @@ class PDF::Reader
elsif start.kind_of?(String) && finish.kind_of?(String) && to.kind_of?(Array)
bfrange_type_two(start, finish, to)
else
- raise "invalid bfrange section"
+ raise MalformedPDFError, "invalid bfrange section"
end
end
end
def bfrange_type_one(start_code, end_code, dst)
- start_code = str_to_int(start_code)[0]
- end_code = str_to_int(end_code)[0]
+ start_code = str_to_int(start_code).first
+ end_code = str_to_int(end_code).first
dst = str_to_int(dst)
+ return if start_code.nil? || end_code.nil?
+
# add all values in the range to our mapping
(start_code..end_code).each_with_index do |val, idx|
- @map[val] = dst.length == 1 ? [dst[0] + idx] : [dst[0], dst[1] + 1]
+ @map[val] = dst.length == 1 ? [dst[0].to_i + idx] : [dst[0].to_i, dst[1].to_i + 1]
end
end
def bfrange_type_two(start_code, end_code, dst)
- start_code = str_to_int(start_code)[0]
- end_code = str_to_int(end_code)[0]
+ start_code = str_to_int(start_code).first
+ end_code = str_to_int(end_code).first
+
+ return if start_code.nil? || end_code.nil?
+
from_range = (start_code..end_code)
# add all values in the range to our mapping
from_range.each_with_index do |val, idx|
- @map[val] = str_to_int(dst[idx])
+ dst_char = dst[idx]
+ @map[val.to_i] = str_to_int(dst_char) if dst_char
end
end
end
diff --git a/lib/pdf/reader/encoding.rb b/lib/pdf/reader/encoding.rb
index 5f7faad..8cb0327 100644
--- a/lib/pdf/reader/encoding.rb
+++ b/lib/pdf/reader/encoding.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
################################################################################
@@ -68,16 +69,16 @@ class PDF::Reader
#
# [25, :A, :B]
def differences=(diff)
- raise ArgumentError, "diff must be an array" unless diff.kind_of?(Array)
+ PDF::Reader::Error.validate_type(diff, "diff", Array)
@differences = {}
byte = 0
diff.each do |val|
if val.kind_of?(Numeric)
byte = val.to_i
- else
+ elsif codepoint = glyphlist.name_to_unicode(val)
@differences[byte] = val
- @mapping[byte] = glyphlist.name_to_unicode(val)
+ @mapping[byte] = codepoint
byte += 1
end
end
@@ -166,7 +167,7 @@ class PDF::Reader
end
def convert_to_utf8(str)
- ret = str.unpack(unpack).map! { |c| @mapping[c] || c }.pack("U*")
+ ret = str.unpack(unpack).map! { |c| @mapping[c.to_i] || c }.pack("U*")
ret.force_encoding("UTF-8")
ret
end
@@ -208,7 +209,7 @@ class PDF::Reader
def load_mapping(file)
File.open(file, "r:BINARY") do |f|
f.each do |l|
- _m, single_byte, unicode = *l.match(/([0-9A-Za-z]+);([0-9A-F]{4})/)
+ _m, single_byte, unicode = *l.match(/\A([0-9A-Za-z]+);([0-9A-F]{4})/)
@mapping["0x#{single_byte}".hex] = "0x#{unicode}".hex if single_byte
end
end
diff --git a/lib/pdf/reader/error.rb b/lib/pdf/reader/error.rb
index b6bea64..aa2ffd8 100644
--- a/lib/pdf/reader/error.rb
+++ b/lib/pdf/reader/error.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
################################################################################
@@ -33,19 +34,30 @@ class PDF::Reader
def self.str_assert(lvalue, rvalue, chars=nil)
raise MalformedPDFError, "PDF malformed, expected string but found #{lvalue.class} instead" if chars and !lvalue.kind_of?(String)
lvalue = lvalue[0,chars] if chars
- raise MalformedPDFError, "PDF malformed, expected '#{rvalue}' but found #{lvalue} instead" if lvalue != rvalue
+ raise MalformedPDFError, "PDF malformed, expected '#{rvalue}' but found '#{lvalue}' instead" if lvalue != rvalue
end
################################################################################
def self.str_assert_not(lvalue, rvalue, chars=nil)
raise MalformedPDFError, "PDF malformed, expected string but found #{lvalue.class} instead" if chars and !lvalue.kind_of?(String)
lvalue = lvalue[0,chars] if chars
- raise MalformedPDFError, "PDF malformed, expected '#{rvalue}' but found #{lvalue} instead" if lvalue == rvalue
+ raise MalformedPDFError, "PDF malformed, expected '#{rvalue}' but found '#{lvalue}' instead" if lvalue == rvalue
end
################################################################################
def self.assert_equal(lvalue, rvalue)
- raise MalformedPDFError, "PDF malformed, expected #{rvalue} but found #{lvalue} instead" if lvalue != rvalue
+ raise MalformedPDFError, "PDF malformed, expected '#{rvalue}' but found '#{lvalue}' instead" if lvalue != rvalue
end
################################################################################
+ def self.validate_type(object, name, klass)
+ raise ArgumentError, "#{name} (#{object}) must be a #{klass}" unless object.is_a?(klass)
+ end
+ ################################################################################
+ def self.validate_type_as_malformed(object, name, klass)
+ raise MalformedPDFError, "#{name} (#{object}) must be a #{klass}" unless object.is_a?(klass)
+ end
+ ################################################################################
+ def self.validate_not_nil(object, name)
+ raise ArgumentError, "#{object} must not be nil" if object.nil?
+ end
end
################################################################################
diff --git a/lib/pdf/reader/filter.rb b/lib/pdf/reader/filter.rb
index ecc9091..c2d899d 100644
--- a/lib/pdf/reader/filter.rb
+++ b/lib/pdf/reader/filter.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
################################################################################
@@ -41,17 +42,16 @@ class PDF::Reader
# returned untouched. At this stage PDF::Reader has no need to decode images.
#
def self.with(name, options = {})
- case name.to_sym
- when :ASCII85Decode then PDF::Reader::Filter::Ascii85.new(options)
- when :ASCIIHexDecode then PDF::Reader::Filter::AsciiHex.new(options)
- when :CCITTFaxDecode then PDF::Reader::Filter::Null.new(options)
- when :DCTDecode then PDF::Reader::Filter::Null.new(options)
- when :FlateDecode then PDF::Reader::Filter::Flate.new(options)
- when :Fl then PDF::Reader::Filter::Flate.new(options)
- when :JBIG2Decode then PDF::Reader::Filter::Null.new(options)
- when :JPXDecode then PDF::Reader::Filter::Null.new(options)
- when :LZWDecode then PDF::Reader::Filter::Lzw.new(options)
- when :RunLengthDecode then PDF::Reader::Filter::RunLength.new(options)
+ case name
+ when :ASCII85Decode, :A85 then PDF::Reader::Filter::Ascii85.new(options)
+ when :ASCIIHexDecode, :AHx then PDF::Reader::Filter::AsciiHex.new(options)
+ when :CCITTFaxDecode, :CCF then PDF::Reader::Filter::Null.new(options)
+ when :DCTDecode, :DCT then PDF::Reader::Filter::Null.new(options)
+ when :FlateDecode, :Fl then PDF::Reader::Filter::Flate.new(options)
+ when :JBIG2Decode then PDF::Reader::Filter::Null.new(options)
+ when :JPXDecode then PDF::Reader::Filter::Null.new(options)
+ when :LZWDecode, :LZW then PDF::Reader::Filter::Lzw.new(options)
+ when :RunLengthDecode, :RL then PDF::Reader::Filter::RunLength.new(options)
else
raise UnsupportedFeatureError, "Unknown filter: #{name}"
end
diff --git a/lib/pdf/reader/filter/ascii85.rb b/lib/pdf/reader/filter/ascii85.rb
index 1986f72..ac91a63 100644
--- a/lib/pdf/reader/filter/ascii85.rb
+++ b/lib/pdf/reader/filter/ascii85.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
require 'ascii85'
@@ -7,6 +8,7 @@ class PDF::Reader
module Filter # :nodoc:
# implementation of the Ascii85 filter
class Ascii85
+
def initialize(options = {})
@options = options
end
@@ -17,7 +19,11 @@ class PDF::Reader
#
def filter(data)
data = "<~#{data}" unless data.to_s[0,2] == "<~"
- ::Ascii85::decode(data)
+ if defined?(::Ascii85Native)
+ ::Ascii85Native::decode(data)
+ else
+ ::Ascii85::decode(data)
+ end
rescue Exception => e
# Oops, there was a problem decoding the stream
raise MalformedPDFError,
diff --git a/lib/pdf/reader/filter/ascii_hex.rb b/lib/pdf/reader/filter/ascii_hex.rb
index 0d06468..efe0836 100644
--- a/lib/pdf/reader/filter/ascii_hex.rb
+++ b/lib/pdf/reader/filter/ascii_hex.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
#
@@ -6,6 +7,7 @@ class PDF::Reader
module Filter # :nodoc:
# implementation of the AsciiHex stream filter
class AsciiHex
+
def initialize(options = {})
@options = options
end
@@ -16,9 +18,12 @@ class PDF::Reader
def filter(data)
data.chop! if data[-1,1] == ">"
data = data[1,data.size] if data[0,1] == "<"
+
+ return "" if data.nil?
+
data.gsub!(/[^A-Fa-f0-9]/,"")
data << "0" if data.size % 2 == 1
- data.scan(/.{2}/).map { |s| s.hex.chr }.join("")
+ data.scan(/.{2}/).flatten.map { |s| s.hex.chr }.join("")
rescue Exception => e
# Oops, there was a problem decoding the stream
raise MalformedPDFError,
diff --git a/lib/pdf/reader/filter/depredict.rb b/lib/pdf/reader/filter/depredict.rb
index d86431e..52d469b 100644
--- a/lib/pdf/reader/filter/depredict.rb
+++ b/lib/pdf/reader/filter/depredict.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
class PDF::Reader
@@ -6,8 +7,9 @@ class PDF::Reader
# some filter implementations support preprocessing of the data to
# improve compression
class Depredict
+
def initialize(options = {})
- @options = options || {}
+ @options = options
end
################################################################################
@@ -34,7 +36,7 @@ class PDF::Reader
################################################################################
def tiff_depredict(data)
data = data.unpack("C*")
- unfiltered = []
+ unfiltered = ''
bpc = @options[:BitsPerComponent] || 8
pixel_bits = bpc * @options[:Colors]
pixel_bytes = pixel_bits / 8
@@ -51,11 +53,11 @@ class PDF::Reader
left = index < pixel_bytes ? 0 : row_data[index - pixel_bytes]
row_data[index] = (byte + left) % 256
end
- unfiltered += row_data
+ unfiltered += row_data.pack("C*")
pos += line_len
end
- unfiltered.pack("C*")
+ unfiltered
end
################################################################################
def png_depredict(data)
@@ -67,7 +69,7 @@ class PDF::Reader
scanline_length = (pixel_bytes * @options[:Columns]) + 1
row = 0
pixels = []
- paeth, pa, pb, pc = nil
+ paeth, pa, pb, pc = 0, 0, 0, 0
until data.empty? do
row_data = data.slice! 0, scanline_length
filter = row_data.shift
@@ -94,17 +96,17 @@ class PDF::Reader
row_data[index] = (byte + ((left + upper)/2).floor) % 256
end
when 4 # Paeth
- left = upper = upper_left = nil
+ left = upper = upper_left = 0
row_data.each_with_index do |byte, index|
col = index / pixel_bytes
- left = index < pixel_bytes ? 0 : row_data[index - pixel_bytes]
+ left = index < pixel_bytes ? 0 : Integer(row_data[index - pixel_bytes])
if row.zero?
upper = upper_left = 0
else
- upper = pixels[row-1][col][index % pixel_bytes]
+ upper = Integer(pixels[row-1][col][index % pixel_bytes])
upper_left = col.zero? ? 0 :
- pixels[row-1][col-1][index % pixel_bytes]
+ Integer(pixels[row-1][col-1][index % pixel_bytes])
end
p = left + upper - upper_left
@@ -123,7 +125,7 @@ class PDF::Reader
row_data[index] = (byte + paeth) % 256
end
else
- raise ArgumentError, "Invalid filter algorithm #{filter}"
+ raise MalformedPDFError, "Invalid filter algorithm #{filter}"
end
s = []
diff --git a/lib/pdf/reader/filter/flate.rb b/lib/pdf/reader/filter/flate.rb
index 95092a7..2047bfe 100644
--- a/lib/pdf/reader/filter/flate.rb
+++ b/lib/pdf/reader/filter/flate.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
@@ -8,7 +9,9 @@ class PDF::Reader
module Filter # :nodoc:
# implementation of the Flate (zlib) stream filter
class Flate
+
ZLIB_AUTO_DETECT_ZLIB_OR_GZIP = 47 # Zlib::MAX_WBITS + 32
+ ZLIB_RAW_DEFLATE = -15 # Zlib::MAX_WBITS * -1
def initialize(options = {})
@options = options
@@ -17,24 +20,34 @@ class PDF::Reader
################################################################################
# Decode the specified data with the Zlib compression algorithm
def filter(data)
- deflated = nil
+ deflated = zlib_inflate(data) || zlib_inflate(data[0, data.bytesize-1])
+
+ if deflated.nil?
+ raise MalformedPDFError,
+ "Error while inflating a compressed stream (no suitable inflation algorithm found)"
+ end
+ Depredict.new(@options).filter(deflated)
+ end
+
+ private
+
+ def zlib_inflate(data)
begin
- deflated = Zlib::Inflate.new(ZLIB_AUTO_DETECT_ZLIB_OR_GZIP).inflate(data)
- rescue Zlib::DataError => e
+ return Zlib::Inflate.new(ZLIB_AUTO_DETECT_ZLIB_OR_GZIP).inflate(data)
+ rescue Zlib::Error
# by default, Ruby's Zlib assumes the data it's inflating
# is RFC1951 deflated data, wrapped in a RFC1950 zlib container. If that
- # fails, then use a lightly-documented 'feature' to attempt to inflate
- # the data as a raw RFC1951 stream.
- #
- # See
- # - http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/243545
- deflated = Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate(data)
+ # fails, swallow the exception and attempt to inflate the data as a raw
+ # RFC1951 stream.
end
- Depredict.new(@options).filter(deflated)
- rescue Exception => e
- # Oops, there was a problem inflating the stream
- raise MalformedPDFError,
- "Error occured while inflating a compressed stream (#{e.class.to_s}: #{e.to_s})"
+
+ begin
+ return Zlib::Inflate.new(ZLIB_RAW_DEFLATE).inflate(data)
+ rescue Zlib::Error
+ # swallow this one too, so we can try some other fallback options
+ end
+
+ nil
end
end
end
diff --git a/lib/pdf/reader/filter/lzw.rb b/lib/pdf/reader/filter/lzw.rb
index f987c47..3c7ded0 100644
--- a/lib/pdf/reader/filter/lzw.rb
+++ b/lib/pdf/reader/filter/lzw.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
#
@@ -6,6 +7,7 @@ class PDF::Reader
module Filter # :nodoc:
# implementation of the LZW stream filter
class Lzw
+
def initialize(options = {})
@options = options
end
diff --git a/lib/pdf/reader/filter/null.rb b/lib/pdf/reader/filter/null.rb
index a9564d0..62354be 100644
--- a/lib/pdf/reader/filter/null.rb
+++ b/lib/pdf/reader/filter/null.rb
@@ -1,7 +1,7 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
-#
class PDF::Reader
module Filter # :nodoc:
# implementation of the null stream filter
diff --git a/lib/pdf/reader/filter/run_length.rb b/lib/pdf/reader/filter/run_length.rb
index 9a39772..89b865c 100644
--- a/lib/pdf/reader/filter/run_length.rb
+++ b/lib/pdf/reader/filter/run_length.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
#
@@ -6,6 +7,7 @@ class PDF::Reader # :nodoc:
module Filter # :nodoc:
# implementation of the run length stream filter
class RunLength
+
def initialize(options = {})
@options = options
end
@@ -20,19 +22,23 @@ class PDF::Reader # :nodoc:
length = data.getbyte(pos)
pos += 1
- case
- when length == 128
- break
- when length < 128
- # When the length is < 128, we copy the following length+1 bytes
- # literally.
- out << data[pos, length + 1]
- pos += length
- else
- # When the length is > 128, we copy the next byte (257 - length)
- # times; i.e., "\xFA\x00" ([250, 0]) will expand to
- # "\x00\x00\x00\x00\x00\x00\x00".
- out << data[pos, 1] * (257 - length)
+ unless length.nil?
+ case
+ # nothing
+ when length == 128
+ break
+ when length < 128
+ # When the length is < 128, we copy the following length+1 bytes
+ # literally.
+ out << data[pos, length + 1]
+ pos += length
+ else
+ # When the length is > 128, we copy the next byte (257 - length)
+ # times; i.e., "\xFA\x00" ([250, 0]) will expand to
+ # "\x00\x00\x00\x00\x00\x00\x00".
+ previous_byte = data[pos, 1] || ""
+ out << previous_byte * (257 - length)
+ end
end
pos += 1
diff --git a/lib/pdf/reader/font.rb b/lib/pdf/reader/font.rb
index 17cab92..e18e891 100644
--- a/lib/pdf/reader/font.rb
+++ b/lib/pdf/reader/font.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: true
# frozen_string_literal: true
################################################################################
@@ -42,6 +43,7 @@ class PDF::Reader
@tounicode = nil
extract_base_info(obj)
+ extract_type3_info(obj)
extract_descriptor(obj)
extract_descendants(obj)
@width_calc = build_width_calculator
@@ -72,8 +74,44 @@ class PDF::Reader
@cached_widths[code_point] ||= @width_calc.glyph_width(code_point)
end
+ # In most cases glyph width is converted into text space with a simple divide by 1000.
+ #
+ # However, Type3 fonts provide their own FontMatrix that's used for the transformation.
+ #
+ def glyph_width_in_text_space(code_point)
+ glyph_width_in_glyph_space = glyph_width(code_point)
+
+ if @subtype == :Type3
+ x1, y1 = font_matrix_transform(0,0)
+ x2, y2 = font_matrix_transform(glyph_width_in_glyph_space, 0)
+ (x2 - x1).abs.round(2)
+ else
+ glyph_width_in_glyph_space / 1000.0
+ end
+ end
+
private
+ # Only valid for Type3 fonts
+ def font_matrix_transform(x, y)
+ return x, y if @font_matrix.nil?
+
+ matrix = TransformationMatrix.new(
+ @font_matrix[0], @font_matrix[1],
+ @font_matrix[2], @font_matrix[3],
+ @font_matrix[4], @font_matrix[5],
+ )
+
+ if x == 0 && y == 0
+ [matrix.e, matrix.f]
+ else
+ [
+ (matrix.a * x) + (matrix.c * y) + (matrix.e),
+ (matrix.b * x) + (matrix.d * y) + (matrix.f)
+ ]
+ end
+ end
+
def default_encoding(font_name)
case font_name.to_s
when "Symbol" then
@@ -111,37 +149,55 @@ class PDF::Reader
end
end
- def extract_base_info(obj)
- @subtype = @ohash.object(obj[:Subtype])
- @basefont = @ohash.object(obj[:BaseFont])
- if @ohash.object(obj[:Encoding])
- @encoding = PDF::Reader::Encoding.new(@ohash.object(obj[:Encoding]))
+ def build_encoding(obj)
+ if obj[:Encoding].is_a?(Symbol)
+ # one of the standard encodings, referenced by name
+ # TODO pass in a standard shape, always a Hash
+ PDF::Reader::Encoding.new(obj[:Encoding])
+ elsif obj[:Encoding].is_a?(Hash) || obj[:Encoding].is_a?(PDF::Reader::Stream)
+ PDF::Reader::Encoding.new(obj[:Encoding])
+ elsif obj[:Encoding].nil?
+ default_encoding(@basefont)
else
- @encoding = default_encoding(@basefont)
+ raise MalformedPDFError, "Unexpected type for Encoding (#{obj[:Encoding].class})"
end
- @widths = @ohash.object(obj[:Widths]) || []
- @first_char = @ohash.object(obj[:FirstChar])
- @last_char = @ohash.object(obj[:LastChar])
+ end
+
+ def extract_base_info(obj)
+ @subtype = @ohash.deref_name(obj[:Subtype])
+ @basefont = @ohash.deref_name(obj[:BaseFont])
+ @encoding = build_encoding(obj)
+ @widths = @ohash.deref_array_of_numbers(obj[:Widths]) || []
+ @first_char = @ohash.deref_integer(obj[:FirstChar])
+ @last_char = @ohash.deref_integer(obj[:LastChar])
# CID Fonts are not required to have a W or DW entry, if they don't exist,
# the default cid width = 1000, see Section 9.7.4.1 PDF 32000-1:2008 pp 269
- @cid_widths = @ohash.object(obj[:W]) || []
- @cid_default_width = @ohash.object(obj[:DW]) || 1000
+ @cid_widths = @ohash.deref_array(obj[:W]) || []
+ @cid_default_width = @ohash.deref_number(obj[:DW]) || 1000
if obj[:ToUnicode]
# ToUnicode is optional for Type1 and Type3
- stream = @ohash.object(obj[:ToUnicode])
- if stream.is_a?(PDF::Reader::Stream)
+ stream = @ohash.deref_stream(obj[:ToUnicode])
+ if stream
@tounicode = PDF::Reader::CMap.new(stream.unfiltered_data)
end
end
end
+ def extract_type3_info(obj)
+ if @subtype == :Type3
+ @font_matrix = @ohash.deref_array_of_numbers(obj[:FontMatrix]) || [
+ 0.001, 0, 0, 0.001, 0, 0
+ ]
+ end
+ end
+
def extract_descriptor(obj)
if obj[:FontDescriptor]
# create a font descriptor object if we can, in other words, unless this is
# a CID Font
- fd = @ohash.object(obj[:FontDescriptor])
+ fd = @ohash.deref_hash(obj[:FontDescriptor])
@font_descriptor = PDF::Reader::FontDescriptor.new(@ohash, fd)
else
@font_descriptor = nil
@@ -149,14 +205,17 @@ class PDF::Reader
end
def extract_descendants(obj)
- return unless obj[:DescendantFonts]
# per PDF 32000-1:2008 pp. 280 :DescendentFonts is:
# A one-element array specifying the CIDFont dictionary that is the
# descendant of this Type 0 font.
- descendants = @ohash.object(obj[:DescendantFonts])
- @descendantfonts = descendants.map { |desc|
- PDF::Reader::Font.new(@ohash, @ohash.object(desc))
- }
+ if obj[:DescendantFonts]
+ descendants = @ohash.deref_array(obj[:DescendantFonts])
+ @descendantfonts = descendants.map { |desc|
+ PDF::Reader::Font.new(@ohash, @ohash.deref_hash(desc))
+ }
+ else
+ @descendantfonts = []
+ end
end
def to_utf8_via_cmap(params)
@@ -170,9 +229,7 @@ class PDF::Reader
@tounicode.decode(c) || PDF::Reader::Encoding::UNKNOWN_CHAR
}.flatten.pack("U*")
when Array
- params.collect { |param| to_utf8_via_cmap(param) }
- else
- params
+ params.collect { |param| to_utf8_via_cmap(param) }.join("")
end
end
@@ -187,9 +244,7 @@ class PDF::Reader
when String
encoding.to_utf8(params)
when Array
- params.collect { |param| to_utf8_via_encoding(param) }
- else
- params
+ params.collect { |param| to_utf8_via_encoding(param) }.join("")
end
end
diff --git a/lib/pdf/reader/font_descriptor.rb b/lib/pdf/reader/font_descriptor.rb
index 1f22aa7..d2f4db2 100644
--- a/lib/pdf/reader/font_descriptor.rb
+++ b/lib/pdf/reader/font_descriptor.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: true
# frozen_string_literal: true
require 'ttfunk'
@@ -14,22 +15,23 @@ class PDF::Reader
:x_height, :font_flags
def initialize(ohash, fd_hash)
- @ascent = ohash.object(fd_hash[:Ascent]) || 0
- @descent = ohash.object(fd_hash[:Descent]) || 0
- @missing_width = ohash.object(fd_hash[:MissingWidth]) || 0
- @font_bounding_box = ohash.object(fd_hash[:FontBBox]) || [0,0,0,0]
- @avg_width = ohash.object(fd_hash[:AvgWidth]) || 0
- @cap_height = ohash.object(fd_hash[:CapHeight]) || 0
- @font_flags = ohash.object(fd_hash[:Flags]) || 0
- @italic_angle = ohash.object(fd_hash[:ItalicAngle])
- @font_name = ohash.object(fd_hash[:FontName]).to_s
- @leading = ohash.object(fd_hash[:Leading]) || 0
- @max_width = ohash.object(fd_hash[:MaxWidth]) || 0
- @stem_v = ohash.object(fd_hash[:StemV])
- @x_height = ohash.object(fd_hash[:XHeight])
- @font_stretch = ohash.object(fd_hash[:FontStretch]) || :Normal
- @font_weight = ohash.object(fd_hash[:FontWeight]) || 400
- @font_family = ohash.object(fd_hash[:FontFamily])
+ # TODO change these to typed derefs
+ @ascent = ohash.deref_number(fd_hash[:Ascent]) || 0
+ @descent = ohash.deref_number(fd_hash[:Descent]) || 0
+ @missing_width = ohash.deref_number(fd_hash[:MissingWidth]) || 0
+ @font_bounding_box = ohash.deref_array_of_numbers(fd_hash[:FontBBox]) || [0,0,0,0]
+ @avg_width = ohash.deref_number(fd_hash[:AvgWidth]) || 0
+ @cap_height = ohash.deref_number(fd_hash[:CapHeight]) || 0
+ @font_flags = ohash.deref_integer(fd_hash[:Flags]) || 0
+ @italic_angle = ohash.deref_number(fd_hash[:ItalicAngle])
+ @font_name = ohash.deref_name(fd_hash[:FontName]).to_s
+ @leading = ohash.deref_number(fd_hash[:Leading]) || 0
+ @max_width = ohash.deref_number(fd_hash[:MaxWidth]) || 0
+ @stem_v = ohash.deref_number(fd_hash[:StemV])
+ @x_height = ohash.deref_number(fd_hash[:XHeight])
+ @font_stretch = ohash.deref_name(fd_hash[:FontStretch]) || :Normal
+ @font_weight = ohash.deref_number(fd_hash[:FontWeight]) || 400
+ @font_family = ohash.deref_string(fd_hash[:FontFamily])
# A FontDescriptor may have an embedded font program in FontFile
# (Type 1 Font Program), FontFile2 (TrueType font program), or
@@ -39,7 +41,7 @@ class PDF::Reader
# 2) CIDFontType0C: Type 0 Font Program in Compact Font Format
# 3) OpenType: OpenType Font Program
# see Section 9.9, PDF 32000-1:2008, pp 288-292
- @font_program_stream = ohash.object(fd_hash[:FontFile2])
+ @font_program_stream = ohash.deref_stream(fd_hash[:FontFile2])
#TODO handle FontFile and FontFile3
@is_ttf = true if @font_program_stream
@@ -54,7 +56,9 @@ class PDF::Reader
end
char_metric = ttf_program_stream.horizontal_metrics.metrics[glyph_id]
if char_metric
- return char_metric.advance_width
+ char_metric.advance_width
+ else
+ 0
end
end
end
diff --git a/lib/pdf/reader/form_xobject.rb b/lib/pdf/reader/form_xobject.rb
index 6572fe2..90c49df 100644
--- a/lib/pdf/reader/form_xobject.rb
+++ b/lib/pdf/reader/form_xobject.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: true
# frozen_string_literal: true
require 'digest/md5'
@@ -14,15 +15,24 @@ module PDF
# This behaves and looks much like a limited PDF::Reader::Page class.
#
class FormXObject
- include ResourceMethods
+ extend Forwardable
attr_reader :xobject
+ def_delegators :resources, :color_spaces
+ def_delegators :resources, :fonts
+ def_delegators :resources, :graphic_states
+ def_delegators :resources, :patterns
+ def_delegators :resources, :procedure_sets
+ def_delegators :resources, :properties
+ def_delegators :resources, :shadings
+ def_delegators :resources, :xobjects
+
def initialize(page, xobject, options = {})
@page = page
@objects = page.objects
@cache = options[:cache] || {}
- @xobject = @objects.deref(xobject)
+ @xobject = @objects.deref_stream(xobject)
end
# return a hash of fonts used on this form.
@@ -33,9 +43,9 @@ module PDF
# to most available metrics for each font.
#
def font_objects
- raw_fonts = @objects.deref(resources[:Font] || {})
+ raw_fonts = @objects.deref_hash(fonts)
::Hash[raw_fonts.map { |label, font|
- [label, PDF::Reader::Font.new(@objects, @objects.deref(font))]
+ [label, PDF::Reader::Font.new(@objects, @objects.deref_hash(font) || {})]
}]
end
@@ -45,6 +55,9 @@ module PDF
# See the comments on PDF::Reader::Page#walk for more detail.
#
def walk(*receivers)
+ receivers = receivers.map { |receiver|
+ ValidatingReceiver.new(receiver)
+ }
content_stream(receivers, raw_content)
end
@@ -60,7 +73,7 @@ module PDF
# Returns the resources that accompany this form.
#
def resources
- @resources ||= @objects.deref(@xobject.hash[:Resources]) || {}
+ @resources ||= Resources.new(@objects, @objects.deref_hash(@xobject.hash[:Resources]) || {})
end
def callback(receivers, name, params=[])
diff --git a/lib/pdf/reader/glyph_hash.rb b/lib/pdf/reader/glyph_hash.rb
index 1df113e..a3c67b4 100644
--- a/lib/pdf/reader/glyph_hash.rb
+++ b/lib/pdf/reader/glyph_hash.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
################################################################################
@@ -32,10 +33,18 @@ class PDF::Reader
#
class GlyphHash # :nodoc:
def initialize
+ @@by_codepoint_cache ||= nil
+ @@by_name_cache ||= nil
+
# only parse the glyph list once, and cache the results (for performance)
- adobe = @@cache ||= load_adobe_glyph_mapping
- @by_name = adobe.first
- @by_codepoint = adobe.last
+ if @@by_codepoint_cache != nil && @@by_name_cache != nil
+ @by_name = @@by_name_cache
+ @by_codepoint = @@by_codepoint_cache
+ else
+ by_name, by_codepoint = load_adobe_glyph_mapping
+ @by_name = @@by_name_cache ||= by_name
+ @by_codepoint = @@by_codepoint_cache ||= by_codepoint
+ end
end
# attempt to convert a PDF Name to a unicode codepoint. Returns nil
@@ -103,24 +112,30 @@ class PDF::Reader
# returns a hash that maps glyph names to unicode codepoints. The mapping is based on
# a text file supplied by Adobe at:
- # http://www.adobe.com/devnet/opentype/archives/glyphlist.txt
+ # https://github.com/adobe-type-tools/agl-aglfn
def load_adobe_glyph_mapping
keyed_by_name = {}
keyed_by_codepoint = {}
- File.open(File.dirname(__FILE__) + "/glyphlist.txt", "r:BINARY") do |f|
- f.each do |l|
- _m, name, code = *l.match(/([0-9A-Za-z]+);([0-9A-F]{4})/)
- if name && code
- cp = "0x#{code}".hex
- keyed_by_name[name.to_sym] = cp
- keyed_by_codepoint[cp] ||= []
- keyed_by_codepoint[cp] << name.to_sym
+ paths = [
+ File.dirname(__FILE__) + "/glyphlist.txt",
+ File.dirname(__FILE__) + "/glyphlist-zapfdingbats.txt",
+ ]
+ paths.each do |path|
+ File.open(path, "r:BINARY") do |f|
+ f.each do |l|
+ _m, name, code = *l.match(/([0-9A-Za-z]+);([0-9A-F]{4})/)
+ if name && code
+ cp = "0x#{code}".hex
+ keyed_by_name[name.to_sym] = cp
+ keyed_by_codepoint[cp] ||= []
+ keyed_by_codepoint[cp] << name.to_sym
+ end
end
end
end
- [keyed_by_name.freeze, keyed_by_codepoint.freeze]
+ return keyed_by_name.freeze, keyed_by_codepoint.freeze
end
end
diff --git a/lib/pdf/reader/glyphlist-zapfdingbats.txt b/lib/pdf/reader/glyphlist-zapfdingbats.txt
new file mode 100644
index 0000000..ab52700
--- /dev/null
+++ b/lib/pdf/reader/glyphlist-zapfdingbats.txt
@@ -0,0 +1,245 @@
+# -----------------------------------------------------------
+# Copyright 2002-2019 Adobe (http://www.adobe.com/).
+#
+# Redistribution and use in source and binary forms, with or
+# without modification, are permitted provided that the
+# following conditions are met:
+#
+# Redistributions of source code must retain the above
+# copyright notice, this list of conditions and the following
+# disclaimer.
+#
+# Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials
+# provided with the distribution.
+#
+# Neither the name of Adobe nor the names of its contributors
+# may be used to endorse or promote products derived from this
+# software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# -----------------------------------------------------------
+# Name: ITC Zapf Dingbats Glyph List
+# Table version: 2.0
+# Date: September 20, 2002
+# URL: https://github.com/adobe-type-tools/agl-aglfn
+#
+# Format: two semicolon-delimited fields:
+# (1) glyph name--upper/lowercase letters and digits
+# (2) Unicode scalar value--four uppercase hexadecimal digits
+#
+a100;275E
+a101;2761
+a102;2762
+a103;2763
+a104;2764
+a105;2710
+a106;2765
+a107;2766
+a108;2767
+a109;2660
+a10;2721
+a110;2665
+a111;2666
+a112;2663
+a117;2709
+a118;2708
+a119;2707
+a11;261B
+a120;2460
+a121;2461
+a122;2462
+a123;2463
+a124;2464
+a125;2465
+a126;2466
+a127;2467
+a128;2468
+a129;2469
+a12;261E
+a130;2776
+a131;2777
+a132;2778
+a133;2779
+a134;277A
+a135;277B
+a136;277C
+a137;277D
+a138;277E
+a139;277F
+a13;270C
+a140;2780
+a141;2781
+a142;2782
+a143;2783
+a144;2784
+a145;2785
+a146;2786
+a147;2787
+a148;2788
+a149;2789
+a14;270D
+a150;278A
+a151;278B
+a152;278C
+a153;278D
+a154;278E
+a155;278F
+a156;2790
+a157;2791
+a158;2792
+a159;2793
+a15;270E
+a160;2794
+a161;2192
+a162;27A3
+a163;2194
+a164;2195
+a165;2799
+a166;279B
+a167;279C
+a168;279D
+a169;279E
+a16;270F
+a170;279F
+a171;27A0
+a172;27A1
+a173;27A2
+a174;27A4
+a175;27A5
+a176;27A6
+a177;27A7
+a178;27A8
+a179;27A9
+a17;2711
+a180;27AB
+a181;27AD
+a182;27AF
+a183;27B2
+a184;27B3
+a185;27B5
+a186;27B8
+a187;27BA
+a188;27BB
+a189;27BC
+a18;2712
+a190;27BD
+a191;27BE
+a192;279A
+a193;27AA
+a194;27B6
+a195;27B9
+a196;2798
+a197;27B4
+a198;27B7
+a199;27AC
+a19;2713
+a1;2701
+a200;27AE
+a201;27B1
+a202;2703
+a203;2750
+a204;2752
+a205;276E
+a206;2770
+a20;2714
+a21;2715
+a22;2716
+a23;2717
+a24;2718
+a25;2719
+a26;271A
+a27;271B
+a28;271C
+a29;2722
+a2;2702
+a30;2723
+a31;2724
+a32;2725
+a33;2726
+a34;2727
+a35;2605
+a36;2729
+a37;272A
+a38;272B
+a39;272C
+a3;2704
+a40;272D
+a41;272E
+a42;272F
+a43;2730
+a44;2731
+a45;2732
+a46;2733
+a47;2734
+a48;2735
+a49;2736
+a4;260E
+a50;2737
+a51;2738
+a52;2739
+a53;273A
+a54;273B
+a55;273C
+a56;273D
+a57;273E
+a58;273F
+a59;2740
+a5;2706
+a60;2741
+a61;2742
+a62;2743
+a63;2744
+a64;2745
+a65;2746
+a66;2747
+a67;2748
+a68;2749
+a69;274A
+a6;271D
+a70;274B
+a71;25CF
+a72;274D
+a73;25A0
+a74;274F
+a75;2751
+a76;25B2
+a77;25BC
+a78;25C6
+a79;2756
+a7;271E
+a81;25D7
+a82;2758
+a83;2759
+a84;275A
+a85;276F
+a86;2771
+a87;2772
+a88;2773
+a89;2768
+a8;271F
+a90;2769
+a91;276C
+a92;276D
+a93;276A
+a94;276B
+a95;2774
+a96;2775
+a97;275B
+a98;275C
+a99;275D
+a9;2720
+# END
diff --git a/lib/pdf/reader/key_builder_v5.rb b/lib/pdf/reader/key_builder_v5.rb
new file mode 100644
index 0000000..c94f8e7
--- /dev/null
+++ b/lib/pdf/reader/key_builder_v5.rb
@@ -0,0 +1,138 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+require 'digest/md5'
+require 'rc4'
+
+class PDF::Reader
+
+ # Processes the Encrypt dict from an encrypted PDF and a user provided
+ # password and returns a key that can decrypt the file.
+ #
+ # This can generate a decryption key compatible with the following standard encryption algorithms:
+ #
+ # * Version 5 (AESV3)
+ #
+ class KeyBuilderV5
+
+ def initialize(opts = {})
+ @key_length = 256
+
+ # hash(32B) + validation salt(8B) + key salt(8B)
+ @owner_key = opts[:owner_key] || ""
+
+ # hash(32B) + validation salt(8B) + key salt(8B)
+ @user_key = opts[:user_key] || ""
+
+ # decryption key, encrypted w/ owner password
+ @owner_encryption_key = opts[:owner_encryption_key] || ""
+
+ # decryption key, encrypted w/ user password
+ @user_encryption_key = opts[:user_encryption_key] || ""
+ end
+
+ # Takes a string containing a user provided password.
+ #
+ # If the password matches the file, then a string containing a key suitable for
+ # decrypting the file will be returned. If the password doesn't match the file,
+ # and exception will be raised.
+ #
+ def key(pass)
+ pass = pass.byteslice(0...127).to_s # UTF-8 encoded password. first 127 bytes
+
+ encrypt_key = auth_owner_pass(pass)
+ encrypt_key ||= auth_user_pass(pass)
+ encrypt_key ||= auth_owner_pass_r6(pass)
+ encrypt_key ||= auth_user_pass_r6(pass)
+
+ raise PDF::Reader::EncryptedPDFError, "Invalid password (#{pass})" if encrypt_key.nil?
+ encrypt_key
+ end
+
+ private
+
+ # Algorithm 3.2a - Computing an encryption key
+ #
+ # Defined in PDF 1.7 Extension Level 3
+ #
+ # if the string is a valid user/owner password, this will return the decryption key
+ #
+ def auth_owner_pass(password)
+ if Digest::SHA256.digest(password + @owner_key[32..39] + @user_key) == @owner_key[0..31]
+ cipher = OpenSSL::Cipher.new('AES-256-CBC')
+ cipher.decrypt
+ cipher.key = Digest::SHA256.digest(password + @owner_key[40..-1] + @user_key)
+ cipher.iv = "\x00" * 16
+ cipher.padding = 0
+ cipher.update(@owner_encryption_key) + cipher.final
+ end
+ end
+
+ def auth_user_pass(password)
+ if Digest::SHA256.digest(password + @user_key[32..39]) == @user_key[0..31]
+ cipher = OpenSSL::Cipher.new('AES-256-CBC')
+ cipher.decrypt
+ cipher.key = Digest::SHA256.digest(password + @user_key[40..-1])
+ cipher.iv = "\x00" * 16
+ cipher.padding = 0
+ cipher.update(@user_encryption_key) + cipher.final
+ end
+ end
+
+ def auth_owner_pass_r6(password)
+ if r6_digest(password, @owner_key[32..39].to_s, @user_key[0,48].to_s) == @owner_key[0..31]
+ cipher = OpenSSL::Cipher.new('AES-256-CBC')
+ cipher.decrypt
+ cipher.key = r6_digest(password, @owner_key[40,8].to_s, @user_key[0, 48].to_s)
+ cipher.iv = "\x00" * 16
+ cipher.padding = 0
+ cipher.update(@owner_encryption_key) + cipher.final
+ end
+ end
+
+ def auth_user_pass_r6(password)
+ if r6_digest(password, @user_key[32..39].to_s) == @user_key[0..31]
+ cipher = OpenSSL::Cipher.new('AES-256-CBC')
+ cipher.decrypt
+ cipher.key = r6_digest(password, @user_key[40,8].to_s)
+ cipher.iv = "\x00" * 16
+ cipher.padding = 0
+ cipher.update(@user_encryption_key) + cipher.final
+ end
+ end
+
+ # PDF 2.0 spec, 7.6.4.3.4
+ # Algorithm 2.B: Computing a hash (revision 6 and later)
+ def r6_digest(password, salt, user_key = '')
+ k = Digest::SHA256.digest(password + salt + user_key)
+ e = ''
+
+ i = 0
+ while i < 64 or e.getbyte(-1).to_i > i - 32
+ k1 = (password + k + user_key) * 64
+
+ aes = OpenSSL::Cipher.new("aes-128-cbc").encrypt
+ aes.key = k[0, 16].to_s
+ aes.iv = k[16, 16].to_s
+ aes.padding = 0
+ e = String.new(aes.update(k1))
+ k = case unpack_128bit_bigendian_int(e) % 3
+ when 0 then Digest::SHA256.digest(e)
+ when 1 then Digest::SHA384.digest(e)
+ when 2 then Digest::SHA512.digest(e)
+ end
+ i = i + 1
+ end
+
+ k[0, 32].to_s
+ end
+
+ def unpack_128bit_bigendian_int(str)
+ ints = str[0,16].to_s.unpack("N*")
+ (ints[0].to_i << 96) + (ints[1].to_i << 64) + (ints[2].to_i << 32) + ints[3].to_i
+ end
+
+ end
+end
+
diff --git a/lib/pdf/reader/lzw.rb b/lib/pdf/reader/lzw.rb
index 05bc65c..fcc8756 100644
--- a/lib/pdf/reader/lzw.rb
+++ b/lib/pdf/reader/lzw.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
module PDF
@@ -24,21 +25,23 @@ module PDF
def initialize(data, bits_in_chunk)
@data = data
@data.force_encoding("BINARY")
- @bits_in_chunk = bits_in_chunk
+ set_bits_in_chunk(bits_in_chunk)
@current_pos = 0
@bits_left_in_byte = 8
end
def set_bits_in_chunk(bits_in_chunk)
+ raise MalformedPDFError, "invalid LZW bits" if bits_in_chunk < 9 || bits_in_chunk > 12
+
@bits_in_chunk = bits_in_chunk
end
def read
bits_left_in_chunk = @bits_in_chunk
- chunk = nil
+ chunk = -1
while bits_left_in_chunk > 0 and @current_pos < @data.size
- chunk = 0 if chunk.nil?
- codepoint = @data[@current_pos, 1].unpack("C*")[0]
+ chunk = 0 if chunk < 0
+ codepoint = @data[@current_pos, 1].to_s.unpack("C*")[0].to_i
current_byte = codepoint & (2**@bits_left_in_byte - 1) #clear consumed bits
dif = bits_left_in_chunk - @bits_left_in_byte
if dif > 0 then current_byte <<= dif
@@ -60,21 +63,25 @@ module PDF
CODE_CLEAR_TABLE = 256 #clear table
# stores de pairs code => string
- class StringTable < Hash # :nodoc:
+ class StringTable
attr_reader :string_table_pos
def initialize
- super
+ @data = Hash.new
@string_table_pos = 258 #initial code
end
#if code less than 258 return fixed string
def [](key)
- if key > 257 then super else key.chr end
+ if key > 257
+ @data[key]
+ else
+ key.chr
+ end
end
def add(string)
- store(@string_table_pos, string)
+ @data.store(@string_table_pos, string)
@string_table_pos += 1
end
end
@@ -82,7 +89,8 @@ module PDF
# Decompresses a LZW compressed string.
#
def self.decode(data)
- stream = BitStream.new data.to_s, 9 # size of codes between 9 and 12 bits
+ stream = BitStream.new(data.to_s, 9) # size of codes between 9 and 12 bits
+ string_table = StringTable.new
result = "".dup
until (code = stream.read) == CODE_EOD
if code == CODE_CLEAR_TABLE
@@ -117,8 +125,17 @@ module PDF
result
end
- def self.create_new_string(string_table,some_code, other_code)
- string_table[some_code] + string_table[other_code][0].chr
+ def self.create_new_string(string_table, some_code, other_code)
+ raise MalformedPDFError, "invalid LZW data" if some_code.nil? || other_code.nil?
+
+ item_one = string_table[some_code]
+ item_two = string_table[other_code]
+
+ if item_one && item_two
+ item_one + item_two.chr
+ else
+ raise MalformedPDFError, "invalid LZW data"
+ end
end
private_class_method :create_new_string
diff --git a/lib/pdf/reader/no_text_filter.rb b/lib/pdf/reader/no_text_filter.rb
new file mode 100644
index 0000000..ae3544b
--- /dev/null
+++ b/lib/pdf/reader/no_text_filter.rb
@@ -0,0 +1,14 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+class PDF::Reader
+ # There's no point rendering zero-width characters
+ class NoTextFilter
+
+ def self.exclude_empty_strings(runs)
+ runs.reject { |run| run.text.to_s.size == 0 }
+ end
+ end
+end
+
diff --git a/lib/pdf/reader/null_security_handler.rb b/lib/pdf/reader/null_security_handler.rb
index 869cdd0..72b079b 100644
--- a/lib/pdf/reader/null_security_handler.rb
+++ b/lib/pdf/reader/null_security_handler.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
class PDF::Reader
@@ -6,10 +7,6 @@ class PDF::Reader
# A null object security handler. Used when a PDF is unencrypted.
class NullSecurityHandler
- def self.supports?(encrypt)
- encrypt.nil?
- end
-
def decrypt(buf, _ref)
buf
end
diff --git a/lib/pdf/reader/object_cache.rb b/lib/pdf/reader/object_cache.rb
index f139c6a..aa0b7fa 100644
--- a/lib/pdf/reader/object_cache.rb
+++ b/lib/pdf/reader/object_cache.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: true
# frozen_string_literal: true
require 'hashery/lru_hash'
diff --git a/lib/pdf/reader/object_hash.rb b/lib/pdf/reader/object_hash.rb
index cf01c1b..d4d1705 100644
--- a/lib/pdf/reader/object_hash.rb
+++ b/lib/pdf/reader/object_hash.rb
@@ -1,6 +1,9 @@
# coding: utf-8
+# typed: true
# frozen_string_literal: true
+require 'tempfile'
+
class PDF::Reader
# Provides low level access to the objects in a PDF file via a hash-like
# object.
@@ -47,7 +50,11 @@ class PDF::Reader
@trailer = @xref.trailer
@cache = opts[:cache] || PDF::Reader::ObjectCache.new
@sec_handler = NullSecurityHandler.new
- @sec_handler = build_security_handler(opts)
+ @sec_handler = SecurityHandlerFactory.build(
+ deref(trailer[:Encrypt]),
+ deref(trailer[:ID]),
+ opts[:password]
+ )
end
# returns the type of object a ref points to
@@ -91,6 +98,218 @@ class PDF::Reader
end
alias :deref :object
+ # If key is a PDF::Reader::Reference object, lookup the corresponding
+ # object in the PDF and return it. Otherwise return key untouched.
+ #
+ # Guaranteed to only return an Array or nil. If the dereference results in
+ # any other type then a MalformedPDFError exception will raise. Useful when
+ # expecting an Array and no other type will do.
+ def deref_array(key)
+ obj = deref(key)
+
+ return obj if obj.nil?
+
+ obj.tap { |obj|
+ raise MalformedPDFError, "expected object to be an Array or nil" if !obj.is_a?(Array)
+ }
+ end
+
+ # If key is a PDF::Reader::Reference object, lookup the corresponding
+ # object in the PDF and return it. Otherwise return key untouched.
+ #
+ # Guaranteed to only return an Array of Numerics or nil. If the dereference results in
+ # any other type then a MalformedPDFError exception will raise. Useful when
+ # expecting an Array and no other type will do.
+ #
+ # Some effort to cast array elements to a number is made for any non-numeric elements.
+ def deref_array_of_numbers(key)
+ arr = deref(key)
+
+ return arr if arr.nil?
+
+ raise MalformedPDFError, "expected object to be an Array" unless arr.is_a?(Array)
+
+ arr.map { |item|
+ if item.is_a?(Numeric)
+ item
+ elsif item.respond_to?(:to_f)
+ item.to_f
+ elsif item.respond_to?(:to_i)
+ item.to_i
+ else
+ raise MalformedPDFError, "expected object to be a number"
+ end
+ }
+ end
+
+ # If key is a PDF::Reader::Reference object, lookup the corresponding
+ # object in the PDF and return it. Otherwise return key untouched.
+ #
+ # Guaranteed to only return a Hash or nil. If the dereference results in
+ # any other type then a MalformedPDFError exception will raise. Useful when
+ # expecting an Array and no other type will do.
+ def deref_hash(key)
+ obj = deref(key)
+
+ return obj if obj.nil?
+
+ obj.tap { |obj|
+ raise MalformedPDFError, "expected object to be a Hash or nil" if !obj.is_a?(Hash)
+ }
+ end
+
+ # If key is a PDF::Reader::Reference object, lookup the corresponding
+ # object in the PDF and return it. Otherwise return key untouched.
+ #
+ # Guaranteed to only return a PDF name (Symbol) or nil. If the dereference results in
+ # any other type then a MalformedPDFError exception will raise. Useful when
+ # expecting an Array and no other type will do.
+ #
+ # Some effort to cast to a symbol is made when the reference points to a non-symbol.
+ def deref_name(key)
+ obj = deref(key)
+
+ return obj if obj.nil?
+
+ if !obj.is_a?(Symbol)
+ if obj.respond_to?(:to_sym)
+ obj = obj.to_sym
+ else
+ raise MalformedPDFError, "expected object to be a Name"
+ end
+ end
+
+ obj
+ end
+
+ # If key is a PDF::Reader::Reference object, lookup the corresponding
+ # object in the PDF and return it. Otherwise return key untouched.
+ #
+ # Guaranteed to only return an Integer or nil. If the dereference results in
+ # any other type then a MalformedPDFError exception will raise. Useful when
+ # expecting an Array and no other type will do.
+ #
+ # Some effort to cast to an int is made when the reference points to a non-integer.
+ def deref_integer(key)
+ obj = deref(key)
+
+ return obj if obj.nil?
+
+ if !obj.is_a?(Integer)
+ if obj.respond_to?(:to_i)
+ obj = obj.to_i
+ else
+ raise MalformedPDFError, "expected object to be an Integer"
+ end
+ end
+
+ obj
+ end
+
+ # If key is a PDF::Reader::Reference object, lookup the corresponding
+ # object in the PDF and return it. Otherwise return key untouched.
+ #
+ # Guaranteed to only return a Numeric or nil. If the dereference results in
+ # any other type then a MalformedPDFError exception will raise. Useful when
+ # expecting an Array and no other type will do.
+ #
+ # Some effort to cast to a number is made when the reference points to a non-number.
+ def deref_number(key)
+ obj = deref(key)
+
+ return obj if obj.nil?
+
+ if !obj.is_a?(Numeric)
+ if obj.respond_to?(:to_f)
+ obj = obj.to_f
+ elsif obj.respond_to?(:to_i)
+ obj.to_i
+ else
+ raise MalformedPDFError, "expected object to be a number"
+ end
+ end
+
+ obj
+ end
+
+ # If key is a PDF::Reader::Reference object, lookup the corresponding
+ # object in the PDF and return it. Otherwise return key untouched.
+ #
+ # Guaranteed to only return a PDF::Reader::Stream or nil. If the dereference results in
+ # any other type then a MalformedPDFError exception will raise. Useful when
+ # expecting a stream and no other type will do.
+ def deref_stream(key)
+ obj = deref(key)
+
+ return obj if obj.nil?
+
+ obj.tap { |obj|
+ if !obj.is_a?(PDF::Reader::Stream)
+ raise MalformedPDFError, "expected object to be a Stream or nil"
+ end
+ }
+ end
+
+ # If key is a PDF::Reader::Reference object, lookup the corresponding
+ # object in the PDF and return it. Otherwise return key untouched.
+ #
+ # Guaranteed to only return a String or nil. If the dereference results in
+ # any other type then a MalformedPDFError exception will raise. Useful when
+ # expecting a string and no other type will do.
+ #
+ # Some effort to cast to a string is made when the reference points to a non-string.
+ def deref_string(key)
+ obj = deref(key)
+
+ return obj if obj.nil?
+
+ if !obj.is_a?(String)
+ if obj.respond_to?(:to_s)
+ obj = obj.to_s
+ else
+ raise MalformedPDFError, "expected object to be a string"
+ end
+ end
+
+ obj
+ end
+
+ # If key is a PDF::Reader::Reference object, lookup the corresponding
+ # object in the PDF and return it. Otherwise return key untouched.
+ #
+ # Guaranteed to only return a PDF Name (symbol), Array or nil. If the dereference results in
+ # any other type then a MalformedPDFError exception will raise. Useful when
+ # expecting a Name or Array and no other type will do.
+ def deref_name_or_array(key)
+ obj = deref(key)
+
+ return obj if obj.nil?
+
+ obj.tap { |obj|
+ if !obj.is_a?(Symbol) && !obj.is_a?(Array)
+ raise MalformedPDFError, "expected object to be an Array or Name"
+ end
+ }
+ end
+
+ # If key is a PDF::Reader::Reference object, lookup the corresponding
+ # object in the PDF and return it. Otherwise return key untouched.
+ #
+ # Guaranteed to only return a PDF::Reader::Stream, Array or nil. If the dereference results in
+ # any other type then a MalformedPDFError exception will raise. Useful when
+ # expecting a stream or Array and no other type will do.
+ def deref_stream_or_array(key)
+ obj = deref(key)
+
+ return obj if obj.nil?
+
+ obj.tap { |obj|
+ if !obj.is_a?(PDF::Reader::Stream) && !obj.is_a?(Array)
+ raise MalformedPDFError, "expected object to be an Array or Stream"
+ end
+ }
+ end
+
# Recursively dereferences the object refered to be +key+. If +key+ is not
# a PDF::Reader::Reference, the key is returned unchanged.
#
@@ -98,6 +317,22 @@ class PDF::Reader
deref_internal!(key, {})
end
+ def deref_array!(key)
+ deref!(key).tap { |obj|
+ if !obj.nil? && !obj.is_a?(Array)
+ raise MalformedPDFError, "expected object (#{obj.inspect}) to be an Array or nil"
+ end
+ }
+ end
+
+ def deref_hash!(key)
+ deref!(key).tap { |obj|
+ if !obj.nil? && !obj.is_a?(Hash)
+ raise MalformedPDFError, "expected object (#{obj.inspect}) to be a Hash or nil"
+ end
+ }
+ end
+
# Access an object from the PDF. key can be an int or a PDF::Reader::Reference
# object.
#
@@ -232,7 +467,10 @@ class PDF::Reader
#
def page_references
root = fetch(trailer[:Root])
- @page_references ||= get_page_objects(root[:Pages]).flatten
+ @page_references ||= begin
+ pages_root = deref_hash(root[:Pages]) || {}
+ get_page_objects(pages_root)
+ end
end
def encrypted?
@@ -260,7 +498,9 @@ class PDF::Reader
def fetch_object_stream(key)
if xref[key].is_a?(PDF::Reader::Reference)
container_key = xref[key]
- object_streams[container_key] ||= PDF::Reader::ObjectStream.new(object(container_key))
+ stream = deref_stream(container_key)
+ raise MalformedPDFError, "Object Stream cannot be nil" if stream.nil?
+ object_streams[container_key] ||= PDF::Reader::ObjectStream.new(stream)
object_streams[container_key][key.id]
end
end
@@ -298,44 +538,18 @@ class PDF::Reader
end
end
- def build_security_handler(opts = {})
- encrypt = deref(trailer[:Encrypt])
- if NullSecurityHandler.supports?(encrypt)
- NullSecurityHandler.new
- elsif StandardSecurityHandler.supports?(encrypt)
- encmeta = !encrypt.has_key?(:EncryptMetadata) || encrypt[:EncryptMetadata].to_s == "true"
- StandardSecurityHandler.new(
- key_length: (encrypt[:Length] || 40).to_i,
- revision: encrypt[:R],
- owner_key: encrypt[:O],
- user_key: encrypt[:U],
- permissions: encrypt[:P].to_i,
- encrypted_metadata: encmeta,
- file_id: (deref(trailer[:ID]) || []).first,
- password: opts[:password],
- cfm: encrypt.fetch(:CF, {}).fetch(encrypt[:StmF], {}).fetch(:CFM, nil)
- )
- elsif StandardSecurityHandlerV5.supports?(encrypt)
- StandardSecurityHandlerV5.new(
- O: encrypt[:O],
- U: encrypt[:U],
- OE: encrypt[:OE],
- UE: encrypt[:UE],
- password: opts[:password]
- )
- else
- UnimplementedSecurityHandler.new
- end
- end
-
def decrypt(ref, obj)
case obj
when PDF::Reader::Stream then
- obj.data = sec_handler.decrypt(obj.data, ref)
+ # PDF 32000-1:2008 7.5.8.2: "The cross-reference stream shall not be encrypted [...]."
+ # Therefore we shouldn't try to decrypt it.
+ obj.data = sec_handler.decrypt(obj.data, ref) unless obj.hash[:Type] == :XRef
obj
when Hash then
- arr = obj.map { |key,val| [key, decrypt(ref, val)] }.flatten(1)
- Hash[*arr]
+ arr = obj.map { |key,val| [key, decrypt(ref, val)] }
+ arr.each_with_object({}) { |(k,v), accum|
+ accum[k] = v
+ }
when Array then
obj.collect { |item| decrypt(ref, item) }
when String
@@ -354,39 +568,43 @@ class PDF::Reader
end
def object_streams
- @object_stream ||= {}
+ @object_streams ||= {}
end
- # returns a nested array of object references for all pages in this object store.
+ # returns an array of object references for all pages in this object store. The ordering of
+ # the Array is significant and matches the page ordering of the document
#
- def get_page_objects(ref)
- obj = deref(ref)
-
- unless obj.kind_of?(::Hash)
- raise MalformedPDFError, "Dereferenced page object must be a dict"
- end
-
- if obj[:Type] == :Page
- ref
- elsif obj[:Kids]
- deref(obj[:Kids]).map { |kid| get_page_objects(kid) }
+ def get_page_objects(obj)
+ derefed_obj = deref_hash(obj)
+
+ if derefed_obj.nil?
+ raise MalformedPDFError, "Expected Page or Pages object, got nil"
+ elsif derefed_obj[:Type] == :Page
+ [obj]
+ elsif derefed_obj[:Kids]
+ kids = deref_array(derefed_obj[:Kids]) || []
+ kids.map { |kid|
+ get_page_objects(kid)
+ }.flatten
+ else
+ raise MalformedPDFError, "Expected Page or Pages object"
end
end
def read_version
@io.seek(0)
- _m, version = *@io.read(10).match(/PDF-(\d.\d)/)
+ _m, version = *@io.read(10).to_s.match(/PDF-(\d.\d)/)
@io.seek(0)
version.to_f
end
def extract_io_from(input)
- if input.respond_to?(:seek) && input.respond_to?(:read)
+ if input.is_a?(IO) || input.is_a?(StringIO) || input.is_a?(Tempfile)
input
elsif File.file?(input.to_s)
- StringIO.new read_as_binary(input)
+ StringIO.new read_as_binary(input.to_s)
else
- raise ArgumentError, "input must be an IO-like object or a filename"
+ raise ArgumentError, "input must be an IO-like object or a filename (#{input.class})"
end
end
@@ -394,7 +612,7 @@ class PDF::Reader
if File.respond_to?(:binread)
File.binread(input.to_s)
else
- File.open(input.to_s,"rb") { |f| f.read }
+ File.open(input.to_s,"rb") { |f| f.read } || ""
end
end
diff --git a/lib/pdf/reader/object_stream.rb b/lib/pdf/reader/object_stream.rb
index fb5042c..e8ac20b 100644
--- a/lib/pdf/reader/object_stream.rb
+++ b/lib/pdf/reader/object_stream.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
class PDF::Reader
@@ -23,7 +24,7 @@ class PDF::Reader
end
def size
- @dict[:N]
+ TypeCheck.cast_to_int!(@dict[:N])
end
private
@@ -39,7 +40,7 @@ class PDF::Reader
end
def first
- @dict[:First]
+ TypeCheck.cast_to_int!(@dict[:First])
end
def buffer
diff --git a/lib/pdf/reader/orientation_detector.rb b/lib/pdf/reader/orientation_detector.rb
deleted file mode 100644
index 250551a..0000000
--- a/lib/pdf/reader/orientation_detector.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# coding: utf-8
-# frozen_string_literal: true
-
-class PDF::Reader
- # Small util class for detecting the orientation of a single PDF page. Accounts
- # for any page rotation that is in place.
- #
- # OrientationDetector.new(:MediaBox => [0,0,612,792]).orientation
- # => "portrait"
- #
- class OrientationDetector
- def initialize(attributes)
- @attributes = attributes
- end
-
- def orientation
- @orientation ||= detect_orientation
- end
-
- private
-
- def detect_orientation
- llx,lly,urx,ury = @attributes[:MediaBox]
- rotation = @attributes[:Rotate].to_i
- width = (urx.to_i - llx.to_i).abs
- height = (ury.to_i - lly.to_i).abs
- if width > height
- (rotation % 180).zero? ? 'landscape' : 'portrait'
- else
- (rotation % 180).zero? ? 'portrait' : 'landscape'
- end
- end
- end
-end
diff --git a/lib/pdf/reader/overlapping_runs_filter.rb b/lib/pdf/reader/overlapping_runs_filter.rb
index 972bedf..7ffef9c 100644
--- a/lib/pdf/reader/overlapping_runs_filter.rb
+++ b/lib/pdf/reader/overlapping_runs_filter.rb
@@ -1,4 +1,6 @@
# coding: utf-8
+# frozen_string_literal: true
+# typed: strict
class PDF::Reader
# remove duplicates from a collection of TextRun objects. This can be helpful when a PDF
@@ -38,7 +40,8 @@ class PDF::Reader
def self.detect_intersection(sweep_line_status, event_point)
sweep_line_status.each do |open_text_run|
- if event_point.x >= open_text_run.x &&
+ if open_text_run.text == event_point.run.text &&
+ event_point.x >= open_text_run.x &&
event_point.x <= open_text_run.endx &&
open_text_run.intersection_area_percent(event_point.run) >= OVERLAPPING_THRESHOLD
return true
@@ -51,10 +54,14 @@ class PDF::Reader
# Utility class used to avoid modifying the underlying TextRun objects while we're
# looking for duplicates
class EventPoint
- attr_reader :x, :run
- def initialize x, run
- @x, @run = x, run
+ attr_reader :x
+
+ attr_reader :run
+
+ def initialize(x, run)
+ @x = x
+ @run = run
end
def start?
diff --git a/lib/pdf/reader/page.rb b/lib/pdf/reader/page.rb
index e58448e..d48768a 100644
--- a/lib/pdf/reader/page.rb
+++ b/lib/pdf/reader/page.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
module PDF
@@ -13,7 +14,7 @@ module PDF
# objects accessor to help walk the page dictionary in any useful way.
#
class Page
- include ResourceMethods
+ extend Forwardable
# lowlevel hash-like access to all objects in the underlying PDF
attr_reader :objects
@@ -26,6 +27,15 @@ module PDF
# operations
attr_reader :cache
+ def_delegators :resources, :color_spaces
+ def_delegators :resources, :fonts
+ def_delegators :resources, :graphic_states
+ def_delegators :resources, :patterns
+ def_delegators :resources, :procedure_sets
+ def_delegators :resources, :properties
+ def_delegators :resources, :shadings
+ def_delegators :resources, :xobjects
+
# creates a new page wrapper.
#
# * objects - an ObjectHash instance that wraps a PDF file
@@ -33,10 +43,10 @@ module PDF
#
def initialize(objects, pagenum, options = {})
@objects, @pagenum = objects, pagenum
- @page_object = objects.deref(objects.page_references[pagenum - 1])
+ @page_object = objects.deref_hash(objects.page_references[pagenum - 1]) || {}
@cache = options[:cache] || {}
- unless @page_object.is_a?(::Hash)
+ if @page_object.empty?
raise InvalidPageError, "Invalid page: #{pagenum}"
end
end
@@ -59,7 +69,7 @@ module PDF
def attributes
@attributes ||= {}.tap { |hash|
page_with_ancestors.reverse.each do |obj|
- hash.merge!(@objects.deref(obj))
+ hash.merge!(@objects.deref_hash(obj) || {})
end
}
# This shouldn't be necesary, but some non compliant PDFs leave MediaBox
@@ -68,22 +78,56 @@ module PDF
@attributes
end
+ def height
+ rect = Rectangle.new(*attributes[:MediaBox])
+ rect.apply_rotation(rotate) if rotate > 0
+ rect.height
+ end
+
+ def width
+ rect = Rectangle.new(*attributes[:MediaBox])
+ rect.apply_rotation(rotate) if rotate > 0
+ rect.width
+ end
+
+ def origin
+ rect = Rectangle.new(*attributes[:MediaBox])
+ rect.apply_rotation(rotate) if rotate > 0
+
+ rect.bottom_left
+ end
+
# Convenience method to identify the page's orientation.
#
def orientation
- OrientationDetector.new(attributes).orientation
+ if height > width
+ "portrait"
+ else
+ "landscape"
+ end
end
# returns the plain text content of this page encoded as UTF-8. Any
# characters that can't be translated will be returned as a ▯
#
- def text
+ def text(opts = {})
receiver = PageTextReceiver.new
walk(receiver)
- receiver.content
+ runs = receiver.runs(opts)
+
+ # rectangles[:MediaBox] can never be nil, but I have no easy way to tell sorbet that atm
+ mediabox = rectangles[:MediaBox] || Rectangle.new(0, 0, 0, 0)
+
+ PageLayout.new(runs, mediabox).to_s
end
alias :to_s :text
+ def runs(opts = {})
+ receiver = PageTextReceiver.new
+ walk(receiver)
+ receiver.runs(opts)
+ end
+
# processes the raw content stream for this page in sequential order and
# passes callbacks to the receiver objects.
#
@@ -108,6 +152,9 @@ module PDF
# the program in the correct order and calls out to your implementation.
#
def walk(*receivers)
+ receivers = receivers.map { |receiver|
+ ValidatingReceiver.new(receiver)
+ }
callback(receivers, :page=, [self])
content_stream(receivers, raw_content)
end
@@ -116,10 +163,10 @@ module PDF
# see here unless you're a PDF nerd like me.
#
def raw_content
- contents = objects.deref(@page_object[:Contents])
+ contents = objects.deref_stream_or_array(@page_object[:Contents])
[contents].flatten.compact.map { |obj|
- objects.deref(obj)
- }.map { |obj|
+ objects.deref_stream(obj)
+ }.compact.map { |obj|
obj.unfiltered_data
}.join(" ")
end
@@ -139,30 +186,62 @@ module PDF
# returns the "boxes" that define the page object.
# values are defaulted according to section 7.7.3.3 of the PDF Spec 1.7
#
+ # DEPRECATED. Recommend using Page#rectangles instead
+ #
def boxes
- mediabox = attributes[:MediaBox]
- cropbox = attributes[:Cropbox] || mediabox
+ # In ruby 2.4+ we could use Hash#transform_values
+ Hash[rectangles.map{ |k,rect| [k,rect.to_a] } ]
+ end
+
+ # returns the "boxes" that define the page object.
+ # values are defaulted according to section 7.7.3.3 of the PDF Spec 1.7
+ #
+ def rectangles
+ # attributes[:MediaBox] can never be nil, but I have no easy way to tell sorbet that atm
+ mediabox = objects.deref_array_of_numbers(attributes[:MediaBox]) || []
+ cropbox = objects.deref_array_of_numbers(attributes[:CropBox]) || mediabox
+ bleedbox = objects.deref_array_of_numbers(attributes[:BleedBox]) || cropbox
+ trimbox = objects.deref_array_of_numbers(attributes[:TrimBox]) || cropbox
+ artbox = objects.deref_array_of_numbers(attributes[:ArtBox]) || cropbox
+
+ begin
+ mediarect = Rectangle.from_array(mediabox)
+ croprect = Rectangle.from_array(cropbox)
+ bleedrect = Rectangle.from_array(bleedbox)
+ trimrect = Rectangle.from_array(trimbox)
+ artrect = Rectangle.from_array(artbox)
+ rescue ArgumentError => e
+ raise MalformedPDFError, e.message
+ end
+
+ if rotate > 0
+ mediarect.apply_rotation(rotate)
+ croprect.apply_rotation(rotate)
+ bleedrect.apply_rotation(rotate)
+ trimrect.apply_rotation(rotate)
+ artrect.apply_rotation(rotate)
+ end
{
- MediaBox: objects.deref!(mediabox),
- CropBox: objects.deref!(cropbox),
- BleedBox: objects.deref!(attributes[:BleedBox] || cropbox),
- TrimBox: objects.deref!(attributes[:TrimBox] || cropbox),
- ArtBox: objects.deref!(attributes[:ArtBox] || cropbox)
+ MediaBox: mediarect,
+ CropBox: croprect,
+ BleedBox: bleedrect,
+ TrimBox: trimrect,
+ ArtBox: artrect,
}
end
private
def root
- root ||= objects.deref(@objects.trailer[:Root])
+ @root ||= objects.deref_hash(@objects.trailer[:Root]) || {}
end
# Returns the resources that accompany this page. Includes
# resources inherited from parents.
#
def resources
- @resources ||= @objects.deref(attributes[:Resources]) || {}
+ @resources ||= Resources.new(@objects, @objects.deref_hash(attributes[:Resources]) || {})
end
def content_stream(receivers, instructions)
@@ -171,8 +250,8 @@ module PDF
params = []
while (token = parser.parse_token(PagesStrategy::OPERATORS))
- if token.kind_of?(Token) and PagesStrategy::OPERATORS.has_key?(token)
- callback(receivers, PagesStrategy::OPERATORS[token], params)
+ if token.kind_of?(Token) && method_name = PagesStrategy::OPERATORS[token]
+ callback(receivers, method_name, params)
params.clear
else
params << token
@@ -184,9 +263,26 @@ module PDF
# calls the name callback method on each receiver object with params as the arguments
#
+ # The silly style here is because sorbet won't let me use splat arguments
+ #
def callback(receivers, name, params=[])
receivers.each do |receiver|
- receiver.send(name, *params) if receiver.respond_to?(name)
+ if receiver.respond_to?(name)
+ case params.size
+ when 0 then receiver.send(name)
+ when 1 then receiver.send(name, params[0])
+ when 2 then receiver.send(name, params[0], params[1])
+ when 3 then receiver.send(name, params[0], params[1], params[2])
+ when 4 then receiver.send(name, params[0], params[1], params[2], params[3])
+ when 5 then receiver.send(name, params[0], params[1], params[2], params[3], params[4])
+ when 6 then receiver.send(name, params[0], params[1], params[2], params[3], params[4], params[5])
+ when 7 then receiver.send(name, params[0], params[1], params[2], params[3], params[4], params[5], params[6])
+ when 8 then receiver.send(name, params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7])
+ when 9 then receiver.send(name, params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7], params[8])
+ else
+ receiver.send(name, params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7], params[8], params[9])
+ end
+ end
end
end
@@ -198,7 +294,10 @@ module PDF
if origin.nil?
[]
else
- obj = objects.deref(origin)
+ obj = objects.deref_hash(origin)
+ if obj.nil?
+ raise MalformedPDFError, "parent mus not be nil"
+ end
[ select_inheritable(obj) ] + ancestors(obj[:Parent])
end
end
diff --git a/lib/pdf/reader/page_layout.rb b/lib/pdf/reader/page_layout.rb
index 984f641..9246c1e 100644
--- a/lib/pdf/reader/page_layout.rb
+++ b/lib/pdf/reader/page_layout.rb
@@ -1,7 +1,9 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
require 'pdf/reader/overlapping_runs_filter'
+require 'pdf/reader/zero_width_runs_filter'
class PDF::Reader
@@ -15,14 +17,15 @@ class PDF::Reader
DEFAULT_FONT_SIZE = 12
def initialize(runs, mediabox)
- raise ArgumentError, "a mediabox must be provided" if mediabox.nil?
+ # mediabox is a 4-element array for now, but it'd be nice to switch to a
+ # PDF::Reader::Rectangle at some point
+ PDF::Reader::Error.validate_not_nil(mediabox, "mediabox")
- @runs = merge_runs(OverlappingRunsFilter.exclude_redundant_runs(runs))
+ @mediabox = process_mediabox(mediabox)
+ @runs = runs
@mean_font_size = mean(@runs.map(&:font_size)) || DEFAULT_FONT_SIZE
@mean_font_size = DEFAULT_FONT_SIZE if @mean_font_size == 0
- @mean_glyph_width = mean(@runs.map(&:mean_character_width)) || 0
- @page_width = (mediabox[2] - mediabox[0]).abs
- @page_height = (mediabox[3] - mediabox[1]).abs
+ @median_glyph_width = median(@runs.map(&:mean_character_width)) || 0
@x_offset = @runs.map(&:x).sort.first || 0
lowest_y = @runs.map(&:y).sort.first || 0
@y_offset = lowest_y > 0 ? 0 : lowest_y
@@ -30,6 +33,7 @@ class PDF::Reader
def to_s
return "" if @runs.empty?
+ return "" if row_count == 0
page = row_count.times.map { |i| " " * col_count }
@runs.each do |run|
@@ -44,6 +48,14 @@ class PDF::Reader
private
+ def page_width
+ @mediabox.width
+ end
+
+ def page_height
+ @mediabox.height
+ end
+
# given an array of strings, return a new array with empty rows from the
# beginning and end removed.
#
@@ -62,19 +74,19 @@ class PDF::Reader
end
def row_count
- @row_count ||= (@page_height / @mean_font_size).floor
+ @row_count ||= (page_height / @mean_font_size).floor
end
def col_count
- @col_count ||= ((@page_width / @mean_glyph_width) * 1.05).floor
+ @col_count ||= ((page_width / @median_glyph_width) * 1.05).floor
end
def row_multiplier
- @row_multiplier ||= @page_height.to_f / row_count.to_f
+ @row_multiplier ||= page_height.to_f / row_count.to_f
end
def col_multiplier
- @col_multiplier ||= @page_width.to_f / col_count.to_f
+ @col_multiplier ||= page_width.to_f / col_count.to_f
end
def mean(collection)
@@ -85,40 +97,28 @@ class PDF::Reader
end
end
- def each_line(&block)
- @runs.sort.group_by { |run|
- run.y.to_i
- }.map { |y, collection|
- yield y, collection
- }
+ def median(collection)
+ if collection.size == 0
+ 0
+ else
+ collection.sort[(collection.size * 0.5).floor]
+ end
end
- # take a collection of TextRun objects and merge any that are in close
- # proximity
- def merge_runs(runs)
- runs.group_by { |char|
- char.y.to_i
- }.map { |y, chars|
- group_chars_into_runs(chars.sort)
- }.flatten.sort
+ def local_string_insert(haystack, needle, index)
+ haystack[Range.new(index, index + needle.length - 1)] = String.new(needle)
end
- def group_chars_into_runs(chars)
- runs = []
- while head = chars.shift
- if runs.empty?
- runs << head
- elsif runs.last.mergable?(head)
- runs[-1] = runs.last + head
- else
- runs << head
- end
+ def process_mediabox(mediabox)
+ if mediabox.is_a?(Array)
+ msg = "Passing the mediabox to PageLayout as an Array is deprecated," +
+ " please use a Rectangle instead"
+ $stderr.puts msg
+ PDF::Reader::Rectangle.from_array(mediabox)
+ else
+ mediabox
end
- runs
end
- def local_string_insert(haystack, needle, index)
- haystack[Range.new(index, index + needle.length - 1)] = String.new(needle)
- end
end
end
diff --git a/lib/pdf/reader/page_state.rb b/lib/pdf/reader/page_state.rb
index 7d81ff4..1103909 100644
--- a/lib/pdf/reader/page_state.rb
+++ b/lib/pdf/reader/page_state.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: true
# frozen_string_literal: true
require 'pdf/reader/transformation_matrix'
@@ -15,7 +16,7 @@ class PDF::Reader
:h_scaling => 1.0,
:text_leading => 0,
:text_font => nil,
- :text_font_size => nil,
+ :text_font_size => 0,
:text_mode => 0,
:text_rise => 0,
:text_knockout => 0
@@ -30,15 +31,13 @@ class PDF::Reader
@xobject_stack = [page.xobjects]
@cs_stack = [page.color_spaces]
@stack = [DEFAULT_GRAPHICS_STATE.dup]
- if page.rotate == 0
- state[:ctm] = identity_matrix
- else
- rotate_cos = Math.cos(page.rotate * (Math::PI/180.0)).round(2)
- rotate_sin = Math.sin(page.rotate * (Math::PI/180.0)).round(2)
- state[:ctm] = TransformationMatrix.new(rotate_cos, rotate_sin,
- rotate_sin * -1, rotate_cos,
- 0, 0)
- end
+ state[:ctm] = identity_matrix
+
+ # These are only valid when inside a `BT` block and we re-initialize them on each
+ # `BT`. However, we need the instance variables set so PDFs with the text operators
+ # out order don't trigger NoMethodError when these are nil
+ @text_matrix = identity_matrix
+ @text_line_matrix = identity_matrix
end
#####################################################
@@ -320,7 +319,7 @@ class PDF::Reader
# may need to be added
#
def process_glyph_displacement(w0, tj, word_boundary)
- fs = font_size # font size
+ fs = state[:text_font_size]
tc = state[:char_spacing]
if word_boundary
tw = state[:word_spacing]
@@ -330,22 +329,24 @@ class PDF::Reader
th = state[:h_scaling]
# optimise the common path to reduce Float allocations
if th == 1 && tj == 0 && tc == 0 && tw == 0
- glyph_width = w0 * fs
- tx = glyph_width
+ tx = w0 * fs
+ elsif tj != 0
+ # don't apply spacing to TJ displacement
+ tx = (w0 - (tj/1000.0)) * fs * th
else
- glyph_width = ((w0 - (tj/1000.0)) * fs) * th
- tx = glyph_width + ((tc + tw) * th)
+ # apply horizontal scaling to spacing values but not font size
+ tx = ((w0 * fs) + tc + tw) * th
end
-
- # TODO: I'm pretty sure that tx shouldn't need to be divided by
- # ctm[0] here, but this gets my tests green and I'm out of
- # ideas for now
# TODO: support ty > 0
- if ctm.a == 1 || ctm.a == 0
- @text_matrix.horizontal_displacement_multiply!(tx)
- else
- @text_matrix.horizontal_displacement_multiply!(tx/ctm.a)
- end
+ ty = 0
+ temp = TransformationMatrix.new(1, 0,
+ 0, 1,
+ tx, ty)
+ @text_matrix = temp.multiply!(
+ @text_matrix.a, @text_matrix.b,
+ @text_matrix.c, @text_matrix.d,
+ @text_matrix.e, @text_matrix.f
+ )
@font_size = @text_rendering_matrix = nil # invalidate cached value
end
@@ -389,7 +390,7 @@ class PDF::Reader
#
def build_fonts(raw_fonts)
wrapped_fonts = raw_fonts.map { |label, font|
- [label, PDF::Reader::Font.new(@objects, @objects.deref(font))]
+ [label, PDF::Reader::Font.new(@objects, @objects.deref_hash(font) || {})]
}
::Hash[wrapped_fonts]
diff --git a/lib/pdf/reader/page_text_receiver.rb b/lib/pdf/reader/page_text_receiver.rb
index 6d38a2d..dd41252 100644
--- a/lib/pdf/reader/page_text_receiver.rb
+++ b/lib/pdf/reader/page_text_receiver.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: true
# frozen_string_literal: true
require 'forwardable'
@@ -41,16 +42,39 @@ module PDF
# starting a new page
def page=(page)
@state = PageState.new(page)
+ @page = page
@content = []
@characters = []
- @mediabox = page.objects.deref(page.attributes[:MediaBox])
- device_bl = @state.ctm_transform(@mediabox[0], @mediabox[1])
- device_tr = @state.ctm_transform(@mediabox[2], @mediabox[3])
- @device_mediabox = [ device_bl.first, device_bl.last, device_tr.first, device_tr.last]
end
+ def runs(opts = {})
+ runs = @characters
+
+ if rect = opts.fetch(:rect, @page.rectangles[:CropBox])
+ runs = BoundingRectangleRunsFilter.runs_within_rect(runs, rect)
+ end
+
+ if opts.fetch(:skip_zero_width, true)
+ runs = ZeroWidthRunsFilter.exclude_zero_width_runs(runs)
+ end
+
+ if opts.fetch(:skip_overlapping, true)
+ runs = OverlappingRunsFilter.exclude_redundant_runs(runs)
+ end
+
+ runs = NoTextFilter.exclude_empty_strings(runs)
+
+ if opts.fetch(:merge, true)
+ runs = merge_runs(runs)
+ end
+
+ runs
+ end
+
+ # deprecated
def content
- PageLayout.new(@characters, @device_mediabox).to_s
+ mediabox = @page.rectangles[:MediaBox]
+ PageLayout.new(runs, mediabox).to_s
end
#####################################################
@@ -65,8 +89,10 @@ module PDF
params.each do |arg|
if arg.is_a?(String)
internal_show_text(arg)
- else
+ elsif arg.is_a?(Numeric)
@state.process_glyph_displacement(0, arg, false)
+ else
+ # skip it
end
end
end
@@ -97,6 +123,7 @@ module PDF
private
def internal_show_text(string)
+ PDF::Reader::Error.validate_type_as_malformed(string, "string", String)
if @state.current_font.nil?
raise PDF::Reader::MalformedPDFError, "current font is invalid"
end
@@ -104,11 +131,13 @@ module PDF
glyphs.each_with_index do |glyph_code, index|
# paint the current glyph
newx, newy = @state.trm_transform(0,0)
+ newx, newy = apply_rotation(newx, newy)
+
utf8_chars = @state.current_font.to_utf8(glyph_code)
# apply to glyph displacment for the current glyph so the next
# glyph will appear in the correct position
- glyph_width = @state.current_font.glyph_width(glyph_code) / 1000.0
+ glyph_width = @state.current_font.glyph_width_in_text_space(glyph_code)
th = 1
scaled_glyph_width = glyph_width * @state.font_size * th
unless utf8_chars == SPACE
@@ -118,6 +147,44 @@ module PDF
end
end
+ def apply_rotation(x, y)
+ if @page.rotate == 90
+ tmp = x
+ x = y
+ y = tmp * -1
+ elsif @page.rotate == 180
+ y *= -1
+ x *= -1
+ elsif @page.rotate == 270
+ tmp = y
+ y = x
+ x = tmp * -1
+ end
+ return x, y
+ end
+
+ # take a collection of TextRun objects and merge any that are in close
+ # proximity
+ def merge_runs(runs)
+ runs.group_by { |char|
+ char.y.to_i
+ }.map { |y, chars|
+ group_chars_into_runs(chars.sort)
+ }.flatten.sort
+ end
+
+ def group_chars_into_runs(chars)
+ chars.each_with_object([]) do |char, runs|
+ if runs.empty?
+ runs << char
+ elsif runs.last.mergable?(char)
+ runs[-1] = runs.last + char
+ else
+ runs << char
+ end
+ end
+ end
+
end
end
end
diff --git a/lib/pdf/reader/pages_strategy.rb b/lib/pdf/reader/pages_strategy.rb
index d679b15..af5d4da 100644
--- a/lib/pdf/reader/pages_strategy.rb
+++ b/lib/pdf/reader/pages_strategy.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
################################################################################
diff --git a/lib/pdf/reader/parser.rb b/lib/pdf/reader/parser.rb
index 7364d97..8478334 100644
--- a/lib/pdf/reader/parser.rb
+++ b/lib/pdf/reader/parser.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: true
# frozen_string_literal: true
################################################################################
@@ -79,8 +80,8 @@ class PDF::Reader
token
elsif operators.has_key? token
Token.new(token)
- elsif token.respond_to?(:to_token)
- token.to_token
+ elsif token.frozen?
+ token
elsif token =~ /\d*\.\d/
token.to_f
else
@@ -95,14 +96,20 @@ class PDF::Reader
# id - the object ID to return
# gen - the object revision number to return
def object(id, gen)
- Error.assert_equal(parse_token, id)
+ idCheck = parse_token
+
+ # Sometimes the xref table is corrupt and points to an offset slightly too early in the file.
+ # check the next token, maybe we can find the start of the object we're looking for
+ if idCheck != id
+ Error.assert_equal(parse_token, id)
+ end
Error.assert_equal(parse_token, gen)
Error.str_assert(parse_token, "obj")
obj = parse_token
post_obj = parse_token
- if post_obj == "stream"
+ if obj.is_a?(Hash) && post_obj == "stream"
stream(obj)
else
obj
@@ -120,7 +127,7 @@ class PDF::Reader
key = parse_token
break if key.kind_of?(Token) and key == ">>"
raise MalformedPDFError, "unterminated dict" if @buffer.empty?
- raise MalformedPDFError, "Dictionary key (#{key.inspect}) is not a name" unless key.kind_of?(Symbol)
+ PDF::Reader::Error.validate_type_as_malformed(key, "Dictionary key", Symbol)
value = parse_token
value.kind_of?(Token) and Error.str_assert_not(value, ">>")
@@ -166,7 +173,9 @@ class PDF::Reader
# add a missing digit if required, as required by the spec
str << "0" unless str.size % 2 == 0
- str.scan(/../).map {|i| i.hex.chr}.join.force_encoding("binary")
+ str.chars.each_slice(2).map { |nibbles|
+ nibbles.join("").hex.chr
+ }.join.force_encoding("binary")
end
################################################################################
# Reads a PDF String from the buffer and converts it to a Ruby String
@@ -175,15 +184,18 @@ class PDF::Reader
return "".dup.force_encoding("binary") if str == ")"
Error.assert_equal(parse_token, ")")
- str.gsub!(/\\([nrtbf()\\\n]|\d{1,3})?|\r\n?|\n\r/m) do |match|
- MAPPING[match] || "".dup
+ str.gsub!(/\\(\r\n|[nrtbf()\\\n\r]|([0-7]{1,3}))?|\r\n?/m) do |match|
+ if $2.nil? # not octal digits
+ MAPPING[match] || "".dup
+ else # must be octal digits
+ ($2.oct & 0xff).chr # ignore high level overflow
+ end
end
str.force_encoding("binary")
end
MAPPING = {
"\r" => "\n",
- "\n\r" => "\n",
"\r\n" => "\n",
"\\n" => "\n",
"\\r" => "\r",
@@ -194,24 +206,32 @@ class PDF::Reader
"\\)" => ")",
"\\\\" => "\\",
"\\\n" => "",
+ "\\\r" => "",
+ "\\\r\n" => "",
}
- 0.upto(9) { |n| MAPPING["\\00"+n.to_s] = ("00"+n.to_s).oct.chr }
- 0.upto(99) { |n| MAPPING["\\0"+n.to_s] = ("0"+n.to_s).oct.chr }
- 0.upto(377) { |n| MAPPING["\\"+n.to_s] = n.to_s.oct.chr }
################################################################################
# Decodes the contents of a PDF Stream and returns it as a Ruby String.
def stream(dict)
raise MalformedPDFError, "PDF malformed, missing stream length" unless dict.has_key?(:Length)
if @objects
- length = @objects.deref(dict[:Length])
+ length = @objects.deref_integer(dict[:Length])
+ if dict[:Filter]
+ dict[:Filter] = @objects.deref_name_or_array(dict[:Filter])
+ end
else
length = dict[:Length] || 0
end
+
+ PDF::Reader::Error.validate_type_as_malformed(length, "length", Numeric)
+
data = @buffer.read(length, :skip_eol => true)
Error.str_assert(parse_token, "endstream")
- Error.str_assert(parse_token, "endobj")
+
+ # We used to assert that the stream had the correct closing token, but it doesn't *really*
+ # matter if it's missing, and other readers seems to handle its absence just fine
+ # Error.str_assert(parse_token, "endobj")
PDF::Reader::Stream.new(dict, data)
end
diff --git a/lib/pdf/reader/point.rb b/lib/pdf/reader/point.rb
new file mode 100644
index 0000000..ec15f88
--- /dev/null
+++ b/lib/pdf/reader/point.rb
@@ -0,0 +1,25 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+module PDF
+ class Reader
+
+ # PDFs are all about positioning content on a page, so there's lots of need to
+ # work with a set of X,Y coordinates.
+ #
+ class Point
+
+ attr_reader :x, :y
+
+ def initialize(x, y)
+ @x, @y = x, y
+ end
+
+ def ==(other)
+ other.respond_to?(:x) && other.respond_to?(:y) && x == other.x && y == other.y
+ end
+
+ end
+ end
+end
diff --git a/lib/pdf/reader/print_receiver.rb b/lib/pdf/reader/print_receiver.rb
index 52e152e..0a0dd80 100644
--- a/lib/pdf/reader/print_receiver.rb
+++ b/lib/pdf/reader/print_receiver.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
class PDF::Reader
diff --git a/lib/pdf/reader/rc4_security_handler.rb b/lib/pdf/reader/rc4_security_handler.rb
new file mode 100644
index 0000000..20aaa33
--- /dev/null
+++ b/lib/pdf/reader/rc4_security_handler.rb
@@ -0,0 +1,38 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+require 'digest/md5'
+require 'rc4'
+
+class PDF::Reader
+
+ # Decrypts data using the RC4 algorithim defined in the PDF spec. Requires
+ # a decryption key, which is usually generated by PDF::Reader::StandardKeyBuilder
+ #
+ class Rc4SecurityHandler
+
+ def initialize(key)
+ @encrypt_key = key
+ end
+
+ ##7.6.2 General Encryption Algorithm
+ #
+ # Algorithm 1: Encryption of data using the RC4 algorithm
+ #
+ # version <=3 or (version == 4 and CFM == V2)
+ #
+ # buf - a string to decrypt
+ # ref - a PDF::Reader::Reference for the object to decrypt
+ #
+ def decrypt( buf, ref )
+ objKey = @encrypt_key.dup
+ (0..2).each { |e| objKey << (ref.id >> e*8 & 0xFF ) }
+ (0..1).each { |e| objKey << (ref.gen >> e*8 & 0xFF ) }
+ length = objKey.length < 16 ? objKey.length : 16
+ rc4 = RC4.new( Digest::MD5.digest(objKey)[0,length] )
+ rc4.decrypt(buf)
+ end
+
+ end
+end
diff --git a/lib/pdf/reader/rectangle.rb b/lib/pdf/reader/rectangle.rb
new file mode 100644
index 0000000..aca9c95
--- /dev/null
+++ b/lib/pdf/reader/rectangle.rb
@@ -0,0 +1,113 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+module PDF
+ class Reader
+
+ # PDFs represent rectangles all over the place. They're 4 element arrays, like this:
+ #
+ # [A, B, C, D]
+ #
+ # Four element arrays are yucky to work with though, so here's a class that's better.
+ # Initialize it with the 4 elements, and get utility functions (width, height, etc)
+ # for free.
+ #
+ # By convention the first two elements are x1, y1, the co-ords for the bottom left corner
+ # of the rectangle. The third and fourth elements are x2, y2, the co-ords for the top left
+ # corner of the rectangle. It's valid for the alternative corners to be used though, so
+ # we don't assume which is which.
+ #
+ class Rectangle
+
+ attr_reader :bottom_left, :bottom_right, :top_left, :top_right
+
+ def initialize(x1, y1, x2, y2)
+ set_corners(x1, y1, x2, y2)
+ end
+
+ def self.from_array(arr)
+ if arr.size != 4
+ raise ArgumentError, "Only 4-element Arrays can be converted to a Rectangle"
+ end
+
+ PDF::Reader::Rectangle.new(
+ arr[0].to_f,
+ arr[1].to_f,
+ arr[2].to_f,
+ arr[3].to_f,
+ )
+ end
+
+ def ==(other)
+ to_a == other.to_a
+ end
+
+ def height
+ top_right.y - bottom_right.y
+ end
+
+ def width
+ bottom_right.x - bottom_left.x
+ end
+
+ def contains?(point)
+ point.x >= bottom_left.x && point.x <= top_right.x &&
+ point.y >= bottom_left.y && point.y <= top_right.y
+ end
+
+ # A pdf-style 4-number array
+ def to_a
+ [
+ bottom_left.x,
+ bottom_left.y,
+ top_right.x,
+ top_right.y,
+ ]
+ end
+
+ def apply_rotation(degrees)
+ return if degrees != 90 && degrees != 180 && degrees != 270
+
+ if degrees == 90
+ new_x1 = bottom_left.x
+ new_y1 = bottom_left.y - width
+ new_x2 = bottom_left.x + height
+ new_y2 = bottom_left.y
+ elsif degrees == 180
+ new_x1 = bottom_left.x - width
+ new_y1 = bottom_left.y - height
+ new_x2 = bottom_left.x
+ new_y2 = bottom_left.y
+ elsif degrees == 270
+ new_x1 = bottom_left.x - height
+ new_y1 = bottom_left.y
+ new_x2 = bottom_left.x
+ new_y2 = bottom_left.y + width
+ end
+ set_corners(new_x1 || 0, new_y1 || 0, new_x2 || 0, new_y2 || 0)
+ end
+
+ private
+
+ def set_corners(x1, y1, x2, y2)
+ @bottom_left = PDF::Reader::Point.new(
+ [x1, x2].min,
+ [y1, y2].min,
+ )
+ @bottom_right = PDF::Reader::Point.new(
+ [x1, x2].max,
+ [y1, y2].min,
+ )
+ @top_left = PDF::Reader::Point.new(
+ [x1, x2].min,
+ [y1, y2].max,
+ )
+ @top_right = PDF::Reader::Point.new(
+ [x1, x2].max,
+ [y1, y2].max,
+ )
+ end
+ end
+ end
+end
diff --git a/lib/pdf/reader/reference.rb b/lib/pdf/reader/reference.rb
index c31c04a..2537f87 100644
--- a/lib/pdf/reader/reference.rb
+++ b/lib/pdf/reader/reference.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
################################################################################
@@ -30,7 +31,8 @@ class PDF::Reader
################################################################################
# An internal PDF::Reader class that represents an indirect reference to a PDF Object
class Reference
- attr_reader :id, :gen
+ attr_reader :id
+ attr_reader :gen
################################################################################
# Create a new Reference to an object with the specified id and revision number
def initialize(id, gen)
diff --git a/lib/pdf/reader/register_receiver.rb b/lib/pdf/reader/register_receiver.rb
index ab5d608..05af3c2 100644
--- a/lib/pdf/reader/register_receiver.rb
+++ b/lib/pdf/reader/register_receiver.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
# Copyright (C) 2010 James Healy (jimmy@deefa.com)
diff --git a/lib/pdf/reader/resource_methods.rb b/lib/pdf/reader/resources.rb
similarity index 79%
rename from lib/pdf/reader/resource_methods.rb
rename to lib/pdf/reader/resources.rb
index d6fb563..8ba4ecb 100644
--- a/lib/pdf/reader/resource_methods.rb
+++ b/lib/pdf/reader/resources.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
module PDF
@@ -6,7 +7,13 @@ module PDF
# mixin for common methods in Page and FormXobjects
#
- module ResourceMethods
+ class Resources
+
+ def initialize(objects, resources)
+ @objects = objects
+ @resources = resources
+ end
+
# Returns a Hash of color spaces that are available to this page
#
# NOTE: this method de-serialise objects from the underlying PDF
@@ -14,7 +21,7 @@ module PDF
# of calling it over and over.
#
def color_spaces
- @objects.deref!(resources[:ColorSpace]) || {}
+ @objects.deref_hash!(@resources[:ColorSpace]) || {}
end
# Returns a Hash of fonts that are available to this page
@@ -24,7 +31,7 @@ module PDF
# of calling it over and over.
#
def fonts
- @objects.deref!(resources[:Font]) || {}
+ @objects.deref_hash!(@resources[:Font]) || {}
end
# Returns a Hash of external graphic states that are available to this
@@ -35,7 +42,7 @@ module PDF
# of calling it over and over.
#
def graphic_states
- @objects.deref!(resources[:ExtGState]) || {}
+ @objects.deref_hash!(@resources[:ExtGState]) || {}
end
# Returns a Hash of patterns that are available to this page
@@ -45,7 +52,7 @@ module PDF
# of calling it over and over.
#
def patterns
- @objects.deref!(resources[:Pattern]) || {}
+ @objects.deref_hash!(@resources[:Pattern]) || {}
end
# Returns an Array of procedure sets that are available to this page
@@ -55,7 +62,7 @@ module PDF
# of calling it over and over.
#
def procedure_sets
- @objects.deref!(resources[:ProcSet]) || []
+ @objects.deref_array!(@resources[:ProcSet]) || []
end
# Returns a Hash of properties sets that are available to this page
@@ -65,7 +72,7 @@ module PDF
# of calling it over and over.
#
def properties
- @objects.deref!(resources[:Properties]) || {}
+ @objects.deref_hash!(@resources[:Properties]) || {}
end
# Returns a Hash of shadings that are available to this page
@@ -75,7 +82,7 @@ module PDF
# of calling it over and over.
#
def shadings
- @objects.deref!(resources[:Shading]) || {}
+ @objects.deref_hash!(@resources[:Shading]) || {}
end
# Returns a Hash of XObjects that are available to this page
@@ -85,7 +92,8 @@ module PDF
# of calling it over and over.
#
def xobjects
- @objects.deref!(resources[:XObject]) || {}
+ dict = @objects.deref_hash!(@resources[:XObject]) || {}
+ TypeCheck.cast_to_pdf_dict_with_stream_values!(dict)
end
end
diff --git a/lib/pdf/reader/security_handler_factory.rb b/lib/pdf/reader/security_handler_factory.rb
new file mode 100644
index 0000000..30ca3e0
--- /dev/null
+++ b/lib/pdf/reader/security_handler_factory.rb
@@ -0,0 +1,79 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+class PDF::Reader
+ # Examines the Encrypt entry of a PDF trailer (if any) and returns an object that's
+ # able to decrypt the file.
+ class SecurityHandlerFactory
+
+ def self.build(encrypt, doc_id, password)
+ doc_id ||= []
+ password ||= ""
+
+ if encrypt.nil?
+ NullSecurityHandler.new
+ elsif standard?(encrypt)
+ build_standard_handler(encrypt, doc_id, password)
+ elsif standard_v5?(encrypt)
+ build_v5_handler(encrypt, doc_id, password)
+ else
+ UnimplementedSecurityHandler.new
+ end
+ end
+
+ def self.build_standard_handler(encrypt, doc_id, password)
+ encmeta = !encrypt.has_key?(:EncryptMetadata) || encrypt[:EncryptMetadata].to_s == "true"
+ key_builder = StandardKeyBuilder.new(
+ key_length: (encrypt[:Length] || 40).to_i,
+ revision: encrypt[:R],
+ owner_key: encrypt[:O],
+ user_key: encrypt[:U],
+ permissions: encrypt[:P].to_i,
+ encrypted_metadata: encmeta,
+ file_id: doc_id.first,
+ )
+ cfm = encrypt.fetch(:CF, {}).fetch(encrypt[:StmF], {}).fetch(:CFM, nil)
+ if cfm == :AESV2
+ AesV2SecurityHandler.new(key_builder.key(password))
+ else
+ Rc4SecurityHandler.new(key_builder.key(password))
+ end
+ end
+
+ def self.build_v5_handler(encrypt, doc_id, password)
+ key_builder = KeyBuilderV5.new(
+ owner_key: encrypt[:O],
+ user_key: encrypt[:U],
+ owner_encryption_key: encrypt[:OE],
+ user_encryption_key: encrypt[:UE],
+ )
+ AesV3SecurityHandler.new(key_builder.key(password))
+ end
+
+ # This handler supports all encryption that follows upto PDF 1.5 spec (revision 4)
+ def self.standard?(encrypt)
+ return false if encrypt.nil?
+
+ filter = encrypt.fetch(:Filter, :Standard)
+ version = encrypt.fetch(:V, 0)
+ algorithm = encrypt.fetch(:CF, {}).fetch(encrypt[:StmF], {}).fetch(:CFM, nil)
+ (filter == :Standard) && (encrypt[:StmF] == encrypt[:StrF]) &&
+ (version <= 3 || (version == 4 && ((algorithm == :V2) || (algorithm == :AESV2))))
+ end
+
+ # This handler supports both
+ # - AES-256 encryption defined in PDF 1.7 Extension Level 3 ('revision 5')
+ # - AES-256 encryption defined in PDF 2.0 ('revision 6')
+ def self.standard_v5?(encrypt)
+ return false if encrypt.nil?
+
+ filter = encrypt.fetch(:Filter, :Standard)
+ version = encrypt.fetch(:V, 0)
+ revision = encrypt.fetch(:R, 0)
+ algorithm = encrypt.fetch(:CF, {}).fetch(encrypt[:StmF], {}).fetch(:CFM, nil)
+ (filter == :Standard) && (encrypt[:StmF] == encrypt[:StrF]) &&
+ ((version == 5) && (revision == 5 || revision == 6) && (algorithm == :AESV3))
+ end
+ end
+end
diff --git a/lib/pdf/reader/standard_security_handler.rb b/lib/pdf/reader/standard_key_builder.rb
similarity index 53%
rename from lib/pdf/reader/standard_security_handler.rb
rename to lib/pdf/reader/standard_key_builder.rb
index 695ba42..5ba0516 100644
--- a/lib/pdf/reader/standard_security_handler.rb
+++ b/lib/pdf/reader/standard_key_builder.rb
@@ -1,38 +1,19 @@
# coding: utf-8
-# frozen_string_literal: true
-################################################################################
-#
-# Copyright (C) 2011 Evan J Brunner (ejbrun@appittome.com)
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-################################################################################
require 'digest/md5'
-require 'openssl'
require 'rc4'
class PDF::Reader
- # class creates interface to encrypt dictionary for use in Decrypt
- class StandardSecurityHandler
+ # Processes the Encrypt dict from an encrypted PDF and a user provided
+ # password and returns a key that can decrypt the file.
+ #
+ # This can generate a key compatible with the following standard encryption algorithms:
+ #
+ # * Version 1-3, all variants
+ # * Version 4, V2 (RC4) and AESV2
+ #
+ class StandardKeyBuilder
## 7.6.3.3 Encryption Key Algorithm (pp61)
#
@@ -44,9 +25,6 @@ class PDF::Reader
0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80,
0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a ]
- attr_reader :key_length, :revision, :encrypt_key
- attr_reader :owner_key, :user_key, :permissions, :file_id, :password
-
def initialize(opts = {})
@key_length = opts[:key_length].to_i/8
@revision = opts[:revision].to_i
@@ -55,72 +33,30 @@ class PDF::Reader
@permissions = opts[:permissions].to_i
@encryptMeta = opts.fetch(:encrypted_metadata, true)
@file_id = opts[:file_id] || ""
- @encrypt_key = build_standard_key(opts[:password] || "")
- @cfm = opts[:cfm]
if @key_length != 5 && @key_length != 16
- msg = "StandardSecurityHandler only supports 40 and 128 bit\
+ msg = "StandardKeyBuilder only supports 40 and 128 bit\
encryption (#{@key_length * 8}bit)"
- raise ArgumentError, msg
+ raise UnsupportedFeatureError, msg
end
end
- # This handler supports all encryption that follows upto PDF 1.5 spec (revision 4)
- def self.supports?(encrypt)
- return false if encrypt.nil?
-
- filter = encrypt.fetch(:Filter, :Standard)
- version = encrypt.fetch(:V, 0)
- algorithm = encrypt.fetch(:CF, {}).fetch(encrypt[:StmF], {}).fetch(:CFM, nil)
- (filter == :Standard) && (encrypt[:StmF] == encrypt[:StrF]) &&
- (version <= 3 || (version == 4 && ((algorithm == :V2) || (algorithm == :AESV2))))
- end
-
- ##7.6.2 General Encryption Algorithm
- #
- # Algorithm 1: Encryption of data using the RC4 or AES algorithms
- #
- # used to decrypt RC4/AES encrypted PDF streams (buf)
+ # Takes a string containing a user provided password.
#
- # buf - a string to decrypt
- # ref - a PDF::Reader::Reference for the object to decrypt
+ # If the password matches the file, then a string containing a key suitable for
+ # decrypting the file will be returned. If the password doesn't match the file,
+ # and exception will be raised.
#
- def decrypt( buf, ref )
- case @cfm
- when :AESV2
- decrypt_aes128(buf, ref)
- else
- decrypt_rc4(buf, ref)
- end
- end
-
- private
+ def key(pass)
+ pass ||= ""
+ encrypt_key = auth_owner_pass(pass)
+ encrypt_key ||= auth_user_pass(pass)
- # decrypt with RC4 algorithm
- # version <=3 or (version == 4 and CFM == V2)
- def decrypt_rc4( buf, ref )
- objKey = @encrypt_key.dup
- (0..2).each { |e| objKey << (ref.id >> e*8 & 0xFF ) }
- (0..1).each { |e| objKey << (ref.gen >> e*8 & 0xFF ) }
- length = objKey.length < 16 ? objKey.length : 16
- rc4 = RC4.new( Digest::MD5.digest(objKey)[0,length] )
- rc4.decrypt(buf)
+ raise PDF::Reader::EncryptedPDFError, "Invalid password (#{pass})" if encrypt_key.nil?
+ encrypt_key
end
- # decrypt with AES-128-CBC algorithm
- # when (version == 4 and CFM == AESV2)
- def decrypt_aes128( buf, ref )
- objKey = @encrypt_key.dup
- (0..2).each { |e| objKey << (ref.id >> e*8 & 0xFF ) }
- (0..1).each { |e| objKey << (ref.gen >> e*8 & 0xFF ) }
- objKey << 'sAlT' # Algorithm 1, b)
- length = objKey.length < 16 ? objKey.length : 16
- cipher = OpenSSL::Cipher.new("AES-#{length << 3}-CBC")
- cipher.decrypt
- cipher.key = Digest::MD5.digest(objKey)[0,length]
- cipher.iv = buf[0..15]
- cipher.update(buf[16..-1]) + cipher.final
- end
+ private
# Pads supplied password to 32bytes using PassPadBytes as specified on
# pp61 of spec
@@ -152,7 +88,7 @@ class PDF::Reader
md5 = Digest::MD5.digest(pad_pass(pass))
if @revision > 2 then
50.times { md5 = Digest::MD5.digest(md5) }
- keyBegins = md5[0, key_length]
+ keyBegins = md5[0, @key_length]
#first iteration decrypt owner_key
out = @owner_key
#RC4 keyed with (keyBegins XOR with iteration #) to decrypt previous out
@@ -217,12 +153,5 @@ class PDF::Reader
end
end
- def build_standard_key(pass)
- encrypt_key = auth_owner_pass(pass)
- encrypt_key ||= auth_user_pass(pass)
-
- raise PDF::Reader::EncryptedPDFError, "Invalid password (#{pass})" if encrypt_key.nil?
- encrypt_key
- end
end
end
diff --git a/lib/pdf/reader/standard_security_handler_v5.rb b/lib/pdf/reader/standard_security_handler_v5.rb
deleted file mode 100644
index 89360af..0000000
--- a/lib/pdf/reader/standard_security_handler_v5.rb
+++ /dev/null
@@ -1,91 +0,0 @@
-# coding: utf-8
-# frozen_string_literal: true
-
-require 'digest'
-require 'openssl'
-
-class PDF::Reader
-
- # class creates interface to encrypt dictionary for use in Decrypt
- class StandardSecurityHandlerV5
-
- attr_reader :key_length, :encrypt_key
-
- def initialize(opts = {})
- @key_length = 256
- @O = opts[:O] # hash(32B) + validation salt(8B) + key salt(8B)
- @U = opts[:U] # hash(32B) + validation salt(8B) + key salt(8B)
- @OE = opts[:OE] # decryption key, encrypted w/ owner password
- @UE = opts[:UE] # decryption key, encrypted w/ user password
- @encrypt_key = build_standard_key(opts[:password] || '')
- end
-
- # This handler supports AES-256 encryption defined in PDF 1.7 Extension Level 3
- def self.supports?(encrypt)
- return false if encrypt.nil?
-
- filter = encrypt.fetch(:Filter, :Standard)
- version = encrypt.fetch(:V, 0)
- revision = encrypt.fetch(:R, 0)
- algorithm = encrypt.fetch(:CF, {}).fetch(encrypt[:StmF], {}).fetch(:CFM, nil)
- (filter == :Standard) && (encrypt[:StmF] == encrypt[:StrF]) &&
- ((version == 5) && (revision == 5) && (algorithm == :AESV3))
- end
-
- ##7.6.2 General Encryption Algorithm
- #
- # Algorithm 1: Encryption of data using the RC4 or AES algorithms
- #
- # used to decrypt RC4/AES encrypted PDF streams (buf)
- #
- # buf - a string to decrypt
- # ref - a PDF::Reader::Reference for the object to decrypt
- #
- def decrypt( buf, ref )
- cipher = OpenSSL::Cipher.new("AES-#{@key_length}-CBC")
- cipher.decrypt
- cipher.key = @encrypt_key.dup
- cipher.iv = buf[0..15]
- cipher.update(buf[16..-1]) + cipher.final
- end
-
- private
- # Algorithm 3.2a - Computing an encryption key
- #
- # Defined in PDF 1.7 Extension Level 3
- #
- # if the string is a valid user/owner password, this will return the decryption key
- #
- def auth_owner_pass(password)
- if Digest::SHA256.digest(password + @O[32..39] + @U) == @O[0..31]
- cipher = OpenSSL::Cipher.new('AES-256-CBC')
- cipher.decrypt
- cipher.key = Digest::SHA256.digest(password + @O[40..-1] + @U)
- cipher.iv = "\x00" * 16
- cipher.padding = 0
- cipher.update(@OE) + cipher.final
- end
- end
-
- def auth_user_pass(password)
- if Digest::SHA256.digest(password + @U[32..39]) == @U[0..31]
- cipher = OpenSSL::Cipher.new('AES-256-CBC')
- cipher.decrypt
- cipher.key = Digest::SHA256.digest(password + @U[40..-1])
- cipher.iv = "\x00" * 16
- cipher.padding = 0
- cipher.update(@UE) + cipher.final
- end
- end
-
- def build_standard_key(pass)
- pass = pass.byteslice(0...127) # UTF-8 encoded password. first 127 bytes
-
- encrypt_key = auth_owner_pass(pass)
- encrypt_key ||= auth_user_pass(pass)
-
- raise PDF::Reader::EncryptedPDFError, "Invalid password (#{pass})" if encrypt_key.nil?
- encrypt_key
- end
- end
-end
diff --git a/lib/pdf/reader/stream.rb b/lib/pdf/reader/stream.rb
index d01f4b0..3d0e907 100644
--- a/lib/pdf/reader/stream.rb
+++ b/lib/pdf/reader/stream.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
################################################################################
@@ -39,7 +40,7 @@ class PDF::Reader
# Creates a new stream with the specified dictionary and data. The dictionary
# should be a standard ruby hash, the data should be a standard ruby string.
def initialize(hash, data)
- @hash = hash
+ @hash = TypeCheck.cast_to_pdf_dict!(hash)
@data = data
@udata = nil
end
@@ -61,7 +62,7 @@ class PDF::Reader
end
Array(hash[:Filter]).each_with_index do |filter, index|
- @udata = Filter.with(filter, options[index]).filter(@udata)
+ @udata = Filter.with(filter, options[index] || {}).filter(@udata)
end
end
@udata
diff --git a/lib/pdf/reader/synchronized_cache.rb b/lib/pdf/reader/synchronized_cache.rb
index b741f79..03549a4 100644
--- a/lib/pdf/reader/synchronized_cache.rb
+++ b/lib/pdf/reader/synchronized_cache.rb
@@ -1,4 +1,5 @@
# encoding: utf-8
+# typed: strict
# frozen_string_literal: true
# utilities.rb : General-purpose utility classes which don't fit anywhere else
diff --git a/lib/pdf/reader/text_run.rb b/lib/pdf/reader/text_run.rb
index f78edd8..9daa0b4 100644
--- a/lib/pdf/reader/text_run.rb
+++ b/lib/pdf/reader/text_run.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
class PDF::Reader
@@ -6,15 +7,17 @@ class PDF::Reader
class TextRun
include Comparable
- attr_reader :x, :y, :width, :font_size, :text
+ attr_reader :origin
+ attr_reader :width
+ attr_reader :font_size
+ attr_reader :text
alias :to_s :text
def initialize(x, y, width, font_size, text)
- @x = x
- @y = y
+ @origin = PDF::Reader::Point.new(x, y)
@width = width
- @font_size = font_size.floor
+ @font_size = font_size
@text = text
end
@@ -34,12 +37,20 @@ class PDF::Reader
end
end
+ def x
+ @origin.x
+ end
+
+ def y
+ @origin.y
+ end
+
def endx
- @endx ||= x + width
+ @endx ||= @origin.x + width
end
def endy
- @endy ||= y + font_size
+ @endy ||= @origin.y + font_size
end
def mean_character_width
diff --git a/lib/pdf/reader/token.rb b/lib/pdf/reader/token.rb
index 3e056df..c2b7bdc 100644
--- a/lib/pdf/reader/token.rb
+++ b/lib/pdf/reader/token.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
################################################################################
diff --git a/lib/pdf/reader/transformation_matrix.rb b/lib/pdf/reader/transformation_matrix.rb
index db24a33..1defc36 100644
--- a/lib/pdf/reader/transformation_matrix.rb
+++ b/lib/pdf/reader/transformation_matrix.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
class PDF::Reader
@@ -50,7 +51,7 @@ class PDF::Reader
# displacement to speed up processing documents that use vertical
# writing systems
#
- def multiply!(a,b=nil,c=nil, d=nil,e=nil,f=nil)
+ def multiply!(a,b,c, d,e,f)
if a == 1 && b == 0 && c == 0 && d == 1 && e == 0 && f == 0
# the identity matrix, no effect
self
@@ -163,12 +164,12 @@ class PDF::Reader
# [ e f 1 ] [ e f 1 ]
#
def regular_multiply!(a2,b2,c2,d2,e2,f2)
- newa = (@a * a2) + (@b * c2) + (0 * e2)
- newb = (@a * b2) + (@b * d2) + (0 * f2)
- newc = (@c * a2) + (@d * c2) + (0 * e2)
- newd = (@c * b2) + (@d * d2) + (0 * f2)
- newe = (@e * a2) + (@f * c2) + (1 * e2)
- newf = (@e * b2) + (@f * d2) + (1 * f2)
+ newa = (@a * a2) + (@b * c2) + (e2 * 0)
+ newb = (@a * b2) + (@b * d2) + (f2 * 0)
+ newc = (@c * a2) + (@d * c2) + (e2 * 0)
+ newd = (@c * b2) + (@d * d2) + (f2 * 0)
+ newe = (@e * a2) + (@f * c2) + (e2 * 1)
+ newf = (@e * b2) + (@f * d2) + (f2 * 1)
@a, @b, @c, @d, @e, @f = newa, newb, newc, newd, newe, newf
end
diff --git a/lib/pdf/reader/type_check.rb b/lib/pdf/reader/type_check.rb
new file mode 100644
index 0000000..2152d45
--- /dev/null
+++ b/lib/pdf/reader/type_check.rb
@@ -0,0 +1,98 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+module PDF
+ class Reader
+
+ # Cast untrusted input (usually parsed out of a PDF file) to a known type
+ #
+ class TypeCheck
+
+ def self.cast_to_int!(obj)
+ if obj.is_a?(Integer)
+ obj
+ elsif obj.nil?
+ 0
+ elsif obj.respond_to?(:to_i)
+ obj.to_i
+ else
+ raise MalformedPDFError, "Unable to cast to integer"
+ end
+ end
+
+ def self.cast_to_numeric!(obj)
+ if obj.is_a?(Numeric)
+ obj
+ elsif obj.nil?
+ 0
+ elsif obj.respond_to?(:to_f)
+ obj.to_f
+ elsif obj.respond_to?(:to_i)
+ obj.to_i
+ else
+ raise MalformedPDFError, "Unable to cast to numeric"
+ end
+ end
+
+ def self.cast_to_string!(string)
+ if string.is_a?(String)
+ string
+ elsif string.nil?
+ ""
+ elsif string.respond_to?(:to_s)
+ string.to_s
+ else
+ raise MalformedPDFError, "Unable to cast to string"
+ end
+ end
+
+ def self.cast_to_symbol(obj)
+ if obj.is_a?(Symbol)
+ obj
+ elsif obj.nil?
+ nil
+ elsif obj.respond_to?(:to_sym)
+ obj.to_sym
+ else
+ raise MalformedPDFError, "Unable to cast to symbol"
+ end
+ end
+
+ def self.cast_to_symbol!(obj)
+ res = cast_to_symbol(obj)
+ if res
+ res
+ else
+ raise MalformedPDFError, "Unable to cast to symbol"
+ end
+ end
+
+ def self.cast_to_pdf_dict!(obj)
+ if obj.is_a?(Hash)
+ obj
+ elsif obj.respond_to?(:to_h)
+ obj.to_h
+ else
+ raise MalformedPDFError, "Unable to cast to hash"
+ end
+ end
+
+ def self.cast_to_pdf_dict_with_stream_values!(obj)
+ if obj.is_a?(Hash)
+ result = Hash.new
+ obj.each do |k, v|
+ raise MalformedPDFError, "Expected a stream" unless v.is_a?(PDF::Reader::Stream)
+ result[cast_to_symbol!(k)] = v
+ end
+ result
+ elsif obj.respond_to?(:to_h)
+ cast_to_pdf_dict_with_stream_values!(obj.to_h)
+ else
+ raise MalformedPDFError, "Unable to cast to hash"
+ end
+ end
+ end
+ end
+end
+
diff --git a/lib/pdf/reader/unimplemented_security_handler.rb b/lib/pdf/reader/unimplemented_security_handler.rb
index 3fb1505..265b799 100644
--- a/lib/pdf/reader/unimplemented_security_handler.rb
+++ b/lib/pdf/reader/unimplemented_security_handler.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
class PDF::Reader
diff --git a/lib/pdf/reader/validating_receiver.rb b/lib/pdf/reader/validating_receiver.rb
new file mode 100644
index 0000000..c9c4464
--- /dev/null
+++ b/lib/pdf/reader/validating_receiver.rb
@@ -0,0 +1,262 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+module PDF
+ class Reader
+
+ # Page#walk will execute the content stream of a page, calling methods on a receiver class
+ # provided by the user. Each operator has a specific set of parameters it expects, and we
+ # wrap the users receiver class in this one to verify the PDF uses valid parameters.
+ #
+ # Without these checks, users can't be confident about the number of parameters they'll receive
+ # for an operator, or what the type of those parameters will be. Everyone ends up building their
+ # own type safety guard clauses and it's tedious.
+ #
+ # Not all operators have type safety implemented yet, but we can expand the number over time.
+ class ValidatingReceiver
+
+ def initialize(wrapped)
+ @wrapped = wrapped
+ end
+
+ def page=(page)
+ call_wrapped(:page=, page)
+ end
+
+ #####################################################
+ # Graphics State Operators
+ #####################################################
+ def save_graphics_state(*args)
+ call_wrapped(:save_graphics_state)
+ end
+
+ def restore_graphics_state(*args)
+ call_wrapped(:restore_graphics_state)
+ end
+
+ #####################################################
+ # Matrix Operators
+ #####################################################
+
+ def concatenate_matrix(*args)
+ a, b, c, d, e, f = *args
+ call_wrapped(
+ :concatenate_matrix,
+ TypeCheck.cast_to_numeric!(a),
+ TypeCheck.cast_to_numeric!(b),
+ TypeCheck.cast_to_numeric!(c),
+ TypeCheck.cast_to_numeric!(d),
+ TypeCheck.cast_to_numeric!(e),
+ TypeCheck.cast_to_numeric!(f),
+ )
+ end
+
+ #####################################################
+ # Text Object Operators
+ #####################################################
+
+ def begin_text_object(*args)
+ call_wrapped(:begin_text_object)
+ end
+
+ def end_text_object(*args)
+ call_wrapped(:end_text_object)
+ end
+
+ #####################################################
+ # Text State Operators
+ #####################################################
+ def set_character_spacing(*args)
+ char_spacing, _ = *args
+ call_wrapped(
+ :set_character_spacing,
+ TypeCheck.cast_to_numeric!(char_spacing)
+ )
+ end
+
+ def set_horizontal_text_scaling(*args)
+ h_scaling, _ = *args
+ call_wrapped(
+ :set_horizontal_text_scaling,
+ TypeCheck.cast_to_numeric!(h_scaling)
+ )
+ end
+
+ def set_text_font_and_size(*args)
+ label, size, _ = *args
+ call_wrapped(
+ :set_text_font_and_size,
+ TypeCheck.cast_to_symbol(label),
+ TypeCheck.cast_to_numeric!(size)
+ )
+ end
+
+ def set_text_leading(*args)
+ leading, _ = *args
+ call_wrapped(
+ :set_text_leading,
+ TypeCheck.cast_to_numeric!(leading)
+ )
+ end
+
+ def set_text_rendering_mode(*args)
+ mode, _ = *args
+ call_wrapped(
+ :set_text_rendering_mode,
+ TypeCheck.cast_to_numeric!(mode)
+ )
+ end
+
+ def set_text_rise(*args)
+ rise, _ = *args
+ call_wrapped(
+ :set_text_rise,
+ TypeCheck.cast_to_numeric!(rise)
+ )
+ end
+
+ def set_word_spacing(*args)
+ word_spacing, _ = *args
+ call_wrapped(
+ :set_word_spacing,
+ TypeCheck.cast_to_numeric!(word_spacing)
+ )
+ end
+
+ #####################################################
+ # Text Positioning Operators
+ #####################################################
+
+ def move_text_position(*args) # Td
+ x, y, _ = *args
+ call_wrapped(
+ :move_text_position,
+ TypeCheck.cast_to_numeric!(x),
+ TypeCheck.cast_to_numeric!(y)
+ )
+ end
+
+ def move_text_position_and_set_leading(*args) # TD
+ x, y, _ = *args
+ call_wrapped(
+ :move_text_position_and_set_leading,
+ TypeCheck.cast_to_numeric!(x),
+ TypeCheck.cast_to_numeric!(y)
+ )
+ end
+
+ def set_text_matrix_and_text_line_matrix(*args) # Tm
+ a, b, c, d, e, f = *args
+ call_wrapped(
+ :set_text_matrix_and_text_line_matrix,
+ TypeCheck.cast_to_numeric!(a),
+ TypeCheck.cast_to_numeric!(b),
+ TypeCheck.cast_to_numeric!(c),
+ TypeCheck.cast_to_numeric!(d),
+ TypeCheck.cast_to_numeric!(e),
+ TypeCheck.cast_to_numeric!(f),
+ )
+ end
+
+ def move_to_start_of_next_line(*args) # T*
+ call_wrapped(:move_to_start_of_next_line)
+ end
+
+ #####################################################
+ # Text Showing Operators
+ #####################################################
+ def show_text(*args) # Tj (AWAY)
+ string, _ = *args
+ call_wrapped(
+ :show_text,
+ TypeCheck.cast_to_string!(string)
+ )
+ end
+
+ def show_text_with_positioning(*args) # TJ [(A) 120 (WA) 20 (Y)]
+ params, _ = *args
+ unless params.is_a?(Array)
+ raise MalformedPDFError, "TJ operator expects a single Array argument"
+ end
+
+ call_wrapped(
+ :show_text_with_positioning,
+ params
+ )
+ end
+
+ def move_to_next_line_and_show_text(*args) # '
+ string, _ = *args
+ call_wrapped(
+ :move_to_next_line_and_show_text,
+ TypeCheck.cast_to_string!(string)
+ )
+ end
+
+ def set_spacing_next_line_show_text(*args) # "
+ aw, ac, string = *args
+ call_wrapped(
+ :set_spacing_next_line_show_text,
+ TypeCheck.cast_to_numeric!(aw),
+ TypeCheck.cast_to_numeric!(ac),
+ TypeCheck.cast_to_string!(string)
+ )
+ end
+
+ #####################################################
+ # Form XObject Operators
+ #####################################################
+
+ def invoke_xobject(*args)
+ label, _ = *args
+
+ call_wrapped(
+ :invoke_xobject,
+ TypeCheck.cast_to_symbol(label)
+ )
+ end
+
+ #####################################################
+ # Inline Image Operators
+ #####################################################
+
+ def begin_inline_image(*args)
+ call_wrapped(:begin_inline_image)
+ end
+
+ def begin_inline_image_data(*args)
+ # We can't use call_wrapped() here because sorbet won't allow splat args with a dynamic
+ # number of elements
+ @wrapped.begin_inline_image_data(*args) if @wrapped.respond_to?(:begin_inline_image_data)
+ end
+
+ def end_inline_image(*args)
+ data, _ = *args
+
+ call_wrapped(
+ :end_inline_image,
+ TypeCheck.cast_to_string!(data)
+ )
+ end
+
+ #####################################################
+ # Final safety net for any operators that don't have type checking enabled yet
+ #####################################################
+
+ def respond_to?(meth)
+ @wrapped.respond_to?(meth)
+ end
+
+ def method_missing(methodname, *args)
+ @wrapped.send(methodname, *args)
+ end
+
+ private
+
+ def call_wrapped(methodname, *args)
+ @wrapped.send(methodname, *args) if @wrapped.respond_to?(methodname)
+ end
+ end
+ end
+end
diff --git a/lib/pdf/reader/width_calculator.rb b/lib/pdf/reader/width_calculator.rb
index 6d3f0da..3874ae9 100644
--- a/lib/pdf/reader/width_calculator.rb
+++ b/lib/pdf/reader/width_calculator.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
# PDF files may define fonts in a number of ways. Each approach means we must
diff --git a/lib/pdf/reader/width_calculator/built_in.rb b/lib/pdf/reader/width_calculator/built_in.rb
index 8ae3fb4..9a4823c 100644
--- a/lib/pdf/reader/width_calculator/built_in.rb
+++ b/lib/pdf/reader/width_calculator/built_in.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
require 'afm'
@@ -37,35 +38,28 @@ class PDF::Reader
def glyph_width(code_point)
return 0 if code_point.nil? || code_point < 0
- m = @metrics.char_metrics_by_code[code_point]
- if m.nil?
- names = @font.encoding.int_to_name(code_point)
+ names = @font.encoding.int_to_name(code_point)
+ metrics = names.map { |name|
+ @metrics.char_metrics[name.to_s]
+ }.compact.first
- m = names.map { |name|
- @metrics.char_metrics[name.to_s]
- }.compact.first
- end
-
- if m
- m[:wx]
- elsif @font.widths[code_point - 1]
- @font.widths[code_point - 1]
- elsif control_character?(code_point)
- 0
+ if metrics
+ metrics[:wx]
else
- 0
+ @font.widths[code_point - 1] || 0
end
end
private
def control_character?(code_point)
- @font.encoding.int_to_name(code_point).first.to_s[/\Acontrol..\Z/]
+ match = @font.encoding.int_to_name(code_point).first.to_s[/\Acontrol..\Z/]
+ match ? true : false
end
def extract_basefont(font_name)
if BUILTINS.include?(font_name)
- font_name
+ font_name.to_s
else
"Times-Roman"
end
diff --git a/lib/pdf/reader/width_calculator/composite.rb b/lib/pdf/reader/width_calculator/composite.rb
index 52e0c20..7824619 100644
--- a/lib/pdf/reader/width_calculator/composite.rb
+++ b/lib/pdf/reader/width_calculator/composite.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
class PDF::Reader
@@ -21,7 +22,11 @@ class PDF::Reader
w = @widths[code_point]
# 0 is a valid width
- return w.to_f unless w.nil?
+ if w
+ w.to_f
+ else
+ 0
+ end
end
end
end
diff --git a/lib/pdf/reader/width_calculator/true_type.rb b/lib/pdf/reader/width_calculator/true_type.rb
index eb0250f..b1e7f2a 100644
--- a/lib/pdf/reader/width_calculator/true_type.rb
+++ b/lib/pdf/reader/width_calculator/true_type.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
class PDF::Reader
@@ -9,8 +10,8 @@ class PDF::Reader
def initialize(font)
@font = font
- if @font.font_descriptor
- @missing_width = @font.font_descriptor.missing_width
+ if fd = @font.font_descriptor
+ @missing_width = fd.missing_width
else
@missing_width = 0
end
@@ -29,25 +30,23 @@ class PDF::Reader
# in ruby a negative index is valid, and will go from the end of the array
# which is undesireable in this case.
- if @font.first_char <= code_point
- @font.widths.fetch(code_point - @font.first_char, @missing_width).to_f
+ first_char = @font.first_char
+ if first_char && first_char <= code_point
+ @font.widths.fetch(code_point - first_char, @missing_width.to_i).to_f
else
@missing_width.to_f
end
end
def glyph_width_from_descriptor(code_point)
- return unless @font.font_descriptor
-
# true type fonts will have most of their information contained
# with-in a program inside the font descriptor, however the widths
# may not be in standard PDF glyph widths (1000 units => 1 text space unit)
# so this width will need to be scaled
- w = @font.font_descriptor.glyph_width(code_point)
- if w
- w.to_f * @font.font_descriptor.glyph_to_pdf_scale_factor
- else
- nil
+ if fd = @font.font_descriptor
+ if w = fd.glyph_width(code_point)
+ w.to_f * fd.glyph_to_pdf_scale_factor.to_f
+ end
end
end
end
diff --git a/lib/pdf/reader/width_calculator/type_one_or_three.rb b/lib/pdf/reader/width_calculator/type_one_or_three.rb
index e432300..0d174da 100644
--- a/lib/pdf/reader/width_calculator/type_one_or_three.rb
+++ b/lib/pdf/reader/width_calculator/type_one_or_three.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
class PDF::Reader
@@ -9,8 +10,8 @@ class PDF::Reader
def initialize(font)
@font = font
- if @font.font_descriptor
- @missing_width = @font.font_descriptor.missing_width
+ if fd = @font.font_descriptor
+ @missing_width = fd.missing_width
else
@missing_width = 0
end
@@ -22,8 +23,9 @@ class PDF::Reader
# in ruby a negative index is valid, and will go from the end of the array
# which is undesireable in this case.
- if @font.first_char <= code_point
- @font.widths.fetch(code_point - @font.first_char, @missing_width).to_f
+ first_char = @font.first_char
+ if first_char && first_char <= code_point
+ @font.widths.fetch(code_point - first_char, @missing_width.to_i).to_f
else
@missing_width.to_f
end
diff --git a/lib/pdf/reader/width_calculator/type_zero.rb b/lib/pdf/reader/width_calculator/type_zero.rb
index 0818726..618c1a8 100644
--- a/lib/pdf/reader/width_calculator/type_zero.rb
+++ b/lib/pdf/reader/width_calculator/type_zero.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: strict
# frozen_string_literal: true
class PDF::Reader
@@ -12,13 +13,16 @@ class PDF::Reader
def initialize(font)
@font = font
- @descendant_font = @font.descendantfonts.first
end
def glyph_width(code_point)
return 0 if code_point.nil? || code_point < 0
- @descendant_font.glyph_width(code_point).to_f
+ if descendant_font = @font.descendantfonts.first
+ descendant_font.glyph_width(code_point).to_f
+ else
+ 0
+ end
end
end
end
diff --git a/lib/pdf/reader/xref.rb b/lib/pdf/reader/xref.rb
index 4f15da2..fe36c14 100644
--- a/lib/pdf/reader/xref.rb
+++ b/lib/pdf/reader/xref.rb
@@ -1,4 +1,5 @@
# coding: utf-8
+# typed: true
# frozen_string_literal: true
################################################################################
@@ -72,7 +73,7 @@ class PDF::Reader
#
# ref - a PDF::Reader::Reference object containing an object ID and revision number
def [](ref)
- @xref[ref.id][ref.gen]
+ @xref.fetch(ref.id, {}).fetch(ref.gen)
rescue
raise InvalidObjectError, "Object #{ref.id}, Generation #{ref.gen} is invalid"
end
@@ -81,8 +82,8 @@ class PDF::Reader
def each(&block)
ids = @xref.keys.sort
ids.each do |id|
- gen = @xref[id].keys.sort[-1]
- yield PDF::Reader::Reference.new(id, gen)
+ gen = @xref.fetch(id, {}).keys.sort[-1]
+ yield PDF::Reader::Reference.new(id, gen.to_i)
end
end
################################################################################
@@ -103,13 +104,18 @@ class PDF::Reader
buf = new_buffer(offset)
tok_one = buf.token
+ # we have a traditional xref table
return load_xref_table(buf) if tok_one == "xref" || tok_one == "ref"
tok_two = buf.token
tok_three = buf.token
+ # we have an XRef stream
if tok_one.to_i >= 0 && tok_two.to_i >= 0 && tok_three == "obj"
buf = new_buffer(offset)
+ # Maybe we should be parsing the ObjectHash second argument to the Parser here,
+ # to handle the case where an XRef Stream has the Length specified via an
+ # indirect object
stream = PDF::Reader::Parser.new(buf).object(tok_one.to_i, tok_two.to_i)
return load_xref_stream(stream)
end
@@ -125,12 +131,19 @@ class PDF::Reader
while !params.include?("trailer") && !params.include?(nil)
if params.size == 2
+ unless params[0].to_s.match(/\A\d+\z/)
+ raise MalformedPDFError, "invalid xref table, expected object ID"
+ end
+
objid, count = params[0].to_i, params[1].to_i
count.times do
offset = buf.token.to_i
generation = buf.token.to_i
state = buf.token
+ # Some PDF writers start numbering at 1 instead of 0. Fix up the number.
+ # TODO should this fix be logged?
+ objid = 0 if objid == 1 and offset == 0 and generation == 65535 and state == 'f'
store(objid, generation, offset + @junk_offset) if state == "n" && offset > 0
objid += 1
params.clear
@@ -139,14 +152,16 @@ class PDF::Reader
params << buf.token
end
- trailer = Parser.new(buf, self).parse_token
+ trailer = Parser.new(buf).parse_token
unless trailer.kind_of?(Hash)
raise MalformedPDFError, "PDF malformed, trailer should be a dictionary"
end
load_offsets(trailer[:XRefStm]) if trailer.has_key?(:XRefStm)
- load_offsets(trailer[:Prev].to_i) if trailer.has_key?(:Prev)
+ # Some PDF creators seem to use '/Prev 0' in trailer if there is no previous xref
+ # It's not possible for an xref to appear at offset 0, so can safely skip the ref
+ load_offsets(trailer[:Prev].to_i) if trailer.has_key?(:Prev) and trailer[:Prev].to_i != 0
trailer
end
@@ -162,8 +177,16 @@ class PDF::Reader
[:Size, :Prev, :Root, :Encrypt, :Info, :ID].include?(key)
}]
- widths = stream.hash[:W]
- entry_length = widths.inject(0) { |s, w| s + w }
+ widths = stream.hash[:W]
+
+ PDF::Reader::Error.validate_type_as_malformed(widths, "xref stream widths", Array)
+
+ entry_length = widths.inject(0) { |s, w|
+ unless w.is_a?(Integer)
+ w = 0
+ end
+ s + w
+ }
raw_data = StringIO.new(stream.unfiltered_data)
if stream.hash[:Index]
index = stream.hash[:Index]
diff --git a/lib/pdf/reader/zero_width_runs_filter.rb b/lib/pdf/reader/zero_width_runs_filter.rb
new file mode 100644
index 0000000..efe236f
--- /dev/null
+++ b/lib/pdf/reader/zero_width_runs_filter.rb
@@ -0,0 +1,13 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+class PDF::Reader
+ # There's no point rendering zero-width characters
+ class ZeroWidthRunsFilter
+
+ def self.exclude_zero_width_runs(runs)
+ runs.reject { |run| run.width == 0 }
+ end
+ end
+end
diff --git a/pdf-reader.gemspec b/pdf-reader.gemspec
index c10c136..436e4ef 100644
--- a/pdf-reader.gemspec
+++ b/pdf-reader.gemspec
@@ -2,11 +2,11 @@
# which will make the gem filesize irritatingly large
Gem::Specification.new do |spec|
spec.name = "pdf-reader"
- spec.version = "2.4.1"
+ spec.version = "2.11.0"
spec.summary = "A library for accessing the content of PDF files"
spec.description = "The PDF::Reader library implements a PDF parser conforming as much as possible to the PDF specification from Adobe"
spec.license = "MIT"
- spec.files = Dir.glob("{examples,lib}/**/**/*") + ["Rakefile"]
+ spec.files = Dir.glob("{examples,lib,rbi}/**/**/*") + ["Rakefile"]
spec.executables << "pdf_object"
spec.executables << "pdf_text"
spec.executables << "pdf_callbacks"
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
spec.authors = ["James Healy"]
spec.email = ["james@yob.id.au"]
spec.homepage = "https://github.com/yob/pdf-reader"
- spec.required_ruby_version = ">=1.9.3"
+ spec.required_ruby_version = ">=2.0"
if spec.respond_to?(:metadata)
spec.metadata = {
@@ -34,7 +34,7 @@ Gem::Specification.new do |spec|
spec.add_development_dependency("pry")
spec.add_development_dependency("rdoc")
- spec.add_dependency('Ascii85', '~> 1.0.0')
+ spec.add_dependency('Ascii85', '~> 1.0')
spec.add_dependency('ruby-rc4')
spec.add_dependency('hashery', '~> 2.0')
spec.add_dependency('ttfunk')
diff --git a/rbi/pdf-reader.rbi b/rbi/pdf-reader.rbi
new file mode 100644
index 0000000..d0de85b
--- /dev/null
+++ b/rbi/pdf-reader.rbi
@@ -0,0 +1,2048 @@
+# typed: strong
+module PDF
+ class Reader
+ sig { returns(PDF::Reader::ObjectHash) }
+ attr_reader :objects
+
+ sig { params(input: T.any(String, Tempfile, IO), opts: T::Hash[T.untyped, T.untyped]).void }
+ def initialize(input, opts = {})
+ @cache = T.let(T.unsafe(nil), PDF::Reader::ObjectCache)
+ @objects = T.let(T.unsafe(nil), PDF::Reader::ObjectHash)
+ @page_count = T.let(T.unsafe(nil), T.nilable(Integer))
+ @root = T.let(T.unsafe(nil), T.nilable(T.nilable(T::Hash[Symbol, T.untyped])))
+ end
+
+ sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
+ def info; end
+
+ sig { returns(T.nilable(String)) }
+ def metadata; end
+
+ sig { returns(Integer) }
+ def page_count; end
+
+ sig { returns(Float) }
+ def pdf_version; end
+
+ sig { params(input: T.any(String, Tempfile, IO), opts: T::Hash[T.untyped, T.untyped], block: T.proc.params(arg0: PDF::Reader).void).returns(T.untyped) }
+ def self.open(input, opts = {}, &block); end
+
+ sig { returns(T::Array[PDF::Reader::Page]) }
+ def pages; end
+
+ sig { params(num: Integer).returns(PDF::Reader::Page) }
+ def page(num); end
+
+ sig { params(obj: T.untyped).returns(T.untyped) }
+ def doc_strings_to_utf8(obj); end
+
+ sig { params(str: String).returns(T::Boolean)}
+ def has_utf16_bom?(str); end
+
+ sig { params(obj: String).returns(String) }
+ def pdfdoc_to_utf8(obj); end
+
+ sig { params(obj: String).returns(String) }
+ def utf16_to_utf8(obj); end
+
+ sig { returns(T::Hash[Symbol, T.untyped]) }
+ def root; end
+
+ class AesV2SecurityHandler
+ sig { params(key: String).void }
+ def initialize(key)
+ @encrypt_key = T.let(T.unsafe(nil), String)
+ end
+
+ sig { params(buf: String, ref: PDF::Reader::Reference).returns(String) }
+ def decrypt(buf, ref); end
+ end
+
+ class AesV3SecurityHandler
+ sig { params(key: String).void }
+ def initialize(key)
+ @encrypt_key = T.let(T.unsafe(nil), String)
+ @cipher = T.let(T.unsafe(nil), String)
+ end
+
+ sig { params(buf: String, ref: PDF::Reader::Reference).returns(String) }
+ def decrypt(buf, ref); end
+ end
+
+ class BoundingRectangleRunsFilter
+ sig { params(runs: T::Array[PDF::Reader::TextRun], rect: PDF::Reader::Rectangle).returns(T::Array[PDF::Reader::TextRun]) }
+ def self.runs_within_rect(runs, rect); end
+ end
+
+ class Buffer
+ TOKEN_WHITESPACE = T.let(T.unsafe(nil), T::Array[Integer])
+ TOKEN_DELIMITER = T.let(T.unsafe(nil), T::Array[Integer])
+ LEFT_PAREN = T.let(T.unsafe(nil), String)
+ LESS_THAN = T.let(T.unsafe(nil), String)
+ STREAM = T.let(T.unsafe(nil), String)
+ ID = T.let(T.unsafe(nil), String)
+ FWD_SLASH = T.let(T.unsafe(nil), String)
+ NULL_BYTE = T.let(T.unsafe(nil), String)
+ CR = T.let(T.unsafe(nil), String)
+ LF = T.let(T.unsafe(nil), String)
+ CRLF = T.let(T.unsafe(nil), String)
+ WHITE_SPACE = T.let(T.unsafe(nil), T::Array[String])
+ TRAILING_BYTECOUNT = T.let(T.unsafe(nil), Integer)
+ DIGITS_ONLY = T.let(T.unsafe(nil), Regexp)
+
+ sig { returns(Integer) }
+ attr_reader :pos
+
+ sig { params(io: T.any(StringIO, Tempfile, IO), opts: T::Hash[Symbol, T.untyped]).void }
+ def initialize(io, opts = {})
+ @pos = T.let(T.unsafe(nil), Integer)
+ @tokens = T.let(T.unsafe(nil), T::Array[T.any(String, PDF::Reader::Reference)])
+ @io = T.let(T.unsafe(nil), T.any(StringIO, Tempfile, IO))
+ @in_content_stream = T.let(T.unsafe(nil), T::Boolean)
+ end
+
+ sig { returns(T::Boolean) }
+ def empty?; end
+
+ sig { params(bytes: Integer, opts: T::Hash[Symbol, T.untyped]).returns(T.nilable(String)) }
+ def read(bytes, opts = {}); end
+
+ sig { returns(T.any(NilClass, String, PDF::Reader::Reference)) }
+ def token; end
+
+ sig { returns(Integer) }
+ def find_first_xref_offset; end
+
+ sig { void }
+ def check_size_is_non_zero; end
+
+ sig { returns(T::Boolean) }
+ def in_content_stream?; end
+
+ sig { void }
+ def reset_pos; end
+
+ sig { void }
+ def save_pos; end
+
+ sig { void }
+ def prepare_tokens; end
+
+ sig { returns(Symbol) }
+ def state; end
+
+ sig { void }
+ def merge_indirect_reference; end
+
+ sig { void }
+ def prepare_inline_token; end
+
+ sig { void }
+ def prepare_hex_token; end
+
+ sig { void }
+ def prepare_literal_token; end
+
+ sig { void }
+ def prepare_regular_token; end
+
+ sig { returns(T.nilable(Integer)) }
+ def peek_byte; end
+ end
+
+ class CidWidths
+ sig { params(default: Numeric, array: T::Array[Numeric]).void }
+ def initialize(default, array)
+ @widths = T.let(T.unsafe(nil), T::Hash[Numeric, Numeric])
+ end
+
+ sig { params(default: Numeric, array: T::Array[Numeric]).returns(T::Hash[Numeric, Numeric]) }
+ def parse_array(default, array); end
+
+ sig { params(first: Integer, widths: T::Array[Numeric]).returns(T::Hash[Numeric, Numeric]) }
+ def parse_first_form(first, widths); end
+
+ sig { params(first: Integer, final: Integer, width: Numeric).returns(T::Hash[Numeric, Numeric]) }
+ def parse_second_form(first, final, width); end
+ end
+
+ class CMap
+ CMAP_KEYWORDS = T.let(T.unsafe(nil), T::Hash[String, Symbol])
+
+ sig { returns(T.untyped) }
+ attr_reader :map
+
+ sig { params(data: String).void }
+ def initialize(data)
+ @map = T.let(T.unsafe(nil), T::Hash[Integer, T::Array[Integer]])
+ end
+
+ sig { params(data: String, initial_mode: Symbol).void }
+ def process_data(data, initial_mode = :none); end
+
+ sig { returns(Integer) }
+ def size; end
+
+ sig { params(c: Integer).returns(T::Array[Integer]) }
+ def decode(c); end
+
+ sig { params(instructions: String).returns(PDF::Reader::Parser) }
+ def build_parser(instructions); end
+
+ sig { params(str: String).returns(T::Array[Integer]) }
+ def str_to_int(str); end
+
+ sig { params(instructions: T::Array[String]).void }
+ def process_bfchar_instructions(instructions); end
+
+ sig { params(instructions: T::Array[T.any(T::Array[String], String)]).void }
+ def process_bfrange_instructions(instructions); end
+
+ sig { params(start_code: String, end_code: String, dst: String).void }
+ def bfrange_type_one(start_code, end_code, dst); end
+
+ sig { params(start_code: String, end_code: String, dst: T::Array[String]).void }
+ def bfrange_type_two(start_code, end_code, dst); end
+ end
+
+ class Encoding
+ CONTROL_CHARS = T.let(T.unsafe(nil), T::Array[Integer])
+ UNKNOWN_CHAR = T.let(T.unsafe(nil), Integer)
+
+ sig { returns(String) }
+ attr_reader :unpack
+
+ sig { params(enc: T.untyped).void }
+ def initialize(enc)
+ @mapping = T.let(T.unsafe(nil), T::Hash[Integer, Integer])
+ @unpack = T.let(T.unsafe(nil), String)
+ @enc_name = T.let(T.unsafe(nil), Symbol)
+ @string_cache = T.let(T.unsafe(nil), T::Hash[Integer, String])
+ @map_file = T.let(T.unsafe(nil), T.nilable(String))
+ @differences = T.let(T.unsafe(nil), T.nilable(T::Hash[Integer, Integer]))
+ @glyphlist = T.let(T.unsafe(nil), T.nilable(PDF::Reader::GlyphHash))
+ end
+
+ sig { params(diff: T::Array[T.any(Integer, Symbol)]).returns(T::Hash[Integer, Integer]) }
+ def differences=(diff); end
+
+ sig { returns(T::Hash[Integer, Integer]) }
+ def differences; end
+
+ sig { params(str: String).returns(String) }
+ def to_utf8(str); end
+
+ sig { params(glyph_code: Integer).returns(String) }
+ def int_to_utf8_string(glyph_code); end
+
+ sig { params(glyph_code: Integer).returns(T::Array[Symbol]) }
+ def int_to_name(glyph_code); end
+
+ sig { returns(T::Hash[Integer, Integer]) }
+ def default_mapping; end
+
+ sig { params(glyph_code: Integer).returns(String) }
+ def internal_int_to_utf8_string(glyph_code); end
+
+ sig { returns(T::Boolean) }
+ def utf8_conversion_impossible?; end
+
+ sig { params(times: Integer).returns(String) }
+ def little_boxes(times); end
+
+ sig { params(str: String).returns(String) }
+ def convert_to_utf8(str); end
+
+ sig { params(enc: T.untyped).returns(String) }
+ def get_unpack(enc); end
+
+ sig { params(enc: T.untyped).returns(T.nilable(String)) }
+ def get_mapping_file(enc); end
+
+ sig { returns(PDF::Reader::GlyphHash) }
+ def glyphlist; end
+
+ sig { params(file: String).void }
+ def load_mapping(file); end
+ end
+
+ class Error
+ sig { params(lvalue: T.untyped, rvalue: T.untyped, chars: T.untyped).returns(T.untyped) }
+ def self.str_assert(lvalue, rvalue, chars = nil); end
+
+ sig { params(lvalue: T.untyped, rvalue: T.untyped, chars: T.untyped).returns(T.untyped) }
+ def self.str_assert_not(lvalue, rvalue, chars = nil); end
+
+ sig { params(lvalue: T.untyped, rvalue: T.untyped).returns(T.untyped) }
+ def self.assert_equal(lvalue, rvalue); end
+
+ sig { params(object: Object, name: String, klass: Module).void }
+ def self.validate_type(object, name, klass); end
+
+ sig { params(object: Object, name: String, klass: Module).void }
+ def self.validate_type_as_malformed(object, name, klass); end
+
+ sig { params(object: Object, name: String).void }
+ def self.validate_not_nil(object, name); end
+ end
+
+ class MalformedPDFError < RuntimeError
+ end
+
+ class InvalidPageError < ArgumentError
+ end
+
+ class InvalidObjectError < MalformedPDFError
+ end
+
+ class UnsupportedFeatureError < RuntimeError
+ end
+
+ class EncryptedPDFError < UnsupportedFeatureError
+ end
+
+ class Font
+ sig { returns(T.nilable(Symbol)) }
+ attr_accessor :subtype
+
+ sig { returns(PDF::Reader::Encoding) }
+ attr_accessor :encoding
+
+ sig { returns(T::Array[PDF::Reader::Font]) }
+ attr_accessor :descendantfonts
+
+ sig { returns(PDF::Reader::CMap) }
+ attr_accessor :tounicode
+
+ sig { returns(T::Array[Integer]) }
+ attr_reader :widths
+
+ sig { returns(T.nilable(Integer)) }
+ attr_reader :first_char
+
+ sig { returns(T.nilable(Integer)) }
+ attr_reader :last_char
+
+ sig { returns(T.nilable(Symbol)) }
+ attr_reader :basefont
+
+ sig { returns(T.nilable(PDF::Reader::FontDescriptor)) }
+ attr_reader :font_descriptor
+
+ sig { returns(T::Array[Numeric]) }
+ attr_reader :cid_widths
+
+ sig { returns(Numeric) }
+ attr_reader :cid_default_width
+
+ sig { params(ohash: PDF::Reader::ObjectHash, obj: T::Hash[Symbol, T.untyped]).void }
+ def initialize(ohash, obj); end
+
+ sig { params(params: T.any(Integer, String, T::Array[T.untyped])).returns(String) }
+ def to_utf8(params); end
+
+ sig { params(data: String).returns(T::Array[T.nilable(T.any(Numeric, String))]) }
+ def unpack(data); end
+
+ sig { params(code_point: T.any(String, Integer)).returns(T.untyped) }
+ def glyph_width(code_point); end
+
+ sig { params(font_name: Symbol).returns(PDF::Reader::Encoding) }
+ def default_encoding(font_name); end
+
+ sig {
+ returns(
+ T.any(
+ PDF::Reader::WidthCalculator::BuiltIn,
+ PDF::Reader::WidthCalculator::Composite,
+ PDF::Reader::WidthCalculator::TrueType,
+ PDF::Reader::WidthCalculator::TypeOneOrThree,
+ PDF::Reader::WidthCalculator::TypeZero,
+ )
+ )
+ }
+ def build_width_calculator; end
+
+ sig { params(obj: T.untyped).void }
+ def extract_base_info(obj); end
+
+ sig { params(obj: T.untyped).void }
+ def extract_descriptor(obj); end
+
+ sig { params(obj: T.untyped).void }
+ def extract_descendants(obj); end
+
+ sig { params(params: T.any(Integer, String, T::Array[T.untyped])).returns(String) }
+ def to_utf8_via_cmap(params); end
+
+ sig { params(params: T.any(Integer, String, T::Array[T.untyped])).returns(String) }
+ def to_utf8_via_encoding(params); end
+ end
+
+ class FontDescriptor
+ sig { returns(String) }
+ attr_reader :font_name
+
+ sig { returns(T.nilable(String)) }
+ attr_reader :font_family
+
+ sig { returns(Symbol) }
+ attr_reader :font_stretch
+
+ sig { returns(Numeric) }
+ attr_reader :font_weight
+
+ sig { returns(T::Array[Numeric]) }
+ attr_reader :font_bounding_box
+
+ sig { returns(Numeric) }
+ attr_reader :cap_height
+
+ sig { returns(Numeric) }
+ attr_reader :ascent
+
+ sig { returns(Numeric) }
+ attr_reader :descent
+
+ sig { returns(Numeric) }
+ attr_reader :leading
+
+ sig { returns(Numeric) }
+ attr_reader :avg_width
+
+ sig { returns(Numeric) }
+ attr_reader :max_width
+
+ sig { returns(Numeric) }
+ attr_reader :missing_width
+
+ sig { returns(T.nilable(Numeric)) }
+ attr_reader :italic_angle
+
+ sig { returns(T.nilable(Numeric)) }
+ attr_reader :stem_v
+
+ sig { returns(T.nilable(Numeric)) }
+ attr_reader :x_height
+
+ sig { returns(Integer) }
+ attr_reader :font_flags
+
+ sig { params(ohash: PDF::Reader::ObjectHash, fd_hash: T::Hash[T.untyped, T.untyped]).void }
+ def initialize(ohash, fd_hash); end
+
+ sig { params(char_code: Integer).returns(Numeric) }
+ def glyph_width(char_code); end
+
+ sig { returns(Numeric) }
+ def glyph_to_pdf_scale_factor; end
+
+ sig { returns(TTFunk::File) }
+ def ttf_program_stream; end
+ end
+
+ class FormXObject
+ sig { returns(T.untyped) }
+ attr_reader :xobject
+
+ sig { params(page: T.untyped, xobject: T.untyped, options: T.untyped).void }
+ def initialize(page, xobject, options = {}); end
+
+ sig { returns(T.untyped) }
+ def font_objects; end
+
+ sig { params(receivers: T.untyped).returns(T.untyped) }
+ def walk(*receivers); end
+
+ sig { returns(T.untyped) }
+ def raw_content; end
+
+ sig { returns(T.untyped) }
+ def resources; end
+
+ sig { params(receivers: T.untyped, name: T.untyped, params: T.untyped).returns(T.untyped) }
+ def callback(receivers, name, params = []); end
+
+ sig { returns(T.untyped) }
+ def content_stream_md5; end
+
+ sig { returns(T.untyped) }
+ def cached_tokens_key; end
+
+ sig { returns(T.untyped) }
+ def tokens; end
+
+ sig { params(receivers: T.untyped, instructions: T.untyped).returns(T.untyped) }
+ def content_stream(receivers, instructions); end
+ end
+
+ class GlyphHash
+ @@by_name_cache = T.let(T.unsafe(nil), T.nilable(T::Hash[Symbol, Integer]))
+ @@by_codepoint_cache = T.let(T.unsafe(nil), T.nilable(T::Hash[Integer, T::Array[Symbol]]))
+
+ sig { void }
+ def initialize
+ @by_name = T.let(T.unsafe(nil), T::Hash[Symbol, Integer])
+ @by_codepoint = T.let(T.unsafe(nil), T::Hash[Integer, T::Array[Symbol]])
+ end
+
+ sig { params(name: T.nilable(Symbol)).returns(T.nilable(Integer)) }
+ def name_to_unicode(name); end
+
+ sig { params(codepoint: T.nilable(Integer)).returns(T::Array[Symbol]) }
+ def unicode_to_name(codepoint); end
+
+ sig { returns([T::Hash[Symbol, Integer], T::Hash[Integer, T::Array[Symbol]]]) }
+ def load_adobe_glyph_mapping; end
+ end
+
+ class KeyBuilderV5
+ sig { params(opts: T::Hash[Symbol, String]).void }
+ def initialize(opts = {})
+ @key_length = T.let(T.unsafe(nil), Integer)
+ @owner_key = T.let(T.unsafe(nil), String)
+ @user_key = T.let(T.unsafe(nil), String)
+ @owner_encryption_key = T.let(T.unsafe(nil), String)
+ @user_encryption_key = T.let(T.unsafe(nil), String)
+ end
+
+ sig { params(pass: String).returns(String) }
+ def key(pass); end
+
+ sig { params(password: T.untyped).returns(T.untyped) }
+ def auth_owner_pass(password); end
+
+ sig { params(password: T.untyped).returns(T.untyped) }
+ def auth_user_pass(password); end
+
+ sig { params(password: String).returns(T.nilable(String)) }
+ def auth_owner_pass_r6(password); end
+
+ sig { params(password: String).returns(T.nilable(String)) }
+ def auth_user_pass_r6(password); end
+
+ sig { params(password: String, salt: String, user_key: String).returns(String)}
+ def r6_digest(password, salt, user_key = ''); end
+
+ sig { params(str: String).returns(Integer)}
+ def unpack_128bit_bigendian_int(str); end
+ end
+
+ class LZW
+ CODE_EOD = 257
+ CODE_CLEAR_TABLE = 256
+
+ class BitStream
+ sig { params(data: String, bits_in_chunk: Integer).void }
+ def initialize(data, bits_in_chunk)
+ @data = T.let(T.unsafe(nil), String)
+ @bits_in_chunk = T.let(T.unsafe(nil), Integer)
+ @current_pos = T.let(T.unsafe(nil), Integer)
+ @bits_left_in_byte = T.let(T.unsafe(nil), Integer)
+
+ end
+
+ sig { params(bits_in_chunk: Integer).void }
+ def set_bits_in_chunk(bits_in_chunk); end
+
+ sig { returns(Integer) }
+ def read; end
+ end
+
+ class StringTable
+ sig { returns(Integer) }
+ attr_reader :string_table_pos
+
+ sig { void }
+ def initialize
+ @data = T.let(T.unsafe(nil), T::Hash[Integer, String])
+ @string_table_pos = T.let(T.unsafe(nil), Integer)
+ end
+
+ sig { params(key: Integer).returns(T.nilable(String)) }
+ def [](key); end
+
+ sig { params(string: String).void }
+ def add(string); end
+ end
+
+ sig { params(data: String).returns(String) }
+ def self.decode(data); end
+
+ sig { params(string_table: PDF::Reader::LZW::StringTable, some_code: T.nilable(Integer), other_code: T.nilable(Integer)).returns(String) }
+ def self.create_new_string(string_table, some_code, other_code); end
+ end
+
+ class NullSecurityHandler
+ sig { params(buf: T.untyped, _ref: T.untyped).returns(T.untyped) }
+ def decrypt(buf, _ref); end
+ end
+
+ class ObjectCache
+ CACHEABLE_TYPES = [:Catalog, :Page, :Pages]
+
+ sig { returns(T.untyped) }
+ attr_reader :hits
+
+ sig { returns(T.untyped) }
+ attr_reader :misses
+
+ sig { params(lru_size: T.untyped).void }
+ def initialize(lru_size = 1000); end
+
+ sig { params(key: T.untyped).returns(T.untyped) }
+ def [](key); end
+
+ sig { params(key: T.untyped, value: T.untyped).returns(T.untyped) }
+ def []=(key, value); end
+
+ sig { params(key: T.untyped, local_default: T.untyped).returns(T.untyped) }
+ def fetch(key, local_default = nil); end
+
+ sig { params(block: T.untyped).returns(T.untyped) }
+ def each(&block); end
+
+ sig { params(block: T.untyped).returns(T.untyped) }
+ def each_key(&block); end
+
+ sig { params(block: T.untyped).returns(T.untyped) }
+ def each_value(&block); end
+
+ sig { returns(T.untyped) }
+ def size; end
+
+ sig { returns(T.untyped) }
+ def empty?; end
+
+ sig { params(key: T.untyped).returns(T.untyped) }
+ def include?(key); end
+
+ sig { params(value: T.untyped).returns(T.untyped) }
+ def has_value?(value); end
+
+ sig { returns(T.untyped) }
+ def to_s; end
+
+ sig { returns(T.untyped) }
+ def keys; end
+
+ sig { returns(T.untyped) }
+ def values; end
+
+ sig { params(key: T.untyped).returns(T.untyped) }
+ def update_stats(key); end
+
+ sig { params(obj: T.untyped).returns(T.untyped) }
+ def cacheable?(obj); end
+ end
+
+ class ObjectHash
+ include Enumerable
+
+ sig { returns(T.untyped) }
+ attr_accessor :default
+
+ sig { returns(T::Hash[Symbol, T.untyped]) }
+ attr_reader :trailer
+
+ sig { returns(Float) }
+ attr_reader :pdf_version
+
+ sig { returns(
+ T.any(
+ PDF::Reader::NullSecurityHandler,
+ PDF::Reader::AesV2SecurityHandler,
+ PDF::Reader::AesV3SecurityHandler,
+ PDF::Reader::Rc4SecurityHandler,
+ )) }
+ attr_reader :sec_handler
+
+ sig { params(input: T.any(IO, Tempfile, StringIO, String), opts: T::Hash[Symbol, T.untyped]).void }
+ def initialize(input, opts = {})
+ @io = T.let(T.unsafe(nil), T.any(IO, Tempfile, StringIO))
+ @xref = T.let(T.unsafe(nil), PDF::Reader::XRef)
+ @pdf_version = T.let(T.unsafe(nil), Float)
+ @trailer = T.let(T.unsafe(nil), T::Hash[Symbol, T.untyped])
+ @cache = T.let(T.unsafe(nil), PDF::Reader::ObjectCache)
+ @sec_handler = T.let(T.unsafe(nil), T.any(
+ PDF::Reader::NullSecurityHandler,
+ PDF::Reader::AesV2SecurityHandler,
+ PDF::Reader::AesV3SecurityHandler,
+ PDF::Reader::Rc4SecurityHandler,
+ ))
+ @page_references = T.let(T.unsafe(nil), T.nilable(T::Array[T.any(PDF::Reader::Reference, T::Hash[Symbol, T.untyped])]))
+ @object_streams = T.let(T.unsafe(nil), T.nilable(T::Hash[PDF::Reader::Reference, PDF::Reader::ObjectStream]))
+ end
+
+ sig { params(ref: T.any(Integer, PDF::Reader::Reference)).returns(T.nilable(Symbol)) }
+ def obj_type(ref); end
+
+ sig { params(ref: T.any(Integer, PDF::Reader::Reference)).returns(T::Boolean) }
+ def stream?(ref); end
+
+ sig { params(key: T.any(Integer, PDF::Reader::Reference)).returns(T.untyped) }
+ def [](key); end
+
+ sig { params(key: T.untyped).returns(T.untyped) }
+ def object(key); end
+
+ sig { params(key: T.untyped).returns(T.nilable(T::Array[T.untyped])) }
+ def deref_array(key); end
+
+ sig { params(key: T.untyped).returns(T.nilable(T::Array[Numeric])) }
+ def deref_array_of_numbers(key); end
+
+ sig { params(key: T.untyped).returns(T.nilable(T::Hash[Symbol, T.untyped])) }
+ def deref_hash(key); end
+
+ sig { params(key: T.untyped).returns(T.nilable(Symbol)) }
+ def deref_name(key); end
+
+ sig { params(key: T.untyped).returns(T.any(Symbol, T::Array[T.untyped], NilClass)) }
+ def deref_name_or_array(key); end
+
+ sig { params(key: T.untyped).returns(T.nilable(Integer)) }
+ def deref_integer(key); end
+
+ sig { params(key: T.untyped).returns(T.nilable(Numeric)) }
+ def deref_number(key); end
+
+ sig { params(key: T.untyped).returns(T.nilable(PDF::Reader::Stream)) }
+ def deref_stream(key); end
+
+ sig { params(key: T.untyped).returns(T.nilable(String)) }
+ def deref_string(key); end
+
+ sig { params(key: T.untyped).returns(T.any(PDF::Reader::Stream, T::Array[T.untyped], NilClass)) }
+ def deref_stream_or_array(key); end
+
+ sig { params(key: T.untyped).returns(T.untyped) }
+ def deref!(key); end
+
+ sig { params(key: T.untyped).returns(T.nilable(T::Array[T.untyped])) }
+ def deref_array!(key); end
+
+ sig { params(key: T.untyped).returns(T.nilable(T::Hash[Symbol, T.untyped])) }
+ def deref_hash!(key); end
+
+ sig { params(key: T.untyped, local_default: T.untyped).returns(T.untyped) }
+ def fetch(key, local_default = nil); end
+
+ sig { params(block: T.untyped).returns(T.untyped) }
+ def each(&block); end
+
+ sig { params(block: T.untyped).returns(T.untyped) }
+ def each_key(&block); end
+
+ sig { params(block: T.untyped).returns(T.untyped) }
+ def each_value(&block); end
+
+ sig { returns(Integer) }
+ def size; end
+
+ sig { returns(T::Boolean) }
+ def empty?; end
+
+ sig { params(check_key: T.untyped).returns(T::Boolean) }
+ def has_key?(check_key); end
+
+ sig { params(value: T.untyped).returns(T::Boolean) }
+ def has_value?(value); end
+
+ sig { returns(String) }
+ def to_s; end
+
+ sig { returns(T::Array[PDF::Reader::Reference]) }
+ def keys; end
+
+ sig { returns(T.untyped) }
+ def values; end
+
+ sig { params(ids: T.untyped).returns(T.untyped) }
+ def values_at(*ids); end
+
+ sig { returns(T.untyped) }
+ def to_a; end
+
+ sig { returns(T::Array[T.any(PDF::Reader::Reference, T::Hash[Symbol, T.untyped])]) }
+ def page_references; end
+
+ sig { returns(T::Boolean) }
+ def encrypted?; end
+
+ sig { returns(T::Boolean) }
+ def sec_handler?; end
+
+ sig { params(key: T.untyped).returns(T.untyped) }
+ def fetch_object(key); end
+
+ sig { params(key: T.untyped).returns(T.untyped) }
+ def fetch_object_stream(key); end
+
+ sig { params(key: T.untyped, seen: T.untyped).returns(T.untyped) }
+ def deref_internal!(key, seen); end
+
+ sig { params(ref: T.untyped, obj: T.untyped).returns(T.untyped) }
+ def decrypt(ref, obj); end
+
+ sig { params(offset: Integer).returns(PDF::Reader::Buffer) }
+ def new_buffer(offset = 0); end
+
+ sig { returns(T.untyped) }
+ def xref; end
+
+ sig { returns(T.untyped) }
+ def object_streams; end
+
+ sig { params(obj: T.any(PDF::Reader::Reference, T::Hash[Symbol, T.untyped])).returns(T::Array[T.any(PDF::Reader::Reference, T::Hash[Symbol, T.untyped])]) }
+ def get_page_objects(obj); end
+
+ sig { returns(Float) }
+ def read_version; end
+
+ sig { params(input: T.any(IO, Tempfile, StringIO, String)).returns(T.any(IO, Tempfile, StringIO)) }
+ def extract_io_from(input); end
+
+ sig { params(input: String).returns(String) }
+ def read_as_binary(input); end
+ end
+
+ class ObjectStream
+ sig { params(stream: PDF::Reader::Stream).void }
+ def initialize(stream)
+ @dict = T.let(T.unsafe(nil), T::Hash[Symbol, T.untyped])
+ @data = T.let(T.unsafe(nil), String)
+ @offsets = T.let(T.unsafe(nil), T.nilable(T::Hash[Integer, Integer]))
+ @buffer = T.let(T.unsafe(nil), T.nilable(PDF::Reader::Buffer))
+ end
+
+ sig {
+ params(objid: Integer).returns(
+ T.any(PDF::Reader::Reference, PDF::Reader::Token, Numeric, String, Symbol, T::Array[T.untyped], T::Hash[T.untyped, T.untyped], NilClass)
+ )
+ }
+ def [](objid); end
+
+ sig { returns(Integer) }
+ def size; end
+
+ sig { returns(T::Hash[Integer, Integer]) }
+ def offsets; end
+
+ sig { returns(Integer) }
+ def first; end
+
+ sig { returns(PDF::Reader::Buffer) }
+ def buffer; end
+ end
+
+ class OverlappingRunsFilter
+ OVERLAPPING_THRESHOLD = T.let(T.unsafe(nil), Float)
+
+ sig { params(runs: T::Array[PDF::Reader::TextRun]).returns(T::Array[PDF::Reader::TextRun]) }
+ def self.exclude_redundant_runs(runs); end
+
+ sig { params(sweep_line_status: T::Array[PDF::Reader::TextRun], event_point: EventPoint).returns(T::Boolean) }
+ def self.detect_intersection(sweep_line_status, event_point); end
+ end
+
+ class NoTextFilter
+ sig { params(runs: T::Array[PDF::Reader::TextRun]).returns(T::Array[PDF::Reader::TextRun]) }
+ def self.exclude_empty_strings(runs); end
+ end
+
+ class EventPoint
+ sig { returns(Numeric) }
+ attr_reader :x
+
+ sig { returns(PDF::Reader::TextRun) }
+ attr_reader :run
+
+ sig { params(x: Numeric, run: PDF::Reader::TextRun).void }
+ def initialize(x, run)
+ @x = T.let(T.unsafe(nil), Numeric)
+ @run = T.let(T.unsafe(nil), PDF::Reader::TextRun)
+ end
+
+ sig { returns(T::Boolean) }
+ def start?; end
+ end
+
+ class Page
+ sig { returns(PDF::Reader::ObjectHash) }
+ attr_reader :objects
+
+ sig { returns(T::Hash[Symbol, T.untyped]) }
+ attr_reader :page_object
+
+ sig { returns(T.any(PDF::Reader::ObjectCache, T::Hash[T.untyped, T.untyped])) }
+ attr_reader :cache
+
+ sig { params(objects: PDF::Reader::ObjectHash, pagenum: Integer, options: T::Hash[Symbol, T.untyped]).void }
+ def initialize(objects, pagenum, options = {})
+ @objects = T.let(T.unsafe(nil), PDF::Reader::ObjectHash)
+ @pagenum = T.let(T.unsafe(nil), Integer)
+ @page_object = T.let(T.unsafe(nil), T::Hash[Symbol, T.untyped])
+ @cache = T.let(T.unsafe(nil), T.any(PDF::Reader::ObjectCache, T::Hash[T.untyped, T.untyped]))
+ @attributes = T.let(T.unsafe(nil), T.nilable(T::Hash[Symbol, T.untyped]))
+ @root = T.let(T.unsafe(nil), T.nilable(T::Hash[Symbol, T.untyped]))
+ @resources = T.let(T.unsafe(nil), T.nilable(PDF::Reader::Resources))
+ end
+
+ sig { returns(Integer) }
+ def number; end
+
+ sig { returns(String) }
+ def inspect; end
+
+ sig { returns(T::Hash[Symbol, T.untyped]) }
+ def attributes; end
+
+ sig { returns(Numeric) }
+ def height; end
+
+ sig { returns(Numeric) }
+ def width; end
+
+ sig { returns(String) }
+ def orientation; end
+
+ sig { returns(T::Array[Numeric]) }
+ def origin; end
+
+ sig { params(opts: T::Hash[Symbol, T.untyped]).returns(T::Array[PDF::Reader::TextRun]) }
+ def runs(opts = {}); end
+
+ sig { params(opts: T::Hash[Symbol, T.untyped]).returns(String) }
+ def text(opts = {}); end
+
+ sig { params(receivers: T.untyped).void }
+ def walk(*receivers); end
+
+ sig { returns(String) }
+ def raw_content; end
+
+ sig { returns(Integer) }
+ def rotate; end
+
+ sig { returns(T::Hash[Symbol, T::Array[Numeric]]) }
+ def boxes; end
+
+ sig { returns(T::Hash[Symbol, PDF::Reader::Rectangle]) }
+ def rectangles; end
+
+ sig { returns(T::Hash[Symbol, T.untyped]) }
+ def root; end
+
+ sig { returns(PDF::Reader::Resources) }
+ def resources; end
+
+ sig { params(receivers: T::Array[T.untyped], instructions: String).void }
+ def content_stream(receivers, instructions); end
+
+ sig { params(receivers: T::Array[Object], name: Symbol, params: T::Array[T.untyped]).void }
+ def callback(receivers, name, params = []); end
+
+ sig { returns(T.untyped) }
+ def page_with_ancestors; end
+
+ sig { params(origin: T.untyped).returns(T.untyped) }
+ def ancestors(origin = @page_object[:Parent]); end
+
+ sig { params(obj: T::Hash[Symbol, T.untyped]).returns(T::Hash[Symbol, T.untyped]) }
+ def select_inheritable(obj); end
+ end
+
+ class PageLayout
+ DEFAULT_FONT_SIZE = T.let(T.unsafe(nil), Numeric)
+
+ sig { params(runs: T::Array[PDF::Reader::TextRun], mediabox: T.any(T::Array[Numeric], PDF::Reader::Rectangle)).void }
+ def initialize(runs, mediabox)
+ @mediabox = T.let(T.unsafe(nil), PDF::Reader::Rectangle)
+ @runs = T.let(T.unsafe(nil), T::Array[PDF::Reader::TextRun])
+ @mean_font_size = T.let(T.unsafe(nil), Numeric)
+ @median_glyph_width = T.let(T.unsafe(nil), Numeric)
+ @x_offset = T.let(T.unsafe(nil), Numeric)
+ @y_offset = T.let(T.unsafe(nil), Numeric)
+ @row_count = T.let(T.unsafe(nil), T.nilable(Integer))
+ @col_count = T.let(T.unsafe(nil), T.nilable(Integer))
+ @row_multiplier = T.let(T.unsafe(nil), T.nilable(Numeric))
+ @col_multiplier = T.let(T.unsafe(nil), T.nilable(Numeric))
+ end
+
+ sig { returns(String) }
+ def to_s; end
+
+ sig { params(rows: T.untyped).returns(T.untyped) }
+ def interesting_rows(rows); end
+
+ sig { returns(T.untyped) }
+ def row_count; end
+
+ sig { returns(T.untyped) }
+ def col_count; end
+
+ sig { returns(T.untyped) }
+ def row_multiplier; end
+
+ sig { returns(T.untyped) }
+ def col_multiplier; end
+
+ sig { params(collection: T.untyped).returns(T.untyped) }
+ def mean(collection); end
+
+ sig { params(collection: T.untyped).returns(T.untyped) }
+ def median(collection); end
+
+ sig { params(runs: T.untyped).returns(T.untyped) }
+ def merge_runs(runs); end
+
+ sig { params(chars: T::Array[PDF::Reader::TextRun]).returns(T::Array[PDF::Reader::TextRun]) }
+ def group_chars_into_runs(chars); end
+
+ sig { params(haystack: T.untyped, needle: T.untyped, index: T.untyped).returns(T.untyped) }
+ def local_string_insert(haystack, needle, index); end
+
+ sig { params(mediabox: T.untyped).returns(T.untyped) }
+ def process_mediabox(mediabox); end
+
+ sig { returns(Numeric) }
+ def page_width; end
+
+ sig { returns(Numeric) }
+ def page_height; end
+ end
+
+ class PageState
+ DEFAULT_GRAPHICS_STATE = {
+ :char_spacing => 0,
+ :word_spacing => 0,
+ :h_scaling => 1.0,
+ :text_leading => 0,
+ :text_font => nil,
+ :text_font_size => nil,
+ :text_mode => 0,
+ :text_rise => 0,
+ :text_knockout => 0
+ }
+
+ sig { params(page: T.untyped).void }
+ def initialize(page); end
+
+ sig { returns(T.untyped) }
+ def save_graphics_state; end
+
+ sig { returns(T.untyped) }
+ def restore_graphics_state; end
+
+ sig do
+ params(
+ a: T.untyped,
+ b: T.untyped,
+ c: T.untyped,
+ d: T.untyped,
+ e: T.untyped,
+ f: T.untyped
+ ).returns(T.untyped)
+ end
+ def concatenate_matrix(a, b, c, d, e, f); end
+
+ sig { returns(T.untyped) }
+ def begin_text_object; end
+
+ sig { returns(T.untyped) }
+ def end_text_object; end
+
+ sig { params(char_spacing: T.untyped).returns(T.untyped) }
+ def set_character_spacing(char_spacing); end
+
+ sig { params(h_scaling: T.untyped).returns(T.untyped) }
+ def set_horizontal_text_scaling(h_scaling); end
+
+ sig { params(label: T.untyped, size: T.untyped).returns(T.untyped) }
+ def set_text_font_and_size(label, size); end
+
+ sig { returns(T.untyped) }
+ def font_size; end
+
+ sig { params(leading: T.untyped).returns(T.untyped) }
+ def set_text_leading(leading); end
+
+ sig { params(mode: T.untyped).returns(T.untyped) }
+ def set_text_rendering_mode(mode); end
+
+ sig { params(rise: T.untyped).returns(T.untyped) }
+ def set_text_rise(rise); end
+
+ sig { params(word_spacing: T.untyped).returns(T.untyped) }
+ def set_word_spacing(word_spacing); end
+
+ sig { params(x: T.untyped, y: T.untyped).returns(T.untyped) }
+ def move_text_position(x, y); end
+
+ sig { params(x: T.untyped, y: T.untyped).returns(T.untyped) }
+ def move_text_position_and_set_leading(x, y); end
+
+ sig do
+ params(
+ a: T.untyped,
+ b: T.untyped,
+ c: T.untyped,
+ d: T.untyped,
+ e: T.untyped,
+ f: T.untyped
+ ).returns(T.untyped)
+ end
+ def set_text_matrix_and_text_line_matrix(a, b, c, d, e, f); end
+
+ sig { returns(T.untyped) }
+ def move_to_start_of_next_line; end
+
+ sig { params(params: T.untyped).returns(T.untyped) }
+ def show_text_with_positioning(params); end
+
+ sig { params(str: T.untyped).returns(T.untyped) }
+ def move_to_next_line_and_show_text(str); end
+
+ sig { params(aw: T.untyped, ac: T.untyped, string: T.untyped).returns(T.untyped) }
+ def set_spacing_next_line_show_text(aw, ac, string); end
+
+ sig { params(label: T.untyped).returns(T.untyped) }
+ def invoke_xobject(label); end
+
+ sig { params(x: T.untyped, y: T.untyped).returns(T.untyped) }
+ def ctm_transform(x, y); end
+
+ sig { params(x: T.untyped, y: T.untyped).returns(T.untyped) }
+ def trm_transform(x, y); end
+
+ sig { returns(T.untyped) }
+ def current_font; end
+
+ sig { params(label: T.untyped).returns(T.untyped) }
+ def find_font(label); end
+
+ sig { params(label: T.untyped).returns(T.untyped) }
+ def find_color_space(label); end
+
+ sig { params(label: T.untyped).returns(T.untyped) }
+ def find_xobject(label); end
+
+ sig { returns(T.untyped) }
+ def stack_depth; end
+
+ sig { returns(T.untyped) }
+ def clone_state; end
+
+ sig { params(w0: T.untyped, tj: T.untyped, word_boundary: T.untyped).returns(T.untyped) }
+ def process_glyph_displacement(w0, tj, word_boundary); end
+
+ sig { returns(T.untyped) }
+ def text_rendering_matrix; end
+
+ sig { returns(T.untyped) }
+ def ctm; end
+
+ sig { returns(T.untyped) }
+ def state; end
+
+ sig { params(raw_fonts: T.untyped).returns(T.untyped) }
+ def build_fonts(raw_fonts); end
+
+ sig { returns(T.untyped) }
+ def identity_matrix; end
+ end
+
+ class PageTextReceiver
+ extend Forwardable
+ SPACE = " "
+
+ sig { returns(T.untyped) }
+ attr_reader :state
+
+ sig { returns(T.untyped) }
+ attr_reader :options
+
+ sig { params(page: T.untyped).returns(T.untyped) }
+ def page=(page); end
+
+ sig { returns(T.untyped) }
+ def content; end
+
+ sig { params(string: String).void }
+ def show_text(string); end
+
+ sig { params(params: T::Array[T.untyped]).void }
+ def show_text_with_positioning(params); end
+
+ sig { params(str: String).void }
+ def move_to_next_line_and_show_text(str); end
+
+ sig { params(opts: T::Hash[Symbol, T.untyped]).returns(T::Array[PDF::Reader::TextRun]) }
+ def runs(opts = {}); end
+
+ sig { params(aw: Numeric, ac: Numeric, string: String).void }
+ def set_spacing_next_line_show_text(aw, ac, string); end
+
+ sig { params(label: T.untyped).returns(T.untyped) }
+ def invoke_xobject(label); end
+
+ sig { params(string: String).void }
+ def internal_show_text(string); end
+
+ sig { params(x: T.untyped, y: T.untyped).returns(T.untyped) }
+ def apply_rotation(x, y); end
+ end
+
+ class PagesStrategy
+ OPERATORS = T.let(T.unsafe(nil), T::Hash[String, Symbol])
+ end
+
+ class Parser
+ sig { params(buffer: PDF::Reader::Buffer, objects: T.nilable(PDF::Reader::ObjectHash)).void }
+ def initialize(buffer, objects=nil); end
+
+ sig {
+ params(
+ operators: T::Hash[T.any(String, PDF::Reader::Token), Symbol]
+ ).returns(
+ T.any(PDF::Reader::Reference, PDF::Reader::Token, Numeric, String, Symbol, T::Array[T.untyped], T::Hash[T.untyped, T.untyped], NilClass)
+ )
+ }
+ def parse_token(operators={}); end
+
+ sig {
+ params(
+ id: Integer,
+ gen: Integer
+ ).returns(
+ T.any(PDF::Reader::Reference, PDF::Reader::Token, PDF::Reader::Stream, Numeric, String, Symbol, T::Array[T.untyped], T::Hash[T.untyped, T.untyped], NilClass)
+ )
+ }
+ def object(id, gen); end
+
+ sig { returns(T::Hash[Symbol, T.untyped]) }
+ def dictionary; end
+
+ sig { returns(Symbol) }
+ def pdf_name; end
+
+ sig { returns(T::Array[T.untyped]) }
+ def array; end
+
+ sig { returns(String) }
+ def hex_string; end
+
+ sig { returns(String) }
+ def string; end
+
+ sig { params(dict: T::Hash[Symbol, T.untyped]).returns(PDF::Reader::Stream) }
+ def stream(dict); end
+ end
+
+ class Point
+ sig do
+ params(
+ x: Numeric,
+ y: Numeric,
+ ).void
+ end
+ def initialize(x, y)
+ @x = T.let(T.unsafe(nil), Numeric)
+ @y = T.let(T.unsafe(nil), Numeric)
+ end
+
+ sig { returns(Numeric) }
+ def x; end
+
+ sig { returns(Numeric) }
+ def y; end
+
+ sig { params(other: PDF::Reader::Point).returns(T::Boolean) }
+ def ==(other); end
+
+ end
+
+ class PrintReceiver
+ sig { returns(T.untyped) }
+ attr_accessor :callbacks
+
+ sig { void }
+ def initialize; end
+
+ sig { params(meth: T.untyped).returns(T.untyped) }
+ def respond_to?(meth); end
+
+ sig { params(methodname: T.untyped, args: T.untyped).returns(T.untyped) }
+ def method_missing(methodname, *args); end
+ end
+
+ class Rc4SecurityHandler
+ sig { params(key: String).void }
+ def initialize(key)
+ @encrypt_key = T.let(T.unsafe(nil), String)
+ end
+
+ sig { params(buf: T.untyped, ref: T.untyped).returns(T.untyped) }
+ def decrypt(buf, ref); end
+ end
+
+ class Rectangle
+
+ sig { params(arr: T::Array[Numeric]).returns(PDF::Reader::Rectangle) }
+ def self.from_array(arr); end
+
+ sig do
+ params(
+ x1: Numeric,
+ y1: Numeric,
+ x2: Numeric,
+ y2: Numeric
+ ).void
+ end
+
+ def initialize(x1, y1, x2, y2)
+ @bottom_left = T.let(T.unsafe(nil), PDF::Reader::Point)
+ @bottom_right = T.let(T.unsafe(nil), PDF::Reader::Point)
+ @top_left = T.let(T.unsafe(nil), PDF::Reader::Point)
+ @top_right = T.let(T.unsafe(nil), PDF::Reader::Point)
+ end
+
+ sig { returns(PDF::Reader::Point) }
+ def bottom_left; end
+
+ sig { returns(PDF::Reader::Point) }
+ def bottom_right; end
+
+ sig { returns(PDF::Reader::Point) }
+ def top_left; end
+
+ sig { returns(PDF::Reader::Point) }
+ def top_right; end
+
+ sig { returns(Numeric) }
+ def height; end
+
+ sig { returns(Numeric) }
+ def width; end
+
+ sig { returns(T::Array[Numeric]) }
+ def to_a; end
+
+ sig { params(degrees: Integer).void }
+ def apply_rotation(degrees); end
+
+ sig { params(point: PDF::Reader::Point).void }
+ def contains?(point); end
+
+ sig { params(other: PDF::Reader::Rectangle).void }
+ def ==(other); end
+
+ sig { params(x1: Numeric, y1: Numeric, x2: Numeric, y2: Numeric).void }
+ def set_corners(x1, y1, x2, y2); end
+ end
+
+ class Reference
+ sig { returns(Integer) }
+ attr_reader :id
+
+ sig { returns(Integer) }
+ attr_reader :gen
+
+ sig { params(id: Integer, gen: Integer).void }
+ def initialize(id, gen)
+ @id = T.let(T.unsafe(nil), Integer)
+ @gen = T.let(T.unsafe(nil), Integer)
+ end
+
+ sig { returns(T::Array[PDF::Reader::Reference]) }
+ def to_a; end
+
+ sig { returns(Integer) }
+ def to_i; end
+
+ sig { params(obj: Object).returns(T::Boolean) }
+ def ==(obj); end
+
+ sig { returns(Integer) }
+ def hash; end
+ end
+
+ class RegisterReceiver
+ sig { returns(T.untyped) }
+ attr_accessor :callbacks
+
+ sig { void }
+ def initialize; end
+
+ sig { params(meth: T.untyped).returns(T.untyped) }
+ def respond_to?(meth); end
+
+ sig { params(methodname: T.untyped, args: T.untyped).returns(T.untyped) }
+ def method_missing(methodname, *args); end
+
+ sig { params(methodname: T.untyped).returns(T.untyped) }
+ def count(methodname); end
+
+ sig { params(methodname: T.untyped).returns(T.untyped) }
+ def all(methodname); end
+
+ sig { params(methodname: T.untyped).returns(T.untyped) }
+ def all_args(methodname); end
+
+ sig { params(methodname: T.untyped).returns(T.untyped) }
+ def first_occurance_of(methodname); end
+
+ sig { params(methodname: T.untyped).returns(T.untyped) }
+ def final_occurance_of(methodname); end
+
+ sig { params(methods: T.untyped).returns(T.untyped) }
+ def series(*methods); end
+ end
+
+ class Resources
+
+ sig { params(objects: PDF::Reader::ObjectHash, resources: T::Hash[T.untyped, T.untyped]).void }
+ def initialize(objects, resources)
+ @objects = T.let(T.unsafe(nil), PDF::Reader::ObjectHash)
+ @resources = T.let(T.unsafe(nil), T::Hash[Symbol, T.untyped])
+ end
+
+ sig { returns(T::Hash[Symbol, T.untyped]) }
+ def color_spaces; end
+
+ sig { returns(T::Hash[Symbol, T.untyped]) }
+ def fonts; end
+
+ sig { returns(T::Hash[Symbol, T.untyped]) }
+ def graphic_states; end
+
+ sig { returns(T::Hash[Symbol, T.untyped]) }
+ def patterns; end
+
+ sig { returns(T::Array[Symbol]) }
+ def procedure_sets; end
+
+ sig { returns(T::Hash[Symbol, T.untyped]) }
+ def properties; end
+
+ sig { returns(T::Hash[Symbol, T.untyped]) }
+ def shadings; end
+
+ sig { returns(T::Hash[Symbol, PDF::Reader::Stream]) }
+ def xobjects; end
+ end
+
+ class SecurityHandlerFactory
+ sig { params(encrypt: T.untyped, doc_id: T.untyped, password: T.untyped).returns(T.untyped) }
+ def self.build(encrypt, doc_id, password); end
+
+ sig { params(encrypt: T.untyped, doc_id: T.untyped, password: T.untyped).returns(T.untyped) }
+ def self.build_standard_handler(encrypt, doc_id, password); end
+
+ sig { params(encrypt: T.untyped, doc_id: T.untyped, password: T.untyped).returns(T.untyped) }
+ def self.build_v5_handler(encrypt, doc_id, password); end
+
+ sig { params(encrypt: T.untyped).returns(T.untyped) }
+ def self.standard?(encrypt); end
+
+ sig { params(encrypt: T.untyped).returns(T.untyped) }
+ def self.standard_v5?(encrypt); end
+ end
+
+ class StandardKeyBuilder
+ PassPadBytes = [ 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41,
+ 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08,
+ 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80,
+ 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a ]
+
+ sig { params(opts: T::Hash[Symbol, T.untyped]).void }
+ def initialize(opts = {}); end
+
+ sig { params(pass: String).returns(String) }
+ def key(pass); end
+
+ sig { params(p: T.untyped).returns(T.untyped) }
+ def pad_pass(p = ""); end
+
+ sig { params(buf: T.untyped, int: T.untyped).returns(T.untyped) }
+ def xor_each_byte(buf, int); end
+
+ sig { params(pass: T.untyped).returns(T.untyped) }
+ def auth_owner_pass(pass); end
+
+ sig { params(pass: T.untyped).returns(T.untyped) }
+ def auth_user_pass(pass); end
+
+ sig { params(user_pass: T.untyped).returns(T.untyped) }
+ def make_file_key(user_pass); end
+ end
+
+ class Stream
+ sig { returns(T::Hash[Symbol, T.untyped]) }
+ attr_accessor :hash
+
+ sig { returns(String) }
+ attr_accessor :data
+
+ sig { params(hash: T::Hash[Symbol, T.untyped], data: String).void }
+ def initialize(hash, data)
+ @hash = T.let(T.unsafe(nil), T::Hash[Symbol, T.untyped])
+ @data = T.let(T.unsafe(nil), String)
+ @udata = T.let(T.unsafe(nil), T.nilable(String))
+ end
+
+ sig { returns(String) }
+ def unfiltered_data; end
+ end
+
+ class SynchronizedCache
+ sig { void }
+ def initialize
+ @cache = T.let(T.unsafe(nil), T::Hash[Object, T.untyped])
+ @mutex = T.let(T.unsafe(nil), Mutex)
+ end
+
+ sig { params(key: Object).returns(T.untyped) }
+ def [](key); end
+
+ sig { params(key: Object, value: T.nilable(Object)).returns(T.untyped) }
+ def []=(key, value); end
+ end
+
+ class TextRun
+ include Comparable
+
+ sig { returns(Numeric) }
+ attr_reader :width
+
+ sig { returns(Numeric) }
+ attr_reader :font_size
+
+ sig { returns(String) }
+ attr_reader :text
+
+ sig { returns(PDF::Reader::Point) }
+ attr_reader :origin
+
+ sig do
+ params(
+ x: Numeric,
+ y: Numeric,
+ width: Numeric,
+ font_size: Numeric,
+ text: String
+ ).void
+ end
+ def initialize(x, y, width, font_size, text)
+ @origin = T.let(T.unsafe(nil), PDF::Reader::Point)
+ @width = T.let(T.unsafe(nil), Numeric)
+ @font_size = T.let(T.unsafe(nil), Numeric)
+ @text = T.let(T.unsafe(nil), String)
+ @endx = T.let(T.unsafe(nil), T.nilable(Numeric))
+ @endy = T.let(T.unsafe(nil), T.nilable(Numeric))
+ @mergable_range = T.let(T.unsafe(nil), T.nilable(T::Range[Numeric]))
+ end
+
+ sig { params(other: T.untyped).returns(T.untyped) }
+ def <=>(other); end
+
+ sig { returns(Numeric) }
+ def endx; end
+
+ sig { returns(Numeric) }
+ def endy; end
+
+ sig { returns(Numeric) }
+ def x; end
+
+ sig { returns(Numeric) }
+ def y; end
+
+ sig { returns(Numeric) }
+ def mean_character_width; end
+
+ sig { params(other: PDF::Reader::TextRun).returns(T::Boolean) }
+ def mergable?(other); end
+
+ sig { params(other: PDF::Reader::TextRun).returns(PDF::Reader::TextRun) }
+ def +(other); end
+
+ sig { returns(String) }
+ def inspect; end
+
+ sig { params(other_run: T.untyped).returns(T::Boolean) }
+ def intersect?(other_run); end
+
+ sig { params(other_run: T.untyped).returns(Numeric) }
+ def intersection_area_percent(other_run); end
+
+ sig { returns(Numeric) }
+ def area; end
+
+ sig { returns(T::Range[Numeric]) }
+ def mergable_range; end
+
+ sig { returns(Numeric) }
+ def character_count; end
+ end
+
+ class Token < String
+ sig { params(val: T.untyped).void }
+ def initialize(val); end
+ end
+
+ class TransformationMatrix
+ sig { returns(Numeric) }
+ attr_reader :a
+
+ sig { returns(Numeric) }
+ attr_reader :b
+
+ sig { returns(Numeric) }
+ attr_reader :c
+
+ sig { returns(Numeric) }
+ attr_reader :d
+
+ sig { returns(Numeric) }
+ attr_reader :e
+
+ sig { returns(Numeric) }
+ attr_reader :f
+
+ sig do
+ params(
+ a: Numeric,
+ b: Numeric,
+ c: Numeric,
+ d: Numeric,
+ e: Numeric,
+ f: Numeric
+ ).void
+ end
+ def initialize(a, b, c, d, e, f)
+ @a = T.let(T.unsafe(nil), Numeric)
+ @b = T.let(T.unsafe(nil), Numeric)
+ @c = T.let(T.unsafe(nil), Numeric)
+ @d = T.let(T.unsafe(nil), Numeric)
+ @e = T.let(T.unsafe(nil), Numeric)
+ @f = T.let(T.unsafe(nil), Numeric)
+ end
+
+ sig { returns(String) }
+ def inspect; end
+
+ sig { returns(T::Array[Numeric]) }
+ def to_a; end
+
+ sig do
+ params(
+ a: Numeric,
+ b: Numeric,
+ c: Numeric,
+ d: Numeric,
+ e: Numeric,
+ f: Numeric
+ ).returns(PDF::Reader::TransformationMatrix)
+ end
+ def multiply!(a, b, c, d, e, f); end
+
+ sig { params(e2: Numeric).void }
+ def horizontal_displacement_multiply!(e2); end
+
+ sig do
+ params(
+ a2: Numeric,
+ b2: Numeric,
+ c2: Numeric,
+ d2: Numeric,
+ e2: Numeric,
+ f2: Numeric
+ ).void
+ end
+ def horizontal_displacement_multiply_reversed!(a2, b2, c2, d2, e2, f2); end
+
+ sig do
+ params(
+ a2: Numeric,
+ b2: Numeric,
+ c2: Numeric,
+ d2: Numeric,
+ e2: Numeric,
+ f2: Numeric
+ ).void
+ end
+ def xy_scaling_multiply!(a2, b2, c2, d2, e2, f2); end
+
+ sig do
+ params(
+ a2: Numeric,
+ b2: Numeric,
+ c2: Numeric,
+ d2: Numeric,
+ e2: Numeric,
+ f2: Numeric
+ ).void
+ end
+ def xy_scaling_multiply_reversed!(a2, b2, c2, d2, e2, f2); end
+
+ sig do
+ params(
+ a2: Numeric,
+ b2: Numeric,
+ c2: Numeric,
+ d2: Numeric,
+ e2: Numeric,
+ f2: Numeric
+ ).void
+ end
+ def regular_multiply!(a2, b2, c2, d2, e2, f2); end
+
+ sig do
+ params(
+ a2: Numeric,
+ b2: Numeric,
+ c2: Numeric,
+ d2: Numeric,
+ e2: Numeric,
+ f2: Numeric
+ ).void
+ end
+ def faster_multiply!(a2, b2, c2, d2, e2, f2); end
+ end
+
+ class TypeCheck
+
+ sig { params(obj: T.untyped).returns(Integer) }
+ def self.cast_to_int!(obj); end
+
+ sig { params(obj: T.untyped).returns(Numeric) }
+ def self.cast_to_numeric!(obj); end
+
+ sig { params(string: T.untyped).returns(String) }
+ def self.cast_to_string!(string); end
+
+ sig { params(obj: T.untyped).returns(T.nilable(Symbol)) }
+ def self.cast_to_symbol(obj); end
+
+ sig { params(obj: T.untyped).returns(Symbol) }
+ def self.cast_to_symbol!(obj); end
+
+ sig { params(obj: T.untyped).returns(T::Hash[Symbol, T.untyped]) }
+ def self.cast_to_pdf_dict!(obj); end
+
+ sig { params(obj: T.untyped).returns(T::Hash[Symbol, PDF::Reader::Stream]) }
+ def self.cast_to_pdf_dict_with_stream_values!(obj); end
+ end
+
+ class ValidatingReceiver
+ sig { params(wrapped: T.untyped).void }
+ def initialize(wrapped)
+ @wrapped = T.let(T.unsafe(nil), T.untyped)
+ end
+
+ sig { params(page: PDF::Reader::Page).void }
+ def page=(page); end
+
+ sig { params(args: T.untyped).void }
+ def save_graphics_state(*args); end
+
+ sig { params(args: T.untyped).void }
+ def restore_graphics_state(*args); end
+
+ sig { params(args: T.untyped).void }
+ def concatenate_matrix(*args); end
+
+ sig { params(args: T.untyped).void }
+ def begin_text_object(*args); end
+
+ sig { params(args: T.untyped).void }
+ def end_text_object(*args); end
+
+ sig { params(args: T.untyped).void }
+ def set_character_spacing(*args); end
+
+ sig { params(args: T.untyped).void }
+ def set_horizontal_text_scaling(*args); end
+
+ sig { params(args: T.untyped).void }
+ def set_text_font_and_size(*args); end
+
+ sig { params(args: T.untyped).void }
+ def set_text_leading(*args); end
+
+ sig { params(args: T.untyped).void }
+ def set_text_rendering_mode(*args); end
+
+ sig { params(args: T.untyped).void }
+ def set_text_rise(*args); end
+
+ sig { params(args: T.untyped).void }
+ def set_word_spacing(*args); end
+
+ sig { params(args: T.untyped).void }
+ def move_text_position(*args); end
+
+ sig { params(args: T.untyped).void }
+ def move_text_position_and_set_leading(*args); end
+
+ sig { params(args: T.untyped).void }
+ def set_text_matrix_and_text_line_matrix(*args); end
+
+ sig { params(args: T.untyped).void }
+ def move_to_start_of_next_line(*args); end
+
+ sig { params(args: T.untyped).void }
+ def show_text(*args); end
+
+ sig { params(args: T.untyped).void }
+ def show_text_with_positioning(*args); end
+
+ sig { params(args: T.untyped).void }
+ def move_to_next_line_and_show_text(*args); end
+
+ sig { params(args: T.untyped).void }
+ def set_spacing_next_line_show_text(*args); end
+
+ sig { params(args: T.untyped).void }
+ def invoke_xobject(*args); end
+
+ sig { params(args: T.untyped).void }
+ def begin_inline_image(*args); end
+
+ sig { params(args: T.untyped).void }
+ def begin_inline_image_data(*args); end
+
+ sig { params(args: T.untyped).void }
+ def end_inline_image(*args); end
+
+ sig { params(meth: T.untyped).returns(T::Boolean) }
+ def respond_to?(meth); end
+
+ sig { params(methodname: Symbol, args: T.untyped).void }
+ def method_missing(methodname, *args); end
+
+ sig { params(methodname: T.untyped, args: T.untyped).void }
+ def call_wrapped(methodname, *args); end
+ end
+
+ class UnimplementedSecurityHandler
+ sig { params(encrypt: T.untyped).returns(T.untyped) }
+ def self.supports?(encrypt); end
+
+ sig { params(buf: T.untyped, ref: T.untyped).returns(T.untyped) }
+ def decrypt(buf, ref); end
+ end
+
+ class XRef
+ include Enumerable
+ extend T::Generic # Provides `type_member` helper
+
+ sig { returns(T::Hash[Symbol, T.untyped]) }
+ attr_reader :trailer
+
+ sig { params(io: T.any(IO, Tempfile, StringIO)).void }
+ def initialize(io)
+ @io = T.let(T.unsafe(nil), T.any(IO, Tempfile, StringIO))
+ @junk_offset = T.let(T.unsafe(nil), Integer)
+ @xref = T.let(T.unsafe(nil), T::Hash[Integer, T::Hash[Integer, Integer]])
+ @trailer = T.let(T.unsafe(nil), T::Hash[Symbol, T.untyped])
+ end
+
+ sig { returns(T.untyped) }
+ def size; end
+
+ sig { params(ref: T.untyped).returns(T.untyped) }
+ def [](ref); end
+
+ sig { params(block: T.untyped).returns(T.untyped) }
+ def each(&block); end
+
+ sig { params(offset: T.untyped).returns(T.untyped) }
+ def load_offsets(offset = nil); end
+
+ sig { params(buf: T.untyped).returns(T.untyped) }
+ def load_xref_table(buf); end
+
+ sig { params(stream: T.untyped).returns(T.untyped) }
+ def load_xref_stream(stream); end
+
+ sig { params(bytes: T.untyped).returns(T.untyped) }
+ def unpack_bytes(bytes); end
+
+ sig { params(offset: T.untyped).returns(T.untyped) }
+ def new_buffer(offset = 0); end
+
+ sig { params(id: T.untyped, gen: T.untyped, offset: T.untyped).returns(T.untyped) }
+ def store(id, gen, offset); end
+
+ sig { params(io: T.untyped).returns(T.untyped) }
+ def calc_junk_offset(io); end
+ end
+
+ class ZeroWidthRunsFilter
+ sig { params(runs: T::Array[PDF::Reader::TextRun]).returns(T::Array[PDF::Reader::TextRun]) }
+ def self.exclude_zero_width_runs(runs); end
+ end
+
+ module Filter
+ sig { params(name: Symbol, options: T::Hash[T.untyped, T.untyped]).returns(T.untyped) }
+ def self.with(name, options = {}); end
+
+ class Ascii85
+ sig { params(options: T::Hash[T.untyped, T.untyped]).void }
+ def initialize(options = {})
+ @options = T.let(T.unsafe(nil), T::Hash[T.untyped, T.untyped])
+ end
+
+ sig { params(data: String).returns(String) }
+ def filter(data); end
+ end
+
+ class AsciiHex
+ sig { params(options: T::Hash[T.untyped, T.untyped]).void }
+ def initialize(options = {})
+ @options = T.let(T.unsafe(nil), T::Hash[T.untyped, T.untyped])
+ end
+
+ sig { params(data: String).returns(String) }
+ def filter(data); end
+ end
+
+ class Depredict
+ sig { params(options: T::Hash[T.untyped, T.untyped]).void }
+ def initialize(options = {})
+ @options = T.let(T.unsafe(nil), T::Hash[T.untyped, T.untyped])
+ end
+
+ sig { params(data: String).returns(String) }
+ def filter(data); end
+
+ sig { params(data: T.untyped).returns(T.untyped) }
+ def tiff_depredict(data); end
+
+ sig { params(data: T.untyped).returns(T.untyped) }
+ def png_depredict(data); end
+ end
+
+ class Flate
+ ZLIB_AUTO_DETECT_ZLIB_OR_GZIP = 47
+ ZLIB_RAW_DEFLATE = -15
+
+ sig { params(options: T::Hash[T.untyped, T.untyped]).void }
+ def initialize(options = {})
+ @options = T.let(T.unsafe(nil), T::Hash[T.untyped, T.untyped])
+ end
+
+ sig { params(data: String).returns(String) }
+ def filter(data); end
+
+ sig { params(data: T.untyped).returns(T.untyped) }
+ def zlib_inflate(data); end
+ end
+
+ class Lzw
+ sig { params(options: T::Hash[T.untyped, T.untyped]).void }
+ def initialize(options = {})
+ @options = T.let(T.unsafe(nil), T::Hash[T.untyped, T.untyped])
+ end
+
+ sig { params(data: String).returns(String) }
+ def filter(data); end
+ end
+
+ class Null
+ sig { params(options: T::Hash[T.untyped, T.untyped]).void }
+ def initialize(options = {})
+ @options = T.let(T.unsafe(nil), T::Hash[T.untyped, T.untyped])
+ end
+
+ sig { params(data: T.untyped).returns(T.untyped) }
+ def filter(data); end
+ end
+
+ class RunLength
+ sig { params(options: T::Hash[T.untyped, T.untyped]).void }
+ def initialize(options = {})
+ @options = T.let(T.unsafe(nil), T::Hash[T.untyped, T.untyped])
+ end
+
+ sig { params(data: String).returns(String) }
+ def filter(data); end
+ end
+ end
+
+ module WidthCalculator
+ class BuiltIn
+ BUILTINS = T.let(T.unsafe(nil), T::Array[Symbol])
+
+ @@all_metrics = T.let(T.unsafe(nil), T.nilable(PDF::Reader::SynchronizedCache))
+
+ sig { params(font: PDF::Reader::Font).void }
+ def initialize(font)
+ @font = T.let(T.unsafe(nil), PDF::Reader::Font)
+ @metrics = T.let(T.unsafe(nil), AFM::Font)
+ end
+
+ sig { params(code_point: T.nilable(Integer)).returns(Numeric) }
+ def glyph_width(code_point); end
+
+ sig { params(code_point: Integer).returns(T::Boolean) }
+ def control_character?(code_point); end
+
+ sig { params(font_name: T.nilable(Symbol)).returns(String) }
+ def extract_basefont(font_name); end
+ end
+
+ class Composite
+ sig { params(font: PDF::Reader::Font).void }
+ def initialize(font)
+ @font = T.let(T.unsafe(nil), PDF::Reader::Font)
+ @widths = T.let(T.unsafe(nil), PDF::Reader::CidWidths)
+ end
+
+ sig { params(code_point: T.nilable(Integer)).returns(Numeric) }
+ def glyph_width(code_point); end
+ end
+
+ class TrueType
+ sig { params(font: PDF::Reader::Font).void }
+ def initialize(font)
+ @font = T.let(T.unsafe(nil), PDF::Reader::Font)
+ @missing_width = T.let(T.unsafe(nil), Numeric)
+ end
+
+ sig { params(code_point: T.nilable(Integer)).returns(Numeric) }
+ def glyph_width(code_point); end
+
+ sig { params(code_point: Integer).returns(T.nilable(Numeric)) }
+ def glyph_width_from_font(code_point); end
+
+ sig { params(code_point: Integer).returns(T.nilable(Numeric)) }
+ def glyph_width_from_descriptor(code_point); end
+ end
+
+ class TypeOneOrThree
+ sig { params(font: PDF::Reader::Font).void }
+ def initialize(font)
+ @font = T.let(T.unsafe(nil), PDF::Reader::Font)
+ @missing_width = T.let(T.unsafe(nil), Numeric)
+ end
+
+ sig { params(code_point: T.nilable(Integer)).returns(Numeric) }
+ def glyph_width(code_point); end
+ end
+
+ class TypeZero
+ sig { params(font: PDF::Reader::Font).void }
+ def initialize(font)
+ @font = T.let(T.unsafe(nil), PDF::Reader::Font)
+ end
+
+ sig { params(code_point: T.nilable(Integer)).returns(Numeric) }
+ def glyph_width(code_point); end
+ end
+ end
+ end
+end
diff --git a/scripts/require-strict-typing b/scripts/require-strict-typing
new file mode 100755
index 0000000..317f4a9
--- /dev/null
+++ b/scripts/require-strict-typing
@@ -0,0 +1,23 @@
+#!/usr/bin/env ruby
+
+sha_that_introduced_sorbet = 'feb9203'
+
+raw_files_added = `git diff --numstat --diff-filter=A #{sha_that_introduced_sorbet} HEAD -- lib/`
+
+just_files_added = raw_files_added.split("\n").map { |line|
+ line.split(/\s+/).last
+}
+
+files_added_without_strict_typing = just_files_added.reject { |path|
+ File.read(path).include?("typed: strict")
+}
+
+if files_added_without_strict_typing.any?
+ $stderr.puts "The following source files added since #{sha_that_introduced_sorbet} need 'typed: strict' added:'"
+ files_added_without_strict_typing.each do |path|
+ $stderr.puts "- #{path}"
+ end
+ exit 1
+else
+ puts "All source files added since #{sha_that_introduced_sorbet} have strict typing"
+end
diff --git a/sorbet/config b/sorbet/config
new file mode 100644
index 0000000..534118e
--- /dev/null
+++ b/sorbet/config
@@ -0,0 +1,3 @@
+--dir
+.
+--ignore=/vendor/bundle
diff --git a/sorbet/rbi/gems/Ascii85.rbi b/sorbet/rbi/gems/Ascii85.rbi
new file mode 100644
index 0000000..bce9957
--- /dev/null
+++ b/sorbet/rbi/gems/Ascii85.rbi
@@ -0,0 +1,17 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/Ascii85/all/Ascii85.rbi
+#
+# Ascii85-1.1.0
+
+module Ascii85
+ def self.decode(str); end
+ def self.encode(str, wrap_lines = nil); end
+end
+class Ascii85::DecodingError < StandardError
+end
diff --git a/sorbet/rbi/gems/afm.rbi b/sorbet/rbi/gems/afm.rbi
new file mode 100644
index 0000000..d8b62a9
--- /dev/null
+++ b/sorbet/rbi/gems/afm.rbi
@@ -0,0 +1,23 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/afm/all/afm.rbi
+#
+# afm-0.2.2
+
+module AFM
+end
+class AFM::Font
+ def [](key); end
+ def char_metrics; end
+ def char_metrics_by_code; end
+ def initialize(filename); end
+ def kern_pairs; end
+ def metadata; end
+ def metrics_for(char); end
+ def self.from_file(file); end
+end
diff --git a/sorbet/rbi/gems/ascii85_native.rbi b/sorbet/rbi/gems/ascii85_native.rbi
new file mode 100644
index 0000000..bc14924
--- /dev/null
+++ b/sorbet/rbi/gems/ascii85_native.rbi
@@ -0,0 +1,26 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/ascii85_native/all/ascii85_native.rbi
+#
+# ascii85_native-1.0.3
+
+module Ascii85Native
+ def a85_decode(*arg0); end
+ def a85_decoded_size(*arg0); end
+ def a85_encode(*arg0); end
+ def a85_encoded_size(*arg0); end
+ def self.a85_decode(*arg0); end
+ def self.a85_decoded_size(*arg0); end
+ def self.a85_encode(*arg0); end
+ def self.a85_encoded_size(*arg0); end
+ def self.decode(input, force_delimiter = nil); end
+ def self.encode(input, include_delimiter = nil); end
+ def self.find_stream_end(input); end
+ def self.find_stream_start(input); end
+ extend FFI::Library
+end
diff --git a/sorbet/rbi/gems/ast.rbi b/sorbet/rbi/gems/ast.rbi
new file mode 100644
index 0000000..2b18c4a
--- /dev/null
+++ b/sorbet/rbi/gems/ast.rbi
@@ -0,0 +1,49 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/ast/all/ast.rbi
+#
+# ast-2.4.2
+
+module AST
+end
+class AST::Node
+ def +(array); end
+ def <<(element); end
+ def ==(other); end
+ def append(element); end
+ def assign_properties(properties); end
+ def children; end
+ def clone; end
+ def concat(array); end
+ def deconstruct; end
+ def dup; end
+ def eql?(other); end
+ def fancy_type; end
+ def hash; end
+ def initialize(type, children = nil, properties = nil); end
+ def inspect(indent = nil); end
+ def original_dup; end
+ def to_a; end
+ def to_ast; end
+ def to_s(indent = nil); end
+ def to_sexp(indent = nil); end
+ def to_sexp_array; end
+ def type; end
+ def updated(type = nil, children = nil, properties = nil); end
+end
+class AST::Processor
+ include AST::Processor::Mixin
+end
+module AST::Processor::Mixin
+ def handler_missing(node); end
+ def process(node); end
+ def process_all(nodes); end
+end
+module AST::Sexp
+ def s(type, *children); end
+end
diff --git a/sorbet/rbi/gems/cane.rbi b/sorbet/rbi/gems/cane.rbi
new file mode 100644
index 0000000..abf50af
--- /dev/null
+++ b/sorbet/rbi/gems/cane.rbi
@@ -0,0 +1,233 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/cane/all/cane.rbi
+#
+# cane-3.0.0
+
+module Cane
+ def default_checks; end
+ def run(*args); end
+ def self.default_checks; end
+ def self.run(*args); end
+ def self.task_runner(opts); end
+ def task_runner(opts); end
+end
+class Cane::ViolationFormatter
+ def colorize(string); end
+ def column_widths(violations, columns); end
+ def format_group_header(description, violations); end
+ def format_violation(v, column_widths); end
+ def format_violations(violations); end
+ def initialize(violations, options = nil); end
+ def options; end
+ def to_s; end
+ def totals; end
+ def violations; end
+end
+class Cane::JsonFormatter
+ def initialize(violations, options = nil); end
+ def to_s; end
+end
+class Cane::Runner
+ def checks; end
+ def formatter; end
+ def initialize(spec); end
+ def opts; end
+ def outputter; end
+ def run; end
+ def violations; end
+end
+class Cane::EncodingAwareIterator
+ def each(&block); end
+ def initialize(lines); end
+ def lines; end
+ include Enumerable
+end
+class Cane::File
+ def self.case_insensitive_glob(glob); end
+ def self.contents(path); end
+ def self.exists?(path); end
+ def self.iterator(path); end
+ def self.open(path); end
+end
+class Cane::SimpleTaskRunner
+ def self.map(enumerable, &block); end
+end
+class Anonymous_Struct_1 < Struct
+ def opts; end
+ def opts=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class Cane::AbcCheck < Anonymous_Struct_1
+ def exclusions; end
+ def file_names; end
+ def find_violations(file_name); end
+ def max_allowed_complexity; end
+ def order(result); end
+ def self.key; end
+ def self.name; end
+ def self.options; end
+ def violations; end
+ def worker; end
+end
+class Anonymous_Struct_2 < Struct
+ def file_name; end
+ def file_name=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class Cane::AbcCheck::InvalidAst < Anonymous_Struct_2
+ def violations; end
+end
+class Anonymous_Struct_3 < Struct
+ def exclusions; end
+ def exclusions=(_); end
+ def file_name; end
+ def file_name=(_); end
+ def max_allowed_complexity; end
+ def max_allowed_complexity=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def sexps; end
+ def sexps=(_); end
+end
+class Cane::AbcCheck::RubyAst < Anonymous_Struct_3
+ def anon_method_add; end
+ def anon_method_add=(arg0); end
+ def assignment_nodes; end
+ def branch_nodes; end
+ def calculate_abc(method_node); end
+ def condition_nodes; end
+ def container_label(node); end
+ def container_nodes; end
+ def count_nodes(node, types); end
+ def excluded?(method_description); end
+ def initialize(*args); end
+ def label_for(node); end
+ def method_description(node, *modules, meth_name); end
+ def method_nodes; end
+ def process_ast(node, complexity = nil, nesting = nil); end
+ def violations; end
+end
+class Anonymous_Struct_4 < Struct
+ def opts; end
+ def opts=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class Cane::StyleCheck < Anonymous_Struct_4
+ def excluded?(file); end
+ def exclusions; end
+ def file_list; end
+ def map_lines(file_path, &block); end
+ def measure; end
+ def self.key; end
+ def self.name; end
+ def self.options; end
+ def violations; end
+ def violations_for_line(line); end
+ def worker; end
+end
+class Anonymous_Struct_5 < Struct
+ def opts; end
+ def opts=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class Cane::DocCheck < Anonymous_Struct_5
+ def class_definition(number, line, last_line); end
+ def class_definition?(line); end
+ def class_definitions_in(file_name); end
+ def comment?(line); end
+ def excluded?(file); end
+ def exclusions; end
+ def extract_class_name(line); end
+ def file_names; end
+ def find_violations(file_name); end
+ def method_definition?(line); end
+ def missing_file_violations; end
+ def self.key; end
+ def self.name; end
+ def self.options; end
+ def single_line_class_definition?(line); end
+ def violations; end
+ def worker; end
+end
+class Cane::DocCheck::ClassDefinition < Struct
+ def label; end
+ def line; end
+ def missing_doc?; end
+ def requires_doc=(value); end
+ def requires_doc?; end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def values; end
+ def values=(_); end
+end
+class Anonymous_Struct_6 < Struct
+ def opts; end
+ def opts=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class Cane::ThresholdCheck < Anonymous_Struct_6
+ def normalized_limit(limit); end
+ def self.key; end
+ def self.options; end
+ def thresholds; end
+ def value_from_file(file); end
+ def violations; end
+end
+class Cane::ThresholdCheck::UnavailableValue
+ def >=(_); end
+ def real?; end
+ def to_s; end
+end
+module Cane::CLI
+ def default_options; end
+ def defaults(check); end
+ def run(args); end
+ def self.default_options; end
+ def self.defaults(check); end
+ def self.run(args); end
+end
+class Cane::CLI::Parser
+ def add_banner; end
+ def add_cane_options; end
+ def add_check_options(check); end
+ def add_checks_shortcut; end
+ def add_help; end
+ def add_option(option, description, opts = nil); end
+ def add_user_defined_checks; end
+ def add_version; end
+ def get_default_options; end
+ def initialize(stdout = nil); end
+ def options; end
+ def parse(args, ret = nil); end
+ def parser; end
+ def read_options_from_file(file); end
+ def self.parse(*args); end
+ def stdout; end
+end
+class Cane::CLI::Parser::OptionsHandled < RuntimeError
+end
diff --git a/sorbet/rbi/gems/coderay.rbi b/sorbet/rbi/gems/coderay.rbi
new file mode 100644
index 0000000..539972f
--- /dev/null
+++ b/sorbet/rbi/gems/coderay.rbi
@@ -0,0 +1,285 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/coderay/all/coderay.rbi
+#
+# coderay-1.1.3
+
+module CodeRay
+ def self.coderay_path(*path); end
+ def self.encode(code, lang, format, options = nil); end
+ def self.encode_file(filename, format, options = nil); end
+ def self.encode_tokens(tokens, format, options = nil); end
+ def self.encoder(format, options = nil); end
+ def self.get_scanner_options(options); end
+ def self.highlight(code, lang, options = nil, format = nil); end
+ def self.highlight_file(filename, options = nil, format = nil); end
+ def self.scan(code, lang, options = nil, &block); end
+ def self.scan_file(filename, lang = nil, options = nil, &block); end
+ def self.scanner(lang, options = nil, &block); end
+end
+module CodeRay::FileType
+ def self.[](filename, read_shebang = nil); end
+ def self.fetch(filename, default = nil, read_shebang = nil); end
+ def self.type_from_shebang(filename); end
+end
+class CodeRay::FileType::UnknownFileType < Exception
+end
+class CodeRay::Tokens < Array
+ def begin_group(kind); end
+ def begin_line(kind); end
+ def count; end
+ def encode(encoder, options = nil); end
+ def end_group(kind); end
+ def end_line(kind); end
+ def method_missing(meth, options = nil); end
+ def scanner; end
+ def scanner=(arg0); end
+ def split_into_parts(*sizes); end
+ def text_token(*arg0); end
+ def to_s; end
+ def tokens(*arg0); end
+end
+class CodeRay::TokensProxy
+ def block; end
+ def block=(arg0); end
+ def each(*args, &blk); end
+ def encode(encoder, options = nil); end
+ def initialize(input, lang, options = nil, block = nil); end
+ def input; end
+ def input=(arg0); end
+ def lang; end
+ def lang=(arg0); end
+ def method_missing(method, *args, &blk); end
+ def options; end
+ def options=(arg0); end
+ def scanner; end
+ def tokens; end
+end
+module CodeRay::PluginHost
+ def [](id, *args, &blk); end
+ def all_plugins; end
+ def const_missing(const); end
+ def default(id = nil); end
+ def list; end
+ def load(id, *args, &blk); end
+ def load_all; end
+ def load_plugin_map; end
+ def make_plugin_hash; end
+ def map(hash); end
+ def path_to(plugin_id); end
+ def plugin_hash; end
+ def plugin_path(*args); end
+ def register(plugin, id); end
+ def self.extended(mod); end
+ def validate_id(id); end
+end
+class CodeRay::PluginHost::PluginNotFound < LoadError
+end
+class CodeRay::PluginHost::HostNotFound < LoadError
+end
+module CodeRay::Plugin
+ def aliases; end
+ def plugin_host(host = nil); end
+ def plugin_id; end
+ def register_for(id); end
+ def title(title = nil); end
+end
+module CodeRay::Scanners
+ extend CodeRay::PluginHost
+end
+class CodeRay::Scanners::Scanner < StringScanner
+ def binary_string; end
+ def column(pos = nil); end
+ def each(&block); end
+ def file_extension; end
+ def initialize(code = nil, options = nil); end
+ def lang; end
+ def line(pos = nil); end
+ def raise_inspect(message, tokens, state = nil, ambit = nil, backtrace = nil); end
+ def raise_inspect_arguments(message, tokens, state, ambit); end
+ def reset; end
+ def reset_instance; end
+ def scan_rest; end
+ def scan_tokens(tokens, options); end
+ def scanner_state_info(state); end
+ def self.encode_with_encoding(code, target_encoding); end
+ def self.encoding(name = nil); end
+ def self.file_extension(extension = nil); end
+ def self.guess_encoding(s); end
+ def self.lang; end
+ def self.normalize(code); end
+ def self.to_unix(code); end
+ def set_string_from_source(source); end
+ def set_tokens_from_options(options); end
+ def setup; end
+ def state; end
+ def state=(arg0); end
+ def string=(code); end
+ def tokenize(source = nil, options = nil); end
+ def tokens; end
+ def tokens_last(tokens, n); end
+ def tokens_size(tokens); end
+ extend CodeRay::Plugin
+ include Enumerable
+end
+class CodeRay::Scanners::Scanner::ScanError < StandardError
+end
+class CodeRay::WordList < Hash
+ def add(words, value = nil); end
+ def initialize(default = nil); end
+end
+class CodeRay::WordList::CaseIgnoring < CodeRay::WordList
+ def [](key); end
+ def []=(key, value); end
+end
+module CodeRay::Scanners::Java::BuiltinTypes
+end
+class CodeRay::Scanners::Java < CodeRay::Scanners::Scanner
+ def scan_tokens(encoder, options); end
+end
+class CodeRay::Scanners::Ruby < CodeRay::Scanners::Scanner
+ def interpreted_string_state; end
+ def scan_tokens(encoder, options); end
+ def setup; end
+end
+module CodeRay::Scanners::Ruby::Patterns
+end
+class Anonymous_Struct_7 < Struct
+ def delim; end
+ def delim=(_); end
+ def heredoc; end
+ def heredoc=(_); end
+ def interpreted; end
+ def interpreted=(_); end
+ def next_state; end
+ def next_state=(_); end
+ def opening_paren; end
+ def opening_paren=(_); end
+ def paren_depth; end
+ def paren_depth=(_); end
+ def pattern; end
+ def pattern=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def type; end
+ def type=(_); end
+end
+class CodeRay::Scanners::Ruby::StringState < Anonymous_Struct_7
+ def heredoc_pattern(delim, interpreted, indented); end
+ def initialize(kind, interpreted, delim, heredoc = nil); end
+ def self.simple_key_pattern(delim); end
+end
+module CodeRay::Encoders
+ extend CodeRay::PluginHost
+end
+class CodeRay::Encoders::Encoder
+ def <<(token); end
+ def begin_group(kind); end
+ def begin_line(kind); end
+ def compile(tokens, options = nil); end
+ def encode(code, lang, options = nil); end
+ def encode_tokens(tokens, options = nil); end
+ def end_group(kind); end
+ def end_line(kind); end
+ def file_extension; end
+ def finish(options); end
+ def get_output(options); end
+ def highlight(code, lang, options = nil); end
+ def initialize(options = nil); end
+ def options; end
+ def options=(arg0); end
+ def output(data); end
+ def scanner; end
+ def scanner=(arg0); end
+ def self.const_missing(sym); end
+ def self.file_extension; end
+ def setup(options); end
+ def text_token(text, kind); end
+ def token(content, kind); end
+ def tokens(tokens, options = nil); end
+ extend CodeRay::Plugin
+end
+class CodeRay::Encoders::HTML < CodeRay::Encoders::Encoder
+ def begin_group(kind); end
+ def begin_line(kind); end
+ def break_lines(text, style); end
+ def check_group_nesting(name, kind); end
+ def check_options!(options); end
+ def close_span; end
+ def css; end
+ def css_class_for_kinds(kinds); end
+ def end_group(kind); end
+ def end_line(kind); end
+ def finish(options); end
+ def make_span_for_kinds(method, hint); end
+ def self.make_html_escape_hash; end
+ def self.token_path_to_hint(hint, kinds); end
+ def setup(options); end
+ def style_for_kinds(kinds); end
+ def text_token(text, kind); end
+end
+module CodeRay::Encoders::HTML::Output
+ def apply_title!(title); end
+ def css; end
+ def css=(arg0); end
+ def self.extended(o); end
+ def self.make_stylesheet(css, in_tag = nil); end
+ def self.page_template_for_css(css); end
+ def stylesheet(in_tag = nil); end
+ def wrap!(element, *args); end
+ def wrap_in!(template); end
+ def wrapped_in; end
+ def wrapped_in=(arg0); end
+ def wrapped_in?(element); end
+end
+class CodeRay::Encoders::HTML::Output::Template < String
+ def apply(target, replacement); end
+ def self.wrap!(str, template, target); end
+end
+class CodeRay::Encoders::HTML::CSS
+ def get_style_for_css_classes(css_classes); end
+ def initialize(style = nil); end
+ def parse(stylesheet); end
+ def self.load_stylesheet(style = nil); end
+ def stylesheet; end
+end
+module CodeRay::Encoders::HTML::Numbering
+ def self.number!(output, mode = nil, options = nil); end
+end
+module CodeRay::Styles
+ extend CodeRay::PluginHost
+end
+class CodeRay::Styles::Style
+ extend CodeRay::Plugin
+end
+class CodeRay::Duo
+ def call(code, options = nil); end
+ def encode(code, options = nil); end
+ def encoder; end
+ def format; end
+ def format=(arg0); end
+ def highlight(code, options = nil); end
+ def initialize(lang = nil, format = nil, options = nil); end
+ def lang; end
+ def lang=(arg0); end
+ def options; end
+ def options=(arg0); end
+ def scanner; end
+ def self.[](*arg0); end
+end
+class CodeRay::Encoders::Terminal < CodeRay::Encoders::Encoder
+ def begin_group(kind); end
+ def begin_line(kind); end
+ def end_group(kind); end
+ def end_line(kind); end
+ def open_token(kind); end
+ def setup(options); end
+ def text_token(text, kind); end
+end
diff --git a/sorbet/rbi/gems/commander.rbi b/sorbet/rbi/gems/commander.rbi
new file mode 100644
index 0000000..d357100
--- /dev/null
+++ b/sorbet/rbi/gems/commander.rbi
@@ -0,0 +1,197 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/commander/all/commander.rbi
+#
+# commander-4.6.0
+
+module Commander
+ def configure(*configuration_opts, &configuration_block); end
+ def self.configure(*configuration_opts, &configuration_block); end
+end
+module Blank
+ def self.included(base); end
+end
+module Commander::UI
+ def applescript(script); end
+ def ask_editor(input = nil, preferred_editor = nil); end
+ def available_editor(preferred = nil); end
+ def choose(message = nil, *choices, &block); end
+ def color(*args); end
+ def converse(prompt, responses = nil); end
+ def enable_paging; end
+ def io(input = nil, output = nil, &block); end
+ def log(action, *args); end
+ def password(message = nil, mask = nil); end
+ def progress(arr, options = nil); end
+ def replace_tokens(str, hash); end
+ def say_error(*args); end
+ def say_ok(*args); end
+ def say_warning(*args); end
+ def self.applescript(script); end
+ def self.ask_editor(input = nil, preferred_editor = nil); end
+ def self.available_editor(preferred = nil); end
+ def self.choose(message = nil, *choices, &block); end
+ def self.color(*args); end
+ def self.converse(prompt, responses = nil); end
+ def self.enable_paging; end
+ def self.io(input = nil, output = nil, &block); end
+ def self.log(action, *args); end
+ def self.password(message = nil, mask = nil); end
+ def self.progress(arr, options = nil); end
+ def self.replace_tokens(str, hash); end
+ def self.say_error(*args); end
+ def self.say_ok(*args); end
+ def self.say_warning(*args); end
+ def self.speak(message, voice = nil, rate = nil); end
+ def speak(message, voice = nil, rate = nil); end
+end
+module Commander::UI::AskForClass
+ def ask_for_array(prompt); end
+ def ask_for_file(prompt); end
+ def ask_for_float(prompt); end
+ def ask_for_integer(prompt); end
+ def ask_for_pathname(prompt); end
+ def ask_for_regexp(prompt); end
+ def ask_for_string(prompt); end
+ def ask_for_symbol(prompt); end
+ def method_missing(method_name, *arguments, &block); end
+ def respond_to_missing?(method_name, include_private = nil); end
+end
+class Commander::UI::ProgressBar
+ def completed?; end
+ def erase_line; end
+ def finished?; end
+ def generate_tokens; end
+ def increment(tokens = nil); end
+ def initialize(total, options = nil); end
+ def percent_complete; end
+ def progress_bar; end
+ def show; end
+ def steps_remaining; end
+ def time_elapsed; end
+ def time_remaining; end
+end
+class Array
+ def self.parse(string); end
+end
+class Object < BasicObject
+ def get_binding; end
+end
+class Commander::Runner
+ def active_command; end
+ def add_command(command); end
+ def alias?(name); end
+ def alias_command(alias_name, name, *args); end
+ def always_trace!; end
+ def args_without_command_name; end
+ def command(name, &block); end
+ def command_exists?(name); end
+ def command_name_from_args; end
+ def commands; end
+ def create_default_commands; end
+ def default_command(name); end
+ def expand_optionally_negative_switches(switches); end
+ def global_option(*args, &block); end
+ def global_option_proc(switches, &block); end
+ def help_formatter; end
+ def help_formatter_alias_defaults; end
+ def help_formatter_aliases; end
+ def initialize(args = nil); end
+ def longest_valid_command_name_from(args); end
+ def never_trace!; end
+ def options; end
+ def parse_global_options; end
+ def program(key, *args, &block); end
+ def program_defaults; end
+ def remove_global_options(options, args); end
+ def require_program(*keys); end
+ def require_valid_command(command = nil); end
+ def run!; end
+ def run_active_command; end
+ def say(*args); end
+ def self.instance; end
+ def self.separate_switches_from_description(*args); end
+ def self.switch_to_sym(switch); end
+ def valid_command_names_from(*args); end
+ def version; end
+end
+class Commander::Runner::CommandError < StandardError
+end
+class Commander::Runner::InvalidCommandError < Commander::Runner::CommandError
+end
+class Commander::Command
+ def action(*args, &block); end
+ def call(args = nil); end
+ def description; end
+ def description=(arg0); end
+ def example(description, command); end
+ def examples; end
+ def examples=(arg0); end
+ def global_options; end
+ def initialize(name); end
+ def inspect; end
+ def name; end
+ def name=(arg0); end
+ def option(*args, &block); end
+ def option_proc(switches); end
+ def options; end
+ def options=(arg0); end
+ def parse_options_and_call_procs(*args); end
+ def proxy_option_struct; end
+ def proxy_options; end
+ def proxy_options=(arg0); end
+ def run(*args); end
+ def summary; end
+ def summary=(arg0); end
+ def syntax; end
+ def syntax=(arg0); end
+ def when_called(*args, &block); end
+end
+class Commander::Command::Options
+ def __hash__; end
+ def default(defaults = nil); end
+ def initialize; end
+ def inspect; end
+ def method_missing(meth, *args); end
+ include Blank
+end
+module Commander::HelpFormatter
+ def indent(amount, text); end
+ def self.indent(amount, text); end
+end
+class Commander::HelpFormatter::Context
+ def decorate_binding(_bind); end
+ def get_binding; end
+ def initialize(target); end
+end
+class Commander::HelpFormatter::ProgramContext < Commander::HelpFormatter::Context
+ def decorate_binding(bind); end
+ def max_aliases_length(bind); end
+ def max_command_length(bind); end
+ def max_key_length(hash, default = nil); end
+end
+module Commander::Platform
+ def self.jruby?; end
+end
+module Commander::Delegates
+ def add_command(*args, &block); end
+ def alias_command(*args, &block); end
+ def always_trace!(*args, &block); end
+ def command(*args, &block); end
+ def default_command(*args, &block); end
+ def defined_commands(*args, &block); end
+ def global_option(*args, &block); end
+ def never_trace!(*args, &block); end
+ def program(*args, &block); end
+ def run!(*args, &block); end
+end
+module Commander::Methods
+ include Commander::Delegates
+ include Commander::UI
+ include Commander::UI::AskForClass
+end
diff --git a/sorbet/rbi/gems/ffi.rbi b/sorbet/rbi/gems/ffi.rbi
new file mode 100644
index 0000000..00ce137
--- /dev/null
+++ b/sorbet/rbi/gems/ffi.rbi
@@ -0,0 +1,560 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/ffi/all/ffi.rbi
+#
+# ffi-1.15.4
+
+class FFI::Type
+ def alignment; end
+ def initialize(arg0); end
+ def inspect; end
+ def size; end
+end
+class FFI::Type::Builtin < FFI::Type
+ def inspect; end
+end
+class FFI::ArrayType < FFI::Type
+ def elem_type; end
+ def initialize(arg0, arg1); end
+ def length; end
+end
+module FFI::LastError
+ def error; end
+ def error=(arg0); end
+ def self.error; end
+ def self.error=(arg0); end
+end
+class FFI::AbstractMemory
+ def [](arg0); end
+ def __copy_from__(arg0, arg1); end
+ def clear; end
+ def get(arg0, arg1); end
+ def get_array_of_char(arg0, arg1); end
+ def get_array_of_double(arg0, arg1); end
+ def get_array_of_float(arg0, arg1); end
+ def get_array_of_float32(arg0, arg1); end
+ def get_array_of_float64(arg0, arg1); end
+ def get_array_of_int(arg0, arg1); end
+ def get_array_of_int16(arg0, arg1); end
+ def get_array_of_int32(arg0, arg1); end
+ def get_array_of_int64(arg0, arg1); end
+ def get_array_of_int8(arg0, arg1); end
+ def get_array_of_long(arg0, arg1); end
+ def get_array_of_long_long(arg0, arg1); end
+ def get_array_of_pointer(arg0, arg1); end
+ def get_array_of_short(arg0, arg1); end
+ def get_array_of_string(*arg0); end
+ def get_array_of_uchar(arg0, arg1); end
+ def get_array_of_uint(arg0, arg1); end
+ def get_array_of_uint16(arg0, arg1); end
+ def get_array_of_uint32(arg0, arg1); end
+ def get_array_of_uint64(arg0, arg1); end
+ def get_array_of_uint8(arg0, arg1); end
+ def get_array_of_ulong(arg0, arg1); end
+ def get_array_of_ulong_long(arg0, arg1); end
+ def get_array_of_ushort(arg0, arg1); end
+ def get_bytes(arg0, arg1); end
+ def get_char(arg0); end
+ def get_double(arg0); end
+ def get_float(arg0); end
+ def get_float32(arg0); end
+ def get_float64(arg0); end
+ def get_int(arg0); end
+ def get_int16(arg0); end
+ def get_int32(arg0); end
+ def get_int64(arg0); end
+ def get_int8(arg0); end
+ def get_long(arg0); end
+ def get_long_long(arg0); end
+ def get_pointer(arg0); end
+ def get_short(arg0); end
+ def get_string(*arg0); end
+ def get_uchar(arg0); end
+ def get_uint(arg0); end
+ def get_uint16(arg0); end
+ def get_uint32(arg0); end
+ def get_uint64(arg0); end
+ def get_uint8(arg0); end
+ def get_ulong(arg0); end
+ def get_ulong_long(arg0); end
+ def get_ushort(arg0); end
+ def put(arg0, arg1, arg2); end
+ def put_array_of_char(arg0, arg1); end
+ def put_array_of_double(arg0, arg1); end
+ def put_array_of_float(arg0, arg1); end
+ def put_array_of_float32(arg0, arg1); end
+ def put_array_of_float64(arg0, arg1); end
+ def put_array_of_int(arg0, arg1); end
+ def put_array_of_int16(arg0, arg1); end
+ def put_array_of_int32(arg0, arg1); end
+ def put_array_of_int64(arg0, arg1); end
+ def put_array_of_int8(arg0, arg1); end
+ def put_array_of_long(arg0, arg1); end
+ def put_array_of_long_long(arg0, arg1); end
+ def put_array_of_pointer(arg0, arg1); end
+ def put_array_of_short(arg0, arg1); end
+ def put_array_of_uchar(arg0, arg1); end
+ def put_array_of_uint(arg0, arg1); end
+ def put_array_of_uint16(arg0, arg1); end
+ def put_array_of_uint32(arg0, arg1); end
+ def put_array_of_uint64(arg0, arg1); end
+ def put_array_of_uint8(arg0, arg1); end
+ def put_array_of_ulong(arg0, arg1); end
+ def put_array_of_ulong_long(arg0, arg1); end
+ def put_array_of_ushort(arg0, arg1); end
+ def put_bytes(*arg0); end
+ def put_char(arg0, arg1); end
+ def put_double(arg0, arg1); end
+ def put_float(arg0, arg1); end
+ def put_float32(arg0, arg1); end
+ def put_float64(arg0, arg1); end
+ def put_int(arg0, arg1); end
+ def put_int16(arg0, arg1); end
+ def put_int32(arg0, arg1); end
+ def put_int64(arg0, arg1); end
+ def put_int8(arg0, arg1); end
+ def put_long(arg0, arg1); end
+ def put_long_long(arg0, arg1); end
+ def put_pointer(arg0, arg1); end
+ def put_short(arg0, arg1); end
+ def put_string(arg0, arg1); end
+ def put_uchar(arg0, arg1); end
+ def put_uint(arg0, arg1); end
+ def put_uint16(arg0, arg1); end
+ def put_uint32(arg0, arg1); end
+ def put_uint64(arg0, arg1); end
+ def put_uint8(arg0, arg1); end
+ def put_ulong(arg0, arg1); end
+ def put_ulong_long(arg0, arg1); end
+ def put_ushort(arg0, arg1); end
+ def read_array_of_char(arg0); end
+ def read_array_of_double(arg0); end
+ def read_array_of_float(arg0); end
+ def read_array_of_int(arg0); end
+ def read_array_of_int16(arg0); end
+ def read_array_of_int32(arg0); end
+ def read_array_of_int64(arg0); end
+ def read_array_of_int8(arg0); end
+ def read_array_of_long(arg0); end
+ def read_array_of_long_long(arg0); end
+ def read_array_of_pointer(arg0); end
+ def read_array_of_short(arg0); end
+ def read_array_of_uchar(arg0); end
+ def read_array_of_uint(arg0); end
+ def read_array_of_uint16(arg0); end
+ def read_array_of_uint32(arg0); end
+ def read_array_of_uint64(arg0); end
+ def read_array_of_uint8(arg0); end
+ def read_array_of_ulong(arg0); end
+ def read_array_of_ulong_long(arg0); end
+ def read_array_of_ushort(arg0); end
+ def read_bytes(arg0); end
+ def read_char; end
+ def read_double; end
+ def read_float; end
+ def read_int16; end
+ def read_int32; end
+ def read_int64; end
+ def read_int8; end
+ def read_int; end
+ def read_long; end
+ def read_long_long; end
+ def read_pointer; end
+ def read_short; end
+ def read_uchar; end
+ def read_uint16; end
+ def read_uint32; end
+ def read_uint64; end
+ def read_uint8; end
+ def read_uint; end
+ def read_ulong; end
+ def read_ulong_long; end
+ def read_ushort; end
+ def size; end
+ def size_limit?; end
+ def total; end
+ def type_size; end
+ def write_array_of_char(arg0); end
+ def write_array_of_double(arg0); end
+ def write_array_of_float(arg0); end
+ def write_array_of_int(arg0); end
+ def write_array_of_int16(arg0); end
+ def write_array_of_int32(arg0); end
+ def write_array_of_int64(arg0); end
+ def write_array_of_int8(arg0); end
+ def write_array_of_long(arg0); end
+ def write_array_of_long_long(arg0); end
+ def write_array_of_pointer(arg0); end
+ def write_array_of_short(arg0); end
+ def write_array_of_uchar(arg0); end
+ def write_array_of_uint(arg0); end
+ def write_array_of_uint16(arg0); end
+ def write_array_of_uint32(arg0); end
+ def write_array_of_uint64(arg0); end
+ def write_array_of_uint8(arg0); end
+ def write_array_of_ulong(arg0); end
+ def write_array_of_ulong_long(arg0); end
+ def write_array_of_ushort(arg0); end
+ def write_bytes(*arg0); end
+ def write_char(arg0); end
+ def write_double(arg0); end
+ def write_float(arg0); end
+ def write_int(arg0); end
+ def write_int16(arg0); end
+ def write_int32(arg0); end
+ def write_int64(arg0); end
+ def write_int8(arg0); end
+ def write_long(arg0); end
+ def write_long_long(arg0); end
+ def write_pointer(arg0); end
+ def write_short(arg0); end
+ def write_uchar(arg0); end
+ def write_uint(arg0); end
+ def write_uint16(arg0); end
+ def write_uint32(arg0); end
+ def write_uint64(arg0); end
+ def write_uint8(arg0); end
+ def write_ulong(arg0); end
+ def write_ulong_long(arg0); end
+ def write_ushort(arg0); end
+end
+class FFI::Pointer < FFI::AbstractMemory
+ def +(arg0); end
+ def ==(arg0); end
+ def address; end
+ def autorelease=(arg0); end
+ def autorelease?; end
+ def free; end
+ def initialize(*arg0); end
+ def initialize_copy(arg0); end
+ def inspect; end
+ def null?; end
+ def order(*arg0); end
+ def read(type); end
+ def read_array_of_type(type, reader, length); end
+ def read_string(len = nil); end
+ def read_string_length(len); end
+ def read_string_to_null; end
+ def self.size; end
+ def slice(arg0, arg1); end
+ def to_i; end
+ def to_ptr; end
+ def to_s; end
+ def type_size; end
+ def write(type, value); end
+ def write_array_of_type(type, writer, ary); end
+ def write_string(str, len = nil); end
+ def write_string_length(str, len); end
+end
+class FFI::FunctionType < FFI::Type
+ def initialize(*arg0); end
+ def param_types; end
+ def result_type; end
+end
+class FFI::Function < FFI::Pointer
+ def attach(arg0, arg1); end
+ def autorelease; end
+ def autorelease=(arg0); end
+ def autorelease?; end
+ def call(*arg0); end
+ def free; end
+ def initialize(*arg0); end
+ def initialize_copy(arg0); end
+end
+class FFI::MemoryPointer < FFI::Pointer
+ def initialize(*arg0); end
+ def self.from_string(arg0); end
+end
+class FFI::Buffer < FFI::AbstractMemory
+ def +(arg0); end
+ def initialize(*arg0); end
+ def initialize_copy(arg0); end
+ def inspect; end
+ def length; end
+ def order(*arg0); end
+ def self.alloc_in(*arg0); end
+ def self.alloc_inout(*arg0); end
+ def self.alloc_out(*arg0); end
+ def self.new_in(*arg0); end
+ def self.new_inout(*arg0); end
+ def self.new_out(*arg0); end
+ def slice(arg0, arg1); end
+end
+class FFI::StructByValue < FFI::Type
+ def initialize(arg0); end
+ def layout; end
+ def struct_class; end
+end
+class FFI::StructLayout::Field
+ def alignment; end
+ def get(arg0); end
+ def initialize(*arg0); end
+ def name; end
+ def offset; end
+ def put(arg0, arg1); end
+ def size; end
+ def type; end
+end
+class FFI::StructLayout::Function < FFI::StructLayout::Field
+ def get(arg0); end
+ def put(arg0, arg1); end
+end
+class FFI::StructLayout::Array < FFI::StructLayout::Field
+ def get(arg0); end
+ def put(arg0, arg1); end
+end
+class FFI::StructLayout < FFI::Type
+ def [](arg0); end
+ def __union!; end
+ def fields; end
+ def initialize(arg0, arg1, arg2); end
+ def members; end
+ def offset_of(field_name); end
+ def offsets; end
+ def to_a; end
+end
+class FFI::Struct
+ def [](arg0); end
+ def []=(arg0, arg1); end
+ def align; end
+ def alignment; end
+ def clear; end
+ def initialize(*arg0); end
+ def initialize_copy(arg0); end
+ def layout; end
+ def layout=(arg0); end
+ def members; end
+ def null?; end
+ def offset_of(name); end
+ def offsets; end
+ def order(*arg0); end
+ def pointer; end
+ def pointer=(arg0); end
+ def self.align(alignment = nil); end
+ def self.aligned(alignment = nil); end
+ def self.alignment; end
+ def self.alloc_in(*arg0); end
+ def self.alloc_inout(*arg0); end
+ def self.alloc_out(*arg0); end
+ def self.array_layout(builder, spec); end
+ def self.auto_ptr; end
+ def self.by_ref(flags = nil); end
+ def self.by_value; end
+ def self.callback(params, ret); end
+ def self.enclosing_module; end
+ def self.find_field_type(type, mod = nil); end
+ def self.find_type(type, mod = nil); end
+ def self.hash_layout(builder, spec); end
+ def self.in; end
+ def self.layout(*spec); end
+ def self.members; end
+ def self.new_in(*arg0); end
+ def self.new_inout(*arg0); end
+ def self.new_out(*arg0); end
+ def self.offset_of(name); end
+ def self.offsets; end
+ def self.out; end
+ def self.pack(packed = nil); end
+ def self.packed(packed = nil); end
+ def self.ptr(flags = nil); end
+ def self.size; end
+ def self.size=(size); end
+ def self.val; end
+ def size; end
+ def to_ptr; end
+ def values; end
+end
+class FFI::Struct::InlineArray
+ def [](arg0); end
+ def []=(arg0, arg1); end
+ def each; end
+ def initialize(arg0, arg1); end
+ def size; end
+ def to_a; end
+ def to_ptr; end
+end
+class FFI::StructLayout::CharArray < FFI::Struct::InlineArray
+ def to_s; end
+ def to_str; end
+end
+class FFI::DynamicLibrary
+ def find_function(arg0); end
+ def find_symbol(arg0); end
+ def find_variable(arg0); end
+ def initialize(arg0, arg1); end
+ def last_error; end
+ def name; end
+ def self.last_error; end
+ def self.open(arg0, arg1); end
+end
+class FFI::DynamicLibrary::Symbol < FFI::Pointer
+ def initialize_copy(arg0); end
+ def inspect; end
+end
+class FFI::VariadicInvoker
+ def attach(mod, mname); end
+ def call(*args, &block); end
+ def initialize(arg0, arg1, arg2, arg3); end
+ def invoke(arg0, arg1); end
+end
+class FFI::Type::Mapped < FFI::Type
+ def from_native(*arg0); end
+ def initialize(arg0); end
+ def native_type; end
+ def to_native(*arg0); end
+ def type; end
+end
+module FFI
+ def self.add_typedef(old, add); end
+ def self.errno; end
+ def self.errno=(error); end
+ def self.find_type(name, type_map = nil); end
+ def self.map_library_name(lib); end
+ def self.type_size(type); end
+ def self.typedef(old, add); end
+end
+class FFI::PlatformError < LoadError
+end
+module FFI::Platform
+ def self.bsd?; end
+ def self.is_os(os); end
+ def self.mac?; end
+ def self.solaris?; end
+ def self.unix?; end
+ def self.windows?; end
+end
+module FFI::DataConverter
+ def from_native(value, ctx); end
+ def native_type(type = nil); end
+ def to_native(value, ctx); end
+end
+class FFI::StrPtrConverter
+ def self.from_native(val, ctx); end
+ extend FFI::DataConverter
+end
+class FFI::NotFoundError < LoadError
+ def initialize(function, *libraries); end
+end
+module FFI::Library
+ def attach_function(name, func, args, returns = nil, options = nil); end
+ def attach_variable(mname, a1, a2 = nil); end
+ def bitmask(*args); end
+ def callback(*args); end
+ def enum(*args); end
+ def enum_type(name); end
+ def enum_value(symbol); end
+ def ffi_convention(convention = nil); end
+ def ffi_lib(*names); end
+ def ffi_lib_flags(*flags); end
+ def ffi_libraries; end
+ def find_type(t); end
+ def function_names(name, arg_types); end
+ def generic_enum(klass, *args); end
+ def self.extended(mod); end
+ def typedef(old, add, info = nil); end
+end
+class FFI::StructLayout::Enum < FFI::StructLayout::Field
+ def get(ptr); end
+ def put(ptr, value); end
+end
+class FFI::StructLayout::InnerStruct < FFI::StructLayout::Field
+ def get(ptr); end
+ def put(ptr, value); end
+end
+class FFI::StructLayout::Mapped < FFI::StructLayout::Field
+ def get(ptr); end
+ def initialize(name, offset, type, orig_field); end
+ def put(ptr, value); end
+end
+class FFI::StructLayoutBuilder
+ def add(name, type, offset = nil); end
+ def add_array(name, type, count, offset = nil); end
+ def add_field(name, type, offset = nil); end
+ def add_struct(name, type, offset = nil); end
+ def align(offset, align); end
+ def alignment; end
+ def alignment=(align); end
+ def build; end
+ def field_for_type(name, offset, type); end
+ def initialize; end
+ def packed=(packed); end
+ def size; end
+ def size=(size); end
+ def union=(is_union); end
+ def union?; end
+end
+class FFI::StructByReference
+ def from_native(value, ctx); end
+ def initialize(struct_class); end
+ def native_type; end
+ def struct_class; end
+ def to_native(value, ctx); end
+ include FFI::DataConverter
+end
+class FFI::Struct::ManagedStructConverter < FFI::StructByReference
+ def from_native(ptr, ctx); end
+ def initialize(struct_class); end
+end
+class FFI::Union < FFI::Struct
+ def self.builder; end
+end
+class FFI::ManagedStruct < FFI::Struct
+ def initialize(pointer = nil); end
+end
+module FFI::IO
+ def self.for_fd(fd, mode = nil); end
+ def self.native_read(io, buf, len); end
+end
+class FFI::AutoPointer < FFI::Pointer
+ def autorelease=(autorelease); end
+ def autorelease?; end
+ def free; end
+ def initialize(ptr, proc = nil, &block); end
+ def self.from_native(val, ctx); end
+ def self.native_type; end
+ extend FFI::DataConverter
+end
+class FFI::AutoPointer::Releaser
+ def autorelease; end
+ def autorelease=(arg0); end
+ def call(*args); end
+ def free; end
+ def initialize(ptr, proc); end
+end
+class FFI::AutoPointer::DefaultReleaser < FFI::AutoPointer::Releaser
+ def release(ptr); end
+end
+class FFI::AutoPointer::CallableReleaser < FFI::AutoPointer::Releaser
+ def release(ptr); end
+end
+class FFI::Enums
+ def <<(enum); end
+ def __map_symbol(symbol); end
+ def find(query); end
+ def initialize; end
+end
+class FFI::Enum
+ def [](query); end
+ def find(query); end
+ def from_native(val, ctx); end
+ def initialize(*args); end
+ def native_type; end
+ def symbol_map; end
+ def symbols; end
+ def tag; end
+ def to_h; end
+ def to_hash; end
+ def to_native(val, ctx); end
+ include FFI::DataConverter
+end
+class FFI::Bitmask < FFI::Enum
+ def [](*query); end
+ def from_native(val, ctx); end
+ def initialize(*args); end
+ def to_native(query, ctx); end
+end
diff --git a/sorbet/rbi/gems/hashery.rbi b/sorbet/rbi/gems/hashery.rbi
new file mode 100644
index 0000000..76e92b7
--- /dev/null
+++ b/sorbet/rbi/gems/hashery.rbi
@@ -0,0 +1,301 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/hashery/all/hashery.rbi
+#
+# hashery-2.1.2
+
+class Hash
+ def rekey!(key_map = nil, &block); end
+ def rekey(key_map = nil, &block); end
+ def retrieve(key); end
+ def self.[](*arg0); end
+end
+module Hashery
+end
+class Hashery::CRUDHash < Hash
+ def <<(assoc); end
+ def [](key); end
+ def []=(key, value); end
+ def cast(hash); end
+ def cast_key(key); end
+ def default_proc(&block); end
+ def delete(key); end
+ def each; end
+ def each_pair; end
+ def fetch(key, *default); end
+ def has_key?(key); end
+ def include?(key); end
+ def key?(key); end
+ def key_proc(&block); end
+ def key_proc=(proc); end
+ def member?(key); end
+ def merge!(other); end
+ def merge(other); end
+ def read(key); end
+ def replace(other); end
+ def retrieve(key); end
+ def self.[](*hash); end
+ def self.auto(*args, &block); end
+ def store(key, value); end
+ def to_h; end
+ def to_hash; end
+ def update(other); end
+ def values_at(*keys); end
+end
+class Hashery::CastingHash < Hashery::CRUDHash
+ def cast(hash); end
+ def cast_pair(key, value); end
+ def cast_proc(&proc); end
+ def cast_proc=(proc); end
+ def initialize(default = nil, &cast_proc); end
+ def recast!; end
+ def replace(other); end
+ def self.[](hash); end
+ def store(key, value); end
+ def to_h; end
+ def to_hash; end
+end
+class Hashery::Dictionary
+ def <<(kv); end
+ def ==(hsh2); end
+ def [](key); end
+ def []=(k, i = nil, v = nil); end
+ def clear; end
+ def delete(key); end
+ def delete_if; end
+ def dup; end
+ def each; end
+ def each_key; end
+ def each_pair; end
+ def each_value; end
+ def empty?; end
+ def fetch(key, *a, &b); end
+ def first(x = nil); end
+ def has_key?(key); end
+ def hash_table; end
+ def initialize(*args, &blk); end
+ def insert(index, key, value); end
+ def inspect; end
+ def invert; end
+ def key?(key); end
+ def keys; end
+ def last(x = nil); end
+ def length; end
+ def merge!(hsh2); end
+ def merge(hsh2); end
+ def order; end
+ def order_by(&block); end
+ def order_by_key; end
+ def order_by_value; end
+ def pop; end
+ def push(k, v); end
+ def reject!(&block); end
+ def reject(&block); end
+ def reorder; end
+ def replace(hsh2); end
+ def reverse!; end
+ def reverse; end
+ def select; end
+ def self.[](*args); end
+ def self.alpha(*args, &block); end
+ def self.alphabetic(*args, &block); end
+ def self.auto(*args); end
+ def self.new_by(*args, &blk); end
+ def shift; end
+ def size; end
+ def store(key, value); end
+ def to_a; end
+ def to_h; end
+ def to_hash; end
+ def to_s; end
+ def unshift(k, v); end
+ def update(hsh2); end
+ def values; end
+ include Enumerable
+end
+class Hashery::FuzzyHash
+ def ==(o); end
+ def [](key); end
+ def []=(key, value); end
+ def clear; end
+ def count; end
+ def delete_value(value); end
+ def each; end
+ def empty?; end
+ def fuzz_test; end
+ def fuzz_test=(arg0); end
+ def fuzzies; end
+ def fuzzies_reverse; end
+ def fuzzy_hash; end
+ def fuzzy_lookup(key); end
+ def hash; end
+ def hash_reverse; end
+ def initialize(init_hash = nil); end
+ def keys; end
+ def match_with_result(key); end
+ def replace(src, dest); end
+ def reset_fuzz_test!; end
+ def size; end
+ def values; end
+end
+class Hashery::IniHash
+ def [](key); end
+ def []=(key, value); end
+ def comment; end
+ def comment=(arg0); end
+ def inihash; end
+ def inihash=(arg0); end
+ def initialize(path, load = nil); end
+ def inspect; end
+ def method_missing(s, *a, &b); end
+ def restore; end
+ def save; end
+ def self.load(path, load = nil); end
+ def self.read_comment_from_file(path); end
+ def self.read_from_file(path); end
+ def self.text(inihash = nil); end
+ def self.to_s(inihash = nil); end
+ def self.write_to_file(path, inihash = nil, comment = nil); end
+ def to_h; end
+ def to_s; end
+ def update; end
+end
+class Hashery::LinkedList
+ def <<(v); end
+ def [](key); end
+ def []=(k, v); end
+ def delete(key); end
+ def each; end
+ def empty?; end
+ def first; end
+ def initialize; end
+ def last; end
+ def length; end
+ def node_delete(n); end
+ def node_join(a, b); end
+ def node_purge(n); end
+ def pop; end
+ def push(v); end
+ def queue; end
+ def shift; end
+ def size; end
+ def to_a; end
+ def unshift(v); end
+ include Enumerable
+end
+class Hashery::LinkedList::Node
+ def initialize(key = nil, value = nil, prev_node = nil, next_node = nil); end
+ def key; end
+ def key=(arg0); end
+ def next_node; end
+ def next_node=(arg0); end
+ def prev_node; end
+ def prev_node=(arg0); end
+ def value; end
+ def value=(arg0); end
+end
+class Hashery::LRUHash
+ def [](key); end
+ def []=(key, value); end
+ def assoc(key); end
+ def clear; end
+ def default; end
+ def default=(arg0); end
+ def default_proc; end
+ def default_proc=(arg0); end
+ def delete(key); end
+ def delete_if; end
+ def delete_oldest; end
+ def each; end
+ def each_key; end
+ def each_node; end
+ def each_pair; end
+ def each_value; end
+ def empty?; end
+ def fetch(key, &b); end
+ def front(node); end
+ def has_key?(key); end
+ def has_value?(value); end
+ def include?(key); end
+ def initialize(max_size, default_value = nil, &block); end
+ def inspect; end
+ def key(value); end
+ def key?(key); end
+ def keys; end
+ def max_size; end
+ def max_size=(limit); end
+ def member?(key); end
+ def normalize_max(n); end
+ def rassoc(value); end
+ def release_proc; end
+ def release_proc=(arg0); end
+ def remove_node(node); end
+ def size; end
+ def store(key, value); end
+ def to_s; end
+ def value?(value); end
+ def values; end
+ def values_at(*key_list); end
+ include Enumerable
+end
+class Hashery::LRUHash::Node < Struct
+ def insert_after(node); end
+ def key; end
+ def key=(_); end
+ def pred; end
+ def pred=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def succ; end
+ def succ=(_); end
+ def unlink; end
+ def value; end
+ def value=(_); end
+end
+class Hashery::KeyHash < Hashery::CRUDHash
+ def initialize(*default, &block); end
+end
+class Hashery::OpenHash < Hashery::CRUDHash
+ def close!(*methods); end
+ def initialize(default = nil, safe = nil, &block); end
+ def method_missing(s, *a, &b); end
+ def object_class; end
+ def omit!(*methods); end
+ def open!(*methods); end
+ def open?(method); end
+ def safe; end
+ def safe=(arg0); end
+ def store(key, value); end
+end
+class Hashery::OpenCascade < Hashery::OpenHash
+ def cast_value(entry); end
+ def initialize(*default); end
+ def method_missing(sym, *args, &blk); end
+ def respond_to?(sym, include_private = nil); end
+ def retrieve!(key); end
+ def retrieve(key); end
+end
+class Hashery::PropertyHash < Hashery::CRUDHash
+ def assert_key!(key); end
+ def initialize(properties = nil, &default_proc); end
+ def property(key, opts = nil); end
+ def self.properties; end
+ def self.property(key, opts = nil); end
+ def store!(key, value); end
+ def store(key, value); end
+end
+class Hashery::QueryHash < Hashery::CRUDHash
+ def initialize(*default, &default_proc); end
+ def method_missing(s, *a, &b); end
+ def respond_to?(name); end
+end
+class Hashery::StaticHash < Hashery::CRUDHash
+ def store(key, value); end
+end
diff --git a/sorbet/rbi/gems/highline.rbi b/sorbet/rbi/gems/highline.rbi
new file mode 100644
index 0000000..f7caec4
--- /dev/null
+++ b/sorbet/rbi/gems/highline.rbi
@@ -0,0 +1,577 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/highline/all/highline.rbi
+#
+# highline-2.0.3
+
+class HighLine
+ def actual_length(text); end
+ def agree(yes_or_no_question, character = nil); end
+ def ask(template_or_question, answer_type = nil, &details); end
+ def choose(*items, &details); end
+ def color(string, *colors); end
+ def color_code(*colors); end
+ def confirm(question); end
+ def default_use_color; end
+ def erase_current_line; end
+ def get_line(question); end
+ def get_line_raw_no_echo_mode(question); end
+ def get_response_character_mode(question); end
+ def get_response_getc_mode(question); end
+ def get_response_line_mode(question); end
+ def ignore_arrow_key; end
+ def indent(increase = nil, statement = nil, multiline = nil); end
+ def indent_level; end
+ def indent_level=(arg0); end
+ def indent_size; end
+ def indent_size=(arg0); end
+ def indentation; end
+ def initialize(input = nil, output = nil, wrap_at = nil, page_at = nil, indent_size = nil, indent_level = nil); end
+ def input; end
+ def key; end
+ def key=(arg0); end
+ def last_answer(answers); end
+ def line_overflow_for_question?(line, question); end
+ def list(items, mode = nil, option = nil); end
+ def multi_indent; end
+ def multi_indent=(arg0); end
+ def new_scope; end
+ def newline; end
+ def output; end
+ def output_cols; end
+ def output_erase_char; end
+ def output_rows; end
+ def page_at; end
+ def page_at=(setting); end
+ def puts(*args); end
+ def render_statement(statement); end
+ def reset_use_color; end
+ def say(statement); end
+ def say_last_char_or_echo_char(line, question); end
+ def say_new_line_or_overwrite(question); end
+ def self.String(s); end
+ def self.Style(*args); end
+ def self.agree(*args, &block); end
+ def self.ask(*args, &block); end
+ def self.choose(*args, &block); end
+ def self.color(*args, &block); end
+ def self.color_code(*args, &block); end
+ def self.color_scheme; end
+ def self.color_scheme=(arg0); end
+ def self.colorize_strings; end
+ def self.default_instance; end
+ def self.default_instance=(arg0); end
+ def self.find_or_create_style(arg); end
+ def self.find_or_create_style_list(*args); end
+ def self.reset; end
+ def self.reset_color_scheme; end
+ def self.reset_use_color(*args, &block); end
+ def self.say(*args, &block); end
+ def self.supports_rgb_color?; end
+ def self.track_eof=(*args, &block); end
+ def self.track_eof?(*args, &block); end
+ def self.uncolor(*args, &block); end
+ def self.use_color=(*args, &block); end
+ def self.use_color?(*args, &block); end
+ def self.using_color_scheme?; end
+ def shell_style_lambda(menu); end
+ def terminal; end
+ def track_eof; end
+ def track_eof=(arg0); end
+ def track_eof?; end
+ def uncolor(string); end
+ def unique_answers(list); end
+ def use_color; end
+ def use_color=(arg0); end
+ def use_color?; end
+ def wrap_at; end
+ def wrap_at=(setting); end
+ extend HighLine::BuiltinStyles::ClassMethods
+ extend SingleForwardable
+ include HighLine::BuiltinStyles
+ include HighLine::CustomErrors
+end
+class HighLine::Terminal
+ def character_mode; end
+ def get_character; end
+ def get_line(question, highline); end
+ def get_line_default(highline); end
+ def get_line_with_readline(question, highline); end
+ def initialize(input, output); end
+ def initialize_system_extensions; end
+ def input; end
+ def jruby?; end
+ def output; end
+ def raw_no_echo_mode; end
+ def raw_no_echo_mode_exec; end
+ def readline_read(question); end
+ def restore_mode; end
+ def restore_stty; end
+ def rubinius?; end
+ def run_preserving_stty; end
+ def save_stty; end
+ def self.get_terminal(input, output); end
+ def terminal_size; end
+ def windows?; end
+end
+module HighLine::CustomErrors
+end
+class HighLine::CustomErrors::ExplainableError < StandardError
+ def explanation_key; end
+end
+class HighLine::CustomErrors::QuestionError < HighLine::CustomErrors::ExplainableError
+ def explanation_key; end
+end
+class HighLine::CustomErrors::NotValidQuestionError < HighLine::CustomErrors::ExplainableError
+ def explanation_key; end
+end
+class HighLine::CustomErrors::NotInRangeQuestionError < HighLine::CustomErrors::ExplainableError
+ def explanation_key; end
+end
+class HighLine::CustomErrors::NoConfirmationQuestionError < HighLine::CustomErrors::ExplainableError
+ def explanation_key; end
+end
+class HighLine::CustomErrors::NoAutoCompleteMatch < HighLine::CustomErrors::ExplainableError
+ def explanation_key; end
+end
+class HighLine::Question
+ def above; end
+ def above=(arg0); end
+ def answer; end
+ def answer=(arg0); end
+ def answer_or_default(answer_string); end
+ def answer_type; end
+ def answer_type=(arg0); end
+ def append_default; end
+ def ask_on_error_msg; end
+ def below; end
+ def below=(arg0); end
+ def build_responses(message_source = nil); end
+ def build_responses_new_hash(message_source); end
+ def case; end
+ def case=(arg0); end
+ def change_case(answer_string); end
+ def character; end
+ def character=(arg0); end
+ def check_range; end
+ def choice_error_str(message_source); end
+ def choices_complete(answer_string); end
+ def completion; end
+ def completion=(arg0); end
+ def confirm; end
+ def confirm=(arg0); end
+ def confirm_question(highline); end
+ def convert; end
+ def default; end
+ def default=(arg0); end
+ def default_responses_hash; end
+ def directory; end
+ def directory=(arg0); end
+ def echo; end
+ def echo=(arg0); end
+ def expected_range; end
+ def final_response(error); end
+ def final_responses; end
+ def first_answer; end
+ def first_answer=(arg0); end
+ def first_answer?; end
+ def format_answer(answer_string); end
+ def gather; end
+ def gather=(arg0); end
+ def get_echo_for_response(response); end
+ def get_response(highline); end
+ def get_response_or_default(highline); end
+ def glob; end
+ def glob=(arg0); end
+ def in; end
+ def in=(arg0); end
+ def in_range?; end
+ def initialize(template, answer_type); end
+ def limit; end
+ def limit=(arg0); end
+ def overwrite; end
+ def overwrite=(arg0); end
+ def readline; end
+ def readline=(arg0); end
+ def remove_whitespace(answer_string); end
+ def responses; end
+ def selection; end
+ def self.build(template_or_question, answer_type = nil, &details); end
+ def show_question(highline); end
+ def template; end
+ def template=(arg0); end
+ def to_s; end
+ def valid_answer?; end
+ def validate; end
+ def validate=(arg0); end
+ def verify_match; end
+ def verify_match=(arg0); end
+ def whitespace; end
+ def whitespace=(arg0); end
+ include HighLine::CustomErrors
+end
+class HighLine::Question::AnswerConverter
+ def answer(*args, &block); end
+ def answer=(*args, &block); end
+ def answer_type(*args, &block); end
+ def check_range(*args, &block); end
+ def choices_complete(*args, &block); end
+ def convert; end
+ def convert_by_answer_type; end
+ def directory(*args, &block); end
+ def initialize(question); end
+ def to_array; end
+ def to_file; end
+ def to_float; end
+ def to_integer; end
+ def to_pathname; end
+ def to_proc; end
+ def to_regexp; end
+ def to_string; end
+ def to_symbol; end
+ extend Forwardable
+end
+class HighLine::QuestionAsker
+ def answer_matches_regex(answer); end
+ def ask_once; end
+ def explain_error(explanation_key); end
+ def gather_answers; end
+ def gather_answers_based_on_type; end
+ def gather_hash; end
+ def gather_integer; end
+ def gather_regexp; end
+ def gather_with_array; end
+ def initialize(question, highline); end
+ def question; end
+ include HighLine::CustomErrors
+end
+class HighLine::Menu < HighLine::Question
+ def add_item(item); end
+ def all_items; end
+ def build_item(*args); end
+ def choice(name, help = nil, text = nil, &action); end
+ def choices(*names, &action); end
+ def decorate_index(index); end
+ def decorate_item(text, ix); end
+ def find_item_from_selection(items, selection); end
+ def flow; end
+ def flow=(arg0); end
+ def gather_selected(highline_context, selections, details = nil); end
+ def get_item_by_letter(items, selection); end
+ def get_item_by_number(items, selection); end
+ def header; end
+ def header=(arg0); end
+ def help(topic, help); end
+ def hidden(name, help = nil, &action); end
+ def index; end
+ def index=(style); end
+ def index_color; end
+ def index_color=(arg0); end
+ def index_suffix; end
+ def index_suffix=(arg0); end
+ def init_help; end
+ def initialize; end
+ def layout; end
+ def layout=(new_layout); end
+ def list_option; end
+ def list_option=(arg0); end
+ def map_items_by_index; end
+ def map_items_by_name; end
+ def mark_for_decoration(text, ix); end
+ def nil_on_handled; end
+ def nil_on_handled=(arg0); end
+ def options; end
+ def parse_list; end
+ def prompt; end
+ def prompt=(arg0); end
+ def select(highline_context, selection, details = nil); end
+ def select_by; end
+ def select_by=(arg0); end
+ def self.index_color; end
+ def self.index_color=(arg0); end
+ def shell; end
+ def shell=(arg0); end
+ def show_default_if_any; end
+ def to_ary; end
+ def to_s; end
+ def update_responses; end
+ def value_for_array_selections(items, selections, details); end
+ def value_for_hash_selections(items, selections, details); end
+ def value_for_selected_item(item, details); end
+end
+class HighLine::Menu::Item
+ def action; end
+ def help; end
+ def initialize(name, attributes); end
+ def item_help; end
+ def name; end
+ def text; end
+end
+class HighLine::ColorScheme
+ def [](color_tag); end
+ def []=(color_tag, constants); end
+ def definition(color_tag); end
+ def include?(color_tag); end
+ def initialize(h = nil); end
+ def keys; end
+ def load_from_hash(h); end
+ def to_constant(v); end
+ def to_hash; end
+ def to_symbol(t); end
+end
+class HighLine::SampleColorScheme < HighLine::ColorScheme
+ def initialize(_h = nil); end
+end
+class HighLine::Style
+ def blue; end
+ def bright; end
+ def builtin; end
+ def builtin=(arg0); end
+ def code; end
+ def color(string); end
+ def create_bright_variant(variant_name); end
+ def dup; end
+ def find_style(name); end
+ def green; end
+ def initialize(defn = nil); end
+ def light; end
+ def list; end
+ def name; end
+ def on; end
+ def red; end
+ def rgb; end
+ def rgb=(arg0); end
+ def self.ansi_rgb_to_hex(ansi_number); end
+ def self.clear_index; end
+ def self.code_index; end
+ def self.index(style); end
+ def self.list; end
+ def self.rgb(*colors); end
+ def self.rgb_hex(*colors); end
+ def self.rgb_number(*parts); end
+ def self.rgb_parts(hex); end
+ def self.uncolor(string); end
+ def to_hash; end
+ def variant(new_name, options = nil); end
+end
+module HighLine::Wrapper
+ def self.actual_length(string_with_escapes); end
+ def self.wrap(text, wrap_at); end
+end
+class HighLine::Paginator
+ def continue_paging?; end
+ def highline; end
+ def initialize(highline); end
+ def page_print(text); end
+end
+class HighLine::TemplateRenderer
+ def answer(*args, &block); end
+ def answer_type(*args, &block); end
+ def color(*args, &block); end
+ def header(*args, &block); end
+ def highline; end
+ def initialize(template, source, highline); end
+ def key(*args, &block); end
+ def list(*args, &block); end
+ def menu; end
+ def method_missing(method, *args); end
+ def prompt(*args, &block); end
+ def render; end
+ def self.const_missing(name); end
+ def source; end
+ def template; end
+ extend Forwardable
+end
+class HighLine::Statement
+ def format_statement; end
+ def highline; end
+ def initialize(source, highline); end
+ def render_template; end
+ def self.const_missing(constant); end
+ def source; end
+ def statement; end
+ def stringfy(template_string); end
+ def template; end
+ def template_string; end
+ def to_s; end
+end
+class HighLine::List
+ def build; end
+ def col_down; end
+ def col_down_mode; end
+ def cols; end
+ def cols=(cols); end
+ def initialize(items, options = nil); end
+ def items; end
+ def items_sliced_by_cols; end
+ def items_sliced_by_rows; end
+ def list; end
+ def row_count; end
+ def row_join_str_size; end
+ def row_join_string; end
+ def row_join_string=(arg0); end
+ def slice_by_cols; end
+ def slice_by_rows; end
+ def stringfy(row); end
+ def to_a; end
+ def to_s; end
+ def transpose; end
+ def transpose_mode; end
+end
+class HighLine::ListRenderer
+ def actual_length(text); end
+ def actual_lengths_for(line); end
+ def col_count; end
+ def col_count_calculate; end
+ def get_col_widths(lines); end
+ def get_row_widths(lines); end
+ def get_segment_widths(lines); end
+ def highline; end
+ def initialize(items, mode = nil, option = nil, highline); end
+ def inside_line_size_limit?(widths); end
+ def items; end
+ def items_max_length; end
+ def line_size_limit; end
+ def list_columns_across_mode; end
+ def list_columns_down_mode; end
+ def list_default_mode; end
+ def list_inline_mode; end
+ def list_uneven_columns_down_mode; end
+ def list_uneven_columns_mode(list = nil); end
+ def max_length(items); end
+ def mode; end
+ def option; end
+ def pad_char; end
+ def pad_uneven_rows(list, widths); end
+ def render; end
+ def render_list_items(items); end
+ def right_pad_field(field, width); end
+ def right_pad_row(row, widths); end
+ def right_padded_items; end
+ def row_count; end
+ def row_join_str_size; end
+ def row_join_string; end
+ def row_join_string=(arg0); end
+ def row_to_s(row); end
+ def stringfy_list(list); end
+ def transpose(lines); end
+end
+module HighLine::BuiltinStyles
+ def self.included(base); end
+end
+module HighLine::BuiltinStyles::ClassMethods
+ def const_missing(name); end
+end
+class HighLine::Terminal::IOConsole < HighLine::Terminal
+ def get_character; end
+ def raw_no_echo_mode; end
+ def restore_mode; end
+ def terminal_size; end
+end
+module HighLine::StringExtensions
+ def self.define_builtin_style_methods(base); end
+ def self.define_style_support_methods(base); end
+ def self.included(base); end
+end
+class HighLine::String < String
+ def black; end
+ def blink; end
+ def blue; end
+ def bold; end
+ def bright_black; end
+ def bright_blue; end
+ def bright_cyan; end
+ def bright_gray; end
+ def bright_green; end
+ def bright_grey; end
+ def bright_magenta; end
+ def bright_none; end
+ def bright_red; end
+ def bright_white; end
+ def bright_yellow; end
+ def clear; end
+ def color(*args); end
+ def concealed; end
+ def cyan; end
+ def dark; end
+ def foreground(*args); end
+ def gray; end
+ def green; end
+ def grey; end
+ def light_black; end
+ def light_blue; end
+ def light_cyan; end
+ def light_gray; end
+ def light_green; end
+ def light_grey; end
+ def light_magenta; end
+ def light_none; end
+ def light_red; end
+ def light_white; end
+ def light_yellow; end
+ def magenta; end
+ def method_missing(method, *_args); end
+ def none; end
+ def on(arg); end
+ def on_black; end
+ def on_blue; end
+ def on_bright_black; end
+ def on_bright_blue; end
+ def on_bright_cyan; end
+ def on_bright_gray; end
+ def on_bright_green; end
+ def on_bright_grey; end
+ def on_bright_magenta; end
+ def on_bright_none; end
+ def on_bright_red; end
+ def on_bright_white; end
+ def on_bright_yellow; end
+ def on_cyan; end
+ def on_gray; end
+ def on_green; end
+ def on_grey; end
+ def on_light_black; end
+ def on_light_blue; end
+ def on_light_cyan; end
+ def on_light_gray; end
+ def on_light_green; end
+ def on_light_grey; end
+ def on_light_magenta; end
+ def on_light_none; end
+ def on_light_red; end
+ def on_light_white; end
+ def on_light_yellow; end
+ def on_magenta; end
+ def on_none; end
+ def on_red; end
+ def on_rgb(*colors); end
+ def on_white; end
+ def on_yellow; end
+ def red; end
+ def reset; end
+ def respond_to_missing?(method_name, include_private = nil); end
+ def reverse; end
+ def rgb(*colors); end
+ def setup_color_code(*colors); end
+ def uncolor; end
+ def underline; end
+ def underscore; end
+ def white; end
+ def yellow; end
+ include HighLine::StringExtensions
+end
+module Kernel
+ def agree(*args, &block); end
+ def ask(*args, &block); end
+ def choose(*args, &block); end
+ def say(*args, &block); end
+ extend Forwardable
+end
+class Object < BasicObject
+ def or_ask(*args, &details); end
+end
diff --git a/sorbet/rbi/gems/method_source.rbi b/sorbet/rbi/gems/method_source.rbi
new file mode 100644
index 0000000..92cdecd
--- /dev/null
+++ b/sorbet/rbi/gems/method_source.rbi
@@ -0,0 +1,64 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/method_source/all/method_source.rbi
+#
+# method_source-1.0.0
+
+module MethodSource
+ def self.comment_helper(source_location, name = nil); end
+ def self.extract_code(source_location); end
+ def self.lines_for(file_name, name = nil); end
+ def self.source_helper(source_location, name = nil); end
+ def self.valid_expression?(str); end
+ extend MethodSource::CodeHelpers
+end
+module MethodSource::ReeSourceLocation
+ def source_location; end
+end
+module MethodSource::SourceLocation
+end
+module MethodSource::SourceLocation::MethodExtensions
+ def source_location; end
+ def trace_func(event, file, line, id, binding, classname); end
+end
+module MethodSource::SourceLocation::ProcExtensions
+ def source_location; end
+end
+module MethodSource::SourceLocation::UnboundMethodExtensions
+ def source_location; end
+end
+module MethodSource::CodeHelpers
+ def comment_describing(file, line_number); end
+ def complete_expression?(str); end
+ def expression_at(file, line_number, options = nil); end
+ def extract_first_expression(lines, consume = nil, &block); end
+ def extract_last_comment(lines); end
+end
+module MethodSource::CodeHelpers::IncompleteExpression
+ def self.===(ex); end
+ def self.rbx?; end
+end
+class MethodSource::SourceNotFoundError < StandardError
+end
+module MethodSource::MethodExtensions
+ def comment; end
+ def self.included(klass); end
+ def source; end
+end
+class Method
+ include MethodSource::MethodExtensions
+ include MethodSource::SourceLocation::MethodExtensions
+end
+class UnboundMethod
+ include MethodSource::MethodExtensions
+ include MethodSource::SourceLocation::UnboundMethodExtensions
+end
+class Proc
+ include MethodSource::MethodExtensions
+ include MethodSource::SourceLocation::ProcExtensions
+end
diff --git a/sorbet/rbi/gems/morecane.rbi b/sorbet/rbi/gems/morecane.rbi
new file mode 100644
index 0000000..00cc99e
--- /dev/null
+++ b/sorbet/rbi/gems/morecane.rbi
@@ -0,0 +1,55 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/morecane/all/morecane.rbi
+#
+# morecane-0.2.0
+
+module Morecane
+end
+class Anonymous_Struct_8 < Struct
+ def opts; end
+ def opts=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class Morecane::EncodingCheck < Anonymous_Struct_8
+ def file_names; end
+ def find_violations(file_name); end
+ def self.options; end
+ def violations; end
+end
+class Anonymous_Struct_9 < Struct
+ def opts; end
+ def opts=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class Morecane::MustMatchCheck < Anonymous_Struct_9
+ def file_names; end
+ def find_violations(file_name); end
+ def self.options; end
+ def violations; end
+end
+class Anonymous_Struct_10 < Struct
+ def opts; end
+ def opts=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class Morecane::MustNotMatchCheck < Anonymous_Struct_10
+ def file_names; end
+ def find_violations(file_name); end
+ def self.options; end
+ def violations; end
+end
diff --git a/sorbet/rbi/gems/parallel.rbi b/sorbet/rbi/gems/parallel.rbi
new file mode 100644
index 0000000..47ed4ba
--- /dev/null
+++ b/sorbet/rbi/gems/parallel.rbi
@@ -0,0 +1,81 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/parallel/all/parallel.rbi
+#
+# parallel-1.13.0
+
+module Parallel
+ def self.add_progress_bar!(job_factory, options); end
+ def self.all?(*args, &block); end
+ def self.any?(*args, &block); end
+ def self.call_with_index(item, index, options, &block); end
+ def self.create_workers(job_factory, options, &block); end
+ def self.each(array, options = nil, &block); end
+ def self.each_with_index(array, options = nil, &block); end
+ def self.extract_count_from_options(options); end
+ def self.handle_exception(exception, results); end
+ def self.in_processes(options = nil, &block); end
+ def self.in_threads(options = nil); end
+ def self.map(source, options = nil, &block); end
+ def self.map_with_index(array, options = nil, &block); end
+ def self.process_incoming_jobs(read, write, job_factory, options, &block); end
+ def self.replace_worker(job_factory, workers, i, options, blk); end
+ def self.with_instrumentation(item, index, options); end
+ def self.work_direct(job_factory, options, &block); end
+ def self.work_in_processes(job_factory, options, &blk); end
+ def self.work_in_threads(job_factory, options, &block); end
+ def self.worker(job_factory, options, &block); end
+ def self.worker_number; end
+ def self.worker_number=(worker_num); end
+ extend Parallel::ProcessorCount
+end
+module Parallel::ProcessorCount
+ def physical_processor_count; end
+ def processor_count; end
+end
+class Parallel::DeadWorker < StandardError
+end
+class Parallel::Break < StandardError
+end
+class Parallel::Kill < StandardError
+end
+class Parallel::UndumpableException < StandardError
+ def backtrace; end
+ def initialize(original); end
+end
+class Parallel::ExceptionWrapper
+ def exception; end
+ def initialize(exception); end
+end
+class Parallel::Worker
+ def close_pipes; end
+ def initialize(read, write, pid); end
+ def pid; end
+ def read; end
+ def stop; end
+ def thread; end
+ def thread=(arg0); end
+ def wait; end
+ def work(data); end
+ def write; end
+end
+class Parallel::JobFactory
+ def initialize(source, mutex); end
+ def next; end
+ def pack(item, index); end
+ def producer?; end
+ def queue_wrapper(array); end
+ def size; end
+ def unpack(data); end
+end
+class Parallel::UserInterruptHandler
+ def self.kill(thing); end
+ def self.kill_on_ctrl_c(pids, options); end
+ def self.restore_interrupt(old, signal); end
+ def self.trap_interrupt(signal); end
+end
diff --git a/sorbet/rbi/gems/parlour.rbi b/sorbet/rbi/gems/parlour.rbi
new file mode 100644
index 0000000..99788a1
--- /dev/null
+++ b/sorbet/rbi/gems/parlour.rbi
@@ -0,0 +1,840 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: ignore
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/parlour/all/parlour.rbi
+#
+# parlour-6.0.1
+
+module Parlour
+end
+module Parlour::Debugging
+ def self.debug_mode=(*args, &blk); end
+ def self.debug_mode?(*args, &blk); end
+ def self.debug_puts(*args, &blk); end
+ def self.name_for_debug_caller(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+module Parlour::Debugging::Tree
+ def self.begin(*args, &blk); end
+ def self.end(*args, &blk); end
+ def self.here(*args, &blk); end
+ def self.line_prefix; end
+ def self.text_prefix; end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+module Kernel
+end
+class Parlour::Plugin
+ def generate(*args, &blk); end
+ def initialize(*args, &blk); end
+ def self.inherited(*args, &blk); end
+ def self.registered_plugins(*args, &blk); end
+ def self.run_plugins(*args, &blk); end
+ def strictness(*args, &blk); end
+ def strictness=(arg0); end
+ extend T::Helpers
+ extend T::InterfaceWrapper::Helpers
+ extend T::Private::Abstract::Hooks
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+module Parlour::Types
+end
+class Parlour::Types::Type
+ def describe(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def hash; end
+ def initialize(*args, &blk); end
+ def self.to_type(*args, &blk); end
+ def to_type(*args, &blk); end
+ extend T::Helpers
+ extend T::InterfaceWrapper::Helpers
+ extend T::Private::Abstract::Hooks
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::Types::Raw < Parlour::Types::Type
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def str(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Nilable < Parlour::Types::Type
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def type(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Union < Parlour::Types::Type
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def types(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Intersection < Parlour::Types::Type
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def types(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Tuple < Parlour::Types::Type
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def types(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Generic < Parlour::Types::Type
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def type(*args, &blk); end
+ def type_params(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::SingleElementCollection < Parlour::Types::Type
+ def collection_name(*args, &blk); end
+ def describe(*args, &blk); end
+ def element(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ extend T::InterfaceWrapper::Helpers
+ extend T::Private::Abstract::Hooks
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Array < Parlour::Types::SingleElementCollection
+ def ==(*args, &blk); end
+ def collection_name(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Set < Parlour::Types::SingleElementCollection
+ def ==(*args, &blk); end
+ def collection_name(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Range < Parlour::Types::SingleElementCollection
+ def ==(*args, &blk); end
+ def collection_name(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Enumerable < Parlour::Types::SingleElementCollection
+ def ==(*args, &blk); end
+ def collection_name(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Enumerator < Parlour::Types::SingleElementCollection
+ def ==(*args, &blk); end
+ def collection_name(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Hash < Parlour::Types::Type
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def key(*args, &blk); end
+ def value(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Record < Parlour::Types::Type
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def keys_to_types(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Class < Parlour::Types::Type
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def type(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Boolean < Parlour::Types::Type
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Self < Parlour::Types::Type
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Untyped < Parlour::Types::Type
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Proc < Parlour::Types::Type
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def parameters(*args, &blk); end
+ def return_type(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Proc::Parameter
+ def ==(*args, &blk); end
+ def default(*args, &blk); end
+ def initialize(*args, &blk); end
+ def name(*args, &blk); end
+ def type(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::Options
+ def break_params(*args, &blk); end
+ def indented(*args, &blk); end
+ def initialize(*args, &blk); end
+ def sort_namespaces(*args, &blk); end
+ def tab_size(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::TypedObject
+ def add_comment(*args, &blk); end
+ def add_comments(*args, &blk); end
+ def comments(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_comments(*args, &blk); end
+ def generated_by(*args, &blk); end
+ def initialize(*args, &blk); end
+ def name(*args, &blk); end
+ extend T::Helpers
+ extend T::InterfaceWrapper::Helpers
+ extend T::Private::Abstract::Hooks
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::Generator
+ def current_plugin(*args, &blk); end
+ def current_plugin=(arg0); end
+ def initialize(*args, &blk); end
+ def options(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbiGenerator < Parlour::Generator
+ def initialize(**hash); end
+ def rbi(*args, &blk); end
+ def root(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::Parameter
+ def ==(*args, &blk); end
+ def default(*args, &blk); end
+ def generalize_from_rbi!(*args, &blk); end
+ def initialize(*args, &blk); end
+ def kind(*args, &blk); end
+ def name(*args, &blk); end
+ def name_without_kind(*args, &blk); end
+ def to_def_param(*args, &blk); end
+ def to_sig_param(*args, &blk); end
+ def type(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbiGenerator::RbiObject < Parlour::TypedObject
+ def describe(*args, &blk); end
+ def generalize_from_rbi!(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def generator(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ extend T::InterfaceWrapper::Helpers
+ extend T::Private::Abstract::Hooks
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::TypeAlias < Parlour::RbiGenerator::RbiObject
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generalize_from_rbi!(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ def type(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::Method < Parlour::RbiGenerator::RbiObject
+ def ==(*args, &blk); end
+ def abstract(*args, &blk); end
+ def class_method(*args, &blk); end
+ def describe(*args, &blk); end
+ def final(*args, &blk); end
+ def generalize_from_rbi!(*args, &blk); end
+ def generate_definition(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def implementation(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ def overridable(*args, &blk); end
+ def override(*args, &blk); end
+ def parameters(*args, &blk); end
+ def qualifiers(*args, &blk); end
+ def return_type(*args, &blk); end
+ def type_parameters(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbiGenerator::Attribute < Parlour::RbiGenerator::Method
+ def ==(*args, &blk); end
+ def class_attribute(*args, &blk); end
+ def generalize_from_rbi!(*args, &blk); end
+ def generate_definition(*args, &blk); end
+ def initialize(*args, &blk); end
+ def kind(*args, &blk); end
+ def type(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::Arbitrary < Parlour::RbiGenerator::RbiObject
+ def ==(*args, &blk); end
+ def code(*args, &blk); end
+ def code=(arg0); end
+ def describe(*args, &blk); end
+ def generalize_from_rbi!(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::Include < Parlour::RbiGenerator::RbiObject
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generalize_from_rbi!(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::Extend < Parlour::RbiGenerator::RbiObject
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generalize_from_rbi!(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::Constant < Parlour::RbiGenerator::RbiObject
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def eigen_constant; end
+ def generalize_from_rbi!(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ def value(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::Namespace < Parlour::RbiGenerator::RbiObject
+ def add_comment_to_next_child(*args, &blk); end
+ def aliases(*args, &blk); end
+ def children(*args, &blk); end
+ def constants(*args, &blk); end
+ def create_arbitrary(code:, &block); end
+ def create_attr(*args, &blk); end
+ def create_attr_accessor(*args, &blk); end
+ def create_attr_reader(*args, &blk); end
+ def create_attr_writer(*args, &blk); end
+ def create_attribute(*args, &blk); end
+ def create_class(*args, &blk); end
+ def create_constant(*args, &blk); end
+ def create_enum_class(*args, &blk); end
+ def create_extend(*args, &blk); end
+ def create_extends(*args, &blk); end
+ def create_include(*args, &blk); end
+ def create_includes(*args, &blk); end
+ def create_method(*args, &blk); end
+ def create_module(*args, &blk); end
+ def create_struct_class(*args, &blk); end
+ def create_type_alias(*args, &blk); end
+ def describe(*args, &blk); end
+ def extends(*args, &blk); end
+ def final(*args, &blk); end
+ def generalize_from_rbi!(*args, &blk); end
+ def generate_body(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def includes(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ def move_next_comments(*args, &blk); end
+ def path(*args, &blk); end
+ def sealed(*args, &blk); end
+ def type_aliases(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbiGenerator::ModuleNamespace < Parlour::RbiGenerator::Namespace
+ def abstract(*args, &blk); end
+ def describe(*args, &blk); end
+ def generalize_from_rbi!(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def initialize(*args, &blk); end
+ def interface(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbiGenerator::ClassNamespace < Parlour::RbiGenerator::Namespace
+ def abstract(*args, &blk); end
+ def describe(*args, &blk); end
+ def generalize_from_rbi!(*args, &blk); end
+ def generate_rbi(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ def superclass(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbiGenerator::EnumClassNamespace < Parlour::RbiGenerator::ClassNamespace
+ def enums(*args, &blk); end
+ def generalize_from_rbi!(*args, &blk); end
+ def generate_body(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbiGenerator::StructProp
+ def ==(*args, &blk); end
+ def array(*args, &blk); end
+ def default(*args, &blk); end
+ def dont_store(*args, &blk); end
+ def enum(*args, &blk); end
+ def factory(*args, &blk); end
+ def foreign(*args, &blk); end
+ def generalize_from_rbi!(*args, &blk); end
+ def immutable(*args, &blk); end
+ def initialize(*args, &blk); end
+ def name(*args, &blk); end
+ def optional(*args, &blk); end
+ def override(*args, &blk); end
+ def redaction(*args, &blk); end
+ def to_prop_call(*args, &blk); end
+ def type(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbiGenerator::StructClassNamespace < Parlour::RbiGenerator::ClassNamespace
+ def generalize_from_rbi!(*args, &blk); end
+ def generate_body(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ def props(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::DetachedRbiGenerator < Parlour::RbiGenerator
+ def current_plugin(*args, &blk); end
+ def detached!(*args, &blk); end
+ def options(*args, &blk); end
+ def rbi(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator < Parlour::Generator
+ def initialize(**hash); end
+ def rbs(*args, &blk); end
+ def root(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator::RbsObject < Parlour::TypedObject
+ def describe(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def generator(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ extend T::InterfaceWrapper::Helpers
+ extend T::Private::Abstract::Hooks
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator::TypeAlias < Parlour::RbsGenerator::RbsObject
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ def type(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator::Namespace < Parlour::RbsGenerator::RbsObject
+ def add_comment_to_next_child(*args, &blk); end
+ def aliases(*args, &blk); end
+ def children(*args, &blk); end
+ def constants(*args, &blk); end
+ def create_arbitrary(code:, &block); end
+ def create_attr(*args, &blk); end
+ def create_attr_accessor(*args, &blk); end
+ def create_attr_reader(*args, &blk); end
+ def create_attr_writer(*args, &blk); end
+ def create_attribute(*args, &blk); end
+ def create_class(*args, &blk); end
+ def create_constant(*args, &blk); end
+ def create_extend(*args, &blk); end
+ def create_extends(*args, &blk); end
+ def create_include(*args, &blk); end
+ def create_includes(*args, &blk); end
+ def create_interface(*args, &blk); end
+ def create_method(*args, &blk); end
+ def create_module(*args, &blk); end
+ def create_type_alias(*args, &blk); end
+ def describe(*args, &blk); end
+ def extends(*args, &blk); end
+ def generate_body(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def includes(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ def move_next_comments(*args, &blk); end
+ def path(*args, &blk); end
+ def type_aliases(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbsGenerator::Method < Parlour::RbsGenerator::RbsObject
+ def ==(*args, &blk); end
+ def class_method(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ def signatures(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbsGenerator::Arbitrary < Parlour::RbsGenerator::RbsObject
+ def ==(*args, &blk); end
+ def code(*args, &blk); end
+ def code=(arg0); end
+ def describe(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator::Attribute < Parlour::RbsGenerator::Method
+ def ==(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def kind(*args, &blk); end
+ def type(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbsGenerator::Block
+ def ==(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def required(*args, &blk); end
+ def type(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbsGenerator::ClassNamespace < Parlour::RbsGenerator::Namespace
+ def describe(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ def superclass(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbsGenerator::Constant < Parlour::RbsGenerator::RbsObject
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ def type(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator::Extend < Parlour::RbsGenerator::RbsObject
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ def type(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator::Include < Parlour::RbsGenerator::RbsObject
+ def ==(*args, &blk); end
+ def describe(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def merge_into_self(*args, &blk); end
+ def mergeable?(*args, &blk); end
+ def type(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator::MethodSignature
+ def ==(*args, &blk); end
+ def block(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ def initialize(*args, &blk); end
+ def parameters(*args, &blk); end
+ def return_type(*args, &blk); end
+ def type_parameters(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbsGenerator::ModuleNamespace < Parlour::RbsGenerator::Namespace
+ def describe(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbsGenerator::InterfaceNamespace < Parlour::RbsGenerator::Namespace
+ def describe(*args, &blk); end
+ def generate_rbs(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::RbsGenerator::Parameter
+ def ==(*args, &blk); end
+ def initialize(*args, &blk); end
+ def kind(*args, &blk); end
+ def name(*args, &blk); end
+ def name_without_kind(*args, &blk); end
+ def required(*args, &blk); end
+ def to_rbs_param(*args, &blk); end
+ def type(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::DetachedRbsGenerator < Parlour::RbsGenerator
+ def current_plugin(*args, &blk); end
+ def detached!(*args, &blk); end
+ def options(*args, &blk); end
+ def rbs(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+end
+module Parlour::Conversion
+end
+class Parlour::Conversion::Converter
+ def add_warning(*args, &blk); end
+ def initialize; end
+ def warnings(*args, &blk); end
+ extend T::Helpers
+ extend T::InterfaceWrapper::Helpers
+ extend T::Private::Abstract::Hooks
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::Conversion::RbiToRbs < Parlour::Conversion::Converter
+ def convert_all(*args, &blk); end
+ def convert_object(*args, &blk); end
+ def initialize(*args, &blk); end
+ def rbs_gen(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::ConflictResolver
+ def all_eql?(*args, &blk); end
+ def deduplicate_mixins_of_name(*args, &blk); end
+ def merge_strategy(*args, &blk); end
+ def resolve_conflicts(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::ParseError < StandardError
+ def buffer(*args, &blk); end
+ def initialize(buffer, range); end
+ def range(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::TypeParser
+ def ast(*args, &blk); end
+ def ast=(arg0); end
+ def body_has_modifier?(*args, &blk); end
+ def body_includes_and_extends(*args, &blk); end
+ def constant_names(*args, &blk); end
+ def generator(*args, &blk); end
+ def generator=(arg0); end
+ def initialize(*args, &blk); end
+ def node_to_s(*args, &blk); end
+ def parse_all(*args, &blk); end
+ def parse_err(*args, &blk); end
+ def parse_method_into_methods(*args, &blk); end
+ def parse_node_to_type(*args, &blk); end
+ def parse_path_to_object(*args, &blk); end
+ def parse_sig_into_methods(*args, &blk); end
+ def parse_sig_into_sig(*args, &blk); end
+ def previous_sibling_sig_node?(*args, &blk); end
+ def self.from_source(*args, &blk); end
+ def self.parse_single_type(*args, &blk); end
+ def sig_node?(*args, &blk); end
+ def unknown_node_errors(*args, &blk); end
+ def warning(*args, &blk); end
+ def zip_by(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::TypeParser::NodePath
+ def child(*args, &blk); end
+ def indices(*args, &blk); end
+ def initialize(*args, &blk); end
+ def parent(*args, &blk); end
+ def sibling(*args, &blk); end
+ def traverse(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
+class Parlour::TypeParser::IntermediateSig < T::Struct
+ def __t_props_generated_deserialize(*args); end
+ def __t_props_generated_serialize(*args); end
+ def abstract; end
+ def abstract=(val); end
+ def final; end
+ def final=(val); end
+ def overridable; end
+ def overridable=(val); end
+ def override; end
+ def override=(val); end
+ def params; end
+ def params=(val); end
+ def return_type; end
+ def return_type=(val); end
+ def self.inherited(s); end
+ def type_parameters; end
+ def type_parameters=(val); end
+ extend T::Props::ClassMethods
+ extend T::Props::Plugin::ClassMethods
+ extend T::Props::Plugin::ClassMethods
+ extend T::Props::Plugin::ClassMethods
+ extend T::Props::Plugin::ClassMethods
+ extend T::Props::Plugin::ClassMethods
+ extend T::Props::Serializable::ClassMethods
+end
+module Parlour::TypeLoader
+ def self.load_file(*args, &blk); end
+ def self.load_project(*args, &blk); end
+ def self.load_source(*args, &blk); end
+ extend T::Private::Methods::MethodHooks
+ extend T::Private::Methods::SingletonMethodHooks
+ extend T::Sig
+end
diff --git a/sorbet/rbi/gems/parser.rbi b/sorbet/rbi/gems/parser.rbi
new file mode 100644
index 0000000..222b9ca
--- /dev/null
+++ b/sorbet/rbi/gems/parser.rbi
@@ -0,0 +1,1957 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/parser/all/parser.rbi
+#
+# parser-3.0.2.0
+
+module Parser
+ def self.warn_syntax_deviation(feature, version); end
+end
+module Parser::Messages
+ def self.compile(reason, arguments); end
+end
+module Parser::Deprecation
+ def warn_of_deprecation; end
+ def warned_of_deprecation=(arg0); end
+end
+module Parser::AST
+end
+class Parser::AST::Node < AST::Node
+ def assign_properties(properties); end
+ def loc; end
+ def location; end
+end
+class Parser::AST::Processor < AST::Processor
+ def on_alias(node); end
+ def on_and(node); end
+ def on_and_asgn(node); end
+ def on_arg(node); end
+ def on_arg_expr(node); end
+ def on_args(node); end
+ def on_argument(node); end
+ def on_array(node); end
+ def on_array_pattern(node); end
+ def on_array_pattern_with_tail(node); end
+ def on_back_ref(node); end
+ def on_begin(node); end
+ def on_block(node); end
+ def on_block_pass(node); end
+ def on_blockarg(node); end
+ def on_blockarg_expr(node); end
+ def on_break(node); end
+ def on_case(node); end
+ def on_case_match(node); end
+ def on_casgn(node); end
+ def on_class(node); end
+ def on_const(node); end
+ def on_const_pattern(node); end
+ def on_csend(node); end
+ def on_cvar(node); end
+ def on_cvasgn(node); end
+ def on_def(node); end
+ def on_defined?(node); end
+ def on_defs(node); end
+ def on_dstr(node); end
+ def on_dsym(node); end
+ def on_eflipflop(node); end
+ def on_empty_else(node); end
+ def on_ensure(node); end
+ def on_erange(node); end
+ def on_find_pattern(node); end
+ def on_for(node); end
+ def on_forward_arg(node); end
+ def on_gvar(node); end
+ def on_gvasgn(node); end
+ def on_hash(node); end
+ def on_hash_pattern(node); end
+ def on_if(node); end
+ def on_if_guard(node); end
+ def on_iflipflop(node); end
+ def on_in_match(node); end
+ def on_in_pattern(node); end
+ def on_index(node); end
+ def on_indexasgn(node); end
+ def on_irange(node); end
+ def on_ivar(node); end
+ def on_ivasgn(node); end
+ def on_kwarg(node); end
+ def on_kwargs(node); end
+ def on_kwbegin(node); end
+ def on_kwoptarg(node); end
+ def on_kwrestarg(node); end
+ def on_kwsplat(node); end
+ def on_lambda(node); end
+ def on_lvar(node); end
+ def on_lvasgn(node); end
+ def on_masgn(node); end
+ def on_match_alt(node); end
+ def on_match_as(node); end
+ def on_match_current_line(node); end
+ def on_match_pattern(node); end
+ def on_match_pattern_p(node); end
+ def on_match_rest(node); end
+ def on_match_var(node); end
+ def on_match_with_lvasgn(node); end
+ def on_mlhs(node); end
+ def on_module(node); end
+ def on_next(node); end
+ def on_not(node); end
+ def on_nth_ref(node); end
+ def on_numblock(node); end
+ def on_op_asgn(node); end
+ def on_optarg(node); end
+ def on_or(node); end
+ def on_or_asgn(node); end
+ def on_pair(node); end
+ def on_pin(node); end
+ def on_postexe(node); end
+ def on_preexe(node); end
+ def on_procarg0(node); end
+ def on_redo(node); end
+ def on_regexp(node); end
+ def on_resbody(node); end
+ def on_rescue(node); end
+ def on_restarg(node); end
+ def on_restarg_expr(node); end
+ def on_retry(node); end
+ def on_return(node); end
+ def on_sclass(node); end
+ def on_send(node); end
+ def on_shadowarg(node); end
+ def on_splat(node); end
+ def on_super(node); end
+ def on_undef(node); end
+ def on_unless_guard(node); end
+ def on_until(node); end
+ def on_until_post(node); end
+ def on_var(node); end
+ def on_vasgn(node); end
+ def on_when(node); end
+ def on_while(node); end
+ def on_while_post(node); end
+ def on_xstr(node); end
+ def on_yield(node); end
+ def process_argument_node(node); end
+ def process_regular_node(node); end
+ def process_var_asgn_node(node); end
+ def process_variable_node(node); end
+end
+module Parser::Meta
+end
+module Parser::Source
+end
+class Parser::Source::Buffer
+ def bsearch(line_begins, position); end
+ def column_for_position(position); end
+ def decompose_position(position); end
+ def first_line; end
+ def freeze; end
+ def initialize(name, first_line = nil, source: nil); end
+ def inspect; end
+ def last_line; end
+ def line_begins; end
+ def line_for_position(position); end
+ def line_index_for_position(position); end
+ def line_range(lineno); end
+ def name; end
+ def raw_source=(input); end
+ def read; end
+ def self.recognize_encoding(string); end
+ def self.reencode_string(input); end
+ def slice(range); end
+ def source; end
+ def source=(input); end
+ def source_line(lineno); end
+ def source_lines; end
+ def source_range; end
+end
+class Parser::Source::Range
+ def <=>(other); end
+ def adjust(begin_pos: nil, end_pos: nil); end
+ def begin; end
+ def begin_pos; end
+ def column; end
+ def column_range; end
+ def contained?(other); end
+ def contains?(other); end
+ def crossing?(other); end
+ def disjoint?(other); end
+ def empty?; end
+ def end; end
+ def end_pos; end
+ def eql?(arg0); end
+ def first_line; end
+ def hash; end
+ def initialize(source_buffer, begin_pos, end_pos); end
+ def inspect; end
+ def intersect(other); end
+ def is?(*what); end
+ def join(other); end
+ def last_column; end
+ def last_line; end
+ def length; end
+ def line; end
+ def overlaps?(other); end
+ def resize(new_size); end
+ def size; end
+ def source; end
+ def source_buffer; end
+ def source_line; end
+ def to_a; end
+ def to_range; end
+ def to_s; end
+ def with(begin_pos: nil, end_pos: nil); end
+ include Comparable
+end
+class Parser::Source::Comment
+ def ==(other); end
+ def document?; end
+ def initialize(range); end
+ def inline?; end
+ def inspect; end
+ def loc; end
+ def location; end
+ def self.associate(ast, comments); end
+ def self.associate_by_identity(ast, comments); end
+ def self.associate_locations(ast, comments); end
+ def text; end
+ def type; end
+end
+class Parser::Source::Comment::Associator
+ def advance_comment; end
+ def advance_through_directives; end
+ def associate; end
+ def associate_and_advance_comment(node); end
+ def associate_by_identity; end
+ def associate_locations; end
+ def children_in_source_order(node); end
+ def current_comment_before?(node); end
+ def current_comment_before_end?(node); end
+ def current_comment_decorates?(node); end
+ def do_associate; end
+ def initialize(ast, comments); end
+ def process_leading_comments(node); end
+ def process_trailing_comments(node); end
+ def skip_directives; end
+ def skip_directives=(arg0); end
+ def visit(node); end
+end
+class Parser::Source::Rewriter
+ def active_clobber; end
+ def active_clobber=(value); end
+ def active_insertions; end
+ def active_insertions=(value); end
+ def active_queue; end
+ def adjacent?(range1, range2); end
+ def adjacent_insertion_mask(range); end
+ def adjacent_insertions?(range); end
+ def adjacent_position_mask(range); end
+ def adjacent_updates?(range); end
+ def append(action); end
+ def can_merge?(action, existing); end
+ def clobbered_insertion?(insertion); end
+ def clobbered_position_mask(range); end
+ def diagnostics; end
+ def in_transaction?; end
+ def initialize(source_buffer); end
+ def insert_after(range, content); end
+ def insert_after_multi(range, content); end
+ def insert_before(range, content); end
+ def insert_before_multi(range, content); end
+ def merge_actions!(action, existing); end
+ def merge_actions(action, existing); end
+ def merge_replacements(actions); end
+ def process; end
+ def raise_clobber_error(action, existing); end
+ def record_insertion(range); end
+ def record_replace(range); end
+ def remove(range); end
+ def replace(range, content); end
+ def replace_actions(old, updated); end
+ def replace_compatible_with_insertion?(replace, insertion); end
+ def source_buffer; end
+ def transaction; end
+ def wrap(range, before, after); end
+ extend Parser::Deprecation
+end
+class Parser::Source::Rewriter::Action
+ def <=>(other); end
+ def allow_multiple_insertions; end
+ def allow_multiple_insertions?; end
+ def initialize(range, replacement = nil, allow_multiple_insertions = nil, order = nil); end
+ def order; end
+ def range; end
+ def replacement; end
+ def to_s; end
+ include Comparable
+end
+class Parser::Source::TreeRewriter
+ def action_root; end
+ def action_summary; end
+ def as_nested_actions; end
+ def as_replacements; end
+ def check_policy_validity; end
+ def check_range_validity(range); end
+ def combine(range, attributes); end
+ def diagnostics; end
+ def empty?; end
+ def enforce_policy(event); end
+ def import!(foreign_rewriter, offset: nil); end
+ def in_transaction?; end
+ def initialize(source_buffer, crossing_deletions: nil, different_replacements: nil, swallowed_insertions: nil); end
+ def insert_after(range, content); end
+ def insert_after_multi(range, text); end
+ def insert_before(range, content); end
+ def insert_before_multi(range, text); end
+ def inspect; end
+ def merge!(with); end
+ def merge(with); end
+ def process; end
+ def remove(range); end
+ def replace(range, content); end
+ def source_buffer; end
+ def transaction; end
+ def trigger_policy(event, range: nil, conflict: nil, **arguments); end
+ def wrap(range, insert_before, insert_after); end
+ extend Parser::Deprecation
+end
+class Parser::Source::TreeRewriter::Action
+ def analyse_hierarchy(action); end
+ def bsearch_child_index(from = nil); end
+ def call_enforcer_for_merge(action); end
+ def check_fusible(action, *fusible); end
+ def children; end
+ def combine(action); end
+ def combine_children(more_children); end
+ def contract; end
+ def do_combine(action); end
+ def empty?; end
+ def fuse_deletions(action, fusible, other_sibblings); end
+ def initialize(range, enforcer, insert_before: nil, replacement: nil, insert_after: nil, children: nil); end
+ def insert_after; end
+ def insert_before; end
+ def insertion?; end
+ def merge(action); end
+ def moved(source_buffer, offset); end
+ def nested_actions; end
+ def ordered_replacements; end
+ def place_in_hierarchy(action); end
+ def range; end
+ def replacement; end
+ def swallow(children); end
+ def with(range: nil, enforcer: nil, children: nil, insert_before: nil, replacement: nil, insert_after: nil); end
+end
+class Parser::Source::Map
+ def ==(other); end
+ def column; end
+ def expression; end
+ def first_line; end
+ def initialize(expression); end
+ def initialize_copy(other); end
+ def last_column; end
+ def last_line; end
+ def line; end
+ def node; end
+ def node=(node); end
+ def to_hash; end
+ def update_expression(expression_l); end
+ def with(&block); end
+ def with_expression(expression_l); end
+end
+class Parser::Source::Map::Operator < Parser::Source::Map
+ def initialize(operator, expression); end
+ def operator; end
+end
+class Parser::Source::Map::Collection < Parser::Source::Map
+ def begin; end
+ def end; end
+ def initialize(begin_l, end_l, expression_l); end
+end
+class Parser::Source::Map::Constant < Parser::Source::Map
+ def double_colon; end
+ def initialize(double_colon, name, expression); end
+ def name; end
+ def operator; end
+ def update_operator(operator_l); end
+ def with_operator(operator_l); end
+end
+class Parser::Source::Map::Variable < Parser::Source::Map
+ def initialize(name_l, expression_l = nil); end
+ def name; end
+ def operator; end
+ def update_operator(operator_l); end
+ def with_operator(operator_l); end
+end
+class Parser::Source::Map::Keyword < Parser::Source::Map
+ def begin; end
+ def end; end
+ def initialize(keyword_l, begin_l, end_l, expression_l); end
+ def keyword; end
+end
+class Parser::Source::Map::Definition < Parser::Source::Map
+ def end; end
+ def initialize(keyword_l, operator_l, name_l, end_l); end
+ def keyword; end
+ def name; end
+ def operator; end
+end
+class Parser::Source::Map::MethodDefinition < Parser::Source::Map
+ def assignment; end
+ def end; end
+ def initialize(keyword_l, operator_l, name_l, end_l, assignment_l, body_l); end
+ def keyword; end
+ def name; end
+ def operator; end
+end
+class Parser::Source::Map::Send < Parser::Source::Map
+ def begin; end
+ def dot; end
+ def end; end
+ def initialize(dot_l, selector_l, begin_l, end_l, expression_l); end
+ def operator; end
+ def selector; end
+ def update_operator(operator_l); end
+ def with_operator(operator_l); end
+end
+class Parser::Source::Map::Index < Parser::Source::Map
+ def begin; end
+ def end; end
+ def initialize(begin_l, end_l, expression_l); end
+ def operator; end
+ def update_operator(operator_l); end
+ def with_operator(operator_l); end
+end
+class Parser::Source::Map::Condition < Parser::Source::Map
+ def begin; end
+ def else; end
+ def end; end
+ def initialize(keyword_l, begin_l, else_l, end_l, expression_l); end
+ def keyword; end
+end
+class Parser::Source::Map::Ternary < Parser::Source::Map
+ def colon; end
+ def initialize(question_l, colon_l, expression_l); end
+ def question; end
+end
+class Parser::Source::Map::For < Parser::Source::Map
+ def begin; end
+ def end; end
+ def in; end
+ def initialize(keyword_l, in_l, begin_l, end_l, expression_l); end
+ def keyword; end
+end
+class Parser::Source::Map::RescueBody < Parser::Source::Map
+ def assoc; end
+ def begin; end
+ def initialize(keyword_l, assoc_l, begin_l, expression_l); end
+ def keyword; end
+end
+class Parser::Source::Map::Heredoc < Parser::Source::Map
+ def heredoc_body; end
+ def heredoc_end; end
+ def initialize(begin_l, body_l, end_l); end
+end
+class Parser::Source::Map::ObjcKwarg < Parser::Source::Map
+ def argument; end
+ def initialize(keyword_l, operator_l, argument_l, expression_l); end
+ def keyword; end
+ def operator; end
+end
+class Parser::SyntaxError < StandardError
+ def diagnostic; end
+ def initialize(diagnostic); end
+end
+class Parser::ClobberingError < RuntimeError
+end
+class Parser::Diagnostic
+ def arguments; end
+ def first_line_only(range); end
+ def highlights; end
+ def initialize(level, reason, arguments, location, highlights = nil); end
+ def last_line_only(range); end
+ def level; end
+ def location; end
+ def message; end
+ def reason; end
+ def render; end
+ def render_line(range, ellipsis = nil, range_end = nil); end
+end
+class Parser::Diagnostic::Engine
+ def all_errors_are_fatal; end
+ def all_errors_are_fatal=(arg0); end
+ def consumer; end
+ def consumer=(arg0); end
+ def ignore?(diagnostic); end
+ def ignore_warnings; end
+ def ignore_warnings=(arg0); end
+ def initialize(consumer = nil); end
+ def process(diagnostic); end
+ def raise?(diagnostic); end
+end
+class Parser::StaticEnvironment
+ def declare(name); end
+ def declare_forward_args; end
+ def declared?(name); end
+ def declared_forward_args?; end
+ def empty?; end
+ def extend_dynamic; end
+ def extend_static; end
+ def initialize; end
+ def reset; end
+ def unextend; end
+end
+class Parser::Lexer
+ def advance; end
+ def arg_or_cmdarg(cmd_state); end
+ def cmdarg; end
+ def cmdarg=(arg0); end
+ def cmdarg_stack; end
+ def command_start; end
+ def command_start=(arg0); end
+ def comments; end
+ def comments=(arg0); end
+ def cond; end
+ def cond=(arg0); end
+ def cond_stack; end
+ def context; end
+ def context=(arg0); end
+ def dedent_level; end
+ def diagnostic(type, reason, arguments = nil, location = nil, highlights = nil); end
+ def diagnostics; end
+ def diagnostics=(arg0); end
+ def emit(type, value = nil, s = nil, e = nil); end
+ def emit_comment(s = nil, e = nil); end
+ def emit_do(do_block = nil); end
+ def emit_table(table, s = nil, e = nil); end
+ def encode_escape(ord); end
+ def encoding; end
+ def eof_codepoint?(point); end
+ def force_utf32; end
+ def force_utf32=(arg0); end
+ def in_kwarg; end
+ def in_kwarg=(arg0); end
+ def initialize(version); end
+ def lambda_stack; end
+ def literal; end
+ def next_state_for_literal(literal); end
+ def paren_nest; end
+ def pop_cmdarg; end
+ def pop_cond; end
+ def pop_literal; end
+ def push_cmdarg; end
+ def push_cond; end
+ def push_literal(*args); end
+ def range(s = nil, e = nil); end
+ def reset(reset_state = nil); end
+ def self._lex_eof_trans; end
+ def self._lex_eof_trans=(arg0); end
+ def self._lex_from_state_actions; end
+ def self._lex_from_state_actions=(arg0); end
+ def self._lex_index_offsets; end
+ def self._lex_index_offsets=(arg0); end
+ def self._lex_indicies; end
+ def self._lex_indicies=(arg0); end
+ def self._lex_key_spans; end
+ def self._lex_key_spans=(arg0); end
+ def self._lex_to_state_actions; end
+ def self._lex_to_state_actions=(arg0); end
+ def self._lex_trans_actions; end
+ def self._lex_trans_actions=(arg0); end
+ def self._lex_trans_keys; end
+ def self._lex_trans_keys=(arg0); end
+ def self._lex_trans_targs; end
+ def self._lex_trans_targs=(arg0); end
+ def self.lex_en_expr_arg; end
+ def self.lex_en_expr_arg=(arg0); end
+ def self.lex_en_expr_beg; end
+ def self.lex_en_expr_beg=(arg0); end
+ def self.lex_en_expr_cmdarg; end
+ def self.lex_en_expr_cmdarg=(arg0); end
+ def self.lex_en_expr_dot; end
+ def self.lex_en_expr_dot=(arg0); end
+ def self.lex_en_expr_end; end
+ def self.lex_en_expr_end=(arg0); end
+ def self.lex_en_expr_endarg; end
+ def self.lex_en_expr_endarg=(arg0); end
+ def self.lex_en_expr_endfn; end
+ def self.lex_en_expr_endfn=(arg0); end
+ def self.lex_en_expr_fname; end
+ def self.lex_en_expr_fname=(arg0); end
+ def self.lex_en_expr_labelarg; end
+ def self.lex_en_expr_labelarg=(arg0); end
+ def self.lex_en_expr_mid; end
+ def self.lex_en_expr_mid=(arg0); end
+ def self.lex_en_expr_value; end
+ def self.lex_en_expr_value=(arg0); end
+ def self.lex_en_expr_variable; end
+ def self.lex_en_expr_variable=(arg0); end
+ def self.lex_en_interp_backslash_delimited; end
+ def self.lex_en_interp_backslash_delimited=(arg0); end
+ def self.lex_en_interp_backslash_delimited_words; end
+ def self.lex_en_interp_backslash_delimited_words=(arg0); end
+ def self.lex_en_interp_string; end
+ def self.lex_en_interp_string=(arg0); end
+ def self.lex_en_interp_words; end
+ def self.lex_en_interp_words=(arg0); end
+ def self.lex_en_leading_dot; end
+ def self.lex_en_leading_dot=(arg0); end
+ def self.lex_en_line_begin; end
+ def self.lex_en_line_begin=(arg0); end
+ def self.lex_en_line_comment; end
+ def self.lex_en_line_comment=(arg0); end
+ def self.lex_en_plain_backslash_delimited; end
+ def self.lex_en_plain_backslash_delimited=(arg0); end
+ def self.lex_en_plain_backslash_delimited_words; end
+ def self.lex_en_plain_backslash_delimited_words=(arg0); end
+ def self.lex_en_plain_string; end
+ def self.lex_en_plain_string=(arg0); end
+ def self.lex_en_plain_words; end
+ def self.lex_en_plain_words=(arg0); end
+ def self.lex_en_regexp_modifiers; end
+ def self.lex_en_regexp_modifiers=(arg0); end
+ def self.lex_error; end
+ def self.lex_error=(arg0); end
+ def self.lex_start; end
+ def self.lex_start=(arg0); end
+ def source_buffer; end
+ def source_buffer=(source_buffer); end
+ def stack_pop; end
+ def state; end
+ def state=(state); end
+ def static_env; end
+ def static_env=(arg0); end
+ def tok(s = nil, e = nil); end
+ def tokens; end
+ def tokens=(arg0); end
+ def version?(*versions); end
+end
+class Parser::Lexer::Literal
+ def backslash_delimited?; end
+ def clear_buffer; end
+ def coerce_encoding(string); end
+ def dedent_level; end
+ def delimiter?(delimiter); end
+ def emit(token, type, s, e); end
+ def emit_start_tok; end
+ def end_interp_brace_and_try_closing; end
+ def extend_content; end
+ def extend_space(ts, te); end
+ def extend_string(string, ts, te); end
+ def flush_string; end
+ def heredoc?; end
+ def heredoc_e; end
+ def infer_indent_level(line); end
+ def initialize(lexer, str_type, delimiter, str_s, heredoc_e = nil, indent = nil, dedent_body = nil, label_allowed = nil); end
+ def interpolate?; end
+ def munge_escape?(character); end
+ def nest_and_try_closing(delimiter, ts, te, lookahead = nil); end
+ def plain_heredoc?; end
+ def regexp?; end
+ def saved_herebody_s; end
+ def saved_herebody_s=(arg0); end
+ def squiggly_heredoc?; end
+ def start_interp_brace; end
+ def str_s; end
+ def supports_line_continuation_via_slash?; end
+ def type; end
+ def words?; end
+end
+class Parser::Lexer::StackState
+ def active?; end
+ def clear; end
+ def empty?; end
+ def initialize(name); end
+ def inspect; end
+ def lexpop; end
+ def pop; end
+ def push(bit); end
+ def to_s; end
+end
+class Parser::Lexer::Dedenter
+ def dedent(string); end
+ def initialize(dedent_level); end
+ def interrupt; end
+end
+class Parser::Builders::Default
+ def __ENCODING__(__ENCODING__t); end
+ def __FILE__(__FILE__t); end
+ def __LINE__(__LINE__t); end
+ def accessible(node); end
+ def alias(alias_t, to, from); end
+ def arg(name_t); end
+ def arg_expr(expr); end
+ def arg_name_collides?(this_name, that_name); end
+ def arg_prefix_map(op_t, name_t = nil); end
+ def args(begin_t, args, end_t, check_args = nil); end
+ def array(begin_t, elements, end_t); end
+ def array_pattern(lbrack_t, elements, rbrack_t); end
+ def assign(lhs, eql_t, rhs); end
+ def assignable(node); end
+ def associate(begin_t, pairs, end_t); end
+ def attr_asgn(receiver, dot_t, selector_t); end
+ def back_ref(token); end
+ def begin(begin_t, body, end_t); end
+ def begin_body(compound_stmt, rescue_bodies = nil, else_t = nil, else_ = nil, ensure_t = nil, ensure_ = nil); end
+ def begin_keyword(begin_t, body, end_t); end
+ def binary_op(receiver, operator_t, arg); end
+ def binary_op_map(left_e, op_t, right_e); end
+ def block(method_call, begin_t, args, body, end_t); end
+ def block_map(receiver_l, begin_t, end_t); end
+ def block_pass(amper_t, arg); end
+ def blockarg(amper_t, name_t); end
+ def blockarg_expr(amper_t, expr); end
+ def call_lambda(lambda_t); end
+ def call_method(receiver, dot_t, selector_t, lparen_t = nil, args = nil, rparen_t = nil); end
+ def call_type_for_dot(dot_t); end
+ def case(case_t, expr, when_bodies, else_t, else_body, end_t); end
+ def case_match(case_t, expr, in_bodies, else_t, else_body, end_t); end
+ def character(char_t); end
+ def check_assignment_to_numparam(name, loc); end
+ def check_condition(cond); end
+ def check_duplicate_arg(this_arg, map = nil); end
+ def check_duplicate_args(args, map = nil); end
+ def check_duplicate_pattern_key(name, loc); end
+ def check_duplicate_pattern_variable(name, loc); end
+ def check_lvar_name(name, loc); end
+ def check_reserved_for_numparam(name, loc); end
+ def collapse_string_parts?(parts); end
+ def collection_map(begin_t, parts, end_t); end
+ def complex(complex_t); end
+ def compstmt(statements); end
+ def condition(cond_t, cond, then_t, if_true, else_t, if_false, end_t); end
+ def condition_map(keyword_t, cond_e, begin_t, body_e, else_t, else_e, end_t); end
+ def condition_mod(if_true, if_false, cond_t, cond); end
+ def const(name_t); end
+ def const_fetch(scope, t_colon2, name_t); end
+ def const_global(t_colon3, name_t); end
+ def const_op_assignable(node); end
+ def const_pattern(const, ldelim_t, pattern, rdelim_t); end
+ def constant_map(scope, colon2_t, name_t); end
+ def cvar(token); end
+ def dedent_string(node, dedent_level); end
+ def def_class(class_t, name, lt_t, superclass, body, end_t); end
+ def def_endless_method(def_t, name_t, args, assignment_t, body); end
+ def def_endless_singleton(def_t, definee, dot_t, name_t, args, assignment_t, body); end
+ def def_method(def_t, name_t, args, body, end_t); end
+ def def_module(module_t, name, body, end_t); end
+ def def_sclass(class_t, lshft_t, expr, body, end_t); end
+ def def_singleton(def_t, definee, dot_t, name_t, args, body, end_t); end
+ def definition_map(keyword_t, operator_t, name_t, end_t); end
+ def delimited_string_map(string_t); end
+ def diagnostic(type, reason, arguments, location, highlights = nil); end
+ def eh_keyword_map(compstmt_e, keyword_t, body_es, else_t, else_e); end
+ def emit_file_line_as_literals; end
+ def emit_file_line_as_literals=(arg0); end
+ def endless_definition_map(keyword_t, operator_t, name_t, assignment_t, body_e); end
+ def expr_map(loc); end
+ def false(false_t); end
+ def find_pattern(lbrack_t, elements, rbrack_t); end
+ def float(float_t); end
+ def for(for_t, iterator, in_t, iteratee, do_t, body, end_t); end
+ def for_map(keyword_t, in_t, begin_t, end_t); end
+ def forward_arg(dots_t); end
+ def forward_only_args(begin_t, dots_t, end_t); end
+ def forwarded_args(dots_t); end
+ def guard_map(keyword_t, guard_body_e); end
+ def gvar(token); end
+ def hash_pattern(lbrace_t, kwargs, rbrace_t); end
+ def ident(token); end
+ def if_guard(if_t, if_body); end
+ def in_match(lhs, in_t, rhs); end
+ def in_pattern(in_t, pattern, guard, then_t, body); end
+ def index(receiver, lbrack_t, indexes, rbrack_t); end
+ def index_asgn(receiver, lbrack_t, indexes, rbrack_t); end
+ def index_map(receiver_e, lbrack_t, rbrack_t); end
+ def initialize; end
+ def integer(integer_t); end
+ def ivar(token); end
+ def join_exprs(left_expr, right_expr); end
+ def keyword_cmd(type, keyword_t, lparen_t = nil, args = nil, rparen_t = nil); end
+ def keyword_map(keyword_t, begin_t, args, end_t); end
+ def keyword_mod_map(pre_e, keyword_t, post_e); end
+ def kwarg(name_t); end
+ def kwarg_map(name_t, value_e = nil); end
+ def kwargs?(node); end
+ def kwnilarg(dstar_t, nil_t); end
+ def kwoptarg(name_t, value); end
+ def kwrestarg(dstar_t, name_t = nil); end
+ def kwsplat(dstar_t, arg); end
+ def loc(token); end
+ def logical_op(type, lhs, op_t, rhs); end
+ def loop(type, keyword_t, cond, do_t, body, end_t); end
+ def loop_mod(type, body, keyword_t, cond); end
+ def match_alt(left, pipe_t, right); end
+ def match_as(value, assoc_t, as); end
+ def match_hash_var(name_t); end
+ def match_hash_var_from_str(begin_t, strings, end_t); end
+ def match_label(label_type, label); end
+ def match_nil_pattern(dstar_t, nil_t); end
+ def match_op(receiver, match_t, arg); end
+ def match_pair(label_type, label, value); end
+ def match_pattern(lhs, match_t, rhs); end
+ def match_pattern_p(lhs, match_t, rhs); end
+ def match_rest(star_t, name_t = nil); end
+ def match_var(name_t); end
+ def match_with_trailing_comma(match, comma_t); end
+ def module_definition_map(keyword_t, name_e, operator_t, end_t); end
+ def multi_assign(lhs, eql_t, rhs); end
+ def multi_lhs(begin_t, items, end_t); end
+ def n(type, children, source_map); end
+ def n0(type, source_map); end
+ def nil(nil_t); end
+ def not_op(not_t, begin_t = nil, receiver = nil, end_t = nil); end
+ def nth_ref(token); end
+ def numargs(max_numparam); end
+ def numeric(kind, token); end
+ def objc_kwarg(kwname_t, assoc_t, name_t); end
+ def objc_restarg(star_t, name = nil); end
+ def objc_varargs(pair, rest_of_varargs); end
+ def op_assign(lhs, op_t, rhs); end
+ def optarg(name_t, eql_t, value); end
+ def pair(key, assoc_t, value); end
+ def pair_keyword(key_t, value); end
+ def pair_keyword_map(key_t, value_e); end
+ def pair_list_18(list); end
+ def pair_quoted(begin_t, parts, end_t, value); end
+ def pair_quoted_map(begin_t, end_t, value_e); end
+ def parser; end
+ def parser=(arg0); end
+ def pin(pin_t, var); end
+ def postexe(postexe_t, lbrace_t, compstmt, rbrace_t); end
+ def preexe(preexe_t, lbrace_t, compstmt, rbrace_t); end
+ def prefix_string_map(symbol); end
+ def procarg0(arg); end
+ def range_exclusive(lhs, dot3_t, rhs); end
+ def range_inclusive(lhs, dot2_t, rhs); end
+ def range_map(start_e, op_t, end_e); end
+ def rational(rational_t); end
+ def regexp_compose(begin_t, parts, end_t, options); end
+ def regexp_map(begin_t, end_t, options_e); end
+ def regexp_options(regopt_t); end
+ def rescue_body(rescue_t, exc_list, assoc_t, exc_var, then_t, compound_stmt); end
+ def rescue_body_map(keyword_t, exc_list_e, assoc_t, exc_var_e, then_t, compstmt_e); end
+ def restarg(star_t, name_t = nil); end
+ def restarg_expr(star_t, expr = nil); end
+ def rewrite_hash_args_to_kwargs(args); end
+ def self(token); end
+ def self.emit_arg_inside_procarg0; end
+ def self.emit_arg_inside_procarg0=(arg0); end
+ def self.emit_encoding; end
+ def self.emit_encoding=(arg0); end
+ def self.emit_forward_arg; end
+ def self.emit_forward_arg=(arg0); end
+ def self.emit_index; end
+ def self.emit_index=(arg0); end
+ def self.emit_kwargs; end
+ def self.emit_kwargs=(arg0); end
+ def self.emit_lambda; end
+ def self.emit_lambda=(arg0); end
+ def self.emit_match_pattern; end
+ def self.emit_match_pattern=(arg0); end
+ def self.emit_procarg0; end
+ def self.emit_procarg0=(arg0); end
+ def self.modernize; end
+ def send_binary_op_map(lhs_e, selector_t, rhs_e); end
+ def send_index_map(receiver_e, lbrack_t, rbrack_t); end
+ def send_map(receiver_e, dot_t, selector_t, begin_t = nil, args = nil, end_t = nil); end
+ def send_unary_op_map(selector_t, arg_e); end
+ def shadowarg(name_t); end
+ def splat(star_t, arg = nil); end
+ def static_regexp(parts, options); end
+ def static_regexp_node(node); end
+ def static_string(nodes); end
+ def string(string_t); end
+ def string_compose(begin_t, parts, end_t); end
+ def string_internal(string_t); end
+ def string_map(begin_t, parts, end_t); end
+ def string_value(token); end
+ def symbol(symbol_t); end
+ def symbol_compose(begin_t, parts, end_t); end
+ def symbol_internal(symbol_t); end
+ def symbols_compose(begin_t, parts, end_t); end
+ def ternary(cond, question_t, if_true, colon_t, if_false); end
+ def ternary_map(begin_e, question_t, mid_e, colon_t, end_e); end
+ def token_map(token); end
+ def true(true_t); end
+ def unary_num(unary_t, numeric); end
+ def unary_op(op_t, receiver); end
+ def unary_op_map(op_t, arg_e = nil); end
+ def undef_method(undef_t, names); end
+ def unless_guard(unless_t, unless_body); end
+ def unquoted_map(token); end
+ def validate_definee(definee); end
+ def value(token); end
+ def var_send_map(variable_e); end
+ def variable_map(name_t); end
+ def when(when_t, patterns, then_t, body); end
+ def word(parts); end
+ def words_compose(begin_t, parts, end_t); end
+ def xstring_compose(begin_t, parts, end_t); end
+end
+class Parser::Context
+ def class_definition_allowed?; end
+ def dynamic_const_definition_allowed?; end
+ def empty?; end
+ def in_block?; end
+ def in_class?; end
+ def in_dynamic_block?; end
+ def in_lambda?; end
+ def indirectly_in_def?; end
+ def initialize; end
+ def module_definition_allowed?; end
+ def pop; end
+ def push(state); end
+ def reset; end
+ def stack; end
+end
+class Parser::MaxNumparamStack
+ def empty?; end
+ def has_numparams?; end
+ def has_ordinary_params!; end
+ def has_ordinary_params?; end
+ def initialize; end
+ def pop; end
+ def push; end
+ def register(numparam); end
+ def set(value); end
+ def stack; end
+ def top; end
+end
+class Parser::CurrentArgStack
+ def empty?; end
+ def initialize; end
+ def pop; end
+ def push(value); end
+ def reset; end
+ def set(value); end
+ def stack; end
+ def top; end
+end
+class Parser::VariablesStack
+ def declare(name); end
+ def declared?(name); end
+ def empty?; end
+ def initialize; end
+ def pop; end
+ def push; end
+ def reset; end
+end
+class Parser::Base < Racc::Parser
+ def builder; end
+ def check_kwarg_name(name_t); end
+ def context; end
+ def current_arg_stack; end
+ def diagnostic(level, reason, arguments, location_t, highlights_ts = nil); end
+ def diagnostics; end
+ def initialize(builder = nil); end
+ def lexer; end
+ def max_numparam_stack; end
+ def next_token; end
+ def on_error(error_token_id, error_value, value_stack); end
+ def parse(source_buffer); end
+ def parse_with_comments(source_buffer); end
+ def pattern_hash_keys; end
+ def pattern_variables; end
+ def reset; end
+ def self.default_parser; end
+ def self.parse(string, file = nil, line = nil); end
+ def self.parse_file(filename); end
+ def self.parse_file_with_comments(filename); end
+ def self.parse_with_comments(string, file = nil, line = nil); end
+ def self.setup_source_buffer(file, line, string, encoding); end
+ def source_buffer; end
+ def static_env; end
+ def tokenize(source_buffer, recover = nil); end
+end
+class Parser::Rewriter < Parser::AST::Processor
+ def assignment?(node); end
+ def initialize(*arg0); end
+ def insert_after(range, content); end
+ def insert_before(range, content); end
+ def remove(range); end
+ def replace(range, content); end
+ def rewrite(source_buffer, ast); end
+ def wrap(range, before, after); end
+ extend Parser::Deprecation
+end
+class Parser::TreeRewriter < Parser::AST::Processor
+ def assignment?(node); end
+ def insert_after(range, content); end
+ def insert_before(range, content); end
+ def remove(range); end
+ def replace(range, content); end
+ def rewrite(source_buffer, ast, **policy); end
+ def wrap(range, before, after); end
+end
+module Parser::Builders
+end
+class Parser::Ruby27 < Parser::Base
+ def _reduce_1(val, _values, result); end
+ def _reduce_10(val, _values, result); end
+ def _reduce_100(val, _values, result); end
+ def _reduce_101(val, _values, result); end
+ def _reduce_102(val, _values, result); end
+ def _reduce_103(val, _values, result); end
+ def _reduce_104(val, _values, result); end
+ def _reduce_105(val, _values, result); end
+ def _reduce_106(val, _values, result); end
+ def _reduce_107(val, _values, result); end
+ def _reduce_108(val, _values, result); end
+ def _reduce_109(val, _values, result); end
+ def _reduce_11(val, _values, result); end
+ def _reduce_110(val, _values, result); end
+ def _reduce_111(val, _values, result); end
+ def _reduce_112(val, _values, result); end
+ def _reduce_113(val, _values, result); end
+ def _reduce_114(val, _values, result); end
+ def _reduce_115(val, _values, result); end
+ def _reduce_117(val, _values, result); end
+ def _reduce_118(val, _values, result); end
+ def _reduce_119(val, _values, result); end
+ def _reduce_12(val, _values, result); end
+ def _reduce_125(val, _values, result); end
+ def _reduce_127(val, _values, result); end
+ def _reduce_128(val, _values, result); end
+ def _reduce_129(val, _values, result); end
+ def _reduce_13(val, _values, result); end
+ def _reduce_14(val, _values, result); end
+ def _reduce_15(val, _values, result); end
+ def _reduce_16(val, _values, result); end
+ def _reduce_18(val, _values, result); end
+ def _reduce_19(val, _values, result); end
+ def _reduce_2(val, _values, result); end
+ def _reduce_20(val, _values, result); end
+ def _reduce_201(val, _values, result); end
+ def _reduce_202(val, _values, result); end
+ def _reduce_203(val, _values, result); end
+ def _reduce_204(val, _values, result); end
+ def _reduce_205(val, _values, result); end
+ def _reduce_206(val, _values, result); end
+ def _reduce_207(val, _values, result); end
+ def _reduce_208(val, _values, result); end
+ def _reduce_209(val, _values, result); end
+ def _reduce_21(val, _values, result); end
+ def _reduce_210(val, _values, result); end
+ def _reduce_211(val, _values, result); end
+ def _reduce_212(val, _values, result); end
+ def _reduce_213(val, _values, result); end
+ def _reduce_214(val, _values, result); end
+ def _reduce_215(val, _values, result); end
+ def _reduce_216(val, _values, result); end
+ def _reduce_217(val, _values, result); end
+ def _reduce_218(val, _values, result); end
+ def _reduce_219(val, _values, result); end
+ def _reduce_22(val, _values, result); end
+ def _reduce_220(val, _values, result); end
+ def _reduce_221(val, _values, result); end
+ def _reduce_222(val, _values, result); end
+ def _reduce_223(val, _values, result); end
+ def _reduce_224(val, _values, result); end
+ def _reduce_225(val, _values, result); end
+ def _reduce_226(val, _values, result); end
+ def _reduce_227(val, _values, result); end
+ def _reduce_228(val, _values, result); end
+ def _reduce_23(val, _values, result); end
+ def _reduce_230(val, _values, result); end
+ def _reduce_231(val, _values, result); end
+ def _reduce_232(val, _values, result); end
+ def _reduce_233(val, _values, result); end
+ def _reduce_234(val, _values, result); end
+ def _reduce_235(val, _values, result); end
+ def _reduce_236(val, _values, result); end
+ def _reduce_237(val, _values, result); end
+ def _reduce_238(val, _values, result); end
+ def _reduce_239(val, _values, result); end
+ def _reduce_24(val, _values, result); end
+ def _reduce_240(val, _values, result); end
+ def _reduce_241(val, _values, result); end
+ def _reduce_242(val, _values, result); end
+ def _reduce_248(val, _values, result); end
+ def _reduce_249(val, _values, result); end
+ def _reduce_25(val, _values, result); end
+ def _reduce_253(val, _values, result); end
+ def _reduce_254(val, _values, result); end
+ def _reduce_256(val, _values, result); end
+ def _reduce_257(val, _values, result); end
+ def _reduce_258(val, _values, result); end
+ def _reduce_259(val, _values, result); end
+ def _reduce_26(val, _values, result); end
+ def _reduce_260(val, _values, result); end
+ def _reduce_262(val, _values, result); end
+ def _reduce_265(val, _values, result); end
+ def _reduce_266(val, _values, result); end
+ def _reduce_267(val, _values, result); end
+ def _reduce_268(val, _values, result); end
+ def _reduce_269(val, _values, result); end
+ def _reduce_27(val, _values, result); end
+ def _reduce_270(val, _values, result); end
+ def _reduce_271(val, _values, result); end
+ def _reduce_272(val, _values, result); end
+ def _reduce_273(val, _values, result); end
+ def _reduce_274(val, _values, result); end
+ def _reduce_275(val, _values, result); end
+ def _reduce_276(val, _values, result); end
+ def _reduce_277(val, _values, result); end
+ def _reduce_278(val, _values, result); end
+ def _reduce_279(val, _values, result); end
+ def _reduce_28(val, _values, result); end
+ def _reduce_280(val, _values, result); end
+ def _reduce_281(val, _values, result); end
+ def _reduce_283(val, _values, result); end
+ def _reduce_284(val, _values, result); end
+ def _reduce_285(val, _values, result); end
+ def _reduce_29(val, _values, result); end
+ def _reduce_296(val, _values, result); end
+ def _reduce_297(val, _values, result); end
+ def _reduce_298(val, _values, result); end
+ def _reduce_299(val, _values, result); end
+ def _reduce_3(val, _values, result); end
+ def _reduce_30(val, _values, result); end
+ def _reduce_300(val, _values, result); end
+ def _reduce_301(val, _values, result); end
+ def _reduce_302(val, _values, result); end
+ def _reduce_303(val, _values, result); end
+ def _reduce_304(val, _values, result); end
+ def _reduce_305(val, _values, result); end
+ def _reduce_306(val, _values, result); end
+ def _reduce_307(val, _values, result); end
+ def _reduce_308(val, _values, result); end
+ def _reduce_309(val, _values, result); end
+ def _reduce_310(val, _values, result); end
+ def _reduce_311(val, _values, result); end
+ def _reduce_312(val, _values, result); end
+ def _reduce_313(val, _values, result); end
+ def _reduce_314(val, _values, result); end
+ def _reduce_315(val, _values, result); end
+ def _reduce_317(val, _values, result); end
+ def _reduce_318(val, _values, result); end
+ def _reduce_319(val, _values, result); end
+ def _reduce_32(val, _values, result); end
+ def _reduce_320(val, _values, result); end
+ def _reduce_321(val, _values, result); end
+ def _reduce_322(val, _values, result); end
+ def _reduce_323(val, _values, result); end
+ def _reduce_324(val, _values, result); end
+ def _reduce_325(val, _values, result); end
+ def _reduce_326(val, _values, result); end
+ def _reduce_327(val, _values, result); end
+ def _reduce_328(val, _values, result); end
+ def _reduce_329(val, _values, result); end
+ def _reduce_33(val, _values, result); end
+ def _reduce_330(val, _values, result); end
+ def _reduce_331(val, _values, result); end
+ def _reduce_332(val, _values, result); end
+ def _reduce_333(val, _values, result); end
+ def _reduce_334(val, _values, result); end
+ def _reduce_335(val, _values, result); end
+ def _reduce_336(val, _values, result); end
+ def _reduce_337(val, _values, result); end
+ def _reduce_338(val, _values, result); end
+ def _reduce_339(val, _values, result); end
+ def _reduce_34(val, _values, result); end
+ def _reduce_340(val, _values, result); end
+ def _reduce_341(val, _values, result); end
+ def _reduce_342(val, _values, result); end
+ def _reduce_344(val, _values, result); end
+ def _reduce_347(val, _values, result); end
+ def _reduce_35(val, _values, result); end
+ def _reduce_351(val, _values, result); end
+ def _reduce_353(val, _values, result); end
+ def _reduce_356(val, _values, result); end
+ def _reduce_357(val, _values, result); end
+ def _reduce_358(val, _values, result); end
+ def _reduce_359(val, _values, result); end
+ def _reduce_361(val, _values, result); end
+ def _reduce_362(val, _values, result); end
+ def _reduce_363(val, _values, result); end
+ def _reduce_364(val, _values, result); end
+ def _reduce_365(val, _values, result); end
+ def _reduce_366(val, _values, result); end
+ def _reduce_367(val, _values, result); end
+ def _reduce_368(val, _values, result); end
+ def _reduce_369(val, _values, result); end
+ def _reduce_37(val, _values, result); end
+ def _reduce_370(val, _values, result); end
+ def _reduce_371(val, _values, result); end
+ def _reduce_372(val, _values, result); end
+ def _reduce_373(val, _values, result); end
+ def _reduce_374(val, _values, result); end
+ def _reduce_375(val, _values, result); end
+ def _reduce_376(val, _values, result); end
+ def _reduce_377(val, _values, result); end
+ def _reduce_378(val, _values, result); end
+ def _reduce_38(val, _values, result); end
+ def _reduce_380(val, _values, result); end
+ def _reduce_381(val, _values, result); end
+ def _reduce_382(val, _values, result); end
+ def _reduce_383(val, _values, result); end
+ def _reduce_384(val, _values, result); end
+ def _reduce_385(val, _values, result); end
+ def _reduce_386(val, _values, result); end
+ def _reduce_387(val, _values, result); end
+ def _reduce_389(val, _values, result); end
+ def _reduce_39(val, _values, result); end
+ def _reduce_390(val, _values, result); end
+ def _reduce_391(val, _values, result); end
+ def _reduce_392(val, _values, result); end
+ def _reduce_393(val, _values, result); end
+ def _reduce_394(val, _values, result); end
+ def _reduce_395(val, _values, result); end
+ def _reduce_396(val, _values, result); end
+ def _reduce_397(val, _values, result); end
+ def _reduce_399(val, _values, result); end
+ def _reduce_4(val, _values, result); end
+ def _reduce_40(val, _values, result); end
+ def _reduce_400(val, _values, result); end
+ def _reduce_401(val, _values, result); end
+ def _reduce_402(val, _values, result); end
+ def _reduce_403(val, _values, result); end
+ def _reduce_404(val, _values, result); end
+ def _reduce_405(val, _values, result); end
+ def _reduce_406(val, _values, result); end
+ def _reduce_407(val, _values, result); end
+ def _reduce_408(val, _values, result); end
+ def _reduce_409(val, _values, result); end
+ def _reduce_41(val, _values, result); end
+ def _reduce_410(val, _values, result); end
+ def _reduce_411(val, _values, result); end
+ def _reduce_412(val, _values, result); end
+ def _reduce_413(val, _values, result); end
+ def _reduce_414(val, _values, result); end
+ def _reduce_415(val, _values, result); end
+ def _reduce_416(val, _values, result); end
+ def _reduce_417(val, _values, result); end
+ def _reduce_418(val, _values, result); end
+ def _reduce_419(val, _values, result); end
+ def _reduce_42(val, _values, result); end
+ def _reduce_420(val, _values, result); end
+ def _reduce_421(val, _values, result); end
+ def _reduce_422(val, _values, result); end
+ def _reduce_423(val, _values, result); end
+ def _reduce_424(val, _values, result); end
+ def _reduce_425(val, _values, result); end
+ def _reduce_426(val, _values, result); end
+ def _reduce_427(val, _values, result); end
+ def _reduce_428(val, _values, result); end
+ def _reduce_429(val, _values, result); end
+ def _reduce_43(val, _values, result); end
+ def _reduce_430(val, _values, result); end
+ def _reduce_431(val, _values, result); end
+ def _reduce_432(val, _values, result); end
+ def _reduce_433(val, _values, result); end
+ def _reduce_435(val, _values, result); end
+ def _reduce_436(val, _values, result); end
+ def _reduce_437(val, _values, result); end
+ def _reduce_438(val, _values, result); end
+ def _reduce_44(val, _values, result); end
+ def _reduce_440(val, _values, result); end
+ def _reduce_441(val, _values, result); end
+ def _reduce_442(val, _values, result); end
+ def _reduce_444(val, _values, result); end
+ def _reduce_445(val, _values, result); end
+ def _reduce_446(val, _values, result); end
+ def _reduce_447(val, _values, result); end
+ def _reduce_449(val, _values, result); end
+ def _reduce_451(val, _values, result); end
+ def _reduce_453(val, _values, result); end
+ def _reduce_454(val, _values, result); end
+ def _reduce_456(val, _values, result); end
+ def _reduce_457(val, _values, result); end
+ def _reduce_458(val, _values, result); end
+ def _reduce_459(val, _values, result); end
+ def _reduce_46(val, _values, result); end
+ def _reduce_460(val, _values, result); end
+ def _reduce_461(val, _values, result); end
+ def _reduce_462(val, _values, result); end
+ def _reduce_463(val, _values, result); end
+ def _reduce_464(val, _values, result); end
+ def _reduce_465(val, _values, result); end
+ def _reduce_466(val, _values, result); end
+ def _reduce_467(val, _values, result); end
+ def _reduce_468(val, _values, result); end
+ def _reduce_469(val, _values, result); end
+ def _reduce_470(val, _values, result); end
+ def _reduce_471(val, _values, result); end
+ def _reduce_472(val, _values, result); end
+ def _reduce_473(val, _values, result); end
+ def _reduce_474(val, _values, result); end
+ def _reduce_475(val, _values, result); end
+ def _reduce_476(val, _values, result); end
+ def _reduce_478(val, _values, result); end
+ def _reduce_479(val, _values, result); end
+ def _reduce_480(val, _values, result); end
+ def _reduce_481(val, _values, result); end
+ def _reduce_482(val, _values, result); end
+ def _reduce_483(val, _values, result); end
+ def _reduce_484(val, _values, result); end
+ def _reduce_485(val, _values, result); end
+ def _reduce_487(val, _values, result); end
+ def _reduce_488(val, _values, result); end
+ def _reduce_489(val, _values, result); end
+ def _reduce_49(val, _values, result); end
+ def _reduce_490(val, _values, result); end
+ def _reduce_491(val, _values, result); end
+ def _reduce_492(val, _values, result); end
+ def _reduce_493(val, _values, result); end
+ def _reduce_494(val, _values, result); end
+ def _reduce_495(val, _values, result); end
+ def _reduce_496(val, _values, result); end
+ def _reduce_497(val, _values, result); end
+ def _reduce_498(val, _values, result); end
+ def _reduce_499(val, _values, result); end
+ def _reduce_5(val, _values, result); end
+ def _reduce_50(val, _values, result); end
+ def _reduce_500(val, _values, result); end
+ def _reduce_501(val, _values, result); end
+ def _reduce_503(val, _values, result); end
+ def _reduce_504(val, _values, result); end
+ def _reduce_505(val, _values, result); end
+ def _reduce_506(val, _values, result); end
+ def _reduce_51(val, _values, result); end
+ def _reduce_510(val, _values, result); end
+ def _reduce_511(val, _values, result); end
+ def _reduce_52(val, _values, result); end
+ def _reduce_520(val, _values, result); end
+ def _reduce_521(val, _values, result); end
+ def _reduce_522(val, _values, result); end
+ def _reduce_523(val, _values, result); end
+ def _reduce_524(val, _values, result); end
+ def _reduce_525(val, _values, result); end
+ def _reduce_526(val, _values, result); end
+ def _reduce_527(val, _values, result); end
+ def _reduce_528(val, _values, result); end
+ def _reduce_529(val, _values, result); end
+ def _reduce_53(val, _values, result); end
+ def _reduce_530(val, _values, result); end
+ def _reduce_533(val, _values, result); end
+ def _reduce_535(val, _values, result); end
+ def _reduce_539(val, _values, result); end
+ def _reduce_54(val, _values, result); end
+ def _reduce_540(val, _values, result); end
+ def _reduce_541(val, _values, result); end
+ def _reduce_542(val, _values, result); end
+ def _reduce_543(val, _values, result); end
+ def _reduce_544(val, _values, result); end
+ def _reduce_545(val, _values, result); end
+ def _reduce_546(val, _values, result); end
+ def _reduce_547(val, _values, result); end
+ def _reduce_548(val, _values, result); end
+ def _reduce_549(val, _values, result); end
+ def _reduce_550(val, _values, result); end
+ def _reduce_551(val, _values, result); end
+ def _reduce_552(val, _values, result); end
+ def _reduce_553(val, _values, result); end
+ def _reduce_554(val, _values, result); end
+ def _reduce_555(val, _values, result); end
+ def _reduce_556(val, _values, result); end
+ def _reduce_557(val, _values, result); end
+ def _reduce_558(val, _values, result); end
+ def _reduce_559(val, _values, result); end
+ def _reduce_560(val, _values, result); end
+ def _reduce_561(val, _values, result); end
+ def _reduce_562(val, _values, result); end
+ def _reduce_563(val, _values, result); end
+ def _reduce_564(val, _values, result); end
+ def _reduce_565(val, _values, result); end
+ def _reduce_566(val, _values, result); end
+ def _reduce_567(val, _values, result); end
+ def _reduce_568(val, _values, result); end
+ def _reduce_569(val, _values, result); end
+ def _reduce_57(val, _values, result); end
+ def _reduce_570(val, _values, result); end
+ def _reduce_571(val, _values, result); end
+ def _reduce_572(val, _values, result); end
+ def _reduce_573(val, _values, result); end
+ def _reduce_577(val, _values, result); end
+ def _reduce_578(val, _values, result); end
+ def _reduce_579(val, _values, result); end
+ def _reduce_58(val, _values, result); end
+ def _reduce_580(val, _values, result); end
+ def _reduce_581(val, _values, result); end
+ def _reduce_582(val, _values, result); end
+ def _reduce_583(val, _values, result); end
+ def _reduce_584(val, _values, result); end
+ def _reduce_585(val, _values, result); end
+ def _reduce_586(val, _values, result); end
+ def _reduce_587(val, _values, result); end
+ def _reduce_588(val, _values, result); end
+ def _reduce_589(val, _values, result); end
+ def _reduce_590(val, _values, result); end
+ def _reduce_591(val, _values, result); end
+ def _reduce_592(val, _values, result); end
+ def _reduce_593(val, _values, result); end
+ def _reduce_594(val, _values, result); end
+ def _reduce_595(val, _values, result); end
+ def _reduce_596(val, _values, result); end
+ def _reduce_597(val, _values, result); end
+ def _reduce_598(val, _values, result); end
+ def _reduce_599(val, _values, result); end
+ def _reduce_6(val, _values, result); end
+ def _reduce_600(val, _values, result); end
+ def _reduce_601(val, _values, result); end
+ def _reduce_602(val, _values, result); end
+ def _reduce_603(val, _values, result); end
+ def _reduce_604(val, _values, result); end
+ def _reduce_605(val, _values, result); end
+ def _reduce_606(val, _values, result); end
+ def _reduce_607(val, _values, result); end
+ def _reduce_608(val, _values, result); end
+ def _reduce_609(val, _values, result); end
+ def _reduce_610(val, _values, result); end
+ def _reduce_611(val, _values, result); end
+ def _reduce_612(val, _values, result); end
+ def _reduce_613(val, _values, result); end
+ def _reduce_614(val, _values, result); end
+ def _reduce_615(val, _values, result); end
+ def _reduce_616(val, _values, result); end
+ def _reduce_617(val, _values, result); end
+ def _reduce_618(val, _values, result); end
+ def _reduce_619(val, _values, result); end
+ def _reduce_62(val, _values, result); end
+ def _reduce_620(val, _values, result); end
+ def _reduce_621(val, _values, result); end
+ def _reduce_622(val, _values, result); end
+ def _reduce_623(val, _values, result); end
+ def _reduce_624(val, _values, result); end
+ def _reduce_625(val, _values, result); end
+ def _reduce_626(val, _values, result); end
+ def _reduce_627(val, _values, result); end
+ def _reduce_628(val, _values, result); end
+ def _reduce_629(val, _values, result); end
+ def _reduce_63(val, _values, result); end
+ def _reduce_630(val, _values, result); end
+ def _reduce_631(val, _values, result); end
+ def _reduce_632(val, _values, result); end
+ def _reduce_633(val, _values, result); end
+ def _reduce_634(val, _values, result); end
+ def _reduce_635(val, _values, result); end
+ def _reduce_636(val, _values, result); end
+ def _reduce_637(val, _values, result); end
+ def _reduce_639(val, _values, result); end
+ def _reduce_64(val, _values, result); end
+ def _reduce_640(val, _values, result); end
+ def _reduce_641(val, _values, result); end
+ def _reduce_642(val, _values, result); end
+ def _reduce_643(val, _values, result); end
+ def _reduce_644(val, _values, result); end
+ def _reduce_645(val, _values, result); end
+ def _reduce_646(val, _values, result); end
+ def _reduce_647(val, _values, result); end
+ def _reduce_648(val, _values, result); end
+ def _reduce_649(val, _values, result); end
+ def _reduce_650(val, _values, result); end
+ def _reduce_651(val, _values, result); end
+ def _reduce_652(val, _values, result); end
+ def _reduce_653(val, _values, result); end
+ def _reduce_656(val, _values, result); end
+ def _reduce_657(val, _values, result); end
+ def _reduce_658(val, _values, result); end
+ def _reduce_659(val, _values, result); end
+ def _reduce_66(val, _values, result); end
+ def _reduce_660(val, _values, result); end
+ def _reduce_661(val, _values, result); end
+ def _reduce_662(val, _values, result); end
+ def _reduce_663(val, _values, result); end
+ def _reduce_664(val, _values, result); end
+ def _reduce_667(val, _values, result); end
+ def _reduce_668(val, _values, result); end
+ def _reduce_67(val, _values, result); end
+ def _reduce_671(val, _values, result); end
+ def _reduce_672(val, _values, result); end
+ def _reduce_673(val, _values, result); end
+ def _reduce_675(val, _values, result); end
+ def _reduce_676(val, _values, result); end
+ def _reduce_678(val, _values, result); end
+ def _reduce_679(val, _values, result); end
+ def _reduce_68(val, _values, result); end
+ def _reduce_680(val, _values, result); end
+ def _reduce_681(val, _values, result); end
+ def _reduce_682(val, _values, result); end
+ def _reduce_683(val, _values, result); end
+ def _reduce_69(val, _values, result); end
+ def _reduce_696(val, _values, result); end
+ def _reduce_697(val, _values, result); end
+ def _reduce_7(val, _values, result); end
+ def _reduce_70(val, _values, result); end
+ def _reduce_702(val, _values, result); end
+ def _reduce_703(val, _values, result); end
+ def _reduce_704(val, _values, result); end
+ def _reduce_708(val, _values, result); end
+ def _reduce_71(val, _values, result); end
+ def _reduce_712(val, _values, result); end
+ def _reduce_72(val, _values, result); end
+ def _reduce_73(val, _values, result); end
+ def _reduce_74(val, _values, result); end
+ def _reduce_75(val, _values, result); end
+ def _reduce_76(val, _values, result); end
+ def _reduce_77(val, _values, result); end
+ def _reduce_78(val, _values, result); end
+ def _reduce_79(val, _values, result); end
+ def _reduce_80(val, _values, result); end
+ def _reduce_82(val, _values, result); end
+ def _reduce_83(val, _values, result); end
+ def _reduce_84(val, _values, result); end
+ def _reduce_85(val, _values, result); end
+ def _reduce_86(val, _values, result); end
+ def _reduce_87(val, _values, result); end
+ def _reduce_88(val, _values, result); end
+ def _reduce_89(val, _values, result); end
+ def _reduce_9(val, _values, result); end
+ def _reduce_90(val, _values, result); end
+ def _reduce_92(val, _values, result); end
+ def _reduce_93(val, _values, result); end
+ def _reduce_94(val, _values, result); end
+ def _reduce_95(val, _values, result); end
+ def _reduce_96(val, _values, result); end
+ def _reduce_97(val, _values, result); end
+ def _reduce_98(val, _values, result); end
+ def _reduce_99(val, _values, result); end
+ def _reduce_none(val, _values, result); end
+ def default_encoding; end
+ def version; end
+end
+class Parser::Ruby24 < Parser::Base
+ def _reduce_10(val, _values, result); end
+ def _reduce_100(val, _values, result); end
+ def _reduce_101(val, _values, result); end
+ def _reduce_102(val, _values, result); end
+ def _reduce_103(val, _values, result); end
+ def _reduce_104(val, _values, result); end
+ def _reduce_105(val, _values, result); end
+ def _reduce_106(val, _values, result); end
+ def _reduce_107(val, _values, result); end
+ def _reduce_108(val, _values, result); end
+ def _reduce_11(val, _values, result); end
+ def _reduce_110(val, _values, result); end
+ def _reduce_111(val, _values, result); end
+ def _reduce_112(val, _values, result); end
+ def _reduce_118(val, _values, result); end
+ def _reduce_12(val, _values, result); end
+ def _reduce_122(val, _values, result); end
+ def _reduce_123(val, _values, result); end
+ def _reduce_124(val, _values, result); end
+ def _reduce_13(val, _values, result); end
+ def _reduce_14(val, _values, result); end
+ def _reduce_16(val, _values, result); end
+ def _reduce_17(val, _values, result); end
+ def _reduce_18(val, _values, result); end
+ def _reduce_19(val, _values, result); end
+ def _reduce_196(val, _values, result); end
+ def _reduce_197(val, _values, result); end
+ def _reduce_198(val, _values, result); end
+ def _reduce_199(val, _values, result); end
+ def _reduce_2(val, _values, result); end
+ def _reduce_20(val, _values, result); end
+ def _reduce_200(val, _values, result); end
+ def _reduce_201(val, _values, result); end
+ def _reduce_202(val, _values, result); end
+ def _reduce_203(val, _values, result); end
+ def _reduce_204(val, _values, result); end
+ def _reduce_205(val, _values, result); end
+ def _reduce_206(val, _values, result); end
+ def _reduce_207(val, _values, result); end
+ def _reduce_208(val, _values, result); end
+ def _reduce_209(val, _values, result); end
+ def _reduce_21(val, _values, result); end
+ def _reduce_210(val, _values, result); end
+ def _reduce_211(val, _values, result); end
+ def _reduce_212(val, _values, result); end
+ def _reduce_213(val, _values, result); end
+ def _reduce_214(val, _values, result); end
+ def _reduce_215(val, _values, result); end
+ def _reduce_216(val, _values, result); end
+ def _reduce_217(val, _values, result); end
+ def _reduce_218(val, _values, result); end
+ def _reduce_219(val, _values, result); end
+ def _reduce_22(val, _values, result); end
+ def _reduce_220(val, _values, result); end
+ def _reduce_221(val, _values, result); end
+ def _reduce_222(val, _values, result); end
+ def _reduce_223(val, _values, result); end
+ def _reduce_224(val, _values, result); end
+ def _reduce_225(val, _values, result); end
+ def _reduce_226(val, _values, result); end
+ def _reduce_227(val, _values, result); end
+ def _reduce_228(val, _values, result); end
+ def _reduce_229(val, _values, result); end
+ def _reduce_23(val, _values, result); end
+ def _reduce_230(val, _values, result); end
+ def _reduce_231(val, _values, result); end
+ def _reduce_232(val, _values, result); end
+ def _reduce_233(val, _values, result); end
+ def _reduce_234(val, _values, result); end
+ def _reduce_235(val, _values, result); end
+ def _reduce_236(val, _values, result); end
+ def _reduce_24(val, _values, result); end
+ def _reduce_241(val, _values, result); end
+ def _reduce_242(val, _values, result); end
+ def _reduce_244(val, _values, result); end
+ def _reduce_245(val, _values, result); end
+ def _reduce_246(val, _values, result); end
+ def _reduce_248(val, _values, result); end
+ def _reduce_25(val, _values, result); end
+ def _reduce_251(val, _values, result); end
+ def _reduce_252(val, _values, result); end
+ def _reduce_253(val, _values, result); end
+ def _reduce_254(val, _values, result); end
+ def _reduce_255(val, _values, result); end
+ def _reduce_256(val, _values, result); end
+ def _reduce_257(val, _values, result); end
+ def _reduce_258(val, _values, result); end
+ def _reduce_259(val, _values, result); end
+ def _reduce_26(val, _values, result); end
+ def _reduce_260(val, _values, result); end
+ def _reduce_261(val, _values, result); end
+ def _reduce_262(val, _values, result); end
+ def _reduce_263(val, _values, result); end
+ def _reduce_264(val, _values, result); end
+ def _reduce_265(val, _values, result); end
+ def _reduce_266(val, _values, result); end
+ def _reduce_267(val, _values, result); end
+ def _reduce_269(val, _values, result); end
+ def _reduce_27(val, _values, result); end
+ def _reduce_270(val, _values, result); end
+ def _reduce_271(val, _values, result); end
+ def _reduce_28(val, _values, result); end
+ def _reduce_282(val, _values, result); end
+ def _reduce_283(val, _values, result); end
+ def _reduce_284(val, _values, result); end
+ def _reduce_285(val, _values, result); end
+ def _reduce_286(val, _values, result); end
+ def _reduce_287(val, _values, result); end
+ def _reduce_288(val, _values, result); end
+ def _reduce_289(val, _values, result); end
+ def _reduce_290(val, _values, result); end
+ def _reduce_291(val, _values, result); end
+ def _reduce_292(val, _values, result); end
+ def _reduce_293(val, _values, result); end
+ def _reduce_294(val, _values, result); end
+ def _reduce_295(val, _values, result); end
+ def _reduce_296(val, _values, result); end
+ def _reduce_297(val, _values, result); end
+ def _reduce_298(val, _values, result); end
+ def _reduce_299(val, _values, result); end
+ def _reduce_3(val, _values, result); end
+ def _reduce_30(val, _values, result); end
+ def _reduce_300(val, _values, result); end
+ def _reduce_301(val, _values, result); end
+ def _reduce_303(val, _values, result); end
+ def _reduce_304(val, _values, result); end
+ def _reduce_305(val, _values, result); end
+ def _reduce_306(val, _values, result); end
+ def _reduce_307(val, _values, result); end
+ def _reduce_308(val, _values, result); end
+ def _reduce_309(val, _values, result); end
+ def _reduce_31(val, _values, result); end
+ def _reduce_310(val, _values, result); end
+ def _reduce_311(val, _values, result); end
+ def _reduce_312(val, _values, result); end
+ def _reduce_313(val, _values, result); end
+ def _reduce_314(val, _values, result); end
+ def _reduce_315(val, _values, result); end
+ def _reduce_316(val, _values, result); end
+ def _reduce_317(val, _values, result); end
+ def _reduce_318(val, _values, result); end
+ def _reduce_319(val, _values, result); end
+ def _reduce_32(val, _values, result); end
+ def _reduce_320(val, _values, result); end
+ def _reduce_321(val, _values, result); end
+ def _reduce_322(val, _values, result); end
+ def _reduce_323(val, _values, result); end
+ def _reduce_324(val, _values, result); end
+ def _reduce_325(val, _values, result); end
+ def _reduce_326(val, _values, result); end
+ def _reduce_327(val, _values, result); end
+ def _reduce_328(val, _values, result); end
+ def _reduce_329(val, _values, result); end
+ def _reduce_330(val, _values, result); end
+ def _reduce_331(val, _values, result); end
+ def _reduce_332(val, _values, result); end
+ def _reduce_333(val, _values, result); end
+ def _reduce_337(val, _values, result); end
+ def _reduce_34(val, _values, result); end
+ def _reduce_341(val, _values, result); end
+ def _reduce_343(val, _values, result); end
+ def _reduce_346(val, _values, result); end
+ def _reduce_347(val, _values, result); end
+ def _reduce_348(val, _values, result); end
+ def _reduce_349(val, _values, result); end
+ def _reduce_35(val, _values, result); end
+ def _reduce_351(val, _values, result); end
+ def _reduce_352(val, _values, result); end
+ def _reduce_353(val, _values, result); end
+ def _reduce_354(val, _values, result); end
+ def _reduce_355(val, _values, result); end
+ def _reduce_356(val, _values, result); end
+ def _reduce_357(val, _values, result); end
+ def _reduce_358(val, _values, result); end
+ def _reduce_359(val, _values, result); end
+ def _reduce_36(val, _values, result); end
+ def _reduce_360(val, _values, result); end
+ def _reduce_361(val, _values, result); end
+ def _reduce_362(val, _values, result); end
+ def _reduce_363(val, _values, result); end
+ def _reduce_364(val, _values, result); end
+ def _reduce_365(val, _values, result); end
+ def _reduce_366(val, _values, result); end
+ def _reduce_367(val, _values, result); end
+ def _reduce_368(val, _values, result); end
+ def _reduce_369(val, _values, result); end
+ def _reduce_37(val, _values, result); end
+ def _reduce_371(val, _values, result); end
+ def _reduce_372(val, _values, result); end
+ def _reduce_373(val, _values, result); end
+ def _reduce_374(val, _values, result); end
+ def _reduce_375(val, _values, result); end
+ def _reduce_376(val, _values, result); end
+ def _reduce_377(val, _values, result); end
+ def _reduce_378(val, _values, result); end
+ def _reduce_38(val, _values, result); end
+ def _reduce_380(val, _values, result); end
+ def _reduce_381(val, _values, result); end
+ def _reduce_382(val, _values, result); end
+ def _reduce_383(val, _values, result); end
+ def _reduce_384(val, _values, result); end
+ def _reduce_385(val, _values, result); end
+ def _reduce_386(val, _values, result); end
+ def _reduce_387(val, _values, result); end
+ def _reduce_388(val, _values, result); end
+ def _reduce_389(val, _values, result); end
+ def _reduce_39(val, _values, result); end
+ def _reduce_391(val, _values, result); end
+ def _reduce_392(val, _values, result); end
+ def _reduce_393(val, _values, result); end
+ def _reduce_394(val, _values, result); end
+ def _reduce_395(val, _values, result); end
+ def _reduce_396(val, _values, result); end
+ def _reduce_397(val, _values, result); end
+ def _reduce_398(val, _values, result); end
+ def _reduce_399(val, _values, result); end
+ def _reduce_4(val, _values, result); end
+ def _reduce_40(val, _values, result); end
+ def _reduce_400(val, _values, result); end
+ def _reduce_401(val, _values, result); end
+ def _reduce_402(val, _values, result); end
+ def _reduce_403(val, _values, result); end
+ def _reduce_404(val, _values, result); end
+ def _reduce_405(val, _values, result); end
+ def _reduce_406(val, _values, result); end
+ def _reduce_407(val, _values, result); end
+ def _reduce_408(val, _values, result); end
+ def _reduce_409(val, _values, result); end
+ def _reduce_41(val, _values, result); end
+ def _reduce_410(val, _values, result); end
+ def _reduce_411(val, _values, result); end
+ def _reduce_412(val, _values, result); end
+ def _reduce_413(val, _values, result); end
+ def _reduce_414(val, _values, result); end
+ def _reduce_415(val, _values, result); end
+ def _reduce_416(val, _values, result); end
+ def _reduce_417(val, _values, result); end
+ def _reduce_418(val, _values, result); end
+ def _reduce_419(val, _values, result); end
+ def _reduce_420(val, _values, result); end
+ def _reduce_421(val, _values, result); end
+ def _reduce_422(val, _values, result); end
+ def _reduce_423(val, _values, result); end
+ def _reduce_424(val, _values, result); end
+ def _reduce_425(val, _values, result); end
+ def _reduce_427(val, _values, result); end
+ def _reduce_428(val, _values, result); end
+ def _reduce_429(val, _values, result); end
+ def _reduce_43(val, _values, result); end
+ def _reduce_432(val, _values, result); end
+ def _reduce_434(val, _values, result); end
+ def _reduce_439(val, _values, result); end
+ def _reduce_440(val, _values, result); end
+ def _reduce_441(val, _values, result); end
+ def _reduce_442(val, _values, result); end
+ def _reduce_443(val, _values, result); end
+ def _reduce_444(val, _values, result); end
+ def _reduce_445(val, _values, result); end
+ def _reduce_446(val, _values, result); end
+ def _reduce_447(val, _values, result); end
+ def _reduce_448(val, _values, result); end
+ def _reduce_449(val, _values, result); end
+ def _reduce_450(val, _values, result); end
+ def _reduce_451(val, _values, result); end
+ def _reduce_452(val, _values, result); end
+ def _reduce_453(val, _values, result); end
+ def _reduce_454(val, _values, result); end
+ def _reduce_455(val, _values, result); end
+ def _reduce_456(val, _values, result); end
+ def _reduce_457(val, _values, result); end
+ def _reduce_458(val, _values, result); end
+ def _reduce_459(val, _values, result); end
+ def _reduce_46(val, _values, result); end
+ def _reduce_460(val, _values, result); end
+ def _reduce_461(val, _values, result); end
+ def _reduce_462(val, _values, result); end
+ def _reduce_463(val, _values, result); end
+ def _reduce_464(val, _values, result); end
+ def _reduce_465(val, _values, result); end
+ def _reduce_466(val, _values, result); end
+ def _reduce_467(val, _values, result); end
+ def _reduce_468(val, _values, result); end
+ def _reduce_469(val, _values, result); end
+ def _reduce_47(val, _values, result); end
+ def _reduce_470(val, _values, result); end
+ def _reduce_471(val, _values, result); end
+ def _reduce_472(val, _values, result); end
+ def _reduce_473(val, _values, result); end
+ def _reduce_475(val, _values, result); end
+ def _reduce_476(val, _values, result); end
+ def _reduce_477(val, _values, result); end
+ def _reduce_478(val, _values, result); end
+ def _reduce_479(val, _values, result); end
+ def _reduce_48(val, _values, result); end
+ def _reduce_480(val, _values, result); end
+ def _reduce_481(val, _values, result); end
+ def _reduce_482(val, _values, result); end
+ def _reduce_483(val, _values, result); end
+ def _reduce_484(val, _values, result); end
+ def _reduce_485(val, _values, result); end
+ def _reduce_486(val, _values, result); end
+ def _reduce_487(val, _values, result); end
+ def _reduce_488(val, _values, result); end
+ def _reduce_489(val, _values, result); end
+ def _reduce_49(val, _values, result); end
+ def _reduce_490(val, _values, result); end
+ def _reduce_491(val, _values, result); end
+ def _reduce_492(val, _values, result); end
+ def _reduce_493(val, _values, result); end
+ def _reduce_494(val, _values, result); end
+ def _reduce_495(val, _values, result); end
+ def _reduce_496(val, _values, result); end
+ def _reduce_497(val, _values, result); end
+ def _reduce_498(val, _values, result); end
+ def _reduce_499(val, _values, result); end
+ def _reduce_5(val, _values, result); end
+ def _reduce_500(val, _values, result); end
+ def _reduce_501(val, _values, result); end
+ def _reduce_502(val, _values, result); end
+ def _reduce_503(val, _values, result); end
+ def _reduce_504(val, _values, result); end
+ def _reduce_505(val, _values, result); end
+ def _reduce_506(val, _values, result); end
+ def _reduce_507(val, _values, result); end
+ def _reduce_508(val, _values, result); end
+ def _reduce_509(val, _values, result); end
+ def _reduce_510(val, _values, result); end
+ def _reduce_511(val, _values, result); end
+ def _reduce_512(val, _values, result); end
+ def _reduce_513(val, _values, result); end
+ def _reduce_514(val, _values, result); end
+ def _reduce_515(val, _values, result); end
+ def _reduce_516(val, _values, result); end
+ def _reduce_517(val, _values, result); end
+ def _reduce_518(val, _values, result); end
+ def _reduce_519(val, _values, result); end
+ def _reduce_520(val, _values, result); end
+ def _reduce_521(val, _values, result); end
+ def _reduce_522(val, _values, result); end
+ def _reduce_523(val, _values, result); end
+ def _reduce_524(val, _values, result); end
+ def _reduce_525(val, _values, result); end
+ def _reduce_526(val, _values, result); end
+ def _reduce_527(val, _values, result); end
+ def _reduce_528(val, _values, result); end
+ def _reduce_529(val, _values, result); end
+ def _reduce_530(val, _values, result); end
+ def _reduce_531(val, _values, result); end
+ def _reduce_533(val, _values, result); end
+ def _reduce_534(val, _values, result); end
+ def _reduce_535(val, _values, result); end
+ def _reduce_536(val, _values, result); end
+ def _reduce_537(val, _values, result); end
+ def _reduce_538(val, _values, result); end
+ def _reduce_539(val, _values, result); end
+ def _reduce_540(val, _values, result); end
+ def _reduce_541(val, _values, result); end
+ def _reduce_542(val, _values, result); end
+ def _reduce_543(val, _values, result); end
+ def _reduce_544(val, _values, result); end
+ def _reduce_545(val, _values, result); end
+ def _reduce_546(val, _values, result); end
+ def _reduce_547(val, _values, result); end
+ def _reduce_55(val, _values, result); end
+ def _reduce_550(val, _values, result); end
+ def _reduce_551(val, _values, result); end
+ def _reduce_552(val, _values, result); end
+ def _reduce_553(val, _values, result); end
+ def _reduce_554(val, _values, result); end
+ def _reduce_555(val, _values, result); end
+ def _reduce_556(val, _values, result); end
+ def _reduce_557(val, _values, result); end
+ def _reduce_56(val, _values, result); end
+ def _reduce_560(val, _values, result); end
+ def _reduce_561(val, _values, result); end
+ def _reduce_564(val, _values, result); end
+ def _reduce_565(val, _values, result); end
+ def _reduce_566(val, _values, result); end
+ def _reduce_568(val, _values, result); end
+ def _reduce_569(val, _values, result); end
+ def _reduce_57(val, _values, result); end
+ def _reduce_571(val, _values, result); end
+ def _reduce_572(val, _values, result); end
+ def _reduce_573(val, _values, result); end
+ def _reduce_574(val, _values, result); end
+ def _reduce_575(val, _values, result); end
+ def _reduce_576(val, _values, result); end
+ def _reduce_589(val, _values, result); end
+ def _reduce_59(val, _values, result); end
+ def _reduce_590(val, _values, result); end
+ def _reduce_595(val, _values, result); end
+ def _reduce_596(val, _values, result); end
+ def _reduce_6(val, _values, result); end
+ def _reduce_60(val, _values, result); end
+ def _reduce_600(val, _values, result); end
+ def _reduce_604(val, _values, result); end
+ def _reduce_61(val, _values, result); end
+ def _reduce_62(val, _values, result); end
+ def _reduce_63(val, _values, result); end
+ def _reduce_64(val, _values, result); end
+ def _reduce_65(val, _values, result); end
+ def _reduce_66(val, _values, result); end
+ def _reduce_67(val, _values, result); end
+ def _reduce_68(val, _values, result); end
+ def _reduce_69(val, _values, result); end
+ def _reduce_70(val, _values, result); end
+ def _reduce_71(val, _values, result); end
+ def _reduce_72(val, _values, result); end
+ def _reduce_73(val, _values, result); end
+ def _reduce_75(val, _values, result); end
+ def _reduce_76(val, _values, result); end
+ def _reduce_77(val, _values, result); end
+ def _reduce_78(val, _values, result); end
+ def _reduce_79(val, _values, result); end
+ def _reduce_8(val, _values, result); end
+ def _reduce_80(val, _values, result); end
+ def _reduce_81(val, _values, result); end
+ def _reduce_82(val, _values, result); end
+ def _reduce_83(val, _values, result); end
+ def _reduce_85(val, _values, result); end
+ def _reduce_86(val, _values, result); end
+ def _reduce_87(val, _values, result); end
+ def _reduce_88(val, _values, result); end
+ def _reduce_89(val, _values, result); end
+ def _reduce_9(val, _values, result); end
+ def _reduce_90(val, _values, result); end
+ def _reduce_91(val, _values, result); end
+ def _reduce_92(val, _values, result); end
+ def _reduce_93(val, _values, result); end
+ def _reduce_94(val, _values, result); end
+ def _reduce_95(val, _values, result); end
+ def _reduce_96(val, _values, result); end
+ def _reduce_97(val, _values, result); end
+ def _reduce_98(val, _values, result); end
+ def _reduce_99(val, _values, result); end
+ def _reduce_none(val, _values, result); end
+ def default_encoding; end
+ def version; end
+end
diff --git a/sorbet/rbi/gems/pry.rbi b/sorbet/rbi/gems/pry.rbi
new file mode 100644
index 0000000..cc7c02f
--- /dev/null
+++ b/sorbet/rbi/gems/pry.rbi
@@ -0,0 +1,1898 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/pry/all/pry.rbi
+#
+# pry-0.14.1
+
+class Pry
+ def add_sticky_local(name, &block); end
+ def backtrace; end
+ def backtrace=(arg0); end
+ def binding_stack; end
+ def binding_stack=(arg0); end
+ def color(*args, &block); end
+ def color=(*args, &block); end
+ def commands(*args, &block); end
+ def commands=(*args, &block); end
+ def complete(str); end
+ def config; end
+ def current_binding; end
+ def current_context; end
+ def custom_completions; end
+ def custom_completions=(arg0); end
+ def editor(*args, &block); end
+ def editor=(*args, &block); end
+ def ensure_correct_encoding!(val); end
+ def eval(line, options = nil); end
+ def eval_string; end
+ def eval_string=(arg0); end
+ def evaluate_ruby(code); end
+ def exception_handler(*args, &block); end
+ def exception_handler=(*args, &block); end
+ def exec_hook(name, *args, &block); end
+ def exit_value; end
+ def extra_sticky_locals(*args, &block); end
+ def extra_sticky_locals=(*args, &block); end
+ def generate_prompt(prompt_proc, conf); end
+ def handle_line(line, options); end
+ def hooks(*args, &block); end
+ def hooks=(*args, &block); end
+ def initialize(options = nil); end
+ def inject_local(name, value, binding); end
+ def inject_sticky_locals!; end
+ def input(*args, &block); end
+ def input=(*args, &block); end
+ def input_ring; end
+ def last_dir; end
+ def last_dir=(arg0); end
+ def last_exception; end
+ def last_exception=(exception); end
+ def last_file; end
+ def last_file=(arg0); end
+ def last_result; end
+ def last_result=(arg0); end
+ def last_result_is_exception?; end
+ def memory_size; end
+ def memory_size=(size); end
+ def output; end
+ def output=(*args, &block); end
+ def output_ring; end
+ def pager; end
+ def pager=(*args, &block); end
+ def pop_prompt; end
+ def print(*args, &block); end
+ def print=(*args, &block); end
+ def process_command(val); end
+ def process_command_safely(val); end
+ def prompt; end
+ def prompt=(new_prompt); end
+ def prompt_stack; end
+ def push_binding(object); end
+ def push_initial_binding(target = nil); end
+ def push_prompt(new_prompt); end
+ def quiet?; end
+ def raise_up!(*args); end
+ def raise_up(*args); end
+ def raise_up_common(force, *args); end
+ def repl(target = nil); end
+ def reset_eval_string; end
+ def run_command(val); end
+ def select_prompt; end
+ def self.Code(obj); end
+ def self.Method(obj); end
+ def self.WrappedModule(obj); end
+ def self.auto_resize!; end
+ def self.binding_for(target); end
+ def self.cli; end
+ def self.cli=(arg0); end
+ def self.color(*args, &block); end
+ def self.color=(*args, &block); end
+ def self.commands(*args, &block); end
+ def self.commands=(*args, &block); end
+ def self.config; end
+ def self.config=(arg0); end
+ def self.configure; end
+ def self.critical_section; end
+ def self.current; end
+ def self.current_line; end
+ def self.current_line=(arg0); end
+ def self.custom_completions; end
+ def self.custom_completions=(arg0); end
+ def self.editor(*args, &block); end
+ def self.editor=(*args, &block); end
+ def self.eval_path; end
+ def self.eval_path=(arg0); end
+ def self.exception_handler(*args, &block); end
+ def self.exception_handler=(*args, &block); end
+ def self.extra_sticky_locals(*args, &block); end
+ def self.extra_sticky_locals=(*args, &block); end
+ def self.final_session_setup; end
+ def self.history(*args, &block); end
+ def self.history=(*args, &block); end
+ def self.hooks(*args, &block); end
+ def self.hooks=(*args, &block); end
+ def self.in_critical_section?; end
+ def self.init; end
+ def self.initial_session?; end
+ def self.initial_session_setup; end
+ def self.input(*args, &block); end
+ def self.input=(*args, &block); end
+ def self.last_internal_error; end
+ def self.last_internal_error=(arg0); end
+ def self.line_buffer; end
+ def self.line_buffer=(arg0); end
+ def self.load_file_at_toplevel(file); end
+ def self.load_file_through_repl(file_name); end
+ def self.load_history; end
+ def self.load_rc_files; end
+ def self.load_requires; end
+ def self.load_traps; end
+ def self.load_win32console; end
+ def self.main; end
+ def self.memory_size(*args, &block); end
+ def self.memory_size=(*args, &block); end
+ def self.output(*args, &block); end
+ def self.output=(*args, &block); end
+ def self.pager(*args, &block); end
+ def self.pager=(*args, &block); end
+ def self.print(*args, &block); end
+ def self.print=(*args, &block); end
+ def self.prompt(*args, &block); end
+ def self.prompt=(*args, &block); end
+ def self.quiet; end
+ def self.quiet=(arg0); end
+ def self.rc_files_to_load; end
+ def self.real_path_to(file); end
+ def self.reset_defaults; end
+ def self.run_command(command_string, options = nil); end
+ def self.start(target = nil, options = nil); end
+ def self.toplevel_binding; end
+ def self.toplevel_binding=(arg0); end
+ def self.view_clip(obj, options = nil); end
+ def set_last_result(result, code = nil); end
+ def should_print?; end
+ def show_result(result); end
+ def sticky_locals; end
+ def suppress_output; end
+ def suppress_output=(arg0); end
+ def update_input_history(code); end
+ extend Pry::Forwardable
+end
+class Pry::LastException < BasicObject
+ def bt_index; end
+ def bt_index=(arg0); end
+ def bt_source_location_for(index); end
+ def file; end
+ def inc_bt_index; end
+ def initialize(exception); end
+ def line; end
+ def method_missing(name, *args, &block); end
+ def respond_to_missing?(name, include_all = nil); end
+ def wrapped_exception; end
+end
+module Pry::Forwardable
+ def def_private_delegators(target, *private_delegates); end
+ include Forwardable
+end
+module Pry::Helpers
+ def self.tablify(things, line_length, pry_instance = nil); end
+ def self.tablify_or_one_line(heading, things, pry_instance = nil); end
+ def self.tablify_to_screen_width(things, options, pry_instance = nil); end
+end
+module Pry::Helpers::BaseHelpers
+ def colorize_code(code); end
+ def find_command(name, set = nil); end
+ def heading(text); end
+ def highlight(string, regexp, highlight_color = nil); end
+ def not_a_real_file?(file); end
+ def safe_send(obj, method, *args, &block); end
+ def silence_warnings; end
+ def stagger_output(text, _out = nil); end
+ def use_ansi_codes?; end
+ extend Pry::Helpers::BaseHelpers
+end
+module Pry::Helpers::DocumentationHelpers
+ def get_comment_content(comment); end
+ def process_comment_markup(comment); end
+ def process_rdoc(comment); end
+ def process_yardoc(comment); end
+ def process_yardoc_tag(comment, tag); end
+ def self.get_comment_content(comment); end
+ def self.process_comment_markup(comment); end
+ def self.process_rdoc(comment); end
+ def self.process_yardoc(comment); end
+ def self.process_yardoc_tag(comment, tag); end
+ def self.strip_comments_from_c_code(code); end
+ def self.strip_leading_whitespace(text); end
+ def strip_comments_from_c_code(code); end
+ def strip_leading_whitespace(text); end
+end
+module Pry::Helpers::OptionsHelpers
+ def method_object; end
+ def method_options(opt); end
+ def self.method_object; end
+ def self.method_options(opt); end
+end
+module Pry::Helpers::CommandHelpers
+ def absolute_index_number(line_number, array_length); end
+ def absolute_index_range(range_or_number, array_length); end
+ def get_method_or_raise(method_name, context, opts = nil); end
+ def internal_binding?(context); end
+ def one_index_number(line_number); end
+ def one_index_range(range); end
+ def one_index_range_or_number(range_or_number); end
+ def restrict_to_lines(content, lines); end
+ def set_file_and_dir_locals(file_name, pry = nil, ctx = nil); end
+ def temp_file(ext = nil); end
+ def unindent(dirty_text, left_padding = nil); end
+ extend Pry::Helpers::CommandHelpers
+ include Pry::Helpers::OptionsHelpers
+end
+module Pry::Helpers::Text
+ def black(text); end
+ def black_on_black(text); end
+ def black_on_blue(text); end
+ def black_on_cyan(text); end
+ def black_on_green(text); end
+ def black_on_magenta(text); end
+ def black_on_purple(text); end
+ def black_on_red(text); end
+ def black_on_white(text); end
+ def black_on_yellow(text); end
+ def blue(text); end
+ def blue_on_black(text); end
+ def blue_on_blue(text); end
+ def blue_on_cyan(text); end
+ def blue_on_green(text); end
+ def blue_on_magenta(text); end
+ def blue_on_purple(text); end
+ def blue_on_red(text); end
+ def blue_on_white(text); end
+ def blue_on_yellow(text); end
+ def bold(text); end
+ def bright_black(text); end
+ def bright_black_on_black(text); end
+ def bright_black_on_blue(text); end
+ def bright_black_on_cyan(text); end
+ def bright_black_on_green(text); end
+ def bright_black_on_magenta(text); end
+ def bright_black_on_purple(text); end
+ def bright_black_on_red(text); end
+ def bright_black_on_white(text); end
+ def bright_black_on_yellow(text); end
+ def bright_blue(text); end
+ def bright_blue_on_black(text); end
+ def bright_blue_on_blue(text); end
+ def bright_blue_on_cyan(text); end
+ def bright_blue_on_green(text); end
+ def bright_blue_on_magenta(text); end
+ def bright_blue_on_purple(text); end
+ def bright_blue_on_red(text); end
+ def bright_blue_on_white(text); end
+ def bright_blue_on_yellow(text); end
+ def bright_cyan(text); end
+ def bright_cyan_on_black(text); end
+ def bright_cyan_on_blue(text); end
+ def bright_cyan_on_cyan(text); end
+ def bright_cyan_on_green(text); end
+ def bright_cyan_on_magenta(text); end
+ def bright_cyan_on_purple(text); end
+ def bright_cyan_on_red(text); end
+ def bright_cyan_on_white(text); end
+ def bright_cyan_on_yellow(text); end
+ def bright_green(text); end
+ def bright_green_on_black(text); end
+ def bright_green_on_blue(text); end
+ def bright_green_on_cyan(text); end
+ def bright_green_on_green(text); end
+ def bright_green_on_magenta(text); end
+ def bright_green_on_purple(text); end
+ def bright_green_on_red(text); end
+ def bright_green_on_white(text); end
+ def bright_green_on_yellow(text); end
+ def bright_magenta(text); end
+ def bright_magenta_on_black(text); end
+ def bright_magenta_on_blue(text); end
+ def bright_magenta_on_cyan(text); end
+ def bright_magenta_on_green(text); end
+ def bright_magenta_on_magenta(text); end
+ def bright_magenta_on_purple(text); end
+ def bright_magenta_on_red(text); end
+ def bright_magenta_on_white(text); end
+ def bright_magenta_on_yellow(text); end
+ def bright_purple(text); end
+ def bright_purple_on_black(text); end
+ def bright_purple_on_blue(text); end
+ def bright_purple_on_cyan(text); end
+ def bright_purple_on_green(text); end
+ def bright_purple_on_magenta(text); end
+ def bright_purple_on_purple(text); end
+ def bright_purple_on_red(text); end
+ def bright_purple_on_white(text); end
+ def bright_purple_on_yellow(text); end
+ def bright_red(text); end
+ def bright_red_on_black(text); end
+ def bright_red_on_blue(text); end
+ def bright_red_on_cyan(text); end
+ def bright_red_on_green(text); end
+ def bright_red_on_magenta(text); end
+ def bright_red_on_purple(text); end
+ def bright_red_on_red(text); end
+ def bright_red_on_white(text); end
+ def bright_red_on_yellow(text); end
+ def bright_white(text); end
+ def bright_white_on_black(text); end
+ def bright_white_on_blue(text); end
+ def bright_white_on_cyan(text); end
+ def bright_white_on_green(text); end
+ def bright_white_on_magenta(text); end
+ def bright_white_on_purple(text); end
+ def bright_white_on_red(text); end
+ def bright_white_on_white(text); end
+ def bright_white_on_yellow(text); end
+ def bright_yellow(text); end
+ def bright_yellow_on_black(text); end
+ def bright_yellow_on_blue(text); end
+ def bright_yellow_on_cyan(text); end
+ def bright_yellow_on_green(text); end
+ def bright_yellow_on_magenta(text); end
+ def bright_yellow_on_purple(text); end
+ def bright_yellow_on_red(text); end
+ def bright_yellow_on_white(text); end
+ def bright_yellow_on_yellow(text); end
+ def cyan(text); end
+ def cyan_on_black(text); end
+ def cyan_on_blue(text); end
+ def cyan_on_cyan(text); end
+ def cyan_on_green(text); end
+ def cyan_on_magenta(text); end
+ def cyan_on_purple(text); end
+ def cyan_on_red(text); end
+ def cyan_on_white(text); end
+ def cyan_on_yellow(text); end
+ def default(text); end
+ def green(text); end
+ def green_on_black(text); end
+ def green_on_blue(text); end
+ def green_on_cyan(text); end
+ def green_on_green(text); end
+ def green_on_magenta(text); end
+ def green_on_purple(text); end
+ def green_on_red(text); end
+ def green_on_white(text); end
+ def green_on_yellow(text); end
+ def indent(text, chars); end
+ def magenta(text); end
+ def magenta_on_black(text); end
+ def magenta_on_blue(text); end
+ def magenta_on_cyan(text); end
+ def magenta_on_green(text); end
+ def magenta_on_magenta(text); end
+ def magenta_on_purple(text); end
+ def magenta_on_red(text); end
+ def magenta_on_white(text); end
+ def magenta_on_yellow(text); end
+ def no_color; end
+ def no_pager; end
+ def purple(text); end
+ def purple_on_black(text); end
+ def purple_on_blue(text); end
+ def purple_on_cyan(text); end
+ def purple_on_green(text); end
+ def purple_on_magenta(text); end
+ def purple_on_purple(text); end
+ def purple_on_red(text); end
+ def purple_on_white(text); end
+ def purple_on_yellow(text); end
+ def red(text); end
+ def red_on_black(text); end
+ def red_on_blue(text); end
+ def red_on_cyan(text); end
+ def red_on_green(text); end
+ def red_on_magenta(text); end
+ def red_on_purple(text); end
+ def red_on_red(text); end
+ def red_on_white(text); end
+ def red_on_yellow(text); end
+ def strip_color(text); end
+ def white(text); end
+ def white_on_black(text); end
+ def white_on_blue(text); end
+ def white_on_cyan(text); end
+ def white_on_green(text); end
+ def white_on_magenta(text); end
+ def white_on_purple(text); end
+ def white_on_red(text); end
+ def white_on_white(text); end
+ def white_on_yellow(text); end
+ def with_line_numbers(text, offset, color = nil); end
+ def yellow(text); end
+ def yellow_on_black(text); end
+ def yellow_on_blue(text); end
+ def yellow_on_cyan(text); end
+ def yellow_on_green(text); end
+ def yellow_on_magenta(text); end
+ def yellow_on_purple(text); end
+ def yellow_on_red(text); end
+ def yellow_on_white(text); end
+ def yellow_on_yellow(text); end
+ extend Pry::Helpers::Text
+end
+class Pry::Helpers::Table
+ def ==(other); end
+ def _max_width(things); end
+ def _rebuild_colorless_cache; end
+ def _recall_color_for(thing); end
+ def _recolumn; end
+ def column_count; end
+ def column_count=(count); end
+ def columns; end
+ def fits_on_line?(line_length); end
+ def initialize(items, args, pry_instance = nil); end
+ def items; end
+ def items=(items); end
+ def rows_to_s(style = nil); end
+ def to_a; end
+ def to_s; end
+end
+module Pry::Helpers::Platform
+ def self.jruby?; end
+ def self.jruby_19?; end
+ def self.linux?; end
+ def self.mac_osx?; end
+ def self.mri?; end
+ def self.mri_19?; end
+ def self.mri_2?; end
+ def self.windows?; end
+ def self.windows_ansi?; end
+end
+class Pry::BasicObject < BasicObject
+ include Kernel
+end
+class Pry::Prompt
+ def [](key); end
+ def description; end
+ def incomplete_proc; end
+ def initialize(name, description, prompt_procs); end
+ def name; end
+ def prompt_procs; end
+ def self.[](name); end
+ def self.add(name, description = nil, separators = nil); end
+ def self.all; end
+ def wait_proc; end
+end
+class Pry::CodeObject
+ def command_lookup; end
+ def default_lookup; end
+ def empty_lookup; end
+ def initialize(str, pry_instance, options = nil); end
+ def looks_like_an_instance_method?(str); end
+ def lookup_super(obj, super_level); end
+ def method_or_class_lookup; end
+ def pry_instance; end
+ def pry_instance=(arg0); end
+ def safe_to_evaluate?(str); end
+ def self.lookup(str, pry_instance, options = nil); end
+ def sourcable_object?(obj); end
+ def str; end
+ def str=(arg0); end
+ def super_level; end
+ def super_level=(arg0); end
+ def target; end
+ def target=(arg0); end
+ def target_self; end
+ include Pry::Helpers::CommandHelpers
+end
+module Pry::CodeObject::Helpers
+ def c_method?; end
+ def c_module?; end
+ def command?; end
+ def module_with_yard_docs?; end
+ def real_method_object?; end
+end
+module Pry::RescuableException
+ def self.===(exception); end
+end
+module Pry::TooSafeException
+ def self.===(exception); end
+end
+module Pry::UserError
+end
+module Pry::FrozenObjectException
+ def self.===(exception); end
+end
+class Pry::CommandError < StandardError
+end
+class Pry::MethodNotFound < Pry::CommandError
+end
+class Pry::ObsoleteError < StandardError
+end
+class Pry::Hooks
+ def add_hook(event_name, hook_name, callable = nil, &block); end
+ def clear_event_hooks(event_name); end
+ def delete_hook(event_name, hook_name); end
+ def errors; end
+ def exec_hook(event_name, *args, &block); end
+ def get_hook(event_name, hook_name); end
+ def get_hooks(event_name); end
+ def hook_count(event_name); end
+ def hook_exists?(event_name, hook_name); end
+ def hooks; end
+ def initialize; end
+ def initialize_copy(_orig); end
+ def merge!(other); end
+ def merge(other); end
+ def self.default; end
+end
+class Pry::InputCompleter
+ def build_path(input); end
+ def call(str, options = nil); end
+ def ignored_modules; end
+ def initialize(input, pry = nil); end
+ def select_message(path, receiver, message, candidates); end
+end
+class Pry::Command
+ def _pry_; end
+ def _pry_=(arg0); end
+ def after_hooks; end
+ def arg_string; end
+ def arg_string=(arg0); end
+ def before_hooks; end
+ def block; end
+ def call_safely(*args); end
+ def call_with_hooks(*args); end
+ def captures; end
+ def captures=(arg0); end
+ def check_for_command_collision(command_match, arg_string); end
+ def command_block; end
+ def command_block=(arg0); end
+ def command_name; end
+ def command_options; end
+ def command_set; end
+ def command_set=(arg0); end
+ def commands; end
+ def complete(_search); end
+ def context; end
+ def context=(arg0); end
+ def description; end
+ def eval_string; end
+ def eval_string=(arg0); end
+ def find_hooks(event); end
+ def hooks; end
+ def hooks=(arg0); end
+ def initialize(context = nil); end
+ def interpolate_string(str); end
+ def match; end
+ def name; end
+ def normalize_method_args(method, args); end
+ def output; end
+ def output=(arg0); end
+ def pass_block(arg_string); end
+ def process_line(line); end
+ def pry_instance; end
+ def pry_instance=(arg0); end
+ def run(command_string, *args); end
+ def self.banner(arg = nil); end
+ def self.block; end
+ def self.block=(arg0); end
+ def self.command_name; end
+ def self.command_options(arg = nil); end
+ def self.command_options=(arg0); end
+ def self.command_regex; end
+ def self.convert_to_regex(obj); end
+ def self.default_options(match); end
+ def self.description(arg = nil); end
+ def self.description=(arg0); end
+ def self.doc; end
+ def self.file; end
+ def self.group(name = nil); end
+ def self.inspect; end
+ def self.line; end
+ def self.match(arg = nil); end
+ def self.match=(arg0); end
+ def self.match_score(val); end
+ def self.matches?(val); end
+ def self.name; end
+ def self.options(arg = nil); end
+ def self.options=(arg0); end
+ def self.source; end
+ def self.source_file; end
+ def self.source_line; end
+ def self.state; end
+ def self.subclass(match, description, options, helpers, &block); end
+ def source; end
+ def state; end
+ def target; end
+ def target=(arg0); end
+ def target_self; end
+ def tokenize(val); end
+ def use_unpatched_symbol; end
+ def void; end
+ extend Pry::CodeObject::Helpers
+ extend Pry::Helpers::DocumentationHelpers
+ include Pry::Helpers::BaseHelpers
+ include Pry::Helpers::CommandHelpers
+ include Pry::Helpers::Text
+end
+class Pry::ClassCommand < Pry::Command
+ def args; end
+ def args=(arg0); end
+ def call(*args); end
+ def complete(search); end
+ def help; end
+ def options(opt); end
+ def opts; end
+ def opts=(arg0); end
+ def process; end
+ def self.doc; end
+ def self.file; end
+ def self.inherited(klass); end
+ def self.line; end
+ def self.source; end
+ def self.source_file; end
+ def self.source_line; end
+ def self.source_location; end
+ def self.source_object; end
+ def setup; end
+ def slop; end
+ def subcommands(cmd); end
+end
+class Pry::BlockCommand < Pry::Command
+ def call(*args); end
+ def help; end
+end
+class Pry::NoCommandError < StandardError
+ def initialize(match, owner); end
+end
+class Pry::CommandSet
+ def [](pattern); end
+ def []=(pattern, command); end
+ def add_command(command); end
+ def alias_command(match, action, options = nil); end
+ def block_command(match, description = nil, options = nil, &block); end
+ def command(match, description = nil, options = nil, &block); end
+ def complete(search, context = nil); end
+ def create_command(match, description = nil, options = nil, &block); end
+ def delete(*searches); end
+ def desc(search, description = nil); end
+ def each(&block); end
+ def find_command(pattern); end
+ def find_command_by_match_or_listing(match_or_listing); end
+ def find_command_for_help(search); end
+ def helper_module; end
+ def helpers(&block); end
+ def import(*sets); end
+ def import_from(set, *matches); end
+ def initialize(*imported_sets, &block); end
+ def keys; end
+ def list_commands; end
+ def process_line(val, context = nil); end
+ def rename_command(new_match, search, options = nil); end
+ def to_h; end
+ def to_hash; end
+ def valid_command?(val); end
+ include Enumerable
+ include Pry::Helpers::BaseHelpers
+end
+class Pry::Result
+ def command?; end
+ def initialize(is_command, retval = nil); end
+ def retval; end
+ def void_command?; end
+end
+class Pry::SyntaxHighlighter
+ def self.highlight(code, language = nil); end
+ def self.keyword_token_color; end
+ def self.overwrite_coderay_comment_token!; end
+ def self.tokenize(code, language = nil); end
+end
+class Pry::Editor
+ def blocking_flag_for_editor(blocking); end
+ def build_editor_invocation_string(file, line, blocking); end
+ def edit_tempfile_with_content(initial_content, line = nil); end
+ def editor_name; end
+ def initialize(pry_instance); end
+ def invoke_editor(file, line, blocking = nil); end
+ def open_editor(editor_invocation); end
+ def open_editor_on_jruby(editor_invocation); end
+ def pry_instance; end
+ def self.default; end
+ def start_line_syntax_for_editor(file_name, line_number); end
+ include Pry::Helpers::CommandHelpers
+end
+class Pry::History
+ def <<(line); end
+ def clear; end
+ def filter(history); end
+ def history_file; end
+ def history_file_path; end
+ def history_line_count; end
+ def initialize(options = nil); end
+ def invalid_readline_line?(line); end
+ def load; end
+ def loader; end
+ def loader=(arg0); end
+ def original_lines; end
+ def push(line); end
+ def read_from_file; end
+ def save_to_file(line); end
+ def saver; end
+ def saver=(arg0); end
+ def self.default_file; end
+ def session_line_count; end
+ def should_ignore?(line); end
+ def to_a; end
+end
+class Pry::ColorPrinter < PP
+ def highlight_object_literal(object_literal); end
+ def inspect_object(object); end
+ def pp(object); end
+ def self.default(_output, value, pry_instance); end
+ def self.pp(obj, output = nil, max_width = nil); end
+ def text(str, max_width = nil); end
+end
+module Pry::ExceptionHandler
+ def self.cause_text(cause); end
+ def self.exception_text(exception); end
+ def self.handle_exception(output, exception, _pry_instance); end
+ def self.standard_error_text_for(exception); end
+end
+module Pry::SystemCommandHandler
+ def self.default(output, command, _pry_instance); end
+end
+module Pry::ControlDHandler
+ def self.default(pry_instance); end
+end
+class Pry::CommandState
+ def initialize; end
+ def reset(command_name); end
+ def self.default; end
+ def state_for(command_name); end
+end
+module Pry::Warning
+ def self.warn(message); end
+end
+module Pry::Env
+ def self.[](key); end
+end
+class Pry::Command::Ls < Pry::ClassCommand
+ def error_list; end
+ def no_user_opts?; end
+ def options(opt); end
+ def process; end
+ def raise_errors_if_arguments_are_weird; end
+end
+module Pry::Command::Ls::JRubyHacks
+ def rubbishness(name); end
+ def trim_jruby_aliases(methods); end
+end
+module Pry::Command::Ls::MethodsHelper
+ def all_methods(instance_methods = nil); end
+ def format(methods); end
+ def resolution_order; end
+ include Pry::Command::Ls::JRubyHacks
+end
+module Pry::Command::Ls::Interrogatable
+ def interrogatee_mod; end
+ def interrogating_a_module?; end
+end
+class Pry::Command::Ls::Grep
+ def initialize(grep_regexp); end
+ def regexp; end
+end
+class Pry::Command::Ls::Formatter
+ def color(type, str); end
+ def correct_opts?; end
+ def format_value(value); end
+ def grep; end
+ def grep=(arg0); end
+ def initialize(pry_instance); end
+ def output_section(heading, body); end
+ def output_self; end
+ def pry_instance; end
+ def write_out; end
+end
+class Pry::Command::Ls::Globals < Pry::Command::Ls::Formatter
+ def format(globals); end
+ def initialize(opts, pry_instance); end
+ def output_self; end
+end
+class Pry::Command::Ls::Constants < Pry::Command::Ls::Formatter
+ def correct_opts?; end
+ def format(mod, constants); end
+ def initialize(interrogatee, no_user_opts, opts, pry_instance); end
+ def output_self; end
+ def show_deprecated_constants?; end
+ include Pry::Command::Ls::Interrogatable
+end
+class Pry::Command::Ls::Methods < Pry::Command::Ls::Formatter
+ def below_ceiling; end
+ def correct_opts?; end
+ def initialize(interrogatee, no_user_opts, opts, pry_instance); end
+ def output_self; end
+ include Pry::Command::Ls::Interrogatable
+ include Pry::Command::Ls::MethodsHelper
+end
+class Pry::Command::Ls::SelfMethods < Pry::Command::Ls::Formatter
+ def correct_opts?; end
+ def initialize(interrogatee, no_user_opts, opts, pry_instance); end
+ def output_self; end
+ include Pry::Command::Ls::Interrogatable
+ include Pry::Command::Ls::MethodsHelper
+end
+class Pry::Command::Ls::InstanceVars < Pry::Command::Ls::Formatter
+ def correct_opts?; end
+ def format(type, vars); end
+ def initialize(interrogatee, no_user_opts, opts, pry_instance); end
+ def output_self; end
+ include Pry::Command::Ls::Interrogatable
+end
+class Pry::Command::Ls::LocalNames < Pry::Command::Ls::Formatter
+ def correct_opts?; end
+ def format(locals); end
+ def initialize(no_user_opts, args, pry_instance); end
+ def output_self; end
+end
+class Pry::Command::Ls::LocalVars < Pry::Command::Ls::Formatter
+ def colorized_assignment_style(lhs, rhs, desired_width = nil); end
+ def format(name_value_pairs); end
+ def initialize(opts, pry_instance); end
+ def output_self; end
+end
+class Pry::Command::Ls::LsEntity
+ def constants; end
+ def entities; end
+ def entities_table; end
+ def globals; end
+ def grep(entity); end
+ def initialize(opts); end
+ def instance_vars; end
+ def local_names; end
+ def local_vars; end
+ def methods; end
+ def pry_instance; end
+ def self_methods; end
+end
+class Pry::Config
+ def [](attr); end
+ def []=(attr, value); end
+ def auto_indent; end
+ def auto_indent=(arg0); end
+ def collision_warning; end
+ def collision_warning=(arg0); end
+ def color; end
+ def color=(arg0); end
+ def command_completions; end
+ def command_completions=(arg0); end
+ def command_prefix; end
+ def command_prefix=(arg0); end
+ def commands; end
+ def commands=(arg0); end
+ def completer; end
+ def completer=(arg0); end
+ def control_d_handler; end
+ def control_d_handler=(value); end
+ def correct_indent; end
+ def correct_indent=(arg0); end
+ def default_rc_file; end
+ def default_window_size; end
+ def default_window_size=(arg0); end
+ def disable_auto_reload; end
+ def disable_auto_reload=(arg0); end
+ def editor; end
+ def editor=(arg0); end
+ def exception_handler; end
+ def exception_handler=(arg0); end
+ def exception_whitelist; end
+ def exception_whitelist=(arg0); end
+ def exec_string; end
+ def exec_string=(arg0); end
+ def extra_sticky_locals; end
+ def extra_sticky_locals=(arg0); end
+ def file_completions; end
+ def file_completions=(arg0); end
+ def history; end
+ def history=(arg0); end
+ def history_file; end
+ def history_file=(arg0); end
+ def history_ignorelist; end
+ def history_ignorelist=(arg0); end
+ def history_load; end
+ def history_load=(arg0); end
+ def history_save; end
+ def history_save=(arg0); end
+ def hooks; end
+ def hooks=(arg0); end
+ def initialize; end
+ def initialize_dup(other); end
+ def input; end
+ def input=(arg0); end
+ def lazy_readline; end
+ def ls; end
+ def ls=(arg0); end
+ def memory_size; end
+ def memory_size=(arg0); end
+ def merge!(config_hash); end
+ def merge(config_hash); end
+ def method_missing(method_name, *args, &_block); end
+ def output; end
+ def output=(arg0); end
+ def output_prefix; end
+ def output_prefix=(arg0); end
+ def pager; end
+ def pager=(arg0); end
+ def print; end
+ def print=(arg0); end
+ def prompt; end
+ def prompt=(arg0); end
+ def prompt_name; end
+ def prompt_name=(arg0); end
+ def prompt_safe_contexts; end
+ def prompt_safe_contexts=(arg0); end
+ def quiet; end
+ def quiet=(arg0); end
+ def rc_file; end
+ def rc_file=(arg0); end
+ def requires; end
+ def requires=(arg0); end
+ def respond_to_missing?(method_name, include_all = nil); end
+ def should_load_local_rc; end
+ def should_load_local_rc=(arg0); end
+ def should_load_rc; end
+ def should_load_rc=(arg0); end
+ def should_load_requires; end
+ def should_load_requires=(arg0); end
+ def should_trap_interrupts; end
+ def should_trap_interrupts=(arg0); end
+ def system; end
+ def system=(arg0); end
+ def unrescued_exceptions; end
+ def unrescued_exceptions=(arg0); end
+ def windows_console_warning; end
+ def windows_console_warning=(arg0); end
+ extend Pry::Config::Attributable
+end
+module Pry::Config::Attributable
+ def attribute(attr_name); end
+end
+class Pry::Config::Value
+ def call; end
+ def initialize(value); end
+end
+class Pry::Config::MemoizedValue
+ def call; end
+ def initialize(&block); end
+end
+class Pry::Config::LazyValue
+ def call; end
+ def initialize(&block); end
+end
+class Pry::Inspector
+end
+class Pry::Pager
+ def best_available; end
+ def enabled?; end
+ def initialize(pry_instance); end
+ def open; end
+ def output; end
+ def page(text); end
+ def pry_instance; end
+end
+class Pry::Pager::StopPaging < StandardError
+end
+class Pry::Pager::NullPager
+ def <<(str); end
+ def close; end
+ def height; end
+ def initialize(out); end
+ def print(str); end
+ def puts(str); end
+ def width; end
+ def write(str); end
+end
+class Pry::Pager::SimplePager < Pry::Pager::NullPager
+ def initialize(*arg0); end
+ def write(str); end
+end
+class Pry::Pager::SystemPager < Pry::Pager::NullPager
+ def close; end
+ def initialize(*arg0); end
+ def invoked_pager?; end
+ def pager; end
+ def self.available?; end
+ def self.default_pager; end
+ def write(str); end
+ def write_to_pager(text); end
+end
+class Pry::Pager::PageTracker
+ def initialize(rows, cols); end
+ def line_length(line); end
+ def page?; end
+ def record(str); end
+ def reset; end
+end
+class Pry::Indent
+ def correct_indentation(prompt, code, overhang = nil); end
+ def current_prefix; end
+ def end_of_statement?(last_token, last_kind); end
+ def in_string?; end
+ def indent(input); end
+ def indent_level; end
+ def indentation_delta(tokens); end
+ def initialize(pry_instance = nil); end
+ def module_nesting; end
+ def open_delimiters; end
+ def open_delimiters_line; end
+ def reset; end
+ def self.indent(str); end
+ def self.nesting_at(str, line_number); end
+ def stack; end
+ def tokenize(string); end
+ def track_delimiter(token); end
+ def track_module_nesting(token, kind); end
+ def track_module_nesting_end(token, kind = nil); end
+ include Pry::Helpers::BaseHelpers
+end
+class Pry::Indent::UnparseableNestingError < StandardError
+end
+class Pry::ObjectPath
+ def complete?(segment); end
+ def handle_failure(context, err); end
+ def initialize(path_string, current_stack); end
+ def resolve; end
+end
+class Pry::Output
+ def <<(*objs); end
+ def actual_screen_size; end
+ def ansicon_env_size; end
+ def decolorize_maybe(str); end
+ def env_size; end
+ def height; end
+ def initialize(pry_instance); end
+ def io_console_size; end
+ def method_missing(method_name, *args, &block); end
+ def nonzero_column?(size); end
+ def print(*objs); end
+ def pry_instance; end
+ def puts(*objs); end
+ def readline_size; end
+ def respond_to_missing?(method_name, include_private = nil); end
+ def size; end
+ def tty?; end
+ def width; end
+ def write(*objs); end
+end
+class Pry::InputLock
+ def __with_ownership; end
+ def enter_interruptible_region; end
+ def initialize; end
+ def interruptible_region; end
+ def leave_interruptible_region; end
+ def self.for(input); end
+ def self.global_lock; end
+ def self.global_lock=(arg0); end
+ def self.input_locks; end
+ def self.input_locks=(arg0); end
+ def with_ownership(&block); end
+end
+class Pry::InputLock::Interrupt < Exception
+end
+class Pry::REPL
+ def calculate_overhang(current_prompt, original_val, indented_val); end
+ def coolline_available?; end
+ def epilogue; end
+ def handle_read_errors; end
+ def initialize(pry, options = nil); end
+ def input(*args, &block); end
+ def input_readline(*args); end
+ def output(*args, &block); end
+ def piping?; end
+ def prologue; end
+ def pry; end
+ def pry=(arg0); end
+ def read; end
+ def read_line(current_prompt); end
+ def readline_available?; end
+ def repl; end
+ def self.start(options); end
+ def set_readline_output; end
+ def start; end
+ extend Pry::Forwardable
+end
+class Pry::Code
+ def <<(line); end
+ def ==(other); end
+ def after(lineno, lines = nil); end
+ def alter(&block); end
+ def around(lineno, lines = nil); end
+ def before(lineno, lines = nil); end
+ def between(start_line, end_line = nil); end
+ def code_type; end
+ def code_type=(arg0); end
+ def comment_describing(line_number); end
+ def expression_at(line_number, consume = nil); end
+ def grep(pattern); end
+ def highlighted; end
+ def initialize(lines = nil, start_line = nil, code_type = nil); end
+ def length; end
+ def max_lineno_width; end
+ def method_missing(method_name, *args, &block); end
+ def nesting_at(line_number); end
+ def print_to_output(output, color = nil); end
+ def push(line); end
+ def raw; end
+ def reject(&block); end
+ def respond_to_missing?(method_name, include_private = nil); end
+ def select(&block); end
+ def self.from_file(filename, code_type = nil); end
+ def self.from_method(meth, start_line = nil); end
+ def self.from_module(mod, candidate_rank = nil, start_line = nil); end
+ def take_lines(start_line, num_lines); end
+ def to_s; end
+ def with_indentation(spaces = nil); end
+ def with_line_numbers(y_n = nil); end
+ def with_marker(lineno = nil); end
+end
+class Pry::Ring
+ def <<(value); end
+ def [](index); end
+ def clear; end
+ def count; end
+ def initialize(max_size); end
+ def max_size; end
+ def size; end
+ def to_a; end
+ def transpose_buffer_tail; end
+end
+class Pry::Method
+ def ==(other); end
+ def alias?; end
+ def aliases; end
+ def bound_method?; end
+ def c_source; end
+ def comment; end
+ def doc; end
+ def dynamically_defined?; end
+ def initialize(method, known_info = nil); end
+ def is_a?(klass); end
+ def kind_of?(klass); end
+ def method_missing(method_name, *args, &block); end
+ def method_name_from_first_line(first_ln); end
+ def name; end
+ def name_with_owner; end
+ def original_name; end
+ def owner(*args, &block); end
+ def parameters(*args, &block); end
+ def pry_doc_info; end
+ def pry_method?; end
+ def receiver(*args, &block); end
+ def redefine(source); end
+ def respond_to?(method_name, include_all = nil); end
+ def respond_to_missing?(method_name, include_private = nil); end
+ def ruby_source; end
+ def self.all_from_class(klass, include_super = nil); end
+ def self.all_from_obj(obj, include_super = nil); end
+ def self.from_binding(binding); end
+ def self.from_class(klass, name, target = nil); end
+ def self.from_module(klass, name, target = nil); end
+ def self.from_obj(obj, name, target = nil); end
+ def self.from_str(name, target = nil, options = nil); end
+ def self.instance_method_definition?(name, definition_line); end
+ def self.instance_resolution_order(klass); end
+ def self.lookup_method_via_binding(obj, method_name, method_type, target = nil); end
+ def self.method_definition?(name, definition_line); end
+ def self.resolution_order(obj); end
+ def self.singleton_class_of(obj); end
+ def self.singleton_class_resolution_order(klass); end
+ def self.singleton_method_definition?(name, definition_line); end
+ def signature; end
+ def singleton_method?; end
+ def source; end
+ def source?; end
+ def source_file; end
+ def source_line; end
+ def source_range; end
+ def source_type; end
+ def super(times = nil); end
+ def super_using_ancestors(ancestors, times = nil); end
+ def unbound_method?; end
+ def undefined?; end
+ def visibility; end
+ def wrapped; end
+ def wrapped_owner; end
+ extend Pry::Forwardable
+ extend Pry::Helpers::BaseHelpers
+ include Pry::CodeObject::Helpers
+ include Pry::Helpers::BaseHelpers
+ include Pry::Helpers::DocumentationHelpers
+end
+class Pry::WrappedModule
+ def all_methods_for(mod); end
+ def all_relevant_methods_for(mod); end
+ def all_source_locations_by_popularity; end
+ def candidate(rank); end
+ def candidates; end
+ def class?; end
+ def constants(inherit = nil); end
+ def doc; end
+ def file; end
+ def initialize(mod); end
+ def line; end
+ def lines_for_file(file); end
+ def method_candidates; end
+ def method_defined_by_forwardable_module?(method); end
+ def method_missing(method_name, *args, &block); end
+ def method_prefix; end
+ def module?; end
+ def nested_module?(parent, name); end
+ def nonblank_name; end
+ def number_of_candidates; end
+ def primary_candidate; end
+ def respond_to_missing?(method_name, include_private = nil); end
+ def self.from_str(mod_name, target = nil); end
+ def self.safe_to_evaluate?(str, target); end
+ def singleton_class?; end
+ def singleton_instance; end
+ def source; end
+ def source_file; end
+ def source_line; end
+ def source_location; end
+ def super(times = nil); end
+ def wrapped; end
+ def yard_doc; end
+ def yard_docs?; end
+ def yard_file; end
+ def yard_line; end
+ include Pry::CodeObject::Helpers
+ include Pry::Helpers::BaseHelpers
+end
+class Pry::WrappedModule::Candidate
+ def class?(*args, &block); end
+ def class_regexes; end
+ def doc; end
+ def file; end
+ def first_line_of_module_definition(file, line); end
+ def first_method_source_location; end
+ def initialize(wrapper, rank); end
+ def last_method_source_location; end
+ def line; end
+ def lines_for_file(*a, &b); end
+ def method_candidates(*a, &b); end
+ def module?(*args, &block); end
+ def name(*a, &b); end
+ def nonblank_name(*args, &block); end
+ def number_of_candidates(*args, &block); end
+ def number_of_lines_in_first_chunk; end
+ def source; end
+ def source_file; end
+ def source_line; end
+ def source_location; end
+ def wrapped(*args, &block); end
+ def yard_docs?(*a, &b); end
+ extend Pry::Forwardable
+ include Pry::CodeObject::Helpers
+ include Pry::Helpers::DocumentationHelpers
+end
+class Pry::Slop
+ def [](key); end
+ def add_callback(label, &block); end
+ def autocreate(items, index); end
+ def banner(banner = nil); end
+ def banner=(banner); end
+ def build_option(objects, &block); end
+ def clean(object); end
+ def command(command, options = nil, &block); end
+ def commands_to_help; end
+ def config; end
+ def description(desc = nil); end
+ def description=(desc); end
+ def each(&block); end
+ def execute_multiple_switches(option, argument, index); end
+ def execute_option(option, argument, index, item = nil); end
+ def extract_long_flag(objects, config); end
+ def extract_option(flag); end
+ def extract_short_flag(objects, config); end
+ def fetch_command(command); end
+ def fetch_option(key); end
+ def get(key); end
+ def help; end
+ def initialize(config = nil, &block); end
+ def method_missing(method, *args, &block); end
+ def missing; end
+ def on(*objects, &block); end
+ def opt(*objects, &block); end
+ def option(*objects, &block); end
+ def options; end
+ def parse!(items = nil, &block); end
+ def parse(items = nil, &block); end
+ def present?(*keys); end
+ def process_item(items, index, &block); end
+ def respond_to_missing?(method_name, include_all = nil); end
+ def run(callable = nil, &block); end
+ def self.optspec(string, config = nil); end
+ def self.parse!(items = nil, config = nil, &block); end
+ def self.parse(items = nil, config = nil, &block); end
+ def separator(text); end
+ def strict?; end
+ def to_h(include_commands = nil); end
+ def to_hash(include_commands = nil); end
+ def to_s; end
+ include Enumerable
+end
+class Pry::Slop::Option
+ def accepts_optional_argument?; end
+ def argument_in_value; end
+ def argument_in_value=(arg0); end
+ def call(*objects); end
+ def config; end
+ def count; end
+ def count=(arg0); end
+ def description; end
+ def expects_argument?; end
+ def help; end
+ def initialize(slop, short, long, description, config = nil, &block); end
+ def inspect; end
+ def key; end
+ def long; end
+ def short; end
+ def to_s; end
+ def types; end
+ def value; end
+ def value=(new_value); end
+ def value_to_float(value); end
+ def value_to_integer(value); end
+ def value_to_range(value); end
+end
+class Pry::Slop::Commands
+ def [](key); end
+ def arguments; end
+ def banner(banner = nil); end
+ def banner=(arg0); end
+ def commands; end
+ def config; end
+ def default(config = nil, &block); end
+ def each(&block); end
+ def execute_arguments!(items); end
+ def execute_global_opts!(items); end
+ def get(key); end
+ def global(config = nil, &block); end
+ def help; end
+ def initialize(config = nil, &block); end
+ def inspect; end
+ def on(command, config = nil, &block); end
+ def parse!(items = nil); end
+ def parse(items = nil); end
+ def present?(key); end
+ def to_hash; end
+ def to_s; end
+ include Enumerable
+end
+class Pry::Slop::Error < StandardError
+end
+class Pry::Slop::MissingArgumentError < Pry::Slop::Error
+end
+class Pry::Slop::MissingOptionError < Pry::Slop::Error
+end
+class Pry::Slop::InvalidArgumentError < Pry::Slop::Error
+end
+class Pry::Slop::InvalidOptionError < Pry::Slop::Error
+end
+class Pry::Slop::InvalidCommandError < Pry::Slop::Error
+end
+class Pry::CLI
+ def self.add_option_processor(&block); end
+ def self.add_options(&block); end
+ def self.input_args; end
+ def self.input_args=(arg0); end
+ def self.option_processors; end
+ def self.option_processors=(arg0); end
+ def self.options; end
+ def self.options=(arg0); end
+ def self.parse_options(args = nil); end
+ def self.reset; end
+ def self.start(opts); end
+end
+class Pry::CLI::NoOptionsError < StandardError
+end
+class Object < BasicObject
+ def __binding__; end
+ def pry(object = nil, hash = nil); end
+end
+class BasicObject
+ def __binding__; end
+end
+class Pry::REPLFileLoader
+ def define_additional_commands; end
+ def initialize(file_name); end
+ def interactive_mode(pry_instance); end
+ def load; end
+ def non_interactive_mode(pry_instance, content); end
+end
+class Pry::Code::LOC
+ def ==(other); end
+ def add_line_number(max_width = nil, color = nil); end
+ def add_marker(marker_lineno); end
+ def colorize(code_type); end
+ def dup; end
+ def handle_multiline_entries_from_edit_command(line, max_width); end
+ def indent(distance); end
+ def initialize(line, lineno); end
+ def line; end
+ def lineno; end
+ def tuple; end
+end
+class Pry::Code::CodeRange
+ def end_line; end
+ def find_end_index(lines); end
+ def find_start_index(lines); end
+ def force_set_end_line; end
+ def indices(lines); end
+ def indices_range(lines); end
+ def initialize(start_line, end_line = nil); end
+ def set_end_line_from_range; end
+ def start_line; end
+end
+class Pry::CodeFile
+ def abs_path; end
+ def code; end
+ def code_path; end
+ def code_type; end
+ def from_load_path; end
+ def from_pry_init_pwd; end
+ def from_pwd; end
+ def initialize(filename, code_type = nil); end
+ def readable?(path); end
+ def type_from_filename(filename, default = nil); end
+end
+class Pry::Method::WeirdMethodLocator
+ def all_methods_for(obj); end
+ def expanded_source_location(source_location); end
+ def find_method; end
+ def find_method_in_superclass; end
+ def find_renamed_method; end
+ def index_to_line_number(index); end
+ def initialize(method, target); end
+ def lines_for_file(file); end
+ def lost_method?; end
+ def method; end
+ def method=(arg0); end
+ def normal_method?(method); end
+ def pry_file?; end
+ def renamed_method_source_location; end
+ def self.normal_method?(method, binding); end
+ def self.weird_method?(method, binding); end
+ def skip_superclass_search?; end
+ def target; end
+ def target=(arg0); end
+ def target_file; end
+ def target_line; end
+ def target_self; end
+ def valid_file?(file); end
+end
+class Pry::Method::Disowned < Pry::Method
+ def initialize(receiver, method_name); end
+ def method_missing(method_name, *args, &block); end
+ def name; end
+ def owner; end
+ def receiver; end
+ def respond_to_missing?(method_name, include_private = nil); end
+ def source?; end
+ def undefined?; end
+end
+class Pry::Method::Patcher
+ def cache_key; end
+ def definition_for_owner(line); end
+ def initialize(method); end
+ def method; end
+ def method=(arg0); end
+ def patch_in_ram(source); end
+ def redefine(source); end
+ def self.code_for(filename); end
+ def with_method_transaction; end
+ def wrap(source); end
+ def wrap_for_nesting(source); end
+ def wrap_for_owner(source); end
+end
+class Pry::Command::AmendLine < Pry::ClassCommand
+ def amend_input; end
+ def delete_from_array(array, range); end
+ def insert_into_array(array, range); end
+ def line_count; end
+ def line_range; end
+ def process; end
+ def replace_in_array(array, range); end
+ def start_and_end_line_number; end
+ def zero_indexed_range_from_one_indexed_numbers(start_line_number, end_line_number); end
+end
+class Pry::Command::Bang < Pry::ClassCommand
+ def process; end
+end
+class Pry::Command::BangPry < Pry::ClassCommand
+ def process; end
+end
+class Pry::Command::Cat < Pry::ClassCommand
+ def complete(search); end
+ def load_path_completions; end
+ def options(opt); end
+ def process; end
+end
+class Pry::Command::Cat::AbstractFormatter
+ def between_lines; end
+ def code_type; end
+ def decorate(content); end
+ def use_line_numbers?; end
+ include Pry::Helpers::BaseHelpers
+ include Pry::Helpers::CommandHelpers
+end
+class Pry::Command::Cat::InputExpressionFormatter < Pry::Command::Cat::AbstractFormatter
+ def format; end
+ def initialize(input_expressions, opts); end
+ def input_expressions; end
+ def input_expressions=(arg0); end
+ def normalized_expression_range; end
+ def numbered_input_items; end
+ def opts; end
+ def opts=(arg0); end
+ def selected_input_items; end
+end
+class Pry::Command::Cat::ExceptionFormatter < Pry::Command::Cat::AbstractFormatter
+ def backtrace_file; end
+ def backtrace_level; end
+ def backtrace_line; end
+ def check_for_errors; end
+ def code_window_size; end
+ def ex; end
+ def format; end
+ def header; end
+ def increment_backtrace_level; end
+ def initialize(exception, pry_instance, opts); end
+ def opts; end
+ def pry_instance; end
+ def start_and_end_line_for_code_window; end
+ include Pry::Helpers::Text
+end
+class Pry::Command::Cat::FileFormatter < Pry::Command::Cat::AbstractFormatter
+ def code_type; end
+ def code_window_size; end
+ def decorate(content); end
+ def detect_code_type_from_file(file_name); end
+ def file_and_line; end
+ def file_name; end
+ def file_with_embedded_line; end
+ def format; end
+ def initialize(file_with_embedded_line, pry_instance, opts); end
+ def line_number; end
+ def opts; end
+ def pry_instance; end
+end
+class Pry::Command::Cd < Pry::ClassCommand
+ def process; end
+end
+class Pry::Command::ChangeInspector < Pry::ClassCommand
+ def inspector_map; end
+ def process(inspector); end
+end
+class Pry::Command::ChangePrompt < Pry::ClassCommand
+ def change_prompt(prompt); end
+ def list_prompts; end
+ def options(opt); end
+ def process(prompt); end
+end
+class Pry::Command::ClearScreen < Pry::ClassCommand
+ def process; end
+end
+class Pry::Command::CodeCollector
+ def args; end
+ def bad_option_combination?; end
+ def code_object; end
+ def code_object_doc; end
+ def code_object_source_or_file; end
+ def content; end
+ def convert_to_range(range); end
+ def could_not_locate(name); end
+ def file; end
+ def file=(arg0); end
+ def file_content; end
+ def initialize(args, opts, pry_instance); end
+ def line_range; end
+ def obj_name; end
+ def opts; end
+ def pry_array_content_as_string(array, ranges); end
+ def pry_input_content; end
+ def pry_instance; end
+ def pry_output_content; end
+ def restrict_to_lines(content, range); end
+ def self.inject_options(opt); end
+ def self.input_expression_ranges; end
+ def self.input_expression_ranges=(arg0); end
+ def self.output_result_ranges; end
+ def self.output_result_ranges=(arg0); end
+ include Pry::Helpers::CommandHelpers
+end
+class Pry::Command::DisablePry < Pry::ClassCommand
+ def process; end
+end
+class Pry::Command::Edit < Pry::ClassCommand
+ def apply_runtime_patch; end
+ def bad_option_combination?; end
+ def code_object; end
+ def ensure_file_name_is_valid(file_name); end
+ def file_and_line; end
+ def file_and_line_for_current_exception; end
+ def file_based_exception?; end
+ def file_edit; end
+ def filename_argument; end
+ def initial_temp_file_content; end
+ def input_expression; end
+ def never_reload?; end
+ def options(opt); end
+ def patch_exception?; end
+ def previously_patched?(code_object); end
+ def probably_a_file?(str); end
+ def process; end
+ def pry_method?(code_object); end
+ def reload?(file_name = nil); end
+ def reloadable?; end
+ def repl_edit; end
+ def repl_edit?; end
+ def runtime_patch?; end
+end
+class Pry::Command::Edit::ExceptionPatcher
+ def file_and_line; end
+ def file_and_line=(arg0); end
+ def initialize(pry_instance, state, exception_file_and_line); end
+ def perform_patch; end
+ def pry_instance; end
+ def pry_instance=(arg0); end
+ def state; end
+ def state=(arg0); end
+end
+module Pry::Command::Edit::FileAndLineLocator
+ def self.from_binding(target); end
+ def self.from_code_object(code_object, filename_argument); end
+ def self.from_exception(exception, backtrace_level); end
+ def self.from_filename_argument(filename_argument); end
+end
+class Pry::Command::Exit < Pry::ClassCommand
+ def process; end
+ def process_pop_and_return; end
+end
+class Pry::Command::ExitAll < Pry::ClassCommand
+ def process; end
+end
+class Pry::Command::ExitProgram < Pry::ClassCommand
+ def process; end
+end
+class Pry::Command::FindMethod < Pry::ClassCommand
+ def additional_info(header, method); end
+ def content_search(namespace); end
+ def matched_method_lines(header, method); end
+ def name_search(namespace); end
+ def options(opt); end
+ def pattern; end
+ def print_matches(matches); end
+ def print_matches_for_class(klass, grouped); end
+ def process; end
+ def recurse_namespace(klass, done = nil, &block); end
+ def search_all_methods(namespace); end
+ def search_class; end
+ def show_search_results(matches); end
+ extend Pry::Helpers::BaseHelpers
+end
+class Pry::Command::FixIndent < Pry::ClassCommand
+ def process; end
+end
+class Pry::Command::Help < Pry::ClassCommand
+ def command_groups; end
+ def display_command(command); end
+ def display_filtered_commands(search); end
+ def display_filtered_search_results(search); end
+ def display_index(groups); end
+ def display_search(search); end
+ def group_sort_key(group_name); end
+ def help_text_for_commands(name, commands); end
+ def normalize(key); end
+ def process; end
+ def search_hash(search, hash); end
+ def sorted_commands(commands); end
+ def sorted_group_names(groups); end
+ def visible_commands; end
+end
+class Pry::Command::Hist < Pry::ClassCommand
+ def check_for_juxtaposed_replay(replay_sequence); end
+ def find_history; end
+ def options(opt); end
+ def process; end
+ def process_clear; end
+ def process_display; end
+ def process_replay; end
+ def process_save; end
+end
+class Pry::Command::ImportSet < Pry::ClassCommand
+ def process(_command_set_name); end
+end
+class Pry::Command::JumpTo < Pry::ClassCommand
+ def process(break_level); end
+end
+class Pry::Command::ListInspectors < Pry::ClassCommand
+ def inspector_map; end
+ def process; end
+ def selected_inspector?(inspector); end
+ def selected_text; end
+end
+class Pry::Command::Nesting < Pry::ClassCommand
+ def process; end
+end
+class Pry::Command::Play < Pry::ClassCommand
+ def code_object; end
+ def content; end
+ def content_after_options; end
+ def content_at_expression; end
+ def default_file; end
+ def file_content; end
+ def options(opt); end
+ def perform_play; end
+ def process; end
+ def should_use_default_file?; end
+ def show_input; end
+end
+class Pry::Command::PryBacktrace < Pry::ClassCommand
+ def process; end
+end
+class Pry::Command::Version < Pry::ClassCommand
+ def process; end
+end
+class Pry::Command::RaiseUp < Pry::ClassCommand
+ def process; end
+end
+class Pry::Command::ReloadCode < Pry::ClassCommand
+ def check_for_reloadability(code_object, identifier); end
+ def current_file; end
+ def process; end
+ def reload_current_file; end
+ def reload_object(identifier); end
+end
+class Pry::Command::Reset < Pry::ClassCommand
+ def process; end
+end
+class Pry::Command::Ri < Pry::ClassCommand
+ def process(spec); end
+end
+class Pry::Command::SaveFile < Pry::ClassCommand
+ def display_content; end
+ def file_name; end
+ def mode; end
+ def options(opt); end
+ def process; end
+ def save_file; end
+end
+class Pry::Command::ShellCommand < Pry::ClassCommand
+ def cd_path_env; end
+ def cd_path_exists?; end
+ def parse_destination(dest); end
+ def path_from_cd_path(dest); end
+ def process(cmd); end
+ def process_cd(dest); end
+ def special_case_path?(dest); end
+end
+class Pry::Command::ShellMode < Pry::ClassCommand
+ def process; end
+end
+class Pry::Command::ShowInfo < Pry::ClassCommand
+ def code_object_header(code_object, line_num); end
+ def code_object_with_accessible_source(code_object); end
+ def complete(input); end
+ def content_and_header_for_code_object(code_object); end
+ def content_and_headers_for_all_module_candidates(mod); end
+ def file_and_line_for(code_object); end
+ def header(code_object); end
+ def header_options; end
+ def initialize(*arg0); end
+ def method_header(code_object, line_num); end
+ def method_sections(code_object); end
+ def module_header(code_object, line_num); end
+ def no_definition_message; end
+ def obj_name; end
+ def options(opt); end
+ def process; end
+ def show_all_modules?(code_object); end
+ def start_line_for(code_object); end
+ def use_line_numbers?; end
+ def valid_superclass?(code_object); end
+ extend Pry::Helpers::BaseHelpers
+end
+class Pry::Command::ShowDoc < Pry::Command::ShowInfo
+ def content_for(code_object); end
+ def docs_for(code_object); end
+ def header_options; end
+ def process; end
+ def render_doc_markup_for(code_object); end
+ def start_line_for(code_object); end
+ include Pry::Helpers::DocumentationHelpers
+end
+class Pry::Command::ShowInput < Pry::ClassCommand
+ def process; end
+end
+class Pry::Command::ShowSource < Pry::Command::ShowInfo
+ def content_for(code_object); end
+ def docs_for(code_object); end
+ def header_options; end
+ def options(opt); end
+ def process; end
+ def render_doc_markup_for(code_object); end
+ def start_line_for(code_object); end
+ include Pry::Helpers::DocumentationHelpers
+end
+class Pry::Command::Stat < Pry::ClassCommand
+ def options(opt); end
+ def process; end
+end
+class Pry::Command::SwitchTo < Pry::ClassCommand
+ def process(selection); end
+end
+class Pry::Command::ToggleColor < Pry::ClassCommand
+ def color_toggle; end
+ def process; end
+end
+class Pry::Command::WatchExpression < Pry::ClassCommand
+ def add_expression(_arguments); end
+ def add_hook; end
+ def delete(index); end
+ def eval_and_print_changed(output); end
+ def expressions; end
+ def list; end
+ def options(opt); end
+ def process; end
+end
+class Pry::Command::WatchExpression::Expression
+ def changed?; end
+ def eval!; end
+ def initialize(pry_instance, target, source); end
+ def previous_value; end
+ def pry_instance; end
+ def source; end
+ def target; end
+ def target_eval(target, source); end
+ def to_s; end
+ def value; end
+end
+class Pry::Command::Whereami < Pry::ClassCommand
+ def bad_option_combination?; end
+ def class_code; end
+ def code; end
+ def code?; end
+ def code_window; end
+ def default_code; end
+ def expand_path(filename); end
+ def handle_internal_binding; end
+ def initialize(*arg0); end
+ def location; end
+ def marker; end
+ def method_code; end
+ def nothing_to_do?; end
+ def options(opt); end
+ def process; end
+ def self.method_size_cutoff; end
+ def self.method_size_cutoff=(arg0); end
+ def setup; end
+ def small_method?; end
+ def target_class; end
+ def top_level?; end
+ def use_line_numbers?; end
+ def valid_method?; end
+ def window_size; end
+end
+class Pry::Command::Wtf < Pry::ClassCommand
+ def format_backtrace(backtrace); end
+ def format_header(title, exception); end
+ def options(opt); end
+ def process; end
+ def read_line(file, line); end
+ def trim_backtrace(backtrace); end
+ def unwind_exceptions; end
+end
diff --git a/sorbet/rbi/gems/rainbow.rbi b/sorbet/rbi/gems/rainbow.rbi
new file mode 100644
index 0000000..cae9556
--- /dev/null
+++ b/sorbet/rbi/gems/rainbow.rbi
@@ -0,0 +1,118 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rainbow/all/rainbow.rbi
+#
+# rainbow-3.0.0
+
+module Rainbow
+ def self.enabled; end
+ def self.enabled=(value); end
+ def self.global; end
+ def self.new; end
+ def self.uncolor(string); end
+end
+class Rainbow::StringUtils
+ def self.uncolor(string); end
+ def self.wrap_with_sgr(string, codes); end
+end
+module Rainbow::X11ColorNames
+end
+class Rainbow::Color
+ def ground; end
+ def self.build(ground, values); end
+ def self.parse_hex_color(hex); end
+end
+class Rainbow::Color::Indexed < Rainbow::Color
+ def codes; end
+ def initialize(ground, num); end
+ def num; end
+end
+class Rainbow::Color::Named < Rainbow::Color::Indexed
+ def initialize(ground, name); end
+ def self.color_names; end
+ def self.valid_names; end
+end
+class Rainbow::Color::RGB < Rainbow::Color::Indexed
+ def b; end
+ def code_from_rgb; end
+ def codes; end
+ def g; end
+ def initialize(ground, *values); end
+ def r; end
+ def self.to_ansi_domain(value); end
+end
+class Rainbow::Color::X11Named < Rainbow::Color::RGB
+ def initialize(ground, name); end
+ def self.color_names; end
+ def self.valid_names; end
+ include Rainbow::X11ColorNames
+end
+class Rainbow::Presenter < String
+ def background(*values); end
+ def bg(*values); end
+ def black; end
+ def blink; end
+ def blue; end
+ def bold; end
+ def bright; end
+ def color(*values); end
+ def cyan; end
+ def dark; end
+ def faint; end
+ def fg(*values); end
+ def foreground(*values); end
+ def green; end
+ def hide; end
+ def inverse; end
+ def italic; end
+ def magenta; end
+ def method_missing(method_name, *args); end
+ def red; end
+ def reset; end
+ def respond_to_missing?(method_name, *args); end
+ def underline; end
+ def white; end
+ def wrap_with_sgr(codes); end
+ def yellow; end
+end
+class Rainbow::NullPresenter < String
+ def background(*_values); end
+ def bg(*_values); end
+ def black; end
+ def blink; end
+ def blue; end
+ def bold; end
+ def bright; end
+ def color(*_values); end
+ def cyan; end
+ def dark; end
+ def faint; end
+ def fg(*_values); end
+ def foreground(*_values); end
+ def green; end
+ def hide; end
+ def inverse; end
+ def italic; end
+ def magenta; end
+ def method_missing(method_name, *args); end
+ def red; end
+ def reset; end
+ def respond_to_missing?(method_name, *args); end
+ def underline; end
+ def white; end
+ def yellow; end
+end
+class Rainbow::Wrapper
+ def enabled; end
+ def enabled=(arg0); end
+ def initialize(enabled = nil); end
+ def wrap(string); end
+end
+class Object < BasicObject
+ def Rainbow(string); end
+end
diff --git a/sorbet/rbi/gems/rake.rbi b/sorbet/rbi/gems/rake.rbi
new file mode 100644
index 0000000..6f9fa20
--- /dev/null
+++ b/sorbet/rbi/gems/rake.rbi
@@ -0,0 +1,645 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rake/all/rake.rbi
+#
+# rake-12.3.3
+
+module Rake
+ def self.add_rakelib(*files); end
+ def self.application; end
+ def self.application=(app); end
+ def self.each_dir_parent(dir); end
+ def self.from_pathname(path); end
+ def self.load_rakefile(path); end
+ def self.original_dir; end
+ def self.suggested_thread_count; end
+ def self.with_application(block_application = nil); end
+ extend Rake::FileUtilsExt
+end
+module Rake::Version
+end
+class Module
+ def rake_extension(method); end
+end
+class String
+ def ext(newext = nil); end
+ def pathmap(spec = nil, &block); end
+ def pathmap_explode; end
+ def pathmap_partial(n); end
+ def pathmap_replace(patterns, &block); end
+end
+module Rake::Win32
+ def self.normalize(path); end
+ def self.win32_system_dir; end
+ def self.windows?; end
+end
+class Rake::Win32::Win32HomeError < RuntimeError
+end
+class Rake::LinkedList
+ def ==(other); end
+ def conj(item); end
+ def each; end
+ def empty?; end
+ def head; end
+ def initialize(head, tail = nil); end
+ def inspect; end
+ def self.cons(head, tail); end
+ def self.empty; end
+ def self.make(*args); end
+ def tail; end
+ def to_s; end
+ include Enumerable
+end
+class Rake::LinkedList::EmptyLinkedList < Rake::LinkedList
+ def empty?; end
+ def initialize; end
+ def self.cons(head, tail); end
+end
+class Rake::CpuCounter
+ def count; end
+ def count_with_default(default = nil); end
+ def self.count; end
+end
+class Rake::Scope < Rake::LinkedList
+ def path; end
+ def path_with_task_name(task_name); end
+ def trim(n); end
+end
+class Rake::Scope::EmptyScope < Rake::LinkedList::EmptyLinkedList
+ def path; end
+ def path_with_task_name(task_name); end
+end
+class Rake::TaskArgumentError < ArgumentError
+end
+class Rake::RuleRecursionOverflowError < StandardError
+ def add_target(target); end
+ def initialize(*args); end
+ def message; end
+end
+module Rake::TaskManager
+ def [](task_name, scopes = nil); end
+ def add_location(task); end
+ def attempt_rule(task_name, task_pattern, args, extensions, block, level); end
+ def clear; end
+ def create_rule(*args, &block); end
+ def current_scope; end
+ def define_task(task_class, *args, &block); end
+ def enhance_with_matching_rule(task_name, level = nil); end
+ def find_location; end
+ def generate_did_you_mean_suggestions(task_name); end
+ def generate_message_for_undefined_task(task_name); end
+ def generate_name; end
+ def get_description(task); end
+ def in_namespace(name); end
+ def initialize; end
+ def intern(task_class, task_name); end
+ def last_description; end
+ def last_description=(arg0); end
+ def lookup(task_name, initial_scope = nil); end
+ def lookup_in_scope(name, scope); end
+ def make_sources(task_name, task_pattern, extensions); end
+ def resolve_args(args); end
+ def resolve_args_with_dependencies(args, hash); end
+ def resolve_args_without_dependencies(args); end
+ def self.record_task_metadata; end
+ def self.record_task_metadata=(arg0); end
+ def synthesize_file_task(task_name); end
+ def tasks; end
+ def tasks_in_scope(scope); end
+ def trace_rule(level, message); end
+end
+module Rake::Cloneable
+ def initialize_copy(source); end
+end
+module FileUtils
+ def create_shell_runner(cmd); end
+ def ruby(*args, &block); end
+ def safe_ln(*args); end
+ def set_verbose_option(options); end
+ def sh(*cmd, &block); end
+ def sh_show_command(cmd); end
+ def split_all(path); end
+end
+module Rake::FileUtilsExt
+ def cd(*args, &block); end
+ def chdir(*args, &block); end
+ def chmod(*args, &block); end
+ def chmod_R(*args, &block); end
+ def chown(*args, &block); end
+ def chown_R(*args, &block); end
+ def copy(*args, &block); end
+ def cp(*args, &block); end
+ def cp_lr(*args, &block); end
+ def cp_r(*args, &block); end
+ def install(*args, &block); end
+ def link(*args, &block); end
+ def ln(*args, &block); end
+ def ln_s(*args, &block); end
+ def ln_sf(*args, &block); end
+ def makedirs(*args, &block); end
+ def mkdir(*args, &block); end
+ def mkdir_p(*args, &block); end
+ def mkpath(*args, &block); end
+ def move(*args, &block); end
+ def mv(*args, &block); end
+ def nowrite(value = nil); end
+ def rake_check_options(options, *optdecl); end
+ def rake_merge_option(args, defaults); end
+ def rake_output_message(message); end
+ def remove(*args, &block); end
+ def rm(*args, &block); end
+ def rm_f(*args, &block); end
+ def rm_r(*args, &block); end
+ def rm_rf(*args, &block); end
+ def rmdir(*args, &block); end
+ def rmtree(*args, &block); end
+ def safe_unlink(*args, &block); end
+ def self.nowrite_flag; end
+ def self.nowrite_flag=(arg0); end
+ def self.verbose_flag; end
+ def self.verbose_flag=(arg0); end
+ def symlink(*args, &block); end
+ def touch(*args, &block); end
+ def verbose(value = nil); end
+ def when_writing(msg = nil); end
+ extend Rake::FileUtilsExt
+ include FileUtils
+end
+class Rake::FileList
+ def &(*args, &block); end
+ def *(other); end
+ def +(*args, &block); end
+ def -(*args, &block); end
+ def <<(obj); end
+ def <=>(*args, &block); end
+ def ==(array); end
+ def [](*args, &block); end
+ def []=(*args, &block); end
+ def abbrev(*args, &block); end
+ def add(*filenames); end
+ def add_matching(pattern); end
+ def all?(*args, &block); end
+ def any?(*args, &block); end
+ def append(*args, &block); end
+ def assoc(*args, &block); end
+ def at(*args, &block); end
+ def bsearch(*args, &block); end
+ def bsearch_index(*args, &block); end
+ def chain(*args, &block); end
+ def chunk(*args, &block); end
+ def chunk_while(*args, &block); end
+ def clear(*args, &block); end
+ def clear_exclude; end
+ def collect!(*args, &block); end
+ def collect(*args, &block); end
+ def collect_concat(*args, &block); end
+ def combination(*args, &block); end
+ def compact!(*args, &block); end
+ def compact(*args, &block); end
+ def concat(*args, &block); end
+ def count(*args, &block); end
+ def cycle(*args, &block); end
+ def deconstruct(*args, &block); end
+ def delete(*args, &block); end
+ def delete_at(*args, &block); end
+ def delete_if(*args, &block); end
+ def detect(*args, &block); end
+ def difference(*args, &block); end
+ def dig(*args, &block); end
+ def drop(*args, &block); end
+ def drop_while(*args, &block); end
+ def each(*args, &block); end
+ def each_cons(*args, &block); end
+ def each_entry(*args, &block); end
+ def each_index(*args, &block); end
+ def each_slice(*args, &block); end
+ def each_with_index(*args, &block); end
+ def each_with_object(*args, &block); end
+ def egrep(pattern, *options); end
+ def empty?(*args, &block); end
+ def entries(*args, &block); end
+ def exclude(*patterns, &block); end
+ def excluded_from_list?(fn); end
+ def existing!; end
+ def existing; end
+ def ext(newext = nil); end
+ def fetch(*args, &block); end
+ def fill(*args, &block); end
+ def filter!(*args, &block); end
+ def filter(*args, &block); end
+ def filter_map(*args, &block); end
+ def find(*args, &block); end
+ def find_all(*args, &block); end
+ def find_index(*args, &block); end
+ def first(*args, &block); end
+ def flat_map(*args, &block); end
+ def flatten!(*args, &block); end
+ def flatten(*args, &block); end
+ def grep(*args, &block); end
+ def grep_v(*args, &block); end
+ def group_by(*args, &block); end
+ def gsub!(pat, rep); end
+ def gsub(pat, rep); end
+ def import(array); end
+ def include(*filenames); end
+ def include?(*args, &block); end
+ def index(*args, &block); end
+ def initialize(*patterns); end
+ def inject(*args, &block); end
+ def insert(*args, &block); end
+ def inspect(*args, &block); end
+ def intersection(*args, &block); end
+ def is_a?(klass); end
+ def join(*args, &block); end
+ def keep_if(*args, &block); end
+ def kind_of?(klass); end
+ def last(*args, &block); end
+ def lazy(*args, &block); end
+ def length(*args, &block); end
+ def map!(*args, &block); end
+ def map(*args, &block); end
+ def max(*args, &block); end
+ def max_by(*args, &block); end
+ def member?(*args, &block); end
+ def min(*args, &block); end
+ def min_by(*args, &block); end
+ def minmax(*args, &block); end
+ def minmax_by(*args, &block); end
+ def none?(*args, &block); end
+ def one?(*args, &block); end
+ def pack(*args, &block); end
+ def partition(&block); end
+ def pathmap(spec = nil, &block); end
+ def permutation(*args, &block); end
+ def pop(*args, &block); end
+ def prepend(*args, &block); end
+ def product(*args, &block); end
+ def push(*args, &block); end
+ def rassoc(*args, &block); end
+ def reduce(*args, &block); end
+ def reject!(*args, &block); end
+ def reject(*args, &block); end
+ def repeated_combination(*args, &block); end
+ def repeated_permutation(*args, &block); end
+ def replace(*args, &block); end
+ def resolve; end
+ def resolve_add(fn); end
+ def resolve_exclude; end
+ def reverse!(*args, &block); end
+ def reverse(*args, &block); end
+ def reverse_each(*args, &block); end
+ def rindex(*args, &block); end
+ def rotate!(*args, &block); end
+ def rotate(*args, &block); end
+ def sample(*args, &block); end
+ def select!(*args, &block); end
+ def select(*args, &block); end
+ def self.[](*args); end
+ def self.glob(pattern, *args); end
+ def shelljoin(*args, &block); end
+ def shift(*args, &block); end
+ def shuffle!(*args, &block); end
+ def shuffle(*args, &block); end
+ def size(*args, &block); end
+ def slice!(*args, &block); end
+ def slice(*args, &block); end
+ def slice_after(*args, &block); end
+ def slice_before(*args, &block); end
+ def slice_when(*args, &block); end
+ def sort!(*args, &block); end
+ def sort(*args, &block); end
+ def sort_by!(*args, &block); end
+ def sort_by(*args, &block); end
+ def sub!(pat, rep); end
+ def sub(pat, rep); end
+ def sum(*args, &block); end
+ def take(*args, &block); end
+ def take_while(*args, &block); end
+ def tally(*args, &block); end
+ def to_a; end
+ def to_ary; end
+ def to_h(*args, &block); end
+ def to_s; end
+ def to_set(*args, &block); end
+ def transpose(*args, &block); end
+ def union(*args, &block); end
+ def uniq!(*args, &block); end
+ def uniq(*args, &block); end
+ def unshift(*args, &block); end
+ def values_at(*args, &block); end
+ def zip(*args, &block); end
+ def |(*args, &block); end
+ include Rake::Cloneable
+end
+class Rake::Promise
+ def chore; end
+ def complete?; end
+ def discard; end
+ def error?; end
+ def initialize(args, &block); end
+ def recorder; end
+ def recorder=(arg0); end
+ def result?; end
+ def stat(*args); end
+ def value; end
+ def work; end
+end
+class Rake::ThreadPool
+ def __queue__; end
+ def future(*args, &block); end
+ def gather_history; end
+ def history; end
+ def initialize(thread_count); end
+ def join; end
+ def process_queue_item; end
+ def safe_thread_count; end
+ def start_thread; end
+ def stat(event, data = nil); end
+ def statistics; end
+end
+module Rake::PrivateReader
+ def self.included(base); end
+end
+module Rake::PrivateReader::ClassMethods
+ def private_reader(*names); end
+end
+class Rake::ThreadHistoryDisplay
+ def initialize(stats); end
+ def items; end
+ def rename(hash, key, renames); end
+ def show; end
+ def stats; end
+ def threads; end
+ extend Rake::PrivateReader::ClassMethods
+ include Rake::PrivateReader
+end
+module Rake::TraceOutput
+ def trace_on(out, *strings); end
+end
+class Rake::CommandLineOptionError < StandardError
+end
+class Rake::Application
+ def add_import(fn); end
+ def add_loader(ext, loader); end
+ def collect_command_line_tasks(args); end
+ def default_task_name; end
+ def deprecate(old_usage, new_usage, call_site); end
+ def display_cause_details(ex); end
+ def display_error_message(ex); end
+ def display_exception_backtrace(ex); end
+ def display_exception_details(ex); end
+ def display_exception_details_seen; end
+ def display_exception_message_details(ex); end
+ def display_prerequisites; end
+ def display_tasks_and_comments; end
+ def dynamic_width; end
+ def dynamic_width_stty; end
+ def dynamic_width_tput; end
+ def exit_because_of_exception(ex); end
+ def find_rakefile_location; end
+ def glob(path, &block); end
+ def handle_options(argv); end
+ def has_cause?(ex); end
+ def has_chain?(exception); end
+ def have_rakefile; end
+ def init(app_name = nil, argv = nil); end
+ def initialize; end
+ def invoke_task(task_string); end
+ def load_imports; end
+ def load_rakefile; end
+ def name; end
+ def options; end
+ def original_dir; end
+ def parse_task_string(string); end
+ def print_rakefile_directory(location); end
+ def rake_require(file_name, paths = nil, loaded = nil); end
+ def rakefile; end
+ def rakefile_location(backtrace = nil); end
+ def raw_load_rakefile; end
+ def run(argv = nil); end
+ def run_with_threads; end
+ def select_tasks_to_show(options, show_tasks, value); end
+ def select_trace_output(options, trace_option, value); end
+ def set_default_options; end
+ def sort_options(options); end
+ def standard_exception_handling; end
+ def standard_rake_options; end
+ def standard_system_dir; end
+ def system_dir; end
+ def terminal_columns; end
+ def terminal_columns=(arg0); end
+ def terminal_width; end
+ def thread_pool; end
+ def top_level; end
+ def top_level_tasks; end
+ def trace(*strings); end
+ def truncate(string, width); end
+ def truncate_output?; end
+ def tty_output=(arg0); end
+ def tty_output?; end
+ def unix?; end
+ def windows?; end
+ include Rake::TaskManager
+ include Rake::TraceOutput
+end
+class Rake::PseudoStatus
+ def >>(n); end
+ def exited?; end
+ def exitstatus; end
+ def initialize(code = nil); end
+ def stopped?; end
+ def to_i; end
+end
+class Rake::TaskArguments
+ def [](index); end
+ def each(&block); end
+ def extras; end
+ def fetch(*args, &block); end
+ def has_key?(key); end
+ def initialize(names, values, parent = nil); end
+ def inspect; end
+ def key?(key); end
+ def lookup(name); end
+ def method_missing(sym, *args); end
+ def names; end
+ def new_scope(names); end
+ def to_a; end
+ def to_hash; end
+ def to_s; end
+ def values_at(*keys); end
+ def with_defaults(defaults); end
+ include Enumerable
+end
+class Rake::InvocationChain < Rake::LinkedList
+ def append(invocation); end
+ def member?(invocation); end
+ def prefix; end
+ def self.append(invocation, chain); end
+ def to_s; end
+end
+class Rake::InvocationChain::EmptyInvocationChain < Rake::LinkedList::EmptyLinkedList
+ def append(invocation); end
+ def member?(obj); end
+ def to_s; end
+end
+module Rake::InvocationExceptionMixin
+ def chain; end
+ def chain=(value); end
+end
+class Rake::Task
+ def actions; end
+ def add_chain_to(exception, new_chain); end
+ def add_comment(comment); end
+ def add_description(description); end
+ def all_prerequisite_tasks; end
+ def already_invoked; end
+ def application; end
+ def application=(arg0); end
+ def arg_description; end
+ def arg_names; end
+ def clear; end
+ def clear_actions; end
+ def clear_args; end
+ def clear_comments; end
+ def clear_prerequisites; end
+ def collect_prerequisites(seen); end
+ def comment; end
+ def comment=(comment); end
+ def enhance(deps = nil, &block); end
+ def execute(args = nil); end
+ def first_sentence(string); end
+ def format_trace_flags; end
+ def full_comment; end
+ def initialize(task_name, app); end
+ def inspect; end
+ def investigation; end
+ def invoke(*args); end
+ def invoke_prerequisites(task_args, invocation_chain); end
+ def invoke_prerequisites_concurrently(task_args, invocation_chain); end
+ def invoke_with_call_chain(task_args, invocation_chain); end
+ def locations; end
+ def lookup_prerequisite(prerequisite_name); end
+ def name; end
+ def name_with_args; end
+ def needed?; end
+ def prereqs; end
+ def prerequisite_tasks; end
+ def prerequisites; end
+ def reenable; end
+ def scope; end
+ def self.[](task_name); end
+ def self.clear; end
+ def self.create_rule(*args, &block); end
+ def self.define_task(*args, &block); end
+ def self.scope_name(scope, task_name); end
+ def self.task_defined?(task_name); end
+ def self.tasks; end
+ def set_arg_names(args); end
+ def source; end
+ def sources; end
+ def sources=(arg0); end
+ def timestamp; end
+ def to_s; end
+ def transform_comments(separator, &block); end
+end
+class Rake::EarlyTime
+ def <=>(other); end
+ def self.allocate; end
+ def self.new(*arg0); end
+ def to_s; end
+ extend Singleton::SingletonClassMethods
+ include Comparable
+ include Singleton
+end
+class Rake::FileTask < Rake::Task
+ def needed?; end
+ def out_of_date?(stamp); end
+ def self.scope_name(scope, task_name); end
+ def timestamp; end
+end
+class Rake::FileCreationTask < Rake::FileTask
+ def needed?; end
+ def timestamp; end
+end
+class Rake::MultiTask < Rake::Task
+ def invoke_prerequisites(task_args, invocation_chain); end
+end
+module Rake::DSL
+ def cd(*args, &block); end
+ def chdir(*args, &block); end
+ def chmod(*args, &block); end
+ def chmod_R(*args, &block); end
+ def chown(*args, &block); end
+ def chown_R(*args, &block); end
+ def copy(*args, &block); end
+ def cp(*args, &block); end
+ def cp_lr(*args, &block); end
+ def cp_r(*args, &block); end
+ def desc(description); end
+ def directory(*args, &block); end
+ def file(*args, &block); end
+ def file_create(*args, &block); end
+ def import(*fns); end
+ def install(*args, &block); end
+ def link(*args, &block); end
+ def ln(*args, &block); end
+ def ln_s(*args, &block); end
+ def ln_sf(*args, &block); end
+ def makedirs(*args, &block); end
+ def mkdir(*args, &block); end
+ def mkdir_p(*args, &block); end
+ def mkpath(*args, &block); end
+ def move(*args, &block); end
+ def multitask(*args, &block); end
+ def mv(*args, &block); end
+ def namespace(name = nil, &block); end
+ def nowrite(value = nil); end
+ def rake_check_options(options, *optdecl); end
+ def rake_merge_option(args, defaults); end
+ def rake_output_message(message); end
+ def remove(*args, &block); end
+ def rm(*args, &block); end
+ def rm_f(*args, &block); end
+ def rm_r(*args, &block); end
+ def rm_rf(*args, &block); end
+ def rmdir(*args, &block); end
+ def rmtree(*args, &block); end
+ def ruby(*args, &block); end
+ def rule(*args, &block); end
+ def safe_ln(*args); end
+ def safe_unlink(*args, &block); end
+ def sh(*cmd, &block); end
+ def split_all(path); end
+ def symlink(*args, &block); end
+ def task(*args, &block); end
+ def touch(*args, &block); end
+ def verbose(value = nil); end
+ def when_writing(msg = nil); end
+ include Rake::FileUtilsExt
+end
+class Rake::DefaultLoader
+ def load(fn); end
+end
+class Rake::LateTime
+ def <=>(other); end
+ def self.allocate; end
+ def self.new(*arg0); end
+ def to_s; end
+ extend Singleton::SingletonClassMethods
+ include Comparable
+ include Singleton
+end
+class Rake::NameSpace
+ def [](name); end
+ def initialize(task_manager, scope_list); end
+ def scope; end
+ def tasks; end
+end
+module Rake::Backtrace
+ def self.collapse(backtrace); end
+end
diff --git a/sorbet/rbi/gems/rdoc.rbi b/sorbet/rbi/gems/rdoc.rbi
new file mode 100644
index 0000000..92bff85
--- /dev/null
+++ b/sorbet/rbi/gems/rdoc.rbi
@@ -0,0 +1,109 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rdoc/all/rdoc.rbi
+#
+# rdoc-5.1.0
+
+module RDoc
+ def self.load_yaml; end
+end
+class RDoc::Error < RuntimeError
+end
+class RDoc::Options
+ def ==(other); end
+ def charset; end
+ def charset=(arg0); end
+ def check_files; end
+ def check_generator; end
+ def coverage_report; end
+ def coverage_report=(arg0); end
+ def default_title=(string); end
+ def dry_run; end
+ def dry_run=(arg0); end
+ def encode_with(coder); end
+ def encoding; end
+ def encoding=(arg0); end
+ def exclude; end
+ def exclude=(arg0); end
+ def files; end
+ def files=(arg0); end
+ def finish; end
+ def finish_page_dir; end
+ def force_output; end
+ def force_output=(arg0); end
+ def force_update; end
+ def force_update=(arg0); end
+ def formatter; end
+ def formatter=(arg0); end
+ def generator; end
+ def generator=(arg0); end
+ def generator_descriptions; end
+ def generator_name; end
+ def generator_options; end
+ def generator_options=(arg0); end
+ def hyperlink_all; end
+ def hyperlink_all=(arg0); end
+ def init_ivars; end
+ def init_with(map); end
+ def initialize; end
+ def line_numbers; end
+ def line_numbers=(arg0); end
+ def locale; end
+ def locale=(arg0); end
+ def locale_dir; end
+ def locale_dir=(arg0); end
+ def main_page; end
+ def main_page=(arg0); end
+ def markup; end
+ def markup=(arg0); end
+ def op_dir; end
+ def op_dir=(arg0); end
+ def option_parser; end
+ def option_parser=(arg0); end
+ def output_decoration; end
+ def output_decoration=(arg0); end
+ def page_dir; end
+ def page_dir=(arg0); end
+ def parse(argv); end
+ def pipe; end
+ def pipe=(arg0); end
+ def quiet; end
+ def quiet=(bool); end
+ def rdoc_include; end
+ def rdoc_include=(arg0); end
+ def root; end
+ def root=(arg0); end
+ def sanitize_path(path); end
+ def setup_generator(generator_name = nil); end
+ def show_hash; end
+ def show_hash=(arg0); end
+ def static_path; end
+ def static_path=(arg0); end
+ def tab_width; end
+ def tab_width=(arg0); end
+ def template; end
+ def template=(arg0); end
+ def template_dir; end
+ def template_dir=(arg0); end
+ def template_dir_for(template); end
+ def template_stylesheets; end
+ def template_stylesheets=(arg0); end
+ def title; end
+ def title=(arg0); end
+ def update_output_dir; end
+ def update_output_dir=(arg0); end
+ def verbosity; end
+ def verbosity=(arg0); end
+ def visibility; end
+ def visibility=(visibility); end
+ def warn(message); end
+ def webcvs; end
+ def webcvs=(arg0); end
+ def write_options; end
+ def yaml_initialize(tag, map); end
+end
diff --git a/sorbet/rbi/gems/rspec-core.rbi b/sorbet/rbi/gems/rspec-core.rbi
new file mode 100644
index 0000000..76b78d1
--- /dev/null
+++ b/sorbet/rbi/gems/rspec-core.rbi
@@ -0,0 +1,1952 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rspec-core/all/rspec-core.rbi
+#
+# rspec-core-3.10.1
+
+module RSpec
+ def self.clear_examples; end
+ def self.configuration; end
+ def self.configuration=(arg0); end
+ def self.configure; end
+ def self.const_missing(name); end
+ def self.context(*args, &example_group_block); end
+ def self.current_example; end
+ def self.current_example=(example); end
+ def self.describe(*args, &example_group_block); end
+ def self.example_group(*args, &example_group_block); end
+ def self.fcontext(*args, &example_group_block); end
+ def self.fdescribe(*args, &example_group_block); end
+ def self.reset; end
+ def self.shared_context(name, *args, &block); end
+ def self.shared_examples(name, *args, &block); end
+ def self.shared_examples_for(name, *args, &block); end
+ def self.world; end
+ def self.world=(arg0); end
+ def self.xcontext(*args, &example_group_block); end
+ def self.xdescribe(*args, &example_group_block); end
+ extend RSpec::Core::Warnings
+end
+module RSpec::Core
+ def self.path_to_executable; end
+end
+module RSpec::Core::Version
+end
+module RSpec::Core::Warnings
+ def deprecate(deprecated, data = nil); end
+ def warn_deprecation(message, opts = nil); end
+ def warn_with(message, options = nil); end
+end
+class RSpec::Core::Set
+ def <<(key); end
+ def clear; end
+ def delete(key); end
+ def each(&block); end
+ def empty?; end
+ def include?(key); end
+ def initialize(array = nil); end
+ def merge(values); end
+ include Enumerable
+end
+module RSpec::Core::FlatMap
+ def flat_map(array, &block); end
+ def self.flat_map(array, &block); end
+end
+class RSpec::Core::FilterManager
+ def add_ids(rerun_path, scoped_ids); end
+ def add_location(file_path, line_numbers); end
+ def add_path_to_arrays_filter(filter_key, path, values); end
+ def empty?; end
+ def exclude(*args); end
+ def exclude_only(*args); end
+ def exclude_with_low_priority(*args); end
+ def exclusions; end
+ def file_scoped_include?(ex_metadata, ids, locations); end
+ def include(*args); end
+ def include_only(*args); end
+ def include_with_low_priority(*args); end
+ def inclusions; end
+ def initialize; end
+ def prune(examples); end
+ def prune_conditionally_filtered_examples(examples); end
+end
+class RSpec::Core::FilterRules
+ def [](key); end
+ def add(updated); end
+ def add_with_low_priority(updated); end
+ def clear; end
+ def delete(key); end
+ def description; end
+ def each_pair(&block); end
+ def empty?; end
+ def fetch(*args, &block); end
+ def include_example?(example); end
+ def initialize(rules = nil); end
+ def opposite; end
+ def opposite=(arg0); end
+ def rules; end
+ def self.build; end
+ def use_only(updated); end
+end
+class RSpec::Core::InclusionRules < RSpec::Core::FilterRules
+ def add(*args); end
+ def add_with_low_priority(*args); end
+ def apply_standalone_filter(updated); end
+ def include_example?(example); end
+ def is_standalone_filter?(rules); end
+ def replace_filters(new_rules); end
+ def split_file_scoped_rules; end
+ def standalone?; end
+end
+module RSpec::Core::DSL
+ def self.change_global_dsl(&changes); end
+ def self.example_group_aliases; end
+ def self.expose_example_group_alias(name); end
+ def self.expose_example_group_alias_globally(method_name); end
+ def self.expose_globally!; end
+ def self.exposed_globally?; end
+ def self.remove_globally!; end
+ def self.top_level; end
+ def self.top_level=(arg0); end
+end
+module RSpec::Core::Formatters
+ def self.register(formatter_class, *notifications); end
+end
+module RSpec::Core::Formatters::ConsoleCodes
+ def config_colors_to_methods; end
+ def console_code_for(code_or_symbol); end
+ def self.config_colors_to_methods; end
+ def self.console_code_for(code_or_symbol); end
+ def self.wrap(text, code_or_symbol); end
+ def wrap(text, code_or_symbol); end
+end
+class RSpec::Core::Formatters::SnippetExtractor
+ def beginning_line_number; end
+ def expression_lines; end
+ def expression_node; end
+ def expression_outmost_node?(node); end
+ def initialize(source, beginning_line_number, max_line_count = nil); end
+ def line_range_of_expression; end
+ def line_range_of_location_nodes_in_expression; end
+ def location_nodes_at_beginning_line; end
+ def max_line_count; end
+ def self.extract_expression_lines_at(file_path, beginning_line_number, max_line_count = nil); end
+ def self.extract_line_at(file_path, line_number); end
+ def self.least_indentation_from(lines); end
+ def self.source_from_file(path); end
+ def source; end
+ def unclosed_tokens_in_line_range(line_range); end
+end
+class RSpec::Core::Formatters::SnippetExtractor::NoSuchFileError < StandardError
+end
+class RSpec::Core::Formatters::SnippetExtractor::NoSuchLineError < StandardError
+end
+class RSpec::Core::Formatters::SnippetExtractor::NoExpressionAtLineError < StandardError
+end
+class RSpec::Core::Formatters::SyntaxHighlighter
+ def color_enabled_implementation; end
+ def highlight(lines); end
+ def implementation; end
+ def initialize(configuration); end
+ def self.attempt_to_add_rspec_terms_to_coderay_keywords; end
+end
+module RSpec::Core::Formatters::SyntaxHighlighter::CodeRayImplementation
+ def self.highlight_syntax(lines); end
+end
+module RSpec::Core::Formatters::SyntaxHighlighter::NoSyntaxHighlightingImplementation
+ def self.highlight_syntax(lines); end
+end
+class RSpec::Core::Formatters::ExceptionPresenter
+ def add_shared_group_lines(lines, colorizer); end
+ def backtrace_formatter; end
+ def colorized_formatted_backtrace(colorizer = nil); end
+ def colorized_message_lines(colorizer = nil); end
+ def description; end
+ def detail_formatter; end
+ def encoded_description(description); end
+ def encoded_string(string); end
+ def encoding_of(string); end
+ def example; end
+ def exception; end
+ def exception_backtrace; end
+ def exception_class_name(exception = nil); end
+ def exception_lines; end
+ def exception_message_string(exception); end
+ def extra_detail_formatter; end
+ def extra_failure_lines; end
+ def failure_lines; end
+ def failure_slash_error_lines; end
+ def final_exception(exception, previous = nil); end
+ def find_failed_line; end
+ def formatted_backtrace(exception = nil); end
+ def formatted_cause(exception); end
+ def formatted_message_and_backtrace(colorizer); end
+ def fully_formatted(failure_number, colorizer = nil); end
+ def fully_formatted_lines(failure_number, colorizer); end
+ def indent_lines(lines, failure_number); end
+ def initialize(exception, example, options = nil); end
+ def message_color; end
+ def message_lines; end
+ def read_failed_lines; end
+end
+class RSpec::Core::Formatters::ExceptionPresenter::Factory
+ def build; end
+ def initialize(example); end
+ def multiple_exception_summarizer(exception, prior_detail_formatter, color); end
+ def multiple_exceptions_error?(exception); end
+ def options; end
+ def pending_options; end
+ def sub_failure_list_formatter(exception, message_color); end
+ def with_multiple_error_options_as_needed(exception, options); end
+end
+module RSpec::Core::Formatters::ExceptionPresenter::Factory::EmptyBacktraceFormatter
+ def self.format_backtrace(*arg0); end
+end
+class RSpec::Core::Formatters::ExceptionPresenter::Factory::CommonBacktraceTruncater
+ def initialize(parent); end
+ def with_truncated_backtrace(child); end
+end
+class RSpec::Core::MultipleExceptionError < StandardError
+ def aggregation_block_label; end
+ def aggregation_metadata; end
+ def all_exceptions; end
+ def exception_count_description; end
+ def failures; end
+ def initialize(*exceptions); end
+ def message; end
+ def other_errors; end
+ def summary; end
+ include RSpec::Core::MultipleExceptionError::InterfaceTag
+end
+module RSpec::Core::MultipleExceptionError::InterfaceTag
+ def add(exception); end
+ def self.for(ex); end
+end
+module RSpec::Core::ShellEscape
+ def conditionally_quote(id); end
+ def escape(shell_command); end
+ def quote(argument); end
+ def self.conditionally_quote(id); end
+ def self.escape(shell_command); end
+ def self.quote(argument); end
+ def self.shell_allows_unquoted_ids?; end
+ def shell_allows_unquoted_ids?; end
+end
+module RSpec::Core::Formatters::Helpers
+ def self.format_duration(duration); end
+ def self.format_seconds(float, precision = nil); end
+ def self.organize_ids(ids); end
+ def self.pluralize(count, string); end
+ def self.strip_trailing_zeroes(string); end
+end
+module RSpec::Core::Notifications
+end
+module RSpec::Core::Notifications::NullColorizer
+ def self.wrap(line, _code_or_symbol); end
+ def wrap(line, _code_or_symbol); end
+end
+class RSpec::Core::Notifications::StartNotification < Struct
+ def count; end
+ def count=(_); end
+ def load_time; end
+ def load_time=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::ExampleNotification < Struct
+ def example; end
+ def example=(_); end
+ def self.[](*arg0); end
+ def self.for(example); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::ExamplesNotification
+ def examples; end
+ def failed_examples; end
+ def failure_notifications; end
+ def format_examples(examples); end
+ def fully_formatted_failed_examples(colorizer = nil); end
+ def fully_formatted_pending_examples(colorizer = nil); end
+ def initialize(reporter); end
+ def notifications; end
+ def pending_examples; end
+ def pending_notifications; end
+end
+class RSpec::Core::Notifications::FailedExampleNotification < RSpec::Core::Notifications::ExampleNotification
+ def colorized_formatted_backtrace(colorizer = nil); end
+ def colorized_message_lines(colorizer = nil); end
+ def description; end
+ def exception; end
+ def formatted_backtrace; end
+ def fully_formatted(failure_number, colorizer = nil); end
+ def fully_formatted_lines(failure_number, colorizer = nil); end
+ def initialize(example, exception_presenter = nil); end
+ def message_lines; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::PendingExampleFixedNotification < RSpec::Core::Notifications::FailedExampleNotification
+end
+class RSpec::Core::Notifications::PendingExampleFailedAsExpectedNotification < RSpec::Core::Notifications::FailedExampleNotification
+end
+class RSpec::Core::Notifications::SkippedExampleNotification < RSpec::Core::Notifications::ExampleNotification
+ def fully_formatted(pending_number, colorizer = nil); end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::GroupNotification < Struct
+ def group; end
+ def group=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::MessageNotification < Struct
+ def message; end
+ def message=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::SeedNotification < Struct
+ def fully_formatted; end
+ def seed; end
+ def seed=(_); end
+ def seed_used?; end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def used; end
+ def used=(_); end
+end
+class RSpec::Core::Notifications::SummaryNotification < Struct
+ def colorized_rerun_commands(colorizer = nil); end
+ def colorized_totals_line(colorizer = nil); end
+ def duplicate_rerun_locations; end
+ def duration; end
+ def duration=(_); end
+ def errors_outside_of_examples_count; end
+ def errors_outside_of_examples_count=(_); end
+ def example_count; end
+ def examples; end
+ def examples=(_); end
+ def failed_examples; end
+ def failed_examples=(_); end
+ def failure_count; end
+ def formatted_duration; end
+ def formatted_load_time; end
+ def fully_formatted(colorizer = nil); end
+ def load_time; end
+ def load_time=(_); end
+ def pending_count; end
+ def pending_examples; end
+ def pending_examples=(_); end
+ def rerun_argument_for(example); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def totals_line; end
+ include RSpec::Core::ShellEscape
+end
+class RSpec::Core::Notifications::ProfileNotification
+ def calculate_slowest_groups; end
+ def duration; end
+ def examples; end
+ def initialize(duration, examples, number_of_examples, example_groups); end
+ def number_of_examples; end
+ def percentage; end
+ def slow_duration; end
+ def slowest_examples; end
+ def slowest_groups; end
+end
+class RSpec::Core::Notifications::DeprecationNotification < Struct
+ def call_site; end
+ def call_site=(_); end
+ def deprecated; end
+ def deprecated=(_); end
+ def message; end
+ def message=(_); end
+ def replacement; end
+ def replacement=(_); end
+ def self.[](*arg0); end
+ def self.from_hash(data); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::NullNotification
+end
+class RSpec::Core::Notifications::CustomNotification < Struct
+ def self.for(options = nil); end
+end
+class RSpec::Core::Reporter
+ def abort_with(msg, exit_status); end
+ def close; end
+ def close_after; end
+ def deprecation(hash); end
+ def ensure_listeners_ready; end
+ def example_failed(example); end
+ def example_finished(example); end
+ def example_group_finished(group); end
+ def example_group_started(group); end
+ def example_passed(example); end
+ def example_pending(example); end
+ def example_started(example); end
+ def examples; end
+ def exit_early(exit_code); end
+ def fail_fast_limit_met?; end
+ def failed_examples; end
+ def finish; end
+ def initialize(configuration); end
+ def message(message); end
+ def mute_profile_output?; end
+ def notify(event, notification); end
+ def notify_non_example_exception(exception, context_description); end
+ def pending_examples; end
+ def prepare_default(loader, output_stream, deprecation_stream); end
+ def publish(event, options = nil); end
+ def register_listener(listener, *notifications); end
+ def registered_listeners(notification); end
+ def report(expected_example_count); end
+ def seed_used?; end
+ def start(expected_example_count, time = nil); end
+ def stop; end
+end
+class RSpec::Core::NullReporter
+ def self.method_missing(*arg0); end
+end
+module RSpec::Core::Hooks
+ def after(*args, &block); end
+ def append_after(*args, &block); end
+ def append_before(*args, &block); end
+ def around(*args, &block); end
+ def before(*args, &block); end
+ def hooks; end
+ def prepend_after(*args, &block); end
+ def prepend_before(*args, &block); end
+end
+class RSpec::Core::Hooks::Hook < Struct
+ def block; end
+ def block=(_); end
+ def options; end
+ def options=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Hooks::BeforeHook < RSpec::Core::Hooks::Hook
+ def run(example); end
+end
+class RSpec::Core::Hooks::AfterHook < RSpec::Core::Hooks::Hook
+ def run(example); end
+end
+class RSpec::Core::Hooks::AfterContextHook < RSpec::Core::Hooks::Hook
+ def run(example); end
+end
+class RSpec::Core::Hooks::AroundHook < RSpec::Core::Hooks::Hook
+ def execute_with(example, procsy); end
+ def hook_description; end
+end
+class RSpec::Core::Hooks::HookCollections
+ def all_hooks_for(position, scope); end
+ def ensure_hooks_initialized_for(position, scope); end
+ def extract_scope_from(args); end
+ def hooks_for(position, scope); end
+ def initialize(owner, filterable_item_repo_class); end
+ def known_scope?(scope); end
+ def matching_hooks_for(position, scope, example_or_group); end
+ def normalized_scope_for(scope); end
+ def owner_parent_groups; end
+ def process(host, parent_groups, globals, position, scope); end
+ def processable_hooks_for(position, scope, host); end
+ def register(prepend_or_append, position, *args, &block); end
+ def register_global_singleton_context_hooks(example, globals); end
+ def register_globals(host, globals); end
+ def run(position, scope, example_or_group); end
+ def run_around_example_hooks_for(example); end
+ def run_example_hooks_for(example, position, each_method); end
+ def run_owned_hooks_for(position, scope, example_or_group); end
+ def scope_and_options_from(*args); end
+end
+module RSpec::Core::MemoizedHelpers
+ def __init_memoized; end
+ def __memoized; end
+ def initialize(*arg0); end
+ def is_expected; end
+ def self.define_helpers_on(example_group); end
+ def self.get_constant_or_yield(example_group, name); end
+ def self.module_for(example_group); end
+ def should(matcher = nil, message = nil); end
+ def should_not(matcher = nil, message = nil); end
+ def subject; end
+end
+class RSpec::Core::MemoizedHelpers::ThreadsafeMemoized
+ def fetch_or_store(key); end
+ def initialize; end
+end
+class RSpec::Core::MemoizedHelpers::NonThreadSafeMemoized
+ def fetch_or_store(key); end
+ def initialize; end
+end
+class RSpec::Core::MemoizedHelpers::ContextHookMemoized
+ def self.fetch_or_store(key, &_block); end
+ def self.isolate_for_context_hook(example_group_instance); end
+end
+class RSpec::Core::MemoizedHelpers::ContextHookMemoized::Before < RSpec::Core::MemoizedHelpers::ContextHookMemoized
+ def self.article; end
+ def self.hook_expression; end
+ def self.hook_intention; end
+end
+class RSpec::Core::MemoizedHelpers::ContextHookMemoized::After < RSpec::Core::MemoizedHelpers::ContextHookMemoized
+ def self.article; end
+ def self.hook_expression; end
+ def self.hook_intention; end
+end
+module RSpec::Core::MemoizedHelpers::ClassMethods
+ def let!(name, &block); end
+ def let(name, &block); end
+ def subject!(name = nil, &block); end
+ def subject(name = nil, &block); end
+end
+module RSpec::Core::Metadata
+ def self.ascend(metadata); end
+ def self.ascending(metadata); end
+ def self.build_hash_from(args, warn_about_example_group_filtering = nil); end
+ def self.deep_hash_dup(object); end
+ def self.id_from(metadata); end
+ def self.location_tuple_from(metadata); end
+ def self.relative_path(line); end
+ def self.relative_path_regex; end
+end
+class RSpec::Core::Metadata::HashPopulator
+ def block; end
+ def build_description_from(parent_description = nil, my_description = nil); end
+ def build_scoped_id_for(file_path); end
+ def description_args; end
+ def description_separator(parent_part, child_part); end
+ def ensure_valid_user_keys; end
+ def file_path_and_line_number_from(backtrace); end
+ def initialize(metadata, user_metadata, index_provider, description_args, block); end
+ def metadata; end
+ def populate; end
+ def populate_location_attributes; end
+ def user_metadata; end
+end
+class RSpec::Core::Metadata::ExampleHash < RSpec::Core::Metadata::HashPopulator
+ def described_class; end
+ def full_description; end
+ def self.create(group_metadata, user_metadata, index_provider, description, block); end
+end
+class RSpec::Core::Metadata::ExampleGroupHash < RSpec::Core::Metadata::HashPopulator
+ def described_class; end
+ def full_description; end
+ def self.backwards_compatibility_default_proc(&example_group_selector); end
+ def self.create(parent_group_metadata, user_metadata, example_group_index, *args, &block); end
+ def self.hash_with_backwards_compatibility_default_proc; end
+end
+module RSpec::Core::HashImitatable
+ def <(*args, &block); end
+ def <=(*args, &block); end
+ def >(*args, &block); end
+ def >=(*args, &block); end
+ def [](key); end
+ def []=(key, value); end
+ def all?(*args, &block); end
+ def any?(*args, &block); end
+ def assoc(*args, &block); end
+ def chain(*args, &block); end
+ def chunk(*args, &block); end
+ def chunk_while(*args, &block); end
+ def clear(*args, &block); end
+ def collect(*args, &block); end
+ def collect_concat(*args, &block); end
+ def compact!(*args, &block); end
+ def compact(*args, &block); end
+ def compare_by_identity(*args, &block); end
+ def compare_by_identity?(*args, &block); end
+ def count(*args, &block); end
+ def cycle(*args, &block); end
+ def deconstruct_keys(*args, &block); end
+ def default(*args, &block); end
+ def default=(*args, &block); end
+ def default_proc(*args, &block); end
+ def default_proc=(*args, &block); end
+ def delete(*args, &block); end
+ def delete_if(*args, &block); end
+ def detect(*args, &block); end
+ def dig(*args, &block); end
+ def directly_supports_attribute?(name); end
+ def drop(*args, &block); end
+ def drop_while(*args, &block); end
+ def each(*args, &block); end
+ def each_cons(*args, &block); end
+ def each_entry(*args, &block); end
+ def each_key(*args, &block); end
+ def each_pair(*args, &block); end
+ def each_slice(*args, &block); end
+ def each_value(*args, &block); end
+ def each_with_index(*args, &block); end
+ def each_with_object(*args, &block); end
+ def empty?(*args, &block); end
+ def entries(*args, &block); end
+ def extra_hash_attributes; end
+ def fetch(*args, &block); end
+ def fetch_values(*args, &block); end
+ def filter!(*args, &block); end
+ def filter(*args, &block); end
+ def filter_map(*args, &block); end
+ def find(*args, &block); end
+ def find_all(*args, &block); end
+ def find_index(*args, &block); end
+ def first(*args, &block); end
+ def flat_map(*args, &block); end
+ def flatten(*args, &block); end
+ def get_value(name); end
+ def grep(*args, &block); end
+ def grep_v(*args, &block); end
+ def group_by(*args, &block); end
+ def has_key?(*args, &block); end
+ def has_value?(*args, &block); end
+ def hash_for_delegation; end
+ def include?(*args, &block); end
+ def index(*args, &block); end
+ def inject(*args, &block); end
+ def invert(*args, &block); end
+ def issue_deprecation(_method_name, *_args); end
+ def keep_if(*args, &block); end
+ def key(*args, &block); end
+ def key?(*args, &block); end
+ def keys(*args, &block); end
+ def lazy(*args, &block); end
+ def length(*args, &block); end
+ def map(*args, &block); end
+ def max(*args, &block); end
+ def max_by(*args, &block); end
+ def member?(*args, &block); end
+ def merge!(*args, &block); end
+ def merge(*args, &block); end
+ def min(*args, &block); end
+ def min_by(*args, &block); end
+ def minmax(*args, &block); end
+ def minmax_by(*args, &block); end
+ def none?(*args, &block); end
+ def one?(*args, &block); end
+ def partition(*args, &block); end
+ def rassoc(*args, &block); end
+ def reduce(*args, &block); end
+ def rehash(*args, &block); end
+ def reject!(*args, &block); end
+ def reject(*args, &block); end
+ def rekey!(*args, &block); end
+ def rekey(*args, &block); end
+ def replace(*args, &block); end
+ def retrieve(*args, &block); end
+ def reverse_each(*args, &block); end
+ def select!(*args, &block); end
+ def select(*args, &block); end
+ def self.included(klass); end
+ def set_value(name, value); end
+ def shift(*args, &block); end
+ def size(*args, &block); end
+ def slice(*args, &block); end
+ def slice_after(*args, &block); end
+ def slice_before(*args, &block); end
+ def slice_when(*args, &block); end
+ def sort(*args, &block); end
+ def sort_by(*args, &block); end
+ def store(*args, &block); end
+ def sum(*args, &block); end
+ def take(*args, &block); end
+ def take_while(*args, &block); end
+ def tally(*args, &block); end
+ def to_a(*args, &block); end
+ def to_h; end
+ def to_hash(*args, &block); end
+ def to_proc(*args, &block); end
+ def to_set(*args, &block); end
+ def transform_keys!(*args, &block); end
+ def transform_keys(*args, &block); end
+ def transform_values!(*args, &block); end
+ def transform_values(*args, &block); end
+ def uniq(*args, &block); end
+ def update(*args, &block); end
+ def value?(*args, &block); end
+ def values(*args, &block); end
+ def values_at(*args, &block); end
+ def zip(*args, &block); end
+end
+module RSpec::Core::HashImitatable::ClassMethods
+ def attr_accessor(*names); end
+ def hash_attribute_names; end
+end
+class RSpec::Core::LegacyExampleGroupHash
+ def directly_supports_attribute?(name); end
+ def get_value(name); end
+ def initialize(metadata); end
+ def set_value(name, value); end
+ def to_h; end
+ extend RSpec::Core::HashImitatable::ClassMethods
+ include RSpec::Core::HashImitatable
+end
+module RSpec::Core::MetadataFilter
+ def self.apply?(predicate, filters, metadata); end
+ def self.filter_applies?(key, filter_value, metadata); end
+ def self.filter_applies_to_any_value?(key, value, metadata); end
+ def self.filters_apply?(key, value, metadata); end
+ def self.id_filter_applies?(rerun_paths_to_scoped_ids, metadata); end
+ def self.location_filter_applies?(locations, metadata); end
+ def self.proc_filter_applies?(key, proc, metadata); end
+ def self.silence_metadata_example_group_deprecations; end
+end
+module RSpec::Core::FilterableItemRepository
+end
+class RSpec::Core::FilterableItemRepository::UpdateOptimized
+ def append(item, metadata); end
+ def delete(item, metadata); end
+ def initialize(applies_predicate); end
+ def items_and_filters; end
+ def items_for(request_meta); end
+ def prepend(item, metadata); end
+end
+class RSpec::Core::FilterableItemRepository::QueryOptimized < RSpec::Core::FilterableItemRepository::UpdateOptimized
+ def append(item, metadata); end
+ def applicable_metadata_from(metadata); end
+ def delete(item, metadata); end
+ def find_items_for(request_meta); end
+ def handle_mutation(metadata); end
+ def initialize(applies_predicate); end
+ def items_for(metadata); end
+ def prepend(item, metadata); end
+ def proc_keys_from(metadata); end
+ def reconstruct_caches; end
+end
+module RSpec::Core::Pending
+ def pending(message = nil); end
+ def self.mark_fixed!(example); end
+ def self.mark_pending!(example, message_or_bool); end
+ def self.mark_skipped!(example, message_or_bool); end
+ def skip(message = nil); end
+end
+class RSpec::Core::Pending::SkipDeclaredInExample < StandardError
+ def argument; end
+ def initialize(argument); end
+end
+class RSpec::Core::Pending::PendingExampleFixedError < StandardError
+end
+class RSpec::Core::Formatters::Loader
+ def add(formatter_to_use, *paths); end
+ def built_in_formatter(key); end
+ def custom_formatter(formatter_ref); end
+ def default_formatter; end
+ def default_formatter=(arg0); end
+ def duplicate_formatter_exists?(new_formatter); end
+ def existing_formatter_implements?(notification); end
+ def find_formatter(formatter_to_use); end
+ def formatters; end
+ def initialize(reporter); end
+ def notifications_for(formatter_class); end
+ def open_stream(path_or_wrapper); end
+ def path_for(const_ref); end
+ def prepare_default(output_stream, deprecation_stream); end
+ def register(formatter, notifications); end
+ def reporter; end
+ def self.formatters; end
+ def setup_default(output_stream, deprecation_stream); end
+ def string_const?(str); end
+ def underscore(camel_cased_word); end
+ def underscore_with_fix_for_non_standard_rspec_naming(string); end
+end
+module RSpec::Core::Ordering
+end
+class RSpec::Core::Ordering::Identity
+ def order(items); end
+end
+class RSpec::Core::Ordering::Random
+ def initialize(configuration); end
+ def jenkins_hash_digest(string); end
+ def order(items); end
+ def used?; end
+end
+class RSpec::Core::Ordering::Custom
+ def initialize(callable); end
+ def order(list); end
+end
+class RSpec::Core::Ordering::Registry
+ def fetch(name, &fallback); end
+ def initialize(configuration); end
+ def register(sym, strategy); end
+ def used_random_seed?; end
+end
+class RSpec::Core::Ordering::ConfigurationManager
+ def force(hash); end
+ def initialize; end
+ def order=(type); end
+ def ordering_registry; end
+ def register_ordering(name, strategy = nil); end
+ def seed; end
+ def seed=(seed); end
+ def seed_used?; end
+end
+class RSpec::Core::World
+ def all_example_groups; end
+ def all_examples; end
+ def announce_exclusion_filter(announcements); end
+ def announce_filters; end
+ def announce_inclusion_filter(announcements); end
+ def descending_declaration_line_numbers_by_file; end
+ def everything_filtered_message; end
+ def example_count(groups = nil); end
+ def example_group_counts_by_spec_file; end
+ def example_groups; end
+ def exclusion_filter; end
+ def fail_if_config_and_cli_options_invalid; end
+ def filter_manager; end
+ def filtered_examples; end
+ def inclusion_filter; end
+ def initialize(configuration = nil); end
+ def non_example_failure; end
+ def non_example_failure=(arg0); end
+ def num_example_groups_defined_in(file); end
+ def ordered_example_groups; end
+ def preceding_declaration_line(absolute_file_name, filter_line); end
+ def prepare_example_filtering; end
+ def record(example_group); end
+ def registered_example_group_files; end
+ def report_filter_message(message); end
+ def reporter; end
+ def reset; end
+ def shared_example_group_registry; end
+ def source_from_file(path); end
+ def syntax_highlighter; end
+ def traverse_example_group_trees_until(&block); end
+ def wants_to_quit; end
+ def wants_to_quit=(arg0); end
+end
+module RSpec::Core::World::Null
+ def self.all_example_groups; end
+ def self.example_groups; end
+ def self.non_example_failure; end
+ def self.non_example_failure=(_); end
+ def self.registered_example_group_files; end
+ def self.traverse_example_group_trees_until; end
+end
+class RSpec::Core::BacktraceFormatter
+ def backtrace_line(line); end
+ def exclude?(line); end
+ def exclusion_patterns; end
+ def exclusion_patterns=(arg0); end
+ def filter_gem(gem_name); end
+ def format_backtrace(backtrace, options = nil); end
+ def full_backtrace=(arg0); end
+ def full_backtrace?; end
+ def inclusion_patterns; end
+ def inclusion_patterns=(arg0); end
+ def initialize; end
+ def matches?(patterns, line); end
+end
+module RSpec::Core::RubyProject
+ def add_dir_to_load_path(dir); end
+ def add_to_load_path(*dirs); end
+ def ascend_until; end
+ def determine_root; end
+ def find_first_parent_containing(dir); end
+ def root; end
+ def self.add_dir_to_load_path(dir); end
+ def self.add_to_load_path(*dirs); end
+ def self.ascend_until; end
+ def self.determine_root; end
+ def self.find_first_parent_containing(dir); end
+ def self.root; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter
+ def count; end
+ def deprecation(notification); end
+ def deprecation_message_for(data); end
+ def deprecation_stream; end
+ def deprecation_summary(_notification); end
+ def initialize(deprecation_stream, summary_stream); end
+ def output; end
+ def printer; end
+ def summary_stream; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::SpecifiedDeprecationMessage < Struct
+ def deprecation_type_for(data); end
+ def initialize(data); end
+ def output_formatted(str); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def to_s; end
+ def too_many_warnings_message; end
+ def type; end
+ def type=(_); end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::GeneratedDeprecationMessage < Struct
+ def initialize(data); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def to_s; end
+ def too_many_warnings_message; end
+ def type; end
+ def type=(_); end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::ImmediatePrinter
+ def deprecation_formatter; end
+ def deprecation_stream; end
+ def deprecation_summary; end
+ def initialize(deprecation_stream, summary_stream, deprecation_formatter); end
+ def print_deprecation_message(data); end
+ def summary_stream; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::DelayedPrinter
+ def deprecation_formatter; end
+ def deprecation_stream; end
+ def deprecation_summary; end
+ def initialize(deprecation_stream, summary_stream, deprecation_formatter); end
+ def print_deferred_deprecation_warnings; end
+ def print_deprecation_message(data); end
+ def stash_deprecation_message(deprecation_message); end
+ def summary_stream; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::RaiseErrorStream
+ def puts(message); end
+ def summarize(summary_stream, deprecation_count); end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::FileStream
+ def initialize(file); end
+ def puts(*args); end
+ def summarize(summary_stream, deprecation_count); end
+end
+class RSpec::Core::DeprecationError < StandardError
+end
+class RSpec::Core::OutputWrapper
+ def <<(*args, &block); end
+ def advise(*args, &block); end
+ def autoclose=(*args, &block); end
+ def autoclose?(*args, &block); end
+ def beep(*args, &block); end
+ def binmode(*args, &block); end
+ def binmode?(*args, &block); end
+ def bytes(*args, &block); end
+ def chars(*args, &block); end
+ def check_winsize_changed(*args, &block); end
+ def clear_screen(*args, &block); end
+ def close(*args, &block); end
+ def close_on_exec=(*args, &block); end
+ def close_on_exec?(*args, &block); end
+ def close_read(*args, &block); end
+ def close_write(*args, &block); end
+ def closed?(*args, &block); end
+ def codepoints(*args, &block); end
+ def console_mode(*args, &block); end
+ def console_mode=(*args, &block); end
+ def cooked!(*args, &block); end
+ def cooked(*args, &block); end
+ def cursor(*args, &block); end
+ def cursor=(*args, &block); end
+ def cursor_down(*args, &block); end
+ def cursor_left(*args, &block); end
+ def cursor_right(*args, &block); end
+ def cursor_up(*args, &block); end
+ def each(*args, &block); end
+ def each_byte(*args, &block); end
+ def each_char(*args, &block); end
+ def each_codepoint(*args, &block); end
+ def each_line(*args, &block); end
+ def echo=(*args, &block); end
+ def echo?(*args, &block); end
+ def eof(*args, &block); end
+ def eof?(*args, &block); end
+ def erase_line(*args, &block); end
+ def erase_screen(*args, &block); end
+ def external_encoding(*args, &block); end
+ def fcntl(*args, &block); end
+ def fdatasync(*args, &block); end
+ def fileno(*args, &block); end
+ def flush(*args, &block); end
+ def fsync(*args, &block); end
+ def getbyte(*args, &block); end
+ def getc(*args, &block); end
+ def getch(*args, &block); end
+ def getpass(*args, &block); end
+ def gets(*args, &block); end
+ def goto(*args, &block); end
+ def goto_column(*args, &block); end
+ def iflush(*args, &block); end
+ def initialize(output); end
+ def inspect(*args, &block); end
+ def internal_encoding(*args, &block); end
+ def ioctl(*args, &block); end
+ def ioflush(*args, &block); end
+ def isatty(*args, &block); end
+ def lineno(*args, &block); end
+ def lineno=(*args, &block); end
+ def lines(*args, &block); end
+ def method_missing(name, *args, &block); end
+ def noecho(*args, &block); end
+ def nonblock(*args, &block); end
+ def nonblock=(*args, &block); end
+ def nonblock?(*args, &block); end
+ def nread(*args, &block); end
+ def oflush(*args, &block); end
+ def output; end
+ def output=(arg0); end
+ def pathconf(*args, &block); end
+ def pid(*args, &block); end
+ def pos(*args, &block); end
+ def pos=(*args, &block); end
+ def pread(*args, &block); end
+ def pressed?(*args, &block); end
+ def print(*args, &block); end
+ def printf(*args, &block); end
+ def putc(*args, &block); end
+ def puts(*args, &block); end
+ def pwrite(*args, &block); end
+ def raw!(*args, &block); end
+ def raw(*args, &block); end
+ def read(*args, &block); end
+ def read_nonblock(*args, &block); end
+ def readbyte(*args, &block); end
+ def readchar(*args, &block); end
+ def readline(*args, &block); end
+ def readlines(*args, &block); end
+ def readpartial(*args, &block); end
+ def ready?(*args, &block); end
+ def reopen(*args, &block); end
+ def respond_to?(name, priv = nil); end
+ def rewind(*args, &block); end
+ def scroll_backward(*args, &block); end
+ def scroll_forward(*args, &block); end
+ def seek(*args, &block); end
+ def set_encoding(*args, &block); end
+ def set_encoding_by_bom(*args, &block); end
+ def stat(*args, &block); end
+ def sync(*args, &block); end
+ def sync=(*args, &block); end
+ def sysread(*args, &block); end
+ def sysseek(*args, &block); end
+ def syswrite(*args, &block); end
+ def tell(*args, &block); end
+ def to_i(*args, &block); end
+ def to_io(*args, &block); end
+ def tty?(*args, &block); end
+ def ungetbyte(*args, &block); end
+ def ungetc(*args, &block); end
+ def wait(*args, &block); end
+ def wait_readable(*args, &block); end
+ def wait_writable(*args, &block); end
+ def winsize(*args, &block); end
+ def winsize=(*args, &block); end
+ def write(*args, &block); end
+ def write_nonblock(*args, &block); end
+end
+class RSpec::Core::Configuration
+ def absolute_pattern?(pattern); end
+ def add_formatter(formatter, output = nil); end
+ def add_hook_to_existing_matching_groups(meta, scope, &block); end
+ def add_setting(name, opts = nil); end
+ def after(scope = nil, *meta, &block); end
+ def alias_example_group_to(new_name, *args); end
+ def alias_example_to(name, *args); end
+ def alias_it_behaves_like_to(new_name, report_label = nil); end
+ def alias_it_should_behave_like_to(new_name, report_label = nil); end
+ def append_after(scope = nil, *meta, &block); end
+ def append_before(scope = nil, *meta, &block); end
+ def apply_derived_metadata_to(metadata); end
+ def around(scope = nil, *meta, &block); end
+ def assert_no_example_groups_defined(config_option); end
+ def backtrace_exclusion_patterns; end
+ def backtrace_exclusion_patterns=(patterns); end
+ def backtrace_formatter; end
+ def backtrace_inclusion_patterns; end
+ def backtrace_inclusion_patterns=(patterns); end
+ def before(scope = nil, *meta, &block); end
+ def bisect_runner; end
+ def bisect_runner=(value); end
+ def bisect_runner_class; end
+ def clear_values_derived_from_example_status_persistence_file_path; end
+ def color; end
+ def color=(arg0); end
+ def color_enabled?(output = nil); end
+ def color_mode; end
+ def color_mode=(arg0); end
+ def command; end
+ def conditionally_disable_expectations_monkey_patching; end
+ def conditionally_disable_mocks_monkey_patching; end
+ def configure_example(example, example_hooks); end
+ def configure_expectation_framework; end
+ def configure_group(group); end
+ def configure_group_with(group, module_list, application_method); end
+ def configure_mock_framework; end
+ def default_color; end
+ def default_color=(arg0); end
+ def default_color?; end
+ def default_formatter; end
+ def default_formatter=(value); end
+ def default_path; end
+ def default_path=(path); end
+ def default_path?; end
+ def define_built_in_hooks; end
+ def define_derived_metadata(*filters, &block); end
+ def define_mixed_in_module(mod, filters, mod_list, config_method, &block); end
+ def deprecation_stream; end
+ def deprecation_stream=(value); end
+ def detail_color; end
+ def detail_color=(arg0); end
+ def detail_color?; end
+ def disable_monkey_patching!; end
+ def disable_monkey_patching; end
+ def disable_monkey_patching=(arg0); end
+ def drb; end
+ def drb=(arg0); end
+ def drb?; end
+ def drb_port; end
+ def drb_port=(arg0); end
+ def drb_port?; end
+ def dry_run; end
+ def dry_run=(arg0); end
+ def dry_run?; end
+ def error_exit_code; end
+ def error_exit_code=(arg0); end
+ def error_exit_code?; end
+ def error_stream; end
+ def error_stream=(arg0); end
+ def error_stream?; end
+ def example_status_persistence_file_path; end
+ def example_status_persistence_file_path=(value); end
+ def exclude_pattern; end
+ def exclude_pattern=(value); end
+ def exclusion_filter; end
+ def exclusion_filter=(filter); end
+ def expect_with(*frameworks); end
+ def expectation_framework=(framework); end
+ def expectation_frameworks; end
+ def expose_current_running_example_as(method_name); end
+ def expose_dsl_globally=(value); end
+ def expose_dsl_globally?; end
+ def extend(mod, *filters); end
+ def extract_location(path); end
+ def fail_fast; end
+ def fail_fast=(value); end
+ def fail_if_no_examples; end
+ def fail_if_no_examples=(arg0); end
+ def fail_if_no_examples?; end
+ def failure_color; end
+ def failure_color=(arg0); end
+ def failure_color?; end
+ def failure_exit_code; end
+ def failure_exit_code=(arg0); end
+ def failure_exit_code?; end
+ def file_glob_from(path, pattern); end
+ def files_or_directories_to_run=(*files); end
+ def files_to_run; end
+ def files_to_run=(arg0); end
+ def filter; end
+ def filter=(filter); end
+ def filter_gems_from_backtrace(*gem_names); end
+ def filter_manager; end
+ def filter_manager=(arg0); end
+ def filter_run(*args); end
+ def filter_run_excluding(*args); end
+ def filter_run_including(*args); end
+ def filter_run_when_matching(*args); end
+ def fixed_color; end
+ def fixed_color=(arg0); end
+ def fixed_color?; end
+ def force(hash); end
+ def format_docstrings(&block); end
+ def format_docstrings_block; end
+ def formatter=(formatter, output = nil); end
+ def formatter_loader; end
+ def formatters; end
+ def full_backtrace=(true_or_false); end
+ def full_backtrace?; end
+ def full_description; end
+ def full_description=(description); end
+ def gather_directories(path); end
+ def get_files_to_run(paths); end
+ def get_matching_files(path, pattern); end
+ def handle_suite_hook(scope, meta); end
+ def hooks; end
+ def in_project_source_dir_regex; end
+ def include(mod, *filters); end
+ def include_context(shared_group_name, *filters); end
+ def inclusion_filter; end
+ def inclusion_filter=(filter); end
+ def initialize; end
+ def last_run_statuses; end
+ def libs; end
+ def libs=(libs); end
+ def load_file_handling_errors(method, file); end
+ def load_spec_files; end
+ def loaded_spec_files; end
+ def max_displayed_failure_line_count; end
+ def max_displayed_failure_line_count=(arg0); end
+ def max_displayed_failure_line_count?; end
+ def metadata_applies_to_group?(meta, group); end
+ def mock_framework; end
+ def mock_framework=(framework); end
+ def mock_with(framework); end
+ def on_example_group_definition(&block); end
+ def on_example_group_definition_callbacks; end
+ def on_existing_matching_groups(meta); end
+ def only_failures; end
+ def only_failures?; end
+ def only_failures_but_not_configured?; end
+ def order=(*args, &block); end
+ def ordering_manager; end
+ def ordering_registry(*args, &block); end
+ def output_stream; end
+ def output_stream=(value); end
+ def output_to_tty?(output = nil); end
+ def output_wrapper; end
+ def paths_to_check(paths); end
+ def pattern; end
+ def pattern=(value); end
+ def pattern_might_load_specs_from_vendored_dirs?; end
+ def pending_color; end
+ def pending_color=(arg0); end
+ def pending_color?; end
+ def prepend(mod, *filters); end
+ def prepend_after(scope = nil, *meta, &block); end
+ def prepend_before(scope = nil, *meta, &block); end
+ def profile_examples; end
+ def profile_examples=(arg0); end
+ def profile_examples?; end
+ def project_source_dirs; end
+ def project_source_dirs=(arg0); end
+ def project_source_dirs?; end
+ def raise_errors_for_deprecations!; end
+ def raise_on_warning=(value); end
+ def register_ordering(*args, &block); end
+ def reporter; end
+ def requires; end
+ def requires=(paths); end
+ def reset; end
+ def reset_filters; end
+ def reset_reporter; end
+ def rspec_expectations_loaded?; end
+ def rspec_mocks_loaded?; end
+ def run_all_when_everything_filtered; end
+ def run_all_when_everything_filtered=(arg0); end
+ def run_all_when_everything_filtered?; end
+ def run_suite_hooks(hook_description, hooks); end
+ def safe_extend(mod, host); end
+ def safe_include(mod, host); end
+ def safe_prepend(mod, host); end
+ def seed(*args, &block); end
+ def seed=(*args, &block); end
+ def seed_used?(*args, &block); end
+ def self.add_read_only_setting(name, opts = nil); end
+ def self.add_setting(name, opts = nil); end
+ def self.define_alias(name, alias_name); end
+ def self.define_predicate(name); end
+ def self.define_reader(name); end
+ def self.delegate_to_ordering_manager(*methods); end
+ def shared_context_metadata_behavior; end
+ def shared_context_metadata_behavior=(value); end
+ def silence_filter_announcements; end
+ def silence_filter_announcements=(arg0); end
+ def silence_filter_announcements?; end
+ def spec_files_with_failures; end
+ def start_time; end
+ def start_time=(arg0); end
+ def start_time?; end
+ def static_config_filter_manager; end
+ def static_config_filter_manager=(arg0); end
+ def success_color; end
+ def success_color=(arg0); end
+ def success_color?; end
+ def threadsafe; end
+ def threadsafe=(arg0); end
+ def threadsafe?; end
+ def treat_symbols_as_metadata_keys_with_true_values=(_value); end
+ def tty; end
+ def tty=(arg0); end
+ def tty?; end
+ def update_pattern_attr(name, value); end
+ def value_for(key); end
+ def warnings=(value); end
+ def warnings?; end
+ def when_first_matching_example_defined(*filters); end
+ def with_suite_hooks; end
+ def world; end
+ def world=(arg0); end
+ include RSpec::Core::Configuration::Readers
+ include RSpec::Core::Hooks
+end
+module RSpec::Core::Configuration::Readers
+ def default_color; end
+ def default_path; end
+ def deprecation_stream; end
+ def detail_color; end
+ def drb; end
+ def drb_port; end
+ def dry_run; end
+ def error_exit_code; end
+ def error_stream; end
+ def example_status_persistence_file_path; end
+ def exclude_pattern; end
+ def fail_fast; end
+ def fail_if_no_examples; end
+ def failure_color; end
+ def failure_exit_code; end
+ def fixed_color; end
+ def libs; end
+ def max_displayed_failure_line_count; end
+ def only_failures; end
+ def output_stream; end
+ def pattern; end
+ def pending_color; end
+ def project_source_dirs; end
+ def requires; end
+ def run_all_when_everything_filtered; end
+ def shared_context_metadata_behavior; end
+ def silence_filter_announcements; end
+ def start_time; end
+ def success_color; end
+ def threadsafe; end
+ def tty; end
+end
+class RSpec::Core::Configuration::MustBeConfiguredBeforeExampleGroupsError < StandardError
+end
+class RSpec::Core::Configuration::DeprecationReporterBuffer
+ def deprecation(*args); end
+ def initialize; end
+ def play_onto(reporter); end
+end
+module RSpec::Core::Configuration::ExposeCurrentExample
+end
+class RSpec::Core::Parser
+ def add_tag_filter(options, filter_type, tag_name, value = nil); end
+ def configure_only_failures(options); end
+ def initialize(original_args); end
+ def original_args; end
+ def parse(source = nil); end
+ def parser(options); end
+ def self.parse(args, source = nil); end
+ def set_fail_fast(options, value); end
+end
+class RSpec::Core::ConfigurationOptions
+ def args; end
+ def args_from_options_file(path); end
+ def command_line_options; end
+ def configure(config); end
+ def configure_filter_manager(filter_manager); end
+ def custom_options; end
+ def custom_options_file; end
+ def env_options; end
+ def file_options; end
+ def force?(key); end
+ def global_options; end
+ def global_options_file; end
+ def home_options_file_path; end
+ def initialize(args); end
+ def load_formatters_into(config); end
+ def local_options; end
+ def local_options_file; end
+ def options; end
+ def options_file_as_erb_string(path); end
+ def options_from(path); end
+ def order(keys); end
+ def organize_options; end
+ def parse_args_ignoring_files_or_dirs_to_run(args, source); end
+ def process_options_into(config); end
+ def project_options; end
+ def project_options_file; end
+ def resolve_xdg_config_home; end
+ def xdg_options_file_if_exists; end
+ def xdg_options_file_path; end
+end
+class RSpec::Core::Runner
+ def configuration; end
+ def configure(err, out); end
+ def exit_code(examples_passed = nil); end
+ def initialize(options, configuration = nil, world = nil); end
+ def options; end
+ def persist_example_statuses; end
+ def run(err, out); end
+ def run_specs(example_groups); end
+ def self.autorun; end
+ def self.autorun_disabled?; end
+ def self.disable_autorun!; end
+ def self.handle_interrupt; end
+ def self.installed_at_exit?; end
+ def self.invoke; end
+ def self.perform_at_exit; end
+ def self.run(args, err = nil, out = nil); end
+ def self.running_in_drb?; end
+ def self.trap_interrupt; end
+ def setup(err, out); end
+ def world; end
+end
+module RSpec::Core::Invocations
+end
+class RSpec::Core::Invocations::InitializeProject
+ def call(*_args); end
+end
+class RSpec::Core::Invocations::DRbWithFallback
+ def call(options, err, out); end
+end
+class RSpec::Core::Invocations::Bisect
+ def bisect_formatter_klass_for(argument); end
+ def call(options, err, out); end
+end
+class RSpec::Core::Invocations::PrintVersion
+ def call(_options, _err, out); end
+end
+class RSpec::Core::Invocations::PrintHelp < Struct
+ def call(_options, _err, out); end
+ def hidden_options; end
+ def hidden_options=(_); end
+ def parser; end
+ def parser=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Example
+ def assign_generated_description; end
+ def clock; end
+ def clock=(arg0); end
+ def description; end
+ def display_exception; end
+ def display_exception=(ex); end
+ def duplicate_with(metadata_overrides = nil); end
+ def example_group; end
+ def example_group_instance; end
+ def exception; end
+ def execution_result; end
+ def fail_with_exception(reporter, exception); end
+ def file_path; end
+ def finish(reporter); end
+ def full_description; end
+ def generate_description; end
+ def hooks; end
+ def id; end
+ def initialize(example_group_class, description, user_metadata, example_block = nil); end
+ def inspect; end
+ def inspect_output; end
+ def instance_exec(*args, &block); end
+ def location; end
+ def location_description; end
+ def location_rerun_argument; end
+ def metadata; end
+ def mocks_need_verification?; end
+ def pending; end
+ def pending?; end
+ def record_finished(status, reporter); end
+ def reporter; end
+ def rerun_argument; end
+ def run(example_group_instance, reporter); end
+ def run_after_example; end
+ def run_before_example; end
+ def self.delegate_to_metadata(key); end
+ def self.parse_id(id); end
+ def set_aggregate_failures_exception(exception); end
+ def set_exception(exception); end
+ def skip; end
+ def skip_with_exception(reporter, exception); end
+ def skipped?; end
+ def start(reporter); end
+ def to_s; end
+ def update_inherited_metadata(updates); end
+ def verify_mocks; end
+ def with_around_and_singleton_context_hooks; end
+ def with_around_example_hooks; end
+end
+class RSpec::Core::Example::Procsy
+ def <<(*a, &b); end
+ def ===(*a, &b); end
+ def >>(*a, &b); end
+ def [](*a, &b); end
+ def arity(*a, &b); end
+ def binding(*a, &b); end
+ def call(*args, &block); end
+ def clock(*a, &b); end
+ def clock=(*a, &b); end
+ def clone(*a, &b); end
+ def curry(*a, &b); end
+ def description(*a, &b); end
+ def dup(*a, &b); end
+ def duplicate_with(*a, &b); end
+ def example; end
+ def example_group(*a, &b); end
+ def example_group_instance(*a, &b); end
+ def exception(*a, &b); end
+ def executed?; end
+ def execution_result(*a, &b); end
+ def file_path(*a, &b); end
+ def full_description(*a, &b); end
+ def hash(*a, &b); end
+ def id(*a, &b); end
+ def initialize(example, &block); end
+ def inspect; end
+ def inspect_output(*a, &b); end
+ def lambda?(*a, &b); end
+ def location(*a, &b); end
+ def location_rerun_argument(*a, &b); end
+ def metadata(*a, &b); end
+ def parameters(*a, &b); end
+ def pending(*a, &b); end
+ def pending?(*a, &b); end
+ def reporter(*a, &b); end
+ def rerun_argument(*a, &b); end
+ def ruby2_keywords(*a, &b); end
+ def run(*args, &block); end
+ def skip(*a, &b); end
+ def skipped?(*a, &b); end
+ def source_location(*a, &b); end
+ def to_proc; end
+ def update_inherited_metadata(*a, &b); end
+ def wrap(&block); end
+ def yield(*a, &b); end
+end
+class RSpec::Core::Example::ExecutionResult
+ def calculate_run_time(finished_at); end
+ def ensure_timing_set(clock); end
+ def example_skipped?; end
+ def exception; end
+ def exception=(arg0); end
+ def finished_at; end
+ def finished_at=(arg0); end
+ def get_value(name); end
+ def hash_for_delegation; end
+ def issue_deprecation(_method_name, *_args); end
+ def pending_exception; end
+ def pending_exception=(arg0); end
+ def pending_fixed; end
+ def pending_fixed=(arg0); end
+ def pending_fixed?; end
+ def pending_message; end
+ def pending_message=(arg0); end
+ def record_finished(status, finished_at); end
+ def run_time; end
+ def run_time=(arg0); end
+ def set_value(name, value); end
+ def started_at; end
+ def started_at=(arg0); end
+ def status; end
+ def status=(arg0); end
+ extend RSpec::Core::HashImitatable::ClassMethods
+ include RSpec::Core::HashImitatable
+end
+class RSpec::Core::SuiteHookContext < RSpec::Core::Example
+ def initialize(hook_description, reporter); end
+ def set_exception(exception); end
+end
+class RSpec::Core::SharedExampleGroupModule < Module
+ def definition; end
+ def include_in(klass, inclusion_line, args, customization_block); end
+ def included(klass); end
+ def initialize(description, definition, metadata); end
+ def inspect; end
+ def to_s; end
+end
+module RSpec::Core::SharedExampleGroup
+ def shared_context(name, *args, &block); end
+ def shared_examples(name, *args, &block); end
+ def shared_examples_for(name, *args, &block); end
+end
+module RSpec::Core::SharedExampleGroup::TopLevelDSL
+ def self.definitions; end
+ def self.expose_globally!; end
+ def self.exposed_globally?; end
+ def self.remove_globally!; end
+end
+class RSpec::Core::SharedExampleGroup::Registry
+ def add(context, name, *metadata_args, &block); end
+ def ensure_block_has_source_location(_block); end
+ def find(lookup_contexts, name); end
+ def formatted_location(block); end
+ def legacy_add(context, name, *metadata_args, &block); end
+ def shared_example_groups; end
+ def valid_name?(candidate); end
+ def warn_if_key_taken(context, key, new_block); end
+end
+class RSpec::Core::ExampleGroup
+ def described_class; end
+ def initialize(inspect_output = nil); end
+ def inspect; end
+ def method_missing(name, *args); end
+ def self.add_example(example); end
+ def self.before_context_ivars; end
+ def self.children; end
+ def self.context(*args, &example_group_block); end
+ def self.currently_executing_a_context_hook?; end
+ def self.declaration_locations; end
+ def self.define_example_group_method(name, metadata = nil); end
+ def self.define_example_method(name, extra_options = nil); end
+ def self.define_nested_shared_group_method(new_name, report_label = nil); end
+ def self.delegate_to_metadata(*names); end
+ def self.descendant_filtered_examples; end
+ def self.descendants; end
+ def self.describe(*args, &example_group_block); end
+ def self.described_class; end
+ def self.description; end
+ def self.each_instance_variable_for_example(group); end
+ def self.ensure_example_groups_are_configured; end
+ def self.example(*all_args, &block); end
+ def self.example_group(*args, &example_group_block); end
+ def self.examples; end
+ def self.fcontext(*args, &example_group_block); end
+ def self.fdescribe(*args, &example_group_block); end
+ def self.fexample(*all_args, &block); end
+ def self.file_path; end
+ def self.filtered_examples; end
+ def self.find_and_eval_shared(label, name, inclusion_location, *args, &customization_block); end
+ def self.fit(*all_args, &block); end
+ def self.focus(*all_args, &block); end
+ def self.for_filtered_examples(reporter, &block); end
+ def self.fspecify(*all_args, &block); end
+ def self.id; end
+ def self.idempotently_define_singleton_method(name, &definition); end
+ def self.include_context(name, *args, &block); end
+ def self.include_examples(name, *args, &block); end
+ def self.it(*all_args, &block); end
+ def self.it_behaves_like(name, *args, &customization_block); end
+ def self.it_should_behave_like(name, *args, &customization_block); end
+ def self.location; end
+ def self.metadata; end
+ def self.method_missing(name, *args); end
+ def self.next_runnable_index_for(file); end
+ def self.ordering_strategy; end
+ def self.parent_groups; end
+ def self.pending(*all_args, &block); end
+ def self.remove_example(example); end
+ def self.reset_memoized; end
+ def self.run(reporter = nil); end
+ def self.run_after_context_hooks(example_group_instance); end
+ def self.run_before_context_hooks(example_group_instance); end
+ def self.run_examples(reporter); end
+ def self.set_it_up(description, args, registration_collection, &example_group_block); end
+ def self.set_ivars(instance, ivars); end
+ def self.skip(*all_args, &block); end
+ def self.specify(*all_args, &block); end
+ def self.store_before_context_ivars(example_group_instance); end
+ def self.subclass(parent, description, args, registration_collection, &example_group_block); end
+ def self.superclass_before_context_ivars; end
+ def self.superclass_metadata; end
+ def self.top_level?; end
+ def self.top_level_description; end
+ def self.traverse_tree_until(&block); end
+ def self.update_inherited_metadata(updates); end
+ def self.with_replaced_metadata(meta); end
+ def self.xcontext(*args, &example_group_block); end
+ def self.xdescribe(*args, &example_group_block); end
+ def self.xexample(*all_args, &block); end
+ def self.xit(*all_args, &block); end
+ def self.xspecify(*all_args, &block); end
+ extend RSpec::Core::Hooks
+ extend RSpec::Core::MemoizedHelpers::ClassMethods
+ extend RSpec::Core::SharedExampleGroup
+ include RSpec::Core::MemoizedHelpers
+ include RSpec::Core::MockingAdapters::RSpec
+ include RSpec::Core::Pending
+ include RSpec::Matchers
+end
+class RSpec::Core::ExampleGroup::WrongScopeError < NoMethodError
+end
+class RSpec::Core::AnonymousExampleGroup < RSpec::Core::ExampleGroup
+ def self.metadata; end
+end
+class RSpec::Core::SharedExampleGroupInclusionStackFrame
+ def description; end
+ def formatted_inclusion_location; end
+ def inclusion_location; end
+ def initialize(shared_group_name, inclusion_location); end
+ def self.current_backtrace; end
+ def self.shared_example_group_inclusions; end
+ def self.with_frame(name, location); end
+ def shared_group_name; end
+end
+module RSpec::ExampleGroups
+ def self.assign_const(group); end
+ def self.base_name_for(group); end
+ def self.constant_scope_for(group); end
+ def self.disambiguate(name, const_scope); end
+ def self.remove_all_constants; end
+ extend RSpec::Support::RecursiveConstMethods
+end
+module RSpec::Support
+ def self.require_rspec_core(f); end
+end
+class RSpec::Core::Time
+ def self.now(*arg0); end
+end
+class Module
+ def context(*a, &b); end
+ def describe(*a, &b); end
+ def example_group(*a, &b); end
+ def fcontext(*a, &b); end
+ def fdescribe(*a, &b); end
+ def shared_context(name, *args, &block); end
+ def shared_examples(name, *args, &block); end
+ def shared_examples_for(name, *args, &block); end
+ def xcontext(*a, &b); end
+ def xdescribe(*a, &b); end
+end
+module RSpec::Core::SharedContext
+ def __shared_context_recordings; end
+ def after(*args, &block); end
+ def append_after(*args, &block); end
+ def append_before(*args, &block); end
+ def around(*args, &block); end
+ def before(*args, &block); end
+ def context(*args, &block); end
+ def describe(*args, &block); end
+ def hooks(*args, &block); end
+ def included(group); end
+ def let!(*args, &block); end
+ def let(*args, &block); end
+ def prepend_after(*args, &block); end
+ def prepend_before(*args, &block); end
+ def self.record(methods); end
+ def subject!(*args, &block); end
+ def subject(*args, &block); end
+end
+class RSpec::Core::SharedContext::Recording < Struct
+ def args; end
+ def args=(_); end
+ def block; end
+ def block=(_); end
+ def method_name; end
+ def method_name=(_); end
+ def playback_onto(group); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::ExampleStatusPersister
+ def dump_statuses(unparsed_previous_runs); end
+ def initialize(examples, file_name); end
+ def persist; end
+ def self.load_from(file_name); end
+ def self.persist(examples, file_name); end
+ def statuses_from_this_run; end
+end
+class RSpec::Core::ExampleStatusMerger
+ def delete_previous_examples_that_no_longer_exist; end
+ def example_must_no_longer_exist?(ex_id); end
+ def hash_from(example_list); end
+ def initialize(this_run, from_previous_runs); end
+ def loaded_spec_files; end
+ def merge; end
+ def self.merge(this_run, from_previous_runs); end
+ def sort_value_from(example); end
+ def spec_file_from(ex_id); end
+end
+class RSpec::Core::ExampleStatusDumper
+ def column_widths; end
+ def dump; end
+ def formatted_header_rows; end
+ def formatted_row_from(row_values); end
+ def formatted_value_rows; end
+ def headers; end
+ def initialize(examples); end
+ def rows; end
+ def self.dump(examples); end
+end
+class RSpec::Core::ExampleStatusParser
+ def headers; end
+ def initialize(string); end
+ def parse; end
+ def parse_row(line); end
+ def self.parse(string); end
+ def split_line(line); end
+end
+class RSpec::Core::Profiler
+ def example_group_finished(notification); end
+ def example_group_started(notification); end
+ def example_groups; end
+ def example_started(notification); end
+ def initialize; end
+end
+class RSpec::Core::DidYouMean
+ def call; end
+ def formats(probables); end
+ def initialize(relative_file_name); end
+ def red_font(mytext); end
+ def relative_file_name; end
+ def top_and_tail(rspec_format); end
+end
+class RSpec::Core::Formatters::BaseFormatter
+ def close(_notification); end
+ def example_group; end
+ def example_group=(arg0); end
+ def example_group_started(notification); end
+ def initialize(output); end
+ def output; end
+ def output_supports_sync; end
+ def restore_sync_output; end
+ def start(notification); end
+ def start_sync_output; end
+end
+class RSpec::Core::Formatters::BaseTextFormatter < RSpec::Core::Formatters::BaseFormatter
+ def close(_notification); end
+ def dump_failures(notification); end
+ def dump_pending(notification); end
+ def dump_summary(summary); end
+ def message(notification); end
+ def seed(notification); end
+end
+class RSpec::Core::Formatters::DocumentationFormatter < RSpec::Core::Formatters::BaseTextFormatter
+ def current_indentation(offset = nil); end
+ def example_failed(failure); end
+ def example_group_finished(_notification); end
+ def example_group_started(notification); end
+ def example_passed(passed); end
+ def example_pending(pending); end
+ def example_started(_notification); end
+ def failure_output(example); end
+ def flush_messages; end
+ def initialize(output); end
+ def message(notification); end
+ def next_failure_index; end
+ def passed_output(example); end
+ def pending_output(example, message); end
+end
+class RSpec::Core::Formatters::HtmlPrinter
+ def flush; end
+ def indentation_style(number_of_parents); end
+ def initialize(output); end
+ def make_example_group_header_red(group_id); end
+ def make_example_group_header_yellow(group_id); end
+ def make_header_red; end
+ def make_header_yellow; end
+ def move_progress(percent_done); end
+ def print_example_failed(pending_fixed, description, run_time, failure_id, exception, extra_content); end
+ def print_example_group_end; end
+ def print_example_group_start(group_id, description, number_of_parents); end
+ def print_example_passed(description, run_time); end
+ def print_example_pending(description, pending_message); end
+ def print_html_start; end
+ def print_summary(duration, example_count, failure_count, pending_count); end
+ include ERB::Util
+end
+class RSpec::Core::Formatters::HtmlFormatter < RSpec::Core::Formatters::BaseFormatter
+ def dump_summary(summary); end
+ def example_failed(failure); end
+ def example_group_number; end
+ def example_group_started(notification); end
+ def example_number; end
+ def example_passed(passed); end
+ def example_pending(pending); end
+ def example_started(_notification); end
+ def extra_failure_content(failure); end
+ def initialize(output); end
+ def percent_done; end
+ def start(notification); end
+ def start_dump(_notification); end
+end
+class RSpec::Core::Formatters::FallbackMessageFormatter
+ def initialize(output); end
+ def message(notification); end
+ def output; end
+end
+class RSpec::Core::Formatters::ProgressFormatter < RSpec::Core::Formatters::BaseTextFormatter
+ def example_failed(_notification); end
+ def example_passed(_notification); end
+ def example_pending(_notification); end
+ def start_dump(_notification); end
+end
+class RSpec::Core::Formatters::ProfileFormatter
+ def bold(text); end
+ def dump_profile(profile); end
+ def dump_profile_slowest_example_groups(profile); end
+ def dump_profile_slowest_examples(profile); end
+ def format_caller(caller_info); end
+ def initialize(output); end
+ def output; end
+end
+class RSpec::Core::Formatters::JsonFormatter < RSpec::Core::Formatters::BaseFormatter
+ def close(_notification); end
+ def dump_profile(profile); end
+ def dump_profile_slowest_example_groups(profile); end
+ def dump_profile_slowest_examples(profile); end
+ def dump_summary(summary); end
+ def format_example(example); end
+ def initialize(output); end
+ def message(notification); end
+ def output_hash; end
+ def seed(notification); end
+ def stop(notification); end
+end
+module RSpec::Core::Bisect
+end
+class RSpec::Core::Bisect::ExampleSetDescriptor < Struct
+ def all_example_ids; end
+ def all_example_ids=(_); end
+ def failed_example_ids; end
+ def failed_example_ids=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Bisect::BisectFailedError < StandardError
+ def self.for_failed_spec_run(spec_output); end
+end
+class RSpec::Core::Bisect::Notifier
+ def initialize(formatter); end
+ def publish(event, *args); end
+end
+class RSpec::Core::Bisect::Channel
+ def close; end
+ def initialize; end
+ def receive; end
+ def send(message); end
+end
+class RSpec::Core::Formatters::BaseBisectFormatter
+ def example_failed(notification); end
+ def example_finished(notification); end
+ def initialize(expected_failures); end
+ def self.inherited(formatter); end
+ def start_dump(_notification); end
+end
+class RSpec::Core::Formatters::BisectDRbFormatter < RSpec::Core::Formatters::BaseBisectFormatter
+ def initialize(_output); end
+ def notify_results(results); end
+end
+class RSpec::Core::Formatters::FailureListFormatter < RSpec::Core::Formatters::BaseFormatter
+ def dump_profile(_profile); end
+ def example_failed(failure); end
+ def message(_message); end
+end
+module RSpec::Core::MockingAdapters
+end
+module RSpec::Core::MockingAdapters::RSpec
+ def self.configuration; end
+ def self.framework_name; end
+ def setup_mocks_for_rspec; end
+ def teardown_mocks_for_rspec; end
+ def verify_mocks_for_rspec; end
+ include RSpec::Mocks::ExampleMethods
+ include RSpec::Mocks::ExampleMethods::ExpectHost
+end
+class RSpec::ExampleGroups::PDFReaderBufferTokenMethod < RSpec::Core::ExampleGroup
+ extend RSpec::Matchers::DSL
+end
+class RSpec::Expectations::MultipleExpectationsNotMetError < RSpec::Expectations::ExpectationNotMetError
+ include RSpec::Core::MultipleExceptionError::InterfaceTag
+end
+class RSpec::ExampleGroups::PDFReader < RSpec::Core::ExampleGroup
+ extend RSpec::Matchers::DSL
+end
diff --git a/sorbet/rbi/gems/rspec-expectations.rbi b/sorbet/rbi/gems/rspec-expectations.rbi
new file mode 100644
index 0000000..24a7e5c
--- /dev/null
+++ b/sorbet/rbi/gems/rspec-expectations.rbi
@@ -0,0 +1,1148 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rspec-expectations/all/rspec-expectations.rbi
+#
+# rspec-expectations-3.10.1
+
+module RSpec
+end
+module RSpec::Matchers
+ def a_block_changing(*args, &block); end
+ def a_block_outputting(*args, &block); end
+ def a_block_raising(*args, &block); end
+ def a_block_throwing(*args, &block); end
+ def a_block_yielding_control(*args, &block); end
+ def a_block_yielding_successive_args(*args, &block); end
+ def a_block_yielding_with_args(*args, &block); end
+ def a_block_yielding_with_no_args(*args, &block); end
+ def a_collection_containing_exactly(*args, &block); end
+ def a_collection_ending_with(*args, &block); end
+ def a_collection_including(*args, &block); end
+ def a_collection_starting_with(*args, &block); end
+ def a_falsey_value(*args, &block); end
+ def a_falsy_value(*args, &block); end
+ def a_hash_including(*args, &block); end
+ def a_kind_of(*args, &block); end
+ def a_nil_value(*args, &block); end
+ def a_range_covering(*args, &block); end
+ def a_string_ending_with(*args, &block); end
+ def a_string_including(*args, &block); end
+ def a_string_matching(*args, &block); end
+ def a_string_starting_with(*args, &block); end
+ def a_truthy_value(*args, &block); end
+ def a_value(*args, &block); end
+ def a_value_between(*args, &block); end
+ def a_value_within(*args, &block); end
+ def aggregate_failures(label = nil, metadata = nil, &block); end
+ def all(expected); end
+ def an_instance_of(*args, &block); end
+ def an_object_eq_to(*args, &block); end
+ def an_object_eql_to(*args, &block); end
+ def an_object_equal_to(*args, &block); end
+ def an_object_existing(*args, &block); end
+ def an_object_having_attributes(*args, &block); end
+ def an_object_matching(*args, &block); end
+ def an_object_responding_to(*args, &block); end
+ def an_object_satisfying(*args, &block); end
+ def be(*args); end
+ def be_a(klass); end
+ def be_a_kind_of(expected); end
+ def be_an(klass); end
+ def be_an_instance_of(expected); end
+ def be_between(min, max); end
+ def be_falsey; end
+ def be_falsy(*args, &block); end
+ def be_instance_of(expected); end
+ def be_kind_of(expected); end
+ def be_nil; end
+ def be_truthy; end
+ def be_within(delta); end
+ def change(receiver = nil, message = nil, &block); end
+ def changing(*args, &block); end
+ def contain_exactly(*items); end
+ def containing_exactly(*args, &block); end
+ def cover(*values); end
+ def covering(*args, &block); end
+ def end_with(*expected); end
+ def ending_with(*args, &block); end
+ def eq(expected); end
+ def eq_to(*args, &block); end
+ def eql(expected); end
+ def eql_to(*args, &block); end
+ def equal(expected); end
+ def equal_to(*args, &block); end
+ def exist(*args); end
+ def existing(*args, &block); end
+ def expect(value = nil, &block); end
+ def have_attributes(expected); end
+ def having_attributes(*args, &block); end
+ def include(*expected); end
+ def including(*args, &block); end
+ def match(expected); end
+ def match_array(items); end
+ def match_regex(*args, &block); end
+ def matching(*args, &block); end
+ def method_missing(method, *args, &block); end
+ def output(expected = nil); end
+ def raise_error(error = nil, message = nil, &block); end
+ def raise_exception(error = nil, message = nil, &block); end
+ def raising(*args, &block); end
+ def respond_to(*names); end
+ def respond_to_missing?(method, *arg1); end
+ def responding_to(*args, &block); end
+ def satisfy(description = nil, &block); end
+ def satisfying(*args, &block); end
+ def self.alias_matcher(*args, &block); end
+ def self.clear_generated_description; end
+ def self.configuration; end
+ def self.generated_description; end
+ def self.is_a_describable_matcher?(obj); end
+ def self.is_a_matcher?(obj); end
+ def self.last_description; end
+ def self.last_expectation_handler; end
+ def self.last_expectation_handler=(arg0); end
+ def self.last_matcher; end
+ def self.last_matcher=(arg0); end
+ def start_with(*expected); end
+ def starting_with(*args, &block); end
+ def throw_symbol(expected_symbol = nil, expected_arg = nil); end
+ def throwing(*args, &block); end
+ def within(*args, &block); end
+ def yield_control; end
+ def yield_successive_args(*args); end
+ def yield_with_args(*args); end
+ def yield_with_no_args; end
+ def yielding_control(*args, &block); end
+ def yielding_successive_args(*args, &block); end
+ def yielding_with_args(*args, &block); end
+ def yielding_with_no_args(*args, &block); end
+ extend RSpec::Matchers::DSL
+end
+module RSpec::Matchers::EnglishPhrasing
+ def self.list(obj); end
+ def self.split_words(sym); end
+end
+module RSpec::Matchers::Composable
+ def &(matcher); end
+ def ===(value); end
+ def and(matcher); end
+ def description_of(object); end
+ def or(matcher); end
+ def self.should_enumerate?(item); end
+ def self.surface_descriptions_in(item); end
+ def self.unreadable_io?(object); end
+ def should_enumerate?(item); end
+ def surface_descriptions_in(item); end
+ def unreadable_io?(object); end
+ def values_match?(expected, actual); end
+ def with_matchers_cloned(object); end
+ def |(matcher); end
+end
+class RSpec::Matchers::Composable::DescribableItem < Struct
+ def inspect; end
+ def item; end
+ def item=(_); end
+ def pretty_print(pp); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+module RSpec::Matchers::BuiltIn
+end
+class RSpec::Matchers::BuiltIn::BaseMatcher
+ def actual; end
+ def actual_formatted; end
+ def assert_ivars(*expected_ivars); end
+ def description; end
+ def diffable?; end
+ def expected; end
+ def expected_formatted; end
+ def expects_call_stack_jump?; end
+ def initialize(expected = nil); end
+ def match_unless_raises(*exceptions); end
+ def matcher_name; end
+ def matcher_name=(arg0); end
+ def matches?(actual); end
+ def present_ivars; end
+ def rescued_exception; end
+ def self.matcher_name; end
+ def self.underscore(camel_cased_word); end
+ def supports_block_expectations?; end
+ include RSpec::Matchers::BuiltIn::BaseMatcher::DefaultFailureMessages
+ include RSpec::Matchers::BuiltIn::BaseMatcher::HashFormatting
+ include RSpec::Matchers::Composable
+end
+module RSpec::Matchers::BuiltIn::BaseMatcher::HashFormatting
+ def improve_hash_formatting(inspect_string); end
+ def self.improve_hash_formatting(inspect_string); end
+end
+module RSpec::Matchers::BuiltIn::BaseMatcher::DefaultFailureMessages
+ def failure_message; end
+ def failure_message_when_negated; end
+ def self.has_default_failure_messages?(matcher); end
+end
+module RSpec::Matchers::DSL
+ def alias_matcher(new_name, old_name, options = nil, &description_override); end
+ def define(name, &declarations); end
+ def define_negated_matcher(negated_name, base_name, &description_override); end
+ def matcher(name, &declarations); end
+ def warn_about_block_args(name, declarations); end
+end
+module RSpec::Matchers::DSL::Macros
+ def assign_attributes(attr_names); end
+ def chain(method_name, *attr_names, &definition); end
+ def define_user_override(method_name, user_def, &our_def); end
+ def description(&definition); end
+ def diffable; end
+ def failure_message(&definition); end
+ def failure_message_when_negated(&definition); end
+ def match(options = nil, &match_block); end
+ def match_unless_raises(expected_exception = nil, &match_block); end
+ def match_when_negated(options = nil, &match_block); end
+ def supports_block_expectations; end
+end
+module RSpec::Matchers::DSL::Macros::Deprecated
+ def failure_message_for_should(&definition); end
+ def failure_message_for_should_not(&definition); end
+ def match_for_should(&definition); end
+ def match_for_should_not(&definition); end
+end
+module RSpec::Matchers::DSL::DefaultImplementations
+ def chained_method_clause_sentences; end
+ def description; end
+ def diffable?; end
+ def expects_call_stack_jump?; end
+ def supports_block_expectations?; end
+ include RSpec::Matchers::BuiltIn::BaseMatcher::DefaultFailureMessages
+end
+class RSpec::Matchers::DSL::Matcher
+ def actual; end
+ def actual_arg_for(block); end
+ def block_arg; end
+ def expected; end
+ def expected_as_array; end
+ def initialize(name, declarations, matcher_execution_context, *expected, &block_arg); end
+ def inspect; end
+ def method_missing(method, *args, &block); end
+ def name; end
+ def rescued_exception; end
+ def respond_to_missing?(method, include_private = nil); end
+ extend RSpec::Matchers::DSL::Macros
+ extend RSpec::Matchers::DSL::Macros::Deprecated
+ include RSpec::Matchers
+ include RSpec::Matchers::Composable
+ include RSpec::Matchers::DSL::DefaultImplementations
+end
+class RSpec::Matchers::MatcherDelegator
+ def base_matcher; end
+ def initialize(base_matcher); end
+ def initialize_copy(other); end
+ def method_missing(*args, &block); end
+ def respond_to_missing?(name, include_all = nil); end
+ include RSpec::Matchers::Composable
+end
+class RSpec::Matchers::AliasedMatcher < RSpec::Matchers::MatcherDelegator
+ def description; end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def initialize(base_matcher, description_block); end
+ def method_missing(*arg0); end
+end
+class RSpec::Matchers::AliasedMatcherWithOperatorSupport < RSpec::Matchers::AliasedMatcher
+end
+class RSpec::Matchers::AliasedNegatedMatcher < RSpec::Matchers::AliasedMatcher
+ def does_not_match?(*args, &block); end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def matches?(*args, &block); end
+ def optimal_failure_message(same, inverted); end
+end
+class RSpec::Matchers::ExpectedsForMultipleDiffs
+ def diffs(differ, actual); end
+ def initialize(expected_list); end
+ def message_with_diff(message, differ, actual); end
+ def self.diff_label_for(matcher); end
+ def self.for_many_matchers(matchers); end
+ def self.from(expected); end
+ def self.truncated(description); end
+end
+module RSpec::Support
+ def self.require_rspec_expectations(f); end
+ def self.require_rspec_matchers(f); end
+end
+module RSpec::Expectations
+ def self.configuration; end
+ def self.differ; end
+ def self.fail_with(message, expected = nil, actual = nil); end
+end
+class RSpec::Expectations::ExpectationTarget
+ def initialize(value); end
+ def self.for(value, block); end
+ def target; end
+ include RSpec::Expectations::ExpectationTarget::InstanceMethods
+end
+module RSpec::Expectations::ExpectationTarget::UndefinedValue
+end
+module RSpec::Expectations::ExpectationTarget::InstanceMethods
+ def not_to(matcher = nil, message = nil, &block); end
+ def prevent_operator_matchers(verb); end
+ def to(matcher = nil, message = nil, &block); end
+ def to_not(matcher = nil, message = nil, &block); end
+end
+class RSpec::Expectations::BlockExpectationTarget < RSpec::Expectations::ExpectationTarget
+ def enforce_block_expectation(matcher); end
+ def not_to(matcher, message = nil, &block); end
+ def supports_block_expectations?(matcher); end
+ def to(matcher, message = nil, &block); end
+ def to_not(matcher, message = nil, &block); end
+end
+module RSpec::Expectations::Syntax
+ def default_should_host; end
+ def disable_expect(syntax_host = nil); end
+ def disable_should(syntax_host = nil); end
+ def enable_expect(syntax_host = nil); end
+ def enable_should(syntax_host = nil); end
+ def expect_enabled?(syntax_host = nil); end
+ def self.default_should_host; end
+ def self.disable_expect(syntax_host = nil); end
+ def self.disable_should(syntax_host = nil); end
+ def self.enable_expect(syntax_host = nil); end
+ def self.enable_should(syntax_host = nil); end
+ def self.expect_enabled?(syntax_host = nil); end
+ def self.should_enabled?(syntax_host = nil); end
+ def self.warn_about_should!; end
+ def self.warn_about_should_unless_configured(method_name); end
+ def should_enabled?(syntax_host = nil); end
+ def warn_about_should!; end
+ def warn_about_should_unless_configured(method_name); end
+end
+class BasicObject
+end
+class RSpec::Expectations::Configuration
+ def add_should_and_should_not_to(*modules); end
+ def backtrace_formatter; end
+ def backtrace_formatter=(arg0); end
+ def color?; end
+ def false_positives_handler; end
+ def include_chain_clauses_in_custom_matcher_descriptions=(arg0); end
+ def include_chain_clauses_in_custom_matcher_descriptions?; end
+ def initialize; end
+ def max_formatted_output_length=(length); end
+ def on_potential_false_positives; end
+ def on_potential_false_positives=(behavior); end
+ def reset_syntaxes_to_default; end
+ def strict_predicate_matchers; end
+ def strict_predicate_matchers=(flag); end
+ def strict_predicate_matchers?; end
+ def syntax; end
+ def syntax=(values); end
+ def warn_about_potential_false_positives=(boolean); end
+ def warn_about_potential_false_positives?; end
+end
+module RSpec::Expectations::Configuration::NullBacktraceFormatter
+ def self.format_backtrace(backtrace); end
+end
+class InvalidName___Class_0x00___Differ_11
+end
+module RSpec::Expectations::ExpectationHelper
+ def self.check_message(msg); end
+ def self.handle_failure(matcher, message, failure_message_method); end
+ def self.modern_matcher_from(matcher); end
+ def self.with_matcher(handler, matcher, message); end
+end
+class RSpec::Expectations::PositiveExpectationHandler
+ def self.handle_matcher(actual, initial_matcher, custom_message = nil, &block); end
+ def self.opposite_should_method; end
+ def self.should_method; end
+ def self.verb; end
+end
+class RSpec::Expectations::NegativeExpectationHandler
+ def self.does_not_match?(matcher, actual, &block); end
+ def self.handle_matcher(actual, initial_matcher, custom_message = nil, &block); end
+ def self.opposite_should_method; end
+ def self.should_method; end
+ def self.verb; end
+end
+class RSpec::Expectations::LegacyMatcherAdapter < RSpec::Matchers::MatcherDelegator
+ def initialize(matcher); end
+ def self.wrap(matcher); end
+end
+class RSpec::Expectations::LegacyMatcherAdapter::RSpec2 < RSpec::Expectations::LegacyMatcherAdapter
+ def failure_message; end
+ def failure_message_when_negated; end
+ def self.interface_matches?(matcher); end
+end
+class RSpec::Expectations::LegacyMatcherAdapter::RSpec1 < RSpec::Expectations::LegacyMatcherAdapter
+ def failure_message; end
+ def failure_message_when_negated; end
+ def self.interface_matches?(matcher); end
+end
+module RSpec::Expectations::Version
+end
+class RSpec::Expectations::ExpectationNotMetError < Exception
+end
+class RSpec::Expectations::MultipleExpectationsNotMetError < RSpec::Expectations::ExpectationNotMetError
+ def aggregation_block_label; end
+ def aggregation_metadata; end
+ def all_exceptions; end
+ def backtrace_line(line); end
+ def block_description; end
+ def enumerated(exceptions, index_offset); end
+ def enumerated_errors; end
+ def enumerated_failures; end
+ def exception_count_description; end
+ def exclusion_patterns; end
+ def failures; end
+ def format_backtrace(backtrace); end
+ def indentation; end
+ def indented(failure_message, index); end
+ def index_label(index); end
+ def initialize(failure_aggregator); end
+ def longest_index_label_width; end
+ def message; end
+ def other_errors; end
+ def pluralize(noun, count); end
+ def summary; end
+ def width_of_label(index); end
+end
+class RSpec::Expectations::BlockSnippetExtractor
+ def beginning_line_number; end
+ def block_token_extractor; end
+ def body_content_lines; end
+ def file_path; end
+ def initialize(proc, method_name); end
+ def method_name; end
+ def proc; end
+ def raw_body_lines; end
+ def raw_body_snippet; end
+ def self.try_extracting_single_line_body_of(proc, method_name); end
+ def source; end
+ def source_location; end
+end
+class RSpec::Expectations::BlockSnippetExtractor::Error < StandardError
+end
+class RSpec::Expectations::BlockSnippetExtractor::TargetNotFoundError < RSpec::Expectations::BlockSnippetExtractor::Error
+end
+class RSpec::Expectations::BlockSnippetExtractor::AmbiguousTargetError < RSpec::Expectations::BlockSnippetExtractor::Error
+end
+class RSpec::Expectations::BlockSnippetExtractor::BlockTokenExtractor < Struct
+ def after_beginning_of_args_state(token); end
+ def after_beginning_of_body_state(token); end
+ def after_method_call_state(token); end
+ def after_opener_state(token); end
+ def beginning_line_number; end
+ def beginning_line_number=(_); end
+ def block_locator; end
+ def body_tokens; end
+ def correct_block?(body_tokens); end
+ def finalize_pending_tokens!; end
+ def finish!; end
+ def finish_or_find_next_block_if_incorrect!; end
+ def handle_closer_token(token); end
+ def handle_opener_token(token); end
+ def initial_state(token); end
+ def initialize(*arg0); end
+ def invoke_state_handler(token); end
+ def method_name; end
+ def method_name=(_); end
+ def opener_token?(token); end
+ def opener_token_stack; end
+ def parse!; end
+ def pending_tokens; end
+ def pipe_token?(token); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def source; end
+ def source=(_); end
+ def state; end
+end
+class RSpec::Expectations::BlockSnippetExtractor::BlockLocator < Struct
+ def beginning_line_number; end
+ def beginning_line_number=(_); end
+ def block_body_node; end
+ def block_wrapper_node; end
+ def body_content_locations; end
+ def candidate_block_wrapper_nodes; end
+ def candidate_method_ident_nodes; end
+ def method_call_location; end
+ def method_ident_node; end
+ def method_ident_node?(node); end
+ def method_name; end
+ def method_name=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def source; end
+ def source=(_); end
+end
+class RSpec::Expectations::FailureAggregator
+ def aggregate; end
+ def assign_backtrace(failure); end
+ def block_label; end
+ def call(failure, options); end
+ def failures; end
+ def initialize(block_label, metadata); end
+ def metadata; end
+ def notify_aggregated_failures; end
+ def other_errors; end
+end
+class RSpec::Matchers::BuiltIn::BeAKindOf < RSpec::Matchers::BuiltIn::BaseMatcher
+ def match(expected, actual); end
+end
+class RSpec::Matchers::BuiltIn::BeAnInstanceOf < RSpec::Matchers::BuiltIn::BaseMatcher
+ def description; end
+ def match(expected, actual); end
+end
+class RSpec::Matchers::BuiltIn::BeBetween < RSpec::Matchers::BuiltIn::BaseMatcher
+ def comparable?; end
+ def compare; end
+ def description; end
+ def exclusive; end
+ def failure_message; end
+ def inclusive; end
+ def initialize(min, max); end
+ def matches?(actual); end
+ def not_comparable_clause; end
+end
+class RSpec::Matchers::BuiltIn::BeTruthy < RSpec::Matchers::BuiltIn::BaseMatcher
+ def failure_message; end
+ def failure_message_when_negated; end
+ def match(_, actual); end
+end
+class RSpec::Matchers::BuiltIn::BeFalsey < RSpec::Matchers::BuiltIn::BaseMatcher
+ def failure_message; end
+ def failure_message_when_negated; end
+ def match(_, actual); end
+end
+class RSpec::Matchers::BuiltIn::BeNil < RSpec::Matchers::BuiltIn::BaseMatcher
+ def failure_message; end
+ def failure_message_when_negated; end
+ def match(_, actual); end
+end
+module RSpec::Matchers::BuiltIn::BeHelpers
+ def args_to_s; end
+ def args_to_sentence; end
+ def expected_to_sentence; end
+ def inspected_args; end
+ def parenthesize(string); end
+end
+class RSpec::Matchers::BuiltIn::Be < RSpec::Matchers::BuiltIn::BaseMatcher
+ def <(operand); end
+ def <=(operand); end
+ def ==(operand); end
+ def ===(operand); end
+ def =~(operand); end
+ def >(operand); end
+ def >=(operand); end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def initialize(*args); end
+ def match(_, actual); end
+ include RSpec::Matchers::BuiltIn::BeHelpers
+end
+class RSpec::Matchers::BuiltIn::BeComparedTo < RSpec::Matchers::BuiltIn::BaseMatcher
+ def description; end
+ def does_not_match?(actual); end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def initialize(operand, operator); end
+ def matches?(actual); end
+ def perform_match(actual); end
+ include RSpec::Matchers::BuiltIn::BeHelpers
+end
+class RSpec::Matchers::BuiltIn::DynamicPredicate < RSpec::Matchers::BuiltIn::BaseMatcher
+ def description; end
+ def does_not_match?(actual, &block); end
+ def expectation_of(value); end
+ def failure_message; end
+ def failure_message_expecting(value); end
+ def failure_message_when_negated; end
+ def failure_to_respond_explanation; end
+ def initialize(method_name, *args, &block); end
+ def matches?(actual, &block); end
+ def method_description; end
+ def predicate_accessible?; end
+ def predicate_matches?(value = nil); end
+ def predicate_method_name; end
+ def predicate_result; end
+ def private_predicate?; end
+ def root; end
+ def validity_message; end
+ include RSpec::Matchers::BuiltIn::BeHelpers
+end
+class RSpec::Matchers::BuiltIn::Has < RSpec::Matchers::BuiltIn::DynamicPredicate
+ def predicate; end
+end
+class RSpec::Matchers::BuiltIn::BePredicate < RSpec::Matchers::BuiltIn::DynamicPredicate
+ def failure_to_respond_explanation; end
+ def predicate; end
+ def predicate_accessible?; end
+ def predicate_method_name; end
+ def present_tense_predicate; end
+end
+class RSpec::Matchers::BuiltIn::BeWithin < RSpec::Matchers::BuiltIn::BaseMatcher
+ def description; end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def initialize(delta); end
+ def matches?(actual); end
+ def needs_expected; end
+ def not_numeric_clause; end
+ def numeric?; end
+ def of(expected); end
+ def percent_of(expected); end
+end
+class RSpec::Matchers::BuiltIn::Change < RSpec::Matchers::BuiltIn::BaseMatcher
+ def by(expected_delta); end
+ def by_at_least(minimum); end
+ def by_at_most(maximum); end
+ def change_details; end
+ def description; end
+ def does_not_match?(event_proc); end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def from(value); end
+ def initialize(receiver = nil, message = nil, &block); end
+ def matches?(event_proc); end
+ def negative_failure_reason; end
+ def perform_change(event_proc); end
+ def positive_failure_reason; end
+ def raise_block_syntax_error; end
+ def supports_block_expectations?; end
+ def to(value); end
+end
+class RSpec::Matchers::BuiltIn::ChangeRelatively < RSpec::Matchers::BuiltIn::BaseMatcher
+ def description; end
+ def does_not_match?(_event_proc); end
+ def failure_message; end
+ def failure_reason; end
+ def initialize(change_details, expected_delta, relativity, &comparer); end
+ def matches?(event_proc); end
+ def supports_block_expectations?; end
+end
+class RSpec::Matchers::BuiltIn::SpecificValuesChange < RSpec::Matchers::BuiltIn::BaseMatcher
+ def after_value_failure; end
+ def before_value_failure; end
+ def description; end
+ def did_change_failure; end
+ def did_not_change_failure; end
+ def failure_message; end
+ def initialize(change_details, from, to); end
+ def matches?(event_proc); end
+ def matches_after?; end
+ def not_given_a_block_failure; end
+ def perform_change(event_proc); end
+ def supports_block_expectations?; end
+end
+class RSpec::Matchers::BuiltIn::ChangeFromValue < RSpec::Matchers::BuiltIn::SpecificValuesChange
+ def change_description; end
+ def does_not_match?(event_proc); end
+ def failure_message_when_negated; end
+ def initialize(change_details, expected_before); end
+ def to(value); end
+end
+class RSpec::Matchers::BuiltIn::ChangeToValue < RSpec::Matchers::BuiltIn::SpecificValuesChange
+ def change_description; end
+ def does_not_match?(_event_proc); end
+ def from(value); end
+ def initialize(change_details, expected_after); end
+end
+class RSpec::Matchers::BuiltIn::ChangeDetails
+ def actual_after; end
+ def actual_delta; end
+ def changed?; end
+ def evaluate_value_proc; end
+ def extract_value_block_snippet; end
+ def initialize(matcher_name, receiver = nil, message = nil, &block); end
+ def message_notation(receiver, message); end
+ def perform_change(event_proc); end
+ def value_representation; end
+end
+class RSpec::Matchers::BuiltIn::Compound < RSpec::Matchers::BuiltIn::BaseMatcher
+ def compound_failure_message; end
+ def description; end
+ def diffable?; end
+ def diffable_matcher_list; end
+ def diffable_matcher_list_for(matcher); end
+ def does_not_match?(_actual); end
+ def evaluator; end
+ def expected; end
+ def expects_call_stack_jump?; end
+ def indent_multiline_message(message); end
+ def initialize(matcher_1, matcher_2); end
+ def initialize_copy(other); end
+ def match(_expected, actual); end
+ def matcher_1; end
+ def matcher_1_matches?; end
+ def matcher_2; end
+ def matcher_2_matches?; end
+ def matcher_is_diffable?(matcher); end
+ def matcher_supports_block_expectations?(matcher); end
+ def supports_block_expectations?; end
+end
+class RSpec::Matchers::BuiltIn::Compound::SequentialEvaluator
+ def initialize(actual, *arg1); end
+ def matcher_matches?(matcher); end
+end
+class RSpec::Matchers::BuiltIn::Compound::NestedEvaluator
+ def initialize(actual, matcher_1, matcher_2); end
+ def inner_matcher_block(outer_args); end
+ def matcher_matches?(matcher); end
+ def order_block_matchers; end
+ def self.matcher_expects_call_stack_jump?(matcher); end
+end
+class RSpec::Matchers::BuiltIn::Compound::And < RSpec::Matchers::BuiltIn::Compound
+ def conjunction; end
+ def failure_message; end
+ def match(*arg0); end
+end
+class RSpec::Matchers::BuiltIn::Compound::Or < RSpec::Matchers::BuiltIn::Compound
+ def conjunction; end
+ def failure_message; end
+ def match(*arg0); end
+end
+class RSpec::Matchers::BuiltIn::ContainExactly < RSpec::Matchers::BuiltIn::BaseMatcher
+ def actual_collection_line; end
+ def best_solution; end
+ def convert_actual_to_an_array; end
+ def describe_collection(collection, surface_descriptions = nil); end
+ def description; end
+ def expected_collection_line; end
+ def extra_elements_line; end
+ def extra_items; end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def generate_failure_message; end
+ def match(_expected, _actual); end
+ def match_when_sorted?; end
+ def message_line(prefix, collection, surface_descriptions = nil); end
+ def missing_elements_line; end
+ def missing_items; end
+ def pairings_maximizer; end
+ def safe_sort(array); end
+ def to_a_disallowed?(object); end
+end
+class RSpec::Matchers::BuiltIn::ContainExactly::PairingsMaximizer
+ def actual_to_expected_matched_indexes; end
+ def apply_pairing_to(indeterminates, original_matches, other_list_index); end
+ def best_solution_for_pairing(expected_index, actual_index); end
+ def categorize_indexes(indexes_to_categorize, other_indexes); end
+ def expected_to_actual_matched_indexes; end
+ def find_best_solution; end
+ def initialize(expected_to_actual_matched_indexes, actual_to_expected_matched_indexes); end
+ def reciprocal_single_match?(matches, index, other_list); end
+ def solution; end
+end
+class RSpec::Matchers::BuiltIn::ContainExactly::PairingsMaximizer::Solution < Struct
+ def +(derived_candidate_solution); end
+ def candidate?; end
+ def ideal?; end
+ def indeterminate_actual_indexes; end
+ def indeterminate_actual_indexes=(_); end
+ def indeterminate_expected_indexes; end
+ def indeterminate_expected_indexes=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def unmatched_actual_indexes; end
+ def unmatched_actual_indexes=(_); end
+ def unmatched_expected_indexes; end
+ def unmatched_expected_indexes=(_); end
+ def unmatched_item_count; end
+ def worse_than?(other); end
+end
+class RSpec::Matchers::BuiltIn::ContainExactly::PairingsMaximizer::NullSolution
+ def self.worse_than?(_other); end
+end
+class RSpec::Matchers::BuiltIn::Cover < RSpec::Matchers::BuiltIn::BaseMatcher
+ def does_not_match?(range); end
+ def initialize(*expected); end
+ def matches?(range); end
+end
+class RSpec::Matchers::BuiltIn::StartOrEndWith < RSpec::Matchers::BuiltIn::BaseMatcher
+ def description; end
+ def failure_message; end
+ def initialize(*expected); end
+ def match(_expected, actual); end
+ def subsets_comparable?; end
+end
+class RSpec::Matchers::BuiltIn::StartWith < RSpec::Matchers::BuiltIn::StartOrEndWith
+ def element_matches?; end
+ def subset_matches?; end
+end
+class RSpec::Matchers::BuiltIn::EndWith < RSpec::Matchers::BuiltIn::StartOrEndWith
+ def element_matches?; end
+ def subset_matches?; end
+end
+class RSpec::Matchers::BuiltIn::Eq < RSpec::Matchers::BuiltIn::BaseMatcher
+ def description; end
+ def diffable?; end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def match(expected, actual); end
+end
+class RSpec::Matchers::BuiltIn::Eql < RSpec::Matchers::BuiltIn::BaseMatcher
+ def diffable?; end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def match(expected, actual); end
+end
+class RSpec::Matchers::BuiltIn::Equal < RSpec::Matchers::BuiltIn::BaseMatcher
+ def actual_inspected; end
+ def detailed_failure_message; end
+ def diffable?; end
+ def expected_is_a_literal_singleton?; end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def inspect_object(o); end
+ def match(expected, actual); end
+ def simple_failure_message; end
+end
+class RSpec::Matchers::BuiltIn::Exist < RSpec::Matchers::BuiltIn::BaseMatcher
+ def does_not_match?(actual); end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def initialize(*expected); end
+ def matches?(actual); end
+end
+class Anonymous_Struct_12 < Struct
+ def actual; end
+ def actual=(_); end
+ def expected; end
+ def expected=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Matchers::BuiltIn::Exist::ExistenceTest < Anonymous_Struct_12
+ def actual_exists?; end
+ def deprecated(predicate, actual); end
+ def existence_values; end
+ def predicates; end
+ def uniq_truthy_values; end
+ def valid_test?; end
+ def validity_message; end
+end
+class RSpec::Matchers::BuiltIn::HaveAttributes < RSpec::Matchers::BuiltIn::BaseMatcher
+ def actual; end
+ def actual_has_attribute?(attribute_key, attribute_value); end
+ def cache_all_values; end
+ def description; end
+ def diffable?; end
+ def does_not_match?(actual); end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def formatted_values; end
+ def initialize(expected); end
+ def matches?(actual); end
+ def perform_match(predicate); end
+ def respond_to_attributes?; end
+ def respond_to_failed; end
+ def respond_to_failure_message_or; end
+ def respond_to_matcher; end
+end
+module RSpec::Matchers::BuiltIn::CountExpectation
+ def at_least(number); end
+ def at_most(number); end
+ def count_constraint_to_number(n); end
+ def count_expectation_description; end
+ def count_expectation_type; end
+ def count_failure_reason(action); end
+ def cover?(count, number); end
+ def exactly(number); end
+ def expected_count; end
+ def expected_count_matches?(actual_count); end
+ def has_expected_count?; end
+ def human_readable_count(count); end
+ def human_readable_expectation_type; end
+ def once; end
+ def raise_impossible_count_expectation(count); end
+ def raise_unsupported_count_expectation; end
+ def set_expected_count(relativity, n); end
+ def thrice; end
+ def times; end
+ def twice; end
+ def unsupported_count_expectation?(relativity); end
+end
+class RSpec::Matchers::BuiltIn::Include < RSpec::Matchers::BuiltIn::BaseMatcher
+ def actual_collection_includes?(expected_item); end
+ def actual_hash_has_key?(expected_key); end
+ def actual_hash_includes?(expected_key, expected_value); end
+ def check_actual?(actual); end
+ def check_expected_count?; end
+ def comparing_hash_keys?(expected_item); end
+ def comparing_hash_to_a_subset?(expected_item); end
+ def convert_to_hash?(obj); end
+ def count_enumerable(expected_item); end
+ def count_inclusions; end
+ def description; end
+ def diff_would_wrongly_highlight_matched_item?; end
+ def diffable?; end
+ def does_not_match?(actual); end
+ def excluded_from_actual; end
+ def expected; end
+ def expecteds; end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def format_failure_message(preposition); end
+ def initialize(*expecteds); end
+ def matches?(actual); end
+ def perform_match(&block); end
+ def readable_list_of(items); end
+ include RSpec::Matchers::BuiltIn::CountExpectation
+end
+class RSpec::Matchers::BuiltIn::All < RSpec::Matchers::BuiltIn::BaseMatcher
+ def add_new_line_if_needed(message); end
+ def description; end
+ def does_not_match?(_actual); end
+ def failed_objects; end
+ def failure_message; end
+ def failure_message_for_item(index, failure_message); end
+ def indent_multiline_message(message); end
+ def index_failed_objects; end
+ def initialize(matcher); end
+ def initialize_copy(other); end
+ def iterable?; end
+ def match(_expected, _actual); end
+ def matcher; end
+end
+class RSpec::Matchers::BuiltIn::Match < RSpec::Matchers::BuiltIn::BaseMatcher
+ def can_safely_call_match?(expected, actual); end
+ def description; end
+ def diffable?; end
+ def initialize(expected); end
+ def match(expected, actual); end
+ def match_captures(expected, actual); end
+ def with_captures(*captures); end
+end
+class RSpec::Matchers::BuiltIn::ReliableMatchData
+ def captures; end
+ def initialize(match_data); end
+ def match_data; end
+ def names; end
+end
+class RSpec::Matchers::BuiltIn::OperatorMatcher
+ def !=(_expected); end
+ def !~(_expected); end
+ def <(expected); end
+ def <=(expected); end
+ def ==(expected); end
+ def ===(expected); end
+ def =~(expected); end
+ def >(expected); end
+ def >=(expected); end
+ def description; end
+ def eval_match(actual, operator, expected); end
+ def fail_with_message(message); end
+ def has_non_generic_implementation_of?(op); end
+ def initialize(actual); end
+ def self.get(klass, operator); end
+ def self.register(klass, operator, matcher); end
+ def self.registry; end
+ def self.unregister(klass, operator); end
+ def self.use_custom_matcher_or_delegate(operator); end
+end
+class RSpec::Matchers::BuiltIn::PositiveOperatorMatcher < RSpec::Matchers::BuiltIn::OperatorMatcher
+ def __delegate_operator(actual, operator, expected); end
+end
+class RSpec::Matchers::BuiltIn::NegativeOperatorMatcher < RSpec::Matchers::BuiltIn::OperatorMatcher
+ def __delegate_operator(actual, operator, expected); end
+end
+class RSpec::Matchers::BuiltIn::Output < RSpec::Matchers::BuiltIn::BaseMatcher
+ def actual_output_description; end
+ def captured?; end
+ def description; end
+ def diffable?; end
+ def does_not_match?(block); end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def initialize(expected); end
+ def matches?(block); end
+ def negative_failure_reason; end
+ def positive_failure_reason; end
+ def supports_block_expectations?; end
+ def to_stderr; end
+ def to_stderr_from_any_process; end
+ def to_stdout; end
+ def to_stdout_from_any_process; end
+end
+module RSpec::Matchers::BuiltIn::NullCapture
+ def self.capture(_block); end
+ def self.name; end
+end
+module RSpec::Matchers::BuiltIn::CaptureStdout
+ def self.capture(block); end
+ def self.name; end
+end
+module RSpec::Matchers::BuiltIn::CaptureStderr
+ def self.capture(block); end
+ def self.name; end
+end
+class Anonymous_Struct_13 < Struct
+ def name; end
+ def name=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def stream; end
+ def stream=(_); end
+end
+class RSpec::Matchers::BuiltIn::CaptureStreamToTempfile < Anonymous_Struct_13
+ def capture(block); end
+end
+class RSpec::Matchers::BuiltIn::RaiseError
+ def block_matches?; end
+ def description; end
+ def does_not_match?(given_proc); end
+ def error_and_message_match?; end
+ def eval_block; end
+ def expectation_matched?; end
+ def expected_error; end
+ def expecting_specific_exception?; end
+ def expects_call_stack_jump?; end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def format_backtrace(backtrace); end
+ def given_error; end
+ def handle_warning(message); end
+ def initialize(expected_error_or_message, expected_message, &block); end
+ def matches?(given_proc, negative_expectation = nil, &block); end
+ def raise_message_already_set; end
+ def ready_to_eval_block?; end
+ def supports_block_expectations?; end
+ def verify_message; end
+ def warn_about_bare_error!; end
+ def warn_about_bare_error?; end
+ def warn_about_negative_false_positive!(expression); end
+ def warn_about_nil_error!; end
+ def warn_about_nil_error?; end
+ def warn_for_negative_false_positives!; end
+ def warning; end
+ def with_message(expected_message); end
+ include RSpec::Matchers::Composable
+end
+class RSpec::Matchers::BuiltIn::RespondTo < RSpec::Matchers::BuiltIn::BaseMatcher
+ def and_any_keywords; end
+ def and_keywords(*keywords); end
+ def and_unlimited_arguments; end
+ def argument; end
+ def arguments; end
+ def description; end
+ def does_not_match?(actual); end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def find_failing_method_names(actual, filter_method); end
+ def ignoring_method_signature_failure!; end
+ def initialize(*names); end
+ def matches?(actual); end
+ def matches_arity?(actual, name); end
+ def pp_names; end
+ def with(n); end
+ def with_any_keywords; end
+ def with_arity; end
+ def with_arity_string; end
+ def with_keywords(*keywords); end
+ def with_keywords_string; end
+ def with_unlimited_arguments; end
+end
+class RSpec::Matchers::BuiltIn::RespondTo::ArityCheck
+ def initialize(expected_arity, expected_keywords, arbitrary_keywords, unlimited_arguments); end
+ def matches?(actual, name); end
+ def method_signature_for(actual, name); end
+ def verifier_for(actual, name); end
+end
+class RSpec::Matchers::BuiltIn::Satisfy < RSpec::Matchers::BuiltIn::BaseMatcher
+ def block_representation; end
+ def description; end
+ def extract_block_snippet; end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def initialize(description = nil, &block); end
+ def matches?(actual, &block); end
+end
+class RSpec::Matchers::BuiltIn::ThrowSymbol
+ def actual_result; end
+ def caught; end
+ def description; end
+ def does_not_match?(given_proc); end
+ def expected(symbol_desc = nil); end
+ def expects_call_stack_jump?; end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def initialize(expected_symbol = nil, expected_arg = nil); end
+ def matches?(given_proc); end
+ def supports_block_expectations?; end
+ def throw_description(symbol, arg); end
+ include RSpec::Matchers::Composable
+end
+class RSpec::Matchers::BuiltIn::YieldProbe
+ def assert_used!; end
+ def assert_valid_expect_block!; end
+ def has_block?; end
+ def initialize(block, &callback); end
+ def num_yields; end
+ def num_yields=(arg0); end
+ def probe; end
+ def self.probe(block, &callback); end
+ def single_yield_args; end
+ def to_proc; end
+ def yielded_args; end
+ def yielded_args=(arg0); end
+ def yielded_once?(matcher_name); end
+end
+class RSpec::Matchers::BuiltIn::YieldControl < RSpec::Matchers::BuiltIn::BaseMatcher
+ def does_not_match?(block); end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def failure_reason; end
+ def matches?(block); end
+ def supports_block_expectations?; end
+ include RSpec::Matchers::BuiltIn::CountExpectation
+end
+class RSpec::Matchers::BuiltIn::YieldWithNoArgs < RSpec::Matchers::BuiltIn::BaseMatcher
+ def does_not_match?(block); end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def matches?(block); end
+ def negative_failure_reason; end
+ def positive_failure_reason; end
+ def supports_block_expectations?; end
+end
+class RSpec::Matchers::BuiltIn::YieldWithArgs < RSpec::Matchers::BuiltIn::BaseMatcher
+ def all_args_match?; end
+ def args_currently_match?; end
+ def description; end
+ def does_not_match?(block); end
+ def expected_arg_description; end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def initialize(*args); end
+ def matches?(block); end
+ def negative_failure_reason; end
+ def positive_failure_reason; end
+ def supports_block_expectations?; end
+end
+class RSpec::Matchers::BuiltIn::YieldSuccessiveArgs < RSpec::Matchers::BuiltIn::BaseMatcher
+ def description; end
+ def does_not_match?(block); end
+ def expected_arg_description; end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def initialize(*args); end
+ def matches?(block); end
+ def negative_failure_reason; end
+ def positive_failure_reason; end
+ def supports_block_expectations?; end
+end
diff --git a/sorbet/rbi/gems/rspec-mocks.rbi b/sorbet/rbi/gems/rspec-mocks.rbi
new file mode 100644
index 0000000..a1a647e
--- /dev/null
+++ b/sorbet/rbi/gems/rspec-mocks.rbi
@@ -0,0 +1,1091 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rspec-mocks/all/rspec-mocks.rbi
+#
+# rspec-mocks-3.10.2
+
+module RSpec
+end
+module RSpec::Mocks
+ def self.allow_message(subject, message, opts = nil, &block); end
+ def self.configuration; end
+ def self.error_generator; end
+ def self.expect_message(subject, message, opts = nil, &block); end
+ def self.setup; end
+ def self.space; end
+ def self.teardown; end
+ def self.verify; end
+ def self.with_temporary_scope; end
+end
+class RSpec::Mocks::InstanceMethodStasher
+ def handle_restoration_failures; end
+ def initialize(object, method); end
+ def method_defined_directly_on_klass?; end
+ def method_defined_on_klass?(klass = nil); end
+ def method_is_stashed?; end
+ def method_owned_by_klass?; end
+ def original_method; end
+ def restore; end
+ def stash; end
+end
+class RSpec::Mocks::MethodDouble
+ def add_default_stub(*args, &implementation); end
+ def add_expectation(error_generator, expectation_ordering, expected_from, opts, &implementation); end
+ def add_simple_expectation(method_name, response, error_generator, backtrace_line); end
+ def add_simple_stub(method_name, response); end
+ def add_stub(error_generator, expectation_ordering, expected_from, opts = nil, &implementation); end
+ def build_expectation(error_generator, expectation_ordering); end
+ def clear; end
+ def configure_method; end
+ def define_proxy_method; end
+ def definition_target; end
+ def expectations; end
+ def initialize(object, method_name, proxy); end
+ def message_expectation_class; end
+ def method_name; end
+ def method_stasher; end
+ def new_rspec_prepended_module; end
+ def object; end
+ def object_singleton_class; end
+ def original_implementation_callable; end
+ def original_method; end
+ def proxy_method_invoked(_obj, *args, &block); end
+ def raise_method_not_stubbed_error; end
+ def remove_method_from_definition_target; end
+ def remove_stub; end
+ def remove_stub_if_present; end
+ def reset; end
+ def restore_original_method; end
+ def restore_original_visibility; end
+ def save_original_implementation_callable!; end
+ def setup_simple_method_double(method_name, response, collection, error_generator = nil, backtrace_line = nil); end
+ def show_frozen_warning; end
+ def stubs; end
+ def usable_rspec_prepended_module; end
+ def verify; end
+ def visibility; end
+end
+class RSpec::Mocks::MethodDouble::RSpecPrependedModule < Module
+end
+module RSpec::Mocks::ArgumentMatchers
+ def a_kind_of(klass); end
+ def an_instance_of(klass); end
+ def any_args; end
+ def anything; end
+ def array_including(*args); end
+ def boolean; end
+ def duck_type(*args); end
+ def hash_excluding(*args); end
+ def hash_including(*args); end
+ def hash_not_including(*args); end
+ def instance_of(klass); end
+ def kind_of(klass); end
+ def no_args; end
+ def self.anythingize_lonely_keys(*args); end
+end
+class RSpec::Mocks::ArgumentMatchers::SingletonMatcher
+ def self.inherited(subklass); end
+ def self.new(*arg0); end
+end
+class RSpec::Mocks::ArgumentMatchers::AnyArgsMatcher < RSpec::Mocks::ArgumentMatchers::SingletonMatcher
+ def description; end
+end
+class RSpec::Mocks::ArgumentMatchers::AnyArgMatcher < RSpec::Mocks::ArgumentMatchers::SingletonMatcher
+ def ===(_other); end
+ def description; end
+end
+class RSpec::Mocks::ArgumentMatchers::NoArgsMatcher < RSpec::Mocks::ArgumentMatchers::SingletonMatcher
+ def description; end
+end
+class RSpec::Mocks::ArgumentMatchers::BooleanMatcher < RSpec::Mocks::ArgumentMatchers::SingletonMatcher
+ def ===(value); end
+ def description; end
+end
+class RSpec::Mocks::ArgumentMatchers::BaseHashMatcher
+ def ===(predicate, actual); end
+ def description(name); end
+ def formatted_expected_hash; end
+ def initialize(expected); end
+end
+class RSpec::Mocks::ArgumentMatchers::HashIncludingMatcher < RSpec::Mocks::ArgumentMatchers::BaseHashMatcher
+ def ===(actual); end
+ def description; end
+end
+class RSpec::Mocks::ArgumentMatchers::HashExcludingMatcher < RSpec::Mocks::ArgumentMatchers::BaseHashMatcher
+ def ===(actual); end
+ def description; end
+end
+class RSpec::Mocks::ArgumentMatchers::ArrayIncludingMatcher
+ def ===(actual); end
+ def description; end
+ def formatted_expected_values; end
+ def initialize(expected); end
+end
+class RSpec::Mocks::ArgumentMatchers::DuckTypeMatcher
+ def ===(value); end
+ def description; end
+ def initialize(*methods_to_respond_to); end
+end
+class RSpec::Mocks::ArgumentMatchers::InstanceOf
+ def ===(actual); end
+ def description; end
+ def initialize(klass); end
+end
+class RSpec::Mocks::ArgumentMatchers::KindOf
+ def ===(actual); end
+ def description; end
+ def initialize(klass); end
+end
+class RSpec::Mocks::ObjectReference
+ def self.anonymous_module?(mod); end
+ def self.for(object_module_or_name, allow_direct_object_refs = nil); end
+ def self.name_of(mod); end
+end
+class RSpec::Mocks::DirectObjectReference
+ def const_to_replace; end
+ def defined?; end
+ def description; end
+ def initialize(object); end
+ def target; end
+ def when_loaded; end
+end
+class RSpec::Mocks::NamedObjectReference
+ def const_to_replace; end
+ def defined?; end
+ def description; end
+ def initialize(const_name); end
+ def object; end
+ def target; end
+ def when_loaded; end
+end
+module RSpec::Mocks::ExampleMethods
+ def allow(target); end
+ def allow_any_instance_of(klass); end
+ def allow_message_expectations_on_nil; end
+ def class_double(doubled_class, *args); end
+ def class_spy(*args); end
+ def double(*args); end
+ def expect_any_instance_of(klass); end
+ def have_received(method_name, &block); end
+ def hide_const(constant_name); end
+ def instance_double(doubled_class, *args); end
+ def instance_spy(*args); end
+ def object_double(object_or_name, *args); end
+ def object_spy(*args); end
+ def receive(method_name, &block); end
+ def receive_message_chain(*messages, &block); end
+ def receive_messages(message_return_value_hash); end
+ def self.declare_double(type, *args); end
+ def self.declare_verifying_double(type, ref, *args); end
+ def self.extended(object); end
+ def self.included(klass); end
+ def spy(*args); end
+ def stub_const(constant_name, value, options = nil); end
+ def without_partial_double_verification; end
+ include RSpec::Mocks::ArgumentMatchers
+end
+module RSpec::Mocks::ExampleMethods::ExpectHost
+ def expect(target); end
+end
+class RSpec::Mocks::Proxy
+ def add_message_expectation(method_name, opts = nil, &block); end
+ def add_simple_expectation(method_name, response, location); end
+ def add_simple_stub(method_name, response); end
+ def add_stub(method_name, opts = nil, &implementation); end
+ def as_null_object; end
+ def build_expectation(method_name); end
+ def check_for_unexpected_arguments(expectation); end
+ def ensure_can_be_proxied!(object); end
+ def ensure_implemented(*_args); end
+ def find_almost_matching_expectation(method_name, *args); end
+ def find_almost_matching_stub(method_name, *args); end
+ def find_best_matching_expectation_for(method_name); end
+ def find_matching_expectation(method_name, *args); end
+ def find_matching_method_stub(method_name, *args); end
+ def has_negative_expectation?(message); end
+ def initialize(object, order_group, options = nil); end
+ def message_received(message, *args, &block); end
+ def messages_arg_list; end
+ def method_double_for(message); end
+ def method_double_if_exists_for_message(message); end
+ def null_object?; end
+ def object; end
+ def original_method_handle_for(_message); end
+ def prepended_modules_of_singleton_class; end
+ def raise_missing_default_stub_error(expectation, args_for_multiple_calls); end
+ def raise_unexpected_message_error(method_name, args); end
+ def received_message?(method_name, *args, &block); end
+ def record_message_received(message, *args, &block); end
+ def remove_stub(method_name); end
+ def remove_stub_if_present(method_name); end
+ def replay_received_message_on(expectation, &block); end
+ def reset; end
+ def self.prepended_modules_of(klass); end
+ def verify; end
+ def visibility_for(_method_name); end
+end
+class RSpec::Mocks::Proxy::SpecificMessage < Struct
+ def ==(expectation); end
+ def args; end
+ def args=(_); end
+ def message; end
+ def message=(_); end
+ def object; end
+ def object=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Mocks::TestDoubleProxy < RSpec::Mocks::Proxy
+ def reset; end
+end
+class RSpec::Mocks::PartialDoubleProxy < RSpec::Mocks::Proxy
+ def add_simple_expectation(method_name, response, location); end
+ def add_simple_stub(method_name, response); end
+ def any_instance_class_recorder_observing_method?(klass, method_name); end
+ def message_received(message, *args, &block); end
+ def original_method_handle_for(message); end
+ def reset; end
+ def visibility_for(method_name); end
+end
+module RSpec::Mocks::PartialClassDoubleProxyMethods
+ def initialize(source_space, *args); end
+ def method_double_from_ancestor_for(message); end
+ def original_method_handle_for(message); end
+ def original_unbound_method_handle_from_ancestor_for(message); end
+ def superclass_proxy; end
+end
+class RSpec::Mocks::PartialClassDoubleProxy < RSpec::Mocks::PartialDoubleProxy
+ include RSpec::Mocks::PartialClassDoubleProxyMethods
+end
+class RSpec::Mocks::ProxyForNil < RSpec::Mocks::PartialDoubleProxy
+ def add_message_expectation(method_name, opts = nil, &block); end
+ def add_stub(method_name, opts = nil, &implementation); end
+ def disallow_expectations; end
+ def disallow_expectations=(arg0); end
+ def initialize(order_group); end
+ def raise_error(method_name); end
+ def set_expectation_behavior; end
+ def warn(method_name); end
+ def warn_about_expectations; end
+ def warn_about_expectations=(arg0); end
+ def warn_or_raise!(method_name); end
+end
+module RSpec::Mocks::TestDouble
+ def ==(other); end
+ def __build_mock_proxy(order_group); end
+ def __build_mock_proxy_unless_expired(order_group); end
+ def __disallow_further_usage!; end
+ def __mock_proxy; end
+ def __raise_expired_error; end
+ def as_null_object; end
+ def assign_stubs(stubs); end
+ def freeze; end
+ def initialize(name = nil, stubs = nil); end
+ def initialize_copy(other); end
+ def inspect; end
+ def method_missing(message, *args, &block); end
+ def null_object?; end
+ def respond_to?(message, incl_private = nil); end
+ def to_s; end
+end
+class RSpec::Mocks::Double
+ include RSpec::Mocks::TestDouble
+end
+module RSpec::Mocks::TestDoubleFormatter
+ def self.format(dbl, unwrap = nil); end
+ def self.name_desc(dbl); end
+ def self.type_desc(dbl); end
+ def self.verified_module_desc(dbl); end
+end
+class RSpec::Mocks::ArgumentListMatcher
+ def args_match?(*args); end
+ def ensure_expected_args_valid!; end
+ def expected_args; end
+ def initialize(*expected_args); end
+ def replace_any_args_with_splat_of_anything(before_count, actual_args_count); end
+ def resolve_expected_args_based_on(actual_args); end
+end
+class RSpec::Mocks::SimpleMessageExpectation
+ def called_max_times?; end
+ def initialize(message, response, error_generator, backtrace_line = nil); end
+ def invoke(*_); end
+ def matches?(message, *_); end
+ def unadvise(_); end
+ def verify_messages_received; end
+end
+class RSpec::Mocks::MessageExpectation
+ def and_call_original; end
+ def and_raise(*args); end
+ def and_return(first_value, *values); end
+ def and_throw(*args); end
+ def and_wrap_original(&block); end
+ def and_yield(*args, &block); end
+ def at_least(n, &block); end
+ def at_most(n, &block); end
+ def exactly(n, &block); end
+ def inspect; end
+ def never; end
+ def once(&block); end
+ def ordered(&block); end
+ def thrice(&block); end
+ def time(&block); end
+ def times(&block); end
+ def to_s; end
+ def twice(&block); end
+ def with(*args, &block); end
+ include RSpec::Mocks::MessageExpectation::ImplementationDetails
+end
+module RSpec::Mocks::MessageExpectation::ImplementationDetails
+ def actual_received_count_matters?; end
+ def additional_expected_calls; end
+ def advise(*args); end
+ def and_yield_receiver_to_implementation; end
+ def argument_list_matcher=(arg0); end
+ def called_max_times?; end
+ def description_for(verb); end
+ def ensure_expected_ordering_received!; end
+ def error_generator; end
+ def error_generator=(arg0); end
+ def exception_source_id; end
+ def expectation_count_type; end
+ def expected_args; end
+ def expected_from=(arg0); end
+ def expected_messages_received?; end
+ def expected_received_count=(arg0); end
+ def generate_error; end
+ def has_been_invoked?; end
+ def ignoring_args?; end
+ def implementation; end
+ def implementation=(arg0); end
+ def increase_actual_received_count!; end
+ def initial_implementation_action=(action); end
+ def initialize(error_generator, expectation_ordering, expected_from, method_double, type = nil, opts = nil, &implementation_block); end
+ def inner_implementation_action=(action); end
+ def invoke(parent_stub, *args, &block); end
+ def invoke_incrementing_actual_calls_by(increment, allowed_to_fail, parent_stub, *args, &block); end
+ def invoke_without_incrementing_received_count(parent_stub, *args, &block); end
+ def matches?(message, *args); end
+ def matches_at_least_count?; end
+ def matches_at_most_count?; end
+ def matches_exact_count?; end
+ def matches_name_but_not_args(message, *args); end
+ def message; end
+ def negative?; end
+ def negative_expectation_for?(message); end
+ def ordered?; end
+ def orig_object; end
+ def raise_already_invoked_error_if_necessary(calling_customization); end
+ def raise_out_of_order_error; end
+ def raise_unexpected_message_args_error(args_for_multiple_calls); end
+ def safe_invoke(parent_stub, *args, &block); end
+ def set_expected_received_count(relativity, n); end
+ def similar_messages; end
+ def terminal_implementation_action=(action); end
+ def type; end
+ def unadvise(args); end
+ def verify_messages_received; end
+ def warn_about_stub_override; end
+ def wrap_original(method_name, &block); end
+ def yield_receiver_to_implementation_block?; end
+end
+class RSpec::Mocks::AndYieldImplementation
+ def call(*_args_to_ignore, &block); end
+ def initialize(args_to_yield, eval_context, error_generator); end
+end
+class RSpec::Mocks::AndReturnImplementation
+ def call(*_args_to_ignore, &_block); end
+ def initialize(values_to_return); end
+end
+class RSpec::Mocks::Implementation
+ def actions; end
+ def call(*args, &block); end
+ def initial_action; end
+ def initial_action=(arg0); end
+ def inner_action; end
+ def inner_action=(arg0); end
+ def present?; end
+ def terminal_action; end
+ def terminal_action=(arg0); end
+end
+class RSpec::Mocks::AndWrapOriginalImplementation
+ def call(*args, &block); end
+ def cannot_modify_further_error; end
+ def initial_action=(_value); end
+ def initialize(method, block); end
+ def inner_action; end
+ def inner_action=(_value); end
+ def present?; end
+ def terminal_action=(_value); end
+end
+class RSpec::Mocks::AndWrapOriginalImplementation::CannotModifyFurtherError < StandardError
+end
+class RSpec::Mocks::OrderGroup
+ def clear; end
+ def consume; end
+ def empty?; end
+ def expectation_for(message); end
+ def expectations_invoked_in_order?; end
+ def expected_invocations; end
+ def handle_order_constraint(expectation); end
+ def initialize; end
+ def invoked(message); end
+ def invoked_expectations; end
+ def ready_for?(expectation); end
+ def register(expectation); end
+ def remaining_expectations; end
+ def verify_invocation_order(expectation); end
+end
+class RSpec::Mocks::MockExpectationError < Exception
+end
+class RSpec::Mocks::ExpiredTestDoubleError < RSpec::Mocks::MockExpectationError
+end
+class RSpec::Mocks::OutsideOfExampleError < StandardError
+end
+class RSpec::Mocks::MockExpectationAlreadyInvokedError < Exception
+end
+class RSpec::Mocks::CannotSupportArgMutationsError < StandardError
+end
+class RSpec::Mocks::UnsupportedMatcherError < StandardError
+end
+class RSpec::Mocks::NegationUnsupportedError < StandardError
+end
+class RSpec::Mocks::VerifyingDoubleNotDefinedError < StandardError
+end
+class RSpec::Mocks::ErrorGenerator
+ def __raise(message, backtrace_line = nil, source_id = nil); end
+ def arg_list(args); end
+ def count_message(count, expectation_count_type = nil); end
+ def default_error_message(expectation, expected_args, actual_args); end
+ def describe_expectation(verb, message, expected_received_count, _actual_received_count, args); end
+ def diff_message(expected_args, actual_args); end
+ def differ; end
+ def error_message(expectation, args_for_multiple_calls); end
+ def expectation_on_nil_message(method_name); end
+ def expected_part_of_expectation_error(expected_received_count, expectation_count_type, argument_list_matcher); end
+ def format_args(args); end
+ def format_received_args(args_for_multiple_calls); end
+ def group_count(index, args); end
+ def grouped_args(args); end
+ def initialize(target = nil); end
+ def intro(unwrapped = nil); end
+ def list_of_exactly_one_string?(args); end
+ def method_call_args_description(args, generic_prefix = nil, matcher_prefix = nil); end
+ def notify(*args); end
+ def opts; end
+ def opts=(arg0); end
+ def prepend_to_backtrace(exception, line); end
+ def raise_already_invoked_error(message, calling_customization); end
+ def raise_cant_constrain_count_for_negated_have_received_error(count_constraint); end
+ def raise_double_negation_error(wrapped_expression); end
+ def raise_expectation_error(message, expected_received_count, argument_list_matcher, actual_received_count, expectation_count_type, args, backtrace_line = nil, source_id = nil); end
+ def raise_expectation_on_mocked_method(method); end
+ def raise_expectation_on_nil_error(method_name); end
+ def raise_expectation_on_unstubbed_method(method); end
+ def raise_expired_test_double_error; end
+ def raise_have_received_disallowed(type, reason); end
+ def raise_invalid_arguments_error(verifier); end
+ def raise_method_not_stubbed_error(method_name); end
+ def raise_missing_block_error(args_to_yield); end
+ def raise_missing_default_stub_error(expectation, args_for_multiple_calls); end
+ def raise_non_public_error(method_name, visibility); end
+ def raise_only_valid_on_a_partial_double(method); end
+ def raise_out_of_order_error(message); end
+ def raise_similar_message_args_error(expectation, args_for_multiple_calls, backtrace_line = nil); end
+ def raise_unexpected_message_args_error(expectation, args_for_multiple_calls, source_id = nil); end
+ def raise_unexpected_message_error(message, args); end
+ def raise_unimplemented_error(doubled_module, method_name, object); end
+ def raise_verifying_double_not_defined_error(ref); end
+ def raise_wrong_arity_error(args_to_yield, signature); end
+ def received_part_of_expectation_error(actual_received_count, args); end
+ def times(count); end
+ def unexpected_arguments_message(expected_args_string, actual_args_string); end
+ def unpack_string_args(formatted_expected_args, actual_args); end
+end
+class RSpec::Mocks::RootSpace
+ def any_instance_proxy_for(*_args); end
+ def any_instance_recorder_for(*_args); end
+ def any_instance_recorders_from_ancestry_of(_object); end
+ def new_scope; end
+ def proxy_for(*_args); end
+ def raise_lifecycle_message; end
+ def register_constant_mutator(_mutator); end
+ def registered?(_object); end
+ def reset_all; end
+ def superclass_proxy_for(*_args); end
+ def verify_all; end
+end
+class RSpec::Mocks::Space
+ def any_instance_mutex; end
+ def any_instance_proxy_for(klass); end
+ def any_instance_recorder_for(klass, only_return_existing = nil); end
+ def any_instance_recorder_not_found_for(id, klass); end
+ def any_instance_recorders; end
+ def any_instance_recorders_from_ancestry_of(object); end
+ def class_proxy_with_callback_verification_strategy(object, strategy); end
+ def constant_mutator_for(name); end
+ def ensure_registered(object); end
+ def id_for(object); end
+ def initialize; end
+ def new_mutex; end
+ def new_scope; end
+ def proxies; end
+ def proxies_of(klass); end
+ def proxy_for(object); end
+ def proxy_mutex; end
+ def proxy_not_found_for(id, object); end
+ def register_constant_mutator(mutator); end
+ def registered?(object); end
+ def reset_all; end
+ def superclass_proxy_for(klass); end
+ def superclass_proxy_not_found_for(id, object); end
+ def verify_all; end
+end
+class RSpec::Mocks::NestedSpace < RSpec::Mocks::Space
+ def any_instance_recorder_not_found_for(id, klass); end
+ def constant_mutator_for(name); end
+ def initialize(parent); end
+ def proxies_of(klass); end
+ def proxy_not_found_for(id, object); end
+ def registered?(object); end
+end
+class RSpec::Mocks::Constant
+ def hidden=(arg0); end
+ def hidden?; end
+ def initialize(name); end
+ def inspect; end
+ def mutated?; end
+ def name; end
+ def original_value; end
+ def original_value=(arg0); end
+ def previously_defined=(arg0); end
+ def previously_defined?; end
+ def self.original(name); end
+ def self.unmutated(name); end
+ def stubbed=(arg0); end
+ def stubbed?; end
+ def to_s; end
+ def valid_name=(arg0); end
+ def valid_name?; end
+ extend RSpec::Support::RecursiveConstMethods
+end
+class RSpec::Mocks::ConstantMutator
+ def self.hide(constant_name); end
+ def self.mutate(mutator); end
+ def self.raise_on_invalid_const; end
+ def self.stub(constant_name, value, options = nil); end
+ extend RSpec::Support::RecursiveConstMethods
+end
+class RSpec::Mocks::ConstantMutator::BaseMutator
+ def full_constant_name; end
+ def idempotently_reset; end
+ def initialize(full_constant_name, mutated_value, transfer_nested_constants); end
+ def original_value; end
+ def to_constant; end
+ include RSpec::Support::RecursiveConstMethods
+end
+class RSpec::Mocks::ConstantMutator::ConstantHider < RSpec::Mocks::ConstantMutator::BaseMutator
+ def mutate; end
+ def reset; end
+ def to_constant; end
+end
+class RSpec::Mocks::ConstantMutator::DefinedConstantReplacer < RSpec::Mocks::ConstantMutator::BaseMutator
+ def initialize(*args); end
+ def mutate; end
+ def reset; end
+ def should_transfer_nested_constants?; end
+ def to_constant; end
+ def transfer_nested_constants; end
+ def verify_constants_to_transfer!; end
+end
+class RSpec::Mocks::ConstantMutator::UndefinedConstantSetter < RSpec::Mocks::ConstantMutator::BaseMutator
+ def mutate; end
+ def name_for(parent, name); end
+ def reset; end
+ def to_constant; end
+end
+module RSpec::Mocks::TargetDelegationClassMethods
+ def delegate_not_to(matcher_method, options = nil); end
+ def delegate_to(matcher_method); end
+ def disallow_negation(method_name); end
+end
+module RSpec::Mocks::TargetDelegationInstanceMethods
+ def define_matcher(matcher, name, &block); end
+ def matcher_allowed?(matcher); end
+ def raise_negation_unsupported(method_name, matcher); end
+ def raise_unsupported_matcher(method_name, matcher); end
+ def target; end
+end
+class RSpec::Mocks::TargetBase
+ def initialize(target); end
+ extend RSpec::Mocks::TargetDelegationClassMethods
+ include RSpec::Mocks::TargetDelegationInstanceMethods
+end
+module RSpec::Mocks::ExpectationTargetMethods
+ def expression; end
+ def not_to(matcher, &block); end
+ def to(matcher, &block); end
+ def to_not(matcher, &block); end
+ extend RSpec::Mocks::TargetDelegationClassMethods
+ include RSpec::Mocks::TargetDelegationInstanceMethods
+end
+class RSpec::Mocks::ExpectationTarget < RSpec::Mocks::TargetBase
+ include RSpec::Mocks::ExpectationTargetMethods
+end
+class RSpec::Mocks::AllowanceTarget < RSpec::Mocks::TargetBase
+ def expression; end
+ def not_to(matcher, *_args); end
+ def to(matcher, &block); end
+ def to_not(matcher, *_args); end
+end
+class RSpec::Mocks::AnyInstanceAllowanceTarget < RSpec::Mocks::TargetBase
+ def expression; end
+ def not_to(matcher, *_args); end
+ def to(matcher, &block); end
+ def to_not(matcher, *_args); end
+end
+class RSpec::Mocks::AnyInstanceExpectationTarget < RSpec::Mocks::TargetBase
+ def expression; end
+ def not_to(matcher, &block); end
+ def to(matcher, &block); end
+ def to_not(matcher, &block); end
+end
+module RSpec::Mocks::Syntax
+ def self.default_should_syntax_host; end
+ def self.disable_expect(syntax_host = nil); end
+ def self.disable_should(syntax_host = nil); end
+ def self.enable_expect(syntax_host = nil); end
+ def self.enable_should(syntax_host = nil); end
+ def self.expect_enabled?(syntax_host = nil); end
+ def self.should_enabled?(syntax_host = nil); end
+ def self.warn_about_should!; end
+ def self.warn_unless_should_configured(method_name, replacement = nil); end
+end
+class BasicObject
+end
+class Class < Module
+end
+class RSpec::Mocks::Configuration
+ def add_stub_and_should_receive_to(*modules); end
+ def allow_message_expectations_on_nil; end
+ def allow_message_expectations_on_nil=(arg0); end
+ def before_verifying_doubles(&block); end
+ def color?; end
+ def initialize; end
+ def patch_marshal_to_support_partial_doubles=(val); end
+ def reset_syntaxes_to_default; end
+ def syntax; end
+ def syntax=(*values); end
+ def temporarily_suppress_partial_double_verification; end
+ def temporarily_suppress_partial_double_verification=(arg0); end
+ def transfer_nested_constants=(arg0); end
+ def transfer_nested_constants?; end
+ def verify_doubled_constant_names=(arg0); end
+ def verify_doubled_constant_names?; end
+ def verify_partial_doubles=(val); end
+ def verify_partial_doubles?; end
+ def verifying_double_callbacks; end
+ def when_declaring_verifying_double(&block); end
+ def yield_receiver_to_any_instance_implementation_blocks=(arg0); end
+ def yield_receiver_to_any_instance_implementation_blocks?; end
+end
+class RSpec::Mocks::VerifyingMessageExpectation < RSpec::Mocks::MessageExpectation
+ def initialize(*args); end
+ def method_reference; end
+ def method_reference=(arg0); end
+ def validate_expected_arguments!; end
+ def with(*args, &block); end
+end
+class RSpec::Mocks::MethodReference
+ def defined?; end
+ def implemented?; end
+ def initialize(object_reference, method_name); end
+ def original_method; end
+ def self.for(object_reference, method_name); end
+ def self.instance_method_visibility_for(klass, method_name); end
+ def self.method_defined_at_any_visibility?(klass, method_name); end
+ def self.method_visibility_for(object, method_name); end
+ def unimplemented?; end
+ def visibility; end
+ def with_signature; end
+end
+class RSpec::Mocks::InstanceMethodReference < RSpec::Mocks::MethodReference
+ def find_method(mod); end
+ def method_defined?(mod); end
+ def method_implemented?(mod); end
+ def visibility_from(mod); end
+end
+class RSpec::Mocks::ObjectMethodReference < RSpec::Mocks::MethodReference
+ def find_method(object); end
+ def method_defined?(object); end
+ def method_implemented?(object); end
+ def self.for(object_reference, method_name); end
+ def visibility_from(object); end
+end
+class RSpec::Mocks::ClassNewMethodReference < RSpec::Mocks::ObjectMethodReference
+ def self.applies_to?(method_name); end
+ def with_signature; end
+end
+class RSpec::Mocks::CallbackInvocationStrategy
+ def call(doubled_module); end
+end
+class RSpec::Mocks::NoCallbackInvocationStrategy
+ def call(_doubled_module); end
+end
+module RSpec::Mocks::VerifyingProxyMethods
+ def add_message_expectation(method_name, opts = nil, &block); end
+ def add_simple_stub(method_name, *args); end
+ def add_stub(method_name, opts = nil, &implementation); end
+ def ensure_implemented(method_name); end
+ def ensure_publicly_implemented(method_name, _object); end
+end
+class RSpec::Mocks::VerifyingProxy < RSpec::Mocks::TestDoubleProxy
+ def initialize(object, order_group, doubled_module, method_reference_class); end
+ def method_reference; end
+ def validate_arguments!(method_name, args); end
+ def visibility_for(method_name); end
+ include RSpec::Mocks::VerifyingProxyMethods
+end
+class RSpec::Mocks::VerifyingPartialDoubleProxy < RSpec::Mocks::PartialDoubleProxy
+ def ensure_implemented(_method_name); end
+ def initialize(object, expectation_ordering, optional_callback_invocation_strategy = nil); end
+ def method_reference; end
+ include RSpec::Mocks::VerifyingProxyMethods
+end
+class RSpec::Mocks::VerifyingPartialClassDoubleProxy < RSpec::Mocks::VerifyingPartialDoubleProxy
+ include RSpec::Mocks::PartialClassDoubleProxyMethods
+end
+class RSpec::Mocks::VerifyingMethodDouble < RSpec::Mocks::MethodDouble
+ def add_expectation(*args, &block); end
+ def add_stub(*args, &block); end
+ def initialize(object, method_name, proxy, method_reference); end
+ def message_expectation_class; end
+ def proxy_method_invoked(obj, *args, &block); end
+ def validate_arguments!(actual_args); end
+end
+class RSpec::Mocks::VerifyingExistingMethodDouble < RSpec::Mocks::VerifyingMethodDouble
+ def initialize(object, method_name, proxy); end
+ def self.for(object, method_name, proxy); end
+ def unimplemented?; end
+ def with_signature; end
+end
+class RSpec::Mocks::VerifyingExistingClassNewMethodDouble < RSpec::Mocks::VerifyingExistingMethodDouble
+ def with_signature; end
+end
+module RSpec::Mocks::VerifyingDouble
+ def __send__(name, *args, &block); end
+ def initialize(doubled_module, *args); end
+ def method_missing(message, *args, &block); end
+ def respond_to?(message, include_private = nil); end
+ def send(name, *args, &block); end
+end
+module RSpec::Mocks::VerifyingDouble::SilentIO
+ def self.method_missing(*arg0); end
+ def self.respond_to?(*arg0); end
+end
+class RSpec::Mocks::InstanceVerifyingDouble
+ def __build_mock_proxy(order_group); end
+ include RSpec::Mocks::TestDouble
+ include RSpec::Mocks::VerifyingDouble
+end
+module RSpec::Mocks::ObjectVerifyingDoubleMethods
+ def __build_mock_proxy(order_group); end
+ def as_stubbed_const(options = nil); end
+ include RSpec::Mocks::TestDouble
+ include RSpec::Mocks::VerifyingDouble
+end
+class RSpec::Mocks::ObjectVerifyingDouble
+ include RSpec::Mocks::ObjectVerifyingDoubleMethods
+end
+class RSpec::Mocks::ClassVerifyingDouble < Module
+ include RSpec::Mocks::ObjectVerifyingDoubleMethods
+end
+module RSpec::Mocks::Version
+end
+module RSpec::Support
+ def self.require_rspec_mocks(f); end
+end
+module RSpec::Mocks::Matchers
+end
+module RSpec::Mocks::Matchers::Matcher
+end
+module RSpec::Mocks::AnyInstance
+ def self.error_generator; end
+end
+class RSpec::Mocks::AnyInstance::Chain
+ def constrained_to_any_of?(*constraints); end
+ def expectation_fulfilled!; end
+ def initialize(recorder, *args, &block); end
+ def last_message; end
+ def matches_args?(*args); end
+ def messages; end
+ def negated?; end
+ def never; end
+ def playback!(instance); end
+ def record(rspec_method_name, *args, &block); end
+ def with(*args, &block); end
+ include RSpec::Mocks::AnyInstance::Chain::Customizations
+end
+module RSpec::Mocks::AnyInstance::Chain::Customizations
+ def and_call_original(*args, &block); end
+ def and_raise(*args, &block); end
+ def and_return(*args, &block); end
+ def and_throw(*args, &block); end
+ def and_wrap_original(*args, &block); end
+ def and_yield(*args, &block); end
+ def at_least(*args, &block); end
+ def at_most(*args, &block); end
+ def exactly(*args, &block); end
+ def never(*args, &block); end
+ def once(*args, &block); end
+ def self.record(method_name); end
+ def thrice(*args, &block); end
+ def time(*args, &block); end
+ def times(*args, &block); end
+ def twice(*args, &block); end
+ def with(*args, &block); end
+end
+class RSpec::Mocks::AnyInstance::ErrorGenerator < RSpec::Mocks::ErrorGenerator
+ def raise_does_not_implement_error(klass, method_name); end
+ def raise_message_already_received_by_other_instance_error(method_name, object_inspect, invoked_instance); end
+ def raise_not_supported_with_prepend_error(method_name, problem_mod); end
+ def raise_second_instance_received_message_error(unfulfilled_expectations); end
+end
+class RSpec::Mocks::AnyInstance::StubChain < RSpec::Mocks::AnyInstance::Chain
+ def create_message_expectation_on(instance); end
+ def expectation_fulfilled?; end
+ def invocation_order; end
+ def verify_invocation_order(rspec_method_name, *_args, &_block); end
+end
+class RSpec::Mocks::AnyInstance::StubChainChain < RSpec::Mocks::AnyInstance::StubChain
+ def create_message_expectation_on(instance); end
+ def initialize(*args); end
+ def invocation_order; end
+end
+class RSpec::Mocks::AnyInstance::ExpectChainChain < RSpec::Mocks::AnyInstance::StubChain
+ def create_message_expectation_on(instance); end
+ def expectation_fulfilled?; end
+ def initialize(*args); end
+ def invocation_order; end
+ def playback!(instance); end
+end
+class RSpec::Mocks::AnyInstance::ExpectationChain < RSpec::Mocks::AnyInstance::Chain
+ def expectation_fulfilled?; end
+ def initialize(*args, &block); end
+ def verify_invocation_order(_rspec_method_name, *_args, &_block); end
+end
+class RSpec::Mocks::AnyInstance::PositiveExpectationChain < RSpec::Mocks::AnyInstance::ExpectationChain
+ def create_message_expectation_on(instance); end
+ def invocation_order; end
+end
+class RSpec::Mocks::AnyInstance::MessageChains
+ def [](method_name); end
+ def add(method_name, chain); end
+ def all_expectations_fulfilled?; end
+ def each_unfulfilled_expectation_matching(method_name, *args); end
+ def has_expectation?(method_name); end
+ def initialize; end
+ def playback!(instance, method_name); end
+ def raise_if_second_instance_to_receive_message(instance); end
+ def received_expected_message!(method_name); end
+ def remove_stub_chains_for!(method_name); end
+ def unfulfilled_expectations; end
+end
+class RSpec::Mocks::AnyInstance::Recorder
+ def allow_no_prepended_module_definition_of(method_name); end
+ def already_observing?(method_name); end
+ def ancestor_is_an_observer?(method_name); end
+ def backup_method!(method_name); end
+ def build_alias_method_name(method_name); end
+ def expect_chain(*method_names_and_optional_return_values, &block); end
+ def initialize(klass); end
+ def instance_that_received(method_name); end
+ def klass; end
+ def mark_invoked!(method_name); end
+ def message_chains; end
+ def normalize_chain(*args); end
+ def notify_received_message(_object, message, args, _blk); end
+ def observe!(method_name); end
+ def playback!(instance, method_name); end
+ def public_protected_or_private_method_defined?(method_name); end
+ def received_expected_message!(method_name); end
+ def remove_dummy_method!(method_name); end
+ def restore_method!(method_name); end
+ def restore_original_method!(method_name); end
+ def should_not_receive(method_name, &block); end
+ def should_receive(method_name, &block); end
+ def stop_all_observation!; end
+ def stop_observing!(method_name); end
+ def stub(method_name, &block); end
+ def stub_chain(*method_names_and_optional_return_values, &block); end
+ def stubs; end
+ def super_class_observers_for(method_name); end
+ def super_class_observing?(method_name); end
+ def unstub(method_name); end
+ def verify; end
+end
+class RSpec::Mocks::AnyInstance::Proxy
+ def expect_chain(*chain, &block); end
+ def initialize(recorder, target_proxies); end
+ def klass; end
+ def perform_proxying(method_name, args, block, &target_proxy_block); end
+ def should_not_receive(method_name, &block); end
+ def should_receive(method_name, &block); end
+ def stub(method_name_or_method_map, &block); end
+ def stub_chain(*chain, &block); end
+ def unstub(method_name); end
+end
+class RSpec::Mocks::AnyInstance::FluentInterfaceProxy
+ def initialize(targets); end
+ def method_missing(*args, &block); end
+ def respond_to_missing?(method_name, include_private = nil); end
+end
+class RSpec::Mocks::MessageChain
+ def block; end
+ def chain; end
+ def chain_on(object, *chain, &block); end
+ def find_matching_expectation; end
+ def find_matching_stub; end
+ def format_chain(*chain, &blk); end
+ def initialize(object, *chain, &blk); end
+ def object; end
+ def setup_chain; end
+end
+class RSpec::Mocks::ExpectChain < RSpec::Mocks::MessageChain
+ def expectation(object, message, &return_block); end
+ def self.expect_chain_on(object, *chain, &blk); end
+end
+class RSpec::Mocks::StubChain < RSpec::Mocks::MessageChain
+ def expectation(object, message, &return_block); end
+ def self.stub_chain_on(object, *chain, &blk); end
+end
+class RSpec::Mocks::MarshalExtension
+ def self.patch!; end
+ def self.unpatch!; end
+end
+class RSpec::Mocks::Matchers::HaveReceived
+ def apply_constraints_to(expectation); end
+ def at_least(*args); end
+ def at_most(*args); end
+ def capture_failure_message; end
+ def count_constraint; end
+ def description; end
+ def disallow(type, reason = nil); end
+ def does_not_match?(subject); end
+ def ensure_count_unconstrained; end
+ def exactly(*args); end
+ def expect; end
+ def expected_messages_received_in_order?; end
+ def failure_message; end
+ def failure_message_when_negated; end
+ def initialize(method_name, &block); end
+ def matches?(subject, &block); end
+ def mock_proxy; end
+ def name; end
+ def notify_failure_message; end
+ def once(*args); end
+ def ordered(*args); end
+ def setup_allowance(_subject, &_block); end
+ def setup_any_instance_allowance(_subject, &_block); end
+ def setup_any_instance_expectation(_subject, &_block); end
+ def setup_any_instance_negative_expectation(_subject, &_block); end
+ def setup_expectation(subject, &block); end
+ def setup_negative_expectation(subject, &block); end
+ def thrice(*args); end
+ def time(*args); end
+ def times(*args); end
+ def twice(*args); end
+ def with(*args); end
+ include RSpec::Mocks::Matchers::Matcher
+end
+class RSpec::Mocks::Matchers::ExpectationCustomization
+ def block; end
+ def block=(arg0); end
+ def initialize(method_name, args, block); end
+ def playback_onto(expectation); end
+end
+class RSpec::Mocks::Matchers::Receive
+ def and_call_original(*args, &block); end
+ def and_raise(*args, &block); end
+ def and_return(*args, &block); end
+ def and_throw(*args, &block); end
+ def and_wrap_original(*args, &block); end
+ def and_yield(*args, &block); end
+ def at_least(*args, &block); end
+ def at_most(*args, &block); end
+ def describable; end
+ def description; end
+ def does_not_match?(subject, &block); end
+ def exactly(*args, &block); end
+ def initialize(message, block); end
+ def matches?(subject, &block); end
+ def move_block_to_last_customization(block); end
+ def name; end
+ def never(*args, &block); end
+ def once(*args, &block); end
+ def ordered(*args, &block); end
+ def setup_allowance(subject, &block); end
+ def setup_any_instance_allowance(subject, &block); end
+ def setup_any_instance_expectation(subject, &block); end
+ def setup_any_instance_method_substitute(subject, method, block); end
+ def setup_any_instance_negative_expectation(subject, &block); end
+ def setup_expectation(subject, &block); end
+ def setup_method_substitute(host, method, block, *args); end
+ def setup_mock_proxy_method_substitute(subject, method, block); end
+ def setup_negative_expectation(subject, &block); end
+ def thrice(*args, &block); end
+ def time(*args, &block); end
+ def times(*args, &block); end
+ def twice(*args, &block); end
+ def warn_if_any_instance(expression, subject); end
+ def with(*args, &block); end
+ include RSpec::Mocks::Matchers::Matcher
+end
+class RSpec::Mocks::Matchers::Receive::DefaultDescribable
+ def description_for(verb); end
+ def initialize(message); end
+end
+class RSpec::Mocks::Matchers::ReceiveMessageChain
+ def and_call_original(*args, &block); end
+ def and_raise(*args, &block); end
+ def and_return(*args, &block); end
+ def and_throw(*args, &block); end
+ def and_yield(*args, &block); end
+ def description; end
+ def does_not_match?(*_args); end
+ def formatted_chain; end
+ def initialize(chain, &block); end
+ def matches?(subject, &block); end
+ def name; end
+ def replay_customizations(chain); end
+ def setup_allowance(subject, &block); end
+ def setup_any_instance_allowance(subject, &block); end
+ def setup_any_instance_expectation(subject, &block); end
+ def setup_expectation(subject, &block); end
+ def setup_negative_expectation(*_args); end
+ def with(*args, &block); end
+ include RSpec::Mocks::Matchers::Matcher
+end
+class RSpec::Mocks::Matchers::ReceiveMessages
+ def any_instance_of(subject); end
+ def description; end
+ def does_not_match?(_subject); end
+ def each_message_on(host); end
+ def initialize(message_return_value_hash); end
+ def matches?(subject); end
+ def name; end
+ def proxy_on(subject); end
+ def setup_allowance(subject); end
+ def setup_any_instance_allowance(subject); end
+ def setup_any_instance_expectation(subject); end
+ def setup_expectation(subject); end
+ def setup_negative_expectation(_subject); end
+ def warn_about_block; end
+ include RSpec::Mocks::Matchers::Matcher
+end
diff --git a/sorbet/rbi/gems/rspec-support.rbi b/sorbet/rbi/gems/rspec-support.rbi
new file mode 100644
index 0000000..5661344
--- /dev/null
+++ b/sorbet/rbi/gems/rspec-support.rbi
@@ -0,0 +1,280 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rspec-support/all/rspec-support.rbi
+#
+# rspec-support-3.10.2
+
+module RSpec
+ extend RSpec::Support::Warnings
+end
+module RSpec::Support
+ def self.class_of(object); end
+ def self.define_optimized_require_for_rspec(lib, &require_relative); end
+ def self.deregister_matcher_definition(&block); end
+ def self.failure_notifier; end
+ def self.failure_notifier=(callable); end
+ def self.is_a_matcher?(object); end
+ def self.matcher_definitions; end
+ def self.method_handle_for(object, method_name); end
+ def self.notify_failure(failure, options = nil); end
+ def self.register_matcher_definition(&block); end
+ def self.require_rspec_support(f); end
+ def self.rspec_description_for_object(object); end
+ def self.thread_local_data; end
+ def self.warning_notifier; end
+ def self.warning_notifier=(arg0); end
+ def self.with_failure_notifier(callable); end
+end
+module RSpec::Support::Version
+end
+class RSpec::Support::ComparableVersion
+ def <=>(other); end
+ def initialize(string); end
+ def segments; end
+ def string; end
+ include Comparable
+end
+module RSpec::Support::OS
+ def self.windows?; end
+ def self.windows_file_path?; end
+ def windows?; end
+ def windows_file_path?; end
+end
+module RSpec::Support::Ruby
+ def jruby?; end
+ def jruby_9000?; end
+ def jruby_version; end
+ def mri?; end
+ def non_mri?; end
+ def rbx?; end
+ def self.jruby?; end
+ def self.jruby_9000?; end
+ def self.jruby_version; end
+ def self.mri?; end
+ def self.non_mri?; end
+ def self.rbx?; end
+ def self.truffleruby?; end
+ def truffleruby?; end
+end
+module RSpec::Support::RubyFeatures
+ def caller_locations_supported?; end
+ def fork_supported?; end
+ def kw_args_supported?; end
+ def module_prepends_supported?; end
+ def module_refinement_supported?; end
+ def optional_and_splat_args_supported?; end
+ def required_kw_args_supported?; end
+ def ripper_supported?; end
+ def self.caller_locations_supported?; end
+ def self.fork_supported?; end
+ def self.kw_args_supported?; end
+ def self.module_prepends_supported?; end
+ def self.module_refinement_supported?; end
+ def self.optional_and_splat_args_supported?; end
+ def self.required_kw_args_supported?; end
+ def self.ripper_supported?; end
+ def self.supports_exception_cause?; end
+ def self.supports_rebinding_module_methods?; end
+ def self.supports_taint?; end
+ def supports_exception_cause?; end
+ def supports_rebinding_module_methods?; end
+ def supports_taint?; end
+end
+module RSpec::Support::AllExceptionsExceptOnesWeMustNotRescue
+ def self.===(exception); end
+end
+class RSpec::CallerFilter
+ def self.first_non_rspec_line(skip_frames = nil, increment = nil); end
+end
+module RSpec::Support::Warnings
+ def deprecate(deprecated, options = nil); end
+ def warn_deprecation(message, options = nil); end
+ def warn_with(message, options = nil); end
+ def warning(text, options = nil); end
+end
+class RSpec::Support::EncodedString
+ def <<(string); end
+ def ==(*args, &block); end
+ def detect_source_encoding(string); end
+ def empty?(*args, &block); end
+ def encoding(*args, &block); end
+ def eql?(*args, &block); end
+ def initialize(string, encoding = nil); end
+ def lines(*args, &block); end
+ def matching_encoding(string); end
+ def remove_invalid_bytes(string); end
+ def self.pick_encoding(source_a, source_b); end
+ def source_encoding; end
+ def split(regex_or_string); end
+ def to_s; end
+ def to_str; end
+end
+class RSpec::Support::ReentrantMutex
+ def enter; end
+ def exit; end
+ def initialize; end
+ def synchronize; end
+end
+class RSpec::Support::Mutex < Thread::Mutex
+ def self.new; end
+end
+class RSpec::Support::DirectoryMaker
+ def self.directory_exists?(dirname); end
+ def self.generate_path(stack, part); end
+ def self.generate_stack(path); end
+ def self.mkdir_p(path); end
+end
+class RSpec::Support::MethodSignature
+ def arbitrary_kw_args?; end
+ def classify_arity(arity = nil); end
+ def classify_parameters; end
+ def could_contain_kw_args?(args); end
+ def description; end
+ def has_kw_args_in?(args); end
+ def initialize(method); end
+ def invalid_kw_args_from(given_kw_args); end
+ def max_non_kw_args; end
+ def min_non_kw_args; end
+ def missing_kw_args_from(given_kw_args); end
+ def non_kw_args_arity_description; end
+ def optional_kw_args; end
+ def required_kw_args; end
+ def unlimited_args?; end
+ def valid_non_kw_args?(positional_arg_count, optional_max_arg_count = nil); end
+end
+class RSpec::Support::MethodSignatureExpectation
+ def empty?; end
+ def expect_arbitrary_keywords; end
+ def expect_arbitrary_keywords=(arg0); end
+ def expect_unlimited_arguments; end
+ def expect_unlimited_arguments=(arg0); end
+ def initialize; end
+ def keywords; end
+ def keywords=(values); end
+ def max_count; end
+ def max_count=(number); end
+ def min_count; end
+ def min_count=(number); end
+end
+class RSpec::Support::BlockSignature < RSpec::Support::MethodSignature
+ def classify_parameters; end
+end
+class RSpec::Support::MethodSignatureVerifier
+ def arbitrary_kw_args?; end
+ def error_message; end
+ def initialize(signature, args = nil); end
+ def invalid_kw_args; end
+ def kw_args; end
+ def max_non_kw_args; end
+ def min_non_kw_args; end
+ def missing_kw_args; end
+ def non_kw_args; end
+ def split_args(*args); end
+ def unlimited_args?; end
+ def valid?; end
+ def valid_non_kw_args?; end
+ def with_expectation(expectation); end
+end
+class RSpec::Support::LooseSignatureVerifier < RSpec::Support::MethodSignatureVerifier
+ def split_args(*args); end
+end
+class RSpec::Support::LooseSignatureVerifier::SignatureWithKeywordArgumentsMatcher
+ def has_kw_args_in?(args); end
+ def initialize(signature); end
+ def invalid_kw_args_from(_kw_args); end
+ def missing_kw_args_from(_kw_args); end
+ def non_kw_args_arity_description; end
+ def valid_non_kw_args?(*args); end
+end
+module RSpec::Support::WithKeywordsWhenNeeded
+ def class_exec(klass, *args, &block); end
+ def self.class_exec(klass, *args, &block); end
+end
+module RSpec::Support::RecursiveConstMethods
+ def const_defined_on?(mod, const_name); end
+ def constants_defined_on(mod); end
+ def get_const_defined_on(mod, const_name); end
+ def normalize_const_name(const_name); end
+ def recursive_const_defined?(const_name); end
+ def recursive_const_get(const_name); end
+end
+class RSpec::Support::ObjectFormatter
+ def format(object); end
+ def initialize(max_formatted_output_length = nil); end
+ def max_formatted_output_length; end
+ def max_formatted_output_length=(arg0); end
+ def prepare_array(array); end
+ def prepare_element(element); end
+ def prepare_for_inspection(object); end
+ def prepare_hash(input_hash); end
+ def recursive_structure?(object); end
+ def self.default_instance; end
+ def self.format(object); end
+ def self.prepare_for_inspection(object); end
+ def sort_hash_keys(input_hash); end
+ def truncate_string(str, start_index, end_index); end
+ def with_entering_structure(structure); end
+end
+class RSpec::Support::ObjectFormatter::InspectableItem < Struct
+ def inspect; end
+ def pretty_print(pp); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def text; end
+ def text=(_); end
+end
+class RSpec::Support::ObjectFormatter::BaseInspector < Struct
+ def formatter; end
+ def formatter=(_); end
+ def inspect; end
+ def object; end
+ def object=(_); end
+ def pretty_print(pp); end
+ def self.[](*arg0); end
+ def self.can_inspect?(_object); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Support::ObjectFormatter::TimeInspector < RSpec::Support::ObjectFormatter::BaseInspector
+ def inspect; end
+ def self.can_inspect?(object); end
+end
+class RSpec::Support::ObjectFormatter::DateTimeInspector < RSpec::Support::ObjectFormatter::BaseInspector
+ def inspect; end
+ def self.can_inspect?(object); end
+end
+class RSpec::Support::ObjectFormatter::BigDecimalInspector < RSpec::Support::ObjectFormatter::BaseInspector
+ def inspect; end
+ def self.can_inspect?(object); end
+end
+class RSpec::Support::ObjectFormatter::DescribableMatcherInspector < RSpec::Support::ObjectFormatter::BaseInspector
+ def inspect; end
+ def self.can_inspect?(object); end
+end
+class RSpec::Support::ObjectFormatter::UninspectableObjectInspector < RSpec::Support::ObjectFormatter::BaseInspector
+ def inspect; end
+ def klass; end
+ def native_object_id; end
+ def self.can_inspect?(object); end
+end
+class RSpec::Support::ObjectFormatter::DelegatorInspector < RSpec::Support::ObjectFormatter::BaseInspector
+ def inspect; end
+ def self.can_inspect?(object); end
+end
+class RSpec::Support::ObjectFormatter::InspectableObjectInspector < RSpec::Support::ObjectFormatter::BaseInspector
+ def inspect; end
+ def self.can_inspect?(object); end
+end
+module RSpec::Support::FuzzyMatcher
+ def self.arrays_match?(expected_list, actual_list); end
+ def self.hashes_match?(expected_hash, actual_hash); end
+ def self.values_match?(expected, actual); end
+end
diff --git a/sorbet/rbi/gems/rspec.rbi b/sorbet/rbi/gems/rspec.rbi
new file mode 100644
index 0000000..5e521c5
--- /dev/null
+++ b/sorbet/rbi/gems/rspec.rbi
@@ -0,0 +1,15 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rspec/all/rspec.rbi
+#
+# rspec-3.10.0
+
+module RSpec
+end
+module RSpec::Version
+end
diff --git a/sorbet/rbi/gems/ruby-rc4.rbi b/sorbet/rbi/gems/ruby-rc4.rbi
new file mode 100644
index 0000000..56b016c
--- /dev/null
+++ b/sorbet/rbi/gems/ruby-rc4.rbi
@@ -0,0 +1,19 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/ruby-rc4/all/ruby-rc4.rbi
+#
+# ruby-rc4-0.1.5
+
+class RC4
+ def decrypt(text); end
+ def encrypt!(text); end
+ def encrypt(text); end
+ def initialize(str); end
+ def process(text); end
+ def round; end
+end
diff --git a/sorbet/rbi/gems/ttfunk.rbi b/sorbet/rbi/gems/ttfunk.rbi
new file mode 100644
index 0000000..a9c2b5a
--- /dev/null
+++ b/sorbet/rbi/gems/ttfunk.rbi
@@ -0,0 +1,617 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+# https://github.com/sorbet/sorbet-typed/new/master?filename=lib/ttfunk/all/ttfunk.rbi
+#
+# ttfunk-1.7.0
+
+module TTFunk
+end
+class TTFunk::Aggregate
+ def coerce(other); end
+end
+class TTFunk::Directory
+ def initialize(io, offset = nil); end
+ def scaler_type; end
+ def tables; end
+end
+class TTFunk::ResourceFile
+ def [](type, index = nil); end
+ def initialize(io); end
+ def map; end
+ def parse_from(offset); end
+ def resources_for(type); end
+ def self.open(path); end
+end
+class TTFunk::Collection
+ def [](index); end
+ def count; end
+ def each; end
+ def initialize(io); end
+ def self.open(path); end
+ include Enumerable
+end
+class TTFunk::TTFEncoder
+ def align(data, width); end
+ def checksum(data); end
+ def cmap_table; end
+ def cvt_table; end
+ def dsig_table; end
+ def encode; end
+ def fpgm_table; end
+ def gasp_table; end
+ def glyf_table; end
+ def glyphs; end
+ def head_table; end
+ def hhea_table; end
+ def hmtx_table; end
+ def initialize(original, subset, options = nil); end
+ def kern_table; end
+ def loca_table; end
+ def maxp_table; end
+ def name_table; end
+ def new_to_old_glyph; end
+ def old_to_new_glyph; end
+ def optimal_table_order; end
+ def options; end
+ def original; end
+ def os2_table; end
+ def post_table; end
+ def prep_table; end
+ def raw(data); end
+ def subset; end
+ def tables; end
+ def vorg_table; end
+end
+class TTFunk::UnresolvedPlaceholderError < StandardError
+end
+class TTFunk::DuplicatePlaceholderError < StandardError
+end
+class TTFunk::EncodedString
+ def <<(obj); end
+ def add_placeholder(new_placeholder, pos = nil); end
+ def align!(width = nil); end
+ def bytes; end
+ def initialize; end
+ def io; end
+ def length; end
+ def placeholders; end
+ def resolve_placeholder(name, value); end
+ def string; end
+ def unresolved_string; end
+end
+class TTFunk::Placeholder
+ def initialize(name, length: nil); end
+ def length; end
+ def name; end
+ def position; end
+ def position=(arg0); end
+end
+class TTFunk::OTFEncoder < TTFunk::TTFEncoder
+ def base_table; end
+ def cff_table; end
+ def collect_glyphs(glyph_ids); end
+ def glyf_table; end
+ def loca_table; end
+ def optimal_table_order; end
+ def tables; end
+ def vorg_table; end
+end
+class TTFunk::SciForm
+ def ==(other); end
+ def eql?(arg0); end
+ def exponent; end
+ def initialize(significand, exponent = nil); end
+ def significand; end
+ def to_f; end
+end
+class TTFunk::BitField
+ def dup; end
+ def initialize(value = nil); end
+ def off(pos); end
+ def off?(pos); end
+ def on(pos); end
+ def on?(pos); end
+ def value; end
+end
+module TTFunk::BinUtils
+ def rangify(values); end
+ def slice_int(value, bit_width:, slice_count:); end
+ def stitch_int(arr, bit_width:); end
+ def twos_comp_to_int(num, bit_width:); end
+ extend TTFunk::BinUtils
+end
+module TTFunk::Reader
+ def hexdump(string); end
+ def io; end
+ def parse_from(position); end
+ def read(bytes, format); end
+ def read_signed(count); end
+ def to_signed(number); end
+end
+class TTFunk::SubTable
+ def eot?; end
+ def file; end
+ def initialize(file, offset, length = nil); end
+ def length; end
+ def read(*args); end
+ def table_offset; end
+ include TTFunk::Reader
+end
+class TTFunk::SubTable::EOTError < StandardError
+end
+class TTFunk::Min < TTFunk::Aggregate
+ def <<(new_value); end
+ def initialize(init_value = nil); end
+ def value; end
+ def value_or(default); end
+end
+class TTFunk::Max < TTFunk::Aggregate
+ def <<(new_value); end
+ def initialize(init_value = nil); end
+ def value; end
+ def value_or(default); end
+end
+class TTFunk::Sum < TTFunk::Aggregate
+ def <<(operand); end
+ def initialize(init_value = nil); end
+ def value; end
+ def value_or(_default); end
+end
+class TTFunk::OneBasedArray
+ def [](idx); end
+ def each(&block); end
+ def entries; end
+ def initialize(size = nil); end
+ def size; end
+ def to_ary; end
+ include Enumerable
+end
+class TTFunk::Table
+ def exists?; end
+ def file; end
+ def initialize(file); end
+ def length; end
+ def offset; end
+ def parse!; end
+ def raw; end
+ def tag; end
+ include TTFunk::Reader
+end
+class TTFunk::Table::Cff < TTFunk::Table
+ def encode(new_to_old, old_to_new); end
+ def global_subr_index; end
+ def header; end
+ def name_index; end
+ def parse!; end
+ def string_index; end
+ def tag; end
+ def top_index; end
+end
+class TTFunk::Table::Cmap < TTFunk::Table
+ def parse!; end
+ def self.encode(charmap, encoding); end
+ def tables; end
+ def unicode; end
+ def version; end
+end
+module TTFunk::Table::Cmap::Format00
+ def [](code); end
+ def code_map; end
+ def language; end
+ def parse_cmap!; end
+ def self.encode(charmap); end
+ def supported?; end
+end
+module TTFunk::Table::Cmap::Format04
+ def [](code); end
+ def code_map; end
+ def language; end
+ def parse_cmap!; end
+ def self.encode(charmap); end
+ def supported?; end
+end
+module TTFunk::Table::Cmap::Format06
+ def [](code); end
+ def code_map; end
+ def language; end
+ def parse_cmap!; end
+ def self.encode(charmap); end
+ def supported?; end
+end
+module TTFunk::Table::Cmap::Format10
+ def [](code); end
+ def code_map; end
+ def language; end
+ def parse_cmap!; end
+ def self.encode(charmap); end
+ def supported?; end
+end
+module TTFunk::Table::Cmap::Format12
+ def [](code); end
+ def code_map; end
+ def language; end
+ def parse_cmap!; end
+ def self.encode(charmap); end
+ def supported?; end
+end
+class TTFunk::Table::Cmap::Subtable
+ def [](_code); end
+ def encoding_id; end
+ def format; end
+ def initialize(file, table_start); end
+ def parse_cmap!; end
+ def platform_id; end
+ def self.encode(charmap, encoding); end
+ def supported?; end
+ def unicode?; end
+ include TTFunk::Reader
+end
+class TTFunk::Table::Dsig < TTFunk::Table
+ def flags; end
+ def parse!; end
+ def self.encode(dsig); end
+ def signatures; end
+ def tag; end
+ def version; end
+end
+class TTFunk::Table::Dsig::SignatureRecord
+ def format; end
+ def initialize(format, length, offset, signature); end
+ def length; end
+ def offset; end
+ def signature; end
+end
+class TTFunk::Table::Glyf < TTFunk::Table
+ def for(glyph_id); end
+ def parse!; end
+ def self.encode(glyphs, new_to_old, old_to_new); end
+end
+class TTFunk::Table::Glyf::Compound
+ def compound?; end
+ def glyph_ids; end
+ def id; end
+ def initialize(id, raw); end
+ def number_of_contours; end
+ def raw; end
+ def recode(mapping); end
+ def x_max; end
+ def x_min; end
+ def y_max; end
+ def y_min; end
+ include TTFunk::Reader
+end
+class TTFunk::Table::Glyf::Compound::Component < Struct
+ def arg1; end
+ def arg1=(_); end
+ def arg2; end
+ def arg2=(_); end
+ def flags; end
+ def flags=(_); end
+ def glyph_index; end
+ def glyph_index=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def transform; end
+ def transform=(_); end
+end
+class TTFunk::Table::Glyf::PathBased
+ def compound?; end
+ def horizontal_metrics; end
+ def initialize(path, horizontal_metrics); end
+ def left_side_bearing; end
+ def number_of_contours; end
+ def path; end
+ def right_side_bearing; end
+ def x_max; end
+ def x_min; end
+ def y_max; end
+ def y_min; end
+end
+class TTFunk::Table::Glyf::Simple
+ def compound?; end
+ def end_point_of_last_contour; end
+ def end_points_of_contours; end
+ def id; end
+ def initialize(id, raw); end
+ def instruction_length; end
+ def instructions; end
+ def number_of_contours; end
+ def raw; end
+ def recode(_mapping); end
+ def x_max; end
+ def x_min; end
+ def y_max; end
+ def y_min; end
+end
+class TTFunk::Table::Head < TTFunk::Table
+ def checksum_adjustment; end
+ def created; end
+ def flags; end
+ def font_direction_hint; end
+ def font_revision; end
+ def glyph_data_format; end
+ def index_to_loc_format; end
+ def lowest_rec_ppem; end
+ def mac_style; end
+ def magic_number; end
+ def modified; end
+ def parse!; end
+ def self.encode(head, loca, mapping); end
+ def self.min_max_values_for(head, mapping); end
+ def units_per_em; end
+ def version; end
+ def x_max; end
+ def x_min; end
+ def y_max; end
+ def y_min; end
+end
+class TTFunk::Table::Hhea < TTFunk::Table
+ def advance_width_max; end
+ def ascent; end
+ def caret_offset; end
+ def carot_slope_rise; end
+ def carot_slope_run; end
+ def descent; end
+ def line_gap; end
+ def metric_data_format; end
+ def min_left_side_bearing; end
+ def min_right_side_bearing; end
+ def number_of_metrics; end
+ def parse!; end
+ def self.encode(hhea, hmtx, original, mapping); end
+ def self.min_max_values_for(original, mapping); end
+ def version; end
+ def x_max_extent; end
+end
+class TTFunk::Table::Hmtx < TTFunk::Table
+ def for(glyph_id); end
+ def left_side_bearings; end
+ def metrics; end
+ def metrics_cache; end
+ def parse!; end
+ def self.encode(hmtx, mapping); end
+ def widths; end
+end
+class TTFunk::Table::Hmtx::HorizontalMetric < Struct
+ def advance_width; end
+ def advance_width=(_); end
+ def left_side_bearing; end
+ def left_side_bearing=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class TTFunk::Table::Kern < TTFunk::Table
+ def add_table(format, attributes = nil); end
+ def parse!; end
+ def parse_version_0_tables(_num_tables); end
+ def parse_version_1_tables(num_tables); end
+ def self.encode(kerning, mapping); end
+ def tables; end
+ def version; end
+end
+class TTFunk::Table::Kern::Format0
+ def attributes; end
+ def cross_stream?; end
+ def horizontal?; end
+ def initialize(attributes = nil); end
+ def pairs; end
+ def recode(mapping); end
+ def vertical?; end
+ include TTFunk::Reader
+end
+class TTFunk::Table::Loca < TTFunk::Table
+ def index_of(glyph_id); end
+ def offsets; end
+ def parse!; end
+ def self.encode(offsets); end
+ def size_of(glyph_id); end
+end
+class TTFunk::Table::Maxp < TTFunk::Table
+ def max_component_contours; end
+ def max_component_depth; end
+ def max_component_elements; end
+ def max_component_points; end
+ def max_contours; end
+ def max_function_defs; end
+ def max_instruction_defs; end
+ def max_points; end
+ def max_size_of_instructions; end
+ def max_stack_elements; end
+ def max_storage; end
+ def max_twilight_points; end
+ def max_zones; end
+ def num_glyphs; end
+ def parse!; end
+ def self.encode(maxp, mapping); end
+ def version; end
+end
+class TTFunk::Table::Name < TTFunk::Table
+ def compatible_full; end
+ def copyright; end
+ def description; end
+ def designer; end
+ def designer_url; end
+ def entries; end
+ def font_family; end
+ def font_name; end
+ def font_subfamily; end
+ def license; end
+ def license_url; end
+ def manufacturer; end
+ def parse!; end
+ def postscript_name; end
+ def preferred_family; end
+ def preferred_subfamily; end
+ def sample_text; end
+ def self.encode(names, key = nil); end
+ def strings; end
+ def trademark; end
+ def unique_subfamily; end
+ def vendor_url; end
+ def version; end
+end
+class TTFunk::Table::Name::NameString < String
+ def encoding_id; end
+ def initialize(text, platform_id, encoding_id, language_id); end
+ def language_id; end
+ def platform_id; end
+ def strip_extended; end
+end
+class TTFunk::Table::OS2 < TTFunk::Table
+ def ascent; end
+ def ave_char_width; end
+ def break_char; end
+ def cap_height; end
+ def char_range; end
+ def code_page_range; end
+ def default_char; end
+ def descent; end
+ def family_class; end
+ def first_char_index; end
+ def last_char_index; end
+ def line_gap; end
+ def max_context; end
+ def panose; end
+ def parse!; end
+ def selection; end
+ def self.avg_char_width_for(os2, subset); end
+ def self.avg_ms_symbol_char_width_for(os2, subset); end
+ def self.avg_weighted_char_width_for(os2, subset); end
+ def self.code_pages_for(subset); end
+ def self.encode(os2, subset); end
+ def self.group_original_code_points_by_bit(os2); end
+ def self.unicode_blocks_for(os2, original_field, subset); end
+ def tag; end
+ def type; end
+ def vendor_id; end
+ def version; end
+ def weight_class; end
+ def width_class; end
+ def win_ascent; end
+ def win_descent; end
+ def x_height; end
+ def y_strikeout_position; end
+ def y_strikeout_size; end
+ def y_subscript_x_offset; end
+ def y_subscript_x_size; end
+ def y_subscript_y_offset; end
+ def y_subscript_y_size; end
+ def y_superscript_x_offset; end
+ def y_superscript_x_size; end
+ def y_superscript_y_offset; end
+ def y_superscript_y_size; end
+end
+class TTFunk::Table::Post < TTFunk::Table
+ def fixed_pitch; end
+ def fixed_pitch?; end
+ def format; end
+ def glyph_for(_code); end
+ def italic_angle; end
+ def max_mem_type1; end
+ def max_mem_type42; end
+ def min_mem_type1; end
+ def min_mem_type42; end
+ def parse!; end
+ def parse_format!; end
+ def recode(mapping); end
+ def self.encode(post, mapping); end
+ def subtable; end
+ def underline_position; end
+ def underline_thickness; end
+end
+module TTFunk::Table::Post::Format10
+ def glyph_for(code); end
+ def parse_format!; end
+end
+module TTFunk::Table::Post::Format20
+ def glyph_for(code); end
+ def parse_format!; end
+ include TTFunk::Table::Post::Format10
+end
+module TTFunk::Table::Post::Format30
+ def glyph_for(_code); end
+ def parse_format!; end
+end
+module TTFunk::Table::Post::Format40
+ def glyph_for(code); end
+ def parse_format!; end
+end
+class TTFunk::Table::Sbix < TTFunk::Table
+ def all_bitmap_data_for(glyph_id); end
+ def bitmap_data_for(glyph_id, strike_index); end
+ def flags; end
+ def num_strikes; end
+ def parse!; end
+ def strikes; end
+ def version; end
+end
+class TTFunk::Table::Sbix::BitmapData < Struct
+ def data; end
+ def data=(_); end
+ def ppem; end
+ def ppem=(_); end
+ def resolution; end
+ def resolution=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def type; end
+ def type=(_); end
+ def x; end
+ def x=(_); end
+ def y; end
+ def y=(_); end
+end
+class TTFunk::Table::Vorg < TTFunk::Table
+ def count; end
+ def default_vert_origin_y; end
+ def for(glyph_id); end
+ def major_version; end
+ def minor_version; end
+ def origins; end
+ def parse!; end
+ def self.encode(vorg); end
+ def tag; end
+end
+class TTFunk::Error < StandardError
+end
+class TTFunk::File
+ def ascent; end
+ def bbox; end
+ def cff; end
+ def cmap; end
+ def contents; end
+ def descent; end
+ def digital_signature; end
+ def directory; end
+ def directory_info(tag); end
+ def find_glyph(glyph_id); end
+ def glyph_locations; end
+ def glyph_outlines; end
+ def header; end
+ def horizontal_header; end
+ def horizontal_metrics; end
+ def initialize(contents, offset = nil); end
+ def kerning; end
+ def line_gap; end
+ def maximum_profile; end
+ def name; end
+ def os2; end
+ def postscript; end
+ def sbix; end
+ def self.from_dfont(file, which = nil); end
+ def self.from_ttc(file, which = nil); end
+ def self.open(io_or_path); end
+ def self.verify_and_open(io_or_path); end
+ def vertical_origins; end
+end
diff --git a/sorbet/rbi/hidden-definitions/errors.txt b/sorbet/rbi/hidden-definitions/errors.txt
new file mode 100644
index 0000000..d44e131
--- /dev/null
+++ b/sorbet/rbi/hidden-definitions/errors.txt
@@ -0,0 +1,4605 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi hidden-definitions
+
+# typed: autogenerated
+
+# wrong constant name <DeclBuilderForProcs>
+# wrong constant name <DeclBuilderForProcs>
+# wrong constant name <Class:<DeclBuilderForProcs>>
+# wrong constant name <Magic>
+# wrong constant name <Magic>
+# wrong constant name <Class:<Magic>>
+# wrong constant name <PackageRegistry>
+# wrong constant name <PackageRegistry>
+# wrong constant name <PackageTests>
+# wrong constant name <PackageTests>
+# wrong constant name <RESERVED_0>
+# wrong constant name <RESERVED_10>
+# wrong constant name <RESERVED_11>
+# wrong constant name <RESERVED_1>
+# wrong constant name <RESERVED_2>
+# wrong constant name <RESERVED_3>
+# wrong constant name <RESERVED_4>
+# wrong constant name <RESERVED_5>
+# wrong constant name <RESERVED_6>
+# wrong constant name <RESERVED_7>
+# wrong constant name <RESERVED_8>
+# wrong constant name <RESERVED_9>
+# wrong constant name <TypeAlias>
+# wrong constant name <TypeAlias>
+# wrong constant name <root>
+# wrong constant name <Class:<root>>
+# wrong constant name <todo sym>
+# wrong constant name <todo sym>
+# wrong constant name <top>
+# wrong constant name <top>
+# wrong constant name connect_internal
+# wrong constant name abbrev
+# wrong constant name deconstruct
+# wrong constant name shelljoin
+# wrong constant name to_h
+# wrong constant name try_convert
+# wrong constant name <Class:BasicObject>
+# uninitialized constant BasicSocket::APPEND
+# uninitialized constant BasicSocket::BINARY
+# uninitialized constant BasicSocket::CREAT
+# uninitialized constant BasicSocket::DIRECT
+# uninitialized constant BasicSocket::DSYNC
+# Did you mean? BasicSocket::RSYNC
+# BasicSocket::SYNC
+# uninitialized constant BasicSocket::EXCL
+# uninitialized constant BasicSocket::FNM_CASEFOLD
+# uninitialized constant BasicSocket::FNM_DOTMATCH
+# uninitialized constant BasicSocket::FNM_EXTGLOB
+# uninitialized constant BasicSocket::FNM_NOESCAPE
+# uninitialized constant BasicSocket::FNM_PATHNAME
+# uninitialized constant BasicSocket::FNM_SHORTNAME
+# uninitialized constant BasicSocket::FNM_SYSCASE
+# uninitialized constant BasicSocket::LOCK_EX
+# Did you mean? BasicSocket::LOCK_NB
+# BasicSocket::LOCK_UN
+# BasicSocket::LOCK_SH
+# uninitialized constant BasicSocket::LOCK_NB
+# Did you mean? BasicSocket::LOCK_UN
+# BasicSocket::LOCK_EX
+# BasicSocket::LOCK_SH
+# uninitialized constant BasicSocket::LOCK_SH
+# Did you mean? BasicSocket::LOCK_NB
+# BasicSocket::LOCK_UN
+# BasicSocket::LOCK_EX
+# uninitialized constant BasicSocket::LOCK_UN
+# Did you mean? BasicSocket::LOCK_NB
+# BasicSocket::LOCK_EX
+# BasicSocket::LOCK_SH
+# uninitialized constant BasicSocket::NOATIME
+# uninitialized constant BasicSocket::NOCTTY
+# uninitialized constant BasicSocket::NOFOLLOW
+# uninitialized constant BasicSocket::NONBLOCK
+# uninitialized constant BasicSocket::NULL
+# uninitialized constant BasicSocket::RDONLY
+# Did you mean? BasicSocket::WRONLY
+# uninitialized constant BasicSocket::RDWR
+# uninitialized constant BasicSocket::RSYNC
+# Did you mean? BasicSocket::DSYNC
+# BasicSocket::SYNC
+# uninitialized constant BasicSocket::SEEK_CUR
+# uninitialized constant BasicSocket::SEEK_DATA
+# Did you mean? BasicSocket::SEEK_SET
+# uninitialized constant BasicSocket::SEEK_END
+# uninitialized constant BasicSocket::SEEK_HOLE
+# uninitialized constant BasicSocket::SEEK_SET
+# uninitialized constant BasicSocket::SHARE_DELETE
+# uninitialized constant BasicSocket::SYNC
+# Did you mean? BasicSocket::RSYNC
+# BasicSocket::DSYNC
+# uninitialized constant BasicSocket::TMPFILE
+# Did you mean? Tempfile
+# uninitialized constant BasicSocket::TRUNC
+# Did you mean? TRUE
+# uninitialized constant BasicSocket::WRONLY
+# Did you mean? BasicSocket::RDONLY
+# wrong constant name read_nonblock
+# uninitialized constant Benchmark
+# uninitialized constant Benchmark
+# wrong constant name clone
+# wrong constant name interpret_loosely
+# wrong constant name clone
+# wrong constant name irb
+# wrong constant name status_code
+# wrong constant name <static-init>
+# wrong constant name jruby_30?
+# wrong constant name jruby_3?
+# wrong constant name maglev_30?
+# wrong constant name maglev_3?
+# wrong constant name mingw_30?
+# wrong constant name mingw_3?
+# wrong constant name mri_30?
+# wrong constant name mri_3?
+# wrong constant name mswin64_30?
+# wrong constant name mswin64_3?
+# wrong constant name mswin_30?
+# wrong constant name mswin_3?
+# wrong constant name on_30?
+# wrong constant name on_3?
+# wrong constant name rbx_30?
+# wrong constant name rbx_3?
+# wrong constant name ruby_30?
+# wrong constant name ruby_3?
+# wrong constant name truffleruby_30?
+# wrong constant name truffleruby_3?
+# wrong constant name x64_mingw_30?
+# wrong constant name x64_mingw_3?
+# uninitialized constant Bundler::Definition::GENERICS
+# uninitialized constant Bundler::Definition::GENERIC_CACHE
+# wrong constant name dependencies_for
+# wrong constant name locked_dependencies
+# wrong constant name most_specific_locked_platform
+# wrong constant name requested_dependencies
+# wrong constant name resolve_only_locally!
+# wrong constant name no_lock
+# wrong constant name no_lock=
+# wrong constant name clone
+# wrong constant name get_proxy
+# uninitialized constant Bundler::Dependency::TYPES
+# wrong constant name branch
+# wrong constant name expanded_platforms
+# wrong constant name git
+# wrong constant name github
+# wrong constant name ref
+# wrong constant name <static-init>
+# wrong constant name sha1
+# wrong constant name check_primary_source_safety
+# wrong constant name <static-init>
+# wrong constant name environment
+# wrong constant name report
+# wrong constant name write
+# wrong constant name replace_with_backup
+# wrong constant name env_to_hash
+# wrong constant name from_env
+# wrong constant name <Class:Base>
+# wrong constant name <Class:CompactIndex>
+# wrong constant name <Class:Dependency>
+# wrong constant name <Class:Downloader>
+# wrong constant name <Class:Index>
+# wrong constant name <Class:TooManyRequestsError>
+# wrong constant name fetch_spec
+# wrong constant name fetchers
+# wrong constant name http_proxy
+# wrong constant name initialize
+# wrong constant name specs
+# wrong constant name specs_with_retry
+# wrong constant name uri
+# wrong constant name use_api
+# wrong constant name user_agent
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name api_fetcher?
+# wrong constant name available?
+# wrong constant name display_uri
+# wrong constant name downloader
+# wrong constant name fetch_uri
+# wrong constant name initialize
+# wrong constant name remote
+# wrong constant name remote_uri
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name <Class:ClientFetcher>
+# wrong constant name available?
+# wrong constant name specs
+# wrong constant name specs_for_names
+# uninitialized constant Bundler::Fetcher::CompactIndex::ClientFetcher::Elem
+# wrong constant name call
+# wrong constant name fetcher
+# wrong constant name fetcher=
+# wrong constant name ui
+# wrong constant name ui=
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name <static-init>
+# wrong constant name compact_index_request
+# wrong constant name dependency_api_uri
+# wrong constant name dependency_specs
+# wrong constant name get_formatted_specs_and_deps
+# wrong constant name specs
+# wrong constant name unmarshalled_dep_gems
+# wrong constant name <static-init>
+# wrong constant name connection
+# wrong constant name fetch
+# wrong constant name initialize
+# wrong constant name redirect_limit
+# wrong constant name request
+# wrong constant name <static-init>
+# wrong constant name specs
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name api_timeout
+# wrong constant name api_timeout=
+# wrong constant name disable_endpoint
+# wrong constant name disable_endpoint=
+# wrong constant name max_retries
+# wrong constant name max_retries=
+# wrong constant name redirect_limit
+# wrong constant name redirect_limit=
+# wrong constant name link
+# wrong constant name cp_lr
+# wrong constant name link_entry
+# uninitialized constant Bundler::GemHelper::DEFAULT
+# uninitialized constant Bundler::GemHelper::LN_SUPPORTED
+# uninitialized constant Bundler::GemHelper::LOW_METHODS
+# Did you mean? Bundler::GemHelper::LowMethods
+# uninitialized constant Bundler::GemHelper::METHODS
+# Did you mean? Method
+# uninitialized constant Bundler::GemHelper::OPT_TABLE
+# uninitialized constant Bundler::GemHelper::RUBY
+# uninitialized constant Bundler::GemHelper::VERSION
+# Did you mean? Bundler::VERSION
+# wrong constant name allowed_push_host
+# wrong constant name already_tagged?
+# wrong constant name base
+# wrong constant name build_checksum
+# wrong constant name build_gem
+# wrong constant name built_gem_path
+# wrong constant name clean?
+# wrong constant name committed?
+# wrong constant name current_branch
+# wrong constant name default_remote
+# wrong constant name gem_command
+# wrong constant name gem_key
+# wrong constant name gem_push?
+# wrong constant name gem_push_host
+# wrong constant name gemspec
+# wrong constant name git_push
+# wrong constant name guard_clean
+# wrong constant name initialize
+# wrong constant name install
+# wrong constant name install_gem
+# wrong constant name name
+# wrong constant name rubygem_push
+# wrong constant name sh
+# wrong constant name sh_with_input
+# wrong constant name sh_with_status
+# wrong constant name spec_path
+# wrong constant name tag_prefix=
+# wrong constant name tag_version
+# wrong constant name version
+# wrong constant name version_tag
+# wrong constant name <static-init>
+# wrong constant name gemspec
+# wrong constant name install_tasks
+# wrong constant name instance
+# wrong constant name instance=
+# wrong constant name tag_prefix=
+# wrong constant name specificity_score
+# wrong constant name local_platform
+# wrong constant name same_deps
+# wrong constant name same_specificity
+# wrong constant name initialize
+# wrong constant name level
+# wrong constant name level=
+# wrong constant name locked_specs
+# wrong constant name major?
+# wrong constant name minor?
+# wrong constant name prerelease_specified
+# wrong constant name prerelease_specified=
+# wrong constant name sort_versions
+# wrong constant name strict
+# wrong constant name strict=
+# wrong constant name unlock_gems
+# wrong constant name <static-init>
+# wrong constant name <Class:GraphVizClient>
+# wrong constant name edge_options
+# wrong constant name groups
+# wrong constant name initialize
+# wrong constant name node_options
+# wrong constant name output_file
+# wrong constant name output_format
+# wrong constant name relations
+# wrong constant name viz
+# wrong constant name g
+# wrong constant name initialize
+# wrong constant name run
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name inject
+# wrong constant name remove
+# wrong constant name <static-init>
+# wrong constant name inject
+# wrong constant name remove
+# uninitialized constant Bundler::LazySpecification::GENERICS
+# uninitialized constant Bundler::LazySpecification::GENERIC_CACHE
+# wrong constant name eql?
+# wrong constant name platform_string
+# uninitialized constant Bundler::LazySpecification::Identifier
+# uninitialized constant Bundler::LazySpecification::Identifier
+# wrong constant name bundled_with
+# uninitialized constant Bundler::Molinillo::Compatibility
+# Did you mean? Comparable
+# uninitialized constant Bundler::Molinillo::Compatibility
+# Did you mean? Comparable
+# wrong constant name dependencies_equal?
+# wrong constant name parent_folder
+# wrong constant name permission_type
+# wrong constant name ==
+# wrong constant name add_dependency_names
+# wrong constant name app_cache_dirname
+# wrong constant name app_cache_path
+# wrong constant name bundler_plugin_api_source?
+# wrong constant name cache
+# wrong constant name cached!
+# wrong constant name can_lock?
+# wrong constant name dependency_names
+# wrong constant name dependency_names=
+# wrong constant name double_check_for
+# wrong constant name eql?
+# wrong constant name fetch_gemspec_files
+# wrong constant name gem_install_dir
+# wrong constant name hash
+# wrong constant name identifier
+# wrong constant name include?
+# wrong constant name initialize
+# wrong constant name install
+# wrong constant name install_path
+# wrong constant name installed?
+# wrong constant name local!
+# wrong constant name name
+# wrong constant name options
+# wrong constant name options_to_lock
+# wrong constant name post_install
+# wrong constant name remote!
+# wrong constant name root
+# wrong constant name spec_names
+# wrong constant name specs
+# wrong constant name to_lock
+# wrong constant name to_s
+# wrong constant name unlock!
+# wrong constant name unmet_deps
+# wrong constant name uri
+# wrong constant name uri_hash
+# wrong constant name <static-init>
+# wrong constant name <Class:CommandConflict>
+# wrong constant name <Class:SourceConflict>
+# wrong constant name installed_plugins
+# wrong constant name plugin_commands
+# wrong constant name unregister_plugin
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name <Class:Git>
+# wrong constant name <Class:Rubygems>
+# wrong constant name install
+# wrong constant name install_definition
+# uninitialized constant Bundler::Plugin::Installer::Git::DEFAULT_GLOB
+# wrong constant name generate_bin
+# wrong constant name <static-init>
+# uninitialized constant Bundler::Plugin::Installer::Rubygems::API_REQUEST_LIMIT
+# Did you mean? Bundler::Plugin::Installer::Rubygems::API_REQUEST_SIZE
+# uninitialized constant Bundler::Plugin::Installer::Rubygems::API_REQUEST_SIZE
+# Did you mean? Bundler::Plugin::Installer::Rubygems::API_REQUEST_LIMIT
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name list
+# wrong constant name save_plugin
+# wrong constant name uninstall
+# wrong constant name <static-init>
+# wrong constant name lock
+# uninitialized constant Bundler::Resolver::GENERICS
+# uninitialized constant Bundler::Resolver::GENERIC_CACHE
+# wrong constant name results_for
+# wrong constant name source_for
+# wrong constant name activated_platforms
+# wrong constant name activated_platforms=
+# wrong constant name sorted_activated_platforms
+# wrong constant name create_for
+# wrong constant name attempt
+# wrong constant name attempts
+# wrong constant name current_run
+# wrong constant name current_run=
+# wrong constant name initialize
+# wrong constant name name
+# wrong constant name name=
+# wrong constant name total_runs
+# wrong constant name total_runs=
+# wrong constant name <static-init>
+# wrong constant name attempts
+# wrong constant name default_attempts
+# wrong constant name default_retries
+# wrong constant name add_default_gems_to
+# wrong constant name add_to_load_path
+# wrong constant name all_specs
+# wrong constant name backport_ext_builder_monitor
+# wrong constant name correct_for_windows_path
+# wrong constant name default_stubs
+# wrong constant name find_bundler
+# wrong constant name find_name
+# wrong constant name gem_remote_fetcher
+# wrong constant name load_env_plugins
+# wrong constant name plain_specs
+# wrong constant name plain_specs=
+# wrong constant name stub_rubygems
+# wrong constant name supports_bundler_trampolining?
+# uninitialized constant Bundler::RubygemsIntegration::AlmostModern
+# uninitialized constant Bundler::RubygemsIntegration::AlmostModern
+# uninitialized constant Bundler::RubygemsIntegration::Ancient
+# uninitialized constant Bundler::RubygemsIntegration::Ancient
+# uninitialized constant Bundler::RubygemsIntegration::Future
+# uninitialized constant Bundler::RubygemsIntegration::Future
+# uninitialized constant Bundler::RubygemsIntegration::Legacy
+# uninitialized constant Bundler::RubygemsIntegration::Legacy
+# uninitialized constant Bundler::RubygemsIntegration::Modern
+# Did you mean? Module
+# uninitialized constant Bundler::RubygemsIntegration::Modern
+# Did you mean? Module
+# uninitialized constant Bundler::RubygemsIntegration::MoreFuture
+# uninitialized constant Bundler::RubygemsIntegration::MoreFuture
+# uninitialized constant Bundler::RubygemsIntegration::MoreModern
+# Did you mean? Morecane
+# uninitialized constant Bundler::RubygemsIntegration::MoreModern
+# Did you mean? Morecane
+# uninitialized constant Bundler::RubygemsIntegration::Transitional
+# uninitialized constant Bundler::RubygemsIntegration::Transitional
+# wrong constant name install_locked_bundler_and_restart_with_it_if_needed
+# wrong constant name restart_with_locked_bundler_if_needed
+# wrong constant name update_bundler_and_restart_with_it_if_needed
+# wrong constant name <static-init>
+# wrong constant name <Class:Mirror>
+# wrong constant name <Class:Mirrors>
+# wrong constant name <Class:Validator>
+# wrong constant name processor_count
+# wrong constant name ==
+# wrong constant name fallback_timeout
+# wrong constant name fallback_timeout=
+# wrong constant name initialize
+# wrong constant name uri
+# wrong constant name uri=
+# wrong constant name valid?
+# wrong constant name validate!
+# wrong constant name <static-init>
+# wrong constant name each
+# wrong constant name for
+# wrong constant name initialize
+# wrong constant name parse
+# wrong constant name <static-init>
+# wrong constant name <Class:Rule>
+# wrong constant name description
+# wrong constant name fail!
+# wrong constant name initialize
+# wrong constant name k
+# wrong constant name set
+# wrong constant name validate!
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name validate!
+# wrong constant name key_for
+# wrong constant name <Class:RubygemsAggregate>
+# wrong constant name add_dependency_names
+# wrong constant name cached!
+# wrong constant name identifier
+# wrong constant name local!
+# wrong constant name local_only!
+# wrong constant name remote!
+# wrong constant name spec_names
+# uninitialized constant Bundler::Source::Git::DEFAULT_GLOB
+# wrong constant name glob
+# wrong constant name local?
+# wrong constant name default_cache_path_for
+# wrong constant name dependency_api_available?
+# wrong constant name multiple_remotes?
+# wrong constant name no_remotes?
+# wrong constant name remote_names
+# wrong constant name identifier
+# wrong constant name initialize
+# wrong constant name source_map
+# wrong constant name sources
+# wrong constant name specs
+# wrong constant name <static-init>
+# wrong constant name add_global_rubygems_remote
+# wrong constant name aggregate_global_source?
+# wrong constant name expired_sources?
+# wrong constant name global_path_source
+# wrong constant name implicit_global_source?
+# wrong constant name local_only!
+# wrong constant name lock_other_sources
+# wrong constant name lock_rubygems_sources
+# wrong constant name merged_gem_lockfile_sections!
+# wrong constant name merged_gem_lockfile_sections?
+# wrong constant name non_default_explicit_sources
+# wrong constant name non_global_rubygems_sources
+# wrong constant name all_requirements
+# wrong constant name dependencies
+# wrong constant name direct_requirements
+# wrong constant name initialize
+# wrong constant name pinned_spec_names
+# wrong constant name sources
+# wrong constant name <static-init>
+# wrong constant name missing_specs
+# uninitialized constant Bundler::StubSpecification::GENERICS
+# uninitialized constant Bundler::StubSpecification::GENERIC_CACHE
+# wrong constant name extensions
+# wrong constant name gem_build_complete_path
+# wrong constant name manually_installed?
+# wrong constant name <Class:Cyclic>
+# wrong constant name each_strongly_connected_component
+# wrong constant name each_strongly_connected_component_from
+# wrong constant name strongly_connected_components
+# wrong constant name tsort
+# wrong constant name tsort_each
+# wrong constant name tsort_each_child
+# wrong constant name tsort_each_node
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name each_strongly_connected_component
+# wrong constant name each_strongly_connected_component_from
+# wrong constant name strongly_connected_components
+# wrong constant name tsort
+# wrong constant name tsort_each
+# wrong constant name <Class:Actions>
+# wrong constant name <Class:AmbiguousCommandError>
+# wrong constant name <Class:Argument>
+# wrong constant name <Class:Arguments>
+# wrong constant name <Class:Base>
+# wrong constant name <Class:Command>
+# wrong constant name <Class:CoreExt>
+# wrong constant name <Class:DynamicCommand>
+# wrong constant name <Class:Error>
+# wrong constant name <Class:Group>
+# wrong constant name <Class:HiddenCommand>
+# wrong constant name <Class:Invocation>
+# wrong constant name <Class:InvocationError>
+# wrong constant name <Class:LineEditor>
+# wrong constant name <Class:MalformattedArgumentError>
+# wrong constant name <Class:NestedContext>
+# wrong constant name <Class:NoKwargSpellChecker>
+# wrong constant name <Class:Option>
+# wrong constant name <Class:Options>
+# wrong constant name <Class:RakeCompat>
+# wrong constant name <Class:RequiredArgumentMissingError>
+# uninitialized constant Bundler::Thor::SHELL_DELEGATED_METHODS
+# wrong constant name <Class:Sandbox>
+# wrong constant name <Class:Shell>
+# wrong constant name <Class:UndefinedCommandError>
+# wrong constant name <Class:UnknownArgumentError>
+# wrong constant name <Class:Util>
+# wrong constant name help
+# wrong constant name <Class:CapturableERB>
+# wrong constant name <Class:ClassMethods>
+# wrong constant name <Class:CreateFile>
+# wrong constant name <Class:CreateLink>
+# wrong constant name <Class:Directory>
+# wrong constant name <Class:EmptyDirectory>
+# wrong constant name <Class:InjectIntoFile>
+# wrong constant name _cleanup_options_and_set
+# wrong constant name _shared_configuration
+# wrong constant name action
+# wrong constant name add_file
+# wrong constant name add_link
+# wrong constant name append_file
+# wrong constant name append_to_file
+# wrong constant name apply
+# wrong constant name behavior
+# wrong constant name behavior=
+# wrong constant name chmod
+# wrong constant name comment_lines
+# wrong constant name copy_file
+# wrong constant name create_file
+# wrong constant name create_link
+# wrong constant name destination_root
+# wrong constant name destination_root=
+# wrong constant name directory
+# wrong constant name empty_directory
+# wrong constant name find_in_source_paths
+# wrong constant name get
+# wrong constant name gsub_file
+# wrong constant name in_root
+# wrong constant name initialize
+# wrong constant name inject_into_class
+# wrong constant name inject_into_file
+# wrong constant name inject_into_module
+# wrong constant name insert_into_file
+# wrong constant name inside
+# wrong constant name link_file
+# wrong constant name prepend_file
+# wrong constant name prepend_to_file
+# wrong constant name relative_to_original_destination_root
+# wrong constant name remove_dir
+# wrong constant name remove_file
+# wrong constant name run
+# wrong constant name run_ruby_script
+# wrong constant name source_paths
+# wrong constant name template
+# wrong constant name thor
+# wrong constant name uncomment_lines
+# uninitialized constant Bundler::Thor::Actions::CapturableERB::Revision
+# wrong constant name <static-init>
+# wrong constant name add_runtime_options!
+# wrong constant name source_paths
+# wrong constant name source_paths_for_search
+# wrong constant name source_root
+# wrong constant name <static-init>
+# wrong constant name data
+# wrong constant name force_on_collision?
+# wrong constant name force_or_skip_or_conflict
+# wrong constant name identical?
+# wrong constant name initialize
+# wrong constant name on_conflict_behavior
+# wrong constant name render
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name execute!
+# wrong constant name file_level_lookup
+# wrong constant name files
+# wrong constant name initialize
+# wrong constant name source
+# wrong constant name <static-init>
+# wrong constant name base
+# wrong constant name config
+# wrong constant name convert_encoded_instructions
+# wrong constant name destination
+# wrong constant name destination=
+# wrong constant name exists?
+# wrong constant name given_destination
+# wrong constant name initialize
+# wrong constant name invoke!
+# wrong constant name invoke_with_conflict_check
+# wrong constant name on_conflict_behavior
+# wrong constant name on_file_clash_behavior
+# wrong constant name pretend?
+# wrong constant name relative_destination
+# wrong constant name revoke!
+# wrong constant name say_status
+# wrong constant name <static-init>
+# wrong constant name behavior
+# wrong constant name flag
+# wrong constant name initialize
+# wrong constant name replace!
+# wrong constant name replacement
+# wrong constant name say_status
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name included
+# wrong constant name <static-init>
+# wrong constant name banner
+# wrong constant name default
+# wrong constant name default_banner
+# wrong constant name description
+# wrong constant name enum
+# wrong constant name human_name
+# wrong constant name initialize
+# wrong constant name name
+# wrong constant name required
+# wrong constant name required?
+# wrong constant name show_default?
+# wrong constant name type
+# wrong constant name usage
+# wrong constant name valid_type?
+# wrong constant name validate!
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name parse
+# wrong constant name remaining
+# wrong constant name <static-init>
+# wrong constant name parse
+# wrong constant name split
+# wrong constant name <Class:ClassMethods>
+# wrong constant name args
+# wrong constant name args=
+# wrong constant name initialize
+# wrong constant name options
+# wrong constant name options=
+# wrong constant name parent_options
+# wrong constant name parent_options=
+# wrong constant name all_commands
+# wrong constant name all_tasks
+# wrong constant name allow_incompatible_default_type!
+# wrong constant name argument
+# wrong constant name arguments
+# wrong constant name attr_accessor
+# wrong constant name attr_reader
+# wrong constant name attr_writer
+# wrong constant name baseclass
+# wrong constant name basename
+# wrong constant name build_option
+# wrong constant name build_options
+# wrong constant name check_default_type
+# wrong constant name check_default_type!
+# wrong constant name check_unknown_options
+# wrong constant name check_unknown_options!
+# wrong constant name check_unknown_options?
+# wrong constant name class_option
+# wrong constant name class_options
+# wrong constant name class_options_help
+# wrong constant name commands
+# wrong constant name create_command
+# wrong constant name create_task
+# wrong constant name disable_required_check?
+# wrong constant name dispatch
+# wrong constant name exit_on_failure?
+# wrong constant name find_and_refresh_command
+# wrong constant name find_and_refresh_task
+# wrong constant name from_superclass
+# wrong constant name group
+# wrong constant name handle_argument_error
+# wrong constant name handle_no_command_error
+# wrong constant name handle_no_task_error
+# wrong constant name inherited
+# wrong constant name initialize_added
+# wrong constant name is_thor_reserved_word?
+# wrong constant name method_added
+# wrong constant name namespace
+# wrong constant name no_commands
+# wrong constant name no_commands?
+# wrong constant name no_commands_context
+# wrong constant name no_tasks
+# wrong constant name print_options
+# wrong constant name public_command
+# wrong constant name public_task
+# wrong constant name remove_argument
+# wrong constant name remove_class_option
+# wrong constant name remove_command
+# wrong constant name remove_task
+# wrong constant name start
+# wrong constant name stop_on_unknown_option?
+# wrong constant name strict_args_position
+# wrong constant name strict_args_position!
+# wrong constant name strict_args_position?
+# wrong constant name tasks
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name included
+# wrong constant name register_klass_file
+# wrong constant name shell
+# wrong constant name shell=
+# wrong constant name subclass_files
+# wrong constant name subclasses
+# wrong constant name formatted_usage
+# wrong constant name handle_argument_error?
+# wrong constant name handle_no_method_error?
+# wrong constant name hidden?
+# wrong constant name initialize
+# wrong constant name local_method?
+# wrong constant name not_debugging?
+# wrong constant name private_method?
+# wrong constant name public_method?
+# wrong constant name required_arguments_for
+# wrong constant name required_options
+# wrong constant name run
+# wrong constant name sans_backtrace
+# wrong constant name <static-init>
+# wrong constant name <Class:HashWithIndifferentAccess>
+# uninitialized constant Bundler::Thor::CoreExt::HashWithIndifferentAccess::Elem
+# uninitialized constant Bundler::Thor::CoreExt::HashWithIndifferentAccess::K
+# uninitialized constant Bundler::Thor::CoreExt::HashWithIndifferentAccess::V
+# wrong constant name []
+# wrong constant name []=
+# wrong constant name convert_key
+# wrong constant name delete
+# wrong constant name except
+# wrong constant name fetch
+# wrong constant name initialize
+# wrong constant name key?
+# wrong constant name merge
+# wrong constant name merge!
+# wrong constant name method_missing
+# wrong constant name replace
+# wrong constant name reverse_merge
+# wrong constant name reverse_merge!
+# wrong constant name values_at
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# uninitialized constant Bundler::Thor::DynamicCommand::FILE_REGEXP
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# uninitialized constant Bundler::Thor::Group::SHELL_DELEGATED_METHODS
+# Did you mean? Bundler::Thor::SHELL_DELEGATED_METHODS
+# wrong constant name _invoke_for_class_method
+# wrong constant name <static-init>
+# wrong constant name banner
+# wrong constant name desc
+# wrong constant name get_options_from_invocations
+# wrong constant name handle_argument_error
+# wrong constant name help
+# wrong constant name invocation_blocks
+# wrong constant name invocations
+# wrong constant name invoke
+# wrong constant name invoke_from_option
+# wrong constant name printable_commands
+# wrong constant name printable_tasks
+# wrong constant name remove_invocation
+# wrong constant name self_command
+# wrong constant name self_task
+# uninitialized constant Bundler::Thor::HiddenCommand::FILE_REGEXP
+# wrong constant name <static-init>
+# wrong constant name <Class:ClassMethods>
+# wrong constant name _parse_initialization_options
+# wrong constant name _retrieve_class_and_command
+# wrong constant name _retrieve_class_and_task
+# wrong constant name _shared_configuration
+# wrong constant name current_command_chain
+# wrong constant name initialize
+# wrong constant name invoke
+# wrong constant name invoke_all
+# wrong constant name invoke_command
+# wrong constant name invoke_task
+# wrong constant name invoke_with_padding
+# wrong constant name prepare_for_invocation
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name included
+# wrong constant name <static-init>
+# wrong constant name <Class:Basic>
+# wrong constant name <Class:Readline>
+# wrong constant name initialize
+# wrong constant name options
+# wrong constant name prompt
+# wrong constant name readline
+# wrong constant name <static-init>
+# wrong constant name available?
+# wrong constant name <Class:PathCompletion>
+# wrong constant name initialize
+# wrong constant name matches
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name best_available
+# wrong constant name readline
+# wrong constant name <static-init>
+# wrong constant name enter
+# wrong constant name entered?
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name aliases
+# wrong constant name array?
+# wrong constant name boolean?
+# wrong constant name dasherize
+# wrong constant name dasherized?
+# wrong constant name group
+# wrong constant name hash?
+# wrong constant name hide
+# wrong constant name lazy_default
+# wrong constant name numeric?
+# wrong constant name repeatable
+# wrong constant name string?
+# wrong constant name switch_name
+# wrong constant name undasherize
+# wrong constant name usage
+# wrong constant name validate_default_type!
+# wrong constant name <static-init>
+# wrong constant name parse
+# uninitialized constant Bundler::Thor::Options::NUMERIC
+# Did you mean? Numeric
+# wrong constant name assign_result!
+# wrong constant name check_unknown!
+# wrong constant name current_is_switch?
+# wrong constant name current_is_switch_formatted?
+# wrong constant name initialize
+# wrong constant name normalize_switch
+# wrong constant name parse_boolean
+# wrong constant name parse_peek
+# wrong constant name parsing_options?
+# wrong constant name switch?
+# wrong constant name switch_option
+# wrong constant name unshift
+# wrong constant name <static-init>
+# wrong constant name to_switches
+# uninitialized constant Bundler::Thor::RakeCompat::DEFAULT
+# uninitialized constant Bundler::Thor::RakeCompat::LN_SUPPORTED
+# uninitialized constant Bundler::Thor::RakeCompat::LOW_METHODS
+# Did you mean? Bundler::Thor::RakeCompat::LowMethods
+# uninitialized constant Bundler::Thor::RakeCompat::METHODS
+# Did you mean? Method
+# uninitialized constant Bundler::Thor::RakeCompat::OPT_TABLE
+# uninitialized constant Bundler::Thor::RakeCompat::RUBY
+# uninitialized constant Bundler::Thor::RakeCompat::VERSION
+# Did you mean? Bundler::VERSION
+# wrong constant name <static-init>
+# wrong constant name included
+# wrong constant name rake_classes
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <Class:Basic>
+# wrong constant name <Class:Color>
+# wrong constant name <Class:HTML>
+# wrong constant name _shared_configuration
+# wrong constant name ask
+# wrong constant name error
+# wrong constant name file_collision
+# wrong constant name initialize
+# wrong constant name no?
+# wrong constant name print_in_columns
+# wrong constant name print_table
+# wrong constant name print_wrapped
+# wrong constant name say
+# wrong constant name say_error
+# wrong constant name say_status
+# wrong constant name set_color
+# wrong constant name shell
+# wrong constant name shell=
+# wrong constant name terminal_width
+# wrong constant name with_padding
+# wrong constant name yes?
+# wrong constant name answer_match
+# wrong constant name as_unicode
+# wrong constant name ask
+# wrong constant name ask_filtered
+# wrong constant name ask_simply
+# wrong constant name base
+# wrong constant name base=
+# wrong constant name can_display_colors?
+# wrong constant name dynamic_width
+# wrong constant name dynamic_width_stty
+# wrong constant name dynamic_width_tput
+# wrong constant name error
+# wrong constant name file_collision
+# wrong constant name file_collision_help
+# wrong constant name git_merge_tool
+# wrong constant name indent
+# wrong constant name is?
+# wrong constant name lookup_color
+# wrong constant name merge
+# wrong constant name merge_tool
+# wrong constant name mute
+# wrong constant name mute?
+# wrong constant name no?
+# wrong constant name padding
+# wrong constant name padding=
+# wrong constant name prepare_message
+# wrong constant name print_in_columns
+# wrong constant name print_table
+# wrong constant name print_wrapped
+# wrong constant name quiet?
+# wrong constant name say
+# wrong constant name say_error
+# wrong constant name say_status
+# wrong constant name set_color
+# wrong constant name show_diff
+# wrong constant name stderr
+# wrong constant name stdout
+# wrong constant name terminal_width
+# wrong constant name truncate
+# wrong constant name unix?
+# wrong constant name yes?
+# wrong constant name <static-init>
+# uninitialized constant Bundler::Thor::Shell::Color::DEFAULT_TERMINAL_WIDTH
+# wrong constant name are_colors_disabled?
+# wrong constant name are_colors_supported?
+# wrong constant name diff_lcs_loaded?
+# wrong constant name output_diff_line
+# wrong constant name set_color
+# wrong constant name <static-init>
+# uninitialized constant Bundler::Thor::Shell::HTML::DEFAULT_TERMINAL_WIDTH
+# wrong constant name ask
+# wrong constant name diff_lcs_loaded?
+# wrong constant name output_diff_line
+# wrong constant name set_color
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <Class:SpellChecker>
+# wrong constant name all_commands
+# wrong constant name command
+# wrong constant name initialize
+# wrong constant name corrections
+# wrong constant name error
+# wrong constant name initialize
+# wrong constant name spell_checker
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <Class:SpellChecker>
+# wrong constant name initialize
+# wrong constant name switches
+# wrong constant name unknown
+# wrong constant name corrections
+# wrong constant name error
+# wrong constant name initialize
+# wrong constant name spell_checker
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name camel_case
+# wrong constant name escape_globs
+# wrong constant name escape_html
+# wrong constant name find_by_namespace
+# wrong constant name find_class_and_command_by_namespace
+# wrong constant name find_class_and_task_by_namespace
+# wrong constant name globs_for
+# wrong constant name load_thorfile
+# wrong constant name namespace_from_thor_class
+# wrong constant name namespaces_in_content
+# wrong constant name ruby_command
+# wrong constant name snake_case
+# wrong constant name thor_classes_in
+# wrong constant name thor_root
+# wrong constant name thor_root_glob
+# wrong constant name user_home
+# wrong constant name <static-init>
+# wrong constant name banner
+# wrong constant name check_unknown_options!
+# wrong constant name command_help
+# wrong constant name default_command
+# wrong constant name default_task
+# wrong constant name deprecation_warning
+# wrong constant name desc
+# wrong constant name disable_required_check
+# wrong constant name disable_required_check!
+# wrong constant name disable_required_check?
+# wrong constant name dispatch
+# wrong constant name dynamic_command_class
+# wrong constant name find_command_possibilities
+# wrong constant name find_task_possibilities
+# wrong constant name help
+# wrong constant name long_desc
+# wrong constant name map
+# wrong constant name method_option
+# wrong constant name method_options
+# wrong constant name normalize_command_name
+# wrong constant name normalize_task_name
+# wrong constant name option
+# wrong constant name options
+# wrong constant name package_name
+# wrong constant name printable_commands
+# wrong constant name printable_tasks
+# wrong constant name register
+# wrong constant name retrieve_command_name
+# wrong constant name retrieve_task_name
+# wrong constant name stop_on_unknown_option
+# wrong constant name stop_on_unknown_option!
+# wrong constant name stop_on_unknown_option?
+# wrong constant name subcommand
+# wrong constant name subcommand_classes
+# wrong constant name subcommand_help
+# wrong constant name subcommands
+# wrong constant name subtask
+# wrong constant name subtask_help
+# wrong constant name subtasks
+# wrong constant name task_help
+# wrong constant name add_color
+# wrong constant name ask
+# wrong constant name confirm
+# wrong constant name debug
+# wrong constant name debug?
+# wrong constant name error
+# wrong constant name info
+# wrong constant name initialize
+# wrong constant name level
+# wrong constant name level=
+# wrong constant name no?
+# wrong constant name quiet?
+# wrong constant name shell=
+# wrong constant name silence
+# wrong constant name trace
+# wrong constant name unprinted_warnings
+# wrong constant name warn
+# wrong constant name yes?
+# wrong constant name <static-init>
+# wrong constant name <Class:BadURIError>
+# wrong constant name <Class:Error>
+# wrong constant name <Class:FTP>
+# wrong constant name <Class:File>
+# wrong constant name <Class:Generic>
+# wrong constant name <Class:HTTP>
+# wrong constant name <Class:HTTPS>
+# wrong constant name <Class:InvalidComponentError>
+# wrong constant name <Class:InvalidURIError>
+# wrong constant name <Class:LDAP>
+# wrong constant name <Class:LDAPS>
+# wrong constant name <Class:MailTo>
+# wrong constant name <Class:RFC2396_Parser>
+# wrong constant name <Class:RFC2396_REGEXP>
+# wrong constant name <Class:RFC3986_Parser>
+# wrong constant name <Class:Util>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# uninitialized constant Bundler::URI::FTP::ABS_PATH
+# Did you mean? Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::FTP::ABS_URI
+# Did you mean? Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::FTP::ABS_URI_REF
+# Did you mean? Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::FTP::DEFAULT_PARSER
+# Did you mean? Bundler::URI::FTP::DEFAULT_PORT
+# Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::FTP::ESCAPED
+# Did you mean? Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::FTP::FRAGMENT
+# Did you mean? Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::FTP::HOST
+# Did you mean? Bundler::URI::HOST
+# uninitialized constant Bundler::URI::FTP::OPAQUE
+# Did you mean? Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::FTP::PORT
+# Did you mean? Bundler::URI::PORT
+# uninitialized constant Bundler::URI::FTP::QUERY
+# Did you mean? Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::FTP::REGISTRY
+# Did you mean? Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::FTP::REL_PATH
+# Did you mean? Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::FTP::REL_URI
+# Did you mean? Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::FTP::REL_URI_REF
+# Did you mean? Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::FTP::RFC3986_PARSER
+# Did you mean? Bundler::URI::FTP::RFC3986_Parser
+# Bundler::URI::RFC3986_Parser
+# Bundler::URI::FTP::RFC2396_Parser
+# Bundler::URI::RFC2396_Parser
+# Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::FTP::SCHEME
+# Did you mean? Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::FTP::TBLDECWWWCOMP_
+# Did you mean? Bundler::URI::FTP::TBLENCWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::FTP::TBLENCWWWCOMP_
+# Did you mean? Bundler::URI::FTP::TBLDECWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::FTP::UNSAFE
+# Did you mean? Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::FTP::URI_REF
+# Did you mean? Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::FTP::USERINFO
+# Did you mean? Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::FTP::USE_REGISTRY
+# uninitialized constant Bundler::URI::FTP::VERSION
+# Did you mean? Bundler::URI::VERSION
+# Bundler::VERSION
+# uninitialized constant Bundler::URI::FTP::VERSION_CODE
+# Did you mean? Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::FTP::WEB_ENCODINGS_
+# Did you mean? Bundler::URI::WEB_ENCODINGS_
+# wrong constant name set_typecode
+# wrong constant name typecode
+# wrong constant name typecode=
+# wrong constant name <static-init>
+# wrong constant name new2
+# uninitialized constant Bundler::URI::File::ABS_PATH
+# Did you mean? Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::File::ABS_URI
+# Did you mean? Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::File::ABS_URI_REF
+# Did you mean? Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::File::DEFAULT_PARSER
+# Did you mean? Bundler::URI::File::DEFAULT_PORT
+# Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::File::ESCAPED
+# Did you mean? Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::File::FRAGMENT
+# Did you mean? Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::File::HOST
+# Did you mean? Bundler::URI::HOST
+# uninitialized constant Bundler::URI::File::OPAQUE
+# Did you mean? Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::File::PORT
+# Did you mean? Bundler::URI::PORT
+# uninitialized constant Bundler::URI::File::QUERY
+# Did you mean? Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::File::REGISTRY
+# Did you mean? Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::File::REL_PATH
+# Did you mean? Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::File::REL_URI
+# Did you mean? Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::File::REL_URI_REF
+# Did you mean? Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::File::RFC3986_PARSER
+# Did you mean? Bundler::URI::File::RFC3986_Parser
+# Bundler::URI::RFC3986_Parser
+# Bundler::URI::File::RFC2396_Parser
+# Bundler::URI::RFC2396_Parser
+# Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::File::SCHEME
+# Did you mean? Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::File::TBLDECWWWCOMP_
+# Did you mean? Bundler::URI::File::TBLENCWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::File::TBLENCWWWCOMP_
+# Did you mean? Bundler::URI::File::TBLDECWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::File::UNSAFE
+# Did you mean? Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::File::URI_REF
+# Did you mean? Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::File::USERINFO
+# Did you mean? Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::File::USE_REGISTRY
+# uninitialized constant Bundler::URI::File::VERSION
+# Did you mean? Bundler::URI::VERSION
+# Bundler::VERSION
+# uninitialized constant Bundler::URI::File::VERSION_CODE
+# Did you mean? Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::File::WEB_ENCODINGS_
+# Did you mean? Bundler::URI::WEB_ENCODINGS_
+# wrong constant name check_password
+# wrong constant name check_user
+# wrong constant name check_userinfo
+# wrong constant name set_userinfo
+# wrong constant name <static-init>
+# wrong constant name +
+# wrong constant name -
+# wrong constant name ==
+# uninitialized constant Bundler::URI::Generic::ABS_PATH
+# Did you mean? Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::Generic::ABS_URI
+# Did you mean? Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::Generic::ABS_URI_REF
+# Did you mean? Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::Generic::DEFAULT_PARSER
+# Did you mean? Bundler::URI::Generic::DEFAULT_PORT
+# Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::Generic::ESCAPED
+# Did you mean? Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::Generic::FRAGMENT
+# Did you mean? Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::Generic::HOST
+# Did you mean? Bundler::URI::HOST
+# uninitialized constant Bundler::URI::Generic::OPAQUE
+# Did you mean? Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::Generic::PORT
+# Did you mean? Bundler::URI::PORT
+# uninitialized constant Bundler::URI::Generic::QUERY
+# Did you mean? Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::Generic::REGISTRY
+# Did you mean? Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::Generic::REL_PATH
+# Did you mean? Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::Generic::REL_URI
+# Did you mean? Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::Generic::REL_URI_REF
+# Did you mean? Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::Generic::RFC3986_PARSER
+# Did you mean? Bundler::URI::Generic::RFC3986_Parser
+# Bundler::URI::RFC3986_Parser
+# Bundler::URI::Generic::RFC2396_Parser
+# Bundler::URI::RFC2396_Parser
+# Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::Generic::SCHEME
+# Did you mean? Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::Generic::TBLDECWWWCOMP_
+# Did you mean? Bundler::URI::Generic::TBLENCWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::Generic::TBLENCWWWCOMP_
+# Did you mean? Bundler::URI::Generic::TBLDECWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::Generic::UNSAFE
+# Did you mean? Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::Generic::URI_REF
+# Did you mean? Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::Generic::USERINFO
+# Did you mean? Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::Generic::VERSION
+# Did you mean? Bundler::URI::VERSION
+# Bundler::VERSION
+# uninitialized constant Bundler::URI::Generic::VERSION_CODE
+# Did you mean? Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::Generic::WEB_ENCODINGS_
+# Did you mean? Bundler::URI::WEB_ENCODINGS_
+# wrong constant name absolute
+# wrong constant name absolute?
+# wrong constant name coerce
+# wrong constant name component
+# wrong constant name component_ary
+# wrong constant name default_port
+# wrong constant name eql?
+# wrong constant name find_proxy
+# wrong constant name fragment
+# wrong constant name fragment=
+# wrong constant name hierarchical?
+# wrong constant name host
+# wrong constant name host=
+# wrong constant name hostname
+# wrong constant name hostname=
+# wrong constant name initialize
+# wrong constant name merge
+# wrong constant name merge!
+# wrong constant name normalize
+# wrong constant name normalize!
+# wrong constant name opaque
+# wrong constant name opaque=
+# wrong constant name parser
+# wrong constant name password
+# wrong constant name password=
+# wrong constant name path
+# wrong constant name path=
+# wrong constant name port
+# wrong constant name port=
+# wrong constant name query
+# wrong constant name query=
+# wrong constant name registry
+# wrong constant name registry=
+# wrong constant name relative?
+# wrong constant name route_from
+# wrong constant name route_to
+# wrong constant name scheme
+# wrong constant name scheme=
+# wrong constant name select
+# wrong constant name set_host
+# wrong constant name set_opaque
+# wrong constant name set_password
+# wrong constant name set_path
+# wrong constant name set_port
+# wrong constant name set_registry
+# wrong constant name set_scheme
+# wrong constant name set_user
+# wrong constant name set_userinfo
+# wrong constant name user
+# wrong constant name user=
+# wrong constant name userinfo
+# wrong constant name userinfo=
+# wrong constant name <static-init>
+# wrong constant name build
+# wrong constant name build2
+# wrong constant name component
+# wrong constant name default_port
+# wrong constant name use_proxy?
+# wrong constant name use_registry
+# uninitialized constant Bundler::URI::HTTP::ABS_PATH
+# Did you mean? Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::HTTP::ABS_URI
+# Did you mean? Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::HTTP::ABS_URI_REF
+# Did you mean? Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::HTTP::DEFAULT_PARSER
+# Did you mean? Bundler::URI::HTTP::DEFAULT_PORT
+# Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::HTTP::ESCAPED
+# Did you mean? Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::HTTP::FRAGMENT
+# Did you mean? Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::HTTP::HOST
+# Did you mean? Bundler::URI::HOST
+# uninitialized constant Bundler::URI::HTTP::OPAQUE
+# Did you mean? Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::HTTP::PORT
+# Did you mean? Bundler::URI::PORT
+# uninitialized constant Bundler::URI::HTTP::QUERY
+# Did you mean? Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::HTTP::REGISTRY
+# Did you mean? Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::HTTP::REL_PATH
+# Did you mean? Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::HTTP::REL_URI
+# Did you mean? Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::HTTP::REL_URI_REF
+# Did you mean? Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::HTTP::RFC3986_PARSER
+# Did you mean? Bundler::URI::HTTP::RFC3986_Parser
+# Bundler::URI::RFC3986_Parser
+# Bundler::URI::HTTP::RFC2396_Parser
+# Bundler::URI::RFC2396_Parser
+# Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::HTTP::SCHEME
+# Did you mean? Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::HTTP::TBLDECWWWCOMP_
+# Did you mean? Bundler::URI::HTTP::TBLENCWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::HTTP::TBLENCWWWCOMP_
+# Did you mean? Bundler::URI::HTTP::TBLDECWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::HTTP::UNSAFE
+# Did you mean? Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::HTTP::URI_REF
+# Did you mean? Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::HTTP::USERINFO
+# Did you mean? Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::HTTP::USE_REGISTRY
+# uninitialized constant Bundler::URI::HTTP::VERSION
+# Did you mean? Bundler::URI::VERSION
+# Bundler::VERSION
+# uninitialized constant Bundler::URI::HTTP::VERSION_CODE
+# Did you mean? Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::HTTP::WEB_ENCODINGS_
+# Did you mean? Bundler::URI::WEB_ENCODINGS_
+# wrong constant name request_uri
+# wrong constant name <static-init>
+# uninitialized constant Bundler::URI::HTTPS::ABS_PATH
+# Did you mean? Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::HTTPS::ABS_URI
+# Did you mean? Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::HTTPS::ABS_URI_REF
+# Did you mean? Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::HTTPS::COMPONENT
+# uninitialized constant Bundler::URI::HTTPS::DEFAULT_PARSER
+# Did you mean? Bundler::URI::HTTPS::DEFAULT_PORT
+# Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::HTTPS::ESCAPED
+# Did you mean? Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::HTTPS::FRAGMENT
+# Did you mean? Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::HTTPS::HOST
+# Did you mean? Bundler::URI::HOST
+# uninitialized constant Bundler::URI::HTTPS::OPAQUE
+# Did you mean? Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::HTTPS::PORT
+# Did you mean? Bundler::URI::PORT
+# uninitialized constant Bundler::URI::HTTPS::QUERY
+# Did you mean? Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::HTTPS::REGISTRY
+# Did you mean? Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::HTTPS::REL_PATH
+# Did you mean? Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::HTTPS::REL_URI
+# Did you mean? Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::HTTPS::REL_URI_REF
+# Did you mean? Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::HTTPS::RFC3986_PARSER
+# Did you mean? Bundler::URI::HTTPS::RFC3986_Parser
+# Bundler::URI::RFC3986_Parser
+# Bundler::URI::HTTPS::RFC2396_Parser
+# Bundler::URI::RFC2396_Parser
+# Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::HTTPS::SCHEME
+# Did you mean? Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::HTTPS::TBLDECWWWCOMP_
+# Did you mean? Bundler::URI::HTTPS::TBLENCWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::HTTPS::TBLENCWWWCOMP_
+# Did you mean? Bundler::URI::HTTPS::TBLDECWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::HTTPS::UNSAFE
+# Did you mean? Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::HTTPS::URI_REF
+# Did you mean? Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::HTTPS::USERINFO
+# Did you mean? Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::HTTPS::USE_REGISTRY
+# uninitialized constant Bundler::URI::HTTPS::VERSION
+# Did you mean? Bundler::URI::VERSION
+# Bundler::VERSION
+# uninitialized constant Bundler::URI::HTTPS::VERSION_CODE
+# Did you mean? Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::HTTPS::WEB_ENCODINGS_
+# Did you mean? Bundler::URI::WEB_ENCODINGS_
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# uninitialized constant Bundler::URI::LDAP::ABS_PATH
+# Did you mean? Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::LDAP::ABS_URI
+# Did you mean? Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::LDAP::ABS_URI_REF
+# Did you mean? Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::LDAP::DEFAULT_PARSER
+# Did you mean? Bundler::URI::LDAP::DEFAULT_PORT
+# Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::LDAP::ESCAPED
+# Did you mean? Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::LDAP::FRAGMENT
+# Did you mean? Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::LDAP::HOST
+# Did you mean? Bundler::URI::HOST
+# uninitialized constant Bundler::URI::LDAP::OPAQUE
+# Did you mean? Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::LDAP::PORT
+# Did you mean? Bundler::URI::PORT
+# uninitialized constant Bundler::URI::LDAP::QUERY
+# Did you mean? Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::LDAP::REGISTRY
+# Did you mean? Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::LDAP::REL_PATH
+# Did you mean? Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::LDAP::REL_URI
+# Did you mean? Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::LDAP::REL_URI_REF
+# Did you mean? Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::LDAP::RFC3986_PARSER
+# Did you mean? Bundler::URI::LDAP::RFC3986_Parser
+# Bundler::URI::RFC3986_Parser
+# Bundler::URI::LDAP::RFC2396_Parser
+# Bundler::URI::RFC2396_Parser
+# Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::LDAP::SCHEME
+# Did you mean? Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::LDAP::TBLDECWWWCOMP_
+# Did you mean? Bundler::URI::LDAP::TBLENCWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::LDAP::TBLENCWWWCOMP_
+# Did you mean? Bundler::URI::LDAP::TBLDECWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::LDAP::UNSAFE
+# Did you mean? Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::LDAP::URI_REF
+# Did you mean? Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::LDAP::USERINFO
+# Did you mean? Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::LDAP::USE_REGISTRY
+# uninitialized constant Bundler::URI::LDAP::VERSION
+# Did you mean? Bundler::URI::VERSION
+# Bundler::VERSION
+# uninitialized constant Bundler::URI::LDAP::VERSION_CODE
+# Did you mean? Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::LDAP::WEB_ENCODINGS_
+# Did you mean? Bundler::URI::WEB_ENCODINGS_
+# wrong constant name attributes
+# wrong constant name attributes=
+# wrong constant name dn
+# wrong constant name dn=
+# wrong constant name extensions
+# wrong constant name extensions=
+# wrong constant name filter
+# wrong constant name filter=
+# wrong constant name initialize
+# wrong constant name scope
+# wrong constant name scope=
+# wrong constant name set_attributes
+# wrong constant name set_dn
+# wrong constant name set_extensions
+# wrong constant name set_filter
+# wrong constant name set_scope
+# wrong constant name <static-init>
+# uninitialized constant Bundler::URI::LDAPS::ABS_PATH
+# Did you mean? Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::LDAPS::ABS_URI
+# Did you mean? Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::LDAPS::ABS_URI_REF
+# Did you mean? Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::LDAPS::COMPONENT
+# uninitialized constant Bundler::URI::LDAPS::DEFAULT_PARSER
+# Did you mean? Bundler::URI::LDAPS::DEFAULT_PORT
+# Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::LDAPS::ESCAPED
+# Did you mean? Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::LDAPS::FRAGMENT
+# Did you mean? Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::LDAPS::HOST
+# Did you mean? Bundler::URI::HOST
+# uninitialized constant Bundler::URI::LDAPS::OPAQUE
+# Did you mean? Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::LDAPS::PORT
+# Did you mean? Bundler::URI::PORT
+# uninitialized constant Bundler::URI::LDAPS::QUERY
+# Did you mean? Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::LDAPS::REGISTRY
+# Did you mean? Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::LDAPS::REL_PATH
+# Did you mean? Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::LDAPS::REL_URI
+# Did you mean? Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::LDAPS::REL_URI_REF
+# Did you mean? Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::LDAPS::RFC3986_PARSER
+# Did you mean? Bundler::URI::LDAPS::RFC3986_Parser
+# Bundler::URI::RFC3986_Parser
+# Bundler::URI::LDAPS::RFC2396_Parser
+# Bundler::URI::RFC2396_Parser
+# Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::LDAPS::SCHEME
+# Did you mean? Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::LDAPS::SCOPE
+# uninitialized constant Bundler::URI::LDAPS::SCOPE_BASE
+# Did you mean? Bundler::URI::LDAPS::SCOPE_ONE
+# uninitialized constant Bundler::URI::LDAPS::SCOPE_ONE
+# Did you mean? Bundler::URI::LDAPS::SCOPE_SUB
+# Bundler::URI::LDAPS::SCOPE_BASE
+# uninitialized constant Bundler::URI::LDAPS::SCOPE_SUB
+# Did you mean? Bundler::URI::LDAPS::SCOPE_ONE
+# uninitialized constant Bundler::URI::LDAPS::TBLDECWWWCOMP_
+# Did you mean? Bundler::URI::LDAPS::TBLENCWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::LDAPS::TBLENCWWWCOMP_
+# Did you mean? Bundler::URI::LDAPS::TBLDECWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::LDAPS::UNSAFE
+# Did you mean? Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::LDAPS::URI_REF
+# Did you mean? Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::LDAPS::USERINFO
+# Did you mean? Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::LDAPS::USE_REGISTRY
+# uninitialized constant Bundler::URI::LDAPS::VERSION
+# Did you mean? Bundler::URI::VERSION
+# Bundler::VERSION
+# uninitialized constant Bundler::URI::LDAPS::VERSION_CODE
+# Did you mean? Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::LDAPS::WEB_ENCODINGS_
+# Did you mean? Bundler::URI::WEB_ENCODINGS_
+# wrong constant name <static-init>
+# uninitialized constant Bundler::URI::MailTo::ABS_PATH
+# Did you mean? Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::MailTo::ABS_URI
+# Did you mean? Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::MailTo::ABS_URI_REF
+# Did you mean? Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::MailTo::DEFAULT_PARSER
+# Did you mean? Bundler::URI::MailTo::DEFAULT_PORT
+# Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::MailTo::ESCAPED
+# Did you mean? Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::MailTo::FRAGMENT
+# Did you mean? Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::MailTo::HOST
+# Did you mean? Bundler::URI::HOST
+# uninitialized constant Bundler::URI::MailTo::OPAQUE
+# Did you mean? Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::MailTo::PORT
+# Did you mean? Bundler::URI::PORT
+# uninitialized constant Bundler::URI::MailTo::QUERY
+# Did you mean? Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::MailTo::REGISTRY
+# Did you mean? Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::MailTo::REL_PATH
+# Did you mean? Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::MailTo::REL_URI
+# Did you mean? Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::MailTo::REL_URI_REF
+# Did you mean? Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::MailTo::RFC3986_PARSER
+# Did you mean? Bundler::URI::MailTo::RFC3986_Parser
+# Bundler::URI::RFC3986_Parser
+# Bundler::URI::MailTo::RFC2396_Parser
+# Bundler::URI::RFC2396_Parser
+# Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::MailTo::SCHEME
+# Did you mean? Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::MailTo::TBLDECWWWCOMP_
+# Did you mean? Bundler::URI::MailTo::TBLENCWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::MailTo::TBLENCWWWCOMP_
+# Did you mean? Bundler::URI::MailTo::TBLDECWWWCOMP_
+# Bundler::URI::TBLENCWWWCOMP_
+# Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::MailTo::UNSAFE
+# Did you mean? Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::MailTo::URI_REF
+# Did you mean? Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::MailTo::USERINFO
+# Did you mean? Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::MailTo::USE_REGISTRY
+# uninitialized constant Bundler::URI::MailTo::VERSION
+# Did you mean? Bundler::URI::VERSION
+# Bundler::VERSION
+# uninitialized constant Bundler::URI::MailTo::VERSION_CODE
+# Did you mean? Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::MailTo::WEB_ENCODINGS_
+# Did you mean? Bundler::URI::WEB_ENCODINGS_
+# wrong constant name headers
+# wrong constant name headers=
+# wrong constant name initialize
+# wrong constant name set_headers
+# wrong constant name set_to
+# wrong constant name to
+# wrong constant name to=
+# wrong constant name to_mailtext
+# wrong constant name to_rfc822text
+# wrong constant name <static-init>
+# wrong constant name escape
+# wrong constant name extract
+# wrong constant name initialize
+# wrong constant name join
+# wrong constant name make_regexp
+# wrong constant name parse
+# wrong constant name pattern
+# wrong constant name regexp
+# wrong constant name split
+# wrong constant name unescape
+# wrong constant name <static-init>
+# wrong constant name <Class:PATTERN>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name join
+# wrong constant name parse
+# wrong constant name regexp
+# wrong constant name split
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name make_components_hash
+# wrong constant name <static-init>
+# wrong constant name decode_www_form
+# wrong constant name decode_www_form_component
+# wrong constant name encode_www_form
+# wrong constant name encode_www_form_component
+# wrong constant name extract
+# wrong constant name for
+# wrong constant name get_encoding
+# wrong constant name join
+# wrong constant name parse
+# wrong constant name regexp
+# wrong constant name scheme_list
+# wrong constant name split
+# wrong constant name <Class:NEq>
+# wrong constant name <Class:ReqR>
+# uninitialized constant Bundler::VersionRanges::NEq::Elem
+# wrong constant name version
+# wrong constant name version=
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name <=>
+# uninitialized constant Bundler::VersionRanges::ReqR::Elem
+# wrong constant name <Class:Endpoint>
+# wrong constant name cover?
+# wrong constant name empty?
+# wrong constant name left
+# wrong constant name left=
+# wrong constant name right
+# wrong constant name right=
+# wrong constant name single?
+# wrong constant name <=>
+# uninitialized constant Bundler::VersionRanges::ReqR::Endpoint::Elem
+# wrong constant name inclusive
+# wrong constant name inclusive=
+# wrong constant name version
+# wrong constant name version=
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name <static-init>
+# wrong constant name empty?
+# wrong constant name for
+# wrong constant name for_many
+# uninitialized constant Bundler::YAMLSerializer
+# uninitialized constant Bundler::YAMLSerializer
+# wrong constant name configure_gem_home_and_path
+# wrong constant name most_specific_locked_platform?
+# wrong constant name original_exec
+# wrong constant name original_system
+# wrong constant name preferred_gemfile_name
+# wrong constant name reset_settings_and_root!
+# wrong constant name self_manager
+# wrong constant name unbundled_env
+# wrong constant name unbundled_exec
+# wrong constant name unbundled_system
+# wrong constant name a
+# wrong constant name base
+# wrong constant name blockquote
+# wrong constant name caption
+# wrong constant name checkbox
+# wrong constant name checkbox_group
+# wrong constant name file_field
+# wrong constant name form
+# wrong constant name hidden
+# wrong constant name html
+# wrong constant name image_button
+# wrong constant name img
+# wrong constant name multipart_form
+# wrong constant name password_field
+# wrong constant name popup_menu
+# wrong constant name radio_button
+# wrong constant name radio_group
+# wrong constant name reset
+# wrong constant name scrolling_list
+# wrong constant name submit
+# wrong constant name text_field
+# wrong constant name textarea
+# wrong constant name <static-init>
+# uninitialized constant CMath
+# uninitialized constant CMath
+# uninitialized constant CSV
+# uninitialized constant CSV
+# wrong constant name json_creatable?
+# uninitialized constant CodeRay::Encoders::Terminal::DEFAULT_OPTIONS
+# uninitialized constant CodeRay::Scanners::Java::DEFAULT_OPTIONS
+# uninitialized constant CodeRay::Scanners::Java::Id
+# uninitialized constant CodeRay::Scanners::Java::KINDS_NOT_LOC
+# uninitialized constant CodeRay::Scanners::Java::SCANNER_STATE_INFO
+# uninitialized constant CodeRay::Scanners::Java::SCAN_ERROR_MESSAGE
+# uninitialized constant CodeRay::Scanners::Java::Version
+# Did you mean? CodeRay::VERSION
+# uninitialized constant CodeRay::Scanners::Scanner::Id
+# uninitialized constant CodeRay::Scanners::Scanner::Version
+# Did you mean? CodeRay::VERSION
+# wrong constant name initialize
+# wrong constant name render
+# wrong constant name render_command
+# wrong constant name <static-init>
+# wrong constant name template
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# uninitialized constant Continuation
+# uninitialized constant Continuation
+# uninitialized constant Coverage
+# uninitialized constant Coverage
+# uninitialized constant DBM
+# uninitialized constant DBM
+# uninitialized constant DBMError
+# uninitialized constant DBMError
+# wrong constant name _dump
+# wrong constant name _load
+# wrong constant name alive?
+# wrong constant name close
+# wrong constant name initialize
+# wrong constant name send_message
+# wrong constant name uri
+# wrong constant name make_pool
+# wrong constant name open
+# wrong constant name stop_pool
+# wrong constant name dump
+# wrong constant name initialize
+# wrong constant name load
+# wrong constant name recv_reply
+# wrong constant name recv_request
+# wrong constant name send_reply
+# wrong constant name send_request
+# wrong constant name ==
+# wrong constant name eql?
+# wrong constant name initialize
+# wrong constant name prepare_backtrace
+# wrong constant name with_friend
+# wrong constant name auto_load
+# wrong constant name initialize
+# wrong constant name <Class:InvokeMethod>
+# wrong constant name <Class:InvokeMethod18Mixin>
+# wrong constant name initialize
+# wrong constant name safe_level
+# wrong constant name initialize
+# wrong constant name perform
+# wrong constant name <static-init>
+# wrong constant name block_yield
+# wrong constant name perform_with_block
+# wrong constant name <static-init>
+# wrong constant name default_safe_level
+# wrong constant name make_config
+# wrong constant name accept
+# wrong constant name alive?
+# wrong constant name close
+# wrong constant name initialize
+# wrong constant name peeraddr
+# wrong constant name recv_reply
+# wrong constant name recv_request
+# wrong constant name send_reply
+# wrong constant name send_request
+# wrong constant name set_sockopt
+# wrong constant name shutdown
+# wrong constant name stream
+# wrong constant name uri
+# wrong constant name getservername
+# wrong constant name open
+# wrong constant name open_server
+# wrong constant name open_server_inaddr_any
+# wrong constant name parse_uri
+# wrong constant name uri_option
+# wrong constant name ==
+# wrong constant name eql?
+# wrong constant name initialize
+# wrong constant name option
+# wrong constant name <static-init>
+# wrong constant name _dump
+# wrong constant name _dump
+# wrong constant name _load
+# wrong constant name _dump
+# wrong constant name initialize
+# wrong constant name _load
+# wrong constant name _execute
+# wrong constant name alive?
+# wrong constant name initialize
+# wrong constant name kill
+# wrong constant name method_missing
+# wrong constant name <static-init>
+# wrong constant name mutex
+# wrong constant name infinite?
+# wrong constant name initialize
+# wrong constant name class_name
+# wrong constant name class_names
+# wrong constant name corrections
+# wrong constant name initialize
+# wrong constant name scopes
+# wrong constant name call
+# wrong constant name <static-init>
+# wrong constant name corrections
+# wrong constant name original_message
+# wrong constant name spell_checker
+# wrong constant name to_s
+# uninitialized constant DidYouMean::Formatter
+# uninitialized constant DidYouMean::Formatter
+# wrong constant name distance
+# wrong constant name distance
+# wrong constant name corrections
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name distance
+# wrong constant name min3
+# wrong constant name corrections
+# wrong constant name initialize
+# wrong constant name method_name
+# wrong constant name method_names
+# wrong constant name names_to_exclude
+# wrong constant name receiver
+# wrong constant name corrections
+# wrong constant name initialize
+# wrong constant name call
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name message_for
+# wrong constant name <static-init>
+# wrong constant name augment
+# wrong constant name correct
+# wrong constant name dictionary
+# wrong constant name dimensions
+# wrong constant name initialize
+# wrong constant name separator
+# wrong constant name <static-init>
+# wrong constant name corrections
+# wrong constant name cvar_names
+# wrong constant name initialize
+# wrong constant name ivar_names
+# wrong constant name lvar_names
+# wrong constant name method_names
+# wrong constant name name
+# wrong constant name correct_error
+# wrong constant name formatter
+# wrong constant name formatter=
+# wrong constant name children
+# wrong constant name each_child
+# wrong constant name exists?
+# wrong constant name def_method
+# wrong constant name def_module
+# wrong constant name _dump
+# wrong constant name initialize
+# wrong constant name _load
+# wrong constant name sum
+# wrong constant name +
+# wrong constant name <Class:ArithmeticSequence>
+# wrong constant name <Class:Chain>
+# wrong constant name <Class:Producer>
+# wrong constant name each_with_index
+# uninitialized constant Enumerator::ArithmeticSequence::Elem
+# wrong constant name begin
+# wrong constant name each
+# wrong constant name end
+# wrong constant name exclude_end?
+# wrong constant name last
+# wrong constant name step
+# wrong constant name <static-init>
+# uninitialized constant Enumerator::Chain::Elem
+# wrong constant name <static-init>
+# wrong constant name each
+# wrong constant name initialize
+# wrong constant name eager
+# wrong constant name each
+# wrong constant name <static-init>
+# wrong constant name to_proc
+# wrong constant name produce
+# wrong constant name <static-init>
+# wrong constant name gid
+# wrong constant name gid=
+# wrong constant name mem
+# wrong constant name mem=
+# wrong constant name name
+# wrong constant name name=
+# wrong constant name passwd
+# wrong constant name passwd=
+# wrong constant name []
+# wrong constant name each
+# wrong constant name members
+# wrong constant name <Class:Group>
+# wrong constant name dir=
+# wrong constant name gecos
+# wrong constant name gecos=
+# wrong constant name gid=
+# wrong constant name name=
+# wrong constant name passwd=
+# wrong constant name shell=
+# wrong constant name uid=
+# wrong constant name []
+# wrong constant name each
+# wrong constant name members
+# wrong constant name <Class:Passwd>
+# uninitialized constant Exception2MessageMapper
+# uninitialized constant Exception2MessageMapper
+# wrong constant name <static-init>
+# uninitialized constant Fcntl
+# uninitialized constant Fcntl
+# wrong constant name initialize
+# uninitialized constant Fiddle
+# Did you mean? File
+# uninitialized constant Fiddle
+# Did you mean? File
+# wrong constant name absolute_path?
+# wrong constant name exists?
+# uninitialized constant FileUtils::DryRun::LN_SUPPORTED
+# Did you mean? FileUtils::LN_SUPPORTED
+# uninitialized constant FileUtils::DryRun::RUBY
+# Did you mean? FileUtils::RUBY
+# uninitialized constant FileUtils::DryRun::VERSION
+# Did you mean? FileUtils::VERSION
+# uninitialized constant FileUtils::NoWrite::LN_SUPPORTED
+# Did you mean? FileUtils::LN_SUPPORTED
+# uninitialized constant FileUtils::NoWrite::RUBY
+# Did you mean? FileUtils::RUBY
+# uninitialized constant FileUtils::NoWrite::VERSION
+# Did you mean? FileUtils::VERSION
+# uninitialized constant FileUtils::Verbose::LN_SUPPORTED
+# Did you mean? FileUtils::LN_SUPPORTED
+# uninitialized constant FileUtils::Verbose::RUBY
+# Did you mean? FileUtils::RUBY
+# uninitialized constant FileUtils::Verbose::VERSION
+# Did you mean? FileUtils::VERSION
+# wrong constant name _compile_method
+# wrong constant name _delegator_method
+# wrong constant name _valid_method?
+# wrong constant name debug
+# wrong constant name debug=
+# wrong constant name receiver
+# wrong constant name garbage_collect
+# wrong constant name verify_transient_heap_internal_consistency
+# uninitialized constant GDBM
+# uninitialized constant GDBM
+# uninitialized constant GDBMError
+# uninitialized constant GDBMError
+# uninitialized constant GDBMFatalError
+# uninitialized constant GDBMFatalError
+# wrong constant name <Class:RuntimeRequirementNotMetError>
+# wrong constant name <Class:SpecFetcher>
+# wrong constant name <Class:SpecificationPolicy>
+# wrong constant name <Class:UninstallError>
+# uninitialized constant Gem::AvailableSet
+# uninitialized constant Gem::AvailableSet
+# uninitialized constant Gem::DependencyInstaller
+# Did you mean? Gem::DependencyList
+# uninitialized constant Gem::DependencyInstaller
+# Did you mean? Gem::DependencyList
+# wrong constant name <static-init>
+# uninitialized constant Gem::Ext::ExtConfBuilder::CHDIR_MONITOR
+# uninitialized constant Gem::Ext::ExtConfBuilder::CHDIR_MUTEX
+# wrong constant name <static-init>
+# wrong constant name build
+# wrong constant name get_relative_path
+# wrong constant name copy_to
+# wrong constant name data_mode
+# wrong constant name data_mode=
+# wrong constant name dir_mode
+# wrong constant name dir_mode=
+# wrong constant name extract_files
+# wrong constant name initialize
+# wrong constant name prog_mode
+# wrong constant name prog_mode=
+# wrong constant name spec
+# wrong constant name spec=
+# wrong constant name <static-init>
+# wrong constant name home
+# wrong constant name initialize
+# wrong constant name path
+# wrong constant name spec_cache_dir
+# wrong constant name match_gem?
+# wrong constant name match_spec?
+# wrong constant name <Class:CorrectHashForLambdaOperator>
+# wrong constant name <Class:OrderIndependentComparison>
+# wrong constant name hash
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name _requirements_sorted?
+# wrong constant name _with_sorted_requirements
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name add_edge_no_circular
+# wrong constant name add_vertex
+# wrong constant name delete_edge
+# wrong constant name detach_vertex_named
+# wrong constant name each
+# wrong constant name pop!
+# wrong constant name reverse_each
+# wrong constant name rewind_to
+# wrong constant name set_payload
+# wrong constant name tag
+# wrong constant name <static-init>
+# uninitialized constant Gem::Resolver::Molinillo::DependencyGraph::Log::Elem
+# wrong constant name suggestion
+# wrong constant name suggestion=
+# wrong constant name <static-init>
+# wrong constant name available_specs
+# wrong constant name detect
+# wrong constant name initialize
+# wrong constant name latest_specs
+# wrong constant name prerelease_specs
+# wrong constant name search_for_dependency
+# wrong constant name sources
+# wrong constant name spec_for_dependency
+# wrong constant name specs
+# wrong constant name suggest_gems_from_name
+# wrong constant name tuples_for
+# wrong constant name <static-init>
+# wrong constant name fetcher
+# wrong constant name fetcher=
+# wrong constant name <=>
+# uninitialized constant Gem::Specification::GENERICS
+# uninitialized constant Gem::Specification::GENERIC_CACHE
+# wrong constant name deleted_gem?
+# wrong constant name removed_method_calls
+# wrong constant name to_ruby
+# wrong constant name initialize
+# wrong constant name packaging
+# wrong constant name packaging=
+# wrong constant name validate
+# wrong constant name validate_dependencies
+# wrong constant name validate_metadata
+# wrong constant name validate_permissions
+# wrong constant name <static-init>
+# uninitialized constant Gem::Stream
+# Did you mean? Gem::StreamUI
+# uninitialized constant Gem::Stream
+# Did you mean? Gem::StreamUI
+# wrong constant name _deprecated_debug
+# wrong constant name build_extensions
+# wrong constant name extensions
+# wrong constant name initialize
+# wrong constant name missing_extensions?
+# wrong constant name valid?
+# wrong constant name extensions
+# wrong constant name full_name
+# wrong constant name initialize
+# wrong constant name name
+# wrong constant name platform
+# wrong constant name require_paths
+# wrong constant name version
+# wrong constant name default_gemspec_stub
+# wrong constant name gemspec_stub
+# wrong constant name spec
+# wrong constant name spec=
+# wrong constant name <static-init>
+# wrong constant name activated_gem_paths
+# uninitialized constant GetoptLong
+# uninitialized constant GetoptLong
+# wrong constant name deconstruct_keys
+# wrong constant name create
+# wrong constant name ruby2_keywords_hash
+# wrong constant name ruby2_keywords_hash?
+# wrong constant name try_convert
+# Bad color or uninitialized constant BASIC_COLORS
+# Bad color or uninitialized constant BLACK
+# Bad color or uninitialized constant BLACK_STYLE
+# Bad color or uninitialized constant BLINK
+# Bad color or uninitialized constant BLINK_STYLE
+# Bad color or uninitialized constant BLUE
+# Bad color or uninitialized constant BLUE_STYLE
+# Bad color or uninitialized constant BOLD
+# Bad color or uninitialized constant BOLD_STYLE
+# Bad color or uninitialized constant BRIGHT_BLACK
+# Bad color or uninitialized constant BRIGHT_BLACK_STYLE
+# Bad color or uninitialized constant BRIGHT_BLUE
+# Bad color or uninitialized constant BRIGHT_BLUE_STYLE
+# Bad color or uninitialized constant BRIGHT_CYAN
+# Bad color or uninitialized constant BRIGHT_CYAN_STYLE
+# Bad color or uninitialized constant BRIGHT_GRAY
+# Bad color or uninitialized constant BRIGHT_GRAY_STYLE
+# Bad color or uninitialized constant BRIGHT_GREEN
+# Bad color or uninitialized constant BRIGHT_GREEN_STYLE
+# Bad color or uninitialized constant BRIGHT_GREY
+# Bad color or uninitialized constant BRIGHT_GREY_STYLE
+# Bad color or uninitialized constant BRIGHT_MAGENTA
+# Bad color or uninitialized constant BRIGHT_MAGENTA_STYLE
+# Bad color or uninitialized constant BRIGHT_NONE
+# Bad color or uninitialized constant BRIGHT_NONE_STYLE
+# Bad color or uninitialized constant BRIGHT_RED
+# Bad color or uninitialized constant BRIGHT_RED_STYLE
+# Bad color or uninitialized constant BRIGHT_WHITE
+# Bad color or uninitialized constant BRIGHT_WHITE_STYLE
+# Bad color or uninitialized constant BRIGHT_YELLOW
+# Bad color or uninitialized constant BRIGHT_YELLOW_STYLE
+# Bad color or uninitialized constant CLEAR
+# Bad color or uninitialized constant CLEAR_STYLE
+# Bad color or uninitialized constant COLORS
+# Bad color or uninitialized constant COLOR_LIST
+# Bad color or uninitialized constant CONCEALED
+# Bad color or uninitialized constant CONCEALED_STYLE
+# Bad color or uninitialized constant CYAN
+# Bad color or uninitialized constant CYAN_STYLE
+# Bad color or uninitialized constant DARK
+# Bad color or uninitialized constant DARK_STYLE
+# Bad color or uninitialized constant ERASE_CHAR
+# Bad color or uninitialized constant ERASE_CHAR_STYLE
+# Bad color or uninitialized constant ERASE_LINE
+# Bad color or uninitialized constant ERASE_LINE_STYLE
+# Bad color or uninitialized constant GRAY
+# Bad color or uninitialized constant GRAY_STYLE
+# Bad color or uninitialized constant GREEN
+# Bad color or uninitialized constant GREEN_STYLE
+# Bad color or uninitialized constant GREY
+# Bad color or uninitialized constant GREY_STYLE
+# Bad color or uninitialized constant LIGHT_BLACK
+# Bad color or uninitialized constant LIGHT_BLACK_STYLE
+# Bad color or uninitialized constant LIGHT_BLUE
+# Bad color or uninitialized constant LIGHT_BLUE_STYLE
+# Bad color or uninitialized constant LIGHT_CYAN
+# Bad color or uninitialized constant LIGHT_CYAN_STYLE
+# Bad color or uninitialized constant LIGHT_GRAY
+# Bad color or uninitialized constant LIGHT_GRAY_STYLE
+# Bad color or uninitialized constant LIGHT_GREEN
+# Bad color or uninitialized constant LIGHT_GREEN_STYLE
+# Bad color or uninitialized constant LIGHT_GREY
+# Bad color or uninitialized constant LIGHT_GREY_STYLE
+# Bad color or uninitialized constant LIGHT_MAGENTA
+# Bad color or uninitialized constant LIGHT_MAGENTA_STYLE
+# Bad color or uninitialized constant LIGHT_NONE
+# Bad color or uninitialized constant LIGHT_NONE_STYLE
+# Bad color or uninitialized constant LIGHT_RED
+# Bad color or uninitialized constant LIGHT_RED_STYLE
+# Bad color or uninitialized constant LIGHT_WHITE
+# Bad color or uninitialized constant LIGHT_WHITE_STYLE
+# Bad color or uninitialized constant LIGHT_YELLOW
+# Bad color or uninitialized constant LIGHT_YELLOW_STYLE
+# Bad color or uninitialized constant MAGENTA
+# Bad color or uninitialized constant MAGENTA_STYLE
+# Bad color or uninitialized constant NONE
+# Bad color or uninitialized constant NONE_STYLE
+# Bad color or uninitialized constant ON_BLACK
+# Bad color or uninitialized constant ON_BLACK_STYLE
+# Bad color or uninitialized constant ON_BLUE
+# Bad color or uninitialized constant ON_BLUE_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_BLACK
+# Bad color or uninitialized constant ON_BRIGHT_BLACK_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_BLUE
+# Bad color or uninitialized constant ON_BRIGHT_BLUE_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_CYAN
+# Bad color or uninitialized constant ON_BRIGHT_CYAN_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_GRAY
+# Bad color or uninitialized constant ON_BRIGHT_GRAY_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_GREEN
+# Bad color or uninitialized constant ON_BRIGHT_GREEN_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_GREY
+# Bad color or uninitialized constant ON_BRIGHT_GREY_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_MAGENTA
+# Bad color or uninitialized constant ON_BRIGHT_MAGENTA_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_NONE
+# Bad color or uninitialized constant ON_BRIGHT_NONE_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_RED
+# Bad color or uninitialized constant ON_BRIGHT_RED_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_WHITE
+# Bad color or uninitialized constant ON_BRIGHT_WHITE_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_YELLOW
+# Bad color or uninitialized constant ON_BRIGHT_YELLOW_STYLE
+# Bad color or uninitialized constant ON_CYAN
+# Bad color or uninitialized constant ON_CYAN_STYLE
+# Bad color or uninitialized constant ON_GRAY
+# Bad color or uninitialized constant ON_GRAY_STYLE
+# Bad color or uninitialized constant ON_GREEN
+# Bad color or uninitialized constant ON_GREEN_STYLE
+# Bad color or uninitialized constant ON_GREY
+# Bad color or uninitialized constant ON_GREY_STYLE
+# Bad color or uninitialized constant ON_LIGHT_BLACK
+# Bad color or uninitialized constant ON_LIGHT_BLACK_STYLE
+# Bad color or uninitialized constant ON_LIGHT_BLUE
+# Bad color or uninitialized constant ON_LIGHT_BLUE_STYLE
+# Bad color or uninitialized constant ON_LIGHT_CYAN
+# Bad color or uninitialized constant ON_LIGHT_CYAN_STYLE
+# Bad color or uninitialized constant ON_LIGHT_GRAY
+# Bad color or uninitialized constant ON_LIGHT_GRAY_STYLE
+# Bad color or uninitialized constant ON_LIGHT_GREEN
+# Bad color or uninitialized constant ON_LIGHT_GREEN_STYLE
+# Bad color or uninitialized constant ON_LIGHT_GREY
+# Bad color or uninitialized constant ON_LIGHT_GREY_STYLE
+# Bad color or uninitialized constant ON_LIGHT_MAGENTA
+# Bad color or uninitialized constant ON_LIGHT_MAGENTA_STYLE
+# Bad color or uninitialized constant ON_LIGHT_NONE
+# Bad color or uninitialized constant ON_LIGHT_NONE_STYLE
+# Bad color or uninitialized constant ON_LIGHT_RED
+# Bad color or uninitialized constant ON_LIGHT_RED_STYLE
+# Bad color or uninitialized constant ON_LIGHT_WHITE
+# Bad color or uninitialized constant ON_LIGHT_WHITE_STYLE
+# Bad color or uninitialized constant ON_LIGHT_YELLOW
+# Bad color or uninitialized constant ON_LIGHT_YELLOW_STYLE
+# Bad color or uninitialized constant ON_MAGENTA
+# Bad color or uninitialized constant ON_MAGENTA_STYLE
+# Bad color or uninitialized constant ON_NONE
+# Bad color or uninitialized constant ON_NONE_STYLE
+# Bad color or uninitialized constant ON_RED
+# Bad color or uninitialized constant ON_RED_STYLE
+# Bad color or uninitialized constant ON_WHITE
+# Bad color or uninitialized constant ON_WHITE_STYLE
+# Bad color or uninitialized constant ON_YELLOW
+# Bad color or uninitialized constant ON_YELLOW_STYLE
+# Bad color or uninitialized constant RED
+# Bad color or uninitialized constant RED_STYLE
+# Bad color or uninitialized constant RESET
+# Bad color or uninitialized constant RESET_STYLE
+# Bad color or uninitialized constant REVERSE
+# Bad color or uninitialized constant REVERSE_STYLE
+# Bad color or uninitialized constant STYLES
+# Bad color or uninitialized constant STYLE_LIST
+# Bad color or uninitialized constant UNDERLINE
+# Bad color or uninitialized constant UNDERLINE_STYLE
+# Bad color or uninitialized constant UNDERSCORE
+# Bad color or uninitialized constant UNDERSCORE_STYLE
+# Bad color or uninitialized constant WHITE
+# Bad color or uninitialized constant WHITE_STYLE
+# Bad color or uninitialized constant YELLOW
+# Bad color or uninitialized constant YELLOW_STYLE
+# wrong constant name <Class:ConsoleMode>
+# wrong constant name beep
+# wrong constant name check_winsize_changed
+# wrong constant name clear_screen
+# wrong constant name console_mode
+# wrong constant name console_mode=
+# wrong constant name cooked
+# wrong constant name cooked!
+# wrong constant name cursor
+# wrong constant name cursor=
+# wrong constant name cursor_down
+# wrong constant name cursor_left
+# wrong constant name cursor_right
+# wrong constant name cursor_up
+# wrong constant name echo=
+# wrong constant name echo?
+# wrong constant name erase_line
+# wrong constant name erase_screen
+# wrong constant name getch
+# wrong constant name getpass
+# wrong constant name goto
+# wrong constant name goto_column
+# wrong constant name iflush
+# wrong constant name ioflush
+# wrong constant name noecho
+# wrong constant name nonblock
+# wrong constant name nonblock=
+# wrong constant name nonblock?
+# wrong constant name nread
+# wrong constant name oflush
+# wrong constant name pathconf
+# wrong constant name pressed?
+# wrong constant name raw
+# wrong constant name raw!
+# wrong constant name ready?
+# wrong constant name scroll_backward
+# wrong constant name scroll_forward
+# wrong constant name set_encoding_by_bom
+# wrong constant name wait
+# wrong constant name wait_readable
+# wrong constant name wait_writable
+# wrong constant name winsize
+# wrong constant name winsize=
+# wrong constant name echo=
+# wrong constant name raw
+# wrong constant name raw!
+# wrong constant name <static-init>
+# wrong constant name console
+# wrong constant name console_size
+# wrong constant name default_console_size
+# wrong constant name ==
+# wrong constant name initialize
+# uninitialized constant IRB
+# Did you mean? DRb
+# ERB
+# uninitialized constant IRB
+# Did you mean? DRb
+# ERB
+# wrong constant name to_bn
+# wrong constant name from_state
+# wrong constant name initialize
+# uninitialized constant Jacobian
+# uninitialized constant Jacobian
+# uninitialized constant Kconv
+# uninitialized constant Kconv
+# wrong constant name itself
+# wrong constant name object_id
+# wrong constant name pretty_inspect
+# wrong constant name then
+# wrong constant name yield_self
+# wrong constant name at_exit
+# uninitialized constant LUSolve
+# uninitialized constant LUSolve
+# uninitialized constant Logger
+# uninitialized constant Logger
+# uninitialized constant Matrix
+# uninitialized constant Matrix
+# uninitialized constant MessagePack
+# uninitialized constant MessagePack
+# wrong constant name enter
+# wrong constant name exit
+# wrong constant name mon_check_owner
+# wrong constant name mon_enter
+# wrong constant name mon_exit
+# wrong constant name mon_locked?
+# wrong constant name mon_owned?
+# wrong constant name mon_synchronize
+# wrong constant name mon_try_enter
+# wrong constant name new_cond
+# wrong constant name synchronize
+# wrong constant name try_enter
+# wrong constant name try_mon_enter
+# wrong constant name wait_for_cond
+# wrong constant name initialize
+# wrong constant name initialize
+# uninitialized constant MonitorMixin::ConditionVariable::Timeout
+# uninitialized constant MonitorMixin::ConditionVariable::Timeout
+# uninitialized constant Mutex_m
+# uninitialized constant Mutex_m
+# uninitialized constant NKF
+# uninitialized constant NKF
+# uninitialized constant Net::DNS
+# uninitialized constant Net::DNS
+# uninitialized constant Net::FTP
+# uninitialized constant Net::FTP
+# uninitialized constant Net::FTPConnectionError
+# uninitialized constant Net::FTPConnectionError
+# uninitialized constant Net::FTPError
+# Did you mean? Net::HTTPError
+# uninitialized constant Net::FTPError
+# Did you mean? Net::HTTPError
+# uninitialized constant Net::FTPPermError
+# Did you mean? FiberError
+# uninitialized constant Net::FTPPermError
+# Did you mean? FiberError
+# uninitialized constant Net::FTPProtoError
+# uninitialized constant Net::FTPProtoError
+# uninitialized constant Net::FTPReplyError
+# uninitialized constant Net::FTPReplyError
+# uninitialized constant Net::FTPTempError
+# Did you mean? TypeError
+# uninitialized constant Net::FTPTempError
+# Did you mean? TypeError
+# uninitialized constant Net::HTTP::DigestAuth
+# uninitialized constant Net::HTTP::DigestAuth
+# uninitialized constant Net::IMAP
+# uninitialized constant Net::IMAP
+# uninitialized constant Net::NTLM
+# uninitialized constant Net::NTLM
+# uninitialized constant Net::SMTP
+# uninitialized constant Net::SMTP
+# uninitialized constant Net::SMTPAuthenticationError
+# uninitialized constant Net::SMTPAuthenticationError
+# uninitialized constant Net::SMTPError
+# Did you mean? Net::HTTPError
+# uninitialized constant Net::SMTPError
+# Did you mean? Net::HTTPError
+# uninitialized constant Net::SMTPFatalError
+# Did you mean? Net::ProtoFatalError
+# Net::HTTPFatalError
+# uninitialized constant Net::SMTPFatalError
+# Did you mean? Net::ProtoFatalError
+# Net::HTTPFatalError
+# uninitialized constant Net::SMTPServerBusy
+# uninitialized constant Net::SMTPServerBusy
+# uninitialized constant Net::SMTPSyntaxError
+# Did you mean? Net::ProtoSyntaxError
+# uninitialized constant Net::SMTPSyntaxError
+# Did you mean? Net::ProtoSyntaxError
+# uninitialized constant Net::SMTPUnknownError
+# uninitialized constant Net::SMTPUnknownError
+# uninitialized constant Net::SMTPUnsupportedCommand
+# uninitialized constant Net::SMTPUnsupportedCommand
+# uninitialized constant Newton
+# uninitialized constant Newton
+# wrong constant name <static-init>
+# uninitialized constant RUBYGEMS_ACTIVATION_MONITOR
+# wrong constant name to_yaml
+# wrong constant name yaml_tag
+# wrong constant name <Class:Object>
+# uninitialized constant Observable
+# uninitialized constant Observable
+# wrong constant name indefinite_length
+# wrong constant name indefinite_length=
+# wrong constant name +@
+# wrong constant name -@
+# wrong constant name /
+# wrong constant name negative?
+# uninitialized constant OpenSSL::Digest::DSS
+# uninitialized constant OpenSSL::Digest::DSS
+# uninitialized constant OpenSSL::Digest::DSS1
+# uninitialized constant OpenSSL::Digest::DSS1
+# uninitialized constant OpenSSL::Digest::SHA
+# Did you mean? OpenSSL::Digest::SHA1
+# uninitialized constant OpenSSL::Digest::SHA
+# Did you mean? OpenSSL::Digest::SHA1
+# wrong constant name <Class:KDFError>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name hkdf
+# wrong constant name pbkdf2_hmac
+# wrong constant name scrypt
+# wrong constant name signed?
+# uninitialized constant OpenSSL::PKCS5::PKCS5Error
+# uninitialized constant OpenSSL::PKCS5::PKCS5Error
+# wrong constant name to_octet_string
+# wrong constant name alpn_protocols
+# wrong constant name alpn_protocols=
+# wrong constant name alpn_select_cb
+# wrong constant name alpn_select_cb=
+# wrong constant name enable_fallback_scsv
+# wrong constant name max_version=
+# wrong constant name min_version=
+# uninitialized constant OpenSSL::SSL::SSLSocket::BLOCK_SIZE
+# wrong constant name alpn_protocol
+# wrong constant name tmp_key
+# wrong constant name ==
+# wrong constant name ==
+# wrong constant name ==
+# wrong constant name to_utf8
+# wrong constant name ==
+# wrong constant name ==
+# wrong constant name to_der
+# wrong constant name fips_mode
+# uninitialized constant OpenURI
+# Did you mean? Open3
+# uninitialized constant OpenURI
+# Did you mean? Open3
+# wrong constant name additional_message
+# wrong constant name get_candidates
+# wrong constant name additional
+# wrong constant name additional=
+# uninitialized constant Opus
+# uninitialized constant Opus
+# wrong constant name multiply_with_an_object!
+# uninitialized constant PStore
+# uninitialized constant PStore
+# uninitialized constant PTY
+# Did you mean? Pry
+# uninitialized constant PTY
+# Did you mean? Pry
+# uninitialized constant PackageSpec
+# uninitialized constant PackageSpec
+# wrong constant name <Class:PackageSpec>
+# wrong constant name initialize
+# wrong constant name value
+# wrong constant name flat_map
+# wrong constant name <Class:ConflictResolver>
+# wrong constant name <Class:Conversion>
+# wrong constant name <Class:Debugging>
+# wrong constant name <Class:DetachedRbiGenerator>
+# wrong constant name <Class:DetachedRbsGenerator>
+# wrong constant name <Class:Generator>
+# wrong constant name <Class:Options>
+# wrong constant name <Class:ParseError>
+# wrong constant name <Class:Plugin>
+# wrong constant name <Class:RbiGenerator>
+# wrong constant name <Class:RbsGenerator>
+# wrong constant name <Class:TypeLoader>
+# wrong constant name <Class:TypeParser>
+# wrong constant name <Class:TypedObject>
+# wrong constant name <Class:Types>
+# wrong constant name resolve_conflicts
+# wrong constant name <static-init>
+# wrong constant name <Class:Converter>
+# wrong constant name <Class:RbiToRbs>
+# wrong constant name add_warning
+# wrong constant name warnings
+# wrong constant name <static-init>
+# wrong constant name convert_all
+# wrong constant name convert_object
+# wrong constant name initialize
+# wrong constant name rbs_gen
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <Class:Tree>
+# wrong constant name <static-init>
+# wrong constant name begin
+# wrong constant name end
+# wrong constant name here
+# wrong constant name line_prefix
+# wrong constant name text_prefix
+# wrong constant name <static-init>
+# wrong constant name debug_mode=
+# wrong constant name debug_mode?
+# wrong constant name debug_puts
+# wrong constant name name_for_debug_caller
+# wrong constant name detached!
+# wrong constant name <static-init>
+# wrong constant name detached!
+# wrong constant name <static-init>
+# wrong constant name current_plugin
+# wrong constant name current_plugin=
+# wrong constant name initialize
+# wrong constant name options
+# wrong constant name <static-init>
+# wrong constant name break_params
+# wrong constant name indented
+# wrong constant name initialize
+# wrong constant name sort_namespaces
+# wrong constant name tab_size
+# wrong constant name <static-init>
+# wrong constant name buffer
+# wrong constant name initialize
+# wrong constant name range
+# wrong constant name <static-init>
+# wrong constant name generate
+# wrong constant name initialize
+# wrong constant name strictness
+# wrong constant name strictness=
+# wrong constant name <static-init>
+# wrong constant name inherited
+# wrong constant name registered_plugins
+# wrong constant name run_plugins
+# wrong constant name <Class:Arbitrary>
+# wrong constant name <Class:Attribute>
+# wrong constant name <Class:ClassNamespace>
+# wrong constant name <Class:Constant>
+# wrong constant name <Class:EnumClassNamespace>
+# wrong constant name <Class:Extend>
+# wrong constant name <Class:Include>
+# wrong constant name <Class:Method>
+# wrong constant name <Class:ModuleNamespace>
+# wrong constant name <Class:Namespace>
+# wrong constant name <Class:Parameter>
+# wrong constant name <Class:RbiObject>
+# wrong constant name <Class:StructClassNamespace>
+# wrong constant name <Class:StructProp>
+# wrong constant name <Class:TypeAlias>
+# wrong constant name initialize
+# wrong constant name rbi
+# wrong constant name root
+# wrong constant name ==
+# wrong constant name code
+# wrong constant name code=
+# wrong constant name <static-init>
+# wrong constant name class_attribute
+# wrong constant name kind
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name abstract
+# wrong constant name superclass
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name eigen_constant
+# wrong constant name value
+# wrong constant name <static-init>
+# wrong constant name enums
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name abstract
+# wrong constant name class_method
+# wrong constant name final
+# wrong constant name implementation
+# wrong constant name overridable
+# wrong constant name override
+# wrong constant name parameters
+# wrong constant name return_type
+# wrong constant name type_parameters
+# wrong constant name <static-init>
+# wrong constant name abstract
+# wrong constant name interface
+# wrong constant name <static-init>
+# wrong constant name add_comment_to_next_child
+# wrong constant name aliases
+# wrong constant name children
+# wrong constant name constants
+# wrong constant name create_arbitrary
+# wrong constant name create_attr
+# wrong constant name create_attr_accessor
+# wrong constant name create_attr_reader
+# wrong constant name create_attr_writer
+# wrong constant name create_attribute
+# wrong constant name create_class
+# wrong constant name create_constant
+# wrong constant name create_enum_class
+# wrong constant name create_extend
+# wrong constant name create_extends
+# wrong constant name create_include
+# wrong constant name create_includes
+# wrong constant name create_method
+# wrong constant name create_module
+# wrong constant name create_struct_class
+# wrong constant name create_type_alias
+# wrong constant name extends
+# wrong constant name final
+# wrong constant name includes
+# wrong constant name path
+# wrong constant name sealed
+# wrong constant name type_aliases
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name default
+# wrong constant name generalize_from_rbi!
+# wrong constant name initialize
+# wrong constant name kind
+# wrong constant name name
+# wrong constant name name_without_kind
+# wrong constant name to_def_param
+# wrong constant name to_sig_param
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name generalize_from_rbi!
+# wrong constant name generate_rbi
+# wrong constant name generator
+# wrong constant name merge_into_self
+# wrong constant name mergeable?
+# wrong constant name <static-init>
+# wrong constant name props
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name array
+# wrong constant name default
+# wrong constant name dont_store
+# wrong constant name enum
+# wrong constant name factory
+# wrong constant name foreign
+# wrong constant name generalize_from_rbi!
+# wrong constant name immutable
+# wrong constant name initialize
+# wrong constant name name
+# wrong constant name optional
+# wrong constant name override
+# wrong constant name redaction
+# wrong constant name to_prop_call
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <Class:Arbitrary>
+# wrong constant name <Class:Attribute>
+# wrong constant name <Class:Block>
+# wrong constant name <Class:ClassNamespace>
+# wrong constant name <Class:Constant>
+# wrong constant name <Class:Extend>
+# wrong constant name <Class:Include>
+# wrong constant name <Class:InterfaceNamespace>
+# wrong constant name <Class:Method>
+# wrong constant name <Class:MethodSignature>
+# wrong constant name <Class:ModuleNamespace>
+# wrong constant name <Class:Namespace>
+# wrong constant name <Class:Parameter>
+# wrong constant name <Class:RbsObject>
+# wrong constant name <Class:TypeAlias>
+# wrong constant name initialize
+# wrong constant name rbs
+# wrong constant name root
+# wrong constant name ==
+# wrong constant name code
+# wrong constant name code=
+# wrong constant name <static-init>
+# wrong constant name kind
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name generate_rbs
+# wrong constant name initialize
+# wrong constant name required
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name superclass
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name class_method
+# wrong constant name signatures
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name block
+# wrong constant name generate_rbs
+# wrong constant name initialize
+# wrong constant name parameters
+# wrong constant name return_type
+# wrong constant name type_parameters
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name add_comment_to_next_child
+# wrong constant name aliases
+# wrong constant name children
+# wrong constant name constants
+# wrong constant name create_arbitrary
+# wrong constant name create_attr
+# wrong constant name create_attr_accessor
+# wrong constant name create_attr_reader
+# wrong constant name create_attr_writer
+# wrong constant name create_attribute
+# wrong constant name create_class
+# wrong constant name create_constant
+# wrong constant name create_extend
+# wrong constant name create_extends
+# wrong constant name create_include
+# wrong constant name create_includes
+# wrong constant name create_interface
+# wrong constant name create_method
+# wrong constant name create_module
+# wrong constant name create_type_alias
+# wrong constant name extends
+# wrong constant name includes
+# wrong constant name path
+# wrong constant name type_aliases
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name initialize
+# wrong constant name kind
+# wrong constant name name
+# wrong constant name name_without_kind
+# wrong constant name required
+# wrong constant name to_rbs_param
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name generate_rbs
+# wrong constant name generator
+# wrong constant name merge_into_self
+# wrong constant name mergeable?
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name load_file
+# wrong constant name load_project
+# wrong constant name load_source
+# wrong constant name <Class:IntermediateSig>
+# wrong constant name <Class:NodePath>
+# wrong constant name ast
+# wrong constant name ast=
+# wrong constant name body_has_modifier?
+# wrong constant name body_includes_and_extends
+# wrong constant name constant_names
+# wrong constant name generator
+# wrong constant name generator=
+# wrong constant name initialize
+# wrong constant name node_to_s
+# wrong constant name parse_all
+# wrong constant name parse_err
+# wrong constant name parse_method_into_methods
+# wrong constant name parse_node_to_type
+# wrong constant name parse_path_to_object
+# wrong constant name parse_sig_into_methods
+# wrong constant name parse_sig_into_sig
+# wrong constant name previous_sibling_sig_node?
+# wrong constant name sig_node?
+# wrong constant name unknown_node_errors
+# wrong constant name warning
+# wrong constant name zip_by
+# wrong constant name abstract
+# wrong constant name abstract=
+# wrong constant name final
+# wrong constant name final=
+# wrong constant name initialize
+# wrong constant name overridable
+# wrong constant name overridable=
+# wrong constant name override
+# wrong constant name override=
+# wrong constant name params
+# wrong constant name params=
+# wrong constant name return_type
+# wrong constant name return_type=
+# wrong constant name type_parameters
+# wrong constant name type_parameters=
+# wrong constant name <static-init>
+# wrong constant name inherited
+# wrong constant name child
+# wrong constant name indices
+# wrong constant name initialize
+# wrong constant name parent
+# wrong constant name sibling
+# wrong constant name traverse
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name from_source
+# wrong constant name parse_single_type
+# wrong constant name add_comment
+# wrong constant name add_comments
+# wrong constant name comments
+# wrong constant name describe
+# wrong constant name generate_comments
+# wrong constant name generated_by
+# wrong constant name initialize
+# wrong constant name name
+# wrong constant name <static-init>
+# wrong constant name <Class:Array>
+# wrong constant name <Class:Boolean>
+# wrong constant name <Class:Class>
+# wrong constant name <Class:Enumerable>
+# wrong constant name <Class:Enumerator>
+# wrong constant name <Class:Generic>
+# wrong constant name <Class:Hash>
+# wrong constant name <Class:Intersection>
+# wrong constant name <Class:Nilable>
+# wrong constant name <Class:Proc>
+# wrong constant name <Class:Range>
+# wrong constant name <Class:Raw>
+# wrong constant name <Class:Record>
+# wrong constant name <Class:Self>
+# wrong constant name <Class:Set>
+# wrong constant name <Class:SingleElementCollection>
+# wrong constant name <Class:Tuple>
+# wrong constant name <Class:Type>
+# wrong constant name <Class:Union>
+# wrong constant name <Class:Untyped>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name type_params
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name key
+# wrong constant name value
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name types
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <Class:Parameter>
+# wrong constant name parameters
+# wrong constant name return_type
+# wrong constant name ==
+# wrong constant name default
+# wrong constant name initialize
+# wrong constant name name
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name str
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name keys_to_types
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name collection_name
+# wrong constant name element
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name types
+# wrong constant name <static-init>
+# wrong constant name describe
+# wrong constant name generate_rbi
+# wrong constant name generate_rbs
+# wrong constant name initialize
+# wrong constant name to_type
+# wrong constant name <static-init>
+# wrong constant name to_type
+# wrong constant name ==
+# wrong constant name types
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name pair_label
+# wrong constant name in_argdef
+# wrong constant name in_argdef=
+# wrong constant name in_block
+# wrong constant name in_block=
+# wrong constant name in_class
+# wrong constant name in_class=
+# wrong constant name in_def
+# wrong constant name in_def=
+# wrong constant name in_defined
+# wrong constant name in_defined=
+# wrong constant name in_kwarg
+# wrong constant name in_kwarg=
+# wrong constant name in_lambda
+# wrong constant name in_lambda=
+# uninitialized constant Parser::Ruby24::Racc_Main_Parsing_Routine
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Core_Id_C
+# Did you mean? Parser::Ruby24::Racc_Runtime_Core_Version_C
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Core_Revision
+# Did you mean? Parser::Ruby24::Racc_Runtime_Core_Revision_C
+# Parser::Ruby24::Racc_Runtime_Core_Revision_R
+# Parser::Ruby24::Racc_Runtime_Revision
+# Parser::Ruby24::Racc_Runtime_Core_Version
+# Parser::Ruby24::Racc_Runtime_Core_Version_C
+# Parser::Ruby24::Racc_Runtime_Core_Version_R
+# Parser::Ruby24::Racc_Runtime_Version
+# Parser::Ruby24::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Core_Revision_C
+# Did you mean? Parser::Ruby24::Racc_Runtime_Core_Revision_R
+# Parser::Ruby24::Racc_Runtime_Revision
+# Parser::Ruby24::Racc_Runtime_Core_Version_C
+# Parser::Ruby24::Racc_Runtime_Core_Version_R
+# Parser::Ruby24::Racc_Runtime_Core_Version
+# Parser::Ruby24::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Core_Revision_R
+# Did you mean? Parser::Ruby24::Racc_Runtime_Core_Revision_C
+# Parser::Ruby24::Racc_Runtime_Revision
+# Parser::Ruby24::Racc_Runtime_Core_Version_C
+# Parser::Ruby24::Racc_Runtime_Core_Version_R
+# Parser::Ruby24::Racc_Runtime_Core_Version
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Core_Version
+# Did you mean? Parser::Ruby24::Racc_Runtime_Revision
+# Parser::Ruby24::Racc_Runtime_Core_Revision
+# Parser::Ruby24::Racc_Runtime_Core_Version_C
+# Parser::Ruby24::Racc_Runtime_Core_Version_R
+# Parser::Ruby24::Racc_Runtime_Core_Revision_C
+# Parser::Ruby24::Racc_Runtime_Core_Revision_R
+# Parser::Ruby24::Racc_Runtime_Version
+# Parser::Ruby24::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Core_Version_C
+# Did you mean? Parser::Ruby24::Racc_Runtime_Core_Version_R
+# Parser::Ruby24::Racc_Runtime_Core_Revision_C
+# Parser::Ruby24::Racc_Runtime_Core_Revision_R
+# Parser::Ruby24::Racc_Runtime_Revision
+# Parser::Ruby24::Racc_Runtime_Core_Revision
+# Parser::Ruby24::Racc_Runtime_Version
+# Parser::Ruby24::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Core_Version_R
+# Did you mean? Parser::Ruby24::Racc_Runtime_Core_Version_C
+# Parser::Ruby24::Racc_Runtime_Core_Revision_C
+# Parser::Ruby24::Racc_Runtime_Core_Revision_R
+# Parser::Ruby24::Racc_Runtime_Revision
+# Parser::Ruby24::Racc_Runtime_Core_Revision
+# Parser::Ruby24::Racc_Runtime_Version
+# Parser::Ruby24::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Revision
+# Did you mean? Parser::Ruby24::Racc_Runtime_Version
+# Parser::Ruby24::Racc_Runtime_Core_Version
+# Parser::Ruby24::Racc_Runtime_Core_Revision
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Type
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Version
+# Did you mean? Parser::Ruby24::Racc_Runtime_Revision
+# Parser::Ruby24::Racc_Runtime_Core_Version
+# uninitialized constant Parser::Ruby24::Racc_YY_Parse_Method
+# wrong constant name _reduce_335
+# wrong constant name _reduce_336
+# wrong constant name _reduce_339
+# wrong constant name _reduce_345
+# wrong constant name _reduce_350
+# wrong constant name _reduce_370
+# wrong constant name _reduce_379
+# wrong constant name _reduce_390
+# wrong constant name _reduce_426
+# wrong constant name _reduce_430
+# wrong constant name _reduce_431
+# wrong constant name _reduce_436
+# wrong constant name _reduce_474
+# wrong constant name _reduce_532
+# wrong constant name _reduce_548
+# wrong constant name _reduce_549
+# wrong constant name _reduce_558
+# wrong constant name _reduce_559
+# wrong constant name _reduce_562
+# wrong constant name _reduce_563
+# wrong constant name _reduce_567
+# wrong constant name _reduce_570
+# wrong constant name _reduce_577
+# wrong constant name _reduce_578
+# wrong constant name _reduce_591
+# wrong constant name _reduce_592
+# wrong constant name _reduce_597
+# wrong constant name _reduce_598
+# wrong constant name _reduce_602
+# wrong constant name _reduce_606
+# wrong constant name local_pop
+# wrong constant name local_push
+# uninitialized constant Parser::Ruby27::Racc_Main_Parsing_Routine
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Core_Id_C
+# Did you mean? Parser::Ruby27::Racc_Runtime_Core_Version_C
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Core_Revision
+# Did you mean? Parser::Ruby27::Racc_Runtime_Core_Revision_C
+# Parser::Ruby27::Racc_Runtime_Core_Revision_R
+# Parser::Ruby27::Racc_Runtime_Revision
+# Parser::Ruby27::Racc_Runtime_Core_Version
+# Parser::Ruby27::Racc_Runtime_Core_Version_C
+# Parser::Ruby27::Racc_Runtime_Core_Version_R
+# Parser::Ruby27::Racc_Runtime_Version
+# Parser::Ruby27::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Core_Revision_C
+# Did you mean? Parser::Ruby27::Racc_Runtime_Core_Revision_R
+# Parser::Ruby27::Racc_Runtime_Revision
+# Parser::Ruby27::Racc_Runtime_Core_Version_C
+# Parser::Ruby27::Racc_Runtime_Core_Version_R
+# Parser::Ruby27::Racc_Runtime_Core_Version
+# Parser::Ruby27::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Core_Revision_R
+# Did you mean? Parser::Ruby27::Racc_Runtime_Core_Revision_C
+# Parser::Ruby27::Racc_Runtime_Revision
+# Parser::Ruby27::Racc_Runtime_Core_Version_C
+# Parser::Ruby27::Racc_Runtime_Core_Version_R
+# Parser::Ruby27::Racc_Runtime_Core_Version
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Core_Version
+# Did you mean? Parser::Ruby27::Racc_Runtime_Revision
+# Parser::Ruby27::Racc_Runtime_Core_Revision
+# Parser::Ruby27::Racc_Runtime_Core_Version_C
+# Parser::Ruby27::Racc_Runtime_Core_Version_R
+# Parser::Ruby27::Racc_Runtime_Core_Revision_C
+# Parser::Ruby27::Racc_Runtime_Core_Revision_R
+# Parser::Ruby27::Racc_Runtime_Version
+# Parser::Ruby27::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Core_Version_C
+# Did you mean? Parser::Ruby27::Racc_Runtime_Core_Version_R
+# Parser::Ruby27::Racc_Runtime_Core_Revision_C
+# Parser::Ruby27::Racc_Runtime_Core_Revision_R
+# Parser::Ruby27::Racc_Runtime_Revision
+# Parser::Ruby27::Racc_Runtime_Core_Revision
+# Parser::Ruby27::Racc_Runtime_Version
+# Parser::Ruby27::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Core_Version_R
+# Did you mean? Parser::Ruby27::Racc_Runtime_Core_Version_C
+# Parser::Ruby27::Racc_Runtime_Core_Revision_C
+# Parser::Ruby27::Racc_Runtime_Core_Revision_R
+# Parser::Ruby27::Racc_Runtime_Revision
+# Parser::Ruby27::Racc_Runtime_Core_Revision
+# Parser::Ruby27::Racc_Runtime_Version
+# Parser::Ruby27::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Revision
+# Did you mean? Parser::Ruby27::Racc_Runtime_Version
+# Parser::Ruby27::Racc_Runtime_Core_Version
+# Parser::Ruby27::Racc_Runtime_Core_Revision
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Type
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Version
+# Did you mean? Parser::Ruby27::Racc_Runtime_Revision
+# Parser::Ruby27::Racc_Runtime_Core_Version
+# uninitialized constant Parser::Ruby27::Racc_YY_Parse_Method
+# wrong constant name _reduce_345
+# wrong constant name _reduce_346
+# wrong constant name _reduce_350
+# wrong constant name _reduce_354
+# wrong constant name _reduce_360
+# wrong constant name _reduce_379
+# wrong constant name _reduce_388
+# wrong constant name _reduce_398
+# wrong constant name _reduce_434
+# wrong constant name _reduce_439
+# wrong constant name _reduce_443
+# wrong constant name _reduce_448
+# wrong constant name _reduce_450
+# wrong constant name _reduce_452
+# wrong constant name _reduce_477
+# wrong constant name _reduce_486
+# wrong constant name _reduce_502
+# wrong constant name _reduce_507
+# wrong constant name _reduce_508
+# wrong constant name _reduce_509
+# wrong constant name _reduce_513
+# wrong constant name _reduce_514
+# wrong constant name _reduce_531
+# wrong constant name _reduce_532
+# wrong constant name _reduce_536
+# wrong constant name _reduce_538
+# wrong constant name _reduce_574
+# wrong constant name _reduce_575
+# wrong constant name _reduce_576
+# wrong constant name _reduce_638
+# wrong constant name _reduce_654
+# wrong constant name _reduce_655
+# wrong constant name _reduce_665
+# wrong constant name _reduce_666
+# wrong constant name _reduce_670
+# wrong constant name _reduce_674
+# wrong constant name _reduce_684
+# wrong constant name _reduce_685
+# wrong constant name _reduce_686
+# wrong constant name _reduce_699
+# wrong constant name _reduce_700
+# wrong constant name _reduce_705
+# wrong constant name _reduce_706
+# wrong constant name _reduce_707
+# wrong constant name _reduce_711
+# wrong constant name _reduce_715
+# wrong constant name local_pop
+# wrong constant name local_push
+# wrong constant name try_declare_numparam
+# wrong constant name declare_anonymous_blockarg
+# wrong constant name declared_anonymous_blockarg?
+# uninitialized constant Prime
+# uninitialized constant Prime
+# wrong constant name <<
+# wrong constant name >>
+# wrong constant name clone
+# uninitialized constant Proc0
+# uninitialized constant Proc0
+# uninitialized constant Proc1
+# uninitialized constant Proc1
+# uninitialized constant Proc10
+# uninitialized constant Proc10
+# uninitialized constant Proc2
+# uninitialized constant Proc2
+# uninitialized constant Proc3
+# uninitialized constant Proc3
+# uninitialized constant Proc4
+# uninitialized constant Proc4
+# uninitialized constant Proc5
+# uninitialized constant Proc5
+# uninitialized constant Proc6
+# uninitialized constant Proc6
+# uninitialized constant Proc7
+# uninitialized constant Proc7
+# uninitialized constant Proc8
+# uninitialized constant Proc8
+# uninitialized constant Proc9
+# uninitialized constant Proc9
+# uninitialized constant Pry::BasicObject::RUBYGEMS_ACTIVATION_MONITOR
+# uninitialized constant Pry::Command::COLORS
+# uninitialized constant Pry::Command::Ls::COLORS
+# Did you mean? Pry::Command::COLORS
+# uninitialized constant Pry::Command::Ls::VOID_VALUE
+# Did you mean? Pry::Command::VOID_VALUE
+# uninitialized constant Pry::Command::Wtf::COLORS
+# Did you mean? Pry::Command::COLORS
+# uninitialized constant Pry::Command::Wtf::VOID_VALUE
+# Did you mean? Pry::Command::VOID_VALUE
+# uninitialized constant Psych::UnsafeYAML
+# uninitialized constant Psych::UnsafeYAML
+# uninitialized constant Psych::Visitors::RestrictedYAMLTree::DISPATCH
+# wrong constant name visit_Symbol
+# wrong constant name <static-init>
+# wrong constant name dispatch_cache
+# wrong constant name add_builtin_type
+# wrong constant name add_domain_type
+# wrong constant name add_tag
+# wrong constant name domain_types
+# wrong constant name domain_types=
+# wrong constant name dump_tags
+# wrong constant name dump_tags=
+# wrong constant name libyaml_version
+# wrong constant name load_tags
+# wrong constant name load_tags=
+# wrong constant name remove_type
+# wrong constant name safe_dump
+# wrong constant name safe_load_file
+# wrong constant name unsafe_load
+# wrong constant name unsafe_load_file
+# uninitialized constant RDoc::Alias::MARKUP_FORMAT
+# uninitialized constant RDoc::Alias::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# uninitialized constant RDoc::AnyMethod::MARKUP_FORMAT
+# uninitialized constant RDoc::AnyMethod::TO_HTML_CHARACTERS
+# wrong constant name _call_seq
+# wrong constant name section_title
+# wrong constant name section_title=
+# uninitialized constant RDoc::Attr::MARKUP_FORMAT
+# uninitialized constant RDoc::Attr::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# uninitialized constant RDoc::ClassModule::MARKUP_FORMAT
+# uninitialized constant RDoc::ClassModule::TOMDOC_TITLES
+# uninitialized constant RDoc::ClassModule::TOMDOC_TITLES_SORT
+# uninitialized constant RDoc::ClassModule::TO_HTML_CHARACTERS
+# uninitialized constant RDoc::ClassModule::TYPES
+# wrong constant name initialize
+# uninitialized constant RDoc::CodeObject::MARKUP_FORMAT
+# uninitialized constant RDoc::CodeObject::TO_HTML_CHARACTERS
+# wrong constant name initialize_visibility
+# uninitialized constant RDoc::Comment::MARKUP_FORMAT
+# uninitialized constant RDoc::Comment::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# wrong constant name line
+# wrong constant name line=
+# uninitialized constant RDoc::Constant::MARKUP_FORMAT
+# uninitialized constant RDoc::Constant::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# uninitialized constant RDoc::Constant::RDoc
+# Did you mean? RDoc::RDoc
+# uninitialized constant RDoc::Constant::RDoc
+# Did you mean? RDoc::RDoc
+# uninitialized constant RDoc::Context::MARKUP_FORMAT
+# uninitialized constant RDoc::Context::TO_HTML_CHARACTERS
+# wrong constant name add_module_by_normal_module
+# wrong constant name initialize_methods_etc
+# wrong constant name instance_methods
+# uninitialized constant RDoc::Context::Section::MARKUP_FORMAT
+# Did you mean? RDoc::Context::MARKUP_FORMAT
+# uninitialized constant RDoc::Context::Section::TO_HTML_CHARACTERS
+# Did you mean? RDoc::Context::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name resolve_method
+# wrong constant name detect_encoding
+# wrong constant name remove_magic_comment
+# wrong constant name initialize
+# uninitialized constant RDoc::Generator::JsonIndex::MARKUP_FORMAT
+# uninitialized constant RDoc::Generator::JsonIndex::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name _Table
+# wrong constant name _TableColumn
+# wrong constant name _TableItem
+# wrong constant name _TableLine
+# wrong constant name _TableRow
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name <Class:RegexpHandling>
+# wrong constant name <Class:Table>
+# wrong constant name add_regexp_handling
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name add_regexp_handling
+# wrong constant name convert_attrs_matching_word_pairs
+# wrong constant name convert_attrs_word_pair_map
+# wrong constant name convert_regexp_handlings
+# wrong constant name exclusive?
+# wrong constant name exclusive_bitmap
+# wrong constant name regexp_handlings
+# wrong constant name regexp_handling
+# wrong constant name initialize
+# wrong constant name add_regexp_handling_RDOCLINK
+# wrong constant name add_regexp_handling_TIDYLINK
+# wrong constant name convert_regexp_handling
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name []
+# wrong constant name eos?
+# wrong constant name initialize
+# wrong constant name matched
+# wrong constant name newline!
+# wrong constant name pos
+# wrong constant name scan
+# wrong constant name unscan
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name ==
+# wrong constant name initialize
+# wrong constant name text
+# wrong constant name text=
+# wrong constant name type
+# wrong constant name <static-init>
+# uninitialized constant RDoc::Markup::Special
+# uninitialized constant RDoc::Markup::Special
+# wrong constant name ==
+# wrong constant name accept
+# wrong constant name align
+# wrong constant name align=
+# wrong constant name body
+# wrong constant name body=
+# wrong constant name header
+# wrong constant name header=
+# wrong constant name initialize
+# wrong constant name <static-init>
+# uninitialized constant RDoc::Markup::ToHtml::MARKUP_FORMAT
+# uninitialized constant RDoc::Markup::ToHtml::TO_HTML_CHARACTERS
+# wrong constant name accept_table
+# wrong constant name handle_regexp_HARD_BREAK
+# wrong constant name handle_regexp_HYPERLINK
+# wrong constant name handle_regexp_RDOCLINK
+# wrong constant name handle_regexp_TIDYLINK
+# wrong constant name init_link_notation_regexp_handlings
+# wrong constant name init_regexp_handlings
+# uninitialized constant RDoc::Markup::ToHtmlCrossref::LIST_TYPE_TO_HTML
+# uninitialized constant RDoc::Markup::ToHtmlCrossref::MARKUP_FORMAT
+# uninitialized constant RDoc::Markup::ToHtmlCrossref::TO_HTML_CHARACTERS
+# wrong constant name handle_regexp_CROSSREF
+# wrong constant name initialize
+# uninitialized constant RDoc::Markup::ToHtmlSnippet::LIST_TYPE_TO_HTML
+# uninitialized constant RDoc::Markup::ToHtmlSnippet::MARKUP_FORMAT
+# uninitialized constant RDoc::Markup::ToHtmlSnippet::TO_HTML_CHARACTERS
+# wrong constant name handle_regexp_CROSSREF
+# wrong constant name initialize
+# wrong constant name accept_table
+# wrong constant name initialize
+# wrong constant name handle_regexp_CROSSREF
+# wrong constant name handle_regexp_HARD_BREAK
+# wrong constant name handle_regexp_TIDYLINK
+# wrong constant name initialize
+# wrong constant name handle_regexp_RDOCLINK
+# wrong constant name handle_regexp_TIDYLINK
+# wrong constant name accept_table
+# wrong constant name handle_regexp_HARD_BREAK
+# wrong constant name handle_regexp_SUPPRESSED_CROSSREF
+# wrong constant name initialize
+# wrong constant name accept_table
+# wrong constant name initialize
+# wrong constant name initialize
+# uninitialized constant RDoc::MethodAttr::MARKUP_FORMAT
+# uninitialized constant RDoc::MethodAttr::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# uninitialized constant RDoc::Mixin::MARKUP_FORMAT
+# uninitialized constant RDoc::Mixin::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# wrong constant name override
+# wrong constant name load_options
+# wrong constant name <Class:RipperStateLex>
+# wrong constant name initialize
+# uninitialized constant RDoc::Parser::C::MARKUP_FORMAT
+# uninitialized constant RDoc::Parser::C::TO_HTML_CHARACTERS
+# wrong constant name add_alias
+# wrong constant name do_classes_and_modules
+# wrong constant name new_comment
+# wrong constant name <Class:Git>
+# wrong constant name parse_date
+# wrong constant name <Class:LogEntry>
+# wrong constant name create_entries
+# wrong constant name parse_entries
+# wrong constant name parse_info
+# uninitialized constant RDoc::Parser::ChangeLog::Git::LogEntry::Elem
+# wrong constant name accept
+# wrong constant name aref
+# wrong constant name author
+# wrong constant name author=
+# wrong constant name base
+# wrong constant name base=
+# wrong constant name commit
+# wrong constant name commit=
+# wrong constant name contents
+# wrong constant name contents=
+# wrong constant name date
+# wrong constant name date=
+# wrong constant name email
+# wrong constant name email=
+# wrong constant name initialize
+# wrong constant name label
+# wrong constant name level
+# wrong constant name text
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name <static-init>
+# wrong constant name <Class:InnerStateLex>
+# wrong constant name <Class:Token>
+# wrong constant name get_squashed_tk
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name on_default
+# wrong constant name <static-init>
+# uninitialized constant RDoc::Parser::RipperStateLex::Token::Elem
+# wrong constant name char_no
+# wrong constant name char_no=
+# wrong constant name kind
+# wrong constant name kind=
+# wrong constant name line_no
+# wrong constant name line_no=
+# wrong constant name state
+# wrong constant name state=
+# wrong constant name text
+# wrong constant name text=
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name <static-init>
+# wrong constant name end?
+# wrong constant name parse
+# wrong constant name get_included_module_with_optional_parens
+# wrong constant name parse_included_with_activesupport_concern
+# wrong constant name retrieve_comment_body
+# wrong constant name skip_tkspace_without_nl
+# uninitialized constant RDoc::RD::BlockParser::Racc_Main_Parsing_Routine
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Core_Id_C
+# Did you mean? RDoc::RD::BlockParser::Racc_Runtime_Core_Version_C
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Core_Revision
+# Did you mean? RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_C
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_R
+# RDoc::RD::BlockParser::Racc_Runtime_Revision
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Version
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Version_C
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Version_R
+# RDoc::RD::BlockParser::Racc_Runtime_Version
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_C
+# Did you mean? RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_R
+# RDoc::RD::BlockParser::Racc_Runtime_Revision
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Version_C
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Version_R
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Version
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_R
+# Did you mean? RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_C
+# RDoc::RD::BlockParser::Racc_Runtime_Revision
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Version_C
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Version_R
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Version
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Core_Version
+# Did you mean? RDoc::RD::BlockParser::Racc_Runtime_Revision
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Revision
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Version_C
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Version_R
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_C
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_R
+# RDoc::RD::BlockParser::Racc_Runtime_Version
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Core_Version_C
+# Did you mean? RDoc::RD::BlockParser::Racc_Runtime_Core_Version_R
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_C
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_R
+# RDoc::RD::BlockParser::Racc_Runtime_Revision
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Revision
+# RDoc::RD::BlockParser::Racc_Runtime_Version
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Core_Version_R
+# Did you mean? RDoc::RD::BlockParser::Racc_Runtime_Core_Version_C
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_C
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_R
+# RDoc::RD::BlockParser::Racc_Runtime_Revision
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Revision
+# RDoc::RD::BlockParser::Racc_Runtime_Version
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Revision
+# Did you mean? RDoc::RD::BlockParser::Racc_Runtime_Version
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Version
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Revision
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Type
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Version
+# Did you mean? RDoc::RD::BlockParser::Racc_Runtime_Revision
+# RDoc::RD::BlockParser::Racc_Runtime_Core_Version
+# uninitialized constant RDoc::RD::BlockParser::Racc_YY_Parse_Method
+# wrong constant name initialize
+# uninitialized constant RDoc::RD::InlineParser::Racc_Main_Parsing_Routine
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Core_Id_C
+# Did you mean? RDoc::RD::InlineParser::Racc_Runtime_Core_Version_C
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Core_Revision
+# Did you mean? RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_C
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_R
+# RDoc::RD::InlineParser::Racc_Runtime_Revision
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Version
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Version_C
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Version_R
+# RDoc::RD::InlineParser::Racc_Runtime_Version
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_C
+# Did you mean? RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_R
+# RDoc::RD::InlineParser::Racc_Runtime_Revision
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Version_C
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Version_R
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Version
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_R
+# Did you mean? RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_C
+# RDoc::RD::InlineParser::Racc_Runtime_Revision
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Version_C
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Version_R
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Version
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Core_Version
+# Did you mean? RDoc::RD::InlineParser::Racc_Runtime_Revision
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Revision
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Version_C
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Version_R
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_C
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_R
+# RDoc::RD::InlineParser::Racc_Runtime_Version
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Core_Version_C
+# Did you mean? RDoc::RD::InlineParser::Racc_Runtime_Core_Version_R
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_C
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_R
+# RDoc::RD::InlineParser::Racc_Runtime_Revision
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Revision
+# RDoc::RD::InlineParser::Racc_Runtime_Version
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Core_Version_R
+# Did you mean? RDoc::RD::InlineParser::Racc_Runtime_Core_Version_C
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_C
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_R
+# RDoc::RD::InlineParser::Racc_Runtime_Revision
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Revision
+# RDoc::RD::InlineParser::Racc_Runtime_Version
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Revision
+# Did you mean? RDoc::RD::InlineParser::Racc_Runtime_Version
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Version
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Revision
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Type
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Version
+# Did you mean? RDoc::RD::InlineParser::Racc_Runtime_Revision
+# RDoc::RD::InlineParser::Racc_Runtime_Core_Version
+# uninitialized constant RDoc::RD::InlineParser::Racc_YY_Parse_Method
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# uninitialized constant RDoc::Require::MARKUP_FORMAT
+# uninitialized constant RDoc::Require::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# uninitialized constant RDoc::RipperStateLex
+# uninitialized constant RDoc::RipperStateLex
+# wrong constant name initialize
+# uninitialized constant RDoc::Stats::MARKUP_FORMAT
+# uninitialized constant RDoc::Stats::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name unmatched_constant_alias
+# wrong constant name update_parser_of_file
+# wrong constant name initialize
+# uninitialized constant RDoc::Task::DEFAULT
+# uninitialized constant RDoc::Task::LN_SUPPORTED
+# uninitialized constant RDoc::Task::LOW_METHODS
+# Did you mean? RDoc::Task::LowMethods
+# uninitialized constant RDoc::Task::METHODS
+# Did you mean? Method
+# uninitialized constant RDoc::Task::OPT_TABLE
+# uninitialized constant RDoc::Task::RUBY
+# uninitialized constant RDoc::Task::VERSION
+# Did you mean? RDoc::VERSION
+# wrong constant name before_running_rdoc
+# wrong constant name check_names
+# wrong constant name clobber_task_description
+# wrong constant name defaults
+# wrong constant name define
+# wrong constant name external
+# wrong constant name external=
+# wrong constant name generator
+# wrong constant name generator=
+# wrong constant name initialize
+# wrong constant name inline_source
+# wrong constant name inline_source=
+# wrong constant name main
+# wrong constant name main=
+# wrong constant name markup
+# wrong constant name markup=
+# wrong constant name name
+# wrong constant name name=
+# wrong constant name option_list
+# wrong constant name options
+# wrong constant name options=
+# wrong constant name rdoc_dir
+# wrong constant name rdoc_dir=
+# wrong constant name rdoc_files
+# wrong constant name rdoc_files=
+# wrong constant name rdoc_task_description
+# wrong constant name rerdoc_task_description
+# wrong constant name template
+# wrong constant name template=
+# wrong constant name title
+# wrong constant name title=
+# wrong constant name <static-init>
+# wrong constant name language
+# wrong constant name language=
+# uninitialized constant RDoc::TopLevel::MARKUP_FORMAT
+# uninitialized constant RDoc::TopLevel::TOMDOC_TITLES
+# uninitialized constant RDoc::TopLevel::TOMDOC_TITLES_SORT
+# uninitialized constant RDoc::TopLevel::TO_HTML_CHARACTERS
+# uninitialized constant RDoc::TopLevel::TYPES
+# wrong constant name initialize
+# wrong constant name home
+# uninitialized constant REXML
+# uninitialized constant REXML
+# uninitialized constant RSpec::Core::ExampleGroup::BE_PREDICATE_REGEX
+# uninitialized constant RSpec::Core::ExampleGroup::DYNAMIC_MATCHER_REGEX
+# uninitialized constant RSpec::Core::ExampleGroup::HAS_REGEX
+# uninitialized constant RSpec::Core::ExampleGroup::NOT_YET_IMPLEMENTED
+# uninitialized constant RSpec::Core::ExampleGroup::NO_REASON_GIVEN
+# wrong constant name be_close_to
+# uninitialized constant RSpec::Matchers::BuiltIn::BePredicate::UNDEFINED
+# uninitialized constant RSpec::Matchers::BuiltIn::Equal::UNDEFINED
+# uninitialized constant RSpec::Matchers::BuiltIn::Has::UNDEFINED
+# wrong constant name <Class:Differ>
+# wrong constant name color?
+# wrong constant name diff
+# wrong constant name diff_as_object
+# wrong constant name diff_as_string
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name <Class:CparseParams>
+# wrong constant name <static-init>
+# uninitialized constant Ractor
+# uninitialized constant Ractor
+# uninitialized constant Rake::DSL::DEFAULT
+# uninitialized constant Rake::DSL::LN_SUPPORTED
+# uninitialized constant Rake::DSL::LOW_METHODS
+# Did you mean? Rake::DSL::LowMethods
+# uninitialized constant Rake::DSL::METHODS
+# Did you mean? Method
+# uninitialized constant Rake::DSL::OPT_TABLE
+# uninitialized constant Rake::DSL::RUBY
+# uninitialized constant Rake::DSL::VERSION
+# Did you mean? Rake::Version
+# Rake::VERSION
+# uninitialized constant Rake::FileUtilsExt::LN_SUPPORTED
+# uninitialized constant Rake::FileUtilsExt::LOW_METHODS
+# Did you mean? Rake::FileUtilsExt::LowMethods
+# uninitialized constant Rake::FileUtilsExt::METHODS
+# Did you mean? Method
+# uninitialized constant Rake::FileUtilsExt::OPT_TABLE
+# uninitialized constant Rake::FileUtilsExt::RUBY
+# uninitialized constant Rake::FileUtilsExt::VERSION
+# Did you mean? Rake::Version
+# Rake::VERSION
+# uninitialized constant Rake::TaskLib::DEFAULT
+# uninitialized constant Rake::TaskLib::LN_SUPPORTED
+# uninitialized constant Rake::TaskLib::LOW_METHODS
+# Did you mean? Rake::TaskLib::LowMethods
+# uninitialized constant Rake::TaskLib::METHODS
+# Did you mean? Method
+# uninitialized constant Rake::TaskLib::OPT_TABLE
+# uninitialized constant Rake::TaskLib::RUBY
+# uninitialized constant Rake::TaskLib::VERSION
+# Did you mean? Rake::Version
+# Rake::VERSION
+# wrong constant name bytes
+# wrong constant name %
+# wrong constant name entries
+# wrong constant name to_a
+# wrong constant name expand
+# wrong constant name fire_update!
+# wrong constant name ruby
+# uninitialized constant Rinda
+# uninitialized constant Rinda
+# wrong constant name <Class:Lexer>
+# wrong constant name <Class:TokenPattern>
+# wrong constant name column
+# wrong constant name debug_output
+# wrong constant name debug_output=
+# wrong constant name encoding
+# wrong constant name end_seen?
+# wrong constant name error?
+# wrong constant name filename
+# wrong constant name initialize
+# wrong constant name lineno
+# wrong constant name parse
+# wrong constant name state
+# wrong constant name token
+# wrong constant name yydebug
+# wrong constant name yydebug=
+# wrong constant name initialize
+# uninitialized constant Ripper::Lexer::EVENTS
+# Did you mean? Ripper::EVENTS
+# uninitialized constant Ripper::Lexer::EXPR_ARG
+# Did you mean? Ripper::Lexer::EXPR_BEG
+# Ripper::EXPR_ARG
+# Ripper::EXPR_BEG
+# uninitialized constant Ripper::Lexer::EXPR_ARG_ANY
+# Did you mean? Ripper::Lexer::EXPR_END_ANY
+# Ripper::Lexer::EXPR_BEG_ANY
+# Ripper::EXPR_END_ANY
+# Ripper::EXPR_ARG_ANY
+# Ripper::EXPR_BEG_ANY
+# uninitialized constant Ripper::Lexer::EXPR_BEG
+# Did you mean? Ripper::Lexer::EXPR_ARG
+# Ripper::EXPR_ARG
+# Ripper::EXPR_BEG
+# uninitialized constant Ripper::Lexer::EXPR_BEG_ANY
+# Did you mean? Ripper::Lexer::EXPR_END_ANY
+# Ripper::Lexer::EXPR_ARG_ANY
+# Ripper::EXPR_END_ANY
+# Ripper::EXPR_ARG_ANY
+# Ripper::EXPR_BEG_ANY
+# uninitialized constant Ripper::Lexer::EXPR_CLASS
+# Did you mean? Ripper::EXPR_CLASS
+# uninitialized constant Ripper::Lexer::EXPR_CMDARG
+# Did you mean? Ripper::Lexer::EXPR_ARG
+# Ripper::EXPR_ARG
+# Ripper::Lexer::EXPR_ENDARG
+# Ripper::EXPR_CMDARG
+# Ripper::EXPR_ENDARG
+# uninitialized constant Ripper::Lexer::EXPR_DOT
+# Did you mean? Ripper::EXPR_DOT
+# uninitialized constant Ripper::Lexer::EXPR_END
+# Did you mean? Ripper::Lexer::EXPR_MID
+# Ripper::EXPR_MID
+# Ripper::EXPR_END
+# Ripper::Lexer::EXPR_ENDFN
+# Ripper::EXPR_ENDFN
+# uninitialized constant Ripper::Lexer::EXPR_ENDARG
+# Did you mean? Ripper::Lexer::EXPR_ARG
+# Ripper::EXPR_ARG
+# Ripper::EXPR_END
+# Ripper::Lexer::EXPR_ENDFN
+# Ripper::EXPR_ENDFN
+# Ripper::Lexer::EXPR_CMDARG
+# Ripper::EXPR_CMDARG
+# Ripper::EXPR_ENDARG
+# Ripper::Lexer::EXPR_END_ANY
+# Ripper::EXPR_END_ANY
+# uninitialized constant Ripper::Lexer::EXPR_ENDFN
+# Did you mean? Ripper::EXPR_END
+# Ripper::EXPR_ENDFN
+# Ripper::Lexer::EXPR_ENDARG
+# Ripper::EXPR_ENDARG
+# Ripper::Lexer::EXPR_END_ANY
+# Ripper::EXPR_END_ANY
+# uninitialized constant Ripper::Lexer::EXPR_END_ANY
+# Did you mean? Ripper::Lexer::EXPR_ARG_ANY
+# Ripper::Lexer::EXPR_BEG_ANY
+# Ripper::EXPR_END_ANY
+# Ripper::EXPR_ARG_ANY
+# Ripper::EXPR_BEG_ANY
+# Ripper::Lexer::EXPR_ENDFN
+# Ripper::EXPR_ENDFN
+# Ripper::Lexer::EXPR_ENDARG
+# Ripper::EXPR_ENDARG
+# uninitialized constant Ripper::Lexer::EXPR_FITEM
+# Did you mean? Ripper::EXPR_FITEM
+# uninitialized constant Ripper::Lexer::EXPR_FNAME
+# Did you mean? Ripper::Lexer::EXPR_NONE
+# Ripper::EXPR_NONE
+# Ripper::EXPR_FNAME
+# uninitialized constant Ripper::Lexer::EXPR_LABEL
+# Did you mean? Ripper::Lexer::EXPR_BEG
+# Ripper::EXPR_BEG
+# Ripper::EXPR_LABEL
+# Ripper::Lexer::EXPR_LABELED
+# Ripper::EXPR_LABELED
+# uninitialized constant Ripper::Lexer::EXPR_LABELED
+# Did you mean? Ripper::EXPR_LABEL
+# Ripper::EXPR_LABELED
+# uninitialized constant Ripper::Lexer::EXPR_MID
+# Did you mean? Ripper::Lexer::EXPR_END
+# Ripper::EXPR_MID
+# Ripper::EXPR_END
+# uninitialized constant Ripper::Lexer::EXPR_NONE
+# Did you mean? Ripper::Lexer::EXPR_DOT
+# Ripper::Lexer::EXPR_END
+# Ripper::EXPR_DOT
+# Ripper::EXPR_END
+# Ripper::EXPR_NONE
+# Ripper::Lexer::EXPR_FNAME
+# Ripper::EXPR_FNAME
+# uninitialized constant Ripper::Lexer::EXPR_VALUE
+# Did you mean? Ripper::EXPR_VALUE
+# wrong constant name <Class:Elem>
+# uninitialized constant Ripper::Lexer::PARSER_EVENTS
+# Did you mean? Ripper::PARSER_EVENTS
+# uninitialized constant Ripper::Lexer::PARSER_EVENT_TABLE
+# Did you mean? Ripper::PARSER_EVENT_TABLE
+# uninitialized constant Ripper::Lexer::SCANNER_EVENTS
+# Did you mean? Ripper::SCANNER_EVENTS
+# uninitialized constant Ripper::Lexer::SCANNER_EVENT_TABLE
+# Did you mean? Ripper::SCANNER_EVENT_TABLE
+# wrong constant name <Class:State>
+# uninitialized constant Ripper::Lexer::Version
+# Did you mean? Ripper::Version
+# wrong constant name errors
+# wrong constant name lex
+# wrong constant name scan
+# wrong constant name tokenize
+# uninitialized constant Ripper::Lexer::Elem::Elem
+# wrong constant name event
+# wrong constant name event=
+# wrong constant name initialize
+# wrong constant name message
+# wrong constant name message=
+# wrong constant name pos
+# wrong constant name pos=
+# wrong constant name state
+# wrong constant name state=
+# wrong constant name tok
+# wrong constant name tok=
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name &
+# wrong constant name ==
+# uninitialized constant Ripper::Lexer::State::Elem
+# Did you mean? Ripper::Lexer::Elem
+# wrong constant name allbits?
+# wrong constant name anybits?
+# wrong constant name initialize
+# wrong constant name nobits?
+# wrong constant name to_i
+# wrong constant name to_int
+# wrong constant name to_int=
+# wrong constant name to_s=
+# wrong constant name |
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name <static-init>
+# uninitialized constant Ripper::SexpBuilder::EVENTS
+# Did you mean? Ripper::EVENTS
+# uninitialized constant Ripper::SexpBuilder::EXPR_ARG
+# Did you mean? Ripper::SexpBuilder::EXPR_BEG
+# Ripper::EXPR_ARG
+# Ripper::EXPR_BEG
+# uninitialized constant Ripper::SexpBuilder::EXPR_ARG_ANY
+# Did you mean? Ripper::SexpBuilder::EXPR_END_ANY
+# Ripper::SexpBuilder::EXPR_BEG_ANY
+# Ripper::EXPR_END_ANY
+# Ripper::EXPR_ARG_ANY
+# Ripper::EXPR_BEG_ANY
+# uninitialized constant Ripper::SexpBuilder::EXPR_BEG
+# Did you mean? Ripper::SexpBuilder::EXPR_ARG
+# Ripper::EXPR_ARG
+# Ripper::EXPR_BEG
+# uninitialized constant Ripper::SexpBuilder::EXPR_BEG_ANY
+# Did you mean? Ripper::SexpBuilder::EXPR_END_ANY
+# Ripper::SexpBuilder::EXPR_ARG_ANY
+# Ripper::EXPR_END_ANY
+# Ripper::EXPR_ARG_ANY
+# Ripper::EXPR_BEG_ANY
+# uninitialized constant Ripper::SexpBuilder::EXPR_CLASS
+# Did you mean? Ripper::EXPR_CLASS
+# uninitialized constant Ripper::SexpBuilder::EXPR_CMDARG
+# Did you mean? Ripper::SexpBuilder::EXPR_ARG
+# Ripper::EXPR_ARG
+# Ripper::SexpBuilder::EXPR_ENDARG
+# Ripper::EXPR_CMDARG
+# Ripper::EXPR_ENDARG
+# uninitialized constant Ripper::SexpBuilder::EXPR_DOT
+# Did you mean? Ripper::EXPR_DOT
+# uninitialized constant Ripper::SexpBuilder::EXPR_END
+# Did you mean? Ripper::SexpBuilder::EXPR_MID
+# Ripper::EXPR_MID
+# Ripper::EXPR_END
+# Ripper::SexpBuilder::EXPR_ENDFN
+# Ripper::EXPR_ENDFN
+# uninitialized constant Ripper::SexpBuilder::EXPR_ENDARG
+# Did you mean? Ripper::SexpBuilder::EXPR_ARG
+# Ripper::EXPR_ARG
+# Ripper::EXPR_END
+# Ripper::SexpBuilder::EXPR_ENDFN
+# Ripper::EXPR_ENDFN
+# Ripper::SexpBuilder::EXPR_CMDARG
+# Ripper::EXPR_CMDARG
+# Ripper::EXPR_ENDARG
+# Ripper::SexpBuilder::EXPR_END_ANY
+# Ripper::EXPR_END_ANY
+# uninitialized constant Ripper::SexpBuilder::EXPR_ENDFN
+# Did you mean? Ripper::EXPR_END
+# Ripper::EXPR_ENDFN
+# Ripper::SexpBuilder::EXPR_ENDARG
+# Ripper::EXPR_ENDARG
+# Ripper::SexpBuilder::EXPR_END_ANY
+# Ripper::EXPR_END_ANY
+# uninitialized constant Ripper::SexpBuilder::EXPR_END_ANY
+# Did you mean? Ripper::SexpBuilder::EXPR_ARG_ANY
+# Ripper::SexpBuilder::EXPR_BEG_ANY
+# Ripper::EXPR_END_ANY
+# Ripper::EXPR_ARG_ANY
+# Ripper::EXPR_BEG_ANY
+# Ripper::SexpBuilder::EXPR_ENDFN
+# Ripper::EXPR_ENDFN
+# Ripper::SexpBuilder::EXPR_ENDARG
+# Ripper::EXPR_ENDARG
+# uninitialized constant Ripper::SexpBuilder::EXPR_FITEM
+# Did you mean? Ripper::EXPR_FITEM
+# uninitialized constant Ripper::SexpBuilder::EXPR_FNAME
+# Did you mean? Ripper::SexpBuilder::EXPR_NONE
+# Ripper::EXPR_NONE
+# Ripper::EXPR_FNAME
+# uninitialized constant Ripper::SexpBuilder::EXPR_LABEL
+# Did you mean? Ripper::SexpBuilder::EXPR_BEG
+# Ripper::EXPR_BEG
+# Ripper::EXPR_LABEL
+# Ripper::SexpBuilder::EXPR_LABELED
+# Ripper::EXPR_LABELED
+# uninitialized constant Ripper::SexpBuilder::EXPR_LABELED
+# Did you mean? Ripper::EXPR_LABEL
+# Ripper::EXPR_LABELED
+# uninitialized constant Ripper::SexpBuilder::EXPR_MID
+# Did you mean? Ripper::SexpBuilder::EXPR_END
+# Ripper::EXPR_MID
+# Ripper::EXPR_END
+# uninitialized constant Ripper::SexpBuilder::EXPR_NONE
+# Did you mean? Ripper::SexpBuilder::EXPR_DOT
+# Ripper::SexpBuilder::EXPR_END
+# Ripper::EXPR_DOT
+# Ripper::EXPR_END
+# Ripper::EXPR_NONE
+# Ripper::SexpBuilder::EXPR_FNAME
+# Ripper::EXPR_FNAME
+# uninitialized constant Ripper::SexpBuilder::EXPR_VALUE
+# Did you mean? Ripper::EXPR_VALUE
+# uninitialized constant Ripper::SexpBuilder::PARSER_EVENTS
+# Did you mean? Ripper::PARSER_EVENTS
+# uninitialized constant Ripper::SexpBuilder::PARSER_EVENT_TABLE
+# Did you mean? Ripper::PARSER_EVENT_TABLE
+# uninitialized constant Ripper::SexpBuilder::SCANNER_EVENTS
+# Did you mean? Ripper::SCANNER_EVENTS
+# uninitialized constant Ripper::SexpBuilder::SCANNER_EVENT_TABLE
+# Did you mean? Ripper::SCANNER_EVENT_TABLE
+# uninitialized constant Ripper::SexpBuilder::Version
+# Did you mean? Ripper::Version
+# wrong constant name on_BEGIN
+# wrong constant name on_CHAR
+# wrong constant name on_END
+# wrong constant name on___end__
+# wrong constant name on_alias
+# wrong constant name on_alias_error
+# wrong constant name on_aref
+# wrong constant name on_aref_field
+# wrong constant name on_arg_ambiguous
+# wrong constant name on_arg_paren
+# wrong constant name on_args_add
+# wrong constant name on_args_add_block
+# wrong constant name on_args_add_star
+# wrong constant name on_args_forward
+# wrong constant name on_args_new
+# wrong constant name on_array
+# wrong constant name on_aryptn
+# wrong constant name on_assign
+# wrong constant name on_assign_error
+# wrong constant name on_assoc_new
+# wrong constant name on_assoc_splat
+# wrong constant name on_assoclist_from_args
+# wrong constant name on_backref
+# wrong constant name on_backtick
+# wrong constant name on_bare_assoc_hash
+# wrong constant name on_begin
+# wrong constant name on_binary
+# wrong constant name on_block_var
+# wrong constant name on_blockarg
+# wrong constant name on_bodystmt
+# wrong constant name on_brace_block
+# wrong constant name on_break
+# wrong constant name on_call
+# wrong constant name on_case
+# wrong constant name on_class
+# wrong constant name on_class_name_error
+# wrong constant name on_comma
+# wrong constant name on_command
+# wrong constant name on_command_call
+# wrong constant name on_comment
+# wrong constant name on_const
+# wrong constant name on_const_path_field
+# wrong constant name on_const_path_ref
+# wrong constant name on_const_ref
+# wrong constant name on_cvar
+# wrong constant name on_def
+# wrong constant name on_defined
+# wrong constant name on_defs
+# wrong constant name on_do_block
+# wrong constant name on_dot2
+# wrong constant name on_dot3
+# wrong constant name on_dyna_symbol
+# wrong constant name on_else
+# wrong constant name on_elsif
+# wrong constant name on_embdoc
+# wrong constant name on_embdoc_beg
+# wrong constant name on_embdoc_end
+# wrong constant name on_embexpr_beg
+# wrong constant name on_embexpr_end
+# wrong constant name on_embvar
+# wrong constant name on_ensure
+# wrong constant name on_excessed_comma
+# wrong constant name on_fcall
+# wrong constant name on_field
+# wrong constant name on_float
+# wrong constant name on_for
+# wrong constant name on_gvar
+# wrong constant name on_hash
+# wrong constant name on_heredoc_beg
+# wrong constant name on_heredoc_end
+# wrong constant name on_hshptn
+# wrong constant name on_ident
+# wrong constant name on_if
+# wrong constant name on_if_mod
+# wrong constant name on_ifop
+# wrong constant name on_ignored_nl
+# wrong constant name on_ignored_sp
+# wrong constant name on_imaginary
+# wrong constant name on_in
+# wrong constant name on_int
+# wrong constant name on_ivar
+# wrong constant name on_kw
+# wrong constant name on_kwrest_param
+# wrong constant name on_label
+# wrong constant name on_label_end
+# wrong constant name on_lambda
+# wrong constant name on_lbrace
+# wrong constant name on_lbracket
+# wrong constant name on_lparen
+# wrong constant name on_magic_comment
+# wrong constant name on_massign
+# wrong constant name on_method_add_arg
+# wrong constant name on_method_add_block
+# wrong constant name on_mlhs_add
+# wrong constant name on_mlhs_add_post
+# wrong constant name on_mlhs_add_star
+# wrong constant name on_mlhs_new
+# wrong constant name on_mlhs_paren
+# wrong constant name on_module
+# wrong constant name on_mrhs_add
+# wrong constant name on_mrhs_add_star
+# wrong constant name on_mrhs_new
+# wrong constant name on_mrhs_new_from_args
+# wrong constant name on_next
+# wrong constant name on_nl
+# wrong constant name on_nokw_param
+# wrong constant name on_op
+# wrong constant name on_opassign
+# wrong constant name on_operator_ambiguous
+# wrong constant name on_param_error
+# wrong constant name on_params
+# wrong constant name on_paren
+# wrong constant name on_parse_error
+# wrong constant name on_period
+# wrong constant name on_program
+# wrong constant name on_qsymbols_add
+# wrong constant name on_qsymbols_beg
+# wrong constant name on_qsymbols_new
+# wrong constant name on_qwords_add
+# wrong constant name on_qwords_beg
+# wrong constant name on_qwords_new
+# wrong constant name on_rational
+# wrong constant name on_rbrace
+# wrong constant name on_rbracket
+# wrong constant name on_redo
+# wrong constant name on_regexp_add
+# wrong constant name on_regexp_beg
+# wrong constant name on_regexp_end
+# wrong constant name on_regexp_literal
+# wrong constant name on_regexp_new
+# wrong constant name on_rescue
+# wrong constant name on_rescue_mod
+# wrong constant name on_rest_param
+# wrong constant name on_retry
+# wrong constant name on_return
+# wrong constant name on_return0
+# wrong constant name on_rparen
+# wrong constant name on_sclass
+# wrong constant name on_semicolon
+# wrong constant name on_sp
+# wrong constant name on_stmts_add
+# wrong constant name on_stmts_new
+# wrong constant name on_string_add
+# wrong constant name on_string_concat
+# wrong constant name on_string_content
+# wrong constant name on_string_dvar
+# wrong constant name on_string_embexpr
+# wrong constant name on_string_literal
+# wrong constant name on_super
+# wrong constant name on_symbeg
+# wrong constant name on_symbol
+# wrong constant name on_symbol_literal
+# wrong constant name on_symbols_add
+# wrong constant name on_symbols_beg
+# wrong constant name on_symbols_new
+# wrong constant name on_tlambda
+# wrong constant name on_tlambeg
+# wrong constant name on_top_const_field
+# wrong constant name on_top_const_ref
+# wrong constant name on_tstring_beg
+# wrong constant name on_tstring_content
+# wrong constant name on_tstring_end
+# wrong constant name on_unary
+# wrong constant name on_undef
+# wrong constant name on_unless
+# wrong constant name on_unless_mod
+# wrong constant name on_until
+# wrong constant name on_until_mod
+# wrong constant name on_var_alias
+# wrong constant name on_var_field
+# wrong constant name on_var_ref
+# wrong constant name on_vcall
+# wrong constant name on_void_stmt
+# wrong constant name on_when
+# wrong constant name on_while
+# wrong constant name on_while_mod
+# wrong constant name on_word_add
+# wrong constant name on_word_new
+# wrong constant name on_words_add
+# wrong constant name on_words_beg
+# wrong constant name on_words_new
+# wrong constant name on_words_sep
+# wrong constant name on_xstring_add
+# wrong constant name on_xstring_literal
+# wrong constant name on_xstring_new
+# wrong constant name on_yield
+# wrong constant name on_yield0
+# wrong constant name on_zsuper
+# wrong constant name <Class:CompileError>
+# wrong constant name <Class:Error>
+# wrong constant name <Class:MatchData>
+# wrong constant name <Class:MatchError>
+# wrong constant name initialize
+# wrong constant name match
+# wrong constant name match_list
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name string
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name compile
+# wrong constant name dedent_string
+# wrong constant name lex_state_name
+# wrong constant name token_match
+# wrong constant name pretty_print_children
+# wrong constant name <static-init>
+# wrong constant name enabled?
+# wrong constant name pause
+# wrong constant name resume
+# uninitialized constant SDBM
+# uninitialized constant SDBM
+# uninitialized constant SDBMError
+# uninitialized constant SDBMError
+# uninitialized constant Scanf
+# uninitialized constant Scanf
+# wrong constant name ==
+# wrong constant name ===
+# wrong constant name divide
+# wrong constant name eql?
+# wrong constant name flatten_merge
+# wrong constant name pretty_print
+# wrong constant name pretty_print_cycle
+# wrong constant name reset
+# uninitialized constant Shell
+# uninitialized constant Shell
+# wrong constant name _dump
+# wrong constant name clone
+# wrong constant name dup
+# wrong constant name _load
+# wrong constant name clone
+# wrong constant name __init__
+# uninitialized constant Socket::APPEND
+# uninitialized constant Socket::BINARY
+# uninitialized constant Socket::CREAT
+# uninitialized constant Socket::DIRECT
+# uninitialized constant Socket::DSYNC
+# Did you mean? Socket::RSYNC
+# Socket::SYNC
+# uninitialized constant Socket::EXCL
+# uninitialized constant Socket::FNM_CASEFOLD
+# uninitialized constant Socket::FNM_DOTMATCH
+# uninitialized constant Socket::FNM_EXTGLOB
+# uninitialized constant Socket::FNM_NOESCAPE
+# uninitialized constant Socket::FNM_PATHNAME
+# uninitialized constant Socket::FNM_SHORTNAME
+# uninitialized constant Socket::FNM_SYSCASE
+# uninitialized constant Socket::LOCK_EX
+# Did you mean? Socket::LOCK_NB
+# Socket::LOCK_UN
+# Socket::LOCK_SH
+# uninitialized constant Socket::LOCK_NB
+# Did you mean? Socket::LOCK_UN
+# Socket::LOCK_EX
+# Socket::LOCK_SH
+# uninitialized constant Socket::LOCK_SH
+# Did you mean? Socket::LOCK_NB
+# Socket::LOCK_UN
+# Socket::LOCK_EX
+# uninitialized constant Socket::LOCK_UN
+# Did you mean? Socket::LOCK_NB
+# Socket::LOCK_EX
+# Socket::LOCK_SH
+# uninitialized constant Socket::NOATIME
+# uninitialized constant Socket::NOCTTY
+# uninitialized constant Socket::NOFOLLOW
+# uninitialized constant Socket::NONBLOCK
+# uninitialized constant Socket::NULL
+# uninitialized constant Socket::RDONLY
+# Did you mean? Socket::WRONLY
+# uninitialized constant Socket::RDWR
+# uninitialized constant Socket::RSYNC
+# Did you mean? Socket::DSYNC
+# Socket::SYNC
+# uninitialized constant Socket::SEEK_CUR
+# uninitialized constant Socket::SEEK_DATA
+# Did you mean? Socket::SEEK_SET
+# uninitialized constant Socket::SEEK_END
+# uninitialized constant Socket::SEEK_HOLE
+# uninitialized constant Socket::SEEK_SET
+# uninitialized constant Socket::SHARE_DELETE
+# uninitialized constant Socket::SYNC
+# Did you mean? Socket::RSYNC
+# Socket::DSYNC
+# uninitialized constant Socket::TMPFILE
+# Did you mean? Tempfile
+# uninitialized constant Socket::TRUNC
+# Did you mean? TRUE
+# uninitialized constant Socket::WRONLY
+# Did you mean? Socket::RDONLY
+# uninitialized constant SortedSet::InspectKey
+# wrong constant name initialize
+# wrong constant name setup
+# wrong constant name shellescape
+# wrong constant name shellsplit
+# wrong constant name set_encoding_by_bom
+# wrong constant name bol?
+# wrong constant name fixed_anchor?
+# wrong constant name initialize
+# wrong constant name deconstruct
+# wrong constant name deconstruct_keys
+# wrong constant name filter
+# wrong constant name <Class:Struct>
+# uninitialized constant Sync
+# uninitialized constant Sync
+# uninitialized constant Sync_m
+# uninitialized constant Sync_m
+# uninitialized constant Syslog
+# uninitialized constant Syslog
+# wrong constant name T.noreturn
+# wrong constant name T.noreturn
+# wrong constant name T.untyped
+# wrong constant name <Class:Charset>
+# wrong constant name <Class:Charsets>
+# wrong constant name <Class:Charstring>
+# wrong constant name <Class:CharstringsIndex>
+# wrong constant name <Class:Dict>
+# wrong constant name <Class:Encoding>
+# wrong constant name <Class:Encodings>
+# wrong constant name <Class:FdSelector>
+# wrong constant name <Class:FontDict>
+# wrong constant name <Class:FontIndex>
+# wrong constant name <Class:Header>
+# wrong constant name <Class:Index>
+# wrong constant name <Class:OneBasedIndex>
+# wrong constant name <Class:Path>
+# wrong constant name <Class:PrivateDict>
+# wrong constant name <Class:SubrIndex>
+# wrong constant name <Class:TopDict>
+# wrong constant name <Class:TopIndex>
+# uninitialized constant TTFunk::Table::Cff::Charset::Elem
+# wrong constant name []
+# wrong constant name count
+# wrong constant name each
+# wrong constant name encode
+# wrong constant name entries
+# wrong constant name format
+# wrong constant name initialize
+# wrong constant name offset
+# wrong constant name offset_or_id
+# wrong constant name top_dict
+# wrong constant name <static-init>
+# wrong constant name standard_strings
+# wrong constant name strings_for_charset_id
+# wrong constant name <static-init>
+# wrong constant name encode
+# wrong constant name glyph
+# wrong constant name glyph_id
+# wrong constant name initialize
+# wrong constant name path
+# wrong constant name raw
+# wrong constant name render
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::CharstringsIndex::Elem
+# wrong constant name encode
+# wrong constant name initialize
+# wrong constant name top_dict
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::Dict::Elem
+# wrong constant name <Class:InvalidOperandError>
+# wrong constant name <Class:TooManyOperandsError>
+# wrong constant name []
+# wrong constant name each
+# wrong constant name each_pair
+# wrong constant name encode
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::Encoding::Elem
+# wrong constant name []
+# wrong constant name count
+# wrong constant name each
+# wrong constant name encode
+# wrong constant name format
+# wrong constant name initialize
+# wrong constant name offset
+# wrong constant name offset_or_id
+# wrong constant name supplemental?
+# wrong constant name top_dict
+# wrong constant name <static-init>
+# wrong constant name codes_for_encoding_id
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::FdSelector::Elem
+# wrong constant name []
+# wrong constant name count
+# wrong constant name each
+# wrong constant name encode
+# wrong constant name entries
+# wrong constant name initialize
+# wrong constant name n_glyphs
+# wrong constant name top_dict
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::FontDict::Elem
+# uninitialized constant TTFunk::Table::Cff::FontDict::MAX_OPERANDS
+# uninitialized constant TTFunk::Table::Cff::FontDict::OPERAND_BZERO
+# Did you mean? TTFunk::Table::Cff::FontDict::OPERATOR_BZERO
+# uninitialized constant TTFunk::Table::Cff::FontDict::OPERATOR_BZERO
+# Did you mean? TTFunk::Table::Cff::FontDict::OPERAND_BZERO
+# uninitialized constant TTFunk::Table::Cff::FontDict::VALID_SCI_EXPONENT_RE
+# uninitialized constant TTFunk::Table::Cff::FontDict::VALID_SCI_SIGNIFICAND_RE
+# uninitialized constant TTFunk::Table::Cff::FontDict::WIDE_OPERATOR_ADJUSTMENT
+# uninitialized constant TTFunk::Table::Cff::FontDict::WIDE_OPERATOR_BZERO
+# wrong constant name encode
+# wrong constant name finalize
+# wrong constant name initialize
+# wrong constant name private_dict
+# wrong constant name top_dict
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::FontIndex::Elem
+# wrong constant name finalize
+# wrong constant name initialize
+# wrong constant name top_dict
+# wrong constant name <static-init>
+# wrong constant name absolute_offset_size
+# wrong constant name encode
+# wrong constant name header_size
+# wrong constant name major
+# wrong constant name minor
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::Index::Elem
+# wrong constant name []
+# wrong constant name count
+# wrong constant name data_start_pos
+# wrong constant name each
+# wrong constant name encode
+# wrong constant name offset_size
+# wrong constant name offsets
+# wrong constant name raw_data
+# wrong constant name raw_offset_length
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name base_index
+# wrong constant name count
+# wrong constant name each
+# wrong constant name encode
+# wrong constant name initialize
+# wrong constant name length
+# wrong constant name table_offset
+# wrong constant name <static-init>
+# wrong constant name close_path
+# wrong constant name commands
+# wrong constant name curve_to
+# wrong constant name line_to
+# wrong constant name move_to
+# wrong constant name number_of_contours
+# wrong constant name render
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::Elem
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::MAX_OPERANDS
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::OPERAND_BZERO
+# Did you mean? TTFunk::Table::Cff::PrivateDict::OPERATOR_BZERO
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::OPERATOR_BZERO
+# Did you mean? TTFunk::Table::Cff::PrivateDict::OPERAND_BZERO
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::VALID_SCI_EXPONENT_RE
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::VALID_SCI_SIGNIFICAND_RE
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::WIDE_OPERATOR_ADJUSTMENT
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::WIDE_OPERATOR_BZERO
+# wrong constant name default_width_x
+# wrong constant name encode
+# wrong constant name finalize
+# wrong constant name nominal_width_x
+# wrong constant name subr_index
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::SubrIndex::Elem
+# wrong constant name bias
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::TopDict::Elem
+# uninitialized constant TTFunk::Table::Cff::TopDict::MAX_OPERANDS
+# uninitialized constant TTFunk::Table::Cff::TopDict::OPERAND_BZERO
+# Did you mean? TTFunk::Table::Cff::TopDict::OPERATOR_BZERO
+# uninitialized constant TTFunk::Table::Cff::TopDict::OPERATOR_BZERO
+# Did you mean? TTFunk::Table::Cff::TopDict::OPERAND_BZERO
+# uninitialized constant TTFunk::Table::Cff::TopDict::VALID_SCI_EXPONENT_RE
+# uninitialized constant TTFunk::Table::Cff::TopDict::VALID_SCI_SIGNIFICAND_RE
+# uninitialized constant TTFunk::Table::Cff::TopDict::WIDE_OPERATOR_ADJUSTMENT
+# uninitialized constant TTFunk::Table::Cff::TopDict::WIDE_OPERATOR_BZERO
+# wrong constant name cff
+# wrong constant name cff_offset
+# wrong constant name charset
+# wrong constant name charstring_type
+# wrong constant name charstrings_index
+# wrong constant name encode
+# wrong constant name encoding
+# wrong constant name finalize
+# wrong constant name font_dict_selector
+# wrong constant name font_index
+# wrong constant name is_cid_font?
+# wrong constant name private_dict
+# wrong constant name ros
+# wrong constant name ros?
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::TopIndex::Elem
+# wrong constant name <static-init>
+# wrong constant name <Class:Remover>
+# wrong constant name _close
+# wrong constant name call
+# wrong constant name initialize
+# wrong constant name <static-init>
+# uninitialized constant ThreadsWait
+# uninitialized constant ThreadsWait
+# wrong constant name eval_script
+# wrong constant name instruction_sequence
+# wrong constant name parameters
+# wrong constant name new
+# uninitialized constant Tracer
+# Did you mean? TracePoint
+# uninitialized constant Tracer
+# Did you mean? TracePoint
+# wrong constant name <Class:File>
+# wrong constant name new2
+# uninitialized constant URI::File::ABS_PATH
+# Did you mean? URI::ABS_PATH
+# uninitialized constant URI::File::ABS_URI
+# Did you mean? URI::ABS_URI
+# uninitialized constant URI::File::ABS_URI_REF
+# Did you mean? URI::ABS_URI_REF
+# uninitialized constant URI::File::DEFAULT_PARSER
+# Did you mean? URI::File::DEFAULT_PORT
+# URI::DEFAULT_PARSER
+# uninitialized constant URI::File::ESCAPED
+# Did you mean? URI::File::Escape
+# URI::Escape
+# URI::ESCAPED
+# uninitialized constant URI::File::FRAGMENT
+# Did you mean? URI::FRAGMENT
+# uninitialized constant URI::File::HOST
+# Did you mean? URI::HOST
+# uninitialized constant URI::File::OPAQUE
+# Did you mean? URI::OPAQUE
+# uninitialized constant URI::File::PORT
+# Did you mean? URI::PORT
+# uninitialized constant URI::File::QUERY
+# Did you mean? URI::QUERY
+# uninitialized constant URI::File::REGISTRY
+# Did you mean? URI::REGISTRY
+# uninitialized constant URI::File::REL_PATH
+# Did you mean? URI::REL_PATH
+# uninitialized constant URI::File::REL_URI
+# Did you mean? URI::REL_URI
+# uninitialized constant URI::File::REL_URI_REF
+# Did you mean? URI::REL_URI_REF
+# uninitialized constant URI::File::RFC3986_PARSER
+# Did you mean? URI::File::RFC3986_Parser
+# URI::RFC3986_Parser
+# URI::File::RFC2396_Parser
+# URI::RFC2396_Parser
+# URI::RFC3986_PARSER
+# uninitialized constant URI::File::SCHEME
+# Did you mean? URI::SCHEME
+# uninitialized constant URI::File::TBLDECWWWCOMP_
+# Did you mean? URI::File::TBLENCWWWCOMP_
+# URI::TBLENCWWWCOMP_
+# URI::TBLDECWWWCOMP_
+# uninitialized constant URI::File::TBLENCWWWCOMP_
+# Did you mean? URI::File::TBLDECWWWCOMP_
+# URI::TBLENCWWWCOMP_
+# URI::TBLDECWWWCOMP_
+# uninitialized constant URI::File::UNSAFE
+# Did you mean? URI::UNSAFE
+# uninitialized constant URI::File::URI_REF
+# Did you mean? URI::URI_REF
+# uninitialized constant URI::File::USERINFO
+# Did you mean? URI::USERINFO
+# uninitialized constant URI::File::USE_REGISTRY
+# uninitialized constant URI::File::VERSION
+# Did you mean? URI::VERSION
+# uninitialized constant URI::File::VERSION_CODE
+# Did you mean? URI::VERSION_CODE
+# uninitialized constant URI::File::WEB_ENCODINGS_
+# Did you mean? URI::WEB_ENCODINGS_
+# wrong constant name check_password
+# wrong constant name check_user
+# wrong constant name check_userinfo
+# wrong constant name set_userinfo
+# wrong constant name <static-init>
+# wrong constant name attributes
+# wrong constant name attributes=
+# wrong constant name dn
+# wrong constant name dn=
+# wrong constant name extensions
+# wrong constant name extensions=
+# wrong constant name filter
+# wrong constant name filter=
+# wrong constant name initialize
+# wrong constant name scope
+# wrong constant name scope=
+# wrong constant name set_attributes
+# wrong constant name set_dn
+# wrong constant name set_extensions
+# wrong constant name set_filter
+# wrong constant name set_scope
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name join
+# wrong constant name parse
+# wrong constant name regexp
+# wrong constant name split
+# wrong constant name make_components_hash
+# wrong constant name get_encoding
+# wrong constant name <static-init>
+# uninitialized constant Vector
+# uninitialized constant Vector
+# uninitialized constant WeakRef
+# uninitialized constant WeakRef
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
diff --git a/sorbet/rbi/hidden-definitions/hidden.rbi b/sorbet/rbi/hidden-definitions/hidden.rbi
new file mode 100644
index 0000000..e8e025f
--- /dev/null
+++ b/sorbet/rbi/hidden-definitions/hidden.rbi
@@ -0,0 +1,8260 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi hidden-definitions
+
+# typed: autogenerated
+
+module AFM
+ ISO_LATIN1_ENCODING = ::T.let(nil, ::T.untyped)
+end
+
+class Addrinfo
+ def connect_internal(local_addrinfo, timeout=T.unsafe(nil)); end
+end
+
+class Array
+ include ::JSON::Ext::Generator::GeneratorMethods::Array
+ def abbrev(pattern=T.unsafe(nil)); end
+
+ def deconstruct(); end
+
+ def shelljoin(); end
+
+ def to_h(); end
+end
+
+class Array
+ def self.try_convert(arg); end
+end
+
+BasicObject::BasicObject = BasicObject
+
+class BasicSocket
+ def read_nonblock(len, str=T.unsafe(nil), exception: T.unsafe(nil)); end
+end
+
+class BigDecimal
+ def clone(); end
+ EXCEPTION_NaN = ::T.let(nil, ::T.untyped)
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class BigDecimal
+ def self.interpret_loosely(arg); end
+end
+
+class Binding
+ def clone(); end
+
+ def irb(); end
+end
+
+class Bundler::APIResponseInvalidDependenciesError
+ def status_code(); end
+end
+
+class Bundler::APIResponseInvalidDependenciesError
+end
+
+class Bundler::CurrentRuby
+ def jruby_30?(); end
+
+ def jruby_3?(); end
+
+ def maglev_30?(); end
+
+ def maglev_3?(); end
+
+ def mingw_30?(); end
+
+ def mingw_3?(); end
+
+ def mri_30?(); end
+
+ def mri_3?(); end
+
+ def mswin64_30?(); end
+
+ def mswin64_3?(); end
+
+ def mswin_30?(); end
+
+ def mswin_3?(); end
+
+ def on_30?(); end
+
+ def on_3?(); end
+
+ def rbx_30?(); end
+
+ def rbx_3?(); end
+
+ def ruby_30?(); end
+
+ def ruby_3?(); end
+
+ def truffleruby_30?(); end
+
+ def truffleruby_3?(); end
+
+ def x64_mingw_30?(); end
+
+ def x64_mingw_3?(); end
+end
+
+class Bundler::Definition
+ def dependencies_for(groups); end
+
+ def locked_dependencies(); end
+
+ def most_specific_locked_platform(); end
+
+ def requested_dependencies(); end
+
+ def resolve_only_locally!(); end
+end
+
+class Bundler::Definition
+ def self.no_lock(); end
+
+ def self.no_lock=(no_lock); end
+end
+
+class Bundler::DepProxy
+ def clone(); end
+end
+
+class Bundler::DepProxy
+ def self.get_proxy(dep, platform); end
+end
+
+class Bundler::Dependency
+ def branch(); end
+
+ def expanded_platforms(); end
+
+ def git(); end
+
+ def github(); end
+
+ def ref(); end
+end
+
+Bundler::Deprecate = Gem::Deprecate
+
+module Bundler::Digest
+ SHA1_MASK = ::T.let(nil, ::T.untyped)
+ SHA1_WORDS = ::T.let(nil, ::T.untyped)
+end
+
+module Bundler::Digest
+ def self.sha1(string); end
+end
+
+class Bundler::Dsl
+ def check_primary_source_safety(); end
+ GITHUB_PULL_REQUEST_URL = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Env
+end
+
+class Bundler::Env
+ def self.environment(); end
+
+ def self.report(options=T.unsafe(nil)); end
+
+ def self.write(io); end
+end
+
+class Bundler::EnvironmentPreserver
+ def replace_with_backup(); end
+end
+
+class Bundler::EnvironmentPreserver
+ def self.env_to_hash(env); end
+
+ def self.from_env(); end
+end
+
+class Bundler::Fetcher
+ def fetch_spec(spec); end
+
+ def fetchers(); end
+
+ def http_proxy(); end
+
+ def initialize(remote); end
+
+ def specs(gem_names, source); end
+
+ def specs_with_retry(gem_names, source); end
+
+ def uri(); end
+
+ def use_api(); end
+
+ def user_agent(); end
+ FAIL_ERRORS = ::T.let(nil, ::T.untyped)
+ FETCHERS = ::T.let(nil, ::T.untyped)
+ HTTP_ERRORS = ::T.let(nil, ::T.untyped)
+ NET_ERRORS = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Fetcher::AuthenticationRequiredError
+ def initialize(remote_uri); end
+end
+
+class Bundler::Fetcher::BadAuthenticationError
+ def initialize(remote_uri); end
+end
+
+class Bundler::Fetcher::Base
+ def api_fetcher?(); end
+
+ def available?(); end
+
+ def display_uri(); end
+
+ def downloader(); end
+
+ def fetch_uri(); end
+
+ def initialize(downloader, remote, display_uri); end
+
+ def remote(); end
+
+ def remote_uri(); end
+end
+
+class Bundler::Fetcher::Base
+end
+
+class Bundler::Fetcher::CertificateFailureError
+ def initialize(remote_uri); end
+end
+
+class Bundler::Fetcher::CompactIndex
+ def available?(*args, &blk); end
+
+ def specs(*args, &blk); end
+
+ def specs_for_names(gem_names); end
+end
+
+class Bundler::Fetcher::CompactIndex::ClientFetcher
+ def call(path, headers); end
+
+ def fetcher(); end
+
+ def fetcher=(_); end
+
+ def ui(); end
+
+ def ui=(_); end
+end
+
+class Bundler::Fetcher::CompactIndex::ClientFetcher
+ def self.[](*arg); end
+
+ def self.members(); end
+end
+
+class Bundler::Fetcher::CompactIndex
+ def self.compact_index_request(method_name); end
+end
+
+class Bundler::Fetcher::Dependency
+ def dependency_api_uri(gem_names=T.unsafe(nil)); end
+
+ def dependency_specs(gem_names); end
+
+ def get_formatted_specs_and_deps(gem_list); end
+
+ def specs(gem_names, full_dependency_list=T.unsafe(nil), last_spec_list=T.unsafe(nil)); end
+
+ def unmarshalled_dep_gems(gem_names); end
+end
+
+class Bundler::Fetcher::Dependency
+end
+
+class Bundler::Fetcher::Downloader
+ def connection(); end
+
+ def fetch(uri, headers=T.unsafe(nil), counter=T.unsafe(nil)); end
+
+ def initialize(connection, redirect_limit); end
+
+ def redirect_limit(); end
+
+ def request(uri, headers); end
+end
+
+class Bundler::Fetcher::Downloader
+end
+
+class Bundler::Fetcher::Index
+ def specs(_gem_names); end
+end
+
+class Bundler::Fetcher::Index
+end
+
+class Bundler::Fetcher::SSLError
+ def initialize(msg=T.unsafe(nil)); end
+end
+
+class Bundler::Fetcher::TooManyRequestsError
+end
+
+class Bundler::Fetcher::TooManyRequestsError
+end
+
+class Bundler::Fetcher
+ def self.api_timeout(); end
+
+ def self.api_timeout=(api_timeout); end
+
+ def self.disable_endpoint(); end
+
+ def self.disable_endpoint=(disable_endpoint); end
+
+ def self.max_retries(); end
+
+ def self.max_retries=(max_retries); end
+
+ def self.redirect_limit(); end
+
+ def self.redirect_limit=(redirect_limit); end
+end
+
+module Bundler::FileUtils
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::FileUtils::Entry_
+ def link(dest); end
+end
+
+module Bundler::FileUtils
+ def self.cp_lr(src, dest, noop: T.unsafe(nil), verbose: T.unsafe(nil), dereference_root: T.unsafe(nil), remove_destination: T.unsafe(nil)); end
+
+ def self.link_entry(src, dest, dereference_root=T.unsafe(nil), remove_destination=T.unsafe(nil)); end
+end
+
+class Bundler::GemHelper
+ include ::Rake::DSL
+ include ::Rake::FileUtilsExt
+ include ::FileUtils
+ include ::FileUtils::StreamUtils_
+ def allowed_push_host(); end
+
+ def already_tagged?(); end
+
+ def base(); end
+
+ def build_checksum(built_gem_path=T.unsafe(nil)); end
+
+ def build_gem(); end
+
+ def built_gem_path(); end
+
+ def clean?(); end
+
+ def committed?(); end
+
+ def current_branch(); end
+
+ def default_remote(); end
+
+ def gem_command(); end
+
+ def gem_key(); end
+
+ def gem_push?(); end
+
+ def gem_push_host(); end
+
+ def gemspec(); end
+
+ def git_push(remote=T.unsafe(nil)); end
+
+ def guard_clean(); end
+
+ def initialize(base=T.unsafe(nil), name=T.unsafe(nil)); end
+
+ def install(); end
+
+ def install_gem(built_gem_path=T.unsafe(nil), local=T.unsafe(nil)); end
+
+ def name(); end
+
+ def rubygem_push(path); end
+
+ def sh(cmd, &block); end
+
+ def sh_with_input(cmd); end
+
+ def sh_with_status(cmd, &block); end
+
+ def spec_path(); end
+
+ def tag_prefix=(tag_prefix); end
+
+ def tag_version(); end
+
+ def version(); end
+
+ def version_tag(); end
+end
+
+class Bundler::GemHelper
+ def self.gemspec(&block); end
+
+ def self.install_tasks(opts=T.unsafe(nil)); end
+
+ def self.instance(); end
+
+ def self.instance=(instance); end
+
+ def self.tag_prefix=(prefix); end
+end
+
+class Bundler::GemHelpers::PlatformMatch
+ def self.specificity_score(spec_platform, user_platform); end
+end
+
+module Bundler::GemHelpers
+ def self.local_platform(); end
+
+ def self.same_deps(spec, exemplary_spec); end
+
+ def self.same_specificity(platform, spec, exemplary_spec); end
+end
+
+class Bundler::GemVersionPromoter
+ def initialize(locked_specs=T.unsafe(nil), unlock_gems=T.unsafe(nil)); end
+
+ def level(); end
+
+ def level=(value); end
+
+ def locked_specs(); end
+
+ def major?(); end
+
+ def minor?(); end
+
+ def prerelease_specified(); end
+
+ def prerelease_specified=(prerelease_specified); end
+
+ def sort_versions(dep, spec_groups); end
+
+ def strict(); end
+
+ def strict=(strict); end
+
+ def unlock_gems(); end
+ DEBUG = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::GemVersionPromoter
+end
+
+class Bundler::Graph
+ def edge_options(); end
+
+ def groups(); end
+
+ def initialize(env, output_file, show_version=T.unsafe(nil), show_requirements=T.unsafe(nil), output_format=T.unsafe(nil), without=T.unsafe(nil)); end
+
+ def node_options(); end
+
+ def output_file(); end
+
+ def output_format(); end
+
+ def relations(); end
+
+ def viz(); end
+ GRAPH_NAME = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Graph::GraphVizClient
+ def g(); end
+
+ def initialize(graph_instance); end
+
+ def run(); end
+end
+
+class Bundler::Graph::GraphVizClient
+end
+
+class Bundler::Graph
+end
+
+class Bundler::Index
+ include ::Enumerable
+end
+
+class Bundler::Injector
+ def initialize(deps, options=T.unsafe(nil)); end
+
+ def inject(gemfile_path, lockfile_path); end
+
+ def remove(gemfile_path, lockfile_path); end
+ INJECTED_GEMS = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Injector
+ def self.inject(new_deps, options=T.unsafe(nil)); end
+
+ def self.remove(gems, options=T.unsafe(nil)); end
+end
+
+class Bundler::LazySpecification
+ def eql?(other); end
+
+ def platform_string(); end
+end
+
+class Bundler::LockfileParser
+ def self.bundled_with(); end
+end
+
+module Bundler::Molinillo::SpecificationProvider
+ def dependencies_equal?(dependencies, other_dependencies); end
+end
+
+class Bundler::PermissionError
+ def parent_folder(); end
+
+ def permission_type(); end
+end
+
+module Bundler::Plugin::API::Source
+ def ==(other); end
+
+ def add_dependency_names(names); end
+
+ def app_cache_dirname(); end
+
+ def app_cache_path(custom_path=T.unsafe(nil)); end
+
+ def bundler_plugin_api_source?(); end
+
+ def cache(spec, custom_path=T.unsafe(nil)); end
+
+ def cached!(); end
+
+ def can_lock?(spec); end
+
+ def dependency_names(); end
+
+ def dependency_names=(dependency_names); end
+
+ def double_check_for(*arg); end
+
+ def eql?(other); end
+
+ def fetch_gemspec_files(); end
+
+ def gem_install_dir(); end
+
+ def hash(); end
+
+ def identifier(); end
+
+ def include?(other); end
+
+ def initialize(opts); end
+
+ def install(spec, opts); end
+
+ def install_path(); end
+
+ def installed?(); end
+
+ def local!(); end
+
+ def name(); end
+
+ def options(); end
+
+ def options_to_lock(); end
+
+ def post_install(spec, disable_exts=T.unsafe(nil)); end
+
+ def remote!(); end
+
+ def root(); end
+
+ def spec_names(); end
+
+ def specs(); end
+
+ def to_lock(); end
+
+ def to_s(); end
+
+ def unlock!(); end
+
+ def unmet_deps(); end
+
+ def uri(); end
+
+ def uri_hash(); end
+end
+
+module Bundler::Plugin::API::Source
+end
+
+module Bundler::Plugin::Events
+ GEM_AFTER_INSTALL = ::T.let(nil, ::T.untyped)
+ GEM_AFTER_INSTALL_ALL = ::T.let(nil, ::T.untyped)
+ GEM_BEFORE_INSTALL = ::T.let(nil, ::T.untyped)
+ GEM_BEFORE_INSTALL_ALL = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Plugin::Index
+ def installed_plugins(); end
+
+ def plugin_commands(plugin); end
+
+ def unregister_plugin(name); end
+end
+
+class Bundler::Plugin::Index::CommandConflict
+ def initialize(plugin, commands); end
+end
+
+class Bundler::Plugin::Index::CommandConflict
+end
+
+class Bundler::Plugin::Index::SourceConflict
+ def initialize(plugin, sources); end
+end
+
+class Bundler::Plugin::Index::SourceConflict
+end
+
+class Bundler::Plugin::Installer
+ def install(names, options); end
+
+ def install_definition(definition); end
+end
+
+class Bundler::Plugin::Installer::Git
+ def generate_bin(spec, disable_extensions=T.unsafe(nil)); end
+end
+
+class Bundler::Plugin::Installer::Git
+end
+
+class Bundler::Plugin::Installer::Rubygems
+end
+
+class Bundler::Plugin::Installer::Rubygems
+end
+
+class Bundler::Plugin::Installer
+end
+
+class Bundler::Plugin::PluginInstallError
+end
+
+class Bundler::Plugin::PluginInstallError
+end
+
+class Bundler::Plugin::SourceList
+end
+
+class Bundler::Plugin::SourceList
+end
+
+module Bundler::Plugin
+ def self.list(); end
+
+ def self.save_plugin(name, spec, optional_plugin=T.unsafe(nil)); end
+
+ def self.uninstall(names, options); end
+end
+
+class Bundler::ProcessLock
+end
+
+class Bundler::ProcessLock
+ def self.lock(bundle_path=T.unsafe(nil)); end
+end
+
+class Bundler::Resolver
+ include ::Bundler::GemHelpers
+ def results_for(dependency, base); end
+
+ def source_for(name); end
+end
+
+class Bundler::Resolver::SpecGroup
+ def activated_platforms(); end
+
+ def activated_platforms=(activated_platforms); end
+
+ def sorted_activated_platforms(); end
+end
+
+class Bundler::Resolver::SpecGroup
+ def self.create_for(specs, all_platforms, specific_platform); end
+end
+
+class Bundler::Retry
+ def attempt(&block); end
+
+ def attempts(&block); end
+
+ def current_run(); end
+
+ def current_run=(current_run); end
+
+ def initialize(name, exceptions=T.unsafe(nil), retries=T.unsafe(nil)); end
+
+ def name(); end
+
+ def name=(name); end
+
+ def total_runs(); end
+
+ def total_runs=(total_runs); end
+end
+
+class Bundler::Retry
+ def self.attempts(); end
+
+ def self.default_attempts(); end
+
+ def self.default_retries(); end
+end
+
+class Bundler::RubygemsIntegration
+ def add_default_gems_to(specs); end
+
+ def add_to_load_path(paths); end
+
+ def all_specs(); end
+
+ def backport_ext_builder_monitor(); end
+
+ def correct_for_windows_path(path); end
+
+ def default_stubs(); end
+
+ def find_bundler(version); end
+
+ def find_name(name); end
+
+ def gem_remote_fetcher(); end
+
+ def load_env_plugins(); end
+
+ def plain_specs(); end
+
+ def plain_specs=(specs); end
+
+ def stub_rubygems(specs); end
+
+ def supports_bundler_trampolining?(); end
+end
+
+class Bundler::SelfManager
+ def install_locked_bundler_and_restart_with_it_if_needed(); end
+
+ def restart_with_locked_bundler_if_needed(); end
+
+ def update_bundler_and_restart_with_it_if_needed(target); end
+end
+
+class Bundler::SelfManager
+end
+
+class Bundler::Settings
+ def processor_count(); end
+ STRING_KEYS = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Settings::Mirror
+ def ==(other); end
+
+ def fallback_timeout(); end
+
+ def fallback_timeout=(timeout); end
+
+ def initialize(uri=T.unsafe(nil), fallback_timeout=T.unsafe(nil)); end
+
+ def uri(); end
+
+ def uri=(uri); end
+
+ def valid?(); end
+
+ def validate!(probe=T.unsafe(nil)); end
+ DEFAULT_FALLBACK_TIMEOUT = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Settings::Mirror
+end
+
+class Bundler::Settings::Mirrors
+ def each(&blk); end
+
+ def for(uri); end
+
+ def initialize(prober=T.unsafe(nil)); end
+
+ def parse(key, value); end
+end
+
+class Bundler::Settings::Mirrors
+end
+
+class Bundler::Settings::Validator
+end
+
+class Bundler::Settings::Validator::Rule
+ def description(); end
+
+ def fail!(key, value, *reasons); end
+
+ def initialize(keys, description, &validate); end
+
+ def k(key); end
+
+ def set(settings, key, value, *reasons); end
+
+ def validate!(key, value, settings); end
+end
+
+class Bundler::Settings::Validator::Rule
+end
+
+class Bundler::Settings::Validator
+ def self.validate!(key, value, settings); end
+end
+
+class Bundler::Settings
+ def self.key_for(key); end
+end
+
+class Bundler::Source
+ def add_dependency_names(names); end
+
+ def cached!(); end
+
+ def identifier(); end
+
+ def local!(); end
+
+ def local_only!(); end
+
+ def remote!(); end
+
+ def spec_names(); end
+end
+
+class Bundler::Source::Git
+ def glob(); end
+
+ def local?(); end
+end
+
+class Bundler::Source::Rubygems
+ def default_cache_path_for(dir); end
+
+ def dependency_api_available?(); end
+
+ def multiple_remotes?(); end
+
+ def no_remotes?(); end
+
+ def remote_names(); end
+end
+
+class Bundler::Source::RubygemsAggregate
+ def identifier(); end
+
+ def initialize(sources, source_map); end
+
+ def source_map(); end
+
+ def sources(); end
+
+ def specs(); end
+end
+
+class Bundler::Source::RubygemsAggregate
+end
+
+class Bundler::SourceList
+ def add_global_rubygems_remote(uri); end
+
+ def aggregate_global_source?(); end
+
+ def expired_sources?(replacement_sources); end
+
+ def global_path_source(); end
+
+ def implicit_global_source?(); end
+
+ def local_only!(); end
+
+ def lock_other_sources(); end
+
+ def lock_rubygems_sources(); end
+
+ def merged_gem_lockfile_sections!(replacement_source); end
+
+ def merged_gem_lockfile_sections?(); end
+
+ def non_default_explicit_sources(); end
+
+ def non_global_rubygems_sources(); end
+end
+
+class Bundler::SourceMap
+ def all_requirements(); end
+
+ def dependencies(); end
+
+ def direct_requirements(); end
+
+ def initialize(sources, dependencies); end
+
+ def pinned_spec_names(skip=T.unsafe(nil)); end
+
+ def sources(); end
+end
+
+class Bundler::SourceMap
+end
+
+class Bundler::SpecSet
+ include ::Enumerable
+ include ::Bundler::TSort
+ def missing_specs(); end
+end
+
+class Bundler::StubSpecification
+ def extensions(); end
+
+ def gem_build_complete_path(); end
+
+ def manually_installed?(); end
+end
+
+module Bundler::TSort
+ def each_strongly_connected_component(&block); end
+
+ def each_strongly_connected_component_from(node, id_map=T.unsafe(nil), stack=T.unsafe(nil), &block); end
+
+ def strongly_connected_components(); end
+
+ def tsort(); end
+
+ def tsort_each(&block); end
+
+ def tsort_each_child(node); end
+
+ def tsort_each_node(); end
+end
+
+class Bundler::TSort::Cyclic
+end
+
+class Bundler::TSort::Cyclic
+end
+
+module Bundler::TSort
+ def self.each_strongly_connected_component(each_node, each_child); end
+
+ def self.each_strongly_connected_component_from(node, each_child, id_map=T.unsafe(nil), stack=T.unsafe(nil)); end
+
+ def self.strongly_connected_components(each_node, each_child); end
+
+ def self.tsort(each_node, each_child); end
+
+ def self.tsort_each(each_node, each_child); end
+end
+
+class Bundler::Thor
+ include ::Bundler::Thor::Base
+ include ::Bundler::Thor::Invocation
+ include ::Bundler::Thor::Shell
+ def help(command=T.unsafe(nil), subcommand=T.unsafe(nil)); end
+ HELP_MAPPINGS = ::T.let(nil, ::T.untyped)
+ TEMPLATE_EXTNAME = ::T.let(nil, ::T.untyped)
+ THOR_RESERVED_WORDS = ::T.let(nil, ::T.untyped)
+end
+
+module Bundler::Thor::Actions
+ def _cleanup_options_and_set(options, key); end
+
+ def _shared_configuration(); end
+
+ def action(instance); end
+
+ def add_file(destination, *args, &block); end
+
+ def add_link(destination, *args); end
+
+ def append_file(path, *args, &block); end
+
+ def append_to_file(path, *args, &block); end
+
+ def apply(path, config=T.unsafe(nil)); end
+
+ def behavior(); end
+
+ def behavior=(behavior); end
+
+ def chmod(path, mode, config=T.unsafe(nil)); end
+
+ def comment_lines(path, flag, *args); end
+
+ def copy_file(source, *args, &block); end
+
+ def create_file(destination, *args, &block); end
+
+ def create_link(destination, *args); end
+
+ def destination_root(); end
+
+ def destination_root=(root); end
+
+ def directory(source, *args, &block); end
+
+ def empty_directory(destination, config=T.unsafe(nil)); end
+
+ def find_in_source_paths(file); end
+
+ def get(source, *args, &block); end
+
+ def gsub_file(path, flag, *args, &block); end
+
+ def in_root(); end
+
+ def initialize(args=T.unsafe(nil), options=T.unsafe(nil), config=T.unsafe(nil)); end
+
+ def inject_into_class(path, klass, *args, &block); end
+
+ def inject_into_file(destination, *args, &block); end
+
+ def inject_into_module(path, module_name, *args, &block); end
+
+ def insert_into_file(destination, *args, &block); end
+
+ def inside(dir=T.unsafe(nil), config=T.unsafe(nil), &block); end
+
+ def link_file(source, *args); end
+
+ def prepend_file(path, *args, &block); end
+
+ def prepend_to_file(path, *args, &block); end
+
+ def relative_to_original_destination_root(path, remove_dot=T.unsafe(nil)); end
+
+ def remove_dir(path, config=T.unsafe(nil)); end
+
+ def remove_file(path, config=T.unsafe(nil)); end
+
+ def run(command, config=T.unsafe(nil)); end
+
+ def run_ruby_script(command, config=T.unsafe(nil)); end
+
+ def source_paths(); end
+
+ def template(source, *args, &block); end
+
+ def thor(command, *args); end
+
+ def uncomment_lines(path, flag, *args); end
+ WARNINGS = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Actions::CapturableERB
+end
+
+class Bundler::Thor::Actions::CapturableERB
+end
+
+module Bundler::Thor::Actions::ClassMethods
+ def add_runtime_options!(); end
+
+ def source_paths(); end
+
+ def source_paths_for_search(); end
+
+ def source_root(path=T.unsafe(nil)); end
+end
+
+module Bundler::Thor::Actions::ClassMethods
+end
+
+class Bundler::Thor::Actions::CreateFile
+ def data(); end
+
+ def force_on_collision?(); end
+
+ def force_or_skip_or_conflict(force, skip, &block); end
+
+ def identical?(); end
+
+ def initialize(base, destination, data, config=T.unsafe(nil)); end
+
+ def on_conflict_behavior(&block); end
+
+ def render(); end
+end
+
+class Bundler::Thor::Actions::CreateFile
+end
+
+class Bundler::Thor::Actions::CreateLink
+end
+
+class Bundler::Thor::Actions::CreateLink
+end
+
+class Bundler::Thor::Actions::Directory
+ def execute!(); end
+
+ def file_level_lookup(previous_lookup); end
+
+ def files(lookup); end
+
+ def initialize(base, source, destination=T.unsafe(nil), config=T.unsafe(nil), &block); end
+
+ def source(); end
+end
+
+class Bundler::Thor::Actions::Directory
+end
+
+class Bundler::Thor::Actions::EmptyDirectory
+ def base(); end
+
+ def config(); end
+
+ def convert_encoded_instructions(filename); end
+
+ def destination(); end
+
+ def destination=(destination); end
+
+ def exists?(); end
+
+ def given_destination(); end
+
+ def initialize(base, destination, config=T.unsafe(nil)); end
+
+ def invoke!(); end
+
+ def invoke_with_conflict_check(&block); end
+
+ def on_conflict_behavior(); end
+
+ def on_file_clash_behavior(); end
+
+ def pretend?(); end
+
+ def relative_destination(); end
+
+ def revoke!(); end
+
+ def say_status(status, color); end
+end
+
+class Bundler::Thor::Actions::EmptyDirectory
+end
+
+class Bundler::Thor::Actions::InjectIntoFile
+ def behavior(); end
+
+ def flag(); end
+
+ def initialize(base, destination, data, config); end
+
+ def replace!(regexp, string, force); end
+
+ def replacement(); end
+
+ def say_status(behavior, warning: T.unsafe(nil), color: T.unsafe(nil)); end
+end
+
+class Bundler::Thor::Actions::InjectIntoFile
+end
+
+module Bundler::Thor::Actions
+ def self.included(base); end
+end
+
+class Bundler::Thor::AmbiguousCommandError
+end
+
+class Bundler::Thor::AmbiguousCommandError
+end
+
+Bundler::Thor::AmbiguousTaskError = Bundler::Thor::AmbiguousCommandError
+
+class Bundler::Thor::Argument
+ def banner(); end
+
+ def default(); end
+
+ def default_banner(); end
+
+ def description(); end
+
+ def enum(); end
+
+ def human_name(); end
+
+ def initialize(name, options=T.unsafe(nil)); end
+
+ def name(); end
+
+ def required(); end
+
+ def required?(); end
+
+ def show_default?(); end
+
+ def type(); end
+
+ def usage(); end
+
+ def valid_type?(type); end
+
+ def validate!(); end
+ VALID_TYPES = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Argument
+end
+
+class Bundler::Thor::Arguments
+ def initialize(arguments=T.unsafe(nil)); end
+
+ def parse(args); end
+
+ def remaining(); end
+ NUMERIC = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Arguments
+ def self.parse(*args); end
+
+ def self.split(args); end
+end
+
+module Bundler::Thor::Base
+ def args(); end
+
+ def args=(args); end
+
+ def initialize(args=T.unsafe(nil), local_options=T.unsafe(nil), config=T.unsafe(nil)); end
+
+ def options(); end
+
+ def options=(options); end
+
+ def parent_options(); end
+
+ def parent_options=(parent_options); end
+end
+
+module Bundler::Thor::Base::ClassMethods
+ def all_commands(); end
+
+ def all_tasks(); end
+
+ def allow_incompatible_default_type!(); end
+
+ def argument(name, options=T.unsafe(nil)); end
+
+ def arguments(); end
+
+ def attr_accessor(*arg); end
+
+ def attr_reader(*arg); end
+
+ def attr_writer(*arg); end
+
+ def baseclass(); end
+
+ def basename(); end
+
+ def build_option(name, options, scope); end
+
+ def build_options(options, scope); end
+
+ def check_default_type(); end
+
+ def check_default_type!(); end
+
+ def check_unknown_options(); end
+
+ def check_unknown_options!(); end
+
+ def check_unknown_options?(config); end
+
+ def class_option(name, options=T.unsafe(nil)); end
+
+ def class_options(options=T.unsafe(nil)); end
+
+ def class_options_help(shell, groups=T.unsafe(nil)); end
+
+ def commands(); end
+
+ def create_command(meth); end
+
+ def create_task(meth); end
+
+ def disable_required_check?(command_name); end
+
+ def dispatch(command, given_args, given_opts, config); end
+
+ def exit_on_failure?(); end
+
+ def find_and_refresh_command(name); end
+
+ def find_and_refresh_task(name); end
+
+ def from_superclass(method, default=T.unsafe(nil)); end
+
+ def group(name=T.unsafe(nil)); end
+
+ def handle_argument_error(command, error, args, arity); end
+
+ def handle_no_command_error(command, has_namespace=T.unsafe(nil)); end
+
+ def handle_no_task_error(command, has_namespace=T.unsafe(nil)); end
+
+ def inherited(klass); end
+
+ def initialize_added(); end
+
+ def is_thor_reserved_word?(word, type); end
+
+ def method_added(meth); end
+
+ def namespace(name=T.unsafe(nil)); end
+
+ def no_commands(&block); end
+
+ def no_commands?(); end
+
+ def no_commands_context(); end
+
+ def no_tasks(&block); end
+
+ def print_options(shell, options, group_name=T.unsafe(nil)); end
+
+ def public_command(*names); end
+
+ def public_task(*names); end
+
+ def remove_argument(*names); end
+
+ def remove_class_option(*names); end
+
+ def remove_command(*names); end
+
+ def remove_task(*names); end
+
+ def start(given_args=T.unsafe(nil), config=T.unsafe(nil)); end
+
+ def stop_on_unknown_option?(command_name); end
+
+ def strict_args_position(); end
+
+ def strict_args_position!(); end
+
+ def strict_args_position?(config); end
+
+ def tasks(); end
+end
+
+module Bundler::Thor::Base::ClassMethods
+end
+
+module Bundler::Thor::Base
+ def self.included(base); end
+
+ def self.register_klass_file(klass); end
+
+ def self.shell(); end
+
+ def self.shell=(shell); end
+
+ def self.subclass_files(); end
+
+ def self.subclasses(); end
+end
+
+class Bundler::Thor::Command
+ def formatted_usage(klass, namespace=T.unsafe(nil), subcommand=T.unsafe(nil)); end
+
+ def handle_argument_error?(instance, error, caller); end
+
+ def handle_no_method_error?(instance, error, caller); end
+
+ def hidden?(); end
+
+ def initialize(name, description, long_description, usage, options=T.unsafe(nil)); end
+
+ def local_method?(instance, name); end
+
+ def not_debugging?(instance); end
+
+ def private_method?(instance); end
+
+ def public_method?(instance); end
+
+ def required_arguments_for(klass, usage); end
+
+ def required_options(); end
+
+ def run(instance, args=T.unsafe(nil)); end
+
+ def sans_backtrace(backtrace, caller); end
+ FILE_REGEXP = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Command
+end
+
+module Bundler::Thor::CoreExt
+end
+
+class Bundler::Thor::CoreExt::HashWithIndifferentAccess
+ def [](key); end
+
+ def []=(key, value); end
+
+ def convert_key(key); end
+
+ def delete(key); end
+
+ def except(*keys); end
+
+ def fetch(key, *args); end
+
+ def initialize(hash=T.unsafe(nil)); end
+
+ def key?(key); end
+
+ def merge(other); end
+
+ def merge!(other); end
+
+ def method_missing(method, *args); end
+
+ def replace(other_hash); end
+
+ def reverse_merge(other); end
+
+ def reverse_merge!(other_hash); end
+
+ def values_at(*indices); end
+end
+
+class Bundler::Thor::CoreExt::HashWithIndifferentAccess
+end
+
+module Bundler::Thor::CoreExt
+end
+
+Bundler::Thor::Correctable = DidYouMean::Correctable
+
+class Bundler::Thor::DynamicCommand
+ def initialize(name, options=T.unsafe(nil)); end
+end
+
+class Bundler::Thor::DynamicCommand
+end
+
+Bundler::Thor::DynamicTask = Bundler::Thor::DynamicCommand
+
+class Bundler::Thor::Error
+end
+
+class Bundler::Thor::Error
+end
+
+class Bundler::Thor::Group
+ include ::Bundler::Thor::Base
+ include ::Bundler::Thor::Invocation
+ include ::Bundler::Thor::Shell
+ def _invoke_for_class_method(klass, command=T.unsafe(nil), *args, &block); end
+end
+
+class Bundler::Thor::Group
+ extend ::Bundler::Thor::Base::ClassMethods
+ extend ::Bundler::Thor::Invocation::ClassMethods
+ def self.banner(); end
+
+ def self.desc(description=T.unsafe(nil)); end
+
+ def self.get_options_from_invocations(group_options, base_options); end
+
+ def self.handle_argument_error(command, error, _args, arity); end
+
+ def self.help(shell); end
+
+ def self.invocation_blocks(); end
+
+ def self.invocations(); end
+
+ def self.invoke(*names, &block); end
+
+ def self.invoke_from_option(*names, &block); end
+
+ def self.printable_commands(*arg); end
+
+ def self.printable_tasks(*arg); end
+
+ def self.remove_invocation(*names); end
+
+ def self.self_command(); end
+
+ def self.self_task(); end
+end
+
+class Bundler::Thor::HiddenCommand
+end
+
+class Bundler::Thor::HiddenCommand
+end
+
+Bundler::Thor::HiddenTask = Bundler::Thor::HiddenCommand
+
+module Bundler::Thor::Invocation
+ def _parse_initialization_options(args, opts, config); end
+
+ def _retrieve_class_and_command(name, sent_command=T.unsafe(nil)); end
+
+ def _retrieve_class_and_task(name, sent_command=T.unsafe(nil)); end
+
+ def _shared_configuration(); end
+
+ def current_command_chain(); end
+
+ def initialize(args=T.unsafe(nil), options=T.unsafe(nil), config=T.unsafe(nil), &block); end
+
+ def invoke(name=T.unsafe(nil), *args); end
+
+ def invoke_all(); end
+
+ def invoke_command(command, *args); end
+
+ def invoke_task(command, *args); end
+
+ def invoke_with_padding(*args); end
+end
+
+module Bundler::Thor::Invocation::ClassMethods
+ def prepare_for_invocation(key, name); end
+end
+
+module Bundler::Thor::Invocation::ClassMethods
+end
+
+module Bundler::Thor::Invocation
+ def self.included(base); end
+end
+
+class Bundler::Thor::InvocationError
+end
+
+class Bundler::Thor::InvocationError
+end
+
+module Bundler::Thor::LineEditor
+end
+
+class Bundler::Thor::LineEditor::Basic
+ def initialize(prompt, options); end
+
+ def options(); end
+
+ def prompt(); end
+
+ def readline(); end
+end
+
+class Bundler::Thor::LineEditor::Basic
+ def self.available?(); end
+end
+
+class Bundler::Thor::LineEditor::Readline
+end
+
+class Bundler::Thor::LineEditor::Readline::PathCompletion
+ def initialize(text); end
+
+ def matches(); end
+end
+
+class Bundler::Thor::LineEditor::Readline::PathCompletion
+end
+
+class Bundler::Thor::LineEditor::Readline
+end
+
+module Bundler::Thor::LineEditor
+ def self.best_available(); end
+
+ def self.readline(prompt, options=T.unsafe(nil)); end
+end
+
+class Bundler::Thor::MalformattedArgumentError
+end
+
+class Bundler::Thor::MalformattedArgumentError
+end
+
+class Bundler::Thor::NestedContext
+ def enter(); end
+
+ def entered?(); end
+end
+
+class Bundler::Thor::NestedContext
+end
+
+class Bundler::Thor::NoKwargSpellChecker
+ def initialize(dictionary); end
+end
+
+class Bundler::Thor::NoKwargSpellChecker
+end
+
+class Bundler::Thor::Option
+ def aliases(); end
+
+ def array?(); end
+
+ def boolean?(); end
+
+ def dasherize(str); end
+
+ def dasherized?(); end
+
+ def group(); end
+
+ def hash?(); end
+
+ def hide(); end
+
+ def lazy_default(); end
+
+ def numeric?(); end
+
+ def repeatable(); end
+
+ def string?(); end
+
+ def switch_name(); end
+
+ def undasherize(str); end
+
+ def usage(padding=T.unsafe(nil)); end
+
+ def validate_default_type!(); end
+ VALID_TYPES = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Option
+ def self.parse(key, value); end
+end
+
+class Bundler::Thor::Options
+ def assign_result!(option, result); end
+
+ def check_unknown!(); end
+
+ def current_is_switch?(); end
+
+ def current_is_switch_formatted?(); end
+
+ def initialize(hash_options=T.unsafe(nil), defaults=T.unsafe(nil), stop_on_unknown=T.unsafe(nil), disable_required_check=T.unsafe(nil)); end
+
+ def normalize_switch(arg); end
+
+ def parse_boolean(switch); end
+
+ def parse_peek(switch, option); end
+
+ def parsing_options?(); end
+
+ def switch?(arg); end
+
+ def switch_option(arg); end
+
+ def unshift(arg, is_value: T.unsafe(nil)); end
+ EQ_RE = ::T.let(nil, ::T.untyped)
+ LONG_RE = ::T.let(nil, ::T.untyped)
+ OPTS_END = ::T.let(nil, ::T.untyped)
+ SHORT_NUM = ::T.let(nil, ::T.untyped)
+ SHORT_RE = ::T.let(nil, ::T.untyped)
+ SHORT_SQ_RE = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Options
+ def self.to_switches(options); end
+end
+
+module Bundler::Thor::RakeCompat
+ include ::Rake::DSL
+ include ::Rake::FileUtilsExt
+ include ::FileUtils
+ include ::FileUtils::StreamUtils_
+end
+
+module Bundler::Thor::RakeCompat
+ def self.included(base); end
+
+ def self.rake_classes(); end
+end
+
+class Bundler::Thor::RequiredArgumentMissingError
+end
+
+class Bundler::Thor::RequiredArgumentMissingError
+end
+
+module Bundler::Thor::Sandbox
+end
+
+module Bundler::Thor::Sandbox
+end
+
+module Bundler::Thor::Shell
+ def _shared_configuration(); end
+
+ def ask(*args, &block); end
+
+ def error(*args, &block); end
+
+ def file_collision(*args, &block); end
+
+ def initialize(args=T.unsafe(nil), options=T.unsafe(nil), config=T.unsafe(nil)); end
+
+ def no?(*args, &block); end
+
+ def print_in_columns(*args, &block); end
+
+ def print_table(*args, &block); end
+
+ def print_wrapped(*args, &block); end
+
+ def say(*args, &block); end
+
+ def say_error(*args, &block); end
+
+ def say_status(*args, &block); end
+
+ def set_color(*args, &block); end
+
+ def shell(); end
+
+ def shell=(shell); end
+
+ def terminal_width(*args, &block); end
+
+ def with_padding(); end
+
+ def yes?(*args, &block); end
+ SHELL_DELEGATED_METHODS = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Shell::Basic
+ def answer_match(possibilities, answer, case_insensitive); end
+
+ def as_unicode(); end
+
+ def ask(statement, *args); end
+
+ def ask_filtered(statement, color, options); end
+
+ def ask_simply(statement, color, options); end
+
+ def base(); end
+
+ def base=(base); end
+
+ def can_display_colors?(); end
+
+ def dynamic_width(); end
+
+ def dynamic_width_stty(); end
+
+ def dynamic_width_tput(); end
+
+ def error(statement); end
+
+ def file_collision(destination); end
+
+ def file_collision_help(); end
+
+ def git_merge_tool(); end
+
+ def indent(count=T.unsafe(nil)); end
+
+ def is?(value); end
+
+ def lookup_color(color); end
+
+ def merge(destination, content); end
+
+ def merge_tool(); end
+
+ def mute(); end
+
+ def mute?(); end
+
+ def no?(statement, color=T.unsafe(nil)); end
+
+ def padding(); end
+
+ def padding=(value); end
+
+ def prepare_message(message, *color); end
+
+ def print_in_columns(array); end
+
+ def print_table(array, options=T.unsafe(nil)); end
+
+ def print_wrapped(message, options=T.unsafe(nil)); end
+
+ def quiet?(); end
+
+ def say(message=T.unsafe(nil), color=T.unsafe(nil), force_new_line=T.unsafe(nil)); end
+
+ def say_error(message=T.unsafe(nil), color=T.unsafe(nil), force_new_line=T.unsafe(nil)); end
+
+ def say_status(status, message, log_status=T.unsafe(nil)); end
+
+ def set_color(string, *arg); end
+
+ def show_diff(destination, content); end
+
+ def stderr(); end
+
+ def stdout(); end
+
+ def terminal_width(); end
+
+ def truncate(string, width); end
+
+ def unix?(); end
+
+ def yes?(statement, color=T.unsafe(nil)); end
+ DEFAULT_TERMINAL_WIDTH = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Shell::Basic
+end
+
+class Bundler::Thor::Shell::Color
+ def are_colors_disabled?(); end
+
+ def are_colors_supported?(); end
+
+ def diff_lcs_loaded?(); end
+
+ def output_diff_line(diff); end
+
+ def set_color(string, *colors); end
+ BLACK = ::T.let(nil, ::T.untyped)
+ BLUE = ::T.let(nil, ::T.untyped)
+ BOLD = ::T.let(nil, ::T.untyped)
+ CLEAR = ::T.let(nil, ::T.untyped)
+ CYAN = ::T.let(nil, ::T.untyped)
+ GREEN = ::T.let(nil, ::T.untyped)
+ MAGENTA = ::T.let(nil, ::T.untyped)
+ ON_BLACK = ::T.let(nil, ::T.untyped)
+ ON_BLUE = ::T.let(nil, ::T.untyped)
+ ON_CYAN = ::T.let(nil, ::T.untyped)
+ ON_GREEN = ::T.let(nil, ::T.untyped)
+ ON_MAGENTA = ::T.let(nil, ::T.untyped)
+ ON_RED = ::T.let(nil, ::T.untyped)
+ ON_WHITE = ::T.let(nil, ::T.untyped)
+ ON_YELLOW = ::T.let(nil, ::T.untyped)
+ RED = ::T.let(nil, ::T.untyped)
+ WHITE = ::T.let(nil, ::T.untyped)
+ YELLOW = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Shell::Color
+end
+
+class Bundler::Thor::Shell::HTML
+ def ask(statement, color=T.unsafe(nil)); end
+
+ def diff_lcs_loaded?(); end
+
+ def output_diff_line(diff); end
+
+ def set_color(string, *colors); end
+ BLACK = ::T.let(nil, ::T.untyped)
+ BLUE = ::T.let(nil, ::T.untyped)
+ BOLD = ::T.let(nil, ::T.untyped)
+ CYAN = ::T.let(nil, ::T.untyped)
+ GREEN = ::T.let(nil, ::T.untyped)
+ MAGENTA = ::T.let(nil, ::T.untyped)
+ ON_BLACK = ::T.let(nil, ::T.untyped)
+ ON_BLUE = ::T.let(nil, ::T.untyped)
+ ON_CYAN = ::T.let(nil, ::T.untyped)
+ ON_GREEN = ::T.let(nil, ::T.untyped)
+ ON_MAGENTA = ::T.let(nil, ::T.untyped)
+ ON_RED = ::T.let(nil, ::T.untyped)
+ ON_WHITE = ::T.let(nil, ::T.untyped)
+ ON_YELLOW = ::T.let(nil, ::T.untyped)
+ RED = ::T.let(nil, ::T.untyped)
+ WHITE = ::T.let(nil, ::T.untyped)
+ YELLOW = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Shell::HTML
+end
+
+module Bundler::Thor::Shell
+end
+
+Bundler::Thor::Task = Bundler::Thor::Command
+
+class Bundler::Thor::UndefinedCommandError
+ include ::DidYouMean::Correctable
+ def all_commands(); end
+
+ def command(); end
+
+ def initialize(command, all_commands, namespace); end
+end
+
+class Bundler::Thor::UndefinedCommandError::SpellChecker
+ def corrections(); end
+
+ def error(); end
+
+ def initialize(error); end
+
+ def spell_checker(); end
+end
+
+class Bundler::Thor::UndefinedCommandError::SpellChecker
+end
+
+class Bundler::Thor::UndefinedCommandError
+end
+
+Bundler::Thor::UndefinedTaskError = Bundler::Thor::UndefinedCommandError
+
+class Bundler::Thor::UnknownArgumentError
+ include ::DidYouMean::Correctable
+ def initialize(switches, unknown); end
+
+ def switches(); end
+
+ def unknown(); end
+end
+
+class Bundler::Thor::UnknownArgumentError::SpellChecker
+ def corrections(); end
+
+ def error(); end
+
+ def initialize(error); end
+
+ def spell_checker(); end
+end
+
+class Bundler::Thor::UnknownArgumentError::SpellChecker
+end
+
+class Bundler::Thor::UnknownArgumentError
+end
+
+module Bundler::Thor::Util
+end
+
+module Bundler::Thor::Util
+ def self.camel_case(str); end
+
+ def self.escape_globs(path); end
+
+ def self.escape_html(string); end
+
+ def self.find_by_namespace(namespace); end
+
+ def self.find_class_and_command_by_namespace(namespace, fallback=T.unsafe(nil)); end
+
+ def self.find_class_and_task_by_namespace(namespace, fallback=T.unsafe(nil)); end
+
+ def self.globs_for(path); end
+
+ def self.load_thorfile(path, content=T.unsafe(nil), debug=T.unsafe(nil)); end
+
+ def self.namespace_from_thor_class(constant); end
+
+ def self.namespaces_in_content(contents, file=T.unsafe(nil)); end
+
+ def self.ruby_command(); end
+
+ def self.snake_case(str); end
+
+ def self.thor_classes_in(klass); end
+
+ def self.thor_root(); end
+
+ def self.thor_root_glob(); end
+
+ def self.user_home(); end
+end
+
+class Bundler::Thor
+ extend ::Bundler::Thor::Base::ClassMethods
+ extend ::Bundler::Thor::Invocation::ClassMethods
+ def self.banner(command, namespace=T.unsafe(nil), subcommand=T.unsafe(nil)); end
+
+ def self.check_unknown_options!(options=T.unsafe(nil)); end
+
+ def self.command_help(shell, command_name); end
+
+ def self.default_command(meth=T.unsafe(nil)); end
+
+ def self.default_task(meth=T.unsafe(nil)); end
+
+ def self.deprecation_warning(message); end
+
+ def self.desc(usage, description, options=T.unsafe(nil)); end
+
+ def self.disable_required_check(); end
+
+ def self.disable_required_check!(*command_names); end
+
+ def self.disable_required_check?(command); end
+
+ def self.dispatch(meth, given_args, given_opts, config); end
+
+ def self.dynamic_command_class(); end
+
+ def self.find_command_possibilities(meth); end
+
+ def self.find_task_possibilities(meth); end
+
+ def self.help(shell, subcommand=T.unsafe(nil)); end
+
+ def self.long_desc(long_description, options=T.unsafe(nil)); end
+
+ def self.map(mappings=T.unsafe(nil), **kw); end
+
+ def self.method_option(name, options=T.unsafe(nil)); end
+
+ def self.method_options(options=T.unsafe(nil)); end
+
+ def self.normalize_command_name(meth); end
+
+ def self.normalize_task_name(meth); end
+
+ def self.option(name, options=T.unsafe(nil)); end
+
+ def self.options(options=T.unsafe(nil)); end
+
+ def self.package_name(name, _=T.unsafe(nil)); end
+
+ def self.printable_commands(all=T.unsafe(nil), subcommand=T.unsafe(nil)); end
+
+ def self.printable_tasks(all=T.unsafe(nil), subcommand=T.unsafe(nil)); end
+
+ def self.register(klass, subcommand_name, usage, description, options=T.unsafe(nil)); end
+
+ def self.retrieve_command_name(args); end
+
+ def self.retrieve_task_name(args); end
+
+ def self.stop_on_unknown_option(); end
+
+ def self.stop_on_unknown_option!(*command_names); end
+
+ def self.stop_on_unknown_option?(command); end
+
+ def self.subcommand(subcommand, subcommand_class); end
+
+ def self.subcommand_classes(); end
+
+ def self.subcommand_help(cmd); end
+
+ def self.subcommands(); end
+
+ def self.subtask(subcommand, subcommand_class); end
+
+ def self.subtask_help(cmd); end
+
+ def self.subtasks(); end
+
+ def self.task_help(shell, command_name); end
+end
+
+class Bundler::UI::Shell
+ def add_color(string, *color); end
+
+ def ask(msg); end
+
+ def confirm(msg, newline=T.unsafe(nil)); end
+
+ def debug(msg, newline=T.unsafe(nil)); end
+
+ def debug?(); end
+
+ def error(msg, newline=T.unsafe(nil), color=T.unsafe(nil)); end
+
+ def info(msg, newline=T.unsafe(nil)); end
+
+ def initialize(options=T.unsafe(nil)); end
+
+ def level(name=T.unsafe(nil)); end
+
+ def level=(level); end
+
+ def no?(); end
+
+ def quiet?(); end
+
+ def shell=(shell); end
+
+ def silence(&blk); end
+
+ def trace(e, newline=T.unsafe(nil), force=T.unsafe(nil)); end
+
+ def unprinted_warnings(); end
+
+ def warn(msg, newline=T.unsafe(nil), color=T.unsafe(nil)); end
+
+ def yes?(msg); end
+ LEVELS = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::UI::Shell
+end
+
+module Bundler::URI
+ include ::Bundler::URI::RFC2396_REGEXP
+ ABS_PATH = ::T.let(nil, ::T.untyped)
+ ABS_URI = ::T.let(nil, ::T.untyped)
+ ABS_URI_REF = ::T.let(nil, ::T.untyped)
+ DEFAULT_PARSER = ::T.let(nil, ::T.untyped)
+ ESCAPED = ::T.let(nil, ::T.untyped)
+ FRAGMENT = ::T.let(nil, ::T.untyped)
+ HOST = ::T.let(nil, ::T.untyped)
+ OPAQUE = ::T.let(nil, ::T.untyped)
+ PORT = ::T.let(nil, ::T.untyped)
+ QUERY = ::T.let(nil, ::T.untyped)
+ REGISTRY = ::T.let(nil, ::T.untyped)
+ REL_PATH = ::T.let(nil, ::T.untyped)
+ REL_URI = ::T.let(nil, ::T.untyped)
+ REL_URI_REF = ::T.let(nil, ::T.untyped)
+ RFC3986_PARSER = ::T.let(nil, ::T.untyped)
+ SCHEME = ::T.let(nil, ::T.untyped)
+ TBLDECWWWCOMP_ = ::T.let(nil, ::T.untyped)
+ TBLENCWWWCOMP_ = ::T.let(nil, ::T.untyped)
+ UNSAFE = ::T.let(nil, ::T.untyped)
+ URI_REF = ::T.let(nil, ::T.untyped)
+ USERINFO = ::T.let(nil, ::T.untyped)
+ VERSION = ::T.let(nil, ::T.untyped)
+ VERSION_CODE = ::T.let(nil, ::T.untyped)
+ WEB_ENCODINGS_ = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::BadURIError
+end
+
+class Bundler::URI::BadURIError
+end
+
+class Bundler::URI::Error
+end
+
+class Bundler::URI::Error
+end
+
+class Bundler::URI::FTP
+ def set_typecode(v); end
+
+ def typecode(); end
+
+ def typecode=(typecode); end
+ COMPONENT = ::T.let(nil, ::T.untyped)
+ DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+ TYPECODE = ::T.let(nil, ::T.untyped)
+ TYPECODE_PREFIX = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::FTP
+ def self.new2(user, password, host, port, path, typecode=T.unsafe(nil), arg_check=T.unsafe(nil)); end
+end
+
+class Bundler::URI::File
+ def check_password(user); end
+
+ def check_user(user); end
+
+ def check_userinfo(user); end
+
+ def set_userinfo(v); end
+ COMPONENT = ::T.let(nil, ::T.untyped)
+ DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::File
+end
+
+class Bundler::URI::Generic
+ include ::Bundler::URI
+ include ::Bundler::URI::RFC2396_REGEXP
+ def +(oth); end
+
+ def -(oth); end
+
+ def ==(oth); end
+
+ def absolute(); end
+
+ def absolute?(); end
+
+ def coerce(oth); end
+
+ def component(); end
+
+ def component_ary(); end
+
+ def default_port(); end
+
+ def eql?(oth); end
+
+ def find_proxy(env=T.unsafe(nil)); end
+
+ def fragment(); end
+
+ def fragment=(v); end
+
+ def hierarchical?(); end
+
+ def host(); end
+
+ def host=(v); end
+
+ def hostname(); end
+
+ def hostname=(v); end
+
+ def initialize(scheme, userinfo, host, port, registry, path, opaque, query, fragment, parser=T.unsafe(nil), arg_check=T.unsafe(nil)); end
+
+ def merge(oth); end
+
+ def merge!(oth); end
+
+ def normalize(); end
+
+ def normalize!(); end
+
+ def opaque(); end
+
+ def opaque=(v); end
+
+ def parser(); end
+
+ def password(); end
+
+ def password=(password); end
+
+ def path(); end
+
+ def path=(v); end
+
+ def port(); end
+
+ def port=(v); end
+
+ def query(); end
+
+ def query=(v); end
+
+ def registry(); end
+
+ def registry=(v); end
+
+ def relative?(); end
+
+ def route_from(oth); end
+
+ def route_to(oth); end
+
+ def scheme(); end
+
+ def scheme=(v); end
+
+ def select(*components); end
+
+ def set_host(v); end
+
+ def set_opaque(v); end
+
+ def set_password(v); end
+
+ def set_path(v); end
+
+ def set_port(v); end
+
+ def set_registry(v); end
+
+ def set_scheme(v); end
+
+ def set_user(v); end
+
+ def set_userinfo(user, password=T.unsafe(nil)); end
+
+ def user(); end
+
+ def user=(user); end
+
+ def userinfo(); end
+
+ def userinfo=(userinfo); end
+ COMPONENT = ::T.let(nil, ::T.untyped)
+ DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+ USE_REGISTRY = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::Generic
+ def self.build(args); end
+
+ def self.build2(args); end
+
+ def self.component(); end
+
+ def self.default_port(); end
+
+ def self.use_proxy?(hostname, addr, port, no_proxy); end
+
+ def self.use_registry(); end
+end
+
+class Bundler::URI::HTTP
+ def request_uri(); end
+ COMPONENT = ::T.let(nil, ::T.untyped)
+ DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::HTTP
+end
+
+class Bundler::URI::HTTPS
+ DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::HTTPS
+end
+
+class Bundler::URI::InvalidComponentError
+end
+
+class Bundler::URI::InvalidComponentError
+end
+
+class Bundler::URI::InvalidURIError
+end
+
+class Bundler::URI::InvalidURIError
+end
+
+class Bundler::URI::LDAP
+ def attributes(); end
+
+ def attributes=(val); end
+
+ def dn(); end
+
+ def dn=(val); end
+
+ def extensions(); end
+
+ def extensions=(val); end
+
+ def filter(); end
+
+ def filter=(val); end
+
+ def initialize(*arg); end
+
+ def scope(); end
+
+ def scope=(val); end
+
+ def set_attributes(val); end
+
+ def set_dn(val); end
+
+ def set_extensions(val); end
+
+ def set_filter(val); end
+
+ def set_scope(val); end
+ COMPONENT = ::T.let(nil, ::T.untyped)
+ DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+ SCOPE = ::T.let(nil, ::T.untyped)
+ SCOPE_BASE = ::T.let(nil, ::T.untyped)
+ SCOPE_ONE = ::T.let(nil, ::T.untyped)
+ SCOPE_SUB = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::LDAP
+end
+
+class Bundler::URI::LDAPS
+ DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::LDAPS
+end
+
+class Bundler::URI::MailTo
+ def headers(); end
+
+ def headers=(v); end
+
+ def initialize(*arg); end
+
+ def set_headers(v); end
+
+ def set_to(v); end
+
+ def to(); end
+
+ def to=(v); end
+
+ def to_mailtext(); end
+
+ def to_rfc822text(); end
+ COMPONENT = ::T.let(nil, ::T.untyped)
+ DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+ EMAIL_REGEXP = ::T.let(nil, ::T.untyped)
+ HEADER_REGEXP = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::MailTo
+end
+
+Bundler::URI::Parser = Bundler::URI::RFC2396_Parser
+
+Bundler::URI::REGEXP = Bundler::URI::RFC2396_REGEXP
+
+class Bundler::URI::RFC2396_Parser
+ include ::Bundler::URI::RFC2396_REGEXP
+ def escape(str, unsafe=T.unsafe(nil)); end
+
+ def extract(str, schemes=T.unsafe(nil)); end
+
+ def initialize(opts=T.unsafe(nil)); end
+
+ def join(*uris); end
+
+ def make_regexp(schemes=T.unsafe(nil)); end
+
+ def parse(uri); end
+
+ def pattern(); end
+
+ def regexp(); end
+
+ def split(uri); end
+
+ def unescape(str, escaped=T.unsafe(nil)); end
+end
+
+class Bundler::URI::RFC2396_Parser
+end
+
+module Bundler::URI::RFC2396_REGEXP
+end
+
+module Bundler::URI::RFC2396_REGEXP::PATTERN
+ ABS_PATH = ::T.let(nil, ::T.untyped)
+ ABS_URI = ::T.let(nil, ::T.untyped)
+ ALNUM = ::T.let(nil, ::T.untyped)
+ ALPHA = ::T.let(nil, ::T.untyped)
+ DOMLABEL = ::T.let(nil, ::T.untyped)
+ ESCAPED = ::T.let(nil, ::T.untyped)
+ FRAGMENT = ::T.let(nil, ::T.untyped)
+ HEX = ::T.let(nil, ::T.untyped)
+ HIER_PART = ::T.let(nil, ::T.untyped)
+ HOST = ::T.let(nil, ::T.untyped)
+ HOSTNAME = ::T.let(nil, ::T.untyped)
+ HOSTPORT = ::T.let(nil, ::T.untyped)
+ IPV4ADDR = ::T.let(nil, ::T.untyped)
+ IPV6ADDR = ::T.let(nil, ::T.untyped)
+ IPV6REF = ::T.let(nil, ::T.untyped)
+ NET_PATH = ::T.let(nil, ::T.untyped)
+ OPAQUE_PART = ::T.let(nil, ::T.untyped)
+ PATH_SEGMENTS = ::T.let(nil, ::T.untyped)
+ PORT = ::T.let(nil, ::T.untyped)
+ QUERY = ::T.let(nil, ::T.untyped)
+ REG_NAME = ::T.let(nil, ::T.untyped)
+ REL_PATH = ::T.let(nil, ::T.untyped)
+ REL_SEGMENT = ::T.let(nil, ::T.untyped)
+ REL_URI = ::T.let(nil, ::T.untyped)
+ RESERVED = ::T.let(nil, ::T.untyped)
+ SCHEME = ::T.let(nil, ::T.untyped)
+ TOPLABEL = ::T.let(nil, ::T.untyped)
+ UNRESERVED = ::T.let(nil, ::T.untyped)
+ URIC = ::T.let(nil, ::T.untyped)
+ URIC_NO_SLASH = ::T.let(nil, ::T.untyped)
+ URI_REF = ::T.let(nil, ::T.untyped)
+ USERINFO = ::T.let(nil, ::T.untyped)
+ X_ABS_URI = ::T.let(nil, ::T.untyped)
+ X_REL_URI = ::T.let(nil, ::T.untyped)
+end
+
+module Bundler::URI::RFC2396_REGEXP::PATTERN
+end
+
+module Bundler::URI::RFC2396_REGEXP
+end
+
+class Bundler::URI::RFC3986_Parser
+ def join(*uris); end
+
+ def parse(uri); end
+
+ def regexp(); end
+
+ def split(uri); end
+ RFC3986_URI = ::T.let(nil, ::T.untyped)
+ RFC3986_relative_ref = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::RFC3986_Parser
+end
+
+module Bundler::URI::Util
+end
+
+module Bundler::URI::Util
+ def self.make_components_hash(klass, array_hash); end
+end
+
+module Bundler::URI
+ def self.decode_www_form(str, enc=T.unsafe(nil), separator: T.unsafe(nil), use__charset_: T.unsafe(nil), isindex: T.unsafe(nil)); end
+
+ def self.decode_www_form_component(str, enc=T.unsafe(nil)); end
+
+ def self.encode_www_form(enum, enc=T.unsafe(nil)); end
+
+ def self.encode_www_form_component(str, enc=T.unsafe(nil)); end
+
+ def self.extract(str, schemes=T.unsafe(nil), &block); end
+
+ def self.for(scheme, *arguments, default: T.unsafe(nil)); end
+
+ def self.get_encoding(label); end
+
+ def self.join(*str); end
+
+ def self.parse(uri); end
+
+ def self.regexp(schemes=T.unsafe(nil)); end
+
+ def self.scheme_list(); end
+
+ def self.split(uri); end
+end
+
+module Bundler::VersionRanges
+end
+
+class Bundler::VersionRanges::NEq
+ def version(); end
+
+ def version=(_); end
+end
+
+class Bundler::VersionRanges::NEq
+ def self.[](*arg); end
+
+ def self.members(); end
+end
+
+class Bundler::VersionRanges::ReqR
+ def cover?(v); end
+
+ def empty?(); end
+
+ def left(); end
+
+ def left=(_); end
+
+ def right(); end
+
+ def right=(_); end
+
+ def single?(); end
+ INFINITY = ::T.let(nil, ::T.untyped)
+ UNIVERSAL = ::T.let(nil, ::T.untyped)
+ ZERO = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::VersionRanges::ReqR::Endpoint
+ def inclusive(); end
+
+ def inclusive=(_); end
+
+ def version(); end
+
+ def version=(_); end
+end
+
+class Bundler::VersionRanges::ReqR::Endpoint
+ def self.[](*arg); end
+
+ def self.members(); end
+end
+
+class Bundler::VersionRanges::ReqR
+ def self.[](*arg); end
+
+ def self.members(); end
+end
+
+module Bundler::VersionRanges
+ def self.empty?(ranges, neqs); end
+
+ def self.for(requirement); end
+
+ def self.for_many(requirements); end
+end
+
+module Bundler
+ def self.configure_gem_home_and_path(path=T.unsafe(nil)); end
+
+ def self.most_specific_locked_platform?(platform); end
+
+ def self.original_exec(*args); end
+
+ def self.original_system(*args); end
+
+ def self.preferred_gemfile_name(); end
+
+ def self.reset_settings_and_root!(); end
+
+ def self.self_manager(); end
+
+ def self.unbundled_env(); end
+
+ def self.unbundled_exec(*args); end
+
+ def self.unbundled_system(*args); end
+end
+
+module CGI::HtmlExtension
+ def a(href=T.unsafe(nil)); end
+
+ def base(href=T.unsafe(nil)); end
+
+ def blockquote(cite=T.unsafe(nil)); end
+
+ def caption(align=T.unsafe(nil)); end
+
+ def checkbox(name=T.unsafe(nil), value=T.unsafe(nil), checked=T.unsafe(nil)); end
+
+ def checkbox_group(name=T.unsafe(nil), *values); end
+
+ def file_field(name=T.unsafe(nil), size=T.unsafe(nil), maxlength=T.unsafe(nil)); end
+
+ def form(method=T.unsafe(nil), action=T.unsafe(nil), enctype=T.unsafe(nil)); end
+
+ def hidden(name=T.unsafe(nil), value=T.unsafe(nil)); end
+
+ def html(attributes=T.unsafe(nil)); end
+
+ def image_button(src=T.unsafe(nil), name=T.unsafe(nil), alt=T.unsafe(nil)); end
+
+ def img(src=T.unsafe(nil), alt=T.unsafe(nil), width=T.unsafe(nil), height=T.unsafe(nil)); end
+
+ def multipart_form(action=T.unsafe(nil), enctype=T.unsafe(nil)); end
+
+ def password_field(name=T.unsafe(nil), value=T.unsafe(nil), size=T.unsafe(nil), maxlength=T.unsafe(nil)); end
+
+ def popup_menu(name=T.unsafe(nil), *values); end
+
+ def radio_button(name=T.unsafe(nil), value=T.unsafe(nil), checked=T.unsafe(nil)); end
+
+ def radio_group(name=T.unsafe(nil), *values); end
+
+ def reset(value=T.unsafe(nil), name=T.unsafe(nil)); end
+
+ def scrolling_list(name=T.unsafe(nil), *values); end
+
+ def submit(value=T.unsafe(nil), name=T.unsafe(nil)); end
+
+ def text_field(name=T.unsafe(nil), value=T.unsafe(nil), size=T.unsafe(nil), maxlength=T.unsafe(nil)); end
+
+ def textarea(name=T.unsafe(nil), cols=T.unsafe(nil), rows=T.unsafe(nil)); end
+end
+
+module CGI::HtmlExtension
+end
+
+module Cane
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Cane::AbcCheck::RubyAst
+ METH_CHARS = ::T.let(nil, ::T.untyped)
+end
+
+class Cane::DocCheck
+ CLASS_REGEX = ::T.let(nil, ::T.untyped)
+ DESCRIPTION = ::T.let(nil, ::T.untyped)
+ MAGIC_COMMENT_REGEX = ::T.let(nil, ::T.untyped)
+ METHOD_REGEX = ::T.let(nil, ::T.untyped)
+ SINGLE_LINE_CLASS_REGEX = ::T.let(nil, ::T.untyped)
+end
+
+class Cane::ThresholdCheck
+ THRESHOLDS = ::T.let(nil, ::T.untyped)
+end
+
+class Class
+ def json_creatable?(); end
+end
+
+module CodeRay
+ CODERAY_PATH = ::T.let(nil, ::T.untyped)
+ TokenKinds = ::T.let(nil, ::T.untyped)
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class CodeRay::Encoders::Encoder
+ DEFAULT_OPTIONS = ::T.let(nil, ::T.untyped)
+end
+
+CodeRay::Encoders::Encoder::PLUGIN_HOST = CodeRay::Encoders
+
+class CodeRay::Encoders::HTML
+ DEFAULT_OPTIONS = ::T.let(nil, ::T.untyped)
+ FILE_EXTENSION = ::T.let(nil, ::T.untyped)
+ HTML_ESCAPE = ::T.let(nil, ::T.untyped)
+ HTML_ESCAPE_PATTERN = ::T.let(nil, ::T.untyped)
+ TOKEN_KIND_TO_INFO = ::T.let(nil, ::T.untyped)
+ TRANSPARENT_TOKEN_KINDS = ::T.let(nil, ::T.untyped)
+end
+
+class CodeRay::Encoders::HTML::CSS
+ CSS_CLASS_PATTERN = ::T.let(nil, ::T.untyped)
+end
+
+module CodeRay::Encoders::HTML::Output
+ DIV = ::T.let(nil, ::T.untyped)
+ PAGE = ::T.let(nil, ::T.untyped)
+ SPAN = ::T.let(nil, ::T.untyped)
+ TABLE = ::T.let(nil, ::T.untyped)
+end
+
+class CodeRay::Encoders::Terminal
+ TOKEN_COLORS = ::T.let(nil, ::T.untyped)
+end
+
+module CodeRay::FileType
+ TypeFromExt = ::T.let(nil, ::T.untyped)
+ TypeFromName = ::T.let(nil, ::T.untyped)
+ TypeFromShebang = ::T.let(nil, ::T.untyped)
+end
+
+module CodeRay::PluginHost
+ PLUGIN_HOSTS = ::T.let(nil, ::T.untyped)
+ PLUGIN_HOSTS_BY_ID = ::T.let(nil, ::T.untyped)
+end
+
+class CodeRay::Scanners::Java
+ CONSTANTS = ::T.let(nil, ::T.untyped)
+ DIRECTIVES = ::T.let(nil, ::T.untyped)
+ ESCAPE = ::T.let(nil, ::T.untyped)
+ IDENT = ::T.let(nil, ::T.untyped)
+ IDENT_KIND = ::T.let(nil, ::T.untyped)
+ KEYWORDS = ::T.let(nil, ::T.untyped)
+ MAGIC_VARIABLES = ::T.let(nil, ::T.untyped)
+ RESERVED = ::T.let(nil, ::T.untyped)
+ STRING_CONTENT_PATTERN = ::T.let(nil, ::T.untyped)
+ TYPES = ::T.let(nil, ::T.untyped)
+ UNICODE_ESCAPE = ::T.let(nil, ::T.untyped)
+end
+
+module CodeRay::Scanners::Java::BuiltinTypes
+ List = ::T.let(nil, ::T.untyped)
+end
+
+module CodeRay::Scanners::Ruby::Patterns
+ BINARY = ::T.let(nil, ::T.untyped)
+ CHARACTER = ::T.let(nil, ::T.untyped)
+ CLASS_VARIABLE = ::T.let(nil, ::T.untyped)
+ CONTROL_META_ESCAPE = ::T.let(nil, ::T.untyped)
+ DATA = ::T.let(nil, ::T.untyped)
+ DECIMAL = ::T.let(nil, ::T.untyped)
+ ESCAPE = ::T.let(nil, ::T.untyped)
+ EXPONENT = ::T.let(nil, ::T.untyped)
+ FANCY_STRING_INTERPRETED = ::T.let(nil, ::T.untyped)
+ FANCY_STRING_KIND = ::T.let(nil, ::T.untyped)
+ FANCY_STRING_START = ::T.let(nil, ::T.untyped)
+ FLOAT_OR_INT = ::T.let(nil, ::T.untyped)
+ FLOAT_SUFFIX = ::T.let(nil, ::T.untyped)
+ GLOBAL_VARIABLE = ::T.let(nil, ::T.untyped)
+ HEREDOC_OPEN = ::T.let(nil, ::T.untyped)
+ HEXADECIMAL = ::T.let(nil, ::T.untyped)
+ IDENT = ::T.let(nil, ::T.untyped)
+ IDENT_KIND = ::T.let(nil, ::T.untyped)
+ INSTANCE_VARIABLE = ::T.let(nil, ::T.untyped)
+ KEYWORDS = ::T.let(nil, ::T.untyped)
+ KEYWORDS_EXPECTING_VALUE = ::T.let(nil, ::T.untyped)
+ KEYWORD_NEW_STATE = ::T.let(nil, ::T.untyped)
+ METHOD_AFTER_DOT = ::T.let(nil, ::T.untyped)
+ METHOD_NAME = ::T.let(nil, ::T.untyped)
+ METHOD_NAME_EX = ::T.let(nil, ::T.untyped)
+ METHOD_NAME_OPERATOR = ::T.let(nil, ::T.untyped)
+ METHOD_NAME_OR_SYMBOL = ::T.let(nil, ::T.untyped)
+ METHOD_SUFFIX = ::T.let(nil, ::T.untyped)
+ NUMERIC = ::T.let(nil, ::T.untyped)
+ OBJECT_VARIABLE = ::T.let(nil, ::T.untyped)
+ OCTAL = ::T.let(nil, ::T.untyped)
+ PREDEFINED_CONSTANTS = ::T.let(nil, ::T.untyped)
+ PREFIX_VARIABLE = ::T.let(nil, ::T.untyped)
+ QUOTE_TO_TYPE = ::T.let(nil, ::T.untyped)
+ REGEXP_MODIFIERS = ::T.let(nil, ::T.untyped)
+ RUBYDOC = ::T.let(nil, ::T.untyped)
+ RUBYDOC_OR_DATA = ::T.let(nil, ::T.untyped)
+ SIMPLE_ESCAPE = ::T.let(nil, ::T.untyped)
+ SYMBOL = ::T.let(nil, ::T.untyped)
+ VALUE_FOLLOWS = ::T.let(nil, ::T.untyped)
+ VARIABLE = ::T.let(nil, ::T.untyped)
+end
+
+class CodeRay::Scanners::Ruby::StringState
+ CLOSING_PAREN = ::T.let(nil, ::T.untyped)
+ STRING_PATTERN = ::T.let(nil, ::T.untyped)
+end
+
+class CodeRay::Scanners::Scanner
+ DEFAULT_OPTIONS = ::T.let(nil, ::T.untyped)
+ KINDS_NOT_LOC = ::T.let(nil, ::T.untyped)
+ SCANNER_STATE_INFO = ::T.let(nil, ::T.untyped)
+ SCAN_ERROR_MESSAGE = ::T.let(nil, ::T.untyped)
+end
+
+CodeRay::Scanners::Scanner::PLUGIN_HOST = CodeRay::Scanners
+
+class CodeRay::Styles::Style
+ DEFAULT_OPTIONS = ::T.let(nil, ::T.untyped)
+end
+
+CodeRay::Styles::Style::PLUGIN_HOST = CodeRay::Styles
+
+module Commander
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Commander::HelpFormatter::Base
+ def initialize(runner); end
+
+ def render(); end
+
+ def render_command(command); end
+end
+
+class Commander::HelpFormatter::Base
+end
+
+class Commander::HelpFormatter::Terminal
+ def template(name); end
+end
+
+class Commander::HelpFormatter::Terminal
+end
+
+class Commander::HelpFormatter::TerminalCompact
+end
+
+class Commander::HelpFormatter::TerminalCompact
+end
+
+module Commander::UI::AskForClass
+ DEPRECATED_CONSTANTS = ::T.let(nil, ::T.untyped)
+end
+
+class DRb::DRbArray
+ def _dump(lv); end
+end
+
+class DRb::DRbArray
+ def self._load(s); end
+end
+
+class DRb::DRbConn
+ def alive?(); end
+
+ def close(); end
+
+ def initialize(remote_uri); end
+
+ def send_message(ref, msg_id, arg, block); end
+
+ def uri(); end
+end
+
+class DRb::DRbConn
+ def self.make_pool(); end
+
+ def self.open(remote_uri); end
+
+ def self.stop_pool(); end
+end
+
+class DRb::DRbMessage
+ def dump(obj, error=T.unsafe(nil)); end
+
+ def initialize(config); end
+
+ def load(soc); end
+
+ def recv_reply(stream); end
+
+ def recv_request(stream); end
+
+ def send_reply(stream, succ, result); end
+
+ def send_request(stream, ref, msg_id, arg, b); end
+end
+
+class DRb::DRbObject
+ def ==(other); end
+
+ def eql?(other); end
+
+ def initialize(obj, uri=T.unsafe(nil)); end
+end
+
+class DRb::DRbObject
+ def self.prepare_backtrace(uri, result); end
+
+ def self.with_friend(uri); end
+end
+
+module DRb::DRbProtocol
+ def self.auto_load(uri); end
+end
+
+class DRb::DRbRemoteError
+ def initialize(error); end
+end
+
+class DRb::DRbServer
+ def initialize(uri=T.unsafe(nil), front=T.unsafe(nil), config_or_acl=T.unsafe(nil)); end
+
+ def safe_level(); end
+end
+
+class DRb::DRbServer::InvokeMethod
+ include ::DRb::DRbServer::InvokeMethod18Mixin
+ def initialize(drb_server, client); end
+
+ def perform(); end
+end
+
+class DRb::DRbServer::InvokeMethod
+end
+
+module DRb::DRbServer::InvokeMethod18Mixin
+ def block_yield(x); end
+
+ def perform_with_block(); end
+end
+
+module DRb::DRbServer::InvokeMethod18Mixin
+end
+
+class DRb::DRbServer
+ def self.default_safe_level(level); end
+
+ def self.make_config(hash=T.unsafe(nil)); end
+end
+
+class DRb::DRbTCPSocket
+ def accept(); end
+
+ def alive?(); end
+
+ def close(); end
+
+ def initialize(uri, soc, config=T.unsafe(nil)); end
+
+ def peeraddr(); end
+
+ def recv_reply(); end
+
+ def recv_request(); end
+
+ def send_reply(succ, result); end
+
+ def send_request(ref, msg_id, arg, b); end
+
+ def set_sockopt(soc); end
+
+ def shutdown(); end
+
+ def stream(); end
+
+ def uri(); end
+end
+
+class DRb::DRbTCPSocket
+ def self.getservername(); end
+
+ def self.open(uri, config); end
+
+ def self.open_server(uri, config); end
+
+ def self.open_server_inaddr_any(host, port); end
+
+ def self.parse_uri(uri); end
+
+ def self.uri_option(uri, config); end
+end
+
+class DRb::DRbURIOption
+ def ==(other); end
+
+ def eql?(other); end
+
+ def initialize(option); end
+
+ def option(); end
+end
+
+class DRb::DRbURIOption
+end
+
+module DRb::DRbUndumped
+ def _dump(dummy); end
+end
+
+class DRb::DRbUnknown
+ def _dump(lv); end
+end
+
+class DRb::DRbUnknown
+ def self._load(s); end
+end
+
+class DRb::DRbUnknownError
+ def _dump(lv); end
+
+ def initialize(unknown); end
+end
+
+class DRb::DRbUnknownError
+ def self._load(s); end
+end
+
+class DRb::ThreadObject
+ include ::MonitorMixin
+ def _execute(); end
+
+ def alive?(); end
+
+ def initialize(&blk); end
+
+ def kill(); end
+
+ def method_missing(msg, *arg, &blk); end
+end
+
+class DRb::ThreadObject
+end
+
+module DRb
+ def self.mutex(); end
+end
+
+DRbIdConv = DRb::DRbIdConv
+
+DRbObject = DRb::DRbObject
+
+DRbUndumped = DRb::DRbUndumped
+
+class Date
+ def infinite?(); end
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Date::Infinity
+ def initialize(d=T.unsafe(nil)); end
+end
+
+class Delegator
+ RUBYGEMS_ACTIVATION_MONITOR = ::T.let(nil, ::T.untyped)
+end
+
+class DidYouMean::ClassNameChecker
+ def class_name(); end
+
+ def class_names(); end
+
+ def corrections(); end
+
+ def initialize(exception); end
+
+ def scopes(); end
+end
+
+class DidYouMean::CorrectElement
+ def call(names, element); end
+end
+
+class DidYouMean::CorrectElement
+end
+
+module DidYouMean::Correctable
+ def corrections(); end
+
+ def original_message(); end
+
+ def spell_checker(); end
+
+ def to_s(); end
+end
+
+module DidYouMean::Jaro
+ def self.distance(str1, str2); end
+end
+
+module DidYouMean::JaroWinkler
+ def self.distance(str1, str2); end
+end
+
+class DidYouMean::KeyErrorChecker
+ def corrections(); end
+
+ def initialize(key_error); end
+end
+
+class DidYouMean::KeyErrorChecker
+end
+
+module DidYouMean::Levenshtein
+ def self.distance(str1, str2); end
+
+ def self.min3(a, b, c); end
+end
+
+class DidYouMean::MethodNameChecker
+ def corrections(); end
+
+ def initialize(exception); end
+
+ def method_name(); end
+
+ def method_names(); end
+
+ def names_to_exclude(); end
+
+ def receiver(); end
+ RB_RESERVED_WORDS = ::T.let(nil, ::T.untyped)
+end
+
+class DidYouMean::NullChecker
+ def corrections(); end
+
+ def initialize(*arg); end
+end
+
+class DidYouMean::ParseDimensions
+ def call(); end
+
+ def initialize(dictionary, separator); end
+end
+
+class DidYouMean::ParseDimensions
+end
+
+class DidYouMean::PlainFormatter
+ def message_for(corrections); end
+end
+
+class DidYouMean::PlainFormatter
+end
+
+class DidYouMean::TreeSpellChecker
+ def augment(); end
+
+ def correct(input); end
+
+ def dictionary(); end
+
+ def dimensions(); end
+
+ def initialize(dictionary:, separator: T.unsafe(nil), augment: T.unsafe(nil)); end
+
+ def separator(); end
+end
+
+class DidYouMean::TreeSpellChecker
+end
+
+class DidYouMean::VariableNameChecker
+ def corrections(); end
+
+ def cvar_names(); end
+
+ def initialize(exception); end
+
+ def ivar_names(); end
+
+ def lvar_names(); end
+
+ def method_names(); end
+
+ def name(); end
+ RB_RESERVED_WORDS = ::T.let(nil, ::T.untyped)
+end
+
+module DidYouMean
+ def self.correct_error(error_class, spell_checker); end
+
+ def self.formatter(); end
+
+ def self.formatter=(formatter); end
+end
+
+class Dir
+ def children(); end
+
+ def each_child(); end
+end
+
+module Dir::Tmpname
+ UNUSABLE_CHARS = ::T.let(nil, ::T.untyped)
+end
+
+class Dir
+ def self.exists?(arg); end
+end
+
+class ERB
+ def def_method(mod, methodname, fname=T.unsafe(nil)); end
+
+ def def_module(methodname=T.unsafe(nil)); end
+end
+
+class ERB::Compiler::Scanner
+ DEFAULT_ETAGS = ::T.let(nil, ::T.untyped)
+ DEFAULT_STAGS = ::T.let(nil, ::T.untyped)
+end
+
+class Encoding
+ def _dump(*arg); end
+ CESU_8 = ::T.let(nil, ::T.untyped)
+end
+
+class Encoding::Converter
+ def initialize(*arg); end
+end
+
+class Encoding
+ def self._load(arg); end
+end
+
+module Enumerable
+ def sum(*arg); end
+end
+
+class Enumerator
+ def +(arg); end
+
+ def each_with_index(); end
+end
+
+class Enumerator::ArithmeticSequence
+ def begin(); end
+
+ def each(&blk); end
+
+ def end(); end
+
+ def exclude_end?(); end
+
+ def last(*arg); end
+
+ def step(); end
+end
+
+class Enumerator::ArithmeticSequence
+end
+
+class Enumerator::Chain
+end
+
+class Enumerator::Chain
+end
+
+class Enumerator::Generator
+ def each(*arg, &blk); end
+
+ def initialize(*arg); end
+end
+
+class Enumerator::Lazy
+ def eager(); end
+end
+
+class Enumerator::Producer
+ def each(&blk); end
+end
+
+class Enumerator::Producer
+end
+
+class Enumerator::Yielder
+ def to_proc(); end
+end
+
+class Enumerator
+ def self.produce(*arg); end
+end
+
+Errno::EAUTH = Errno::NOERROR
+
+Errno::EBADARCH = Errno::NOERROR
+
+Errno::EBADEXEC = Errno::NOERROR
+
+Errno::EBADMACHO = Errno::NOERROR
+
+Errno::EBADRPC = Errno::NOERROR
+
+Errno::ECAPMODE = Errno::NOERROR
+
+Errno::EDEADLOCK = Errno::EDEADLK
+
+Errno::EDEVERR = Errno::NOERROR
+
+Errno::EDOOFUS = Errno::NOERROR
+
+Errno::EFTYPE = Errno::NOERROR
+
+Errno::EIPSEC = Errno::NOERROR
+
+Errno::ELAST = Errno::NOERROR
+
+Errno::ENEEDAUTH = Errno::NOERROR
+
+Errno::ENOATTR = Errno::NOERROR
+
+Errno::ENOPOLICY = Errno::NOERROR
+
+Errno::ENOTCAPABLE = Errno::NOERROR
+
+class Errno::ENOTSUP
+ Errno = ::T.let(nil, ::T.untyped)
+end
+
+class Errno::ENOTSUP
+end
+
+Errno::EPROCLIM = Errno::NOERROR
+
+Errno::EPROCUNAVAIL = Errno::NOERROR
+
+Errno::EPROGMISMATCH = Errno::NOERROR
+
+Errno::EPROGUNAVAIL = Errno::NOERROR
+
+Errno::EPWROFF = Errno::NOERROR
+
+Errno::EQFULL = Errno::NOERROR
+
+Errno::ERPCMISMATCH = Errno::NOERROR
+
+Errno::ESHLIBVERS = Errno::NOERROR
+
+module Etc
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Etc::Group
+ def gid(); end
+
+ def gid=(_); end
+
+ def mem(); end
+
+ def mem=(_); end
+
+ def name(); end
+
+ def name=(_); end
+
+ def passwd(); end
+
+ def passwd=(_); end
+end
+
+class Etc::Group
+ extend ::Enumerable
+ def self.[](*arg); end
+
+ def self.each(&blk); end
+
+ def self.members(); end
+end
+
+class Etc::Passwd
+ def dir=(_); end
+
+ def gecos(); end
+
+ def gecos=(_); end
+
+ def gid=(_); end
+
+ def name=(_); end
+
+ def passwd=(_); end
+
+ def shell=(_); end
+
+ def uid=(_); end
+end
+
+class Etc::Passwd
+ extend ::Enumerable
+ def self.[](*arg); end
+
+ def self.each(&blk); end
+
+ def self.members(); end
+end
+
+class ExitCalledError
+end
+
+class ExitCalledError
+end
+
+class FalseClass
+ include ::JSON::Ext::Generator::GeneratorMethods::FalseClass
+end
+
+class Fiber
+ def initialize(*arg); end
+end
+
+class File
+ def self.absolute_path?(arg); end
+
+ def self.exists?(arg); end
+end
+
+FileList = Rake::FileList
+
+module FileUtils
+ include ::FileUtils::StreamUtils_
+ LN_SUPPORTED = ::T.let(nil, ::T.untyped)
+ RUBY = ::T.let(nil, ::T.untyped)
+end
+
+module FileUtils::DryRun
+ include ::FileUtils
+ include ::FileUtils::StreamUtils_
+ include ::FileUtils::LowMethods
+end
+
+module FileUtils::DryRun
+ extend ::FileUtils::DryRun
+ extend ::FileUtils
+ extend ::FileUtils::StreamUtils_
+ extend ::FileUtils::LowMethods
+end
+
+module FileUtils::NoWrite
+ include ::FileUtils
+ include ::FileUtils::StreamUtils_
+ include ::FileUtils::LowMethods
+end
+
+module FileUtils::NoWrite
+ extend ::FileUtils::NoWrite
+ extend ::FileUtils
+ extend ::FileUtils::StreamUtils_
+ extend ::FileUtils::LowMethods
+end
+
+module FileUtils::Verbose
+ include ::FileUtils
+ include ::FileUtils::StreamUtils_
+end
+
+module FileUtils::Verbose
+ extend ::FileUtils::Verbose
+ extend ::FileUtils
+ extend ::FileUtils::StreamUtils_
+end
+
+module FileUtils
+ extend ::FileUtils::StreamUtils_
+end
+
+class Float
+ include ::JSON::Ext::Generator::GeneratorMethods::Float
+end
+
+module Forwardable
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+module Forwardable
+ def self._compile_method(src, file, line); end
+
+ def self._delegator_method(obj, accessor, method, ali); end
+
+ def self._valid_method?(method); end
+
+ def self.debug(); end
+
+ def self.debug=(debug); end
+end
+
+class FrozenError
+ def receiver(); end
+end
+
+module GC
+ def garbage_collect(full_mark: T.unsafe(nil), immediate_mark: T.unsafe(nil), immediate_sweep: T.unsafe(nil)); end
+end
+
+module GC
+ def self.verify_transient_heap_internal_consistency(); end
+end
+
+module Gem
+ ConfigMap = ::T.let(nil, ::T.untyped)
+ RbConfigPriorities = ::T.let(nil, ::T.untyped)
+ RubyGemsVersion = ::T.let(nil, ::T.untyped)
+ UNTAINT = ::T.let(nil, ::T.untyped)
+end
+
+class Gem::Exception
+ extend ::Gem::Deprecate
+end
+
+class Gem::Ext::BuildError
+end
+
+class Gem::Ext::BuildError
+end
+
+class Gem::Ext::ExtConfBuilder
+end
+
+Gem::Ext::ExtConfBuilder::FileEntry = FileUtils::Entry_
+
+class Gem::Ext::ExtConfBuilder
+ def self.build(extension, dest_path, results, args=T.unsafe(nil), lib_dir=T.unsafe(nil)); end
+
+ def self.get_relative_path(path); end
+end
+
+Gem::Installer::ExtensionBuildError = Gem::Ext::BuildError
+
+class Gem::Installer::FakePackage
+ def copy_to(path); end
+
+ def data_mode(); end
+
+ def data_mode=(data_mode); end
+
+ def dir_mode(); end
+
+ def dir_mode=(dir_mode); end
+
+ def extract_files(destination_dir, pattern=T.unsafe(nil)); end
+
+ def initialize(spec); end
+
+ def prog_mode(); end
+
+ def prog_mode=(prog_mode); end
+
+ def spec(); end
+
+ def spec=(spec); end
+end
+
+class Gem::Installer::FakePackage
+end
+
+class Gem::PathSupport
+ def home(); end
+
+ def initialize(env); end
+
+ def path(); end
+
+ def spec_cache_dir(); end
+end
+
+class Gem::Platform
+ def self.match_gem?(platform, gem_name); end
+
+ def self.match_spec?(spec); end
+end
+
+class Gem::Request
+ extend ::Gem::UserInteraction
+ extend ::Gem::DefaultUserInteraction
+ extend ::Gem::Text
+end
+
+class Gem::Requirement
+ include ::Gem::Requirement::OrderIndependentComparison
+ include ::Gem::Requirement::CorrectHashForLambdaOperator
+end
+
+module Gem::Requirement::CorrectHashForLambdaOperator
+ def hash(); end
+end
+
+module Gem::Requirement::CorrectHashForLambdaOperator
+end
+
+module Gem::Requirement::OrderIndependentComparison
+ def ==(other); end
+
+ def _requirements_sorted?(); end
+
+ def _with_sorted_requirements(); end
+end
+
+module Gem::Requirement::OrderIndependentComparison
+end
+
+class Gem::Resolver::CurrentSet
+end
+
+class Gem::Resolver::CurrentSet
+end
+
+class Gem::Resolver::LocalSpecification
+end
+
+class Gem::Resolver::LocalSpecification
+end
+
+class Gem::Resolver::Molinillo::DependencyGraph::Log
+ def add_edge_no_circular(graph, origin, destination, requirement); end
+
+ def add_vertex(graph, name, payload, root); end
+
+ def delete_edge(graph, origin_name, destination_name, requirement); end
+
+ def detach_vertex_named(graph, name); end
+
+ def each(&blk); end
+
+ def pop!(graph); end
+
+ def reverse_each(); end
+
+ def rewind_to(graph, tag); end
+
+ def set_payload(graph, name, payload); end
+
+ def tag(graph, tag); end
+end
+
+class Gem::Resolver::Molinillo::DependencyGraph::Log
+ extend ::Enumerable
+end
+
+class Gem::RuntimeRequirementNotMetError
+ def suggestion(); end
+
+ def suggestion=(suggestion); end
+end
+
+class Gem::RuntimeRequirementNotMetError
+end
+
+class Gem::SpecFetcher
+ include ::Gem::UserInteraction
+ include ::Gem::DefaultUserInteraction
+ include ::Gem::Text
+ def available_specs(type); end
+
+ def detect(type=T.unsafe(nil)); end
+
+ def initialize(sources=T.unsafe(nil)); end
+
+ def latest_specs(); end
+
+ def prerelease_specs(); end
+
+ def search_for_dependency(dependency, matching_platform=T.unsafe(nil)); end
+
+ def sources(); end
+
+ def spec_for_dependency(dependency, matching_platform=T.unsafe(nil)); end
+
+ def specs(); end
+
+ def suggest_gems_from_name(gem_name, type=T.unsafe(nil)); end
+
+ def tuples_for(source, type, gracefully_ignore=T.unsafe(nil)); end
+end
+
+class Gem::SpecFetcher
+ def self.fetcher(); end
+
+ def self.fetcher=(fetcher); end
+end
+
+class Gem::Specification
+ include ::Bundler::MatchPlatform
+ include ::Bundler::GemHelpers
+ def deleted_gem?(); end
+
+ def removed_method_calls(); end
+
+ def to_ruby(); end
+ REMOVED_METHODS = ::T.let(nil, ::T.untyped)
+end
+
+class Gem::Specification
+ extend ::Gem::Deprecate
+ extend ::Enumerable
+end
+
+class Gem::SpecificationPolicy
+ include ::Gem::UserInteraction
+ include ::Gem::DefaultUserInteraction
+ include ::Gem::Text
+ def initialize(specification); end
+
+ def packaging(); end
+
+ def packaging=(packaging); end
+
+ def validate(strict=T.unsafe(nil)); end
+
+ def validate_dependencies(); end
+
+ def validate_metadata(); end
+
+ def validate_permissions(); end
+ HOMEPAGE_URI_PATTERN = ::T.let(nil, ::T.untyped)
+ LAZY = ::T.let(nil, ::T.untyped)
+ LAZY_PATTERN = ::T.let(nil, ::T.untyped)
+ METADATA_LINK_KEYS = ::T.let(nil, ::T.untyped)
+ SPECIAL_CHARACTERS = ::T.let(nil, ::T.untyped)
+ VALID_NAME_PATTERN = ::T.let(nil, ::T.untyped)
+ VALID_URI_PATTERN = ::T.let(nil, ::T.untyped)
+end
+
+class Gem::SpecificationPolicy
+end
+
+class Gem::StreamUI
+ def _deprecated_debug(statement); end
+end
+
+class Gem::StubSpecification
+ def build_extensions(); end
+
+ def extensions(); end
+
+ def initialize(filename, base_dir, gems_dir, default_gem); end
+
+ def missing_extensions?(); end
+
+ def valid?(); end
+end
+
+class Gem::StubSpecification::StubLine
+ def extensions(); end
+
+ def full_name(); end
+
+ def initialize(data, extensions); end
+
+ def name(); end
+
+ def platform(); end
+
+ def require_paths(); end
+
+ def version(); end
+end
+
+class Gem::StubSpecification
+ def self.default_gemspec_stub(filename, base_dir, gems_dir); end
+
+ def self.gemspec_stub(filename, base_dir, gems_dir); end
+end
+
+class Gem::UninstallError
+ def spec(); end
+
+ def spec=(spec); end
+end
+
+class Gem::UninstallError
+end
+
+Gem::UnsatisfiableDepedencyError = Gem::UnsatisfiableDependencyError
+
+Gem::Version::Requirement = Gem::Requirement
+
+module Gem
+ def self.activated_gem_paths(); end
+end
+
+class Hash
+ include ::JSON::Ext::Generator::GeneratorMethods::Hash
+ def deconstruct_keys(arg); end
+end
+
+class Hash
+ def self.create(initial_hash=T.unsafe(nil), &block); end
+
+ def self.ruby2_keywords_hash(arg); end
+
+ def self.ruby2_keywords_hash?(arg); end
+
+ def self.try_convert(arg); end
+end
+
+module Hashery
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Hashery::CRUDHash
+ NA = ::T.let(nil, ::T.untyped)
+end
+
+class Hashery::LRUHash
+ FETCH = ::T.let(nil, ::T.untyped)
+end
+
+class HighLine
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+module HighLine::BuiltinStyles
+ BASIC_COLORS = ::T.let(nil, ::T.untyped)
+ BLACK = ::T.let(nil, ::T.untyped)
+ BLACK_STYLE = ::T.let(nil, ::T.untyped)
+ BLINK = ::T.let(nil, ::T.untyped)
+ BLINK_STYLE = ::T.let(nil, ::T.untyped)
+ BLUE = ::T.let(nil, ::T.untyped)
+ BLUE_STYLE = ::T.let(nil, ::T.untyped)
+ BOLD = ::T.let(nil, ::T.untyped)
+ BOLD_STYLE = ::T.let(nil, ::T.untyped)
+ BRIGHT_BLACK = ::T.let(nil, ::T.untyped)
+ BRIGHT_BLACK_STYLE = ::T.let(nil, ::T.untyped)
+ BRIGHT_BLUE = ::T.let(nil, ::T.untyped)
+ BRIGHT_BLUE_STYLE = ::T.let(nil, ::T.untyped)
+ BRIGHT_CYAN = ::T.let(nil, ::T.untyped)
+ BRIGHT_CYAN_STYLE = ::T.let(nil, ::T.untyped)
+ BRIGHT_GRAY = ::T.let(nil, ::T.untyped)
+ BRIGHT_GRAY_STYLE = ::T.let(nil, ::T.untyped)
+ BRIGHT_GREEN = ::T.let(nil, ::T.untyped)
+ BRIGHT_GREEN_STYLE = ::T.let(nil, ::T.untyped)
+ BRIGHT_GREY = ::T.let(nil, ::T.untyped)
+ BRIGHT_GREY_STYLE = ::T.let(nil, ::T.untyped)
+ BRIGHT_MAGENTA = ::T.let(nil, ::T.untyped)
+ BRIGHT_MAGENTA_STYLE = ::T.let(nil, ::T.untyped)
+ BRIGHT_NONE = ::T.let(nil, ::T.untyped)
+ BRIGHT_NONE_STYLE = ::T.let(nil, ::T.untyped)
+ BRIGHT_RED = ::T.let(nil, ::T.untyped)
+ BRIGHT_RED_STYLE = ::T.let(nil, ::T.untyped)
+ BRIGHT_WHITE = ::T.let(nil, ::T.untyped)
+ BRIGHT_WHITE_STYLE = ::T.let(nil, ::T.untyped)
+ BRIGHT_YELLOW = ::T.let(nil, ::T.untyped)
+ BRIGHT_YELLOW_STYLE = ::T.let(nil, ::T.untyped)
+ CLEAR = ::T.let(nil, ::T.untyped)
+ CLEAR_STYLE = ::T.let(nil, ::T.untyped)
+ COLORS = ::T.let(nil, ::T.untyped)
+ COLOR_LIST = ::T.let(nil, ::T.untyped)
+ CONCEALED = ::T.let(nil, ::T.untyped)
+ CONCEALED_STYLE = ::T.let(nil, ::T.untyped)
+ CYAN = ::T.let(nil, ::T.untyped)
+ CYAN_STYLE = ::T.let(nil, ::T.untyped)
+ DARK = ::T.let(nil, ::T.untyped)
+ DARK_STYLE = ::T.let(nil, ::T.untyped)
+ ERASE_CHAR = ::T.let(nil, ::T.untyped)
+ ERASE_CHAR_STYLE = ::T.let(nil, ::T.untyped)
+ ERASE_LINE = ::T.let(nil, ::T.untyped)
+ ERASE_LINE_STYLE = ::T.let(nil, ::T.untyped)
+ GRAY = ::T.let(nil, ::T.untyped)
+ GRAY_STYLE = ::T.let(nil, ::T.untyped)
+ GREEN = ::T.let(nil, ::T.untyped)
+ GREEN_STYLE = ::T.let(nil, ::T.untyped)
+ GREY = ::T.let(nil, ::T.untyped)
+ GREY_STYLE = ::T.let(nil, ::T.untyped)
+ LIGHT_BLACK = ::T.let(nil, ::T.untyped)
+ LIGHT_BLACK_STYLE = ::T.let(nil, ::T.untyped)
+ LIGHT_BLUE = ::T.let(nil, ::T.untyped)
+ LIGHT_BLUE_STYLE = ::T.let(nil, ::T.untyped)
+ LIGHT_CYAN = ::T.let(nil, ::T.untyped)
+ LIGHT_CYAN_STYLE = ::T.let(nil, ::T.untyped)
+ LIGHT_GRAY = ::T.let(nil, ::T.untyped)
+ LIGHT_GRAY_STYLE = ::T.let(nil, ::T.untyped)
+ LIGHT_GREEN = ::T.let(nil, ::T.untyped)
+ LIGHT_GREEN_STYLE = ::T.let(nil, ::T.untyped)
+ LIGHT_GREY = ::T.let(nil, ::T.untyped)
+ LIGHT_GREY_STYLE = ::T.let(nil, ::T.untyped)
+ LIGHT_MAGENTA = ::T.let(nil, ::T.untyped)
+ LIGHT_MAGENTA_STYLE = ::T.let(nil, ::T.untyped)
+ LIGHT_NONE = ::T.let(nil, ::T.untyped)
+ LIGHT_NONE_STYLE = ::T.let(nil, ::T.untyped)
+ LIGHT_RED = ::T.let(nil, ::T.untyped)
+ LIGHT_RED_STYLE = ::T.let(nil, ::T.untyped)
+ LIGHT_WHITE = ::T.let(nil, ::T.untyped)
+ LIGHT_WHITE_STYLE = ::T.let(nil, ::T.untyped)
+ LIGHT_YELLOW = ::T.let(nil, ::T.untyped)
+ LIGHT_YELLOW_STYLE = ::T.let(nil, ::T.untyped)
+ MAGENTA = ::T.let(nil, ::T.untyped)
+ MAGENTA_STYLE = ::T.let(nil, ::T.untyped)
+ NONE = ::T.let(nil, ::T.untyped)
+ NONE_STYLE = ::T.let(nil, ::T.untyped)
+ ON_BLACK = ::T.let(nil, ::T.untyped)
+ ON_BLACK_STYLE = ::T.let(nil, ::T.untyped)
+ ON_BLUE = ::T.let(nil, ::T.untyped)
+ ON_BLUE_STYLE = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_BLACK = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_BLACK_STYLE = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_BLUE = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_BLUE_STYLE = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_CYAN = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_CYAN_STYLE = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_GRAY = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_GRAY_STYLE = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_GREEN = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_GREEN_STYLE = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_GREY = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_GREY_STYLE = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_MAGENTA = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_MAGENTA_STYLE = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_NONE = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_NONE_STYLE = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_RED = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_RED_STYLE = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_WHITE = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_WHITE_STYLE = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_YELLOW = ::T.let(nil, ::T.untyped)
+ ON_BRIGHT_YELLOW_STYLE = ::T.let(nil, ::T.untyped)
+ ON_CYAN = ::T.let(nil, ::T.untyped)
+ ON_CYAN_STYLE = ::T.let(nil, ::T.untyped)
+ ON_GRAY = ::T.let(nil, ::T.untyped)
+ ON_GRAY_STYLE = ::T.let(nil, ::T.untyped)
+ ON_GREEN = ::T.let(nil, ::T.untyped)
+ ON_GREEN_STYLE = ::T.let(nil, ::T.untyped)
+ ON_GREY = ::T.let(nil, ::T.untyped)
+ ON_GREY_STYLE = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_BLACK = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_BLACK_STYLE = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_BLUE = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_BLUE_STYLE = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_CYAN = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_CYAN_STYLE = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_GRAY = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_GRAY_STYLE = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_GREEN = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_GREEN_STYLE = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_GREY = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_GREY_STYLE = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_MAGENTA = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_MAGENTA_STYLE = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_NONE = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_NONE_STYLE = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_RED = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_RED_STYLE = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_WHITE = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_WHITE_STYLE = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_YELLOW = ::T.let(nil, ::T.untyped)
+ ON_LIGHT_YELLOW_STYLE = ::T.let(nil, ::T.untyped)
+ ON_MAGENTA = ::T.let(nil, ::T.untyped)
+ ON_MAGENTA_STYLE = ::T.let(nil, ::T.untyped)
+ ON_NONE = ::T.let(nil, ::T.untyped)
+ ON_NONE_STYLE = ::T.let(nil, ::T.untyped)
+ ON_RED = ::T.let(nil, ::T.untyped)
+ ON_RED_STYLE = ::T.let(nil, ::T.untyped)
+ ON_WHITE = ::T.let(nil, ::T.untyped)
+ ON_WHITE_STYLE = ::T.let(nil, ::T.untyped)
+ ON_YELLOW = ::T.let(nil, ::T.untyped)
+ ON_YELLOW_STYLE = ::T.let(nil, ::T.untyped)
+ RED = ::T.let(nil, ::T.untyped)
+ RED_STYLE = ::T.let(nil, ::T.untyped)
+ RESET = ::T.let(nil, ::T.untyped)
+ RESET_STYLE = ::T.let(nil, ::T.untyped)
+ REVERSE = ::T.let(nil, ::T.untyped)
+ REVERSE_STYLE = ::T.let(nil, ::T.untyped)
+ STYLES = ::T.let(nil, ::T.untyped)
+ STYLE_LIST = ::T.let(nil, ::T.untyped)
+ UNDERLINE = ::T.let(nil, ::T.untyped)
+ UNDERLINE_STYLE = ::T.let(nil, ::T.untyped)
+ UNDERSCORE = ::T.let(nil, ::T.untyped)
+ UNDERSCORE_STYLE = ::T.let(nil, ::T.untyped)
+ WHITE = ::T.let(nil, ::T.untyped)
+ WHITE_STYLE = ::T.let(nil, ::T.untyped)
+ YELLOW = ::T.let(nil, ::T.untyped)
+ YELLOW_STYLE = ::T.let(nil, ::T.untyped)
+end
+
+module HighLine::BuiltinStyles::ClassMethods
+ RGB_COLOR_PATTERN = ::T.let(nil, ::T.untyped)
+end
+
+class HighLine::SampleColorScheme
+ SAMPLE_SCHEME = ::T.let(nil, ::T.untyped)
+end
+
+module HighLine::StringExtensions
+ STYLE_METHOD_NAME_PATTERN = ::T.let(nil, ::T.untyped)
+end
+
+class IO
+ def beep(); end
+
+ def check_winsize_changed(); end
+
+ def clear_screen(); end
+
+ def console_mode(); end
+
+ def console_mode=(console_mode); end
+
+ def cooked(); end
+
+ def cooked!(); end
+
+ def cursor(); end
+
+ def cursor=(cursor); end
+
+ def cursor_down(arg); end
+
+ def cursor_left(arg); end
+
+ def cursor_right(arg); end
+
+ def cursor_up(arg); end
+
+ def echo=(echo); end
+
+ def echo?(); end
+
+ def erase_line(arg); end
+
+ def erase_screen(arg); end
+
+ def getch(*arg); end
+
+ def getpass(*arg); end
+
+ def goto(arg, arg1); end
+
+ def goto_column(arg); end
+
+ def iflush(); end
+
+ def ioflush(); end
+
+ def noecho(); end
+
+ def nonblock(*arg); end
+
+ def nonblock=(nonblock); end
+
+ def nonblock?(); end
+
+ def nread(); end
+
+ def oflush(); end
+
+ def pathconf(arg); end
+
+ def pressed?(); end
+
+ def raw(*arg); end
+
+ def raw!(*arg); end
+
+ def ready?(); end
+
+ def scroll_backward(arg); end
+
+ def scroll_forward(arg); end
+
+ def set_encoding_by_bom(); end
+
+ def wait(*arg); end
+
+ def wait_readable(*arg); end
+
+ def wait_writable(*arg); end
+
+ def winsize(); end
+
+ def winsize=(winsize); end
+end
+
+class IO::ConsoleMode
+ def echo=(echo); end
+
+ def raw(*arg); end
+
+ def raw!(*arg); end
+end
+
+class IO::ConsoleMode
+end
+
+IO::EWOULDBLOCKWaitReadable = IO::EAGAINWaitReadable
+
+IO::EWOULDBLOCKWaitWritable = IO::EAGAINWaitWritable
+
+class IO
+ def self.console(*arg); end
+
+ def self.console_size(); end
+
+ def self.default_console_size(); end
+end
+
+class IPAddr
+ def ==(other); end
+
+ def initialize(addr=T.unsafe(nil), family=T.unsafe(nil)); end
+end
+
+class Integer
+ include ::JSON::Ext::Generator::GeneratorMethods::Integer
+ def to_bn(); end
+end
+
+class JSON::Ext::Generator::State
+ def self.from_state(arg); end
+end
+
+class JSON::Ext::Parser
+ def initialize(*arg); end
+end
+
+JSON::Parser = JSON::Ext::Parser
+
+JSON::State = JSON::Ext::Generator::State
+
+JSON::UnparserError = JSON::GeneratorError
+
+module Kernel
+ def itself(); end
+
+ def object_id(); end
+
+ def pretty_inspect(); end
+
+ def then(); end
+
+ def yield_self(); end
+end
+
+module Kernel
+ def self.at_exit(); end
+end
+
+class KeyError
+ include ::DidYouMean::Correctable
+end
+
+module MethodSource
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+module MethodSource::CodeHelpers::IncompleteExpression
+ GENERIC_REGEXPS = ::T.let(nil, ::T.untyped)
+ RBX_ONLY_REGEXPS = ::T.let(nil, ::T.untyped)
+end
+
+class Monitor
+ def enter(); end
+
+ def exit(); end
+
+ def mon_check_owner(); end
+
+ def mon_enter(); end
+
+ def mon_exit(); end
+
+ def mon_locked?(); end
+
+ def mon_owned?(); end
+
+ def mon_synchronize(); end
+
+ def mon_try_enter(); end
+
+ def new_cond(); end
+
+ def synchronize(); end
+
+ def try_enter(); end
+
+ def try_mon_enter(); end
+
+ def wait_for_cond(arg, arg1); end
+end
+
+module MonitorMixin
+ def initialize(*args); end
+end
+
+class MonitorMixin::ConditionVariable
+ def initialize(monitor); end
+end
+
+class NameError
+ include ::DidYouMean::Correctable
+end
+
+class NilClass
+ include ::JSON::Ext::Generator::GeneratorMethods::NilClass
+end
+
+class NoMatchingPatternError
+end
+
+class NoMatchingPatternError
+end
+
+class Object
+ include ::JSON::Ext::Generator::GeneratorMethods::Object
+ include ::PP::ObjectMixin
+ def to_yaml(options=T.unsafe(nil)); end
+ ARGF = ::T.let(nil, ::T.untyped)
+ ARGV = ::T.let(nil, ::T.untyped)
+ CROSS_COMPILING = ::T.let(nil, ::T.untyped)
+ ENV = ::T.let(nil, ::T.untyped)
+ RUBY_COPYRIGHT = ::T.let(nil, ::T.untyped)
+ RUBY_DESCRIPTION = ::T.let(nil, ::T.untyped)
+ RUBY_ENGINE = ::T.let(nil, ::T.untyped)
+ RUBY_ENGINE_VERSION = ::T.let(nil, ::T.untyped)
+ RUBY_PATCHLEVEL = ::T.let(nil, ::T.untyped)
+ RUBY_PLATFORM = ::T.let(nil, ::T.untyped)
+ RUBY_RELEASE_DATE = ::T.let(nil, ::T.untyped)
+ RUBY_REVISION = ::T.let(nil, ::T.untyped)
+ RUBY_VERSION = ::T.let(nil, ::T.untyped)
+ STDERR = ::T.let(nil, ::T.untyped)
+ STDIN = ::T.let(nil, ::T.untyped)
+ STDOUT = ::T.let(nil, ::T.untyped)
+ TOPLEVEL_BINDING = ::T.let(nil, ::T.untyped)
+end
+
+class Object
+ def self.yaml_tag(url); end
+end
+
+class OpenSSL::ASN1::ASN1Data
+ def indefinite_length(); end
+
+ def indefinite_length=(indefinite_length); end
+end
+
+class OpenSSL::BN
+ def +@(); end
+
+ def -@(); end
+
+ def /(arg); end
+
+ def negative?(); end
+end
+
+module OpenSSL::KDF
+end
+
+class OpenSSL::KDF::KDFError
+end
+
+class OpenSSL::KDF::KDFError
+end
+
+module OpenSSL::KDF
+ def self.hkdf(*arg); end
+
+ def self.pbkdf2_hmac(*arg); end
+
+ def self.scrypt(*arg); end
+end
+
+class OpenSSL::OCSP::Request
+ def signed?(); end
+end
+
+OpenSSL::PKCS7::Signer = OpenSSL::PKCS7::SignerInfo
+
+class OpenSSL::PKey::EC
+ EXPLICIT_CURVE = ::T.let(nil, ::T.untyped)
+end
+
+class OpenSSL::PKey::EC::Point
+ def to_octet_string(arg); end
+end
+
+module OpenSSL::SSL
+ OP_ALLOW_NO_DHE_KEX = ::T.let(nil, ::T.untyped)
+ OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION = ::T.let(nil, ::T.untyped)
+ OP_CRYPTOPRO_TLSEXT_BUG = ::T.let(nil, ::T.untyped)
+ OP_LEGACY_SERVER_CONNECT = ::T.let(nil, ::T.untyped)
+ OP_NO_ENCRYPT_THEN_MAC = ::T.let(nil, ::T.untyped)
+ OP_NO_RENEGOTIATION = ::T.let(nil, ::T.untyped)
+ OP_NO_TLSv1_3 = ::T.let(nil, ::T.untyped)
+ OP_SAFARI_ECDHE_ECDSA_BUG = ::T.let(nil, ::T.untyped)
+ OP_TLSEXT_PADDING = ::T.let(nil, ::T.untyped)
+ SSL2_VERSION = ::T.let(nil, ::T.untyped)
+ SSL3_VERSION = ::T.let(nil, ::T.untyped)
+ TLS1_1_VERSION = ::T.let(nil, ::T.untyped)
+ TLS1_2_VERSION = ::T.let(nil, ::T.untyped)
+ TLS1_3_VERSION = ::T.let(nil, ::T.untyped)
+ TLS1_VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class OpenSSL::SSL::SSLContext
+ def alpn_protocols(); end
+
+ def alpn_protocols=(alpn_protocols); end
+
+ def alpn_select_cb(); end
+
+ def alpn_select_cb=(alpn_select_cb); end
+
+ def enable_fallback_scsv(); end
+
+ def max_version=(version); end
+
+ def min_version=(version); end
+ DEFAULT_TMP_DH_CALLBACK = ::T.let(nil, ::T.untyped)
+end
+
+class OpenSSL::SSL::SSLSocket
+ def alpn_protocol(); end
+
+ def tmp_key(); end
+end
+
+module OpenSSL::X509
+ V_ERR_CA_KEY_TOO_SMALL = ::T.let(nil, ::T.untyped)
+ V_ERR_CA_MD_TOO_WEAK = ::T.let(nil, ::T.untyped)
+ V_ERR_CRL_PATH_VALIDATION_ERROR = ::T.let(nil, ::T.untyped)
+ V_ERR_DANE_NO_MATCH = ::T.let(nil, ::T.untyped)
+ V_ERR_DIFFERENT_CRL_SCOPE = ::T.let(nil, ::T.untyped)
+ V_ERR_EE_KEY_TOO_SMALL = ::T.let(nil, ::T.untyped)
+ V_ERR_EMAIL_MISMATCH = ::T.let(nil, ::T.untyped)
+ V_ERR_EXCLUDED_VIOLATION = ::T.let(nil, ::T.untyped)
+ V_ERR_HOSTNAME_MISMATCH = ::T.let(nil, ::T.untyped)
+ V_ERR_INVALID_CALL = ::T.let(nil, ::T.untyped)
+ V_ERR_INVALID_EXTENSION = ::T.let(nil, ::T.untyped)
+ V_ERR_INVALID_NON_CA = ::T.let(nil, ::T.untyped)
+ V_ERR_INVALID_POLICY_EXTENSION = ::T.let(nil, ::T.untyped)
+ V_ERR_IP_ADDRESS_MISMATCH = ::T.let(nil, ::T.untyped)
+ V_ERR_KEYUSAGE_NO_CRL_SIGN = ::T.let(nil, ::T.untyped)
+ V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE = ::T.let(nil, ::T.untyped)
+ V_ERR_NO_EXPLICIT_POLICY = ::T.let(nil, ::T.untyped)
+ V_ERR_NO_VALID_SCTS = ::T.let(nil, ::T.untyped)
+ V_ERR_OCSP_CERT_UNKNOWN = ::T.let(nil, ::T.untyped)
+ V_ERR_OCSP_VERIFY_FAILED = ::T.let(nil, ::T.untyped)
+ V_ERR_OCSP_VERIFY_NEEDED = ::T.let(nil, ::T.untyped)
+ V_ERR_PATH_LOOP = ::T.let(nil, ::T.untyped)
+ V_ERR_PERMITTED_VIOLATION = ::T.let(nil, ::T.untyped)
+ V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED = ::T.let(nil, ::T.untyped)
+ V_ERR_PROXY_PATH_LENGTH_EXCEEDED = ::T.let(nil, ::T.untyped)
+ V_ERR_PROXY_SUBJECT_NAME_VIOLATION = ::T.let(nil, ::T.untyped)
+ V_ERR_STORE_LOOKUP = ::T.let(nil, ::T.untyped)
+ V_ERR_SUBTREE_MINMAX = ::T.let(nil, ::T.untyped)
+ V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 = ::T.let(nil, ::T.untyped)
+ V_ERR_SUITE_B_INVALID_ALGORITHM = ::T.let(nil, ::T.untyped)
+ V_ERR_SUITE_B_INVALID_CURVE = ::T.let(nil, ::T.untyped)
+ V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM = ::T.let(nil, ::T.untyped)
+ V_ERR_SUITE_B_INVALID_VERSION = ::T.let(nil, ::T.untyped)
+ V_ERR_SUITE_B_LOS_NOT_ALLOWED = ::T.let(nil, ::T.untyped)
+ V_ERR_UNABLE_TO_GET_CRL_ISSUER = ::T.let(nil, ::T.untyped)
+ V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION = ::T.let(nil, ::T.untyped)
+ V_ERR_UNHANDLED_CRITICAL_EXTENSION = ::T.let(nil, ::T.untyped)
+ V_ERR_UNNESTED_RESOURCE = ::T.let(nil, ::T.untyped)
+ V_ERR_UNSPECIFIED = ::T.let(nil, ::T.untyped)
+ V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX = ::T.let(nil, ::T.untyped)
+ V_ERR_UNSUPPORTED_CONSTRAINT_TYPE = ::T.let(nil, ::T.untyped)
+ V_ERR_UNSUPPORTED_EXTENSION_FEATURE = ::T.let(nil, ::T.untyped)
+ V_ERR_UNSUPPORTED_NAME_SYNTAX = ::T.let(nil, ::T.untyped)
+ V_FLAG_NO_CHECK_TIME = ::T.let(nil, ::T.untyped)
+ V_FLAG_PARTIAL_CHAIN = ::T.let(nil, ::T.untyped)
+ V_FLAG_SUITEB_128_LOS = ::T.let(nil, ::T.untyped)
+ V_FLAG_SUITEB_128_LOS_ONLY = ::T.let(nil, ::T.untyped)
+ V_FLAG_SUITEB_192_LOS = ::T.let(nil, ::T.untyped)
+ V_FLAG_TRUSTED_FIRST = ::T.let(nil, ::T.untyped)
+ V_FLAG_USE_CHECK_TIME = ::T.let(nil, ::T.untyped)
+end
+
+class OpenSSL::X509::Attribute
+ def ==(other); end
+end
+
+class OpenSSL::X509::CRL
+ def ==(other); end
+end
+
+class OpenSSL::X509::Extension
+ def ==(other); end
+end
+
+class OpenSSL::X509::Name
+ def to_utf8(); end
+end
+
+class OpenSSL::X509::Request
+ def ==(other); end
+end
+
+class OpenSSL::X509::Revoked
+ def ==(other); end
+
+ def to_der(); end
+end
+
+module OpenSSL
+ def self.fips_mode(); end
+end
+
+class OpenStruct
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class OptionParser
+ def additional_message(typ, opt); end
+end
+
+class OptionParser::List
+ def get_candidates(id); end
+end
+
+class OptionParser::ParseError
+ def additional(); end
+
+ def additional=(additional); end
+end
+
+class PDF::Reader::TransformationMatrix
+ def multiply_with_an_object!(m2); end
+end
+
+module Parallel
+ Stop = ::T.let(nil, ::T.untyped)
+ VERSION = ::T.let(nil, ::T.untyped)
+ Version = ::T.let(nil, ::T.untyped)
+end
+
+class Parallel::Break
+ def initialize(value=T.unsafe(nil)); end
+
+ def value(); end
+end
+
+class Parallel::UserInterruptHandler
+ INTERRUPT_SIGNAL = ::T.let(nil, ::T.untyped)
+end
+
+module Parallel
+ def self.flat_map(*args, &block); end
+end
+
+module Parlour
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Parlour::ConflictResolver
+ def resolve_conflicts(*args, &blk); end
+end
+
+class Parlour::ConflictResolver
+ extend ::T::Sig
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+module Parlour::Conversion
+end
+
+class Parlour::Conversion::Converter
+ def add_warning(*args, &blk); end
+
+ def warnings(*args, &blk); end
+end
+
+class Parlour::Conversion::Converter
+ extend ::T::Sig
+ extend ::T::Helpers
+ extend ::T::Private::Abstract::Hooks
+ extend ::T::InterfaceWrapper::Helpers
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::Conversion::RbiToRbs
+ def convert_all(*args, &blk); end
+
+ def convert_object(*args, &blk); end
+
+ def initialize(*args, &blk); end
+
+ def rbs_gen(*args, &blk); end
+end
+
+class Parlour::Conversion::RbiToRbs
+end
+
+module Parlour::Conversion
+end
+
+module Parlour::Debugging
+end
+
+module Parlour::Debugging::Tree
+ INDENT_SPACES = ::T.let(nil, ::T.untyped)
+end
+
+module Parlour::Debugging::Tree
+ extend ::T::Sig
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+ def self.begin(*args, &blk); end
+
+ def self.end(*args, &blk); end
+
+ def self.here(*args, &blk); end
+
+ def self.line_prefix(); end
+
+ def self.text_prefix(); end
+end
+
+module Parlour::Debugging
+ extend ::T::Sig
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+ def self.debug_mode=(*args, &blk); end
+
+ def self.debug_mode?(*args, &blk); end
+
+ def self.debug_puts(*args, &blk); end
+
+ def self.name_for_debug_caller(*args, &blk); end
+end
+
+class Parlour::DetachedRbiGenerator
+ def detached!(*args, &blk); end
+end
+
+class Parlour::DetachedRbiGenerator
+end
+
+class Parlour::DetachedRbsGenerator
+ def detached!(*args, &blk); end
+end
+
+class Parlour::DetachedRbsGenerator
+end
+
+class Parlour::Generator
+ def current_plugin(*args, &blk); end
+
+ def current_plugin=(current_plugin); end
+
+ def initialize(*args, &blk); end
+
+ def options(*args, &blk); end
+end
+
+class Parlour::Generator
+ extend ::T::Sig
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::Options
+ def break_params(*args, &blk); end
+
+ def indented(*args, &blk); end
+
+ def initialize(*args, &blk); end
+
+ def sort_namespaces(*args, &blk); end
+
+ def tab_size(*args, &blk); end
+end
+
+class Parlour::Options
+ extend ::T::Sig
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::ParseError
+ def buffer(*args, &blk); end
+
+ def initialize(buffer, range); end
+
+ def range(*args, &blk); end
+end
+
+class Parlour::ParseError
+ extend ::T::Sig
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::Plugin
+ def generate(*args, &blk); end
+
+ def initialize(*args, &blk); end
+
+ def strictness(*args, &blk); end
+
+ def strictness=(strictness); end
+end
+
+class Parlour::Plugin
+ extend ::T::Sig
+ extend ::T::Helpers
+ extend ::T::Private::Abstract::Hooks
+ extend ::T::InterfaceWrapper::Helpers
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+ def self.inherited(*args, &blk); end
+
+ def self.registered_plugins(*args, &blk); end
+
+ def self.run_plugins(*args, &blk); end
+end
+
+class Parlour::RbiGenerator
+ def initialize(**hash); end
+
+ def rbi(*args, &blk); end
+
+ def root(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::Arbitrary
+ def ==(*args, &blk); end
+
+ def code(*args, &blk); end
+
+ def code=(code); end
+end
+
+class Parlour::RbiGenerator::Arbitrary
+end
+
+class Parlour::RbiGenerator::Attribute
+ def class_attribute(*args, &blk); end
+
+ def kind(*args, &blk); end
+
+ def type(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::Attribute
+end
+
+class Parlour::RbiGenerator::ClassNamespace
+ def abstract(*args, &blk); end
+
+ def superclass(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::ClassNamespace
+end
+
+class Parlour::RbiGenerator::Constant
+ def ==(*args, &blk); end
+
+ def eigen_constant(); end
+
+ def value(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::Constant
+end
+
+class Parlour::RbiGenerator::EnumClassNamespace
+ def enums(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::EnumClassNamespace
+end
+
+class Parlour::RbiGenerator::Extend
+ def ==(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::Extend
+end
+
+class Parlour::RbiGenerator::Include
+ def ==(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::Include
+end
+
+class Parlour::RbiGenerator::Method
+ def ==(*args, &blk); end
+
+ def abstract(*args, &blk); end
+
+ def class_method(*args, &blk); end
+
+ def final(*args, &blk); end
+
+ def implementation(*args, &blk); end
+
+ def overridable(*args, &blk); end
+
+ def override(*args, &blk); end
+
+ def parameters(*args, &blk); end
+
+ def return_type(*args, &blk); end
+
+ def type_parameters(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::Method
+end
+
+class Parlour::RbiGenerator::ModuleNamespace
+ def abstract(*args, &blk); end
+
+ def interface(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::ModuleNamespace
+end
+
+class Parlour::RbiGenerator::Namespace
+ def add_comment_to_next_child(*args, &blk); end
+
+ def aliases(*args, &blk); end
+
+ def children(*args, &blk); end
+
+ def constants(*args, &blk); end
+
+ def create_arbitrary(code:, &block); end
+
+ def create_attr(*args, &blk); end
+
+ def create_attr_accessor(*args, &blk); end
+
+ def create_attr_reader(*args, &blk); end
+
+ def create_attr_writer(*args, &blk); end
+
+ def create_attribute(*args, &blk); end
+
+ def create_class(*args, &blk); end
+
+ def create_constant(*args, &blk); end
+
+ def create_enum_class(*args, &blk); end
+
+ def create_extend(*args, &blk); end
+
+ def create_extends(*args, &blk); end
+
+ def create_include(*args, &blk); end
+
+ def create_includes(*args, &blk); end
+
+ def create_method(*args, &blk); end
+
+ def create_module(*args, &blk); end
+
+ def create_struct_class(*args, &blk); end
+
+ def create_type_alias(*args, &blk); end
+
+ def extends(*args, &blk); end
+
+ def final(*args, &blk); end
+
+ def includes(*args, &blk); end
+
+ def path(*args, &blk); end
+
+ def sealed(*args, &blk); end
+
+ def type_aliases(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::Namespace
+end
+
+Parlour::RbiGenerator::Options = Parlour::Options
+
+class Parlour::RbiGenerator::Parameter
+ def ==(*args, &blk); end
+
+ def default(*args, &blk); end
+
+ def generalize_from_rbi!(*args, &blk); end
+
+ def initialize(*args, &blk); end
+
+ def kind(*args, &blk); end
+
+ def name(*args, &blk); end
+
+ def name_without_kind(*args, &blk); end
+
+ def to_def_param(*args, &blk); end
+
+ def to_sig_param(*args, &blk); end
+
+ def type(*args, &blk); end
+ PREFIXES = ::T.let(nil, ::T.untyped)
+end
+
+class Parlour::RbiGenerator::Parameter
+ extend ::T::Sig
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::RbiGenerator::RbiObject
+ def generalize_from_rbi!(*args, &blk); end
+
+ def generate_rbi(*args, &blk); end
+
+ def generator(*args, &blk); end
+
+ def merge_into_self(*args, &blk); end
+
+ def mergeable?(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::RbiObject
+end
+
+class Parlour::RbiGenerator::StructClassNamespace
+ def props(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::StructClassNamespace
+end
+
+class Parlour::RbiGenerator::StructProp
+ def ==(*args, &blk); end
+
+ def array(*args, &blk); end
+
+ def default(*args, &blk); end
+
+ def dont_store(*args, &blk); end
+
+ def enum(*args, &blk); end
+
+ def factory(*args, &blk); end
+
+ def foreign(*args, &blk); end
+
+ def generalize_from_rbi!(*args, &blk); end
+
+ def immutable(*args, &blk); end
+
+ def initialize(*args, &blk); end
+
+ def name(*args, &blk); end
+
+ def optional(*args, &blk); end
+
+ def override(*args, &blk); end
+
+ def redaction(*args, &blk); end
+
+ def to_prop_call(*args, &blk); end
+
+ def type(*args, &blk); end
+ EXTRA_PROPERTIES = ::T.let(nil, ::T.untyped)
+end
+
+class Parlour::RbiGenerator::StructProp
+ extend ::T::Sig
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::RbiGenerator::TypeAlias
+ def ==(*args, &blk); end
+
+ def type(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::TypeAlias
+end
+
+class Parlour::RbiGenerator
+end
+
+class Parlour::RbsGenerator
+ def initialize(**hash); end
+
+ def rbs(*args, &blk); end
+
+ def root(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Arbitrary
+ def ==(*args, &blk); end
+
+ def code(*args, &blk); end
+
+ def code=(code); end
+end
+
+class Parlour::RbsGenerator::Arbitrary
+end
+
+class Parlour::RbsGenerator::Attribute
+ def kind(*args, &blk); end
+
+ def type(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Attribute
+end
+
+class Parlour::RbsGenerator::Block
+ def ==(*args, &blk); end
+
+ def generate_rbs(*args, &blk); end
+
+ def initialize(*args, &blk); end
+
+ def required(*args, &blk); end
+
+ def type(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Block
+ extend ::T::Sig
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::RbsGenerator::ClassNamespace
+ def superclass(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::ClassNamespace
+end
+
+class Parlour::RbsGenerator::Constant
+ def ==(*args, &blk); end
+
+ def type(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Constant
+end
+
+class Parlour::RbsGenerator::Extend
+ def ==(*args, &blk); end
+
+ def type(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Extend
+end
+
+class Parlour::RbsGenerator::Include
+ def ==(*args, &blk); end
+
+ def type(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Include
+end
+
+class Parlour::RbsGenerator::InterfaceNamespace
+end
+
+class Parlour::RbsGenerator::InterfaceNamespace
+end
+
+class Parlour::RbsGenerator::Method
+ def ==(*args, &blk); end
+
+ def class_method(*args, &blk); end
+
+ def signatures(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Method
+end
+
+class Parlour::RbsGenerator::MethodSignature
+ def ==(*args, &blk); end
+
+ def block(*args, &blk); end
+
+ def generate_rbs(*args, &blk); end
+
+ def initialize(*args, &blk); end
+
+ def parameters(*args, &blk); end
+
+ def return_type(*args, &blk); end
+
+ def type_parameters(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::MethodSignature
+ extend ::T::Sig
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::RbsGenerator::ModuleNamespace
+end
+
+class Parlour::RbsGenerator::ModuleNamespace
+end
+
+class Parlour::RbsGenerator::Namespace
+ def add_comment_to_next_child(*args, &blk); end
+
+ def aliases(*args, &blk); end
+
+ def children(*args, &blk); end
+
+ def constants(*args, &blk); end
+
+ def create_arbitrary(code:, &block); end
+
+ def create_attr(*args, &blk); end
+
+ def create_attr_accessor(*args, &blk); end
+
+ def create_attr_reader(*args, &blk); end
+
+ def create_attr_writer(*args, &blk); end
+
+ def create_attribute(*args, &blk); end
+
+ def create_class(*args, &blk); end
+
+ def create_constant(*args, &blk); end
+
+ def create_extend(*args, &blk); end
+
+ def create_extends(*args, &blk); end
+
+ def create_include(*args, &blk); end
+
+ def create_includes(*args, &blk); end
+
+ def create_interface(*args, &blk); end
+
+ def create_method(*args, &blk); end
+
+ def create_module(*args, &blk); end
+
+ def create_type_alias(*args, &blk); end
+
+ def extends(*args, &blk); end
+
+ def includes(*args, &blk); end
+
+ def path(*args, &blk); end
+
+ def type_aliases(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Namespace
+end
+
+class Parlour::RbsGenerator::Parameter
+ def ==(*args, &blk); end
+
+ def initialize(*args, &blk); end
+
+ def kind(*args, &blk); end
+
+ def name(*args, &blk); end
+
+ def name_without_kind(*args, &blk); end
+
+ def required(*args, &blk); end
+
+ def to_rbs_param(*args, &blk); end
+
+ def type(*args, &blk); end
+ PREFIXES = ::T.let(nil, ::T.untyped)
+ RBS_KEYWORDS = ::T.let(nil, ::T.untyped)
+end
+
+class Parlour::RbsGenerator::Parameter
+ extend ::T::Sig
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::RbsGenerator::RbsObject
+ def generate_rbs(*args, &blk); end
+
+ def generator(*args, &blk); end
+
+ def merge_into_self(*args, &blk); end
+
+ def mergeable?(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::RbsObject
+end
+
+class Parlour::RbsGenerator::TypeAlias
+ def ==(*args, &blk); end
+
+ def type(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::TypeAlias
+end
+
+class Parlour::RbsGenerator
+end
+
+module Parlour::TypeLoader
+end
+
+module Parlour::TypeLoader
+ extend ::T::Sig
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+ def self.load_file(*args, &blk); end
+
+ def self.load_project(*args, &blk); end
+
+ def self.load_source(*args, &blk); end
+end
+
+class Parlour::TypeParser
+ def ast(*args, &blk); end
+
+ def ast=(ast); end
+
+ def body_has_modifier?(*args, &blk); end
+
+ def body_includes_and_extends(*args, &blk); end
+
+ def constant_names(*args, &blk); end
+
+ def generator(*args, &blk); end
+
+ def generator=(generator); end
+
+ def initialize(*args, &blk); end
+
+ def node_to_s(*args, &blk); end
+
+ def parse_all(*args, &blk); end
+
+ def parse_err(*args, &blk); end
+
+ def parse_method_into_methods(*args, &blk); end
+
+ def parse_node_to_type(*args, &blk); end
+
+ def parse_path_to_object(*args, &blk); end
+
+ def parse_sig_into_methods(*args, &blk); end
+
+ def parse_sig_into_sig(*args, &blk); end
+
+ def previous_sibling_sig_node?(*args, &blk); end
+
+ def sig_node?(*args, &blk); end
+
+ def unknown_node_errors(*args, &blk); end
+
+ def warning(*args, &blk); end
+
+ def zip_by(*args, &blk); end
+end
+
+class Parlour::TypeParser::IntermediateSig
+ def abstract(); end
+
+ def abstract=(val); end
+
+ def final(); end
+
+ def final=(val); end
+
+ def initialize(*args, &blk); end
+
+ def overridable(); end
+
+ def overridable=(val); end
+
+ def override(); end
+
+ def override=(val); end
+
+ def params(); end
+
+ def params=(val); end
+
+ def return_type(); end
+
+ def return_type=(val); end
+
+ def type_parameters(); end
+
+ def type_parameters=(val); end
+end
+
+class Parlour::TypeParser::IntermediateSig
+ def self.inherited(s); end
+end
+
+class Parlour::TypeParser::NodePath
+ def child(*args, &blk); end
+
+ def indices(*args, &blk); end
+
+ def initialize(*args, &blk); end
+
+ def parent(*args, &blk); end
+
+ def sibling(*args, &blk); end
+
+ def traverse(*args, &blk); end
+end
+
+class Parlour::TypeParser::NodePath
+ extend ::T::Sig
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::TypeParser
+ extend ::T::Sig
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+ def self.from_source(*args, &blk); end
+
+ def self.parse_single_type(*args, &blk); end
+end
+
+class Parlour::TypedObject
+ def add_comment(*args, &blk); end
+
+ def add_comments(*args, &blk); end
+
+ def comments(*args, &blk); end
+
+ def describe(*args, &blk); end
+
+ def generate_comments(*args, &blk); end
+
+ def generated_by(*args, &blk); end
+
+ def initialize(*args, &blk); end
+
+ def name(*args, &blk); end
+end
+
+class Parlour::TypedObject
+ extend ::T::Sig
+ extend ::T::Helpers
+ extend ::T::Private::Abstract::Hooks
+ extend ::T::InterfaceWrapper::Helpers
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+module Parlour::Types
+ TypeLike = ::T.let(nil, ::T.untyped)
+end
+
+class Parlour::Types::Array
+ def ==(*args, &blk); end
+end
+
+class Parlour::Types::Array
+end
+
+class Parlour::Types::Boolean
+ def ==(*args, &blk); end
+end
+
+class Parlour::Types::Boolean
+end
+
+class Parlour::Types::Class
+ def ==(*args, &blk); end
+
+ def type(*args, &blk); end
+end
+
+class Parlour::Types::Class
+end
+
+class Parlour::Types::Enumerable
+ def ==(*args, &blk); end
+end
+
+class Parlour::Types::Enumerable
+end
+
+class Parlour::Types::Enumerator
+ def ==(*args, &blk); end
+end
+
+class Parlour::Types::Enumerator
+end
+
+class Parlour::Types::Generic
+ def ==(*args, &blk); end
+
+ def type(*args, &blk); end
+
+ def type_params(*args, &blk); end
+end
+
+class Parlour::Types::Generic
+end
+
+class Parlour::Types::Hash
+ def ==(*args, &blk); end
+
+ def key(*args, &blk); end
+
+ def value(*args, &blk); end
+end
+
+class Parlour::Types::Hash
+end
+
+class Parlour::Types::Intersection
+ def ==(*args, &blk); end
+
+ def types(*args, &blk); end
+end
+
+class Parlour::Types::Intersection
+end
+
+class Parlour::Types::Nilable
+ def ==(*args, &blk); end
+
+ def type(*args, &blk); end
+end
+
+class Parlour::Types::Nilable
+end
+
+class Parlour::Types::Proc
+ def ==(*args, &blk); end
+
+ def parameters(*args, &blk); end
+
+ def return_type(*args, &blk); end
+end
+
+class Parlour::Types::Proc::Parameter
+ def ==(*args, &blk); end
+
+ def default(*args, &blk); end
+
+ def initialize(*args, &blk); end
+
+ def name(*args, &blk); end
+
+ def type(*args, &blk); end
+end
+
+class Parlour::Types::Proc::Parameter
+ extend ::T::Sig
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::Types::Proc
+end
+
+class Parlour::Types::Range
+ def ==(*args, &blk); end
+end
+
+class Parlour::Types::Range
+end
+
+class Parlour::Types::Raw
+ def ==(*args, &blk); end
+
+ def str(*args, &blk); end
+end
+
+class Parlour::Types::Raw
+end
+
+class Parlour::Types::Record
+ def ==(*args, &blk); end
+
+ def keys_to_types(*args, &blk); end
+end
+
+class Parlour::Types::Record
+end
+
+class Parlour::Types::Self
+ def ==(*args, &blk); end
+end
+
+class Parlour::Types::Self
+end
+
+class Parlour::Types::Set
+ def ==(*args, &blk); end
+end
+
+class Parlour::Types::Set
+end
+
+class Parlour::Types::SingleElementCollection
+ def collection_name(*args, &blk); end
+
+ def element(*args, &blk); end
+end
+
+class Parlour::Types::SingleElementCollection
+end
+
+class Parlour::Types::Tuple
+ def ==(*args, &blk); end
+
+ def types(*args, &blk); end
+end
+
+class Parlour::Types::Tuple
+end
+
+class Parlour::Types::Type
+ def describe(*args, &blk); end
+
+ def generate_rbi(*args, &blk); end
+
+ def generate_rbs(*args, &blk); end
+
+ def initialize(*args, &blk); end
+
+ def to_type(*args, &blk); end
+end
+
+class Parlour::Types::Type
+ extend ::T::Sig
+ extend ::T::Helpers
+ extend ::T::Private::Abstract::Hooks
+ extend ::T::InterfaceWrapper::Helpers
+ extend ::T::Private::Methods::MethodHooks
+ extend ::T::Private::Methods::SingletonMethodHooks
+ def self.to_type(*args, &blk); end
+end
+
+class Parlour::Types::Union
+ def ==(*args, &blk); end
+
+ def types(*args, &blk); end
+end
+
+class Parlour::Types::Union
+end
+
+class Parlour::Types::Untyped
+ def ==(*args, &blk); end
+end
+
+class Parlour::Types::Untyped
+end
+
+module Parlour::Types
+end
+
+module Parlour
+end
+
+ParseError = Racc::ParseError
+
+module Parser
+ MESSAGES = ::T.let(nil, ::T.untyped)
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Builders::Default
+ def pair_label(key_t); end
+end
+
+class Parser::Context
+ def in_argdef(); end
+
+ def in_argdef=(in_argdef); end
+
+ def in_block(); end
+
+ def in_block=(in_block); end
+
+ def in_class(); end
+
+ def in_class=(in_class); end
+
+ def in_def(); end
+
+ def in_def=(in_def); end
+
+ def in_defined(); end
+
+ def in_defined=(in_defined); end
+
+ def in_kwarg(); end
+
+ def in_kwarg=(in_kwarg); end
+
+ def in_lambda(); end
+
+ def in_lambda=(in_lambda); end
+ FLAGS = ::T.let(nil, ::T.untyped)
+end
+
+Parser::CurrentRuby = Parser::Ruby27
+
+class Parser::Diagnostic
+ LEVELS = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Lexer
+ ESCAPES = ::T.let(nil, ::T.untyped)
+ KEYWORDS = ::T.let(nil, ::T.untyped)
+ KEYWORDS_BEGIN = ::T.let(nil, ::T.untyped)
+ LEX_STATES = ::T.let(nil, ::T.untyped)
+ PUNCTUATION = ::T.let(nil, ::T.untyped)
+ PUNCTUATION_BEGIN = ::T.let(nil, ::T.untyped)
+ REGEXP_META_CHARACTERS = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Lexer::Dedenter
+ TAB_WIDTH = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Lexer::Literal
+ DELIMITERS = ::T.let(nil, ::T.untyped)
+ TYPES = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::MaxNumparamStack
+ ORDINARY_PARAMS = ::T.let(nil, ::T.untyped)
+end
+
+module Parser::Meta
+ NODE_TYPES = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Rewriter
+ DEPRECATION_WARNING = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Ruby24
+ def _reduce_335(val, _values, result); end
+
+ def _reduce_336(val, _values, result); end
+
+ def _reduce_339(val, _values, result); end
+
+ def _reduce_345(val, _values, result); end
+
+ def _reduce_350(val, _values, result); end
+
+ def _reduce_370(val, _values, result); end
+
+ def _reduce_379(val, _values, result); end
+
+ def _reduce_390(val, _values, result); end
+
+ def _reduce_426(val, _values, result); end
+
+ def _reduce_430(val, _values, result); end
+
+ def _reduce_431(val, _values, result); end
+
+ def _reduce_436(val, _values, result); end
+
+ def _reduce_474(val, _values, result); end
+
+ def _reduce_532(val, _values, result); end
+
+ def _reduce_548(val, _values, result); end
+
+ def _reduce_549(val, _values, result); end
+
+ def _reduce_558(val, _values, result); end
+
+ def _reduce_559(val, _values, result); end
+
+ def _reduce_562(val, _values, result); end
+
+ def _reduce_563(val, _values, result); end
+
+ def _reduce_567(val, _values, result); end
+
+ def _reduce_570(val, _values, result); end
+
+ def _reduce_577(val, _values, result); end
+
+ def _reduce_578(val, _values, result); end
+
+ def _reduce_591(val, _values, result); end
+
+ def _reduce_592(val, _values, result); end
+
+ def _reduce_597(val, _values, result); end
+
+ def _reduce_598(val, _values, result); end
+
+ def _reduce_602(val, _values, result); end
+
+ def _reduce_606(val, _values, result); end
+
+ def local_pop(); end
+
+ def local_push(); end
+ Racc_arg = ::T.let(nil, ::T.untyped)
+ Racc_debug_parser = ::T.let(nil, ::T.untyped)
+ Racc_token_to_s_table = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Ruby27
+ def _reduce_345(val, _values, result); end
+
+ def _reduce_346(val, _values, result); end
+
+ def _reduce_350(val, _values, result); end
+
+ def _reduce_354(val, _values, result); end
+
+ def _reduce_360(val, _values, result); end
+
+ def _reduce_379(val, _values, result); end
+
+ def _reduce_388(val, _values, result); end
+
+ def _reduce_398(val, _values, result); end
+
+ def _reduce_434(val, _values, result); end
+
+ def _reduce_439(val, _values, result); end
+
+ def _reduce_443(val, _values, result); end
+
+ def _reduce_448(val, _values, result); end
+
+ def _reduce_450(val, _values, result); end
+
+ def _reduce_452(val, _values, result); end
+
+ def _reduce_477(val, _values, result); end
+
+ def _reduce_486(val, _values, result); end
+
+ def _reduce_502(val, _values, result); end
+
+ def _reduce_507(val, _values, result); end
+
+ def _reduce_508(val, _values, result); end
+
+ def _reduce_509(val, _values, result); end
+
+ def _reduce_513(val, _values, result); end
+
+ def _reduce_514(val, _values, result); end
+
+ def _reduce_531(val, _values, result); end
+
+ def _reduce_532(val, _values, result); end
+
+ def _reduce_536(val, _values, result); end
+
+ def _reduce_538(val, _values, result); end
+
+ def _reduce_574(val, _values, result); end
+
+ def _reduce_575(val, _values, result); end
+
+ def _reduce_576(val, _values, result); end
+
+ def _reduce_638(val, _values, result); end
+
+ def _reduce_654(val, _values, result); end
+
+ def _reduce_655(val, _values, result); end
+
+ def _reduce_665(val, _values, result); end
+
+ def _reduce_666(val, _values, result); end
+
+ def _reduce_670(val, _values, result); end
+
+ def _reduce_674(val, _values, result); end
+
+ def _reduce_684(val, _values, result); end
+
+ def _reduce_685(val, _values, result); end
+
+ def _reduce_686(val, _values, result); end
+
+ def _reduce_699(val, _values, result); end
+
+ def _reduce_700(val, _values, result); end
+
+ def _reduce_705(val, _values, result); end
+
+ def _reduce_706(val, _values, result); end
+
+ def _reduce_707(val, _values, result); end
+
+ def _reduce_711(val, _values, result); end
+
+ def _reduce_715(val, _values, result); end
+
+ def local_pop(); end
+
+ def local_push(); end
+
+ def try_declare_numparam(node); end
+ Racc_arg = ::T.let(nil, ::T.untyped)
+ Racc_debug_parser = ::T.let(nil, ::T.untyped)
+ Racc_token_to_s_table = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Source::Buffer
+ ENCODING_RE = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Source::Comment::Associator
+ MAGIC_COMMENT_RE = ::T.let(nil, ::T.untyped)
+ POSTFIX_TYPES = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Source::Rewriter
+ DEPRECATION_WARNING = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Source::TreeRewriter
+ ACTIONS = ::T.let(nil, ::T.untyped)
+ DEPRECATION_WARNING = ::T.let(nil, ::T.untyped)
+ POLICY_TO_LEVEL = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::StaticEnvironment
+ def declare_anonymous_blockarg(); end
+
+ def declared_anonymous_blockarg?(); end
+ ANONYMOUS_BLOCKARG = ::T.let(nil, ::T.untyped)
+ FORWARD_ARGS = ::T.let(nil, ::T.untyped)
+end
+
+class Proc
+ def <<(arg); end
+
+ def >>(arg); end
+
+ def clone(); end
+end
+
+module Process
+ CLOCK_TAI = ::T.let(nil, ::T.untyped)
+end
+
+class Pry
+ BINDING_METHOD_IMPL = ::T.let(nil, ::T.untyped)
+ Commands = ::T.let(nil, ::T.untyped)
+ EMPTY_COMPLETIONS = ::T.let(nil, ::T.untyped)
+ HAS_SAFE_LEVEL = ::T.let(nil, ::T.untyped)
+ LOCAL_RC_FILE = ::T.let(nil, ::T.untyped)
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::BasicObject
+ ENV = ::T.let(nil, ::T.untyped)
+end
+
+Pry::BasicObject::Dir = Dir
+
+Pry::BasicObject::File = File
+
+Pry::BasicObject::Kernel = Kernel
+
+Pry::BasicObject::LoadError = LoadError
+
+Pry::BasicObject::Pry = Pry
+
+class Pry::Code
+ extend ::MethodSource::CodeHelpers
+end
+
+class Pry::CodeFile
+ DEFAULT_EXT = ::T.let(nil, ::T.untyped)
+ EXTENSIONS = ::T.let(nil, ::T.untyped)
+ FILES = ::T.let(nil, ::T.untyped)
+ INITIAL_PWD = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Command
+ VOID_VALUE = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Command::Ls
+ DEFAULT_OPTIONS = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Command::Ls::Constants
+ DEPRECATED_CONSTANTS = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Command::Ls::Globals
+ BUILTIN_GLOBALS = ::T.let(nil, ::T.untyped)
+ PSEUDO_GLOBALS = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Command::Wtf
+ RUBY_FRAME_PATTERN = ::T.let(nil, ::T.untyped)
+end
+
+module Pry::Helpers::DocumentationHelpers
+ YARD_TAGS = ::T.let(nil, ::T.untyped)
+end
+
+module Pry::Helpers::Text
+ COLORS = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Indent
+ IGNORE_TOKENS = ::T.let(nil, ::T.untyped)
+ MIDWAY_TOKENS = ::T.let(nil, ::T.untyped)
+ OPEN_TOKENS = ::T.let(nil, ::T.untyped)
+ OPTIONAL_DO_TOKENS = ::T.let(nil, ::T.untyped)
+ SINGLELINE_TOKENS = ::T.let(nil, ::T.untyped)
+ SPACES = ::T.let(nil, ::T.untyped)
+ STATEMENT_END_TOKENS = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::InputCompleter
+ ARRAY_REGEXP = ::T.let(nil, ::T.untyped)
+ CONSTANT_OR_METHOD_REGEXP = ::T.let(nil, ::T.untyped)
+ CONSTANT_REGEXP = ::T.let(nil, ::T.untyped)
+ GLOBALVARIABLE_REGEXP = ::T.let(nil, ::T.untyped)
+ HEX_REGEXP = ::T.let(nil, ::T.untyped)
+ NUMERIC_REGEXP = ::T.let(nil, ::T.untyped)
+ PROC_OR_HASH_REGEXP = ::T.let(nil, ::T.untyped)
+ REGEX_REGEXP = ::T.let(nil, ::T.untyped)
+ RESERVED_WORDS = ::T.let(nil, ::T.untyped)
+ SYMBOL_METHOD_CALL_REGEXP = ::T.let(nil, ::T.untyped)
+ SYMBOL_REGEXP = ::T.let(nil, ::T.untyped)
+ TOPLEVEL_LOOKUP_REGEXP = ::T.let(nil, ::T.untyped)
+ VARIABLE_REGEXP = ::T.let(nil, ::T.untyped)
+ WORD_ESCAPE_STR = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Inspector
+ MAP = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::ObjectPath
+ SPECIAL_TERMS = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Output
+ DEFAULT_SIZE = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Slop
+ DEFAULT_OPTIONS = ::T.let(nil, ::T.untyped)
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Slop::Option
+ DEFAULT_OPTIONS = ::T.let(nil, ::T.untyped)
+end
+
+module Psych
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Psych::Visitors::RestrictedYAMLTree
+ def visit_Symbol(sym); end
+ DEFAULT_PERMITTED_CLASSES = ::T.let(nil, ::T.untyped)
+end
+
+class Psych::Visitors::RestrictedYAMLTree
+end
+
+class Psych::Visitors::Visitor
+ def self.dispatch_cache(); end
+end
+
+module Psych
+ def self.add_builtin_type(type_tag, &block); end
+
+ def self.add_domain_type(domain, type_tag, &block); end
+
+ def self.add_tag(tag, klass); end
+
+ def self.domain_types(); end
+
+ def self.domain_types=(domain_types); end
+
+ def self.dump_tags(); end
+
+ def self.dump_tags=(dump_tags); end
+
+ def self.libyaml_version(); end
+
+ def self.load_tags(); end
+
+ def self.load_tags=(load_tags); end
+
+ def self.remove_type(type_tag); end
+
+ def self.safe_dump(o, io=T.unsafe(nil), options=T.unsafe(nil)); end
+
+ def self.safe_load_file(filename, **kwargs); end
+
+ def self.unsafe_load(yaml, filename: T.unsafe(nil), fallback: T.unsafe(nil), symbolize_names: T.unsafe(nil), freeze: T.unsafe(nil)); end
+
+ def self.unsafe_load_file(filename, **kwargs); end
+end
+
+class RDoc::Alias
+ def initialize(text, old_name, new_name, comment, singleton=T.unsafe(nil)); end
+end
+
+class RDoc::AnyMethod
+ def _call_seq(); end
+
+ def section_title(); end
+
+ def section_title=(section_title); end
+end
+
+class RDoc::Attr
+ def initialize(text, name, rw, comment, singleton=T.unsafe(nil)); end
+end
+
+class RDoc::ClassModule
+ def initialize(name, superclass=T.unsafe(nil)); end
+end
+
+class RDoc::CodeObject
+ def initialize_visibility(); end
+end
+
+class RDoc::Comment
+ def initialize(text=T.unsafe(nil), location=T.unsafe(nil), language=T.unsafe(nil)); end
+
+ def line(); end
+
+ def line=(line); end
+end
+
+class RDoc::Constant
+ def initialize(name, value, comment); end
+ MARSHAL_VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class RDoc::Context
+ def add_module_by_normal_module(mod); end
+
+ def initialize_methods_etc(); end
+
+ def instance_methods(); end
+end
+
+class RDoc::Context::Section
+ def initialize(parent, title, comment); end
+end
+
+class RDoc::CrossReference
+ def initialize(context); end
+
+ def resolve_method(name); end
+end
+
+module RDoc::Encoding
+ HEADER_REGEXP = ::T.let(nil, ::T.untyped)
+end
+
+module RDoc::Encoding
+ def self.detect_encoding(string); end
+
+ def self.remove_magic_comment(string); end
+end
+
+class RDoc::Generator::Darkfish
+ def initialize(store, options); end
+end
+
+class RDoc::Generator::JsonIndex
+ def initialize(parent_generator, options); end
+end
+
+class RDoc::Generator::POT
+ def initialize(store, options); end
+end
+
+class RDoc::Generator::POT::MessageExtractor
+ def initialize(store); end
+end
+
+class RDoc::Generator::POT::POEntry
+ def initialize(msgid, options=T.unsafe(nil)); end
+end
+
+class RDoc::Generator::RI
+ def initialize(store, options); end
+end
+
+class RDoc::I18n::Locale
+ def initialize(name); end
+end
+
+class RDoc::I18n::Text
+ def initialize(raw); end
+end
+
+class RDoc::Markdown
+ def _Table(); end
+
+ def _TableColumn(); end
+
+ def _TableItem(); end
+
+ def _TableLine(); end
+
+ def _TableRow(); end
+
+ def initialize(extensions=T.unsafe(nil), debug=T.unsafe(nil)); end
+end
+
+class RDoc::Markdown::Literals
+ def initialize(str, debug=T.unsafe(nil)); end
+end
+
+class RDoc::Markdown::Literals::MemoEntry
+ def initialize(ans, pos); end
+end
+
+class RDoc::Markdown::Literals::RuleInfo
+ def initialize(name, rendered); end
+end
+
+class RDoc::Markdown::MemoEntry
+ def initialize(ans, pos); end
+end
+
+class RDoc::Markdown::RuleInfo
+ def initialize(name, rendered); end
+end
+
+class RDoc::Markup
+ def add_regexp_handling(pattern, name); end
+
+ def initialize(attribute_manager=T.unsafe(nil)); end
+end
+
+class RDoc::Markup::AttrSpan
+ def initialize(length, exclusive); end
+end
+
+class RDoc::Markup::AttributeManager
+ def add_regexp_handling(pattern, name, exclusive=T.unsafe(nil)); end
+
+ def convert_attrs_matching_word_pairs(str, attrs, exclusive); end
+
+ def convert_attrs_word_pair_map(str, attrs, exclusive); end
+
+ def convert_regexp_handlings(str, attrs, exclusive=T.unsafe(nil)); end
+
+ def exclusive?(attr); end
+
+ def exclusive_bitmap(); end
+
+ def regexp_handlings(); end
+ NON_PRINTING_END = ::T.let(nil, ::T.untyped)
+ NON_PRINTING_START = ::T.let(nil, ::T.untyped)
+end
+
+class RDoc::Markup::Attributes
+ def regexp_handling(); end
+end
+
+class RDoc::Markup::Document
+ def initialize(*parts); end
+end
+
+class RDoc::Markup::Formatter
+ def add_regexp_handling_RDOCLINK(); end
+
+ def add_regexp_handling_TIDYLINK(); end
+
+ def convert_regexp_handling(target); end
+
+ def initialize(options, markup=T.unsafe(nil)); end
+end
+
+class RDoc::Markup::Include
+ def initialize(file, include_path); end
+end
+
+class RDoc::Markup::IndentedParagraph
+ def initialize(indent, *parts); end
+end
+
+class RDoc::Markup::List
+ def initialize(type=T.unsafe(nil), *items); end
+end
+
+class RDoc::Markup::ListItem
+ def initialize(label=T.unsafe(nil), *parts); end
+end
+
+class RDoc::Markup::Parser::MyStringScanner
+ def [](i); end
+
+ def eos?(); end
+
+ def initialize(input); end
+
+ def matched(); end
+
+ def newline!(); end
+
+ def pos(); end
+
+ def scan(re); end
+
+ def unscan(s); end
+end
+
+class RDoc::Markup::Parser::MyStringScanner
+end
+
+class RDoc::Markup::PreProcess
+ def initialize(input_file_name, include_path); end
+end
+
+class RDoc::Markup::Raw
+ def initialize(*parts); end
+end
+
+class RDoc::Markup::RegexpHandling
+ def ==(o); end
+
+ def initialize(type, text); end
+
+ def text(); end
+
+ def text=(text); end
+
+ def type(); end
+end
+
+class RDoc::Markup::RegexpHandling
+end
+
+class RDoc::Markup::Table
+ def ==(other); end
+
+ def accept(visitor); end
+
+ def align(); end
+
+ def align=(align); end
+
+ def body(); end
+
+ def body=(body); end
+
+ def header(); end
+
+ def header=(header); end
+
+ def initialize(header, align, body); end
+end
+
+class RDoc::Markup::Table
+end
+
+class RDoc::Markup::ToHtml
+ def accept_table(header, body, aligns); end
+
+ def handle_regexp_HARD_BREAK(target); end
+
+ def handle_regexp_HYPERLINK(target); end
+
+ def handle_regexp_RDOCLINK(target); end
+
+ def handle_regexp_TIDYLINK(target); end
+
+ def init_link_notation_regexp_handlings(); end
+
+ def init_regexp_handlings(); end
+end
+
+class RDoc::Markup::ToHtmlCrossref
+ def handle_regexp_CROSSREF(target); end
+
+ def initialize(options, from_path, context, markup=T.unsafe(nil)); end
+end
+
+class RDoc::Markup::ToHtmlSnippet
+ def handle_regexp_CROSSREF(target); end
+
+ def initialize(options, characters=T.unsafe(nil), paragraphs=T.unsafe(nil), markup=T.unsafe(nil)); end
+end
+
+class RDoc::Markup::ToJoinedParagraph
+ def accept_table(*node); end
+
+ def initialize(); end
+end
+
+class RDoc::Markup::ToLabel
+ def handle_regexp_CROSSREF(target); end
+
+ def handle_regexp_HARD_BREAK(*node); end
+
+ def handle_regexp_TIDYLINK(target); end
+
+ def initialize(markup=T.unsafe(nil)); end
+end
+
+class RDoc::Markup::ToMarkdown
+ def handle_regexp_RDOCLINK(target); end
+
+ def handle_regexp_TIDYLINK(target); end
+end
+
+class RDoc::Markup::ToRdoc
+ def accept_table(header, body, aligns); end
+
+ def handle_regexp_HARD_BREAK(target); end
+
+ def handle_regexp_SUPPRESSED_CROSSREF(target); end
+
+ def initialize(markup=T.unsafe(nil)); end
+end
+
+class RDoc::Markup::ToTableOfContents
+ def accept_table(*node); end
+
+ def initialize(); end
+end
+
+class RDoc::Markup::ToTtOnly
+ def initialize(markup=T.unsafe(nil)); end
+end
+
+class RDoc::MethodAttr
+ def initialize(text, name); end
+end
+
+class RDoc::Mixin
+ def initialize(name, comment); end
+end
+
+class RDoc::Options
+ def override(map); end
+end
+
+class RDoc::Options
+ def self.load_options(); end
+end
+
+class RDoc::Parser
+ def initialize(top_level, file_name, content, options, stats); end
+end
+
+class RDoc::Parser::C
+ def add_alias(var_name, class_obj, old_name, new_name, comment); end
+
+ def do_classes_and_modules(); end
+
+ def new_comment(text=T.unsafe(nil), location=T.unsafe(nil), language=T.unsafe(nil)); end
+end
+
+class RDoc::Parser::ChangeLog
+ def parse_date(date); end
+end
+
+module RDoc::Parser::ChangeLog::Git
+ def create_entries(entries); end
+
+ def parse_entries(); end
+
+ def parse_info(info); end
+ HEADING_LEVEL = ::T.let(nil, ::T.untyped)
+end
+
+class RDoc::Parser::ChangeLog::Git::LogEntry
+ def accept(visitor); end
+
+ def aref(); end
+
+ def author(); end
+
+ def author=(_); end
+
+ def base(); end
+
+ def base=(_); end
+
+ def commit(); end
+
+ def commit=(_); end
+
+ def contents(); end
+
+ def contents=(_); end
+
+ def date(); end
+
+ def date=(_); end
+
+ def email(); end
+
+ def email=(_); end
+
+ def initialize(base, commit, author, email, date, contents); end
+
+ def label(context=T.unsafe(nil)); end
+
+ def level(); end
+
+ def text(); end
+end
+
+class RDoc::Parser::ChangeLog::Git::LogEntry
+ def self.[](*arg); end
+
+ def self.members(); end
+end
+
+module RDoc::Parser::ChangeLog::Git
+end
+
+class RDoc::Parser::RipperStateLex
+ def get_squashed_tk(); end
+
+ def initialize(code); end
+ EXPR_ARG = ::T.let(nil, ::T.untyped)
+ EXPR_ARG_ANY = ::T.let(nil, ::T.untyped)
+ EXPR_BEG = ::T.let(nil, ::T.untyped)
+ EXPR_BEG_ANY = ::T.let(nil, ::T.untyped)
+ EXPR_CLASS = ::T.let(nil, ::T.untyped)
+ EXPR_CMDARG = ::T.let(nil, ::T.untyped)
+ EXPR_DOT = ::T.let(nil, ::T.untyped)
+ EXPR_END = ::T.let(nil, ::T.untyped)
+ EXPR_ENDARG = ::T.let(nil, ::T.untyped)
+ EXPR_ENDFN = ::T.let(nil, ::T.untyped)
+ EXPR_END_ANY = ::T.let(nil, ::T.untyped)
+ EXPR_FITEM = ::T.let(nil, ::T.untyped)
+ EXPR_FNAME = ::T.let(nil, ::T.untyped)
+ EXPR_LABEL = ::T.let(nil, ::T.untyped)
+ EXPR_LABELED = ::T.let(nil, ::T.untyped)
+ EXPR_MID = ::T.let(nil, ::T.untyped)
+ EXPR_NONE = ::T.let(nil, ::T.untyped)
+ EXPR_VALUE = ::T.let(nil, ::T.untyped)
+ RIPPER_HAS_LEX_STATE = ::T.let(nil, ::T.untyped)
+end
+
+class RDoc::Parser::RipperStateLex::InnerStateLex
+ def initialize(code); end
+
+ def on_default(event, tok, data); end
+end
+
+class RDoc::Parser::RipperStateLex::InnerStateLex
+end
+
+class RDoc::Parser::RipperStateLex::Token
+ def char_no(); end
+
+ def char_no=(_); end
+
+ def kind(); end
+
+ def kind=(_); end
+
+ def line_no(); end
+
+ def line_no=(_); end
+
+ def state(); end
+
+ def state=(_); end
+
+ def text(); end
+
+ def text=(_); end
+end
+
+class RDoc::Parser::RipperStateLex::Token
+ def self.[](*arg); end
+
+ def self.members(); end
+end
+
+class RDoc::Parser::RipperStateLex
+ def self.end?(token); end
+
+ def self.parse(code); end
+end
+
+class RDoc::Parser::Ruby
+ def get_included_module_with_optional_parens(); end
+
+ def parse_included_with_activesupport_concern(container, comment); end
+
+ def retrieve_comment_body(tk); end
+end
+
+module RDoc::Parser::RubyTools
+ def skip_tkspace_without_nl(); end
+end
+
+class RDoc::RD::BlockParser
+ Racc_debug_parser = ::T.let(nil, ::T.untyped)
+end
+
+class RDoc::RD::Inline
+ def initialize(rdoc, reference); end
+end
+
+class RDoc::RD::InlineParser
+ def initialize(block_parser); end
+ Racc_debug_parser = ::T.let(nil, ::T.untyped)
+end
+
+class RDoc::RI::Driver
+ def initialize(initial_options=T.unsafe(nil)); end
+end
+
+class RDoc::RI::Driver::NotFoundError
+ def initialize(klass, suggestions=T.unsafe(nil)); end
+end
+
+RDoc::RI::Store = RDoc::Store
+
+class RDoc::Require
+ def initialize(name, comment); end
+end
+
+class RDoc::Servlet
+ def initialize(server, stores, cache, mount_path=T.unsafe(nil), extra_doc_dirs=T.unsafe(nil)); end
+end
+
+class RDoc::Stats
+ def initialize(store, num_files, verbosity=T.unsafe(nil)); end
+end
+
+class RDoc::Stats::Quiet
+ def initialize(num_files); end
+end
+
+class RDoc::Store
+ def initialize(path=T.unsafe(nil), type=T.unsafe(nil)); end
+
+ def unmatched_constant_alias(); end
+
+ def update_parser_of_file(absolute_name, parser); end
+end
+
+class RDoc::Store::MissingFileError
+ def initialize(store, file, name); end
+end
+
+class RDoc::Task
+ def before_running_rdoc(&block); end
+
+ def check_names(names); end
+
+ def clobber_task_description(); end
+
+ def defaults(); end
+
+ def define(); end
+
+ def external(); end
+
+ def external=(external); end
+
+ def generator(); end
+
+ def generator=(generator); end
+
+ def initialize(name=T.unsafe(nil)); end
+
+ def inline_source(); end
+
+ def inline_source=(value); end
+
+ def main(); end
+
+ def main=(main); end
+
+ def markup(); end
+
+ def markup=(markup); end
+
+ def name(); end
+
+ def name=(name); end
+
+ def option_list(); end
+
+ def options(); end
+
+ def options=(options); end
+
+ def rdoc_dir(); end
+
+ def rdoc_dir=(rdoc_dir); end
+
+ def rdoc_files(); end
+
+ def rdoc_files=(rdoc_files); end
+
+ def rdoc_task_description(); end
+
+ def rerdoc_task_description(); end
+
+ def template(); end
+
+ def template=(template); end
+
+ def title(); end
+
+ def title=(title); end
+end
+
+class RDoc::Task
+end
+
+module RDoc::Text
+ def language(); end
+
+ def language=(language); end
+end
+
+class RDoc::TopLevel
+ def initialize(absolute_name, relative_name=T.unsafe(nil)); end
+end
+
+module RDoc
+ def self.home(); end
+end
+
+module RSpec
+ MODULES_TO_AUTOLOAD = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::CallerFilter
+ ADDITIONAL_TOP_LEVEL_FILES = ::T.let(nil, ::T.untyped)
+ IGNORE_REGEX = ::T.let(nil, ::T.untyped)
+ LIB_REGEX = ::T.let(nil, ::T.untyped)
+ RSPEC_LIBS = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Configuration
+ DEFAULT_FORMATTER = ::T.let(nil, ::T.untyped)
+ FAILED_STATUS = ::T.let(nil, ::T.untyped)
+ MOCKING_ADAPTERS = ::T.let(nil, ::T.untyped)
+ PASSED_STATUS = ::T.let(nil, ::T.untyped)
+ PENDING_STATUS = ::T.let(nil, ::T.untyped)
+ RAISE_ERROR_WARNING_NOTIFIER = ::T.let(nil, ::T.untyped)
+ UNKNOWN_STATUS = ::T.let(nil, ::T.untyped)
+ VALID_STATUSES = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::ConfigurationOptions
+ OPTIONS_ORDER = ::T.let(nil, ::T.untyped)
+ UNFORCED_OPTIONS = ::T.let(nil, ::T.untyped)
+ UNPROCESSABLE_OPTIONS = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::Core::Example::AllExceptionsExcludingDangerousOnesOnRubiesThatAllowIt = RSpec::Support::AllExceptionsExceptOnesWeMustNotRescue
+
+class RSpec::Core::ExampleGroup
+ INSTANCE_VARIABLE_TO_IGNORE = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::Core::ExclusionRules = RSpec::Core::FilterRules
+
+class RSpec::Core::FilterRules
+ PROC_HEX_NUMBER = ::T.let(nil, ::T.untyped)
+ PROJECT_DIR = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Core::Formatters::ConsoleCodes
+ VT100_CODES = ::T.let(nil, ::T.untyped)
+ VT100_CODE_VALUES = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Formatters::DeprecationFormatter
+ DEPRECATION_STREAM_NOTICE = ::T.let(nil, ::T.untyped)
+ RAISE_ERROR_CONFIG_NOTICE = ::T.let(nil, ::T.untyped)
+ TOO_MANY_WARNINGS_NOTICE = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Formatters::DeprecationFormatter::DelayedPrinter
+ TOO_MANY_USES_LIMIT = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Formatters::ExceptionPresenter
+ PENDING_DETAIL_FORMATTER = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Core::Formatters::Helpers
+ DEFAULT_PRECISION = ::T.let(nil, ::T.untyped)
+ SUB_SECOND_PRECISION = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Formatters::HtmlPrinter
+ GLOBAL_SCRIPTS = ::T.let(nil, ::T.untyped)
+ GLOBAL_STYLES = ::T.let(nil, ::T.untyped)
+ HTML_HEADER = ::T.let(nil, ::T.untyped)
+ REPORT_HEADER = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Core::Formatters::SyntaxHighlighter::CodeRayImplementation
+ RESET_CODE = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::Core::Formatters::SyntaxHighlighter::WindowsImplementation = RSpec::Core::Formatters::SyntaxHighlighter::NoSyntaxHighlightingImplementation
+
+class RSpec::Core::Hooks::HookCollections
+ EMPTY_HOOK_ARRAY = ::T.let(nil, ::T.untyped)
+ HOOK_TYPES = ::T.let(nil, ::T.untyped)
+ SCOPES = ::T.let(nil, ::T.untyped)
+ SCOPE_ALIASES = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Core::Metadata
+ RESERVED_KEYS = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Ordering::Random
+ MAX_32_BIT = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Core::Pending
+ NOT_YET_IMPLEMENTED = ::T.let(nil, ::T.untyped)
+ NO_REASON_GIVEN = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Profiler
+ NOTIFICATIONS = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Reporter
+ RSPEC_NOTIFICATIONS = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Core::ShellEscape
+ SHELLS_ALLOWING_UNQUOTED_IDS = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Core::Version
+ STRING = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Expectations::Configuration
+ FALSE_POSITIVE_BEHAVIOURS = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::Expectations::LegacyMacherAdapter = RSpec::Expectations::LegacyMatcherAdapter
+
+module RSpec::Expectations::Version
+ STRING = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Matchers
+ def be_close_to(*expected, &block_arg); end
+ BE_PREDICATE_REGEX = ::T.let(nil, ::T.untyped)
+ DYNAMIC_MATCHER_REGEX = ::T.let(nil, ::T.untyped)
+ HAS_REGEX = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::Matchers::AliasedNegatedMatcher::DefaultFailureMessages = RSpec::Matchers::BuiltIn::BaseMatcher::DefaultFailureMessages
+
+class RSpec::Matchers::BuiltIn::BaseMatcher
+ UNDEFINED = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Matchers::BuiltIn::BePredicate
+ REGEX = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Matchers::BuiltIn::Equal
+ LITERAL_SINGLETONS = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Matchers::BuiltIn::Has
+ REGEX = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Matchers::BuiltIn::RaiseError
+ UndefinedValue = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::Matchers::BuiltIn::SpecificValuesChange::MATCH_ANYTHING = BasicObject
+
+RSpec::Matchers::BuiltIn::StartAndEndWith = RSpec::Matchers::BuiltIn::StartOrEndWith
+
+module RSpec::Matchers::DSL::Macros
+ RAISE_NOTIFIER = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Matchers::ExpectedsForMultipleDiffs
+ DEFAULT_DIFF_LABEL = ::T.let(nil, ::T.untyped)
+ DESCRIPTION_MAX_LENGTH = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Mocks
+ DEFAULT_CALLBACK_INVOCATION_STRATEGY = ::T.let(nil, ::T.untyped)
+ IGNORED_BACKTRACE_LINE = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Mocks::AnyInstance::PositiveExpectationChain
+ ExpectationInvocationOrder = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Mocks::AnyInstance::StubChain
+ EmptyInvocationOrder = ::T.let(nil, ::T.untyped)
+ InvocationOrder = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Mocks::ArgumentListMatcher
+ MATCH_ALL = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Mocks::Matchers::HaveReceived
+ ARGS_CONSTRAINTS = ::T.let(nil, ::T.untyped)
+ CONSTRAINTS = ::T.let(nil, ::T.untyped)
+ COUNT_CONSTRAINTS = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Mocks::ObjectReference
+ MODULE_NAME_METHOD = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Mocks::Proxy
+ DEFAULT_MESSAGE_EXPECTATION_OPTS = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Mocks::Version
+ STRING = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::SharedContext = RSpec::Core::SharedContext
+
+module RSpec::Support
+ DEFAULT_FAILURE_NOTIFIER = ::T.let(nil, ::T.untyped)
+ DEFAULT_WARNING_NOTIFIER = ::T.let(nil, ::T.untyped)
+ KERNEL_METHOD_METHOD = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Support::AllExceptionsExceptOnesWeMustNotRescue
+ AVOID_RESCUING = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Support::Differ
+ def color?(); end
+
+ def diff(actual, expected); end
+
+ def diff_as_object(actual, expected); end
+
+ def diff_as_string(actual, expected); end
+
+ def initialize(opts=T.unsafe(nil)); end
+end
+
+class RSpec::Support::Differ
+end
+
+class RSpec::Support::EncodedString
+ REPLACE = ::T.let(nil, ::T.untyped)
+ US_ASCII = ::T.let(nil, ::T.untyped)
+ UTF_8 = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Support::MethodSignature
+ INFINITY = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Support::Mutex
+ NEW_MUTEX_METHOD = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Support::ObjectFormatter
+ ELLIPSIS = ::T.let(nil, ::T.untyped)
+ INSPECTOR_CLASSES = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Support::ObjectFormatter::DateTimeInspector
+ FORMAT = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Support::ObjectFormatter::TimeInspector
+ FORMAT = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Support::ObjectFormatter::UninspectableObjectInspector
+ OBJECT_ID_FORMAT = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::Support::StrictSignatureVerifier = RSpec::Support::MethodSignatureVerifier
+
+module RSpec::Support::Version
+ STRING = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Version
+ STRING = ::T.let(nil, ::T.untyped)
+end
+
+module Racc
+ Copyright = ::T.let(nil, ::T.untyped)
+ Racc_No_Extentions = ::T.let(nil, ::T.untyped)
+ VERSION = ::T.let(nil, ::T.untyped)
+ Version = ::T.let(nil, ::T.untyped)
+end
+
+class Racc::CparseParams
+end
+
+class Racc::CparseParams
+end
+
+class Racc::Parser
+ Racc_Main_Parsing_Routine = ::T.let(nil, ::T.untyped)
+ Racc_Runtime_Core_Id_C = ::T.let(nil, ::T.untyped)
+ Racc_Runtime_Core_Revision = ::T.let(nil, ::T.untyped)
+ Racc_Runtime_Core_Revision_C = ::T.let(nil, ::T.untyped)
+ Racc_Runtime_Core_Revision_R = ::T.let(nil, ::T.untyped)
+ Racc_Runtime_Core_Version = ::T.let(nil, ::T.untyped)
+ Racc_Runtime_Core_Version_C = ::T.let(nil, ::T.untyped)
+ Racc_Runtime_Core_Version_R = ::T.let(nil, ::T.untyped)
+ Racc_Runtime_Revision = ::T.let(nil, ::T.untyped)
+ Racc_Runtime_Type = ::T.let(nil, ::T.untyped)
+ Racc_Runtime_Version = ::T.let(nil, ::T.untyped)
+ Racc_YY_Parse_Method = ::T.let(nil, ::T.untyped)
+end
+
+class Rainbow::Color::Named
+ NAMES = ::T.let(nil, ::T.untyped)
+end
+
+class Rainbow::Presenter
+ TERM_EFFECTS = ::T.let(nil, ::T.untyped)
+end
+
+module Rainbow::X11ColorNames
+ NAMES = ::T.let(nil, ::T.untyped)
+end
+
+module Rake
+ EARLY = ::T.let(nil, ::T.untyped)
+ EMPTY_TASK_ARGS = ::T.let(nil, ::T.untyped)
+ LATE = ::T.let(nil, ::T.untyped)
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Rake::Application
+ DEFAULT_RAKEFILES = ::T.let(nil, ::T.untyped)
+end
+
+module Rake::Backtrace
+ SUPPRESSED_PATHS = ::T.let(nil, ::T.untyped)
+ SUPPRESSED_PATHS_RE = ::T.let(nil, ::T.untyped)
+ SUPPRESS_PATTERN = ::T.let(nil, ::T.untyped)
+ SYS_KEYS = ::T.let(nil, ::T.untyped)
+ SYS_PATHS = ::T.let(nil, ::T.untyped)
+end
+
+module Rake::DSL
+ include ::FileUtils::StreamUtils_
+end
+
+class Rake::FileList
+ ARRAY_METHODS = ::T.let(nil, ::T.untyped)
+ DEFAULT_IGNORE_PATTERNS = ::T.let(nil, ::T.untyped)
+ DEFAULT_IGNORE_PROCS = ::T.let(nil, ::T.untyped)
+ DELEGATING_METHODS = ::T.let(nil, ::T.untyped)
+ GLOB_PATTERN = ::T.let(nil, ::T.untyped)
+ MUST_DEFINE = ::T.let(nil, ::T.untyped)
+ MUST_NOT_DEFINE = ::T.let(nil, ::T.untyped)
+ SPECIAL_RETURN = ::T.let(nil, ::T.untyped)
+end
+
+module Rake::FileUtilsExt
+ include ::FileUtils::StreamUtils_
+ DEFAULT = ::T.let(nil, ::T.untyped)
+end
+
+module Rake::FileUtilsExt
+ extend ::FileUtils::StreamUtils_
+end
+
+class Rake::InvocationChain
+ EMPTY = ::T.let(nil, ::T.untyped)
+end
+
+class Rake::LinkedList
+ EMPTY = ::T.let(nil, ::T.untyped)
+end
+
+class Rake::Promise
+ NOT_SET = ::T.let(nil, ::T.untyped)
+end
+
+Rake::RDocTask = RDoc::Task
+
+class Rake::Scope
+ EMPTY = ::T.let(nil, ::T.untyped)
+end
+
+class Rake::TaskLib
+ include ::FileUtils::StreamUtils_
+end
+
+module Rake::Version
+ BUILD = ::T.let(nil, ::T.untyped)
+ MAJOR = ::T.let(nil, ::T.untyped)
+ MINOR = ::T.let(nil, ::T.untyped)
+ NUMBERS = ::T.let(nil, ::T.untyped)
+ OTHER = ::T.let(nil, ::T.untyped)
+end
+
+module Rake
+ extend ::FileUtils::StreamUtils_
+end
+
+RakeFileUtils = Rake::FileUtilsExt
+
+class Random
+ def self.bytes(arg); end
+end
+
+class Range
+ def %(arg); end
+
+ def entries(); end
+
+ def to_a(); end
+end
+
+module RbConfig
+ def self.expand(val, config=T.unsafe(nil)); end
+
+ def self.fire_update!(key, val, mkconf=T.unsafe(nil), conf=T.unsafe(nil)); end
+
+ def self.ruby(); end
+end
+
+class Ripper
+ def column(); end
+
+ def debug_output(); end
+
+ def debug_output=(debug_output); end
+
+ def encoding(); end
+
+ def end_seen?(); end
+
+ def error?(); end
+
+ def filename(); end
+
+ def initialize(*arg); end
+
+ def lineno(); end
+
+ def parse(); end
+
+ def state(); end
+
+ def token(); end
+
+ def yydebug(); end
+
+ def yydebug=(yydebug); end
+ EXPR_ARG = ::T.let(nil, ::T.untyped)
+ EXPR_ARG_ANY = ::T.let(nil, ::T.untyped)
+ EXPR_BEG = ::T.let(nil, ::T.untyped)
+ EXPR_BEG_ANY = ::T.let(nil, ::T.untyped)
+ EXPR_CLASS = ::T.let(nil, ::T.untyped)
+ EXPR_CMDARG = ::T.let(nil, ::T.untyped)
+ EXPR_DOT = ::T.let(nil, ::T.untyped)
+ EXPR_END = ::T.let(nil, ::T.untyped)
+ EXPR_ENDARG = ::T.let(nil, ::T.untyped)
+ EXPR_ENDFN = ::T.let(nil, ::T.untyped)
+ EXPR_END_ANY = ::T.let(nil, ::T.untyped)
+ EXPR_FITEM = ::T.let(nil, ::T.untyped)
+ EXPR_FNAME = ::T.let(nil, ::T.untyped)
+ EXPR_LABEL = ::T.let(nil, ::T.untyped)
+ EXPR_LABELED = ::T.let(nil, ::T.untyped)
+ EXPR_MID = ::T.let(nil, ::T.untyped)
+ EXPR_NONE = ::T.let(nil, ::T.untyped)
+ EXPR_VALUE = ::T.let(nil, ::T.untyped)
+ PARSER_EVENT_TABLE = ::T.let(nil, ::T.untyped)
+ SCANNER_EVENT_TABLE = ::T.let(nil, ::T.untyped)
+ Version = ::T.let(nil, ::T.untyped)
+end
+
+class Ripper::Filter
+ def initialize(src, filename=T.unsafe(nil), lineno=T.unsafe(nil)); end
+end
+
+class Ripper::Lexer
+ def errors(); end
+
+ def lex(); end
+
+ def scan(); end
+
+ def tokenize(); end
+end
+
+class Ripper::Lexer::Elem
+ def event(); end
+
+ def event=(_); end
+
+ def initialize(pos, event, tok, state, message=T.unsafe(nil)); end
+
+ def message(); end
+
+ def message=(_); end
+
+ def pos(); end
+
+ def pos=(_); end
+
+ def state(); end
+
+ def state=(_); end
+
+ def tok(); end
+
+ def tok=(_); end
+end
+
+class Ripper::Lexer::Elem
+ def self.[](*arg); end
+
+ def self.members(); end
+end
+
+class Ripper::Lexer::State
+ def &(i); end
+
+ def ==(i); end
+
+ def allbits?(i); end
+
+ def anybits?(i); end
+
+ def initialize(i); end
+
+ def nobits?(i); end
+
+ def to_i(); end
+
+ def to_int(); end
+
+ def to_int=(_); end
+
+ def to_s=(_); end
+
+ def |(i); end
+end
+
+class Ripper::Lexer::State
+ def self.[](*arg); end
+
+ def self.members(); end
+end
+
+class Ripper::Lexer
+end
+
+class Ripper::SexpBuilder
+ def on_BEGIN(*args); end
+
+ def on_CHAR(tok); end
+
+ def on_END(*args); end
+
+ def on___end__(tok); end
+
+ def on_alias(*args); end
+
+ def on_alias_error(*args); end
+
+ def on_aref(*args); end
+
+ def on_aref_field(*args); end
+
+ def on_arg_ambiguous(*args); end
+
+ def on_arg_paren(*args); end
+
+ def on_args_add(*args); end
+
+ def on_args_add_block(*args); end
+
+ def on_args_add_star(*args); end
+
+ def on_args_forward(*args); end
+
+ def on_args_new(*args); end
+
+ def on_array(*args); end
+
+ def on_aryptn(*args); end
+
+ def on_assign(*args); end
+
+ def on_assign_error(*args); end
+
+ def on_assoc_new(*args); end
+
+ def on_assoc_splat(*args); end
+
+ def on_assoclist_from_args(*args); end
+
+ def on_backref(tok); end
+
+ def on_backtick(tok); end
+
+ def on_bare_assoc_hash(*args); end
+
+ def on_begin(*args); end
+
+ def on_binary(*args); end
+
+ def on_block_var(*args); end
+
+ def on_blockarg(*args); end
+
+ def on_bodystmt(*args); end
+
+ def on_brace_block(*args); end
+
+ def on_break(*args); end
+
+ def on_call(*args); end
+
+ def on_case(*args); end
+
+ def on_class(*args); end
+
+ def on_class_name_error(*args); end
+
+ def on_comma(tok); end
+
+ def on_command(*args); end
+
+ def on_command_call(*args); end
+
+ def on_comment(tok); end
+
+ def on_const(tok); end
+
+ def on_const_path_field(*args); end
+
+ def on_const_path_ref(*args); end
+
+ def on_const_ref(*args); end
+
+ def on_cvar(tok); end
+
+ def on_def(*args); end
+
+ def on_defined(*args); end
+
+ def on_defs(*args); end
+
+ def on_do_block(*args); end
+
+ def on_dot2(*args); end
+
+ def on_dot3(*args); end
+
+ def on_dyna_symbol(*args); end
+
+ def on_else(*args); end
+
+ def on_elsif(*args); end
+
+ def on_embdoc(tok); end
+
+ def on_embdoc_beg(tok); end
+
+ def on_embdoc_end(tok); end
+
+ def on_embexpr_beg(tok); end
+
+ def on_embexpr_end(tok); end
+
+ def on_embvar(tok); end
+
+ def on_ensure(*args); end
+
+ def on_excessed_comma(*args); end
+
+ def on_fcall(*args); end
+
+ def on_field(*args); end
+
+ def on_float(tok); end
+
+ def on_for(*args); end
+
+ def on_gvar(tok); end
+
+ def on_hash(*args); end
+
+ def on_heredoc_beg(tok); end
+
+ def on_heredoc_end(tok); end
+
+ def on_hshptn(*args); end
+
+ def on_ident(tok); end
+
+ def on_if(*args); end
+
+ def on_if_mod(*args); end
+
+ def on_ifop(*args); end
+
+ def on_ignored_nl(tok); end
+
+ def on_ignored_sp(tok); end
+
+ def on_imaginary(tok); end
+
+ def on_in(*args); end
+
+ def on_int(tok); end
+
+ def on_ivar(tok); end
+
+ def on_kw(tok); end
+
+ def on_kwrest_param(*args); end
+
+ def on_label(tok); end
+
+ def on_label_end(tok); end
+
+ def on_lambda(*args); end
+
+ def on_lbrace(tok); end
+
+ def on_lbracket(tok); end
+
+ def on_lparen(tok); end
+
+ def on_magic_comment(*args); end
+
+ def on_massign(*args); end
+
+ def on_method_add_arg(*args); end
+
+ def on_method_add_block(*args); end
+
+ def on_mlhs_add(*args); end
+
+ def on_mlhs_add_post(*args); end
+
+ def on_mlhs_add_star(*args); end
+
+ def on_mlhs_new(*args); end
+
+ def on_mlhs_paren(*args); end
+
+ def on_module(*args); end
+
+ def on_mrhs_add(*args); end
+
+ def on_mrhs_add_star(*args); end
+
+ def on_mrhs_new(*args); end
+
+ def on_mrhs_new_from_args(*args); end
+
+ def on_next(*args); end
+
+ def on_nl(tok); end
+
+ def on_nokw_param(*args); end
+
+ def on_op(tok); end
+
+ def on_opassign(*args); end
+
+ def on_operator_ambiguous(*args); end
+
+ def on_param_error(*args); end
+
+ def on_params(*args); end
+
+ def on_paren(*args); end
+
+ def on_parse_error(*args); end
+
+ def on_period(tok); end
+
+ def on_program(*args); end
+
+ def on_qsymbols_add(*args); end
+
+ def on_qsymbols_beg(tok); end
+
+ def on_qsymbols_new(*args); end
+
+ def on_qwords_add(*args); end
+
+ def on_qwords_beg(tok); end
+
+ def on_qwords_new(*args); end
+
+ def on_rational(tok); end
+
+ def on_rbrace(tok); end
+
+ def on_rbracket(tok); end
+
+ def on_redo(*args); end
+
+ def on_regexp_add(*args); end
+
+ def on_regexp_beg(tok); end
+
+ def on_regexp_end(tok); end
+
+ def on_regexp_literal(*args); end
+
+ def on_regexp_new(*args); end
+
+ def on_rescue(*args); end
+
+ def on_rescue_mod(*args); end
+
+ def on_rest_param(*args); end
+
+ def on_retry(*args); end
+
+ def on_return(*args); end
+
+ def on_return0(*args); end
+
+ def on_rparen(tok); end
+
+ def on_sclass(*args); end
+
+ def on_semicolon(tok); end
+
+ def on_sp(tok); end
+
+ def on_stmts_add(*args); end
+
+ def on_stmts_new(*args); end
+
+ def on_string_add(*args); end
+
+ def on_string_concat(*args); end
+
+ def on_string_content(*args); end
+
+ def on_string_dvar(*args); end
+
+ def on_string_embexpr(*args); end
+
+ def on_string_literal(*args); end
+
+ def on_super(*args); end
+
+ def on_symbeg(tok); end
+
+ def on_symbol(*args); end
+
+ def on_symbol_literal(*args); end
+
+ def on_symbols_add(*args); end
+
+ def on_symbols_beg(tok); end
+
+ def on_symbols_new(*args); end
+
+ def on_tlambda(tok); end
+
+ def on_tlambeg(tok); end
+
+ def on_top_const_field(*args); end
+
+ def on_top_const_ref(*args); end
+
+ def on_tstring_beg(tok); end
+
+ def on_tstring_content(tok); end
+
+ def on_tstring_end(tok); end
+
+ def on_unary(*args); end
+
+ def on_undef(*args); end
+
+ def on_unless(*args); end
+
+ def on_unless_mod(*args); end
+
+ def on_until(*args); end
+
+ def on_until_mod(*args); end
+
+ def on_var_alias(*args); end
+
+ def on_var_field(*args); end
+
+ def on_var_ref(*args); end
+
+ def on_vcall(*args); end
+
+ def on_void_stmt(*args); end
+
+ def on_when(*args); end
+
+ def on_while(*args); end
+
+ def on_while_mod(*args); end
+
+ def on_word_add(*args); end
+
+ def on_word_new(*args); end
+
+ def on_words_add(*args); end
+
+ def on_words_beg(tok); end
+
+ def on_words_new(*args); end
+
+ def on_words_sep(tok); end
+
+ def on_xstring_add(*args); end
+
+ def on_xstring_literal(*args); end
+
+ def on_xstring_new(*args); end
+
+ def on_yield(*args); end
+
+ def on_yield0(*args); end
+
+ def on_zsuper(*args); end
+end
+
+class Ripper::TokenPattern
+ def initialize(pattern); end
+
+ def match(str); end
+
+ def match_list(tokens); end
+ MAP = ::T.let(nil, ::T.untyped)
+end
+
+class Ripper::TokenPattern::CompileError
+end
+
+class Ripper::TokenPattern::CompileError
+end
+
+class Ripper::TokenPattern::Error
+end
+
+class Ripper::TokenPattern::Error
+end
+
+class Ripper::TokenPattern::MatchData
+ def initialize(tokens, match); end
+
+ def string(n=T.unsafe(nil)); end
+end
+
+class Ripper::TokenPattern::MatchData
+end
+
+class Ripper::TokenPattern::MatchError
+end
+
+class Ripper::TokenPattern::MatchError
+end
+
+class Ripper::TokenPattern
+ def self.compile(*arg); end
+end
+
+class Ripper
+ def self.dedent_string(arg, arg1); end
+
+ def self.lex_state_name(arg); end
+
+ def self.token_match(src, pattern); end
+end
+
+class RubyVM::AbstractSyntaxTree::Node
+ def pretty_print_children(q, names=T.unsafe(nil)); end
+end
+
+module RubyVM::MJIT
+end
+
+module RubyVM::MJIT
+ def self.enabled?(); end
+
+ def self.pause(*arg); end
+
+ def self.resume(); end
+end
+
+ScanError = StringScanner::Error
+
+class Set
+ def ==(other); end
+
+ def ===(o); end
+
+ def divide(&func); end
+
+ def eql?(o); end
+
+ def flatten_merge(set, seen=T.unsafe(nil)); end
+
+ def pretty_print(pp); end
+
+ def pretty_print_cycle(pp); end
+
+ def reset(); end
+ InspectKey = ::T.let(nil, ::T.untyped)
+end
+
+class SimpleDelegator
+ RUBYGEMS_ACTIVATION_MONITOR = ::T.let(nil, ::T.untyped)
+end
+
+module Singleton
+ def _dump(depth=T.unsafe(nil)); end
+
+ def clone(); end
+
+ def dup(); end
+end
+
+module Singleton::SingletonClassMethods
+ def _load(str); end
+
+ def clone(); end
+end
+
+module Singleton
+ def self.__init__(klass); end
+end
+
+class Socket
+ IPV6_DONTFRAG = ::T.let(nil, ::T.untyped)
+ IPV6_PATHMTU = ::T.let(nil, ::T.untyped)
+ IPV6_RECVPATHMTU = ::T.let(nil, ::T.untyped)
+ SO_BPF_EXTENSIONS = ::T.let(nil, ::T.untyped)
+end
+
+module Socket::Constants
+ IPV6_DONTFRAG = ::T.let(nil, ::T.untyped)
+ IPV6_PATHMTU = ::T.let(nil, ::T.untyped)
+ IPV6_RECVPATHMTU = ::T.let(nil, ::T.untyped)
+ SO_BPF_EXTENSIONS = ::T.let(nil, ::T.untyped)
+end
+
+class SortedSet
+ def initialize(*args, &block); end
+end
+
+class SortedSet
+ def self.setup(); end
+end
+
+class String
+ include ::JSON::Ext::Generator::GeneratorMethods::String
+ def shellescape(); end
+
+ def shellsplit(); end
+end
+
+class StringIO
+ def set_encoding_by_bom(); end
+ VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class StringScanner
+ def bol?(); end
+
+ def fixed_anchor?(); end
+
+ def initialize(*arg); end
+ Id = ::T.let(nil, ::T.untyped)
+ Version = ::T.let(nil, ::T.untyped)
+end
+
+class Struct
+ def deconstruct(); end
+
+ def deconstruct_keys(arg); end
+
+ def filter(*arg); end
+end
+
+Struct::Group = Etc::Group
+
+Struct::Passwd = Etc::Passwd
+
+Struct::Tms = Process::Tms
+
+class TTFunk::OTFEncoder
+ OPTIMAL_TABLE_ORDER = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::TTFEncoder
+ OPTIMAL_TABLE_ORDER = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff
+ TAG = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::Charset
+ include ::Enumerable
+ def [](glyph_id); end
+
+ def count(); end
+
+ def each(&blk); end
+
+ def encode(mapping); end
+
+ def entries(); end
+
+ def format(); end
+
+ def initialize(top_dict, file, offset_or_id=T.unsafe(nil), length=T.unsafe(nil)); end
+
+ def offset(); end
+
+ def offset_or_id(); end
+
+ def top_dict(); end
+ ARRAY_FORMAT = ::T.let(nil, ::T.untyped)
+ DEFAULT_CHARSET_ID = ::T.let(nil, ::T.untyped)
+ EXPERT_CHARSET_ID = ::T.let(nil, ::T.untyped)
+ EXPERT_SUBSET_CHARSET_ID = ::T.let(nil, ::T.untyped)
+ FIRST_GLYPH_STRING = ::T.let(nil, ::T.untyped)
+ ISO_ADOBE_CHARSET_ID = ::T.let(nil, ::T.untyped)
+ RANGE_FORMAT_16 = ::T.let(nil, ::T.untyped)
+ RANGE_FORMAT_8 = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::Charset
+ def self.standard_strings(); end
+
+ def self.strings_for_charset_id(charset_id); end
+end
+
+module TTFunk::Table::Cff::Charsets
+ EXPERT = ::T.let(nil, ::T.untyped)
+ EXPERT_SUBSET = ::T.let(nil, ::T.untyped)
+ ISO_ADOBE = ::T.let(nil, ::T.untyped)
+ STANDARD_STRINGS = ::T.let(nil, ::T.untyped)
+end
+
+module TTFunk::Table::Cff::Charsets
+end
+
+class TTFunk::Table::Cff::Charstring
+ def encode(); end
+
+ def glyph(); end
+
+ def glyph_id(); end
+
+ def initialize(glyph_id, top_dict, font_dict, raw); end
+
+ def path(); end
+
+ def raw(); end
+
+ def render(x: T.unsafe(nil), y: T.unsafe(nil), font_size: T.unsafe(nil)); end
+ CODE_MAP = ::T.let(nil, ::T.untyped)
+ FLEX_CODE_MAP = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::Charstring
+end
+
+class TTFunk::Table::Cff::CharstringsIndex
+ def encode(mapping); end
+
+ def initialize(top_dict, *remaining_args); end
+
+ def top_dict(); end
+end
+
+class TTFunk::Table::Cff::CharstringsIndex
+end
+
+class TTFunk::Table::Cff::Dict
+ include ::Enumerable
+ def [](operator); end
+
+ def each(&block); end
+
+ def each_pair(&block); end
+
+ def encode(); end
+ MAX_OPERANDS = ::T.let(nil, ::T.untyped)
+ OPERAND_BZERO = ::T.let(nil, ::T.untyped)
+ OPERATOR_BZERO = ::T.let(nil, ::T.untyped)
+ VALID_SCI_EXPONENT_RE = ::T.let(nil, ::T.untyped)
+ VALID_SCI_SIGNIFICAND_RE = ::T.let(nil, ::T.untyped)
+ WIDE_OPERATOR_ADJUSTMENT = ::T.let(nil, ::T.untyped)
+ WIDE_OPERATOR_BZERO = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::Dict::InvalidOperandError
+end
+
+class TTFunk::Table::Cff::Dict::InvalidOperandError
+end
+
+class TTFunk::Table::Cff::Dict::TooManyOperandsError
+end
+
+class TTFunk::Table::Cff::Dict::TooManyOperandsError
+end
+
+class TTFunk::Table::Cff::Dict
+end
+
+class TTFunk::Table::Cff::Encoding
+ include ::Enumerable
+ def [](glyph_id); end
+
+ def count(); end
+
+ def each(&blk); end
+
+ def encode(new_to_old, old_to_new); end
+
+ def format(); end
+
+ def initialize(top_dict, file, offset_or_id=T.unsafe(nil), length=T.unsafe(nil)); end
+
+ def offset(); end
+
+ def offset_or_id(); end
+
+ def supplemental?(); end
+
+ def top_dict(); end
+ DEFAULT_ENCODING_ID = ::T.let(nil, ::T.untyped)
+ EXPERT_ENCODING_ID = ::T.let(nil, ::T.untyped)
+ STANDARD_ENCODING_ID = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::Encoding
+ def self.codes_for_encoding_id(encoding_id); end
+end
+
+module TTFunk::Table::Cff::Encodings
+ EXPERT = ::T.let(nil, ::T.untyped)
+ STANDARD = ::T.let(nil, ::T.untyped)
+end
+
+module TTFunk::Table::Cff::Encodings
+end
+
+class TTFunk::Table::Cff::FdSelector
+ include ::Enumerable
+ def [](glyph_id); end
+
+ def count(); end
+
+ def each(&blk); end
+
+ def encode(mapping); end
+
+ def entries(); end
+
+ def initialize(top_dict, file, offset, length=T.unsafe(nil)); end
+
+ def n_glyphs(); end
+
+ def top_dict(); end
+ ARRAY_ENTRY_SIZE = ::T.let(nil, ::T.untyped)
+ ARRAY_FORMAT = ::T.let(nil, ::T.untyped)
+ RANGE_ENTRY_SIZE = ::T.let(nil, ::T.untyped)
+ RANGE_FORMAT = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::FdSelector
+end
+
+class TTFunk::Table::Cff::FontDict
+ def encode(_mapping); end
+
+ def finalize(new_cff_data, mapping); end
+
+ def initialize(top_dict, file, offset, length=T.unsafe(nil)); end
+
+ def private_dict(); end
+
+ def top_dict(); end
+ OPERATORS = ::T.let(nil, ::T.untyped)
+ OPERATOR_CODES = ::T.let(nil, ::T.untyped)
+ PLACEHOLDER_LENGTH = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::FontDict
+end
+
+class TTFunk::Table::Cff::FontIndex
+ def finalize(new_cff_data, mapping); end
+
+ def initialize(top_dict, file, offset, length=T.unsafe(nil)); end
+
+ def top_dict(); end
+end
+
+class TTFunk::Table::Cff::FontIndex
+end
+
+class TTFunk::Table::Cff::Header
+ def absolute_offset_size(); end
+
+ def encode(); end
+
+ def header_size(); end
+
+ def major(); end
+
+ def minor(); end
+end
+
+class TTFunk::Table::Cff::Header
+end
+
+class TTFunk::Table::Cff::Index
+ include ::Enumerable
+ def [](index); end
+
+ def count(); end
+
+ def data_start_pos(); end
+
+ def each(&blk); end
+
+ def encode(); end
+
+ def offset_size(); end
+
+ def offsets(); end
+
+ def raw_data(); end
+
+ def raw_offset_length(); end
+end
+
+class TTFunk::Table::Cff::Index
+end
+
+class TTFunk::Table::Cff::OneBasedIndex
+ def [](idx); end
+
+ def base_index(); end
+
+ def count(*args, &block); end
+
+ def each(*args, &block); end
+
+ def encode(*args, &block); end
+
+ def initialize(*args); end
+
+ def length(*args, &block); end
+
+ def table_offset(*args, &block); end
+end
+
+class TTFunk::Table::Cff::OneBasedIndex
+ extend ::Forwardable
+end
+
+class TTFunk::Table::Cff::Path
+ def close_path(); end
+
+ def commands(); end
+
+ def curve_to(x1, y1, x2, y2, x, y); end
+
+ def line_to(x, y); end
+
+ def move_to(x, y); end
+
+ def number_of_contours(); end
+
+ def render(x: T.unsafe(nil), y: T.unsafe(nil), font_size: T.unsafe(nil), units_per_em: T.unsafe(nil)); end
+ CLOSE_PATH_CMD = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::Path
+end
+
+class TTFunk::Table::Cff::PrivateDict
+ def default_width_x(); end
+
+ def encode(_mapping); end
+
+ def finalize(private_dict_data); end
+
+ def nominal_width_x(); end
+
+ def subr_index(); end
+ DEFAULT_WIDTH_X_DEFAULT = ::T.let(nil, ::T.untyped)
+ DEFAULT_WIDTH_X_NOMINAL = ::T.let(nil, ::T.untyped)
+ OPERATORS = ::T.let(nil, ::T.untyped)
+ OPERATOR_CODES = ::T.let(nil, ::T.untyped)
+ PLACEHOLDER_LENGTH = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::PrivateDict
+end
+
+class TTFunk::Table::Cff::SubrIndex
+ def bias(); end
+end
+
+class TTFunk::Table::Cff::SubrIndex
+end
+
+class TTFunk::Table::Cff::TopDict
+ def cff(); end
+
+ def cff_offset(); end
+
+ def charset(); end
+
+ def charstring_type(); end
+
+ def charstrings_index(); end
+
+ def encode(*arg); end
+
+ def encoding(); end
+
+ def finalize(new_cff_data, new_to_old, old_to_new); end
+
+ def font_dict_selector(); end
+
+ def font_index(); end
+
+ def is_cid_font?(); end
+
+ def private_dict(); end
+
+ def ros(); end
+
+ def ros?(); end
+ DEFAULT_CHARSTRING_TYPE = ::T.let(nil, ::T.untyped)
+ OPERATORS = ::T.let(nil, ::T.untyped)
+ OPERATOR_CODES = ::T.let(nil, ::T.untyped)
+ PLACEHOLDER_LENGTH = ::T.let(nil, ::T.untyped)
+ POINTER_OPERATORS = ::T.let(nil, ::T.untyped)
+ POINTER_PLACEHOLDER_LENGTH = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::TopDict
+end
+
+class TTFunk::Table::Cff::TopIndex
+end
+
+class TTFunk::Table::Cff::TopIndex
+end
+
+class TTFunk::Table::Cmap::Subtable
+ ENCODING_MAPPINGS = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Dsig
+ TAG = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Glyf::Compound
+ ARG_1_AND_2_ARE_WORDS = ::T.let(nil, ::T.untyped)
+ MORE_COMPONENTS = ::T.let(nil, ::T.untyped)
+ WE_HAVE_AN_X_AND_Y_SCALE = ::T.let(nil, ::T.untyped)
+ WE_HAVE_A_SCALE = ::T.let(nil, ::T.untyped)
+ WE_HAVE_A_TWO_BY_TWO = ::T.let(nil, ::T.untyped)
+ WE_HAVE_INSTRUCTIONS = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Name
+ COMPATIBLE_FULL_NAME_ID = ::T.let(nil, ::T.untyped)
+ COPYRIGHT_NAME_ID = ::T.let(nil, ::T.untyped)
+ DESCRIPTION_NAME_ID = ::T.let(nil, ::T.untyped)
+ DESIGNER_NAME_ID = ::T.let(nil, ::T.untyped)
+ DESIGNER_URL_NAME_ID = ::T.let(nil, ::T.untyped)
+ FONT_FAMILY_NAME_ID = ::T.let(nil, ::T.untyped)
+ FONT_NAME_NAME_ID = ::T.let(nil, ::T.untyped)
+ FONT_SUBFAMILY_NAME_ID = ::T.let(nil, ::T.untyped)
+ LICENSE_NAME_ID = ::T.let(nil, ::T.untyped)
+ LICENSE_URL_NAME_ID = ::T.let(nil, ::T.untyped)
+ MANUFACTURER_NAME_ID = ::T.let(nil, ::T.untyped)
+ POSTSCRIPT_NAME_NAME_ID = ::T.let(nil, ::T.untyped)
+ PREFERRED_FAMILY_NAME_ID = ::T.let(nil, ::T.untyped)
+ PREFERRED_SUBFAMILY_NAME_ID = ::T.let(nil, ::T.untyped)
+ SAMPLE_TEXT_NAME_ID = ::T.let(nil, ::T.untyped)
+ TRADEMARK_NAME_ID = ::T.let(nil, ::T.untyped)
+ UNIQUE_SUBFAMILY_NAME_ID = ::T.let(nil, ::T.untyped)
+ VENDOR_URL_NAME_ID = ::T.let(nil, ::T.untyped)
+ VERSION_NAME_ID = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::OS2
+ CODEPOINT_SPACE = ::T.let(nil, ::T.untyped)
+ CODE_PAGE_BITS = ::T.let(nil, ::T.untyped)
+ LOWERCASE_COUNT = ::T.let(nil, ::T.untyped)
+ LOWERCASE_END = ::T.let(nil, ::T.untyped)
+ LOWERCASE_START = ::T.let(nil, ::T.untyped)
+ SPACE_GLYPH_MISSING_ERROR = ::T.let(nil, ::T.untyped)
+ UNICODE_BLOCKS = ::T.let(nil, ::T.untyped)
+ UNICODE_MAX = ::T.let(nil, ::T.untyped)
+ UNICODE_RANGES = ::T.let(nil, ::T.untyped)
+ WEIGHT_LOWERCASE = ::T.let(nil, ::T.untyped)
+ WEIGHT_SPACE = ::T.let(nil, ::T.untyped)
+end
+
+module TTFunk::Table::Post::Format10
+ POSTSCRIPT_GLYPHS = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Vorg
+ TAG = ::T.let(nil, ::T.untyped)
+end
+
+class Tempfile
+ def _close(); end
+ RUBYGEMS_ACTIVATION_MONITOR = ::T.let(nil, ::T.untyped)
+end
+
+class Tempfile::Remover
+ def call(*args); end
+
+ def initialize(tmpfile); end
+end
+
+class Tempfile::Remover
+end
+
+class TracePoint
+ def eval_script(); end
+
+ def instruction_sequence(); end
+
+ def parameters(); end
+end
+
+class TracePoint
+ def self.new(*events); end
+end
+
+class TrueClass
+ include ::JSON::Ext::Generator::GeneratorMethods::TrueClass
+end
+
+module URI
+ include ::URI::RFC2396_REGEXP
+end
+
+class URI::FTP
+ def self.new2(user, password, host, port, path, typecode=T.unsafe(nil), arg_check=T.unsafe(nil)); end
+end
+
+class URI::File
+ def check_password(user); end
+
+ def check_user(user); end
+
+ def check_userinfo(user); end
+
+ def set_userinfo(v); end
+ COMPONENT = ::T.let(nil, ::T.untyped)
+ DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+end
+
+class URI::File
+end
+
+class URI::LDAP
+ def attributes(); end
+
+ def attributes=(val); end
+
+ def dn(); end
+
+ def dn=(val); end
+
+ def extensions(); end
+
+ def extensions=(val); end
+
+ def filter(); end
+
+ def filter=(val); end
+
+ def initialize(*arg); end
+
+ def scope(); end
+
+ def scope=(val); end
+
+ def set_attributes(val); end
+
+ def set_dn(val); end
+
+ def set_extensions(val); end
+
+ def set_filter(val); end
+
+ def set_scope(val); end
+end
+
+class URI::MailTo
+ def initialize(*arg); end
+end
+
+URI::Parser = URI::RFC2396_Parser
+
+URI::REGEXP = URI::RFC2396_REGEXP
+
+class URI::RFC2396_Parser
+ def initialize(opts=T.unsafe(nil)); end
+end
+
+class URI::RFC3986_Parser
+ def join(*uris); end
+
+ def parse(uri); end
+
+ def regexp(); end
+
+ def split(uri); end
+ RFC3986_relative_ref = ::T.let(nil, ::T.untyped)
+end
+
+module URI::Util
+ def self.make_components_hash(klass, array_hash); end
+end
+
+module URI
+ extend ::URI::Escape
+ def self.get_encoding(label); end
+end
+
+module UnicodeNormalize
+end
+
+module UnicodeNormalize
+end
+
+module Warning
+ extend ::Warning
+end
+
+class Zlib::Deflate
+ def initialize(*arg); end
+end
+
+class Zlib::GzipReader
+ def initialize(*arg); end
+end
+
+class Zlib::GzipWriter
+ def initialize(*arg); end
+end
+
+class Zlib::Inflate
+ def initialize(*arg); end
+end
diff --git a/sorbet/rbi/sorbet-typed/lib/rake/all/rake.rbi b/sorbet/rbi/sorbet-typed/lib/rake/all/rake.rbi
new file mode 100644
index 0000000..53d5b85
--- /dev/null
+++ b/sorbet/rbi/sorbet-typed/lib/rake/all/rake.rbi
@@ -0,0 +1,645 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi sorbet-typed
+#
+# If you would like to make changes to this file, great! Please upstream any changes you make here:
+#
+# https://github.com/sorbet/sorbet-typed/edit/master/lib/rake/all/rake.rbi
+#
+# typed: false
+
+module Rake
+ def self.add_rakelib(*files); end
+ def self.application; end
+ def self.application=(app); end
+ def self.each_dir_parent(dir); end
+ def self.from_pathname(path); end
+ def self.load_rakefile(path); end
+ def self.original_dir; end
+ def self.suggested_thread_count; end
+ def self.with_application(block_application = nil); end
+ extend Rake::FileUtilsExt
+end
+module Rake::Version
+end
+class Module
+ def rake_extension(method); end
+end
+class String
+ def ext(newext = nil); end
+ def pathmap(spec = nil, &block); end
+ def pathmap_explode; end
+ def pathmap_partial(n); end
+ def pathmap_replace(patterns, &block); end
+end
+module Rake::Win32
+ def self.normalize(path); end
+ def self.win32_system_dir; end
+ def self.windows?; end
+end
+class Rake::Win32::Win32HomeError < RuntimeError
+end
+class Rake::LinkedList
+ def ==(other); end
+ def conj(item); end
+ def each; end
+ def empty?; end
+ def head; end
+ def initialize(head, tail = nil); end
+ def inspect; end
+ def self.cons(head, tail); end
+ def self.empty; end
+ def self.make(*args); end
+ def tail; end
+ def to_s; end
+ include Enumerable
+end
+class Rake::LinkedList::EmptyLinkedList < Rake::LinkedList
+ def empty?; end
+ def initialize; end
+ def self.cons(head, tail); end
+end
+class Rake::CpuCounter
+ def count; end
+ def count_with_default(default = nil); end
+ def self.count; end
+end
+class Rake::Scope < Rake::LinkedList
+ def path; end
+ def path_with_task_name(task_name); end
+ def trim(n); end
+end
+class Rake::Scope::EmptyScope < Rake::LinkedList::EmptyLinkedList
+ def path; end
+ def path_with_task_name(task_name); end
+end
+class Rake::TaskArgumentError < ArgumentError
+end
+class Rake::RuleRecursionOverflowError < StandardError
+ def add_target(target); end
+ def initialize(*args); end
+ def message; end
+end
+module Rake::TaskManager
+ def [](task_name, scopes = nil); end
+ def add_location(task); end
+ def attempt_rule(task_name, task_pattern, args, extensions, block, level); end
+ def clear; end
+ def create_rule(*args, &block); end
+ def current_scope; end
+ def define_task(task_class, *args, &block); end
+ def enhance_with_matching_rule(task_name, level = nil); end
+ def find_location; end
+ def generate_did_you_mean_suggestions(task_name); end
+ def generate_message_for_undefined_task(task_name); end
+ def generate_name; end
+ def get_description(task); end
+ def in_namespace(name); end
+ def initialize; end
+ def intern(task_class, task_name); end
+ def last_description; end
+ def last_description=(arg0); end
+ def lookup(task_name, initial_scope = nil); end
+ def lookup_in_scope(name, scope); end
+ def make_sources(task_name, task_pattern, extensions); end
+ def resolve_args(args); end
+ def resolve_args_with_dependencies(args, hash); end
+ def resolve_args_without_dependencies(args); end
+ def self.record_task_metadata; end
+ def self.record_task_metadata=(arg0); end
+ def synthesize_file_task(task_name); end
+ def tasks; end
+ def tasks_in_scope(scope); end
+ def trace_rule(level, message); end
+end
+module Rake::Cloneable
+ def initialize_copy(source); end
+end
+module FileUtils
+ def create_shell_runner(cmd); end
+ def ruby(*args, **options, &block); end
+ def safe_ln(*args, **options); end
+ def set_verbose_option(options); end
+ def sh(*cmd, &block); end
+ def sh_show_command(cmd); end
+ def split_all(path); end
+end
+module Rake::FileUtilsExt
+ def cd(*args, **options, &block); end
+ def chdir(*args, **options, &block); end
+ def chmod(*args, **options, &block); end
+ def chmod_R(*args, **options, &block); end
+ def chown(*args, **options, &block); end
+ def chown_R(*args, **options, &block); end
+ def copy(*args, **options, &block); end
+ def cp(*args, **options, &block); end
+ def cp_lr(*args, **options, &block); end
+ def cp_r(*args, **options, &block); end
+ def install(*args, **options, &block); end
+ def link(*args, **options, &block); end
+ def ln(*args, **options, &block); end
+ def ln_s(*args, **options, &block); end
+ def ln_sf(*args, **options, &block); end
+ def makedirs(*args, **options, &block); end
+ def mkdir(*args, **options, &block); end
+ def mkdir_p(*args, **options, &block); end
+ def mkpath(*args, **options, &block); end
+ def move(*args, **options, &block); end
+ def mv(*args, **options, &block); end
+ def nowrite(value = nil); end
+ def rake_check_options(options, *optdecl); end
+ def rake_output_message(message); end
+ def remove(*args, **options, &block); end
+ def rm(*args, **options, &block); end
+ def rm_f(*args, **options, &block); end
+ def rm_r(*args, **options, &block); end
+ def rm_rf(*args, **options, &block); end
+ def rmdir(*args, **options, &block); end
+ def rmtree(*args, **options, &block); end
+ def safe_unlink(*args, **options, &block); end
+ def self.nowrite_flag; end
+ def self.nowrite_flag=(arg0); end
+ def self.verbose_flag; end
+ def self.verbose_flag=(arg0); end
+ def symlink(*args, **options, &block); end
+ def touch(*args, **options, &block); end
+ def verbose(value = nil); end
+ def when_writing(msg = nil); end
+ extend Rake::FileUtilsExt
+ include FileUtils
+end
+class Rake::FileList
+ def &(*args, &block); end
+ def *(other); end
+ def +(*args, &block); end
+ def -(*args, &block); end
+ def <<(obj); end
+ def <=>(*args, &block); end
+ def ==(array); end
+ def [](*args, &block); end
+ def []=(*args, &block); end
+ def add(*filenames); end
+ def add_matching(pattern); end
+ def all?(*args, &block); end
+ def any?(*args, &block); end
+ def append(*args, &block); end
+ def assoc(*args, &block); end
+ def at(*args, &block); end
+ def bsearch(*args, &block); end
+ def bsearch_index(*args, &block); end
+ def chain(*args, &block); end
+ def chunk(*args, &block); end
+ def chunk_while(*args, &block); end
+ def clear(*args, &block); end
+ def clear_exclude; end
+ def collect!(*args, &block); end
+ def collect(*args, &block); end
+ def collect_concat(*args, &block); end
+ def combination(*args, &block); end
+ def compact!(*args, &block); end
+ def compact(*args, &block); end
+ def concat(*args, &block); end
+ def count(*args, &block); end
+ def cycle(*args, &block); end
+ def delete(*args, &block); end
+ def delete_at(*args, &block); end
+ def delete_if(*args, &block); end
+ def detect(*args, &block); end
+ def difference(*args, &block); end
+ def dig(*args, &block); end
+ def drop(*args, &block); end
+ def drop_while(*args, &block); end
+ def each(*args, &block); end
+ def each_cons(*args, &block); end
+ def each_entry(*args, &block); end
+ def each_index(*args, &block); end
+ def each_slice(*args, &block); end
+ def each_with_index(*args, &block); end
+ def each_with_object(*args, &block); end
+ def egrep(pattern, *options); end
+ def empty?(*args, &block); end
+ def entries(*args, &block); end
+ def exclude(*patterns, &block); end
+ def excluded_from_list?(fn); end
+ def existing!; end
+ def existing; end
+ def ext(newext = nil); end
+ def fetch(*args, &block); end
+ def fill(*args, &block); end
+ def filter!(*args, &block); end
+ def filter(*args, &block); end
+ def find(*args, &block); end
+ def find_all(*args, &block); end
+ def find_index(*args, &block); end
+ def first(*args, &block); end
+ def flat_map(*args, &block); end
+ def flatten!(*args, &block); end
+ def flatten(*args, &block); end
+ def grep(*args, &block); end
+ def grep_v(*args, &block); end
+ def group_by(*args, &block); end
+ def gsub!(pat, rep); end
+ def gsub(pat, rep); end
+ def import(array); end
+ def include(*filenames); end
+ def include?(*args, &block); end
+ def index(*args, &block); end
+ def initialize(*patterns); end
+ def inject(*args, &block); end
+ def insert(*args, &block); end
+ def inspect(*args, &block); end
+ def is_a?(klass); end
+ def join(*args, &block); end
+ def keep_if(*args, &block); end
+ def kind_of?(klass); end
+ def last(*args, &block); end
+ def lazy(*args, &block); end
+ def length(*args, &block); end
+ def map!(*args, &block); end
+ def map(*args, &block); end
+ def max(*args, &block); end
+ def max_by(*args, &block); end
+ def member?(*args, &block); end
+ def min(*args, &block); end
+ def min_by(*args, &block); end
+ def minmax(*args, &block); end
+ def minmax_by(*args, &block); end
+ def none?(*args, &block); end
+ def one?(*args, &block); end
+ def pack(*args, &block); end
+ def partition(&block); end
+ def pathmap(spec = nil, &block); end
+ def permutation(*args, &block); end
+ def pop(*args, &block); end
+ def prepend(*args, &block); end
+ def product(*args, &block); end
+ def push(*args, &block); end
+ def rassoc(*args, &block); end
+ def reduce(*args, &block); end
+ def reject!(*args, &block); end
+ def reject(*args, &block); end
+ def repeated_combination(*args, &block); end
+ def repeated_permutation(*args, &block); end
+ def replace(*args, &block); end
+ def resolve; end
+ def resolve_add(fn); end
+ def resolve_exclude; end
+ def reverse!(*args, &block); end
+ def reverse(*args, &block); end
+ def reverse_each(*args, &block); end
+ def rindex(*args, &block); end
+ def rotate!(*args, &block); end
+ def rotate(*args, &block); end
+ def sample(*args, &block); end
+ def select!(*args, &block); end
+ def select(*args, &block); end
+ def self.[](*args); end
+ def self.glob(pattern, *args); end
+ def shelljoin(*args, &block); end
+ def shift(*args, &block); end
+ def shuffle!(*args, &block); end
+ def shuffle(*args, &block); end
+ def size(*args, &block); end
+ def slice!(*args, &block); end
+ def slice(*args, &block); end
+ def slice_after(*args, &block); end
+ def slice_before(*args, &block); end
+ def slice_when(*args, &block); end
+ def sort!(*args, &block); end
+ def sort(*args, &block); end
+ def sort_by!(*args, &block); end
+ def sort_by(*args, &block); end
+ def sub!(pat, rep); end
+ def sub(pat, rep); end
+ def sum(*args, &block); end
+ def take(*args, &block); end
+ def take_while(*args, &block); end
+ def to_a; end
+ def to_ary; end
+ def to_h(*args, &block); end
+ def to_s; end
+ def to_set(*args, &block); end
+ def transpose(*args, &block); end
+ def union(*args, &block); end
+ def uniq!(*args, &block); end
+ def uniq(*args, &block); end
+ def unshift(*args, &block); end
+ def values_at(*args, &block); end
+ def zip(*args, &block); end
+ def |(*args, &block); end
+ include Rake::Cloneable
+end
+class Rake::Promise
+ def chore; end
+ def complete?; end
+ def discard; end
+ def error?; end
+ def initialize(args, &block); end
+ def recorder; end
+ def recorder=(arg0); end
+ def result?; end
+ def stat(*args); end
+ def value; end
+ def work; end
+end
+class Rake::ThreadPool
+ def __queue__; end
+ def future(*args, &block); end
+ def gather_history; end
+ def history; end
+ def initialize(thread_count); end
+ def join; end
+ def process_queue_item; end
+ def safe_thread_count; end
+ def start_thread; end
+ def stat(event, data = nil); end
+ def statistics; end
+end
+module Rake::PrivateReader
+ def self.included(base); end
+end
+module Rake::PrivateReader::ClassMethods
+ def private_reader(*names); end
+end
+class Rake::ThreadHistoryDisplay
+ def initialize(stats); end
+ def items; end
+ def rename(hash, key, renames); end
+ def show; end
+ def stats; end
+ def threads; end
+ extend Rake::PrivateReader::ClassMethods
+ include Rake::PrivateReader
+end
+module Rake::TraceOutput
+ def trace_on(out, *strings); end
+end
+class Rake::CommandLineOptionError < StandardError
+end
+class Rake::Application
+ def add_import(fn); end
+ def add_loader(ext, loader); end
+ def collect_command_line_tasks(args); end
+ def default_task_name; end
+ def deprecate(old_usage, new_usage, call_site); end
+ def display_cause_details(ex); end
+ def display_error_message(ex); end
+ def display_exception_backtrace(ex); end
+ def display_exception_details(ex); end
+ def display_exception_details_seen; end
+ def display_exception_message_details(ex); end
+ def display_prerequisites; end
+ def display_tasks_and_comments; end
+ def dynamic_width; end
+ def dynamic_width_stty; end
+ def dynamic_width_tput; end
+ def exit_because_of_exception(ex); end
+ def find_rakefile_location; end
+ def glob(path, &block); end
+ def handle_options(argv); end
+ def has_cause?(ex); end
+ def has_chain?(exception); end
+ def have_rakefile; end
+ def init(app_name = nil, argv = nil); end
+ def initialize; end
+ def invoke_task(task_string); end
+ def load_imports; end
+ def load_rakefile; end
+ def name; end
+ def options; end
+ def original_dir; end
+ def parse_task_string(string); end
+ def print_rakefile_directory(location); end
+ def rake_require(file_name, paths = nil, loaded = nil); end
+ def rakefile; end
+ def rakefile_location(backtrace = nil); end
+ def raw_load_rakefile; end
+ def run(argv = nil); end
+ def run_with_threads; end
+ def select_tasks_to_show(options, show_tasks, value); end
+ def select_trace_output(options, trace_option, value); end
+ def set_default_options; end
+ def sort_options(options); end
+ def standard_exception_handling; end
+ def standard_rake_options; end
+ def standard_system_dir; end
+ def system_dir; end
+ def terminal_columns; end
+ def terminal_columns=(arg0); end
+ def terminal_width; end
+ def thread_pool; end
+ def top_level; end
+ def top_level_tasks; end
+ def trace(*strings); end
+ def truncate(string, width); end
+ def truncate_output?; end
+ def tty_output=(arg0); end
+ def tty_output?; end
+ def unix?; end
+ def windows?; end
+ include Rake::TaskManager
+ include Rake::TraceOutput
+end
+class Rake::PseudoStatus
+ def >>(n); end
+ def exited?; end
+ def exitstatus; end
+ def initialize(code = nil); end
+ def stopped?; end
+ def to_i; end
+end
+class Rake::TaskArguments
+ def [](index); end
+ def each(&block); end
+ def extras; end
+ def fetch(*args, &block); end
+ def has_key?(key); end
+ def initialize(names, values, parent = nil); end
+ def inspect; end
+ def key?(key); end
+ def lookup(name); end
+ def method_missing(sym, *args); end
+ def names; end
+ def new_scope(names); end
+ def to_a; end
+ def to_hash; end
+ def to_s; end
+ def values_at(*keys); end
+ def with_defaults(defaults); end
+ include Enumerable
+end
+class Rake::InvocationChain < Rake::LinkedList
+ def append(invocation); end
+ def member?(invocation); end
+ def prefix; end
+ def self.append(invocation, chain); end
+ def to_s; end
+end
+class Rake::InvocationChain::EmptyInvocationChain < Rake::LinkedList::EmptyLinkedList
+ def append(invocation); end
+ def member?(obj); end
+ def to_s; end
+end
+module Rake::InvocationExceptionMixin
+ def chain; end
+ def chain=(value); end
+end
+class Rake::Task
+ def actions; end
+ def add_chain_to(exception, new_chain); end
+ def add_comment(comment); end
+ def add_description(description); end
+ def all_prerequisite_tasks; end
+ def already_invoked; end
+ def application; end
+ def application=(arg0); end
+ def arg_description; end
+ def arg_names; end
+ def clear; end
+ def clear_actions; end
+ def clear_args; end
+ def clear_comments; end
+ def clear_prerequisites; end
+ def collect_prerequisites(seen); end
+ def comment; end
+ def comment=(comment); end
+ def enhance(deps = nil, &block); end
+ def execute(args = nil); end
+ def first_sentence(string); end
+ def format_trace_flags; end
+ def full_comment; end
+ def initialize(task_name, app); end
+ def inspect; end
+ def investigation; end
+ def invoke(*args); end
+ def invoke_prerequisites(task_args, invocation_chain); end
+ def invoke_prerequisites_concurrently(task_args, invocation_chain); end
+ def invoke_with_call_chain(task_args, invocation_chain); end
+ def locations; end
+ def lookup_prerequisite(prerequisite_name); end
+ def name; end
+ def name_with_args; end
+ def needed?; end
+ def order_only_prerequisites; end
+ def prereqs; end
+ def prerequisite_tasks; end
+ def prerequisites; end
+ def reenable; end
+ def scope; end
+ def self.[](task_name); end
+ def self.clear; end
+ def self.create_rule(*args, &block); end
+ def self.define_task(*args, &block); end
+ def self.format_deps(deps); end
+ def self.scope_name(scope, task_name); end
+ def self.task_defined?(task_name); end
+ def self.tasks; end
+ def set_arg_names(args); end
+ def source; end
+ def sources; end
+ def sources=(arg0); end
+ def timestamp; end
+ def to_s; end
+ def transform_comments(separator, &block); end
+ def |(deps); end
+end
+class Rake::EarlyTime
+ def <=>(other); end
+ def self.allocate; end
+ def self.instance; end
+ def self.new(*arg0); end
+ def to_s; end
+ extend Singleton::SingletonClassMethods
+ include Comparable
+ include Singleton
+end
+class Rake::FileTask < Rake::Task
+ def needed?; end
+ def out_of_date?(stamp); end
+ def self.scope_name(scope, task_name); end
+ def timestamp; end
+end
+class Rake::FileCreationTask < Rake::FileTask
+ def needed?; end
+ def timestamp; end
+end
+class Rake::MultiTask < Rake::Task
+ def invoke_prerequisites(task_args, invocation_chain); end
+end
+module Rake::DSL
+ def cd(*args, **options, &block); end
+ def chdir(*args, **options, &block); end
+ def chmod(*args, **options, &block); end
+ def chmod_R(*args, **options, &block); end
+ def chown(*args, **options, &block); end
+ def chown_R(*args, **options, &block); end
+ def copy(*args, **options, &block); end
+ def cp(*args, **options, &block); end
+ def cp_lr(*args, **options, &block); end
+ def cp_r(*args, **options, &block); end
+ def desc(description); end
+ def directory(*args, &block); end
+ def file(*args, &block); end
+ def file_create(*args, &block); end
+ def import(*fns); end
+ def install(*args, **options, &block); end
+ def link(*args, **options, &block); end
+ def ln(*args, **options, &block); end
+ def ln_s(*args, **options, &block); end
+ def ln_sf(*args, **options, &block); end
+ def makedirs(*args, **options, &block); end
+ def mkdir(*args, **options, &block); end
+ def mkdir_p(*args, **options, &block); end
+ def mkpath(*args, **options, &block); end
+ def move(*args, **options, &block); end
+ def multitask(*args, &block); end
+ def mv(*args, **options, &block); end
+ def namespace(name = nil, &block); end
+ def nowrite(value = nil); end
+ def rake_check_options(options, *optdecl); end
+ def rake_output_message(message); end
+ def remove(*args, **options, &block); end
+ def rm(*args, **options, &block); end
+ def rm_f(*args, **options, &block); end
+ def rm_r(*args, **options, &block); end
+ def rm_rf(*args, **options, &block); end
+ def rmdir(*args, **options, &block); end
+ def rmtree(*args, **options, &block); end
+ def ruby(*args, **options, &block); end
+ def rule(*args, &block); end
+ def safe_ln(*args, **options); end
+ def safe_unlink(*args, **options, &block); end
+ def sh(*cmd, &block); end
+ def split_all(path); end
+ def symlink(*args, **options, &block); end
+ def task(*args, &block); end
+ def touch(*args, **options, &block); end
+ def verbose(value = nil); end
+ def when_writing(msg = nil); end
+ include Rake::FileUtilsExt
+end
+class Rake::DefaultLoader
+ def load(fn); end
+end
+class Rake::LateTime
+ def <=>(other); end
+ def self.allocate; end
+ def self.instance; end
+ def self.new(*arg0); end
+ def to_s; end
+ extend Singleton::SingletonClassMethods
+ include Comparable
+ include Singleton
+end
+class Rake::NameSpace
+ def [](name); end
+ def initialize(task_manager, scope_list); end
+ def scope; end
+ def tasks; end
+end
+module Rake::Backtrace
+ def self.collapse(backtrace); end
+end
+class Rake::TaskLib
+ include Rake::Cloneable
+ include Rake::DSL
+end
diff --git a/sorbet/rbi/sorbet-typed/lib/rspec-core/all/rspec-core.rbi b/sorbet/rbi/sorbet-typed/lib/rspec-core/all/rspec-core.rbi
new file mode 100644
index 0000000..e2cad3b
--- /dev/null
+++ b/sorbet/rbi/sorbet-typed/lib/rspec-core/all/rspec-core.rbi
@@ -0,0 +1,1891 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi sorbet-typed
+#
+# If you would like to make changes to this file, great! Please upstream any changes you make here:
+#
+# https://github.com/sorbet/sorbet-typed/edit/master/lib/rspec-core/all/rspec-core.rbi
+#
+# typed: false
+
+module RSpec
+ def self.clear_examples; end
+ def self.configuration; end
+ def self.configuration=(arg0); end
+ def self.configure; end
+ def self.const_missing(name); end
+ def self.context(*args, &example_group_block); end
+ def self.current_example; end
+ def self.current_example=(example); end
+ def self.describe(*args, &example_group_block); end
+ def self.example_group(*args, &example_group_block); end
+ def self.fcontext(*args, &example_group_block); end
+ def self.fdescribe(*args, &example_group_block); end
+ def self.reset; end
+ def self.shared_context(name, *args, &block); end
+ def self.shared_examples(name, *args, &block); end
+ def self.shared_examples_for(name, *args, &block); end
+ def self.world; end
+ def self.world=(arg0); end
+ def self.xcontext(*args, &example_group_block); end
+ def self.xdescribe(*args, &example_group_block); end
+ extend RSpec::Core::Warnings
+end
+module RSpec::Core
+ def self.path_to_executable; end
+end
+module RSpec::Core::Version
+end
+module RSpec::Core::Warnings
+ def deprecate(deprecated, data = nil); end
+ def warn_deprecation(message, opts = nil); end
+ def warn_with(message, options = nil); end
+end
+class RSpec::Core::Set
+ def <<(key); end
+ def clear; end
+ def delete(key); end
+ def each(&block); end
+ def empty?; end
+ def include?(key); end
+ def initialize(array = nil); end
+ def merge(values); end
+ include Enumerable
+end
+module RSpec::Core::FlatMap
+ def flat_map(array, &block); end
+ def self.flat_map(array, &block); end
+end
+class RSpec::Core::FilterManager
+ def add_ids(rerun_path, scoped_ids); end
+ def add_location(file_path, line_numbers); end
+ def add_path_to_arrays_filter(filter_key, path, values); end
+ def empty?; end
+ def exclude(*args); end
+ def exclude_only(*args); end
+ def exclude_with_low_priority(*args); end
+ def exclusions; end
+ def file_scoped_include?(ex_metadata, ids, locations); end
+ def include(*args); end
+ def include_only(*args); end
+ def include_with_low_priority(*args); end
+ def inclusions; end
+ def initialize; end
+ def prune(examples); end
+ def prune_conditionally_filtered_examples(examples); end
+end
+class RSpec::Core::FilterRules
+ def [](key); end
+ def add(updated); end
+ def add_with_low_priority(updated); end
+ def clear; end
+ def delete(key); end
+ def description; end
+ def each_pair(&block); end
+ def empty?; end
+ def fetch(*args, &block); end
+ def include_example?(example); end
+ def initialize(rules = nil); end
+ def opposite; end
+ def opposite=(arg0); end
+ def rules; end
+ def self.build; end
+ def use_only(updated); end
+end
+class RSpec::Core::InclusionRules < RSpec::Core::FilterRules
+ def add(*args); end
+ def add_with_low_priority(*args); end
+ def apply_standalone_filter(updated); end
+ def include_example?(example); end
+ def is_standalone_filter?(rules); end
+ def replace_filters(new_rules); end
+ def split_file_scoped_rules; end
+ def standalone?; end
+end
+module RSpec::Core::DSL
+ def self.change_global_dsl(&changes); end
+ def self.example_group_aliases; end
+ def self.expose_example_group_alias(name); end
+ def self.expose_example_group_alias_globally(method_name); end
+ def self.expose_globally!; end
+ def self.exposed_globally?; end
+ def self.remove_globally!; end
+ def self.top_level; end
+ def self.top_level=(arg0); end
+end
+module RSpec::Core::Formatters
+ def self.register(formatter_class, *notifications); end
+end
+module RSpec::Core::Formatters::ConsoleCodes
+ def config_colors_to_methods; end
+ def console_code_for(code_or_symbol); end
+ def self.config_colors_to_methods; end
+ def self.console_code_for(code_or_symbol); end
+ def self.wrap(text, code_or_symbol); end
+ def wrap(text, code_or_symbol); end
+end
+class RSpec::Core::Formatters::SnippetExtractor
+ def beginning_line_number; end
+ def expression_lines; end
+ def expression_node; end
+ def expression_outmost_node?(node); end
+ def initialize(source, beginning_line_number, max_line_count = nil); end
+ def line_range_of_expression; end
+ def line_range_of_location_nodes_in_expression; end
+ def location_nodes_at_beginning_line; end
+ def max_line_count; end
+ def self.extract_expression_lines_at(file_path, beginning_line_number, max_line_count = nil); end
+ def self.extract_line_at(file_path, line_number); end
+ def self.least_indentation_from(lines); end
+ def self.source_from_file(path); end
+ def source; end
+ def unclosed_tokens_in_line_range(line_range); end
+end
+class RSpec::Core::Formatters::SnippetExtractor::NoSuchFileError < StandardError
+end
+class RSpec::Core::Formatters::SnippetExtractor::NoSuchLineError < StandardError
+end
+class RSpec::Core::Formatters::SnippetExtractor::NoExpressionAtLineError < StandardError
+end
+class RSpec::Core::Formatters::SyntaxHighlighter
+ def color_enabled_implementation; end
+ def highlight(lines); end
+ def implementation; end
+ def initialize(configuration); end
+ def self.attempt_to_add_rspec_terms_to_coderay_keywords; end
+end
+module RSpec::Core::Formatters::SyntaxHighlighter::CodeRayImplementation
+ def self.highlight_syntax(lines); end
+end
+module RSpec::Core::Formatters::SyntaxHighlighter::NoSyntaxHighlightingImplementation
+ def self.highlight_syntax(lines); end
+end
+class RSpec::Core::Formatters::ExceptionPresenter
+ def add_shared_group_lines(lines, colorizer); end
+ def backtrace_formatter; end
+ def colorized_formatted_backtrace(colorizer = nil); end
+ def colorized_message_lines(colorizer = nil); end
+ def description; end
+ def detail_formatter; end
+ def encoded_description(description); end
+ def encoded_string(string); end
+ def encoding_of(string); end
+ def example; end
+ def exception; end
+ def exception_backtrace; end
+ def exception_class_name(exception = nil); end
+ def exception_lines; end
+ def exception_message_string(exception); end
+ def extra_detail_formatter; end
+ def extra_failure_lines; end
+ def failure_lines; end
+ def failure_slash_error_lines; end
+ def final_exception(exception, previous = nil); end
+ def find_failed_line; end
+ def formatted_backtrace(exception = nil); end
+ def formatted_cause(exception); end
+ def formatted_message_and_backtrace(colorizer); end
+ def fully_formatted(failure_number, colorizer = nil); end
+ def fully_formatted_lines(failure_number, colorizer); end
+ def indent_lines(lines, failure_number); end
+ def initialize(exception, example, options = nil); end
+ def message_color; end
+ def message_lines; end
+ def read_failed_lines; end
+end
+class RSpec::Core::Formatters::ExceptionPresenter::Factory
+ def build; end
+ def initialize(example); end
+ def multiple_exception_summarizer(exception, prior_detail_formatter, color); end
+ def multiple_exceptions_error?(exception); end
+ def options; end
+ def pending_options; end
+ def sub_failure_list_formatter(exception, message_color); end
+ def with_multiple_error_options_as_needed(exception, options); end
+end
+module RSpec::Core::Formatters::ExceptionPresenter::Factory::EmptyBacktraceFormatter
+ def self.format_backtrace(*arg0); end
+end
+class RSpec::Core::Formatters::ExceptionPresenter::Factory::CommonBacktraceTruncater
+ def initialize(parent); end
+ def with_truncated_backtrace(child); end
+end
+class RSpec::Core::MultipleExceptionError < StandardError
+ def aggregation_block_label; end
+ def aggregation_metadata; end
+ def all_exceptions; end
+ def exception_count_description; end
+ def failures; end
+ def initialize(*exceptions); end
+ def message; end
+ def other_errors; end
+ def summary; end
+ include RSpec::Core::MultipleExceptionError::InterfaceTag
+end
+module RSpec::Core::MultipleExceptionError::InterfaceTag
+ def add(exception); end
+ def self.for(ex); end
+end
+module RSpec::Core::ShellEscape
+ def conditionally_quote(id); end
+ def escape(shell_command); end
+ def quote(argument); end
+ def self.conditionally_quote(id); end
+ def self.escape(shell_command); end
+ def self.quote(argument); end
+ def self.shell_allows_unquoted_ids?; end
+ def shell_allows_unquoted_ids?; end
+end
+module RSpec::Core::Formatters::Helpers
+ def self.format_duration(duration); end
+ def self.format_seconds(float, precision = nil); end
+ def self.organize_ids(ids); end
+ def self.pluralize(count, string); end
+ def self.strip_trailing_zeroes(string); end
+end
+module RSpec::Core::Notifications
+end
+module RSpec::Core::Notifications::NullColorizer
+ def self.wrap(line, _code_or_symbol); end
+ def wrap(line, _code_or_symbol); end
+end
+class RSpec::Core::Notifications::StartNotification < Struct
+ def count; end
+ def count=(_); end
+ def load_time; end
+ def load_time=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::ExampleNotification < Struct
+ def example; end
+ def example=(_); end
+ def self.[](*arg0); end
+ def self.for(example); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::ExamplesNotification
+ def examples; end
+ def failed_examples; end
+ def failure_notifications; end
+ def format_examples(examples); end
+ def fully_formatted_failed_examples(colorizer = nil); end
+ def fully_formatted_pending_examples(colorizer = nil); end
+ def initialize(reporter); end
+ def notifications; end
+ def pending_examples; end
+ def pending_notifications; end
+end
+class RSpec::Core::Notifications::FailedExampleNotification < RSpec::Core::Notifications::ExampleNotification
+ def colorized_formatted_backtrace(colorizer = nil); end
+ def colorized_message_lines(colorizer = nil); end
+ def description; end
+ def exception; end
+ def formatted_backtrace; end
+ def fully_formatted(failure_number, colorizer = nil); end
+ def fully_formatted_lines(failure_number, colorizer = nil); end
+ def initialize(example, exception_presenter = nil); end
+ def message_lines; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::PendingExampleFixedNotification < RSpec::Core::Notifications::FailedExampleNotification
+end
+class RSpec::Core::Notifications::PendingExampleFailedAsExpectedNotification < RSpec::Core::Notifications::FailedExampleNotification
+end
+class RSpec::Core::Notifications::SkippedExampleNotification < RSpec::Core::Notifications::ExampleNotification
+ def fully_formatted(pending_number, colorizer = nil); end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::GroupNotification < Struct
+ def group; end
+ def group=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::MessageNotification < Struct
+ def message; end
+ def message=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::SeedNotification < Struct
+ def fully_formatted; end
+ def seed; end
+ def seed=(_); end
+ def seed_used?; end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def used; end
+ def used=(_); end
+end
+class RSpec::Core::Notifications::SummaryNotification < Struct
+ def colorized_rerun_commands(colorizer = nil); end
+ def colorized_totals_line(colorizer = nil); end
+ def duplicate_rerun_locations; end
+ def duration; end
+ def duration=(_); end
+ def errors_outside_of_examples_count; end
+ def errors_outside_of_examples_count=(_); end
+ def example_count; end
+ def examples; end
+ def examples=(_); end
+ def failed_examples; end
+ def failed_examples=(_); end
+ def failure_count; end
+ def formatted_duration; end
+ def formatted_load_time; end
+ def fully_formatted(colorizer = nil); end
+ def load_time; end
+ def load_time=(_); end
+ def pending_count; end
+ def pending_examples; end
+ def pending_examples=(_); end
+ def rerun_argument_for(example); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def totals_line; end
+ include RSpec::Core::ShellEscape
+end
+class RSpec::Core::Notifications::ProfileNotification
+ def calculate_slowest_groups; end
+ def duration; end
+ def examples; end
+ def initialize(duration, examples, number_of_examples, example_groups); end
+ def number_of_examples; end
+ def percentage; end
+ def slow_duration; end
+ def slowest_examples; end
+ def slowest_groups; end
+end
+class RSpec::Core::Notifications::DeprecationNotification < Struct
+ def call_site; end
+ def call_site=(_); end
+ def deprecated; end
+ def deprecated=(_); end
+ def message; end
+ def message=(_); end
+ def replacement; end
+ def replacement=(_); end
+ def self.[](*arg0); end
+ def self.from_hash(data); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::NullNotification
+end
+class RSpec::Core::Notifications::CustomNotification < Struct
+ def self.for(options = nil); end
+end
+class RSpec::Core::Reporter
+ def abort_with(msg, exit_status); end
+ def close; end
+ def close_after; end
+ def deprecation(hash); end
+ def ensure_listeners_ready; end
+ def example_failed(example); end
+ def example_finished(example); end
+ def example_group_finished(group); end
+ def example_group_started(group); end
+ def example_passed(example); end
+ def example_pending(example); end
+ def example_started(example); end
+ def examples; end
+ def exit_early(exit_code); end
+ def fail_fast_limit_met?; end
+ def failed_examples; end
+ def finish; end
+ def initialize(configuration); end
+ def message(message); end
+ def mute_profile_output?; end
+ def notify(event, notification); end
+ def notify_non_example_exception(exception, context_description); end
+ def pending_examples; end
+ def prepare_default(loader, output_stream, deprecation_stream); end
+ def publish(event, options = nil); end
+ def register_listener(listener, *notifications); end
+ def registered_listeners(notification); end
+ def report(expected_example_count); end
+ def seed_used?; end
+ def start(expected_example_count, time = nil); end
+ def stop; end
+end
+class RSpec::Core::NullReporter
+ def self.method_missing(*arg0); end
+end
+module RSpec::Core::Hooks
+ def after(*args, &block); end
+ def append_after(*args, &block); end
+ def append_before(*args, &block); end
+ def around(*args, &block); end
+ def before(*args, &block); end
+ def hooks; end
+ def prepend_after(*args, &block); end
+ def prepend_before(*args, &block); end
+end
+class RSpec::Core::Hooks::Hook < Struct
+ def block; end
+ def block=(_); end
+ def options; end
+ def options=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Hooks::BeforeHook < RSpec::Core::Hooks::Hook
+ def run(example); end
+end
+class RSpec::Core::Hooks::AfterHook < RSpec::Core::Hooks::Hook
+ def run(example); end
+end
+class RSpec::Core::Hooks::AfterContextHook < RSpec::Core::Hooks::Hook
+ def run(example); end
+end
+class RSpec::Core::Hooks::AroundHook < RSpec::Core::Hooks::Hook
+ def execute_with(example, procsy); end
+ def hook_description; end
+end
+class RSpec::Core::Hooks::HookCollections
+ def all_hooks_for(position, scope); end
+ def ensure_hooks_initialized_for(position, scope); end
+ def extract_scope_from(args); end
+ def hooks_for(position, scope); end
+ def initialize(owner, filterable_item_repo_class); end
+ def known_scope?(scope); end
+ def matching_hooks_for(position, scope, example_or_group); end
+ def normalized_scope_for(scope); end
+ def owner_parent_groups; end
+ def process(host, parent_groups, globals, position, scope); end
+ def processable_hooks_for(position, scope, host); end
+ def register(prepend_or_append, position, *args, &block); end
+ def register_global_singleton_context_hooks(example, globals); end
+ def register_globals(host, globals); end
+ def run(position, scope, example_or_group); end
+ def run_around_example_hooks_for(example); end
+ def run_example_hooks_for(example, position, each_method); end
+ def run_owned_hooks_for(position, scope, example_or_group); end
+ def scope_and_options_from(*args); end
+end
+module RSpec::Core::MemoizedHelpers
+ def __init_memoized; end
+ def __memoized; end
+ def initialize(*arg0); end
+ def is_expected; end
+ def self.define_helpers_on(example_group); end
+ def self.get_constant_or_yield(example_group, name); end
+ def self.module_for(example_group); end
+ def should(matcher = nil, message = nil); end
+ def should_not(matcher = nil, message = nil); end
+ def subject; end
+end
+class RSpec::Core::MemoizedHelpers::ThreadsafeMemoized
+ def fetch_or_store(key); end
+ def initialize; end
+end
+class RSpec::Core::MemoizedHelpers::NonThreadSafeMemoized
+ def fetch_or_store(key); end
+ def initialize; end
+end
+class RSpec::Core::MemoizedHelpers::ContextHookMemoized
+ def self.fetch_or_store(key, &_block); end
+ def self.isolate_for_context_hook(example_group_instance); end
+end
+class RSpec::Core::MemoizedHelpers::ContextHookMemoized::Before < RSpec::Core::MemoizedHelpers::ContextHookMemoized
+ def self.article; end
+ def self.hook_expression; end
+ def self.hook_intention; end
+end
+class RSpec::Core::MemoizedHelpers::ContextHookMemoized::After < RSpec::Core::MemoizedHelpers::ContextHookMemoized
+ def self.article; end
+ def self.hook_expression; end
+ def self.hook_intention; end
+end
+module RSpec::Core::MemoizedHelpers::ClassMethods
+ def let!(name, &block); end
+ def let(name, &block); end
+ def subject!(name = nil, &block); end
+ def subject(name = nil, &block); end
+end
+module RSpec::Core::Metadata
+ def self.ascend(metadata); end
+ def self.ascending(metadata); end
+ def self.build_hash_from(args, warn_about_example_group_filtering = nil); end
+ def self.deep_hash_dup(object); end
+ def self.id_from(metadata); end
+ def self.location_tuple_from(metadata); end
+ def self.relative_path(line); end
+ def self.relative_path_regex; end
+end
+class RSpec::Core::Metadata::HashPopulator
+ def block; end
+ def build_description_from(parent_description = nil, my_description = nil); end
+ def build_scoped_id_for(file_path); end
+ def description_args; end
+ def description_separator(parent_part, child_part); end
+ def ensure_valid_user_keys; end
+ def file_path_and_line_number_from(backtrace); end
+ def initialize(metadata, user_metadata, index_provider, description_args, block); end
+ def metadata; end
+ def populate; end
+ def populate_location_attributes; end
+ def user_metadata; end
+end
+class RSpec::Core::Metadata::ExampleHash < RSpec::Core::Metadata::HashPopulator
+ def described_class; end
+ def full_description; end
+ def self.create(group_metadata, user_metadata, index_provider, description, block); end
+end
+class RSpec::Core::Metadata::ExampleGroupHash < RSpec::Core::Metadata::HashPopulator
+ def described_class; end
+ def full_description; end
+ def self.backwards_compatibility_default_proc(&example_group_selector); end
+ def self.create(parent_group_metadata, user_metadata, example_group_index, *args, &block); end
+ def self.hash_with_backwards_compatibility_default_proc; end
+end
+module RSpec::Core::HashImitatable
+ def <(*args, &block); end
+ def <=(*args, &block); end
+ def >(*args, &block); end
+ def >=(*args, &block); end
+ def [](key); end
+ def []=(key, value); end
+ def all?(*args, &block); end
+ def any?(*args, &block); end
+ def assoc(*args, &block); end
+ def chain(*args, &block); end
+ def chunk(*args, &block); end
+ def chunk_while(*args, &block); end
+ def clear(*args, &block); end
+ def collect(*args, &block); end
+ def collect_concat(*args, &block); end
+ def compact!(*args, &block); end
+ def compact(*args, &block); end
+ def compare_by_identity(*args, &block); end
+ def compare_by_identity?(*args, &block); end
+ def count(*args, &block); end
+ def cycle(*args, &block); end
+ def default(*args, &block); end
+ def default=(*args, &block); end
+ def default_proc(*args, &block); end
+ def default_proc=(*args, &block); end
+ def delete(*args, &block); end
+ def delete_if(*args, &block); end
+ def detect(*args, &block); end
+ def dig(*args, &block); end
+ def directly_supports_attribute?(name); end
+ def drop(*args, &block); end
+ def drop_while(*args, &block); end
+ def each(*args, &block); end
+ def each_cons(*args, &block); end
+ def each_entry(*args, &block); end
+ def each_key(*args, &block); end
+ def each_pair(*args, &block); end
+ def each_slice(*args, &block); end
+ def each_value(*args, &block); end
+ def each_with_index(*args, &block); end
+ def each_with_object(*args, &block); end
+ def empty?(*args, &block); end
+ def entries(*args, &block); end
+ def extra_hash_attributes; end
+ def fetch(*args, &block); end
+ def fetch_values(*args, &block); end
+ def filter!(*args, &block); end
+ def filter(*args, &block); end
+ def find(*args, &block); end
+ def find_all(*args, &block); end
+ def find_index(*args, &block); end
+ def first(*args, &block); end
+ def flat_map(*args, &block); end
+ def flatten(*args, &block); end
+ def get_value(name); end
+ def grep(*args, &block); end
+ def grep_v(*args, &block); end
+ def group_by(*args, &block); end
+ def has_key?(*args, &block); end
+ def has_value?(*args, &block); end
+ def hash_for_delegation; end
+ def include?(*args, &block); end
+ def index(*args, &block); end
+ def inject(*args, &block); end
+ def invert(*args, &block); end
+ def issue_deprecation(_method_name, *_args); end
+ def keep_if(*args, &block); end
+ def key(*args, &block); end
+ def key?(*args, &block); end
+ def keys(*args, &block); end
+ def lazy(*args, &block); end
+ def length(*args, &block); end
+ def map(*args, &block); end
+ def max(*args, &block); end
+ def max_by(*args, &block); end
+ def member?(*args, &block); end
+ def merge!(*args, &block); end
+ def merge(*args, &block); end
+ def min(*args, &block); end
+ def min_by(*args, &block); end
+ def minmax(*args, &block); end
+ def minmax_by(*args, &block); end
+ def none?(*args, &block); end
+ def one?(*args, &block); end
+ def partition(*args, &block); end
+ def rassoc(*args, &block); end
+ def reduce(*args, &block); end
+ def rehash(*args, &block); end
+ def reject!(*args, &block); end
+ def reject(*args, &block); end
+ def replace(*args, &block); end
+ def reverse_each(*args, &block); end
+ def select!(*args, &block); end
+ def select(*args, &block); end
+ def self.included(klass); end
+ def set_value(name, value); end
+ def shift(*args, &block); end
+ def size(*args, &block); end
+ def slice(*args, &block); end
+ def slice_after(*args, &block); end
+ def slice_before(*args, &block); end
+ def slice_when(*args, &block); end
+ def sort(*args, &block); end
+ def sort_by(*args, &block); end
+ def store(*args, &block); end
+ def sum(*args, &block); end
+ def take(*args, &block); end
+ def take_while(*args, &block); end
+ def to_a(*args, &block); end
+ def to_h; end
+ def to_hash(*args, &block); end
+ def to_proc(*args, &block); end
+ def to_set(*args, &block); end
+ def transform_keys!(*args, &block); end
+ def transform_keys(*args, &block); end
+ def transform_values!(*args, &block); end
+ def transform_values(*args, &block); end
+ def uniq(*args, &block); end
+ def update(*args, &block); end
+ def value?(*args, &block); end
+ def values(*args, &block); end
+ def values_at(*args, &block); end
+ def zip(*args, &block); end
+end
+module RSpec::Core::HashImitatable::ClassMethods
+ def attr_accessor(*names); end
+ def hash_attribute_names; end
+end
+class RSpec::Core::LegacyExampleGroupHash
+ def directly_supports_attribute?(name); end
+ def get_value(name); end
+ def initialize(metadata); end
+ def set_value(name, value); end
+ def to_h; end
+ extend RSpec::Core::HashImitatable::ClassMethods
+ include RSpec::Core::HashImitatable
+end
+module RSpec::Core::MetadataFilter
+ def self.apply?(predicate, filters, metadata); end
+ def self.filter_applies?(key, filter_value, metadata); end
+ def self.filter_applies_to_any_value?(key, value, metadata); end
+ def self.filters_apply?(key, value, metadata); end
+ def self.id_filter_applies?(rerun_paths_to_scoped_ids, metadata); end
+ def self.location_filter_applies?(locations, metadata); end
+ def self.proc_filter_applies?(key, proc, metadata); end
+ def self.silence_metadata_example_group_deprecations; end
+end
+module RSpec::Core::FilterableItemRepository
+end
+class RSpec::Core::FilterableItemRepository::UpdateOptimized
+ def append(item, metadata); end
+ def delete(item, metadata); end
+ def initialize(applies_predicate); end
+ def items_and_filters; end
+ def items_for(request_meta); end
+ def prepend(item, metadata); end
+end
+class RSpec::Core::FilterableItemRepository::QueryOptimized < RSpec::Core::FilterableItemRepository::UpdateOptimized
+ def append(item, metadata); end
+ def applicable_metadata_from(metadata); end
+ def delete(item, metadata); end
+ def find_items_for(request_meta); end
+ def handle_mutation(metadata); end
+ def initialize(applies_predicate); end
+ def items_for(metadata); end
+ def prepend(item, metadata); end
+ def proc_keys_from(metadata); end
+ def reconstruct_caches; end
+end
+module RSpec::Core::Pending
+ def pending(message = nil); end
+ def self.mark_fixed!(example); end
+ def self.mark_pending!(example, message_or_bool); end
+ def self.mark_skipped!(example, message_or_bool); end
+ def skip(message = nil); end
+end
+class RSpec::Core::Pending::SkipDeclaredInExample < StandardError
+ def argument; end
+ def initialize(argument); end
+end
+class RSpec::Core::Pending::PendingExampleFixedError < StandardError
+end
+class RSpec::Core::Formatters::Loader
+ def add(formatter_to_use, *paths); end
+ def built_in_formatter(key); end
+ def custom_formatter(formatter_ref); end
+ def default_formatter; end
+ def default_formatter=(arg0); end
+ def duplicate_formatter_exists?(new_formatter); end
+ def existing_formatter_implements?(notification); end
+ def find_formatter(formatter_to_use); end
+ def formatters; end
+ def initialize(reporter); end
+ def notifications_for(formatter_class); end
+ def open_stream(path_or_wrapper); end
+ def path_for(const_ref); end
+ def prepare_default(output_stream, deprecation_stream); end
+ def register(formatter, notifications); end
+ def reporter; end
+ def self.formatters; end
+ def setup_default(output_stream, deprecation_stream); end
+ def string_const?(str); end
+ def underscore(camel_cased_word); end
+ def underscore_with_fix_for_non_standard_rspec_naming(string); end
+end
+module RSpec::Core::Ordering
+end
+class RSpec::Core::Ordering::Identity
+ def order(items); end
+end
+class RSpec::Core::Ordering::Random
+ def initialize(configuration); end
+ def jenkins_hash_digest(string); end
+ def order(items); end
+ def used?; end
+end
+class RSpec::Core::Ordering::Custom
+ def initialize(callable); end
+ def order(list); end
+end
+class RSpec::Core::Ordering::Registry
+ def fetch(name, &fallback); end
+ def initialize(configuration); end
+ def register(sym, strategy); end
+ def used_random_seed?; end
+end
+class RSpec::Core::Ordering::ConfigurationManager
+ def force(hash); end
+ def initialize; end
+ def order=(type); end
+ def ordering_registry; end
+ def register_ordering(name, strategy = nil); end
+ def seed; end
+ def seed=(seed); end
+ def seed_used?; end
+end
+class RSpec::Core::World
+ def all_example_groups; end
+ def all_examples; end
+ def announce_exclusion_filter(announcements); end
+ def announce_filters; end
+ def announce_inclusion_filter(announcements); end
+ def descending_declaration_line_numbers_by_file; end
+ def everything_filtered_message; end
+ def example_count(groups = nil); end
+ def example_group_counts_by_spec_file; end
+ def example_groups; end
+ def exclusion_filter; end
+ def fail_if_config_and_cli_options_invalid; end
+ def filter_manager; end
+ def filtered_examples; end
+ def inclusion_filter; end
+ def initialize(configuration = nil); end
+ def non_example_failure; end
+ def non_example_failure=(arg0); end
+ def num_example_groups_defined_in(file); end
+ def ordered_example_groups; end
+ def preceding_declaration_line(absolute_file_name, filter_line); end
+ def prepare_example_filtering; end
+ def record(example_group); end
+ def registered_example_group_files; end
+ def report_filter_message(message); end
+ def reporter; end
+ def reset; end
+ def shared_example_group_registry; end
+ def source_from_file(path); end
+ def syntax_highlighter; end
+ def traverse_example_group_trees_until(&block); end
+ def wants_to_quit; end
+ def wants_to_quit=(arg0); end
+end
+module RSpec::Core::World::Null
+ def self.all_example_groups; end
+ def self.example_groups; end
+ def self.non_example_failure; end
+ def self.non_example_failure=(_); end
+ def self.registered_example_group_files; end
+ def self.traverse_example_group_trees_until; end
+end
+class RSpec::Core::BacktraceFormatter
+ def backtrace_line(line); end
+ def exclude?(line); end
+ def exclusion_patterns; end
+ def exclusion_patterns=(arg0); end
+ def filter_gem(gem_name); end
+ def format_backtrace(backtrace, options = nil); end
+ def full_backtrace=(arg0); end
+ def full_backtrace?; end
+ def inclusion_patterns; end
+ def inclusion_patterns=(arg0); end
+ def initialize; end
+ def matches?(patterns, line); end
+end
+module RSpec::Core::RubyProject
+ def add_dir_to_load_path(dir); end
+ def add_to_load_path(*dirs); end
+ def ascend_until; end
+ def determine_root; end
+ def find_first_parent_containing(dir); end
+ def root; end
+ def self.add_dir_to_load_path(dir); end
+ def self.add_to_load_path(*dirs); end
+ def self.ascend_until; end
+ def self.determine_root; end
+ def self.find_first_parent_containing(dir); end
+ def self.root; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter
+ def count; end
+ def deprecation(notification); end
+ def deprecation_message_for(data); end
+ def deprecation_stream; end
+ def deprecation_summary(_notification); end
+ def initialize(deprecation_stream, summary_stream); end
+ def output; end
+ def printer; end
+ def summary_stream; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::SpecifiedDeprecationMessage < Struct
+ def deprecation_type_for(data); end
+ def initialize(data); end
+ def output_formatted(str); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def to_s; end
+ def too_many_warnings_message; end
+ def type; end
+ def type=(_); end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::GeneratedDeprecationMessage < Struct
+ def initialize(data); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+ def to_s; end
+ def too_many_warnings_message; end
+ def type; end
+ def type=(_); end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::ImmediatePrinter
+ def deprecation_formatter; end
+ def deprecation_stream; end
+ def deprecation_summary; end
+ def initialize(deprecation_stream, summary_stream, deprecation_formatter); end
+ def print_deprecation_message(data); end
+ def summary_stream; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::DelayedPrinter
+ def deprecation_formatter; end
+ def deprecation_stream; end
+ def deprecation_summary; end
+ def initialize(deprecation_stream, summary_stream, deprecation_formatter); end
+ def print_deferred_deprecation_warnings; end
+ def print_deprecation_message(data); end
+ def stash_deprecation_message(deprecation_message); end
+ def summary_stream; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::RaiseErrorStream
+ def puts(message); end
+ def summarize(summary_stream, deprecation_count); end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::FileStream
+ def initialize(file); end
+ def puts(*args); end
+ def summarize(summary_stream, deprecation_count); end
+end
+class RSpec::Core::DeprecationError < StandardError
+end
+class RSpec::Core::OutputWrapper
+ def <<(*args, &block); end
+ def advise(*args, &block); end
+ def autoclose=(*args, &block); end
+ def autoclose?(*args, &block); end
+ def binmode(*args, &block); end
+ def binmode?(*args, &block); end
+ def bytes(*args, &block); end
+ def chars(*args, &block); end
+ def close(*args, &block); end
+ def close_on_exec=(*args, &block); end
+ def close_on_exec?(*args, &block); end
+ def close_read(*args, &block); end
+ def close_write(*args, &block); end
+ def closed?(*args, &block); end
+ def codepoints(*args, &block); end
+ def each(*args, &block); end
+ def each_byte(*args, &block); end
+ def each_char(*args, &block); end
+ def each_codepoint(*args, &block); end
+ def each_line(*args, &block); end
+ def eof(*args, &block); end
+ def eof?(*args, &block); end
+ def external_encoding(*args, &block); end
+ def fcntl(*args, &block); end
+ def fdatasync(*args, &block); end
+ def fileno(*args, &block); end
+ def flush(*args, &block); end
+ def fsync(*args, &block); end
+ def getbyte(*args, &block); end
+ def getc(*args, &block); end
+ def gets(*args, &block); end
+ def initialize(output); end
+ def inspect(*args, &block); end
+ def internal_encoding(*args, &block); end
+ def ioctl(*args, &block); end
+ def isatty(*args, &block); end
+ def lineno(*args, &block); end
+ def lineno=(*args, &block); end
+ def lines(*args, &block); end
+ def method_missing(name, *args, &block); end
+ def nread(*args, &block); end
+ def output; end
+ def output=(arg0); end
+ def pathconf(*args, &block); end
+ def pid(*args, &block); end
+ def pos(*args, &block); end
+ def pos=(*args, &block); end
+ def pread(*args, &block); end
+ def print(*args, &block); end
+ def printf(*args, &block); end
+ def putc(*args, &block); end
+ def puts(*args, &block); end
+ def pwrite(*args, &block); end
+ def read(*args, &block); end
+ def read_nonblock(*args, &block); end
+ def readbyte(*args, &block); end
+ def readchar(*args, &block); end
+ def readline(*args, &block); end
+ def readlines(*args, &block); end
+ def readpartial(*args, &block); end
+ def ready?(*args, &block); end
+ def reopen(*args, &block); end
+ def respond_to?(name, priv = nil); end
+ def rewind(*args, &block); end
+ def seek(*args, &block); end
+ def set_encoding(*args, &block); end
+ def stat(*args, &block); end
+ def sync(*args, &block); end
+ def sync=(*args, &block); end
+ def sysread(*args, &block); end
+ def sysseek(*args, &block); end
+ def syswrite(*args, &block); end
+ def tell(*args, &block); end
+ def to_i(*args, &block); end
+ def to_io(*args, &block); end
+ def tty?(*args, &block); end
+ def ungetbyte(*args, &block); end
+ def ungetc(*args, &block); end
+ def wait(*args, &block); end
+ def wait_readable(*args, &block); end
+ def wait_writable(*args, &block); end
+ def write(*args, &block); end
+ def write_nonblock(*args, &block); end
+end
+class RSpec::Core::Configuration
+ def absolute_pattern?(pattern); end
+ def add_formatter(formatter, output = nil); end
+ def add_hook_to_existing_matching_groups(meta, scope, &block); end
+ def add_setting(name, opts = nil); end
+ def after(scope = nil, *meta, &block); end
+ def alias_example_group_to(new_name, *args); end
+ def alias_example_to(name, *args); end
+ def alias_it_behaves_like_to(new_name, report_label = nil); end
+ def alias_it_should_behave_like_to(new_name, report_label = nil); end
+ def append_after(scope = nil, *meta, &block); end
+ def append_before(scope = nil, *meta, &block); end
+ def apply_derived_metadata_to(metadata); end
+ def around(scope = nil, *meta, &block); end
+ def assert_no_example_groups_defined(config_option); end
+ def backtrace_exclusion_patterns; end
+ def backtrace_exclusion_patterns=(patterns); end
+ def backtrace_formatter; end
+ def backtrace_inclusion_patterns; end
+ def backtrace_inclusion_patterns=(patterns); end
+ def before(scope = nil, *meta, &block); end
+ def bisect_runner; end
+ def bisect_runner=(value); end
+ def bisect_runner_class; end
+ def clear_values_derived_from_example_status_persistence_file_path; end
+ def color; end
+ def color=(arg0); end
+ def color_enabled?(output = nil); end
+ def color_mode; end
+ def color_mode=(arg0); end
+ def command; end
+ def conditionally_disable_expectations_monkey_patching; end
+ def conditionally_disable_mocks_monkey_patching; end
+ def configure_example(example, example_hooks); end
+ def configure_expectation_framework; end
+ def configure_group(group); end
+ def configure_group_with(group, module_list, application_method); end
+ def configure_mock_framework; end
+ def default_color; end
+ def default_color=(arg0); end
+ def default_color?; end
+ def default_formatter; end
+ def default_formatter=(value); end
+ def default_path; end
+ def default_path=(path); end
+ def default_path?; end
+ def define_built_in_hooks; end
+ def define_derived_metadata(*filters, &block); end
+ def define_mixed_in_module(mod, filters, mod_list, config_method, &block); end
+ def deprecation_stream; end
+ def deprecation_stream=(value); end
+ def detail_color; end
+ def detail_color=(arg0); end
+ def detail_color?; end
+ def disable_monkey_patching!; end
+ def disable_monkey_patching; end
+ def disable_monkey_patching=(arg0); end
+ def drb; end
+ def drb=(arg0); end
+ def drb?; end
+ def drb_port; end
+ def drb_port=(arg0); end
+ def drb_port?; end
+ def dry_run; end
+ def dry_run=(arg0); end
+ def dry_run?; end
+ def error_exit_code; end
+ def error_exit_code=(arg0); end
+ def error_exit_code?; end
+ def error_stream; end
+ def error_stream=(arg0); end
+ def error_stream?; end
+ def example_status_persistence_file_path; end
+ def example_status_persistence_file_path=(value); end
+ def exclude_pattern; end
+ def exclude_pattern=(value); end
+ def exclusion_filter; end
+ def exclusion_filter=(filter); end
+ def expect_with(*frameworks); end
+ def expectation_framework=(framework); end
+ def expectation_frameworks; end
+ def expose_current_running_example_as(method_name); end
+ def expose_dsl_globally=(value); end
+ def expose_dsl_globally?; end
+ def extend(mod, *filters); end
+ def extract_location(path); end
+ def fail_fast; end
+ def fail_fast=(value); end
+ def fail_if_no_examples; end
+ def fail_if_no_examples=(arg0); end
+ def fail_if_no_examples?; end
+ def failure_color; end
+ def failure_color=(arg0); end
+ def failure_color?; end
+ def failure_exit_code; end
+ def failure_exit_code=(arg0); end
+ def failure_exit_code?; end
+ def file_glob_from(path, pattern); end
+ def files_or_directories_to_run=(*files); end
+ def files_to_run; end
+ def files_to_run=(arg0); end
+ def filter; end
+ def filter=(filter); end
+ def filter_gems_from_backtrace(*gem_names); end
+ def filter_manager; end
+ def filter_manager=(arg0); end
+ def filter_run(*args); end
+ def filter_run_excluding(*args); end
+ def filter_run_including(*args); end
+ def filter_run_when_matching(*args); end
+ def fixed_color; end
+ def fixed_color=(arg0); end
+ def fixed_color?; end
+ def force(hash); end
+ def format_docstrings(&block); end
+ def format_docstrings_block; end
+ def formatter=(formatter, output = nil); end
+ def formatter_loader; end
+ def formatters; end
+ def full_backtrace=(true_or_false); end
+ def full_backtrace?; end
+ def full_description; end
+ def full_description=(description); end
+ def gather_directories(path); end
+ def get_files_to_run(paths); end
+ def get_matching_files(path, pattern); end
+ def handle_suite_hook(scope, meta); end
+ def hooks; end
+ def in_project_source_dir_regex; end
+ def include(mod, *filters); end
+ def include_context(shared_group_name, *filters); end
+ def inclusion_filter; end
+ def inclusion_filter=(filter); end
+ def initialize; end
+ def last_run_statuses; end
+ def libs; end
+ def libs=(libs); end
+ def load_file_handling_errors(method, file); end
+ def load_spec_files; end
+ def loaded_spec_files; end
+ def max_displayed_failure_line_count; end
+ def max_displayed_failure_line_count=(arg0); end
+ def max_displayed_failure_line_count?; end
+ def metadata_applies_to_group?(meta, group); end
+ def mock_framework; end
+ def mock_framework=(framework); end
+ def mock_with(framework); end
+ def on_example_group_definition(&block); end
+ def on_example_group_definition_callbacks; end
+ def on_existing_matching_groups(meta); end
+ def only_failures; end
+ def only_failures?; end
+ def only_failures_but_not_configured?; end
+ def order=(*args, &block); end
+ def ordering_manager; end
+ def ordering_registry(*args, &block); end
+ def output_stream; end
+ def output_stream=(value); end
+ def output_to_tty?(output = nil); end
+ def output_wrapper; end
+ def paths_to_check(paths); end
+ def pattern; end
+ def pattern=(value); end
+ def pattern_might_load_specs_from_vendored_dirs?; end
+ def pending_color; end
+ def pending_color=(arg0); end
+ def pending_color?; end
+ def prepend(mod, *filters); end
+ def prepend_after(scope = nil, *meta, &block); end
+ def prepend_before(scope = nil, *meta, &block); end
+ def profile_examples; end
+ def profile_examples=(arg0); end
+ def profile_examples?; end
+ def project_source_dirs; end
+ def project_source_dirs=(arg0); end
+ def project_source_dirs?; end
+ def raise_errors_for_deprecations!; end
+ def raise_on_warning=(value); end
+ def register_ordering(*args, &block); end
+ def reporter; end
+ def requires; end
+ def requires=(paths); end
+ def reset; end
+ def reset_filters; end
+ def reset_reporter; end
+ def rspec_expectations_loaded?; end
+ def rspec_mocks_loaded?; end
+ def run_all_when_everything_filtered; end
+ def run_all_when_everything_filtered=(arg0); end
+ def run_all_when_everything_filtered?; end
+ def run_suite_hooks(hook_description, hooks); end
+ def safe_extend(mod, host); end
+ def safe_include(mod, host); end
+ def safe_prepend(mod, host); end
+ def seed(*args, &block); end
+ def seed=(*args, &block); end
+ def seed_used?(*args, &block); end
+ def self.add_read_only_setting(name, opts = nil); end
+ def self.add_setting(name, opts = nil); end
+ def self.define_alias(name, alias_name); end
+ def self.define_predicate(name); end
+ def self.define_reader(name); end
+ def self.delegate_to_ordering_manager(*methods); end
+ def shared_context_metadata_behavior; end
+ def shared_context_metadata_behavior=(value); end
+ def silence_filter_announcements; end
+ def silence_filter_announcements=(arg0); end
+ def silence_filter_announcements?; end
+ def spec_files_with_failures; end
+ def start_time; end
+ def start_time=(arg0); end
+ def start_time?; end
+ def static_config_filter_manager; end
+ def static_config_filter_manager=(arg0); end
+ def success_color; end
+ def success_color=(arg0); end
+ def success_color?; end
+ def threadsafe; end
+ def threadsafe=(arg0); end
+ def threadsafe?; end
+ def treat_symbols_as_metadata_keys_with_true_values=(_value); end
+ def tty; end
+ def tty=(arg0); end
+ def tty?; end
+ def update_pattern_attr(name, value); end
+ def value_for(key); end
+ def warnings=(value); end
+ def warnings?; end
+ def when_first_matching_example_defined(*filters); end
+ def with_suite_hooks; end
+ def world; end
+ def world=(arg0); end
+ include RSpec::Core::Configuration::Readers
+ include RSpec::Core::Hooks
+end
+module RSpec::Core::Configuration::Readers
+ def default_color; end
+ def default_path; end
+ def deprecation_stream; end
+ def detail_color; end
+ def drb; end
+ def drb_port; end
+ def dry_run; end
+ def error_exit_code; end
+ def error_stream; end
+ def example_status_persistence_file_path; end
+ def exclude_pattern; end
+ def fail_fast; end
+ def fail_if_no_examples; end
+ def failure_color; end
+ def failure_exit_code; end
+ def fixed_color; end
+ def libs; end
+ def max_displayed_failure_line_count; end
+ def only_failures; end
+ def output_stream; end
+ def pattern; end
+ def pending_color; end
+ def project_source_dirs; end
+ def requires; end
+ def run_all_when_everything_filtered; end
+ def shared_context_metadata_behavior; end
+ def silence_filter_announcements; end
+ def start_time; end
+ def success_color; end
+ def threadsafe; end
+ def tty; end
+end
+class RSpec::Core::Configuration::MustBeConfiguredBeforeExampleGroupsError < StandardError
+end
+class RSpec::Core::Configuration::DeprecationReporterBuffer
+ def deprecation(*args); end
+ def initialize; end
+ def play_onto(reporter); end
+end
+module RSpec::Core::Configuration::ExposeCurrentExample
+end
+class RSpec::Core::Parser
+ def add_tag_filter(options, filter_type, tag_name, value = nil); end
+ def configure_only_failures(options); end
+ def initialize(original_args); end
+ def original_args; end
+ def parse(source = nil); end
+ def parser(options); end
+ def self.parse(args, source = nil); end
+ def set_fail_fast(options, value); end
+end
+class RSpec::Core::ConfigurationOptions
+ def args; end
+ def args_from_options_file(path); end
+ def command_line_options; end
+ def configure(config); end
+ def configure_filter_manager(filter_manager); end
+ def custom_options; end
+ def custom_options_file; end
+ def env_options; end
+ def file_options; end
+ def force?(key); end
+ def global_options; end
+ def global_options_file; end
+ def home_options_file_path; end
+ def initialize(args); end
+ def load_formatters_into(config); end
+ def local_options; end
+ def local_options_file; end
+ def options; end
+ def options_file_as_erb_string(path); end
+ def options_from(path); end
+ def order(keys); end
+ def organize_options; end
+ def parse_args_ignoring_files_or_dirs_to_run(args, source); end
+ def process_options_into(config); end
+ def project_options; end
+ def project_options_file; end
+ def resolve_xdg_config_home; end
+ def xdg_options_file_if_exists; end
+ def xdg_options_file_path; end
+end
+class RSpec::Core::Runner
+ def configuration; end
+ def configure(err, out); end
+ def exit_code(examples_passed = nil); end
+ def initialize(options, configuration = nil, world = nil); end
+ def options; end
+ def persist_example_statuses; end
+ def run(err, out); end
+ def run_specs(example_groups); end
+ def self.autorun; end
+ def self.autorun_disabled?; end
+ def self.disable_autorun!; end
+ def self.handle_interrupt; end
+ def self.installed_at_exit?; end
+ def self.invoke; end
+ def self.perform_at_exit; end
+ def self.run(args, err = nil, out = nil); end
+ def self.running_in_drb?; end
+ def self.trap_interrupt; end
+ def setup(err, out); end
+ def world; end
+end
+module RSpec::Core::Invocations
+end
+class RSpec::Core::Invocations::InitializeProject
+ def call(*_args); end
+end
+class RSpec::Core::Invocations::DRbWithFallback
+ def call(options, err, out); end
+end
+class RSpec::Core::Invocations::Bisect
+ def bisect_formatter_klass_for(argument); end
+ def call(options, err, out); end
+end
+class RSpec::Core::Invocations::PrintVersion
+ def call(_options, _err, out); end
+end
+class RSpec::Core::Invocations::PrintHelp < Struct
+ def call(_options, _err, out); end
+ def hidden_options; end
+ def hidden_options=(_); end
+ def parser; end
+ def parser=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Example
+ def assign_generated_description; end
+ def clock; end
+ def clock=(arg0); end
+ def description; end
+ def display_exception; end
+ def display_exception=(ex); end
+ def duplicate_with(metadata_overrides = nil); end
+ def example_group; end
+ def example_group_instance; end
+ def exception; end
+ def execution_result; end
+ def fail_with_exception(reporter, exception); end
+ def file_path; end
+ def finish(reporter); end
+ def full_description; end
+ def generate_description; end
+ def hooks; end
+ def id; end
+ def initialize(example_group_class, description, user_metadata, example_block = nil); end
+ def inspect; end
+ def inspect_output; end
+ def instance_exec(*args, &block); end
+ def location; end
+ def location_description; end
+ def location_rerun_argument; end
+ def metadata; end
+ def mocks_need_verification?; end
+ def pending; end
+ def pending?; end
+ def record_finished(status, reporter); end
+ def reporter; end
+ def rerun_argument; end
+ def run(example_group_instance, reporter); end
+ def run_after_example; end
+ def run_before_example; end
+ def self.delegate_to_metadata(key); end
+ def self.parse_id(id); end
+ def set_aggregate_failures_exception(exception); end
+ def set_exception(exception); end
+ def skip; end
+ def skip_with_exception(reporter, exception); end
+ def skipped?; end
+ def start(reporter); end
+ def to_s; end
+ def update_inherited_metadata(updates); end
+ def verify_mocks; end
+ def with_around_and_singleton_context_hooks; end
+ def with_around_example_hooks; end
+end
+class RSpec::Core::Example::Procsy
+ def <<(*a, &b); end
+ def ===(*a, &b); end
+ def >>(*a, &b); end
+ def [](*a, &b); end
+ def arity(*a, &b); end
+ def binding(*a, &b); end
+ def call(*args, &block); end
+ def clock(*a, &b); end
+ def clock=(*a, &b); end
+ def clone(*a, &b); end
+ def curry(*a, &b); end
+ def description(*a, &b); end
+ def dup(*a, &b); end
+ def duplicate_with(*a, &b); end
+ def example; end
+ def example_group(*a, &b); end
+ def example_group_instance(*a, &b); end
+ def exception(*a, &b); end
+ def executed?; end
+ def execution_result(*a, &b); end
+ def file_path(*a, &b); end
+ def full_description(*a, &b); end
+ def hash(*a, &b); end
+ def id(*a, &b); end
+ def initialize(example, &block); end
+ def inspect; end
+ def inspect_output(*a, &b); end
+ def lambda?(*a, &b); end
+ def location(*a, &b); end
+ def location_rerun_argument(*a, &b); end
+ def metadata(*a, &b); end
+ def parameters(*a, &b); end
+ def pending(*a, &b); end
+ def pending?(*a, &b); end
+ def reporter(*a, &b); end
+ def rerun_argument(*a, &b); end
+ def run(*args, &block); end
+ def skip(*a, &b); end
+ def skipped?(*a, &b); end
+ def source_location(*a, &b); end
+ def to_proc; end
+ def update_inherited_metadata(*a, &b); end
+ def wrap(&block); end
+ def yield(*a, &b); end
+end
+class RSpec::Core::Example::ExecutionResult
+ def calculate_run_time(finished_at); end
+ def ensure_timing_set(clock); end
+ def example_skipped?; end
+ def exception; end
+ def exception=(arg0); end
+ def finished_at; end
+ def finished_at=(arg0); end
+ def get_value(name); end
+ def hash_for_delegation; end
+ def issue_deprecation(_method_name, *_args); end
+ def pending_exception; end
+ def pending_exception=(arg0); end
+ def pending_fixed; end
+ def pending_fixed=(arg0); end
+ def pending_fixed?; end
+ def pending_message; end
+ def pending_message=(arg0); end
+ def record_finished(status, finished_at); end
+ def run_time; end
+ def run_time=(arg0); end
+ def set_value(name, value); end
+ def started_at; end
+ def started_at=(arg0); end
+ def status; end
+ def status=(arg0); end
+ extend RSpec::Core::HashImitatable::ClassMethods
+ include RSpec::Core::HashImitatable
+end
+class RSpec::Core::SuiteHookContext < RSpec::Core::Example
+ def initialize(hook_description, reporter); end
+ def set_exception(exception); end
+end
+class RSpec::Core::SharedExampleGroupModule < Module
+ def definition; end
+ def include_in(klass, inclusion_line, args, customization_block); end
+ def included(klass); end
+ def initialize(description, definition, metadata); end
+ def inspect; end
+ def to_s; end
+end
+module RSpec::Core::SharedExampleGroup
+ def shared_context(name, *args, &block); end
+ def shared_examples(name, *args, &block); end
+ def shared_examples_for(name, *args, &block); end
+end
+module RSpec::Core::SharedExampleGroup::TopLevelDSL
+ def self.definitions; end
+ def self.expose_globally!; end
+ def self.exposed_globally?; end
+ def self.remove_globally!; end
+end
+class RSpec::Core::SharedExampleGroup::Registry
+ def add(context, name, *metadata_args, &block); end
+ def ensure_block_has_source_location(_block); end
+ def find(lookup_contexts, name); end
+ def formatted_location(block); end
+ def legacy_add(context, name, *metadata_args, &block); end
+ def shared_example_groups; end
+ def valid_name?(candidate); end
+ def warn_if_key_taken(context, key, new_block); end
+end
+class RSpec::Core::ExampleGroup
+ def described_class; end
+ def initialize(inspect_output = nil); end
+ def inspect; end
+ def method_missing(name, *args); end
+ def self.add_example(example); end
+ def self.before_context_ivars; end
+ def self.children; end
+ def self.context(*args, &example_group_block); end
+ def self.currently_executing_a_context_hook?; end
+ def self.declaration_locations; end
+ def self.define_example_group_method(name, metadata = nil); end
+ def self.define_example_method(name, extra_options = nil); end
+ def self.define_nested_shared_group_method(new_name, report_label = nil); end
+ def self.delegate_to_metadata(*names); end
+ def self.descendant_filtered_examples; end
+ def self.descendants; end
+ def self.describe(*args, &example_group_block); end
+ def self.described_class; end
+ def self.description; end
+ def self.each_instance_variable_for_example(group); end
+ def self.ensure_example_groups_are_configured; end
+ def self.example(*all_args, &block); end
+ def self.example_group(*args, &example_group_block); end
+ def self.examples; end
+ def self.fcontext(*args, &example_group_block); end
+ def self.fdescribe(*args, &example_group_block); end
+ def self.fexample(*all_args, &block); end
+ def self.file_path; end
+ def self.filtered_examples; end
+ def self.find_and_eval_shared(label, name, inclusion_location, *args, &customization_block); end
+ def self.fit(*all_args, &block); end
+ def self.focus(*all_args, &block); end
+ def self.for_filtered_examples(reporter, &block); end
+ def self.fspecify(*all_args, &block); end
+ def self.id; end
+ def self.idempotently_define_singleton_method(name, &definition); end
+ def self.include_context(name, *args, &block); end
+ def self.include_examples(name, *args, &block); end
+ def self.it(*all_args, &block); end
+ def self.it_behaves_like(name, *args, &customization_block); end
+ def self.it_should_behave_like(name, *args, &customization_block); end
+ def self.location; end
+ def self.metadata; end
+ def self.method_missing(name, *args); end
+ def self.next_runnable_index_for(file); end
+ def self.ordering_strategy; end
+ def self.parent_groups; end
+ def self.pending(*all_args, &block); end
+ def self.remove_example(example); end
+ def self.reset_memoized; end
+ def self.run(reporter = nil); end
+ def self.run_after_context_hooks(example_group_instance); end
+ def self.run_before_context_hooks(example_group_instance); end
+ def self.run_examples(reporter); end
+ def self.set_it_up(description, args, registration_collection, &example_group_block); end
+ def self.set_ivars(instance, ivars); end
+ def self.skip(*all_args, &block); end
+ def self.specify(*all_args, &block); end
+ def self.store_before_context_ivars(example_group_instance); end
+ def self.subclass(parent, description, args, registration_collection, &example_group_block); end
+ def self.superclass_before_context_ivars; end
+ def self.superclass_metadata; end
+ def self.top_level?; end
+ def self.top_level_description; end
+ def self.traverse_tree_until(&block); end
+ def self.update_inherited_metadata(updates); end
+ def self.with_replaced_metadata(meta); end
+ def self.xcontext(*args, &example_group_block); end
+ def self.xdescribe(*args, &example_group_block); end
+ def self.xexample(*all_args, &block); end
+ def self.xit(*all_args, &block); end
+ def self.xspecify(*all_args, &block); end
+ extend RSpec::Core::Hooks
+ extend RSpec::Core::MemoizedHelpers::ClassMethods
+ extend RSpec::Core::SharedExampleGroup
+ include RSpec::Core::MemoizedHelpers
+ include RSpec::Core::Pending
+end
+class RSpec::Core::ExampleGroup::WrongScopeError < NoMethodError
+end
+class RSpec::Core::AnonymousExampleGroup < RSpec::Core::ExampleGroup
+ def self.metadata; end
+end
+class RSpec::Core::SharedExampleGroupInclusionStackFrame
+ def description; end
+ def formatted_inclusion_location; end
+ def inclusion_location; end
+ def initialize(shared_group_name, inclusion_location); end
+ def self.current_backtrace; end
+ def self.shared_example_group_inclusions; end
+ def self.with_frame(name, location); end
+ def shared_group_name; end
+end
+module RSpec::ExampleGroups
+ def self.assign_const(group); end
+ def self.base_name_for(group); end
+ def self.constant_scope_for(group); end
+ def self.disambiguate(name, const_scope); end
+ def self.remove_all_constants; end
+ extend RSpec::Support::RecursiveConstMethods
+end
+module RSpec::Support
+ def self.require_rspec_core(f); end
+end
+class RSpec::Core::Time
+ def self.now; end
+end
+class Module
+end
+module RSpec::Core::SharedContext
+ def __shared_context_recordings; end
+ def after(*args, &block); end
+ def append_after(*args, &block); end
+ def append_before(*args, &block); end
+ def around(*args, &block); end
+ def before(*args, &block); end
+ def context(*args, &block); end
+ def describe(*args, &block); end
+ def hooks(*args, &block); end
+ def included(group); end
+ def let!(*args, &block); end
+ def let(*args, &block); end
+ def prepend_after(*args, &block); end
+ def prepend_before(*args, &block); end
+ def self.record(methods); end
+ def subject!(*args, &block); end
+ def subject(*args, &block); end
+end
+class RSpec::Core::SharedContext::Recording < Struct
+ def args; end
+ def args=(_); end
+ def block; end
+ def block=(_); end
+ def method_name; end
+ def method_name=(_); end
+ def playback_onto(group); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::ExampleStatusPersister
+ def dump_statuses(unparsed_previous_runs); end
+ def initialize(examples, file_name); end
+ def persist; end
+ def self.load_from(file_name); end
+ def self.persist(examples, file_name); end
+ def statuses_from_this_run; end
+end
+class RSpec::Core::ExampleStatusMerger
+ def delete_previous_examples_that_no_longer_exist; end
+ def example_must_no_longer_exist?(ex_id); end
+ def hash_from(example_list); end
+ def initialize(this_run, from_previous_runs); end
+ def loaded_spec_files; end
+ def merge; end
+ def self.merge(this_run, from_previous_runs); end
+ def sort_value_from(example); end
+ def spec_file_from(ex_id); end
+end
+class RSpec::Core::ExampleStatusDumper
+ def column_widths; end
+ def dump; end
+ def formatted_header_rows; end
+ def formatted_row_from(row_values); end
+ def formatted_value_rows; end
+ def headers; end
+ def initialize(examples); end
+ def rows; end
+ def self.dump(examples); end
+end
+class RSpec::Core::ExampleStatusParser
+ def headers; end
+ def initialize(string); end
+ def parse; end
+ def parse_row(line); end
+ def self.parse(string); end
+ def split_line(line); end
+end
+class RSpec::Core::Profiler
+ def example_group_finished(notification); end
+ def example_group_started(notification); end
+ def example_groups; end
+ def example_started(notification); end
+ def initialize; end
+end
+class RSpec::Core::DidYouMean
+ def call; end
+ def formats(probables); end
+ def initialize(relative_file_name); end
+ def red_font(mytext); end
+ def relative_file_name; end
+ def top_and_tail(rspec_format); end
+end
+class RSpec::Core::Formatters::BaseFormatter
+ def close(_notification); end
+ def example_group; end
+ def example_group=(arg0); end
+ def example_group_started(notification); end
+ def initialize(output); end
+ def output; end
+ def output_supports_sync; end
+ def restore_sync_output; end
+ def start(notification); end
+ def start_sync_output; end
+end
+class RSpec::Core::Formatters::BaseTextFormatter < RSpec::Core::Formatters::BaseFormatter
+ def close(_notification); end
+ def dump_failures(notification); end
+ def dump_pending(notification); end
+ def dump_summary(summary); end
+ def message(notification); end
+ def seed(notification); end
+end
+class RSpec::Core::Formatters::DocumentationFormatter < RSpec::Core::Formatters::BaseTextFormatter
+ def current_indentation(offset = nil); end
+ def example_failed(failure); end
+ def example_group_finished(_notification); end
+ def example_group_started(notification); end
+ def example_passed(passed); end
+ def example_pending(pending); end
+ def example_started(_notification); end
+ def failure_output(example); end
+ def flush_messages; end
+ def initialize(output); end
+ def message(notification); end
+ def next_failure_index; end
+ def passed_output(example); end
+ def pending_output(example, message); end
+end
+class RSpec::Core::Formatters::HtmlPrinter
+ def flush; end
+ def indentation_style(number_of_parents); end
+ def initialize(output); end
+ def make_example_group_header_red(group_id); end
+ def make_example_group_header_yellow(group_id); end
+ def make_header_red; end
+ def make_header_yellow; end
+ def move_progress(percent_done); end
+ def print_example_failed(pending_fixed, description, run_time, failure_id, exception, extra_content); end
+ def print_example_group_end; end
+ def print_example_group_start(group_id, description, number_of_parents); end
+ def print_example_passed(description, run_time); end
+ def print_example_pending(description, pending_message); end
+ def print_html_start; end
+ def print_summary(duration, example_count, failure_count, pending_count); end
+ include ERB::Util
+end
+class RSpec::Core::Formatters::HtmlFormatter < RSpec::Core::Formatters::BaseFormatter
+ def dump_summary(summary); end
+ def example_failed(failure); end
+ def example_group_number; end
+ def example_group_started(notification); end
+ def example_number; end
+ def example_passed(passed); end
+ def example_pending(pending); end
+ def example_started(_notification); end
+ def extra_failure_content(failure); end
+ def initialize(output); end
+ def percent_done; end
+ def start(notification); end
+ def start_dump(_notification); end
+end
+class RSpec::Core::Formatters::FallbackMessageFormatter
+ def initialize(output); end
+ def message(notification); end
+ def output; end
+end
+class RSpec::Core::Formatters::ProgressFormatter < RSpec::Core::Formatters::BaseTextFormatter
+ def example_failed(_notification); end
+ def example_passed(_notification); end
+ def example_pending(_notification); end
+ def start_dump(_notification); end
+end
+class RSpec::Core::Formatters::ProfileFormatter
+ def bold(text); end
+ def dump_profile(profile); end
+ def dump_profile_slowest_example_groups(profile); end
+ def dump_profile_slowest_examples(profile); end
+ def format_caller(caller_info); end
+ def initialize(output); end
+ def output; end
+end
+class RSpec::Core::Formatters::JsonFormatter < RSpec::Core::Formatters::BaseFormatter
+ def close(_notification); end
+ def dump_profile(profile); end
+ def dump_profile_slowest_example_groups(profile); end
+ def dump_profile_slowest_examples(profile); end
+ def dump_summary(summary); end
+ def format_example(example); end
+ def initialize(output); end
+ def message(notification); end
+ def output_hash; end
+ def seed(notification); end
+ def stop(notification); end
+end
+module RSpec::Core::Bisect
+end
+class RSpec::Core::Bisect::ExampleSetDescriptor < Struct
+ def all_example_ids; end
+ def all_example_ids=(_); end
+ def failed_example_ids; end
+ def failed_example_ids=(_); end
+ def self.[](*arg0); end
+ def self.inspect; end
+ def self.members; end
+ def self.new(*arg0); end
+end
+class RSpec::Core::Bisect::BisectFailedError < StandardError
+ def self.for_failed_spec_run(spec_output); end
+end
+class RSpec::Core::Bisect::Notifier
+ def initialize(formatter); end
+ def publish(event, *args); end
+end
+class RSpec::Core::Bisect::Channel
+ def close; end
+ def initialize; end
+ def receive; end
+ def send(message); end
+end
+class RSpec::Core::Formatters::BaseBisectFormatter
+ def example_failed(notification); end
+ def example_finished(notification); end
+ def initialize(expected_failures); end
+ def self.inherited(formatter); end
+ def start_dump(_notification); end
+end
+class RSpec::Core::Formatters::BisectDRbFormatter < RSpec::Core::Formatters::BaseBisectFormatter
+ def initialize(_output); end
+ def notify_results(results); end
+end
+class RSpec::Core::Formatters::FailureListFormatter < RSpec::Core::Formatters::BaseFormatter
+ def dump_profile(_profile); end
+ def example_failed(failure); end
+ def message(_message); end
+end
+module RSpec::Core::MockingAdapters
+end
+module RSpec::Core::MockingAdapters::RSpec
+ def self.configuration; end
+ def self.framework_name; end
+ def setup_mocks_for_rspec; end
+ def teardown_mocks_for_rspec; end
+ def verify_mocks_for_rspec; end
+ include RSpec::Mocks::ExampleMethods
+ include RSpec::Mocks::ExampleMethods::ExpectHost
+end
+class RSpec::Core::RakeTask < ::Rake::TaskLib
+ include ::Rake::DSL
+ include RSpec::Core::ShellEscape
+ def initialize(*args, &task_block); end
+end
diff --git a/sorbet/rbi/todo.rbi b/sorbet/rbi/todo.rbi
new file mode 100644
index 0000000..eb9682a
--- /dev/null
+++ b/sorbet/rbi/todo.rbi
@@ -0,0 +1,9 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+# srb rbi todo
+
+# typed: strong
+module ::Ascii85Native; end
+module ::Memprof; end
+module ::PerfTools::CpuProfiler; end
+module T::Private::Methods::MethodHooks; end
+module T::Private::Methods::SingletonMethodHooks; end
diff --git a/spec/buffer_spec.rb b/spec/buffer_spec.rb
index 46b2f5c..9e730ef 100644
--- a/spec/buffer_spec.rb
+++ b/spec/buffer_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::Buffer, "token method" do
@@ -211,6 +212,15 @@ describe PDF::Reader::Buffer, "token method" do
end
end
+ context "string with an escaped, unbalanced right param correctly" do
+ it "tokenises correctly" do
+ buf = parse_string("(James Code Monkey\\))")
+ expect(buf.token).to eql("(")
+ expect(buf.token).to eql("James Code Monkey\\)")
+ expect(buf.token).to eql(")")
+ end
+ end
+
context "indirect reference" do
it "tokenises correctly" do
buf = parse_string("aaa 1 0 R bbb")
@@ -478,6 +488,19 @@ describe PDF::Reader::Buffer, "token method" do
end
end
+ context "inline image without a trailing 'EI'" do
+ context "inside a content stream" do
+ it "tokenises correctly" do
+ io = StringIO.new(binary_string("BI ID aaa bbb ccc \xF0\xF0\xF0"))
+ buf = PDF::Reader::Buffer.new(io, :content_stream => true)
+ expect(buf.pos).to eql(0)
+ expect {
+ buf.token
+ }.to raise_error(PDF::Reader::MalformedPDFError, "EI terminator not found")
+ end
+ end
+ end
+
context "dict that has ID as a key" do
it "tokenises correctly" do
io = StringIO.new("<</ID /S1 >> BDC")
@@ -662,7 +685,12 @@ describe PDF::Reader::Buffer, "read method" do
context "with a multi-line buffer (three \\n)" do
context "without :skip_eol" do
- it "returns raw data from the underlying IO"
+ it "returns raw data from the underlying IO" do
+ buf = parse_string("stream\n\n\nbbb")
+
+ expect(buf.token).to eql("stream")
+ expect(buf.read(5)).to eql("\n\nbbb")
+ end
end
context "with :skip_eol" do
it "returns raw data from the underlying IO" do
@@ -676,7 +704,12 @@ describe PDF::Reader::Buffer, "read method" do
context "with a multi-line buffer (\\r\\n)" do
context "without :skip_eol" do
- it "returns raw data from the underlying IO"
+ it "returns raw data from the underlying IO" do
+ buf = parse_string("stream\r\nbbb")
+
+ expect(buf.token).to eql("stream")
+ expect(buf.read(4)).to eql("\nbbb")
+ end
end
context "with :skip_eol" do
it "returns raw data from the underlying IO" do
diff --git a/spec/callback_spec.rb b/spec/callback_spec.rb
index f5ed43f..7358edb 100644
--- a/spec/callback_spec.rb
+++ b/spec/callback_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
# These specs are an integration safety net to ensure all of our callbacks provide a consistant
diff --git a/spec/cid_widths_spec.rb b/spec/cid_widths_spec.rb
index 6c5fef9..2b430a3 100644
--- a/spec/cid_widths_spec.rb
+++ b/spec/cid_widths_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::CidWidths, "#initilize" do
@@ -47,6 +48,14 @@ describe PDF::Reader::CidWidths, "#initilize" do
it "returns correct width for index 4" do
expect(subject[4]).to eq(500)
end
+
+ context "and the range covers a single number" do
+ subject { PDF::Reader::CidWidths.new(500, [3, 3, 10])}
+
+ it "returns correct width for index 3" do
+ expect(subject[3]).to eq(10)
+ end
+ end
end
context "with an array mixing the first and second form" do
diff --git a/spec/cmap_spec.rb b/spec/cmap_spec.rb
index 6e02612..d43aa6c 100644
--- a/spec/cmap_spec.rb
+++ b/spec/cmap_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::CMap do
diff --git a/spec/column_spec.rb b/spec/column_spec.rb
index e4253c4..c67f559 100644
--- a/spec/column_spec.rb
+++ b/spec/column_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader, "column specs" do
@@ -18,8 +19,8 @@ describe PDF::Reader, "column specs" do
page = reader.page(1)
ft = page.text
expect(ft).to match(/ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu/)
- expect(ft).to match(/Lorem ipsum dolor sit amet, consectetur adipisic -\s+adipisicing elit, sed do eiusmod tempor incididunt/)
- expect(ft).to match(/ing elit, sed do eiusmod tempor incididunt ut labore\s+ut labore et dolore magna aliqua. Ut enim ad minim/)
+ expect(ft).to match(/Lorem ipsum dolor sit amet, consectetur adipisic-\s+adipisicing elit, sed do eiusmod tempor incididunt/)
+ expect(ft).to match(/ingelit,seddoeiusmodtemporincididuntutlabore\s+utlaboreetdoloremagnaaliqua.Utenimadminim/)
expect(ft).to match(/et dolore magna aliqua. Ut enim ad minim veniam,\s+veniam, quis nostrud exercitation ullamco laboris/)
expect(ft).to match(/quis nostrud exercitation ullamco laboris nisi ut\s+nisi ut aliquip ex ea commodo consequat. Duis aute/)
expect(ft).to match(/aliquip ex ea commodo consequat. Duis aute irure\s+irure dolor in reprehenderit in voluptate velit esse/)
@@ -35,7 +36,7 @@ describe PDF::Reader, "column specs" do
# The following lines are in the second column, and their position with in the
# string (from the left) should all be at the same spot
match_pos_1 = find_position_of_match(ft, /adipisicing elit, sed do eiusmod tempor incididunt$/)
- match_pos_2 = find_position_of_match(ft, /ut labore et dolore magna aliqua. Ut enim ad minim$/)
+ match_pos_2 = find_position_of_match(ft, /utlaboreetdoloremagnaaliqua.Utenimadminim$/)
match_pos_3 = find_position_of_match(ft, /veniam, quis nostrud exercitation ullamco laboris$/)
match_pos_4 = find_position_of_match(ft, /nisi ut aliquip ex ea commodo consequat. Duis aute$/)
match_pos_5 = find_position_of_match(ft, /irure dolor in reprehenderit in voluptate velit esse$/)
@@ -59,7 +60,7 @@ describe PDF::Reader, "column specs" do
# The following lines are in the first column of the page prior to the interruption
col1_1 = find_position_of_match(ft, /^tate velit esse cillum dolore eu/)
col1_2 = find_position_of_match(ft, /^fugiat nulla pariatur. Excepteur/)
- col1_3 = find_position_of_match(ft, /^sint occaecat cupidatat non proi -/)
+ col1_3 = find_position_of_match(ft, /^sint occaecat cupidatat non proi-/)
col1_4 = find_position_of_match(ft, /^dent, sunt in culpa qui officia de-/)
expect(col1_1).not_to be_nil
@@ -77,8 +78,8 @@ describe PDF::Reader, "column specs" do
# The following lines are in the second column of the page prior to the interruption
col2_1 = find_position_of_match(ft, /occaecat cupidatat non proident,\s*anim/)
col2_2 = find_position_of_match(ft, /sunt in culpa qui officia deserunt\s*sum/)
- col2_3 = find_position_of_match(ft, /mollit anim id est laborum. Lo -\s*adipisicing/)
- col2_4 = find_position_of_match(ft, /rem ipsum dolor sit amet, con -\s*tempor/)
+ col2_3 = find_position_of_match(ft, /mollit anim id est laborum. Lo-\s*adipisicing/)
+ col2_4 = find_position_of_match(ft, /rem ipsum dolor sit amet, con-\s*tempor/)
expect(col2_1).not_to be_nil
expect(col2_1).to eql(col2_2)
@@ -94,7 +95,7 @@ describe PDF::Reader, "column specs" do
ft = reader.page(2).text
# The following lines are in the third column of the page prior to the interruption
- col3_a_1 = find_position_of_match(ft, /anim id est laborum. Lorem ip -$/)
+ col3_a_1 = find_position_of_match(ft, /anim id est laborum. Lorem ip-$/)
col3_a_2 = find_position_of_match(ft, /sum dolor sit amet, consectetur$/)
col3_a_3 = find_position_of_match(ft, /adipisicing elit, sed do eiusmod$/)
col3_a_4 = find_position_of_match(ft, /tempor incididunt ut labore et$/)
diff --git a/spec/data/TJ_and_char_spacing.pdf b/spec/data/TJ_and_char_spacing.pdf
new file mode 100644
index 0000000..7abcbd3
--- /dev/null
+++ b/spec/data/TJ_and_char_spacing.pdf
@@ -0,0 +1,73 @@
+%PDF-1.7
+%����
+
+1 0 obj
+ <<
+ /Type /Catalog
+ /Pages 2 0 R
+ >>
+endobj
+
+2 0 obj
+ <<
+ /Type /Pages
+ /Kids [3 0 R]
+ /Count 1
+ /MediaBox [0 0 595 842]
+ >>
+endobj
+
+3 0 obj
+ <<
+ /Type /Page
+ /Parent 2 0 R
+ /Resources
+ <<
+ /Font
+ <<
+ /F1
+ <<
+ /Type /Font
+ /Subtype /Type1
+ /BaseFont /Helvetica
+ >>
+ >>
+ >>
+ /Contents 4 0 R
+ >>
+endobj
+
+4 0 obj
+ <<
+ /Length 279
+ >>
+stream
+ BT
+ /F1 18 Tf
+ 1 0 0 1 50 800 Tm
+ 18 TL
+ -2 Tc -1 Tw
+ (The big brown fox) Tj
+ T*
+ [(T)-108(h)-108(e)-162( )-108(b)-108(i)-108(g)-162( )-108(b)-108(r)-108(o)-108(w)-108(n)-162( )-108(f)-108(o)-108(x)] TJ
+ T*
+ 0 Tc 0 Tw
+ (The big brown fox) Tj
+ ET
+endstream
+endobj
+xref
+0 5
+0000000000 65535 f
+0000000016 00000 n
+0000000074 00000 n
+0000000168 00000 n
+0000000405 00000 n
+trailer
+ <<
+ /Root 1 0 R
+ /Size 5
+ >>
+startxref
+740
+%%EOF
\ No newline at end of file
diff --git a/spec/data/content_stream_cr_only.pdf b/spec/data/content_stream_cr_only.pdf
new file mode 100644
index 0000000..f229aad
--- /dev/null
+++ b/spec/data/content_stream_cr_only.pdf
@@ -0,0 +1,63 @@
+%PDF-1.7
+%����
+
+1 0 obj
+ <<
+ /Type /Catalog
+ /Pages 2 0 R
+ >>
+endobj
+
+2 0 obj
+ <<
+ /Type /Pages
+ /Kids [3 0 R]
+ /Count 1
+ /MediaBox [0 0 595 842]
+ >>
+endobj
+
+3 0 obj
+ <<
+ /Type /Page
+ /Parent 2 0 R
+ /Resources
+ <<
+ /Font
+ <<
+ /F1
+ <<
+ /Type /Font
+ /Subtype /Type1
+ /BaseFont /Helvetica
+ >>
+ >>
+ >>
+ /Contents 4 0 R
+ >>
+endobj
+
+4 0 obj
+ <<
+ /Length 77
+ >>
+stream
BT
+ /F1 18 Tf
+ 1 0 0 1 55 600 Tm
+ (This is a weird PDF file) Tj
+ ETendstream
endobj
+xref
+0 5
+0000000000 65535 f
+0000000016 00000 n
+0000000074 00000 n
+0000000168 00000 n
+0000000405 00000 n
+trailer
+ <<
+ /Root 1 0 R
+ /Size 5
+ >>
+startxref
+537
+%%EOF
\ No newline at end of file
diff --git a/spec/data/encrypted_and_xref_stream.pdf b/spec/data/encrypted_and_xref_stream.pdf
new file mode 100644
index 0000000..3b02f3b
Binary files /dev/null and b/spec/data/encrypted_and_xref_stream.pdf differ
diff --git a/spec/data/inline_data_followed_by_ei.pdf b/spec/data/inline_data_followed_by_ei.pdf
new file mode 100644
index 0000000..0aa7ce4
--- /dev/null
+++ b/spec/data/inline_data_followed_by_ei.pdf
@@ -0,0 +1,82 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 210
+>>
+stream
+q
+
+BT
+36.0 747.384 Td
+/F1.0 12 Tf
+[<49442066> 30 <6f6c6c6f> 15 <77> 10 <65642062> 20 <79204549206f6e2073616d65206c696e65>] TJ
+ET
+
+ID
+aaaaEIbbbEIcccEI
+
+BT
+36.0 733.512 Td
+/F1.0 12 Tf
+[<5f5f454e445f5f>] TJ
+ET
+
+Q
+
+endstream
+endobj
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612 792]
+/CropBox [0 0 612 792]
+/BleedBox [0 0 612 792]
+/TrimBox [0 0 612 792]
+/ArtBox [0 0 612 792]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+xref
+0 7
+0000000000 65535 f
+0000000015 00000 n
+0000000109 00000 n
+0000000158 00000 n
+0000000215 00000 n
+0000000476 00000 n
+0000000742 00000 n
+trailer
+<< /Size 7
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+839
+%%EOF
diff --git a/spec/data/broken_string.pdf b/spec/data/invalid/broken_string.pdf
similarity index 100%
rename from spec/data/broken_string.pdf
rename to spec/data/invalid/broken_string.pdf
diff --git a/spec/data/content_stream_refers_to_invalid_font.pdf b/spec/data/invalid/content_stream_refers_to_invalid_font.pdf
similarity index 100%
rename from spec/data/content_stream_refers_to_invalid_font.pdf
rename to spec/data/invalid/content_stream_refers_to_invalid_font.pdf
diff --git a/spec/data/invalid/content_stream_wrong_args.pdf b/spec/data/invalid/content_stream_wrong_args.pdf
new file mode 100644
index 0000000..3186761
Binary files /dev/null and b/spec/data/invalid/content_stream_wrong_args.pdf differ
diff --git a/spec/data/invalid/gh-217.pdf b/spec/data/invalid/gh-217.pdf
new file mode 100644
index 0000000..24bc1de
Binary files /dev/null and b/spec/data/invalid/gh-217.pdf differ
diff --git a/spec/data/invalid/gh-222.pdf b/spec/data/invalid/gh-222.pdf
new file mode 100644
index 0000000..e48f4a3
Binary files /dev/null and b/spec/data/invalid/gh-222.pdf differ
diff --git a/spec/data/invalid/gh-223.pdf b/spec/data/invalid/gh-223.pdf
new file mode 100644
index 0000000..d2f6167
Binary files /dev/null and b/spec/data/invalid/gh-223.pdf differ
diff --git a/spec/data/invalid/gh-224.pdf b/spec/data/invalid/gh-224.pdf
new file mode 100644
index 0000000..318ae4d
Binary files /dev/null and b/spec/data/invalid/gh-224.pdf differ
diff --git a/spec/data/invalid/gh-227.pdf b/spec/data/invalid/gh-227.pdf
new file mode 100644
index 0000000..de02c9a
Binary files /dev/null and b/spec/data/invalid/gh-227.pdf differ
diff --git a/spec/data/invalid/gh-228.pdf b/spec/data/invalid/gh-228.pdf
new file mode 100644
index 0000000..6cf822f
Binary files /dev/null and b/spec/data/invalid/gh-228.pdf differ
diff --git a/spec/data/invalid/gh-229.pdf b/spec/data/invalid/gh-229.pdf
new file mode 100644
index 0000000..a24a576
Binary files /dev/null and b/spec/data/invalid/gh-229.pdf differ
diff --git a/spec/data/invalid/gh-230.pdf b/spec/data/invalid/gh-230.pdf
new file mode 100644
index 0000000..3fdac5a
Binary files /dev/null and b/spec/data/invalid/gh-230.pdf differ
diff --git a/spec/data/invalid/gh-231.pdf b/spec/data/invalid/gh-231.pdf
new file mode 100644
index 0000000..f44ab5c
Binary files /dev/null and b/spec/data/invalid/gh-231.pdf differ
diff --git a/spec/data/invalid/gh-232.pdf b/spec/data/invalid/gh-232.pdf
new file mode 100644
index 0000000..edd8218
Binary files /dev/null and b/spec/data/invalid/gh-232.pdf differ
diff --git a/spec/data/invalid/gh-234.pdf b/spec/data/invalid/gh-234.pdf
new file mode 100644
index 0000000..962c621
Binary files /dev/null and b/spec/data/invalid/gh-234.pdf differ
diff --git a/spec/data/invalid/gh-235.pdf b/spec/data/invalid/gh-235.pdf
new file mode 100644
index 0000000..2365806
Binary files /dev/null and b/spec/data/invalid/gh-235.pdf differ
diff --git a/spec/data/invalid/gh-236.pdf b/spec/data/invalid/gh-236.pdf
new file mode 100644
index 0000000..f52fa3a
Binary files /dev/null and b/spec/data/invalid/gh-236.pdf differ
diff --git a/spec/data/invalid/gh-237.pdf b/spec/data/invalid/gh-237.pdf
new file mode 100644
index 0000000..db1460f
Binary files /dev/null and b/spec/data/invalid/gh-237.pdf differ
diff --git a/spec/data/invalid/gh-238.pdf b/spec/data/invalid/gh-238.pdf
new file mode 100644
index 0000000..5ace8e7
Binary files /dev/null and b/spec/data/invalid/gh-238.pdf differ
diff --git a/spec/data/invalid/gh-239.pdf b/spec/data/invalid/gh-239.pdf
new file mode 100644
index 0000000..7ed4c96
Binary files /dev/null and b/spec/data/invalid/gh-239.pdf differ
diff --git a/spec/data/invalid/gh-240.pdf b/spec/data/invalid/gh-240.pdf
new file mode 100644
index 0000000..244efd2
Binary files /dev/null and b/spec/data/invalid/gh-240.pdf differ
diff --git a/spec/data/invalid/gh-241.pdf b/spec/data/invalid/gh-241.pdf
new file mode 100644
index 0000000..8e04b16
Binary files /dev/null and b/spec/data/invalid/gh-241.pdf differ
diff --git a/spec/data/invalid/gh-242.pdf b/spec/data/invalid/gh-242.pdf
new file mode 100644
index 0000000..d7e1c1f
Binary files /dev/null and b/spec/data/invalid/gh-242.pdf differ
diff --git a/spec/data/invalid/gh-243.pdf b/spec/data/invalid/gh-243.pdf
new file mode 100644
index 0000000..3de1c4f
--- /dev/null
+++ b/spec/data/invalid/gh-243.pdf
@@ -0,0 +1,88 @@
+%PDF-1.3
+%âãÏÓ
+
+1 0 obj
+<< /Type /Catalog
+/Outlines 2 0 R
+/Pages 3 0 R>>
+endobj
+2 0 obj
+<< /Type /Outlines >>
+endobj
+3 0 obj
+<< /Type /Pages
+/Kids [6 0 R
+]
+/Count 1
+/Resources <<
+/ProcSet 4 0 R
+/Font <<
+/F1 9 0 R >>
+>>
+/MediaBox [0 0 595.28 841.89]
+ >>endobj
+4 0 obj
+[/PDF /Text ]
+endobj
+5 0 obj
+<<
+/CreationDate (D:200805060928)
+/Creator (brazil.rb)
+/Producer (PDF::Writer for Ruby)
+>>
+endobj
+6 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/Contents 7 0 R
+>>
+endobj
+7 0 obj
+<<
+/Length 94 >>
+stream
+
+0.000 0�000 0.000 rg
+0.000 0.000 0.000 RG
+BT 36.000 794.730 Td /F1 �0.0 Tf 0 Tr (Goi�s) Tj ET
+endstream
+endobj
+
+8 0 obj
+<< /Type /Encoding
+/BaseEncoding /WinAnsiEncoding
+/Differences
+[
+240 /aacute
+]
+>>
+endobj
+9 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F1
+/BaseFont /Times-Roman
+/Encoding 8 0 R
+>>
+endobj
+xref
+0 10
+0000000000 65535 f
+0000000019 00000 n
+0000000083 00000 n
+0000000120 00000 n
+0000000264 00000 n
+0000000293 00000 n
+0000000399 00000 n
+0000000462 00000 n
+0000000607 00000 n
+0000000706 00000 n
+
+trailer
+ << /Size 10
+ /Root 1 0 R
+ /Info 5 0 R
+ >>
+startxref
+804
+%%EOF
diff --git a/spec/data/invalid/gh-244.pdf b/spec/data/invalid/gh-244.pdf
new file mode 100644
index 0000000..196483d
--- /dev/null
+++ b/spec/data/invalid/gh-244.pdf
@@ -0,0 +1,89 @@
+%PDF-1.3
+%âãÏÓ
+
+1 0 obj
+<< /Type /Catalog
+/Outlines 2 0 R
+/Pages 3 0 R>>
+endobj
+2 0 obj
+<< /Type /Outlines >>
+endobj
+3 0 obj
+<< /Type /Pages
+/Kids [6 0 R
+]
+/Count 1
+/Resources <<
+/ProcSet 4 0 R
+/Font <<
+/F1 9 0 R >>
+>>
+/MediaBox [0 0 595.28 841.89]
+ >>
+endobj
+4 0 obj
+[/PDF /Text ]
+endobj
+5 0 obj
+<<
+/CreationDate (D:200805060928)
+/Creator (brazil.rb)
+/Producer (PDF::Writer for Ruby)
+>>
+endobj
+6 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/Contents 7 0 R
+>>
+endobj
+7 0 obj
+<<
+/Length 94 >>
+stream
+
+0.000 0.000 0.000 rg
+0.000 0.000 0.0�0 RG
+BT 36.000 794.730 Td /F1 10.0 Tf 0 Tr (Goi�s) Tj ET
+endstream
+endobj
+
+8 0 obj
+<< /Type /Encoding
+/BaseEncoding /WinAnsiEncoding
+/Differvnces
+[
+240 /aacute
+]
+>>
+endobj
+9 0 obj
+<< /Type /Font
+/Subtype /Type1
+/NamD /F1
+/B$seFont /Times-Roman
+/Encoding 8 0 R
+>>
+endobj
+xref
+0 10
+0000000000 65535 f
+0000000019 00000 n
+0�00000083 00000 n
+0000000120 00000 n
+0000000264 00000 n
+0000000293 00000 n
+0000000399 00000 n
+0000000462 00000 n
+0000000607 00000 n
+0000000706 00000 n
+
+trailer
+ << /Size 10
+ /Root 1 0 R
+ /Info 5 0 R
+ >>
+startxref
+804
+%%EOF
diff --git a/spec/data/invalid/gh-245.pdf b/spec/data/invalid/gh-245.pdf
new file mode 100644
index 0000000..d2f378a
Binary files /dev/null and b/spec/data/invalid/gh-245.pdf differ
diff --git a/spec/data/invalid/negative-xref-offset.pdf b/spec/data/invalid/negative-xref-offset.pdf
new file mode 100644
index 0000000..28ba1f7
Binary files /dev/null and b/spec/data/invalid/negative-xref-offset.pdf differ
diff --git a/spec/data/invalid/stream_missing_endobj.pdf b/spec/data/invalid/stream_missing_endobj.pdf
new file mode 100644
index 0000000..28a964d
--- /dev/null
+++ b/spec/data/invalid/stream_missing_endobj.pdf
@@ -0,0 +1,73 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 160
+>>
+stream
+q
+
+BT
+36.0 747.384 Td
+/F1.0 12 Tf
+[<4f626a65637420342028636f6e74656e742073747265616d29206973206d697373696e672074686520656e646f626a20746f6b> 20 <656e>] TJ
+ET
+
+Q
+
+endstream
+
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612 792]
+/CropBox [0 0 612 792]
+/BleedBox [0 0 612 792]
+/TrimBox [0 0 612 792]
+/ArtBox [0 0 612 792]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+xref
+0 7
+0000000000 65535 f
+0000000015 00000 n
+0000000109 00000 n
+0000000158 00000 n
+0000000215 00000 n
+0000000420 00000 n
+0000000686 00000 n
+trailer
+<< /Size 7
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+783
+%%EOF
diff --git a/spec/data/invalid/xref_offset_too_low.pdf b/spec/data/invalid/xref_offset_too_low.pdf
new file mode 100644
index 0000000..930313d
--- /dev/null
+++ b/spec/data/invalid/xref_offset_too_low.pdf
@@ -0,0 +1,73 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 210
+>>
+stream
+q
+
+BT
+36.0 747.384 Td
+/F1.0 12 Tf
+[<5468652078726566206f66667365742066> 30 <6f722074686520726f6f74206f626a65637420286f626a20322920697320612066> 30 <65> 20 <772062> 20 <7974657320746f6f206c6f> 15 <77>] TJ
+ET
+
+Q
+
+endstream
+endobj
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612 792]
+/CropBox [0 0 612 792]
+/BleedBox [0 0 612 792]
+/TrimBox [0 0 612 792]
+/ArtBox [0 0 612 792]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+xref
+0 7
+0000000000 65535 f
+0000000015 00000 n
+0000000106 00000 n
+0000000158 00000 n
+0000000215 00000 n
+0000000476 00000 n
+0000000742 00000 n
+trailer
+<< /Size 7
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+839
+%%EOF
diff --git a/spec/data/lzw_compressed_corrupt.dat b/spec/data/lzw_compressed_corrupt.dat
new file mode 100644
index 0000000..032e288
--- /dev/null
+++ b/spec/data/lzw_compressed_corrupt.dat
@@ -0,0 +1,2 @@
+���Ѱ�@7�E�aP�
"1��@
��#��`8CL��lt`4�CLq) P� JB0�2�MQ�o)�L����eD��d3��'q�j2��%�Q��(�K
�#UFvTL��06�0����9�� ��
+V�x�2i6�!ĴW"Lf�!��T�ի���}���k�����r2�M��L#��C��P\j�ڡ��t
����q��Y��CP�aN��1��cm"��
\ No newline at end of file
diff --git a/spec/data/minimal-xref-1.pdf b/spec/data/minimal-xref-1.pdf
new file mode 100644
index 0000000..4e8ba49
--- /dev/null
+++ b/spec/data/minimal-xref-1.pdf
@@ -0,0 +1,58 @@
+%PDF-1.1
+%¥±ë
+
+1 0 obj
+ << /Type /Catalog
+ /Pages 2 0 R
+ >>
+endobj
+
+2 0 obj
+ << /Type /Pages
+ /Kids [3 0 R]
+ /Count 1
+ /MediaBox [0 0 300 144]
+ >>
+endobj
+
+3 0 obj
+ << /Type /Page
+ /Parent 2 0 R
+ /Resources
+ << /Font
+ << /F1
+ << /Type /Font
+ /Subtype /Type1
+ /BaseFont /Times-Roman
+ >>
+ >>
+ >>
+ /Contents 4 0 R
+ >>
+endobj
+
+4 0 obj
+ << /Length 55 >>
+stream
+ BT
+ /F1 18 Tf
+ 0 0 Td
+ (Hello World) Tj
+ ET
+endstream
+endobj
+
+xref
+1 5
+0000000000 65535 f
+0000000018 00000 n
+0000000077 00000 n
+0000000178 00000 n
+0000000457 00000 n
+trailer
+ << /Root 1 0 R
+ /Size 5
+ >>
+startxref
+565
+%%EOF
diff --git a/spec/data/octal101.pdf b/spec/data/octal101.pdf
new file mode 100644
index 0000000..c321780
--- /dev/null
+++ b/spec/data/octal101.pdf
@@ -0,0 +1,58 @@
+%PDF-1.1
+%¥±ë
+
+1 0 obj
+ << /Type /Catalog
+ /Pages 2 0 R
+ >>
+endobj
+
+2 0 obj
+ << /Type /Pages
+ /Kids [3 0 R]
+ /Count 1
+ /MediaBox [0 0 300 144]
+ >>
+endobj
+
+3 0 obj
+ << /Type /Page
+ /Parent 2 0 R
+ /Resources
+ << /Font
+ << /F1
+ << /Type /Font
+ /Subtype /Type1
+ /BaseFont /Times-Roman
+ >>
+ >>
+ >>
+ /Contents 4 0 R
+ >>
+endobj
+
+4 0 obj
+ << /Length 55 >>
+stream
+ BT
+ /F1 18 Tf
+ 0 0 Td
+ (\101 ]\501[) Tj
+ ET
+endstream
+endobj
+
+xref
+0 5
+0000000000 65535 f
+0000000018 00000 n
+0000000077 00000 n
+0000000178 00000 n
+0000000457 00000 n
+trailer
+ << /Root 1 0 R
+ /Size 5
+ >>
+startxref
+565
+%%EOF
diff --git a/spec/data/octal74.pdf b/spec/data/octal74.pdf
new file mode 100644
index 0000000..39b1fbe
--- /dev/null
+++ b/spec/data/octal74.pdf
@@ -0,0 +1,58 @@
+%PDF-1.1
+%¥±ë
+
+1 0 obj
+ << /Type /Catalog
+ /Pages 2 0 R
+ >>
+endobj
+
+2 0 obj
+ << /Type /Pages
+ /Kids [3 0 R]
+ /Count 1
+ /MediaBox [0 0 300 144]
+ >>
+endobj
+
+3 0 obj
+ << /Type /Page
+ /Parent 2 0 R
+ /Resources
+ << /Font
+ << /F1
+ << /Type /Font
+ /Subtype /Type1
+ /BaseFont /Times-Roman
+ >>
+ >>
+ >>
+ /Contents 4 0 R
+ >>
+endobj
+
+4 0 obj
+ << /Length 55 >>
+stream
+ BT
+ /F1 18 Tf
+ 0 0 Td
+ (\74 ]\748[) Tj
+ ET
+endstream
+endobj
+
+xref
+0 5
+0000000000 65535 f
+0000000018 00000 n
+0000000077 00000 n
+0000000178 00000 n
+0000000457 00000 n
+trailer
+ << /Root 1 0 R
+ /Size 5
+ >>
+startxref
+565
+%%EOF
diff --git a/spec/data/prev0.pdf b/spec/data/prev0.pdf
new file mode 100644
index 0000000..3cc7575
--- /dev/null
+++ b/spec/data/prev0.pdf
@@ -0,0 +1,60 @@
+%PDF-1.1
+%¥±ë
+
+1 0 obj
+ << /Type /Catalog
+ /Pages 2 0 R
+ >>
+endobj
+
+2 0 obj
+ << /Type /Pages
+ /Kids [3 0 R]
+ /Count 1
+ /MediaBox [0 0 300 144]
+ >>
+endobj
+
+3 0 obj
+ << /Type /Page
+ /Parent 2 0 R
+ /Resources
+ << /Font
+ << /F1
+ << /Type /Font
+ /Subtype /Type1
+ /BaseFont /Times-Roman
+ >>
+ >>
+ >>
+ /Contents 4 0 R
+ >>
+endobj
+
+4 0 obj
+ << /Length 55 >>
+stream
+ BT
+ /F1 18 Tf
+ 0 0 Td
+ (aaaa\
+ bbbb) Tj
+ ET
+endstream
+endobj
+
+xref
+0 5
+0000000000 65535 f
+0000000018 00000 n
+0000000077 00000 n
+0000000178 00000 n
+0000000457 00000 n
+trailer
+ << /Root 1 0 R
+ /Size 5
+ /Prev 0
+ >>
+startxref
+565
+%%EOF
diff --git a/spec/data/rotate-270-then-undo-inside-bt.pdf b/spec/data/rotate-270-then-undo-inside-bt.pdf
new file mode 100644
index 0000000..5e4a769
--- /dev/null
+++ b/spec/data/rotate-270-then-undo-inside-bt.pdf
@@ -0,0 +1,84 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 205
+>>
+stream
+q
+BT
+2 Tr
+0 0 0 rg
+0 -1 1 0 534.5 320.2 Tm
+/F1.0 12 Tf
+[<>] TJ
+ET
+
+
+BT
+2 Tr
+0 0 0 rg
+0 -1 1 0 534.5 320.2 Tm
+/F1.0 12 Tf
+[<54686973207061676520697320726f74617465642032373020646567> 10 <72656573>] TJ
+ET
+
+Q
+
+endstream
+endobj
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/Rotate 270
+/MediaBox [0 0 841.89 595.28]
+/CropBox [0 0 841.89 595.28]
+/BleedBox [0 0 841.89 595.28]
+/TrimBox [0 0 841.89 595.28]
+/ArtBox [0 0 841.89 595.28]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+xref
+0 7
+0000000000 65535 f
+0000000015 00000 n
+0000000109 00000 n
+0000000158 00000 n
+0000000215 00000 n
+0000000471 00000 n
+0000000779 00000 n
+trailer
+<< /Size 7
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+876
+%%EOF
diff --git a/spec/data/rotate-90-then-undo-with-br-text.pdf b/spec/data/rotate-90-then-undo-with-br-text.pdf
new file mode 100644
index 0000000..8e82505
--- /dev/null
+++ b/spec/data/rotate-90-then-undo-with-br-text.pdf
@@ -0,0 +1,96 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 347
+>>
+stream
+0 1 -1 0 595 0 cm
+q
+BT
+36 559 Td
+ET
+Q
+2 J
+1 0 0 1 0 0 cm
+BT
+1 0 0 1 50.99 71.59 Tm
+/F1.0 12 Tf
+0 0 0 rg
+(This PDF has Rotate:90 in the page)Tj
+0 g
+1 0 0 1 350.99 71.59 Tm
+0 0 0 rg
+(metadata to get a landscape layout)Tj
+0 g
+1 0 0 1 650.99 71.59 Tm
+0 0 0 rg
+(and text in bottom right quadrant)Tj
+0 g
+ET
+
+BT
+36.0 797.384 Td
+/F1.0 12 Tf
+[<>] TJ
+ET
+
+Q
+
+endstream
+endobj
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 595 842]
+/Rotate 90
+/CropBox [0 0 595 842]
+/BleedBox [0 0 595 842]
+/TrimBox [0 0 595 842]
+/ArtBox [0 0 595 842]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+xref
+0 7
+0000000000 65535 f
+0000000015 00000 n
+0000000109 00000 n
+0000000158 00000 n
+0000000215 00000 n
+0000000613 00000 n
+0000000890 00000 n
+trailer
+<< /Size 7
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+987
+%%EOF
diff --git a/spec/data/rotate-90-then-undo.pdf b/spec/data/rotate-90-then-undo.pdf
new file mode 100644
index 0000000..a6f5d5e
--- /dev/null
+++ b/spec/data/rotate-90-then-undo.pdf
@@ -0,0 +1,96 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 397
+>>
+stream
+0 1 -1 0 595 0 cm
+q
+BT
+36 559 Td
+ET
+Q
+2 J
+1 0 0 1 0 0 cm
+BT
+1 0 0 1 273.99 549.51 Tm
+/F1.0 12 Tf
+0 0 0 rg
+(1: This PDF has Rotate:90 in the page metadata)Tj
+0 g
+1 0 0 1 273.99 535.55 Tm
+0 0 0 rg
+(2: to get a landscape layout, and then uses matrix)Tj
+0 g
+1 0 0 1 273.99 521.59 Tm
+0 0 0 rg
+(3: transformation to rotate the text back to normal)Tj
+0 g
+ET
+
+BT
+36.0 797.384 Td
+/F1.0 12 Tf
+[<>] TJ
+ET
+
+Q
+
+endstream
+endobj
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 595 842]
+/Rotate 90
+/CropBox [0 0 595 842]
+/BleedBox [0 0 595 842]
+/TrimBox [0 0 595 842]
+/ArtBox [0 0 595 842]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+xref
+0 7
+0000000000 65535 f
+0000000015 00000 n
+0000000109 00000 n
+0000000158 00000 n
+0000000215 00000 n
+0000000663 00000 n
+0000000940 00000 n
+trailer
+<< /Size 7
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+1037
+%%EOF
diff --git a/spec/data/stream-with-extra-byte.z b/spec/data/stream-with-extra-byte.z
new file mode 100644
index 0000000..be42489
Binary files /dev/null and b/spec/data/stream-with-extra-byte.z differ
diff --git a/spec/data/stream-with-indirect-filters.pdf b/spec/data/stream-with-indirect-filters.pdf
new file mode 100644
index 0000000..38c3447
--- /dev/null
+++ b/spec/data/stream-with-indirect-filters.pdf
@@ -0,0 +1,73 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 7 0 R
+/Filter 8 0 R
+>>
+stream
+x�5���0Dw���$vrn��lH�����/�T,���w�!:7RL��ؤs������۠�ZfTIPt+�1%�:"�e��bcM�b���b�*�o������?X����\w ��S�C����c۞�ntiDw�|�*�
+endstream
+endobj
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612 792]
+/CropBox [0 0 612 792]
+/BleedBox [0 0 612 792]
+/TrimBox [0 0 612 792]
+/ArtBox [0 0 612 792]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+7 0 obj
+140
+endobj
+8 0 obj
+[/FlateDecode]
+endobj
+xref
+0 9
+0000000000 65535 f
+0000000015 00000 n
+0000000109 00000 n
+0000000158 00000 n
+0000000215 00000 n
+0000000422 00000 n
+0000000688 00000 n
+0000000785 00000 n
+0000000804 00000 n
+trailer
+<< /Size 9
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+834
+%%EOF
diff --git a/spec/data/text_outside_cropbox_and_mediabox.pdf b/spec/data/text_outside_cropbox_and_mediabox.pdf
new file mode 100644
index 0000000..e91c9bf
--- /dev/null
+++ b/spec/data/text_outside_cropbox_and_mediabox.pdf
@@ -0,0 +1,101 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 539
+>>
+stream
+q
+
+BT
+136.0 527.384 Td
+/F1.0 12 Tf
+[<54686973207465> 30 <787420697320696e73696465207468652043726f70426f> 30 <78>] TJ
+ET
+
+
+BT
+136.0 497.384 Td
+/F1.0 12 Tf
+[<5468657265206973206164646974696f6e616c207465> 30 <7874206f757473696465>] TJ
+ET
+
+
+BT
+136.0 467.384 Td
+/F1.0 12 Tf
+[<7468652043726f70426f> 30 <7820616e64204d65646961426f> 30 <78>] TJ
+ET
+
+
+BT
+41.0 41.0 Td
+/F1.0 12 Tf
+[<42657477> 10 <65656e2043726f70426f> 30 <7820616e64204d65646961426f> 30 <78>] TJ
+ET
+
+
+BT
+736.0 836.0 Td
+/F1.0 12 Tf
+[<4f757473696465204d65646961426f> 30 <78>] TJ
+ET
+
+Q
+
+endstream
+endobj
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612 792]
+/CropBox [100 100 412 592]
+/BleedBox [0 0 612 792]
+/TrimBox [0 0 612 792]
+/ArtBox [0 0 612 792]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+xref
+0 7
+0000000000 65535 f
+0000000015 00000 n
+0000000109 00000 n
+0000000158 00000 n
+0000000215 00000 n
+0000000805 00000 n
+0000001075 00000 n
+trailer
+<< /Size 7
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+1172
+%%EOF
diff --git a/spec/data/textwrapcr.pdf b/spec/data/textwrapcr.pdf
new file mode 100644
index 0000000..a6d2db1
--- /dev/null
+++ b/spec/data/textwrapcr.pdf
@@ -0,0 +1 @@
+%PDF-1.1
%¥±ë
1 0 obj
<< /Type /Catalog
/Pages 2 0 R
>>
endobj
2 0 obj
<< /Type /Pages
/Kids [3 0 R]
/Count 1
/MediaBox [0 0 300 144]
>>
endobj
3 0 obj
<< /Type /Page
/Parent 2 0 R
/Resources
<< /Font
<< /F1
<< /Type /Font
/Subtype /Type1
/BaseFont /Times-Roman
>>
>>
>>
/Contents 4 0 R
>>
endobj
4 0 obj
<< /Length 55 >>
stream
BT
/F1 18 Tf
0 0 Td
(aaaa\
bbbb) Tj
ET
endstream
endobj
xref
0 5
0000000000 65535 f
0000000018 00000 n
0000000077 00000 n
0000000178 00000 n
0000000457 00000 n
trailer
<< /Root 1 0 R
/Size 5
>>
startxref
565
%%EOF
\ No newline at end of file
diff --git a/spec/data/textwrapcrlf.pdf b/spec/data/textwrapcrlf.pdf
new file mode 100644
index 0000000..e406697
--- /dev/null
+++ b/spec/data/textwrapcrlf.pdf
@@ -0,0 +1,2 @@
+%PDF-1.1
%¥±ë
1 0 obj
<< /Type /Catalog
/Pages 2 0 R
>>
endobj
2 0 obj
<< /Type /Pages
/Kids [3 0 R]
/Count 1
/MediaBox [0 0 300 144]
>>
endobj
3 0 obj
<< /Type /Page
/Parent 2 0 R
/Resources
<< /Font
<< /F1
<< /Type /Font
/Subtype /Type1
/BaseFont /Times-Roman
>>
>>
>>
/Contents 4 0 R
>>
endobj
4 0 obj
<< /Length 55 >>
stream
BT
/F1 18 Tf
0 0 Td
(aaaa\
+bbbb) Tj
ET
endstream
endobj
xref
0 5
0000000000 65535 f
0000000018 00000 n
0000000077 00000 n
0000000178 00000 n
0000000457 00000 n
trailer
<< /Root 1 0 R
/Size 5
>>
startxref
565
%%EOF
\ No newline at end of file
diff --git a/spec/data/textwraplf.pdf b/spec/data/textwraplf.pdf
new file mode 100644
index 0000000..0b7aa51
--- /dev/null
+++ b/spec/data/textwraplf.pdf
@@ -0,0 +1,59 @@
+%PDF-1.1
+%¥±ë
+
+1 0 obj
+ << /Type /Catalog
+ /Pages 2 0 R
+ >>
+endobj
+
+2 0 obj
+ << /Type /Pages
+ /Kids [3 0 R]
+ /Count 1
+ /MediaBox [0 0 300 144]
+ >>
+endobj
+
+3 0 obj
+ << /Type /Page
+ /Parent 2 0 R
+ /Resources
+ << /Font
+ << /F1
+ << /Type /Font
+ /Subtype /Type1
+ /BaseFont /Times-Roman
+ >>
+ >>
+ >>
+ /Contents 4 0 R
+ >>
+endobj
+
+4 0 obj
+ << /Length 55 >>
+stream
+ BT
+ /F1 18 Tf
+ 0 0 Td
+ (aaaa\
+ bbbb) Tj
+ ET
+endstream
+endobj
+
+xref
+0 5
+0000000000 65535 f
+0000000018 00000 n
+0000000077 00000 n
+0000000178 00000 n
+0000000457 00000 n
+trailer
+ << /Root 1 0 R
+ /Size 5
+ >>
+startxref
+565
+%%EOF
diff --git a/spec/data/textwraplfcr.pdf b/spec/data/textwraplfcr.pdf
new file mode 100644
index 0000000..24eece0
--- /dev/null
+++ b/spec/data/textwraplfcr.pdf
@@ -0,0 +1,2 @@
+%PDF-1.1
%¥±ë
1 0 obj
<< /Type /Catalog
/Pages 2 0 R
>>
endobj
2 0 obj
<< /Type /Pages
/Kids [3 0 R]
/Count 1
/MediaBox [0 0 300 144]
>>
endobj
3 0 obj
<< /Type /Page
/Parent 2 0 R
/Resources
<< /Font
<< /F1
<< /Type /Font
/Subtype /Type1
/BaseFont /Times-Roman
>>
>>
>>
/Contents 4 0 R
>>
endobj
4 0 obj
<< /Length 55 >>
stream
BT
/F1 18 Tf
0 0 Td
(aaaa\
+
bbbb) Tj
ET
endstream
endobj
xref
0 5
0000000000 65535 f
0000000018 00000 n
0000000077 00000 n
0000000178 00000 n
0000000457 00000 n
trailer
<< /Root 1 0 R
/Size 5
>>
startxref
565
%%EOF
\ No newline at end of file
diff --git a/spec/encoding_spec.rb b/spec/encoding_spec.rb
index ccba66f..aa8594c 100644
--- a/spec/encoding_spec.rb
+++ b/spec/encoding_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::Encoding do
diff --git a/spec/filter_spec.rb b/spec/filter_spec.rb
index cfaa916..5cdbe3c 100644
--- a/spec/filter_spec.rb
+++ b/spec/filter_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::Filter do
diff --git a/spec/font_descriptor_spec.rb b/spec/font_descriptor_spec.rb
index 2e7f394..d5be0ab 100644
--- a/spec/font_descriptor_spec.rb
+++ b/spec/font_descriptor_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::FontDescriptor do
@@ -19,7 +20,7 @@ describe PDF::Reader::FontDescriptor do
:XHeight => 0,
:FontStretch => :Condensed,
:FontWeight => 500,
- :FontFamily => :BoldItalic
+ :FontFamily => "BoldItalic"
}
end
let!(:objects) { PDF::Reader::ObjectHash.allocate }
@@ -41,7 +42,7 @@ describe PDF::Reader::FontDescriptor do
expect(subject.x_height).to eq(0)
expect(subject.font_stretch).to eq(:Condensed)
expect(subject.font_weight).to eq(500)
- expect(subject.font_family).to eq(:BoldItalic)
+ expect(subject.font_family).to eq("BoldItalic")
end
end
diff --git a/spec/font_spec.rb b/spec/font_spec.rb
index a7a8c05..dbcac0e 100644
--- a/spec/font_spec.rb
+++ b/spec/font_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::Font do
@@ -23,9 +24,9 @@ describe PDF::Reader::Font do
font.to_utf8(["hello", "howdy"])
end
- it "returns the same type when to_utf8 is called with a string or array" do
+ it "returns a string when to_utf8 is called with a string or array" do
expect(font.to_utf8("abc")).to be_a_kind_of(String)
- expect(font.to_utf8(["abc"])).to be_a_kind_of(Array)
+ expect(font.to_utf8(["abc"])).to be_a_kind_of(String)
end
it "converts integers to a utf-8 string" do
diff --git a/spec/glyph_hash_spec.rb b/spec/glyph_hash_spec.rb
index 565ba38..93026d0 100644
--- a/spec/glyph_hash_spec.rb
+++ b/spec/glyph_hash_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::GlyphHash do
@@ -60,11 +61,16 @@ describe PDF::Reader::GlyphHash do
expect(map.name_to_unicode(:GG20000)).to eql(20000)
end
+ it "correctly maps a zaph dingbats name to unicode" do
+ map = PDF::Reader::GlyphHash.new
+ expect(map.name_to_unicode(:a3)).to eql(0x2704)
+ end
+
end
describe "#unicode_to_name" do
- it "correctly maps a standard glyph name to unicode" do
+ it "correctly maps a standard unicode codepoint to a glyph name" do
map = PDF::Reader::GlyphHash.new
expect(map.unicode_to_name(0x0061)).to eql([:a])
expect(map.unicode_to_name(0x0065)).to eql([:e])
@@ -78,5 +84,10 @@ describe PDF::Reader::GlyphHash do
expect(map.unicode_to_name(0x30BA)).to eql([:zukatakana])
expect(map.unicode_to_name(157)).to eql([])
end
+
+ it "correctly maps a zapf dingbats unicode codepoint to a glyph name" do
+ map = PDF::Reader::GlyphHash.new
+ expect(map.unicode_to_name(0x2704)).to eql([:a3])
+ end
end
end
diff --git a/spec/integration_invalid_spec.rb b/spec/integration_invalid_spec.rb
new file mode 100644
index 0000000..86fa077
--- /dev/null
+++ b/spec/integration_invalid_spec.rb
@@ -0,0 +1,365 @@
+# typed: false
+# coding: utf-8
+
+# A set of integration specs that assert we raise expected errors when trying to parse PDFs that
+# are invalid. Usually they have some form of corruption that we're unable to compensate for
+
+describe PDF::Reader, "integration specs with invalid PDF files" do
+
+ context "Empty file" do
+ it "raises an exception" do
+ expect {
+ PDF::Reader.new(StringIO.new(""))
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "PDF has a content stream refers to a non-existant font" do
+ let(:filename) { pdf_spec_file("content_stream_refers_to_invalid_font") }
+
+ it "raises an exception" do
+ expect {
+ reader = PDF::Reader.new(filename)
+ reader.page(1).text
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "Malformed PDF" do
+ let(:filename) { pdf_spec_file("trailer_root_is_not_a_dict") }
+
+ it "raises an exception if trailer Root is not a dict" do
+ PDF::Reader.open(filename) do |reader|
+ expect { reader.page(1) }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+ end
+
+ context "PDF with missing page data" do
+ let(:filename) { pdf_spec_file("invalid_pages") }
+
+ it "raises a MalformedPDFError when an InvalidPageError is raised internally" do
+ PDF::Reader.open(filename) do |reader|
+ expect { reader.pages }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+ end
+
+ context "PDF that has a content stream with a broken string" do
+ let(:filename) { pdf_spec_file("broken_string") }
+
+ # this file used to get us into a hard, endless loop. Make sure that doesn't still happen
+ it "doesn't hang when extracting doc info" do
+ Timeout::timeout(3) do
+ expect {
+ reader = PDF::Reader.new(filename)
+ reader.info
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+ end
+
+ context "gh-217" do
+ let(:filename) { pdf_spec_file("gh-217") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-222" do
+ let(:filename) { pdf_spec_file("gh-222") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ # The top level Pages object is corrupted and has no Count or Type key
+ context "gh-223" do
+ let(:filename) { pdf_spec_file("gh-223") }
+
+ it "parses without error" do
+ expect {
+ parse_pdf(filename)
+ }.to_not raise_error
+ end
+
+ it "has zero pages" do
+ PDF::Reader.open(filename) do |reader|
+ expect(reader.page_count).to eq 0
+ expect(reader.pages).to eq []
+ end
+ end
+ end
+
+ context "gh-224" do
+ let(:filename) { pdf_spec_file("gh-224") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-227" do
+ let(:filename) { pdf_spec_file("gh-227") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-228" do
+ let(:filename) { pdf_spec_file("gh-228") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-229" do
+ let(:filename) { pdf_spec_file("gh-229") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-230" do
+ let(:filename) { pdf_spec_file("gh-230") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-231" do
+ let(:filename) { pdf_spec_file("gh-231") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-232" do
+ let(:filename) { pdf_spec_file("gh-232") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-234" do
+ let(:filename) { pdf_spec_file("gh-234") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-235" do
+ let(:filename) { pdf_spec_file("gh-235") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-236" do
+ let(:filename) { pdf_spec_file("gh-236") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-237" do
+ let(:filename) { pdf_spec_file("gh-237") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-238" do
+ let(:filename) { pdf_spec_file("gh-238") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-239" do
+ let(:filename) { pdf_spec_file("gh-239") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-240" do
+ let(:filename) { pdf_spec_file("gh-240") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-241" do
+ let(:filename) { pdf_spec_file("gh-241") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "gh-242" do
+ let(:filename) { pdf_spec_file("gh-242") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ # This one raised an unexpected exception in v2.0.0, but since v2.6.0 (and PR #372) it works
+ # without error
+ context "gh-243" do
+ let(:filename) { pdf_spec_file("gh-243") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to_not raise_error
+ end
+ end
+
+ # This one raised an unexpected exception in v2.0.0, but since v2.4.0 (and PR #309) it works
+ # without error
+ context "gh-244" do
+ let(:filename) { pdf_spec_file("gh-244") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to_not raise_error
+ end
+ end
+
+ # This encrypted PDF declares an invalid key length. It's not really that we don't support a
+ # feature - we'll never support an invalid key length. We raise an unsupported fature error
+ # anyway.
+ context "gh-245" do
+ let(:filename) { pdf_spec_file("gh-245") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::UnsupportedFeatureError)
+ end
+ end
+
+ context "negative-xref-offset.pdf" do
+ let(:filename) { pdf_spec_file("negative-xref-offset") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "content_stream_wrong_args.pdf" do
+ let(:filename) { pdf_spec_file("content_stream_wrong_args") }
+
+ it "raises MalformedPDFError when parsed" do
+ expect {
+ parse_pdf(filename)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
+ end
+
+ context "xref_offset_too_low.pdf" do
+ let(:filename) { pdf_spec_file("xref_offset_too_low") }
+
+ it "compensates for the error and can extract the paage text" do
+ expect {
+ parse_pdf(filename)
+ }.to_not raise_error
+
+ PDF::Reader.open(filename) do |pdf|
+ expect(pdf.page(1).text).to eql(
+ "The xref offset for the root object (obj 2) is a few bytes too low"
+ )
+ end
+ end
+ end
+
+ context "stream_missing_endobj.pdf" do
+ let(:filename) { pdf_spec_file("stream_missing_endobj") }
+
+ it "compensates for the error and can extract the paage text" do
+ expect {
+ parse_pdf(filename)
+ }.to_not raise_error
+
+ PDF::Reader.open(filename) do |pdf|
+ expect(pdf.page(1).text).to eql(
+ "Object 4 (content stream) is missing the endobj token"
+ )
+ end
+ end
+ end
+
+ # a very basic sanity check that we can open this file and extract interesting data
+ def parse_pdf(filename)
+ PDF::Reader.open(filename) do |reader|
+ reader.pdf_version
+ reader.info
+ reader.metadata
+ reader.objects
+ reader.page_count
+
+ reader.pages.each do |page|
+ page.fonts.to_s
+ page.text.to_s
+ page.raw_content.to_s
+ end
+ end
+ end
+end
diff --git a/spec/integration_spec.rb b/spec/integration_spec.rb
index 446373e..7859073 100644
--- a/spec/integration_spec.rb
+++ b/spec/integration_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
# These specs are a kind of integration spec. They're not unit testing small pieces
@@ -13,12 +14,79 @@ describe PDF::Reader, "integration specs" do
context "cairo-unicode-short" do
let(:filename) { pdf_spec_file("cairo-unicode-short") }
- it "interprets unicode strings correctly" do
+ it "extracts unicode strings correctly" do
PDF::Reader.open(filename) do |reader|
page = reader.page(1)
expect(page.text).to eql("Chunky Bacon")
end
end
+
+ it "extracts unicode strings correctly from part of the page" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(
+ page.text(rect: PDF::Reader::Rectangle.new(29, 779, 100, 800))
+ ).to eql("Chunky")
+ end
+ end
+
+ # This spec assumes high precision in our glyph positioning calcualtions. It's likely
+ # that the specific x,y co-ords tested here might change a bit over time as small bugs
+ # in glyph positioning are ironed out (kerning, etc). I still think this test is worthwhile,
+ # to confirm the positions don't change unintentionally.
+ #
+ # pitstop co-ords
+ # C 32.0176, 779.5879
+ # h 48.8279, 779.89
+ # u 60.2067, 779.5879
+ # n 73.8355, 779.89
+ # k 87.3393, 779.89
+ # y 97.3745, 775.4526
+ it "extracts individual chars with correct positions" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ some_runs = page.runs(
+ merge: false,
+ rect: PDF::Reader::Rectangle.new(29, 779, 100, 800)
+ )
+ expect(some_runs.size).to eql(6)
+ expect(some_runs[0].text).to eql("C")
+ expect(some_runs[0].origin).to be_close_to(PDF::Reader::Point.new(30,779.89))
+ expect(some_runs[1].text).to eql("h")
+ expect(some_runs[1].origin).to be_close_to(PDF::Reader::Point.new(44.89,779.89))
+ expect(some_runs[2].text).to eql("u")
+ expect(some_runs[2].origin).to be_close_to(PDF::Reader::Point.new(58.39, 779.89))
+ expect(some_runs[3].text).to eql("n")
+ expect(some_runs[3].origin).to be_close_to(PDF::Reader::Point.new(71.89, 779.89))
+ expect(some_runs[4].text).to eql("k")
+ expect(some_runs[4].origin).to be_close_to(PDF::Reader::Point.new(85.40, 779.89))
+ expect(some_runs[5].text).to eql("y")
+ expect(some_runs[5].origin).to be_close_to(PDF::Reader::Point.new(96.73, 779.89))
+ end
+ end
+
+ it "is portrait orientation" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.orientation).to eql("portrait")
+ end
+ end
+
+ it "returns correct page dimensions" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ # A4 portrait
+ expect(page.width).to be_within(0.1).of(595.28)
+ expect(page.height).to be_within(0.1).of(841.89)
+ end
+ end
+
+ it "returns correct origin" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.origin).to eq PDF::Reader::Point.new(0,0)
+ end
+ end
end
context "vertical-text-in-identity-v" do
@@ -52,7 +120,9 @@ describe PDF::Reader, "integration specs" do
expect(reader.pages.size).to eql(3)
page = reader.page(1)
- expect(page.text).to include("Dit\302\240is\302\240een\302\240pdf\302\240test\302\240van\302\240drie\302\240pagina")
+ expect(page.text).to include(
+ "Dit\302\240is\302\240een\302\240pdf\302\240test\302\240van\302\240drie\302\240pagina"
+ )
expect(page.text).to include("’s")
expect(page.text).to include("Pagina\302\2401")
end
@@ -92,6 +162,17 @@ describe PDF::Reader, "integration specs" do
end
end
+ context "PDF with a content stream that is enclosed with CR characters only" do
+ let(:filename) { pdf_spec_file("content_stream_cr_only") }
+
+ it "extracts text correctly" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.text).to eq("This is a weird PDF file")
+ end
+ end
+ end
+
context "PDF with a content stream that is missing an operator (has hanging params)" do
let(:filename) { pdf_spec_file("content_stream_missing_final_operator") }
@@ -115,20 +196,6 @@ describe PDF::Reader, "integration specs" do
end
end
- context "PDF that has a content stream with a broken string" do
- let(:filename) { pdf_spec_file("broken_string") }
-
- # this file used to get us into a hard, endless loop. Make sure that doesn't still happen
- it "doesn't hang when extracting doc info" do
- Timeout::timeout(3) do
- expect {
- reader = PDF::Reader.new(filename)
- reader.info
- }.to raise_error(PDF::Reader::MalformedPDFError)
- end
- end
- end
-
context "PDF with a stream that has its length specified as an indirect reference" do
let(:filename) { pdf_spec_file("content_stream_with_length_as_ref") }
@@ -142,7 +209,7 @@ describe PDF::Reader, "integration specs" do
# PDF::Reader::XRef#object was saving an incorrect position when seeking. We
# were saving the current pos of the underlying IO stream, then seeking back
# to it. This was fine, except when there was still content in the buffer.
- context "PDF with a stream that has its length specified as an indirect reference and uses windows line breaks" do
+ context "PDF with a stream length specified via indirect object and uses windows line breaks" do
let(:filename) { pdf_spec_file("content_stream_with_length_as_ref_and_windows_breaks") }
it "extracts text correctly" do
@@ -152,31 +219,19 @@ describe PDF::Reader, "integration specs" do
end
end
- context "PDF has a content stream refers to a non-existant font" do
- let(:filename) { pdf_spec_file("content_stream_refers_to_invalid_font") }
-
- it "raises an exception" do
- expect {
- reader = PDF::Reader.new(filename)
- reader.page(1).text
- }.to raise_error(PDF::Reader::MalformedPDFError)
- end
- end
-
- context "Empty file" do
- it "raises an exception" do
- expect {
- PDF::Reader.new(StringIO.new(""))
- }.to raise_error(PDF::Reader::MalformedPDFError)
- end
- end
-
context "PDF that uses an ASCII85Decode filter" do
let(:filename) { pdf_spec_file("ascii85_filter") }
+ # The text on this page is rotated 45 degrees, so mapping it to plain text isn't straight
+ # forward. Still, it'd be nice to see if this can be improved somehow
+ #
+ # If not, maybe it'd be good to drop this spec, and replace it with one that confirms the text
+ # position if a few key characters
it "extracts text correctly" do
PDF::Reader.open(filename) do |reader|
- expect(reader.page(1).text).to match(/Et Iunia se/)
+ lines = reader.page(1).text.split("\n")
+ expect(lines[0].strip).to eq("E")
+ expect(lines[1].strip).to eq("t Iu")
end
end
end
@@ -191,6 +246,16 @@ describe PDF::Reader, "integration specs" do
end
end
+ context "PDF that has dummy inline data no white-space before EI" do
+ let(:filename) { pdf_spec_file("inline_data_followed_by_ei") }
+
+ it "extracts text correctly" do
+ PDF::Reader.open(filename) do |reader|
+ expect(reader.page(1).text).to eql("ID followed by EI on same line\n__END__")
+ end
+ end
+ end
+
context "PDF that uses Form XObjects to repeat content" do
let(:filename) { pdf_spec_file("form_xobject") }
@@ -249,9 +314,11 @@ describe PDF::Reader, "integration specs" do
context "PDF that has a single space after the EOF marker" do
let(:filename) { pdf_spec_file("space_after_eof") }
+ # This text is rotated at 45 degrees, which isn't particularly easy to map to plain text
+ # It would be nice if all the "Hello World" characters were at least visible though
it "extracts text correctly" do
PDF::Reader.open(filename) do |reader|
- expect(reader.page(1).text).to eql("Hello World")
+ expect(reader.page(1).text).to eql(" r\n loo\nHe")
end
end
end
@@ -727,22 +794,45 @@ describe PDF::Reader, "integration specs" do
context "with the user pass" do
let(:pass) { "apples" }
- # TODO: remove this spec
- it "raises UnsupportedFeatureError" do
- expect {
- PDF::Reader.open(filename, :password => pass) do |reader|
- reader.page(1).text
- end
- }.to raise_error(PDF::Reader::EncryptedPDFError)
+ it "correctly extracts text" do
+ PDF::Reader.open(filename, :password => pass) do |reader|
+ expect(reader.page(1).text).to start_with(
+ "This sample file is encrypted with a user password"
+ )
+ end
+ end
+ it "correctly extracts info" do
+ PDF::Reader.open(filename, :password => pass) do |reader|
+ expect(reader.info).to eq(
+ :Creator=>"Writer",
+ :Producer=>"LibreOffice 3.3",
+ :CreationDate=>"D:20110814231057+10'00'",
+ :ModDate=>"D:20170115224358+11'00'"
+ )
+ end
end
-
- it "correctly extracts text"
- it "correctly extracts info"
end
context "with the owner pass" do
- it "correctly extracts text"
- it "correctly extracts info"
+ let(:pass) { "password" }
+
+ it "correctly extracts text" do
+ PDF::Reader.open(filename, :password => pass) do |reader|
+ expect(reader.page(1).text).to start_with(
+ "This sample file is encrypted with a user password"
+ )
+ end
+ end
+ it "correctly extracts info" do
+ PDF::Reader.open(filename, :password => pass) do |reader|
+ expect(reader.info).to eq(
+ :Creator=>"Writer",
+ :Producer=>"LibreOffice 3.3",
+ :CreationDate=>"D:20110814231057+10'00'",
+ :ModDate=>"D:20170115224358+11'00'"
+ )
+ end
+ end
end
end
@@ -754,22 +844,64 @@ describe PDF::Reader, "integration specs" do
context "with the user pass" do
let(:pass) { "apples" }
- # TODO: remove this spec
- it "raises UnsupportedFeatureError" do
- expect {
- PDF::Reader.open(filename, :password => pass) do |reader|
- reader.page(1).text
- end
- }.to raise_error(PDF::Reader::EncryptedPDFError)
+ it "correctly extracts text" do
+ PDF::Reader.open(filename, :password => pass) do |reader|
+ expect(reader.page(1).text).to start_with(
+ "This sample file is encrypted with a user password"
+ )
+ end
end
- it "correctly extracts text"
- it "correctly extracts info"
+ it "correctly extracts info" do
+ PDF::Reader.open(filename, :password => pass) do |reader|
+ expect(reader.info).to eq(
+ :Creator=>"Writer",
+ :Producer=>"LibreOffice 3.3",
+ :CreationDate=>"D:20110814231057+10'00'",
+ :ModDate=>"D:20170115224526+11'00'"
+ )
+ end
+ end
end
context "with the owner pass" do
- it "correctly extracts text"
- it "correctly extracts info"
+ let(:pass) { "password" }
+
+ it "correctly extracts text" do
+ PDF::Reader.open(filename, :password => pass) do |reader|
+ expect(reader.page(1).text).to start_with(
+ "This sample file is encrypted with a user password"
+ )
+ end
+ end
+ it "correctly extracts info" do
+ PDF::Reader.open(filename, :password => pass) do |reader|
+ expect(reader.info).to eq(
+ :Creator=>"Writer",
+ :Producer=>"LibreOffice 3.3",
+ :CreationDate=>"D:20110814231057+10'00'",
+ :ModDate=>"D:20170115224526+11'00'"
+ )
+ end
+ end
+ end
+ end
+
+ context "Encrypted PDF with an xref stream" do
+ let(:filename) {
+ pdf_spec_file("encrypted_and_xref_stream")
+ }
+
+ it "correctly extracts text" do
+ PDF::Reader.open(filename) do |reader|
+ expect(reader.page(1).text).to eq("This text is encrypted")
+ end
+ end
+
+ it "correctly parses indirect objects" do
+ PDF::Reader.open(filename) do |reader|
+ expect { reader.objects.values }.not_to raise_error
+ end
end
end
@@ -789,7 +921,10 @@ describe PDF::Reader, "integration specs" do
expect(callbacks[0]).to eql(:name => :begin_inline_image, :args => [])
# the second with the image header (colorspace, etc)
- expect(callbacks[1]).to eql(:name => :begin_inline_image_data, :args => [:CS, :RGB, :I, true, :W, 234, :H, 70, :BPC, 8])
+ expect(callbacks[1]).to eql(
+ :name => :begin_inline_image_data,
+ :args => [:CS, :RGB, :I, true, :W, 234, :H, 70, :BPC, 8]
+ )
# the last with the image data
expect(callbacks[2][:name]).to eql :end_inline_image
@@ -923,22 +1058,10 @@ describe PDF::Reader, "integration specs" do
context "PDF that uses a type3 bitmap font with a rare FontMatrix" do
let(:filename) { pdf_spec_file("type3_font_with_rare_font_matrix") }
- # TODO most type3 fonts have a FontMatrix entry of [ 0.001 0 0 0.001 0 0 ],
- # which matches the glyph scale factor of 1000 that non-type3 fonts use.
- # It's permitted for type3 fonts to use other FontMatrix values though,
- # and we should do a better job of extracting the text.
- # The Page is 200pts wide and 50pts high. The first letters for each word
- # *should* be positioned like so:
- #
- # P - X: 10.3 Y: 20 Width: 7.35 Height: 8.55
- # G - X: 56.5 Y: 19.7 Width: 8.25 Height: 9.15
- # A - X: 101.5 Y: 20 Width: 8.25 Height: 9
- #
it "extracts text correctly" do
- pending
PDF::Reader.open(filename) do |reader|
page = reader.page(1)
- expect(page.text).to include("Parallel Genetic Algorithms")
+ expect(page.text).to include("ParallelGenetic Algorithms")
end
end
end
@@ -966,7 +1089,7 @@ describe PDF::Reader, "integration specs" do
it "extracts text without raising an exception" do
PDF::Reader.open(filename) do |reader|
page = reader.page(1)
- expect(page.text.split("\n").map(&:strip).slice(0,2)).to eq(["°","9"])
+ expect(page.text.split("\n").map(&:strip).slice(0,2)).to eq(["0","9"])
end
end
end
@@ -982,6 +1105,17 @@ describe PDF::Reader, "integration specs" do
end
end
+ context "PDF with a TJ operator that aims to correct for character spacing" do
+ let(:filename) { pdf_spec_file("TJ_and_char_spacing") }
+
+ it "extracts text correctly" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.text[15,17]).to eq("The big brown fox")
+ end
+ end
+ end
+
context "PDF with a page that's missing the MediaBox attribute" do
let(:filename) { pdf_spec_file("mediabox_missing") }
@@ -991,6 +1125,21 @@ describe PDF::Reader, "integration specs" do
expect(page.text[0,54]).to eq("This page is missing the compulsory MediaBox attribute")
end
end
+
+ it "is portrait orientation" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.orientation).to eql("portrait")
+ end
+ end
+
+ it "returns correct page dimensions (defaults to portrait US letter)" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.width).to be_within(0.1).of(612)
+ expect(page.height).to be_within(0.1).of(792)
+ end
+ end
end
context "PDF using a standard fint and no difference table" do
@@ -1081,22 +1230,79 @@ describe PDF::Reader, "integration specs" do
end
end
- context "Malformed PDF" do
- let(:filename) { pdf_spec_file("trailer_root_is_not_a_dict") }
+ context "PDF with bad xref: using 1 not 0" do
+ let(:filename) { pdf_spec_file("minimal-xref-1") }
+
+ it "extracts text correctly" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.text).to eq("Hello World")
+ end
+ end
+ end
+
+ context "PDF with octal data" do
+ let(:filename) { pdf_spec_file("octal101") }
+
+ it "extracts text correctly" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.text).to eq("A ]A[")
+ end
+ end
+ end
+
+ context "PDF with octal data" do
+ let(:filename) { pdf_spec_file("octal74") }
+
+ it "extracts text correctly" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.text).to eq("< ]<8[")
+ end
+ end
+ end
+
+ context "PDF with CR line-wrapped text" do
+ let(:filename) { pdf_spec_file("textwrapcr") }
+
+ it "extracts text correctly" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.text).to eq("aaaa bbbb")
+ end
+ end
+ end
+
+ context "PDF with LF line-wrapped text" do
+ let(:filename) { pdf_spec_file("textwraplf") }
+
+ it "extracts text correctly" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.text).to eq("aaaa bbbb")
+ end
+ end
+ end
+
+ context "PDF with CRLF line-wrapped text" do
+ let(:filename) { pdf_spec_file("textwrapcrlf") }
- it "raises an exception if trailer Root is not a dict" do
+ it "extracts text correctly" do
PDF::Reader.open(filename) do |reader|
- expect { reader.page(1) }.to raise_error(PDF::Reader::MalformedPDFError)
+ page = reader.page(1)
+ expect(page.text).to eq("aaaabbbb")
end
end
end
- context "PDF with missing page data" do
- let(:filename) { pdf_spec_file("invalid_pages") }
+ context "PDF with LFCR line-wrapped text" do
+ let(:filename) { pdf_spec_file("textwraplfcr") }
- it "raises a MalformedPDFError when an InvalidPageError is raised internally" do
+ it "extracts text correctly" do
PDF::Reader.open(filename) do |reader|
- expect { reader.pages }.to raise_error(PDF::Reader::MalformedPDFError)
+ page = reader.page(1)
+ expect(page.text).to eq("aaaabbbb")
end
end
end
@@ -1152,12 +1358,72 @@ describe PDF::Reader, "integration specs" do
expect(page.text).to eq(text)
end
end
+
+ # This spec assumes high precision in our glyph positioning calcualtions. It's likely
+ # that the specific x,y co-ords tested here might change a bit over time as small bugs
+ # in glyph positioning are ironed out (kerning, etc). I still think this test is worthwhile,
+ # to confirm the positions don't change unintentionally.
+ #
+ # Pitstop numbers
+ #
+ # u -437.08, -68.018
+ # p -431.054, -70.4555
+ # s -424.851, -68.018
+ # i -420.4, -67.9
+ # d -416.918, -68.018
+ # e -410.978, -68.018
+ it "extracts individual chars with correct positions" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ some_runs = page.runs(
+ merge: false,
+ rect: PDF::Reader::Rectangle.new(-438, -68, -405, -62)
+ )
+ expect(some_runs.size).to eql(6)
+ expect(some_runs[0].text).to eql("u")
+ expect(some_runs[0].origin).to be_close_to(PDF::Reader::Point.new(-437.24, -67.9))
+ expect(some_runs[1].text).to eql("p")
+ expect(some_runs[1].origin).to be_close_to(PDF::Reader::Point.new(-431.24, -67.9))
+ expect(some_runs[2].text).to eql("s")
+ expect(some_runs[2].origin).to be_close_to(PDF::Reader::Point.new(-425.34, -67.9))
+ expect(some_runs[3].text).to eql("i")
+ expect(some_runs[3].origin).to be_close_to(PDF::Reader::Point.new(-420.65, -67.9))
+ expect(some_runs[4].text).to eql("d")
+ expect(some_runs[4].origin).to be_close_to(PDF::Reader::Point.new(-417.35, -67.9))
+ expect(some_runs[5].text).to eql("e")
+ expect(some_runs[5].origin).to be_close_to(PDF::Reader::Point.new(-411.26, -67.9))
+ end
+ end
+
+ it "is portrait orientation" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.orientation).to eql("portrait")
+ end
+ end
+
+ it "returns correct page dimensions" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ # A4 portrait
+ expect(page.width).to be_within(0.1).of(595.30)
+ expect(page.height).to be_within(0.1).of(841.88)
+ end
+ end
+
+ it "returns correct origin" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.origin.x).to be_within(0.1).of(-595.30)
+ expect(page.origin.y).to be_within(0.1).of(-841.88)
+ end
+ end
end
- context "PDF with page rotation followed by matrix transformations to undo it" do
+ context "PDF with page rotation of 270 degrees followed by matrix transformations to undo it" do
let(:filename) { pdf_spec_file("rotate-then-undo") }
let(:text) {
- "This page uses matrix transformations to print text sideways, " +
+ "This page uses matrix transformations to print text sideways, " +
"then has a Rotate key to fix it"
}
@@ -1167,5 +1433,352 @@ describe PDF::Reader, "integration specs" do
expect(page.text).to eq(text)
end
end
+
+ # This spec assumes high precision in our glyph positioning calcualtions. It's likely
+ # that the specific x,y co-ords tested here might change a bit over time as small bugs
+ # in glyph positioning are ironed out (kerning, etc). I still think this test is worthwhile,
+ # to confirm the positions don't change unintentionally.
+ #
+ # Pitstop Numbers
+ #
+ # T -570.28, 750.95
+ # h -560.86, 750.95
+ # i -553.38, 750.95
+ # s -550.68, 750.76
+ #
+ it "extracts individual chars with correct positions" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ some_runs = page.runs(
+ merge: false,
+ rect: PDF::Reader::Rectangle.new(-572, 749, -545, 760)
+ )
+ expect(some_runs.size).to eql(4)
+ expect(some_runs[0].text).to eql("T")
+ expect(some_runs[0].origin).to be_close_to(PDF::Reader::Point.new(-570.24, 750.95))
+ expect(some_runs[1].text).to eql("h")
+ expect(some_runs[1].origin).to be_close_to(PDF::Reader::Point.new(-561.95, 750.95))
+ expect(some_runs[2].text).to eql("i")
+ expect(some_runs[2].origin).to be_close_to(PDF::Reader::Point.new(-554.40, 750.95))
+ expect(some_runs[3].text).to eql("s")
+ expect(some_runs[3].origin).to be_close_to(PDF::Reader::Point.new(-551.39, 750.95))
+ end
+ end
+
+ it "is portrait orientation" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.orientation).to eql("portrait")
+ end
+ end
+
+ it "returns correct page dimensions" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ # A4 portrait
+ expect(page.width).to be_within(0.1).of(595.30)
+ expect(page.height).to be_within(0.1).of(841.88)
+ end
+ end
+
+ it "returns correct origin" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.origin.x).to be_within(0.1).of(-595.30)
+ expect(page.origin.y).to be_within(0.1).of(0)
+ end
+ end
+ end
+
+ context "PDF with 270° page rotation and matrix transformations within BT block to undo" do
+ let(:filename) { pdf_spec_file("rotate-270-then-undo-inside-bt") }
+ let(:text) { "This page is rotated 270 degrees" }
+
+ it "extracts text correctly" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.text).to eq(text)
+ end
+ end
+
+ # This spec assumes high precision in our glyph positioning calcualtions. It's likely
+ # that the specific x,y co-ords tested here might change a bit over time as small bugs
+ # in glyph positioning are ironed out (kerning, etc). I still think this test is worthwhile,
+ # to confirm the positions don't change unintentionally.
+ #
+ # Pitstop numbers
+ #
+ # T -320.736, 534
+ # h -312.408, 534
+ # i -305.796, 534
+ # s -303.408, 533.832
+ #
+ it "extracts individual chars with correct positions" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ some_runs = page.runs(
+ merge: false,
+ rect: PDF::Reader::Rectangle.new(-322, 534, -300, 550)
+ )
+ expect(some_runs.size).to eql(4)
+ expect(some_runs[0].text).to eql("T")
+ expect(some_runs[0].origin).to be_close_to(PDF::Reader::Point.new(-320.2, 534.5))
+ expect(some_runs[1].text).to eql("h")
+ expect(some_runs[1].origin).to be_close_to(PDF::Reader::Point.new(-312.86, 534.5))
+ expect(some_runs[2].text).to eql("i")
+ expect(some_runs[2].origin).to be_close_to(PDF::Reader::Point.new(-306.19, 534.5))
+ expect(some_runs[3].text).to eql("s")
+ expect(some_runs[3].origin).to be_close_to(PDF::Reader::Point.new(-303.532, 534.5))
+ end
+ end
+
+ it "is portrait orientation" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.orientation).to eql("portrait")
+ end
+ end
+
+ it "returns correct page dimensions" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ # A4 portrait
+ expect(page.width).to be_within(0.1).of(595.30)
+ expect(page.height).to be_within(0.1).of(841.88)
+ end
+ end
+
+ it "returns correct origin" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.origin.x).to be_within(0.1).of(-595.30)
+ expect(page.origin.y).to be_within(0.1).of(0)
+ end
+ end
+ end
+
+ context "PDF with page rotation of 90 degrees followed by matrix transformations to undo it" do
+ let(:filename) { pdf_spec_file("rotate-90-then-undo") }
+ let(:text) {
+ "1: This PDF has Rotate:90 in the page metadata\n" +
+ "2: to get a landscape layout, and then uses matrix\n" +
+ "3: transformation to rotate the text back to normal"
+ }
+
+ it "extracts text correctly" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.text).to eq(text)
+ end
+ end
+
+ # This spec assumes high precision in our glyph positioning calcualtions. It's likely
+ # that the specific x,y co-ords tested here might change a bit over time as small bugs
+ # in glyph positioning are ironed out (kerning, etc). I still think this test is worthwhile,
+ # to confirm the positions don't change unintentionally.
+ #
+ # Pitstop numbers
+ #
+ # T 287.298, -45.49
+ # h 295.626, -45.49
+ # i 302.238, -45.49
+ # s 304.626, -45.658
+ #
+ it "extracts individual chars with correct positions" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ some_runs = page.runs(
+ merge: false,
+ rect: PDF::Reader::Rectangle.new(285, -47, 310, -35)
+ )
+ expect(some_runs.size).to eql(4)
+ expect(some_runs[0].text).to eql("T")
+ expect(some_runs[0].origin).to be_close_to(PDF::Reader::Point.new(287.33, -45.49))
+ expect(some_runs[1].text).to eql("h")
+ expect(some_runs[1].origin).to be_close_to(PDF::Reader::Point.new(294.66, -45.49))
+ expect(some_runs[2].text).to eql("i")
+ expect(some_runs[2].origin).to be_close_to(PDF::Reader::Point.new(301.33, -45.49))
+ expect(some_runs[3].text).to eql("s")
+ expect(some_runs[3].origin).to be_close_to(PDF::Reader::Point.new(304, -45.49))
+ end
+ end
+
+ it "is portrait landscape" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.orientation).to eql("landscape")
+ end
+ end
+
+ it "returns correct page dimensions" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ # A4 landscape
+ expect(page.width).to be_within(0.1).of(842)
+ expect(page.height).to be_within(0.1).of(595)
+ end
+ end
+
+ it "returns correct origin" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.origin.x).to be_within(0.1).of(0)
+ expect(page.origin.y).to be_within(0.1).of(-595)
+ end
+ end
+ end
+
+ context "PDF with page rotation of 90 degrees followed by matrix transformations to undo it" do
+ let(:filename) { pdf_spec_file("rotate-90-then-undo-with-br-text") }
+
+ it "extracts text correctly" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.text).to include("This PDF ha sRotate:90 in the page")
+ expect(page.text).to include("metadata to get a landscape layout")
+ expect(page.text).to include("and text in bottom right quadrant")
+ end
+ end
+
+ # This spec assumes high precision in our glyph positioning calcualtions. It's likely
+ # that the specific x,y co-ords tested here might change a bit over time as small bugs
+ # in glyph positioning are ironed out (kerning, etc). I still think this test is worthwhile,
+ # to confirm the positions don't change unintentionally.
+ #
+ # Pitstop Numbers
+ #
+ # p 216.026, -525.906
+ # a 222.398, -523.578
+ # g 228.986, -525.906
+ # e 235.682, -523.578
+ #
+ it "extracts individual chars with correct positions" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ some_runs = page.runs(
+ merge: false,
+ rect: PDF::Reader::Rectangle.new(212, -524, 239, -520)
+ )
+ expect(some_runs.size).to eql(4)
+ expect(some_runs[0].text).to eql("p")
+ expect(some_runs[0].origin).to be_close_to(PDF::Reader::Point.new(215.06, -523.41))
+ expect(some_runs[1].text).to eql("a")
+ expect(some_runs[1].origin).to be_close_to(PDF::Reader::Point.new(221.73, -523.41))
+ expect(some_runs[2].text).to eql("g")
+ expect(some_runs[2].origin).to be_close_to(PDF::Reader::Point.new(228.41, -523.41))
+ expect(some_runs[3].text).to eql("e")
+ expect(some_runs[3].origin).to be_close_to(PDF::Reader::Point.new(235.08, -523.41))
+ end
+ end
+
+ it "is landscape orientation" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.orientation).to eql("landscape")
+ end
+ end
+
+ it "returns correct page dimensions" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ # A4 landscape
+ expect(page.width).to be_within(0.1).of(842)
+ expect(page.height).to be_within(0.1).of(595)
+ end
+ end
+
+ it "returns correct origin" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.origin.x).to be_within(0.1).of(0)
+ expect(page.origin.y).to be_within(0.1).of(-595)
+ end
+ end
+ end
+
+ context "PDF with /Prev 0 trailer entry" do
+ let(:filename) { pdf_spec_file("prev0") }
+
+ it "extracts text correctly" do
+ PDF::Reader.open(filename) do |reader|
+ expect(reader.page(1).text).to eql("aaaa bbbb")
+ end
+ end
+ end
+
+ context "Content stream with indirect object for filters array" do
+ let(:filename) { pdf_spec_file("stream-with-indirect-filters") }
+
+ it "extracts text correctly" do
+ PDF::Reader.open(filename) do |reader|
+ expect(reader.page(1).text).to eql(
+ "The content stream for this page stores the filter in an indirect object"
+ )
+ end
+ end
+ end
+
+ context "PDF with text outside the CropBox and MediaBox" do
+ let(:filename) { pdf_spec_file("text_outside_cropbox_and_mediabox") }
+
+ it "returns the correct rectangles for the page 1" do
+ PDF::Reader.open(filename) do |reader|
+ page = reader.page(1)
+ expect(page.rectangles[:MediaBox]).to eq(PDF::Reader::Rectangle.new(0, 0, 612, 792))
+ expect(page.rectangles[:CropBox]).to eq(PDF::Reader::Rectangle.new(100, 100, 412, 592))
+ end
+ end
+
+ it "by default only extracts text inside the CropBox" do
+ PDF::Reader.open(filename) do |reader|
+ text = reader.page(1).text
+ expect(text).to include("This text is inside the CropBox")
+ expect(text).to_not include("Between CropBox and MediaBox")
+ expect(text).to_not include("Outside MediaBox")
+ end
+ end
+
+ it "by default only extracts runs inside the CropBox" do
+ PDF::Reader.open(filename) do |reader|
+ text_from_runs = reader.page(1).runs.map(&:text).join(" ")
+ expect(text_from_runs).to include("This text is inside the CropBox")
+ expect(text_from_runs).to_not include("Between CropBox and MediaBox")
+ expect(text_from_runs).to_not include("Outside MediaBox")
+ end
+ end
+
+ it "can extract text between CropBox and MediaBox with a custom option" do
+ PDF::Reader.open(filename) do |reader|
+ text = reader.page(1).text(rect: PDF::Reader::Rectangle.new(0, 0, 612, 792))
+ expect(text).to include("This text is inside the CropBox")
+ expect(text).to include("Between CropBox and MediaBox")
+ expect(text).to_not include("Outside MediaBox")
+ end
+ end
+
+ it "can extract runs between CropBox and MediaBox with a custom option" do
+ mediabox = PDF::Reader::Rectangle.new(0, 0, 612, 792)
+ PDF::Reader.open(filename) do |reader|
+ text_from_runs = reader.page(1).runs(rect: mediabox).map(&:text).join(" ")
+ expect(text_from_runs).to include("This text is inside the CropBox")
+ expect(text_from_runs).to include("Between CropBox and MediaBox")
+ expect(text_from_runs).to_not include("Outside MediaBox")
+ end
+ end
+
+ # This currently doesn't work - PDF::Reader::PageLayout skips text that's outside the MediaBox
+ # I'm not sure we want it to work either, but I'm adding it as a pending spec for completeness
+ # while I consider the best options
+ it "can extract text outside the MediaBox with a custom option"
+
+ it "can extract runs outside the MediaBox with a custom option" do
+ larger_than_mediabox = PDF::Reader::Rectangle.new(0, 0, 900, 900)
+ PDF::Reader.open(filename) do |reader|
+ text_from_runs = reader.page(1).runs(rect: larger_than_mediabox).map(&:text).join(" ")
+ expect(text_from_runs).to include("This text is inside the CropBox")
+ expect(text_from_runs).to include("Between CropBox and MediaBox")
+ expect(text_from_runs).to include("Outside MediaBox")
+ end
+ end
end
end
diff --git a/spec/integrity.yml b/spec/integrity.yml
index 04def0c..d8b5214 100644
--- a/spec/integrity.yml
+++ b/spec/integrity.yml
@@ -2,6 +2,9 @@
data/20070313 - 2nd Laptop Battery.pdf:
:bytes: 27832
:md5: be3427795b673615e42f89b9043d44d9
+data/TJ_and_char_spacing.pdf:
+ :bytes: 905
+ :md5: 8d2a7d485f95f3bc45187c1cf38330c2
data/TJ_starts_with_a_number.pdf:
:bytes: 13119
:md5: 83501b5c507cdddbd9283ad2003c885b
@@ -14,9 +17,6 @@ data/all_page_boxes_exist.pdf:
data/ascii85_filter.pdf:
:bytes: 21288
:md5: 49502f60a3f058e20d0564312c9dda2b
-data/broken_string.pdf:
- :bytes: 929
- :md5: f717634f2e419e496e1e93a0cb5b7d18
data/cairo-basic.pdf:
:bytes: 9659
:md5: 88be82e60534bfa5f85b9ec0697ec6d6
@@ -71,12 +71,12 @@ data/content_stream_as_array.pdf:
data/content_stream_begins_with_newline.pdf:
:bytes: 910
:md5: 6c447a7c6c99eb2b984ab2fd4c8d9c61
+data/content_stream_cr_only.pdf:
+ :bytes: 702
+ :md5: 3253e3654b2375bdd732d0dd1c096db9
data/content_stream_missing_final_operator.pdf:
:bytes: 46799
:md5: 8b3d2706526dcf684dad80b53bf6dc94
-data/content_stream_refers_to_invalid_font.pdf:
- :bytes: 598
- :md5: e4a711b9d2fbc3ebe0e16c7498563521
data/content_stream_trailing_whitespace.pdf:
:bytes: 55688
:md5: 5dad57e5cae55c8b305a0853c8e3d067
@@ -110,6 +110,9 @@ data/distiller_unicode.pdf:
data/dutch.pdf:
:bytes: 14163
:md5: cbe0d3075d4474a221cd0b3800c5a0e4
+data/encrypted_and_xref_stream.pdf:
+ :bytes: 1197
+ :md5: 6bba66a160f820798385a3d1e8e156d2
data/encrypted_version1_revision2_128bit_rc4_blank_user_password.pdf:
:bytes: 15674
:md5: 88a9b78341fa55879fa94930bd4d33af
@@ -191,15 +194,93 @@ data/inherited_page_attributes.pdf:
data/inherited_trimbox.pdf:
:bytes: 1139
:md5: b3eab8b6fb964b0c8e63d1b75069a6c8
+data/inline_data_followed_by_ei.pdf:
+ :bytes: 1054
+ :md5: 1189782791340a1910d80eae751728bc
data/inline_image.pdf:
:bytes: 30684
:md5: b02bfbb6b0ee7c7d7df1b5f0c1f198c1
data/inline_image_single_line_content_stream.pdf:
:bytes: 130786
:md5: '096fb28baf29a716066768cb31182b73'
+data/invalid/broken_string.pdf:
+ :bytes: 929
+ :md5: f717634f2e419e496e1e93a0cb5b7d18
+data/invalid/content_stream_refers_to_invalid_font.pdf:
+ :bytes: 598
+ :md5: e4a711b9d2fbc3ebe0e16c7498563521
+data/invalid/content_stream_wrong_args.pdf:
+ :bytes: 378345
+ :md5: 8da6f39e6f1c557c8514f1e124ea137d
data/invalid/data.csv:
:bytes: 26
:md5: 7168179491824d651a304cbb83c16964
+data/invalid/gh-217.pdf:
+ :bytes: 108807
+ :md5: 3739eb2731370bd7923c3f418c0bd73e
+data/invalid/gh-222.pdf:
+ :bytes: 108807
+ :md5: dbe939f42fdfc4aeda52fc7c5809052e
+data/invalid/gh-223.pdf:
+ :bytes: 108807
+ :md5: 227b93c7734118d3147e9ec6e4950653
+data/invalid/gh-224.pdf:
+ :bytes: 108807
+ :md5: 3e5a57f61754826fbbbbd653e73167dc
+data/invalid/gh-227.pdf:
+ :bytes: 108807
+ :md5: 73a3be1957f118f36fb92d677f962a2d
+data/invalid/gh-228.pdf:
+ :bytes: 108807
+ :md5: 0a58afacb9d6f43cbf9e1afaac934b87
+data/invalid/gh-229.pdf:
+ :bytes: 89283
+ :md5: e70783e6b59764932e745f55e2647ff9
+data/invalid/gh-230.pdf:
+ :bytes: 89283
+ :md5: ddc6c8bb189c23a24937dcc7a1154bd1
+data/invalid/gh-231.pdf:
+ :bytes: 89283
+ :md5: '024844d3602ad508e57b9ca5602a913c'
+data/invalid/gh-232.pdf:
+ :bytes: 89283
+ :md5: e5c8f6e8e2a98edf78a0a4a2c87aa6b3
+data/invalid/gh-234.pdf:
+ :bytes: 108807
+ :md5: bfa0291807642919d6bf62de68044fef
+data/invalid/gh-235.pdf:
+ :bytes: 108807
+ :md5: e594ba3eb27a8aca07f023cd161faa50
+data/invalid/gh-236.pdf:
+ :bytes: 108807
+ :md5: a300e41135e95dbd4608109ba9703328
+data/invalid/gh-237.pdf:
+ :bytes: 89283
+ :md5: 561700c4ae0936f4822531466762d875
+data/invalid/gh-238.pdf:
+ :bytes: 108807
+ :md5: 5c885f481556eb84f1ee858d105401a1
+data/invalid/gh-239.pdf:
+ :bytes: 89283
+ :md5: 1088d8fbb4adada3ed14fb8bf36434f0
+data/invalid/gh-240.pdf:
+ :bytes: 89283
+ :md5: 2b63985a234cacf82de883c0d0495eef
+data/invalid/gh-241.pdf:
+ :bytes: 6332178
+ :md5: 6286a6ad6ceb676f9a1ae955432e7279
+data/invalid/gh-242.pdf:
+ :bytes: 6332178
+ :md5: f37d3261253f2c3a129baad8407397a8
+data/invalid/gh-243.pdf:
+ :bytes: 1093
+ :md5: b05f1de30a2b356c9fe807cf59452ee8
+data/invalid/gh-244.pdf:
+ :bytes: 1093
+ :md5: dfd286c1cd402c4eb77a869aaf370c62
+data/invalid/gh-245.pdf:
+ :bytes: 19262
+ :md5: de39ddcfe81cedb111304ad6988a2484
data/invalid/invalid_pages.pdf:
:bytes: 108807
:md5: 345670e7d5533a831184603d31dfc2bb
@@ -209,6 +290,9 @@ data/invalid/linearized_bad_xref_offset.pdf:
data/invalid/missing_pages_dict.pdf:
:bytes: 280
:md5: d2153a115692da4fd5937b1eec842379
+data/invalid/negative-xref-offset.pdf:
+ :bytes: 6147
+ :md5: f6be07ae5b4d7e9157914dd9d6b29c7f
data/invalid/no_eof.pdf:
:bytes: 9652
:md5: a641e07a03b3cce7d6f43f5fe7f8695b
@@ -218,12 +302,18 @@ data/invalid/no_trailer.pdf:
data/invalid/page_reference_is_not_a_dict.pdf:
:bytes: 108807
:md5: 7a6da0a240b4c3dea52308502b051cb5
+data/invalid/stream_missing_endobj.pdf:
+ :bytes: 998
+ :md5: 624687838f3445a4bd8a1f8dafe65810
data/invalid/trailer_is_not_a_dict.pdf:
:bytes: 9651
:md5: 2cf861306cb9d19e926a079f54ad4e19
data/invalid/trailer_root_is_not_a_dict.pdf:
:bytes: 108807
:md5: e00b7fc6999ca722aa31d2bb90f1e5d0
+data/invalid/xref_offset_too_low.pdf:
+ :bytes: 1054
+ :md5: d3c06fd6d670b0bed3b6347b5c4561a2
data/invisible.pdf:
:bytes: 14364
:md5: 563f7ec8eb2c4d54f00fd85d807580c0
@@ -248,6 +338,9 @@ data/lzw_compressed.dat:
data/lzw_compressed2.dat:
:bytes: 7279
:md5: 77d850609610846d06dac6b80b10c25a
+data/lzw_compressed_corrupt.dat:
+ :bytes: 238
+ :md5: 254d00a22e904863dee946a4da7eda68
data/lzw_decompressed.dat:
:bytes: 347
:md5: 4abd51aa78c14ed837d834e181216787
@@ -260,6 +353,9 @@ data/mediabox_and_cropbox_are_references.pdf:
data/mediabox_missing.pdf:
:bytes: 14875
:md5: 51560e94565ee1cd9583c388b5aa545a
+data/minimal-xref-1.pdf:
+ :bytes: 739
+ :md5: c9ef70bcf0d39ce90e993b6aec606b42
data/minimal.pdf:
:bytes: 739
:md5: b5808604069f9f61d94e0660409616ba
@@ -272,6 +368,12 @@ data/nested_form_xobject_another.pdf:
data/no_text_spaces.pdf:
:bytes: 2058403
:md5: f1167a44c687e6dc4fcffb451598c502
+data/octal101.pdf:
+ :bytes: 739
+ :md5: eb8d6048feb4512bef783eea6de27244
+data/octal74.pdf:
+ :bytes: 739
+ :md5: d30dfbc3a9d7799e0311cd59dfa2a6a5
data/one-byte-identity.pdf:
:bytes: 13941
:md5: a5e0693ee17aa8e53e9a140e9b9ccf97
@@ -311,6 +413,9 @@ data/pdfwriter-manual.pdf:
data/portrait.pdf:
:bytes: 288466
:md5: dc2413fb949ee78fc1e2319ca4ffcd93
+data/prev0.pdf:
+ :bytes: 753
+ :md5: 5c729e47a5bd097d312df70f913c6349
data/prince1.pdf:
:bytes: 679595
:md5: a6dff45e93532535321b76758676a23f
@@ -320,6 +425,15 @@ data/prince2.pdf:
data/rotate-180.pdf:
:bytes: 17738
:md5: 5ab145b4527aabb75532d9b990f6df0c
+data/rotate-270-then-undo-inside-bt.pdf:
+ :bytes: 1091
+ :md5: 1a27af6fc501499dc89f728db0526240
+data/rotate-90-then-undo-with-br-text.pdf:
+ :bytes: 1202
+ :md5: d86bb1a0cb9b2fdde5bb43d3f7cd1e9a
+data/rotate-90-then-undo.pdf:
+ :bytes: 1253
+ :md5: 198b5e4197643180a6d4e1659e7baf89
data/rotate-then-undo.pdf:
:bytes: 1191
:md5: c14ac0c2669d63988c07c71f75c28b39
@@ -341,12 +455,33 @@ data/standard_font_with_a_difference.pdf:
data/standard_font_with_no_difference.pdf:
:bytes: 856
:md5: 1d59995aefe22d8a8859c1c217dddcc9
+data/stream-with-extra-byte.z:
+ :bytes: 516
+ :md5: cb7b8af4921811eb51d1d22a4194a6fe
+data/stream-with-indirect-filters.pdf:
+ :bytes: 1089
+ :md5: 1c3a3b5454d39a5ee6886ef3e81cc266
data/surrogate_pair_integration_sample.pdf:
:bytes: 1210387
:md5: abc393e941d2aeb7a64f5e2ab1b58a92
data/symbol.pdf:
:bytes: 1055
:md5: 57941286e6442f5c0b295611a99e0f56
+data/text_outside_cropbox_and_mediabox.pdf:
+ :bytes: 1388
+ :md5: 853edffb3c14d2e223e6f895e503097c
+data/textwrapcr.pdf:
+ :bytes: 739
+ :md5: 9700990dd8adb5d2bb83fc5f4af5c2ae
+data/textwrapcrlf.pdf:
+ :bytes: 739
+ :md5: aa1a41bcd5aaaeaa6d247e51dd853093
+data/textwraplf.pdf:
+ :bytes: 739
+ :md5: faefe55f50f9e3d32886da39e4cfdca9
+data/textwraplfcr.pdf:
+ :bytes: 739
+ :md5: a3d37d948a81cf019f757aba808e6aa0
data/times-with-control-character.pdf:
:bytes: 904
:md5: 4bd7309a3f190ede68a88bb2be8bf237
diff --git a/spec/integrity_spec.rb b/spec/integrity_spec.rb
index b93a833..3052494 100644
--- a/spec/integrity_spec.rb
+++ b/spec/integrity_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
require 'yaml'
diff --git a/spec/lzw_spec.rb b/spec/lzw_spec.rb
index 558c3e8..0db2bfb 100644
--- a/spec/lzw_spec.rb
+++ b/spec/lzw_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::LZW do
@@ -15,5 +16,13 @@ describe PDF::Reader::LZW do
expect(PDF::Reader::LZW.decode(content)).to match(/\ABT/)
end
+
+ it "raises PDF::Reader::MalformedPDFError when the stream isn't valid lzw" do
+ content = binread(File.dirname(__FILE__) + "/data/lzw_compressed_corrupt.dat")
+
+ expect {
+ PDF::Reader::LZW.decode(content)
+ }.to raise_error(PDF::Reader::MalformedPDFError)
+ end
end
end
diff --git a/spec/object_hash_spec.rb b/spec/object_hash_spec.rb
index 829f63c..8c073c5 100644
--- a/spec/object_hash_spec.rb
+++ b/spec/object_hash_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::ObjectHash do
@@ -19,8 +20,27 @@ describe PDF::Reader::ObjectHash do
expect(h.map { |ref, obj| obj.class }.size).to eql(57)
end
+ it "correctly loads a PDF from a string containing a file path" do
+ filename = pdf_spec_file("cairo-unicode")
+ h = PDF::Reader::ObjectHash.new(filename)
+
+ expect(h.map { |ref, obj| obj.class }.size).to eql(57)
+ end
+
+ # This means PDF::Reader.open(URI.open("https://example.com/foo.pdf")) will work
+ it "correctly loads a PDF via a Tempfile object" do
+ filename = pdf_spec_file("cairo-unicode")
+
+ Tempfile.open('foo.pdf') do |tempfile|
+ tempfile.write binread(filename)
+ tempfile.rewind
+ h = PDF::Reader::ObjectHash.new(tempfile)
+
+ expect(h.map { |ref, obj| obj.class }.size).to eql(57)
+ end
+ end
+
it "raises an ArgumentError if passed a non filename and non IO" do
- pdf_spec_file("cairo-unicode")
expect {PDF::Reader::ObjectHash.new(10)}.to raise_error(ArgumentError)
end
end
@@ -374,25 +394,12 @@ describe PDF::Reader::ObjectHash do
describe "#page_references" do
- context "with cairo-unicode.pdf" do
- it "returns an ordered array of references to page objects" do
- filename = pdf_spec_file("cairo-unicode")
- h = PDF::Reader::ObjectHash.new(filename)
-
- arr = h.page_references
- expect(arr.size).to eql(4)
- expect(arr.map { |ref| ref.id }).to eql([4, 7, 10, 13])
- end
- end
-
- context "with indirect_kids_array.pdf" do
- it "returns an ordered array of references to page objects" do
- filename = pdf_spec_file("indirect_kids_array")
- h = PDF::Reader::ObjectHash.new(filename)
-
- arr = h.page_references
- expect(arr.size).to eql(1)
- expect(arr.map { |ref| ref.id }).to eql([6])
+ it "returns an Array of PDF::Reader::Reference objs" do
+ filename = pdf_spec_file("cairo-unicode")
+ h = PDF::Reader::ObjectHash.new(filename)
+ expect(h.page_references).to be_a(Array)
+ h.page_references.each do |ref|
+ expect(ref).to be_a(PDF::Reader::Reference)
end
end
diff --git a/spec/object_stream_spec.rb b/spec/object_stream_spec.rb
index 3f99793..72f17a3 100644
--- a/spec/object_stream_spec.rb
+++ b/spec/object_stream_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::ObjectStream do
diff --git a/spec/overlapping_runs_filter_spec.rb b/spec/overlapping_runs_filter_spec.rb
index f84e0f4..e2ea2e3 100644
--- a/spec/overlapping_runs_filter_spec.rb
+++ b/spec/overlapping_runs_filter_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::OverlappingRunsFilter, "#exclude_redundant_runs" do
@@ -44,6 +45,19 @@ describe PDF::Reader::OverlappingRunsFilter, "#exclude_redundant_runs" do
end
end
+ context "when there's two identically positioned runs with different text" do
+ let(:runs) do
+ [
+ PDF::Reader::TextRun.new(30, 700, 50, 12, "Hello"),
+ PDF::Reader::TextRun.new(30, 700, 50, 12, "Bacon"),
+ ]
+ end
+
+ it "returns both of the runs" do
+ expect(result).to match_array(runs)
+ end
+ end
+
context "when the second run overlaps the right edge of the first" do
context "by 50%" do
let(:runs) do
diff --git a/spec/page_layout_spec.rb b/spec/page_layout_spec.rb
index 44e583a..70d5d2c 100644
--- a/spec/page_layout_spec.rb
+++ b/spec/page_layout_spec.rb
@@ -1,9 +1,10 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::PageLayout do
describe "#to_s" do
context "with an A4 page" do
- let(:mediabox) { [0, 0, 595.28, 841.89 ]}
+ let(:mediabox) { PDF::Reader::Rectangle.new(0, 0, 595.28, 841.89)}
context "with no words" do
subject { PDF::Reader::PageLayout.new([], mediabox)}
@@ -200,6 +201,29 @@ describe PDF::Reader::PageLayout do
expect(subject.to_s).to eq("bold")
end
end
+ context "with one word and the mediabox is provided as a 4-element array" do
+ let!(:runs) do
+ [
+ PDF::Reader::TextRun.new(30, 700, 50, 12, "Hello")
+ ]
+ end
+ subject { PDF::Reader::PageLayout.new(runs, mediabox.to_a)}
+
+ it "returns a correct string and prints a deprecation warning" do
+ expect(subject.to_s).to eq("Hello")
+ end
+ end
end
+ context "with a page that's too small to fit any of the text" do
+ let(:mediabox) { PDF::Reader::Rectangle.new(0, 0, 46.560, 32.640)}
+ let(:font_size) { 72 }
+
+ it "returns an empty string" do
+ run = PDF::Reader::TextRun.new(0, 0, 50, font_size, "a")
+ layout = PDF::Reader::PageLayout.new([run], mediabox)
+ expect(layout.to_s).to eq("")
+ end
+ end
+
end
end
diff --git a/spec/page_spec.rb b/spec/page_spec.rb
index 2ed7003..1119ddf 100644
--- a/spec/page_spec.rb
+++ b/spec/page_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::Page do
@@ -70,6 +71,45 @@ describe PDF::Reader::Page do
end
end
+ describe "#rectangles" do
+ let!(:page) { browser.page(1) }
+ let!(:browser) { PDF::Reader.new(pdf_spec_file("all_page_boxes_exist")) }
+
+ it "returns a hash of all the different boxes" do
+ expect(page.attributes[:ArtBox]).to_not be_empty
+ expect(page.attributes[:BleedBox]).to_not be_empty
+ expect(page.attributes[:CropBox]).to_not be_empty
+ expect(page.attributes[:MediaBox]).to_not be_empty
+ expect(page.attributes[:TrimBox]).to_not be_empty
+
+ expect(page.rectangles).to eq(
+ {
+ ArtBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+ BleedBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+ CropBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+ MediaBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+ TrimBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+ }
+ )
+ end
+
+ context "mediabox and cropbox are references" do
+ let!(:browser) { PDF::Reader.new(pdf_spec_file("mediabox_and_cropbox_are_references")) }
+
+ it "returns a non-reference for the dimensions of the boxes" do
+ expect(page.rectangles).to eq(
+ {
+ ArtBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+ BleedBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+ CropBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+ MediaBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+ TrimBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+ }
+ )
+ end
+ end
+ end
+
describe "#walk" do
context "with page 1 of cairo-basic.pdf" do
@@ -111,6 +151,26 @@ describe PDF::Reader::Page do
expect(callbacks.size).to eql(16)
expect(callbacks.first).to eql(:page=)
end
+
+ context "with a receiver that implements a method not type checked by ValidatingReceiver" do
+
+ before do
+ # This test is speecifically for confirming a receiver method is called, even if that
+ # method isn't one that ValidatingReceiver is type checking. If the following assertion
+ # ever fails, then we should update this spec to a different method not mentioned in
+ # ValidatingReceiver
+ expect(PDF::Reader::ValidatingReceiver.methods).to_not include(
+ :set_rgb_color_for_nonstroking
+ )
+ end
+
+ it "calls the receiver method as expected" do
+ receiver = double(set_rgb_color_for_nonstroking: true)
+ page.walk(receiver)
+ expect(receiver).to have_received(:set_rgb_color_for_nonstroking).twice
+ end
+ end
+
end
end
diff --git a/spec/page_state_spec.rb b/spec/page_state_spec.rb
index c3529ba..c344e59 100644
--- a/spec/page_state_spec.rb
+++ b/spec/page_state_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::PageState do
@@ -208,6 +209,16 @@ describe PDF::Reader::PageState do
expect(state.trm_transform(1,1)).to eq([17, 22])
end
end
+
+ context "without begin_text first (out of order)" do
+ let!(:state) {PDF::Reader::PageState.new(page) }
+
+ it "doesn't raise an exception" do
+ expect {
+ state.move_text_position(5, 10)
+ }.to_not raise_error
+ end
+ end
end
describe "#move_text_position_and_set_leading" do
@@ -236,6 +247,15 @@ describe PDF::Reader::PageState do
expect(state.clone_state[:text_leading]).to eq(-10)
end
end
+ context "without begin_text first (out of order)" do
+ let!(:state) {PDF::Reader::PageState.new(page) }
+
+ it "doesn't raise an exception" do
+ expect {
+ state.move_text_position_and_set_leading(5, 10)
+ }.to_not raise_error
+ end
+ end
end
describe "#set_text_matrix_and_text_line_matrix" do
@@ -277,6 +297,15 @@ describe PDF::Reader::PageState do
expect(state.trm_transform(1,1)).to eq([12, -3])
end
end
+ context "without begin_text first (out of order)" do
+ let!(:state) {PDF::Reader::PageState.new(page) }
+
+ it "doesn't raise an exception" do
+ expect {
+ state.move_to_start_of_next_line
+ }.to_not raise_error
+ end
+ end
end
describe "#move_to_next_line_and_show_text" do
@@ -298,6 +327,15 @@ describe PDF::Reader::PageState do
expect(state.trm_transform(1,1)).to eq([12, -3])
end
end
+ context "without begin_text first (out of order)" do
+ let!(:state) {PDF::Reader::PageState.new(page) }
+
+ it "doesn't raise an exception" do
+ expect {
+ state.move_to_next_line_and_show_text("Foo")
+ }.to_not raise_error
+ end
+ end
end
describe "#move_to_next_line_and_show_text" do
@@ -351,6 +389,47 @@ describe PDF::Reader::PageState do
expect(state.trm_transform(1,1)).to eq([12, 12])
end
end
+ context "without begin_text first (out of order)" do
+ let!(:state) {PDF::Reader::PageState.new(page) }
+
+ it "doesn't raise an exception" do
+ expect {
+ state.set_spacing_next_line_show_text(10, 20, "test")
+ }.to_not raise_error
+ end
+ end
+ end
+
+ describe "#ctm_transform" do
+ # ctm_transform is mostly verified as correct via assertions in all the other specs of this
+ # class - it's one of the primary ways we can see the visible state. However we need to check
+ # some error conditions here
+
+ context "with an empty page" do
+ let!(:state) {PDF::Reader::PageState.new(page) }
+
+ it "is a no-op" do
+ expect(state.trm_transform(0,0)).to eq([0, 0])
+ end
+ end
+
+ end
+
+ describe "#trm_transform" do
+ # trm_transform is mostly verified as correct via assertions in all the other specs of this
+ # class - it's one of the primary ways we can see the visible state. However we need to check
+ # some error conditions here
+
+ context "without begin_text first (out of order)" do
+ let!(:state) {PDF::Reader::PageState.new(page) }
+
+ it "doesn't raise an exception" do
+ expect {
+ state.trm_transform(0,0)
+ }.to_not raise_error
+ end
+ end
+
end
describe "#process_glyph_displacement" do
@@ -468,10 +547,10 @@ describe PDF::Reader::PageState do
it "alters the text matrix" do
state.process_glyph_displacement(2, 2, true)
- expect(state.trm_transform(0,0)).to eq([64.976, 700])
- expect(state.trm_transform(0,1)).to eq([64.976, 712])
- expect(state.trm_transform(1,0)).to eq([76.976, 700])
- expect(state.trm_transform(1,1)).to eq([76.976, 712])
+ expect(state.trm_transform(0,0)).to eq([63.976, 700])
+ expect(state.trm_transform(0,1)).to eq([63.976, 712])
+ expect(state.trm_transform(1,0)).to eq([75.976, 700])
+ expect(state.trm_transform(1,1)).to eq([75.976, 712])
end
end
end
@@ -512,10 +591,10 @@ describe PDF::Reader::PageState do
it "alters the text matrix" do
state.process_glyph_displacement(2, 2, false)
- expect(state.trm_transform(0,0)).to eq([64.976, 700])
- expect(state.trm_transform(0,1)).to eq([64.976, 712])
- expect(state.trm_transform(1,0)).to eq([76.976, 700])
- expect(state.trm_transform(1,1)).to eq([76.976, 712])
+ expect(state.trm_transform(0,0)).to eq([63.976, 700])
+ expect(state.trm_transform(0,1)).to eq([63.976, 712])
+ expect(state.trm_transform(1,0)).to eq([75.976, 700])
+ expect(state.trm_transform(1,1)).to eq([75.976, 712])
end
end
context "a word boundary" do
@@ -523,10 +602,10 @@ describe PDF::Reader::PageState do
it "alters the text matrix" do
state.process_glyph_displacement(2, 2, true)
- expect(state.trm_transform(0,0)).to eq([64.976, 700])
- expect(state.trm_transform(0,1)).to eq([64.976, 712])
- expect(state.trm_transform(1,0)).to eq([76.976, 700])
- expect(state.trm_transform(1,1)).to eq([76.976, 712])
+ expect(state.trm_transform(0,0)).to eq([63.976, 700])
+ expect(state.trm_transform(0,1)).to eq([63.976, 712])
+ expect(state.trm_transform(1,0)).to eq([75.976, 700])
+ expect(state.trm_transform(1,1)).to eq([75.976, 712])
end
end
end
@@ -565,10 +644,10 @@ describe PDF::Reader::PageState do
it "alters the text matrix" do
state.process_glyph_displacement(2, 2, false)
- expect(state.trm_transform(0,0)).to eq([64.976, 700])
- expect(state.trm_transform(0,1)).to eq([64.976, 712])
- expect(state.trm_transform(1,0)).to eq([76.976, 700])
- expect(state.trm_transform(1,1)).to eq([76.976, 712])
+ expect(state.trm_transform(0,0)).to eq([63.976, 700])
+ expect(state.trm_transform(0,1)).to eq([63.976, 712])
+ expect(state.trm_transform(1,0)).to eq([75.976, 700])
+ expect(state.trm_transform(1,1)).to eq([75.976, 712])
end
end
context "a word boundary" do
@@ -576,10 +655,10 @@ describe PDF::Reader::PageState do
it "alters the text matrix" do
state.process_glyph_displacement(2, 2, true)
- expect(state.trm_transform(0,0)).to eq([65.976, 700])
- expect(state.trm_transform(0,1)).to eq([65.976, 712])
- expect(state.trm_transform(1,0)).to eq([77.976, 700])
- expect(state.trm_transform(1,1)).to eq([77.976, 712])
+ expect(state.trm_transform(0,0)).to eq([63.976, 700])
+ expect(state.trm_transform(0,1)).to eq([63.976, 712])
+ expect(state.trm_transform(1,0)).to eq([75.976, 700])
+ expect(state.trm_transform(1,1)).to eq([75.976, 712])
end
end
end
diff --git a/spec/page_text_receiver_spec.rb b/spec/page_text_receiver_spec.rb
index f3b29ae..9908bf9 100644
--- a/spec/page_text_receiver_spec.rb
+++ b/spec/page_text_receiver_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::PageTextReceiver do
diff --git a/spec/parser_spec.rb b/spec/parser_spec.rb
index 2e2600c..99c42f9 100644
--- a/spec/parser_spec.rb
+++ b/spec/parser_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::Parser do
@@ -57,14 +58,35 @@ describe PDF::Reader::Parser do
expect(parse_string("(x\rx)").parse_token).to eql("x\nx")
expect(parse_string("(x\r\nx)").parse_token).to eql("x\nx")
expect(parse_string("(x\\rx)").parse_token).to eql("x\rx")
+ expect(parse_string("(x\\r\\nx)").parse_token).to eql("x\r\nx")
expect(parse_string("(\\rx)").parse_token).to eql("\rx")
expect(parse_string("(\\r)").parse_token).to eql("\r")
- expect(parse_string("(x\n\rx)").parse_token).to eql("x\nx")
+ expect(parse_string("(x\n\rx)").parse_token).to eql("x\n\nx")
expect(parse_string("(x \\\nx)").parse_token).to eql("x x")
expect(parse_string("(\\\\f)").parse_token).to eql("\\f")
expect(parse_string("([test])").parse_token).to eql("[test]")
end
+ it "parses invalid octals correctly" do
+ expect(parse_string("(x \\1019 x)").parse_token).to eql("x A9 x")
+ expect(parse_string("(x \\618 x)").parse_token).to eql("x 18 x")
+ expect(parse_string("(x \\18 x)").parse_token).to eql("x \x018 x")
+ expect(parse_string("(x \\5019 x)").parse_token).to eql("x A9 x")
+ end
+
+ it "parses single EOLs (NL, CRNL, CR) correctly" do
+ expect(parse_string("(x\ry)").parse_token).to eql("x\ny")
+ expect(parse_string("(x\ny)").parse_token).to eql("x\ny")
+ expect(parse_string("(x\r\ny)").parse_token).to eql("x\ny")
+ end
+
+ it "parses multiple EOLs (NL, CRNL, CR) correctly" do
+ expect(parse_string("(x\r\r\ny)").parse_token).to eql("x\n\ny")
+ end
+
+ it "parses reverse solidus (backslash) line wrap escapes correctly" do
+ expect(parse_string("(a\\\nb\\\rc\\\r\nd").parse_token).to eql("abcd")
+ end
it "parses a Unicode string correctly" do
seq = {
# key source expected confusing to
@@ -109,6 +131,40 @@ describe PDF::Reader::Parser do
expect(parser.parse_token).to eql(:James)
end
+ # PDF Spec 7.3.4.2 Table 3
+ it "parses reverse solidus (backslash) escapes correctly" do
+ expect(parse_string("(\\n)").parse_token).to eql("\x0A")
+ expect(parse_string("(\\r)").parse_token).to eql("\x0D")
+ expect(parse_string("(\\t)").parse_token).to eql("\x09")
+ expect(parse_string("(\\b)").parse_token).to eql("\x08")
+ expect(parse_string("(\\f)").parse_token).to eql("\x0C")
+ expect(parse_string("(\\())").parse_token).to eql("(")
+ expect(parse_string("(\\))").parse_token).to eql(")")
+ expect(parse_string("(\\\\)").parse_token).to eql("\x5C")
+ end
+
+ it "parses unescaped EOL chars correctly" do
+ expect(parse_string("(A\nB\rC\r\nD").parse_token).to eql("A\x0aB\x0aC\x0aD")
+ end
+
+ it "parses reverse solidus (backslash) invalid escapes correctly" do
+ expect(parse_string("(\\a)").parse_token).to eql("a")
+ expect(parse_string("(\\c)").parse_token).to eql("c")
+ expect(parse_string("(\\d)").parse_token).to eql("d")
+ expect(parse_string("(\\e)").parse_token).to eql("e")
+ expect(parse_string("(\\z)").parse_token).to eql("z")
+ expect(parse_string("(\\])").parse_token).to eql("]")
+ expect(parse_string("(\\[)").parse_token).to eql("[")
+ end
+
+ it "parses reverse solidus (backslash) combination escapes correctly" do
+ expect(parse_string("(\\a)").parse_token).to eql("a")
+ end
+
+ it "parses reverse solidus (backslash) combination escapes correctly" do
+ expect(parse_string("(\\a)").parse_token).to eql("a")
+ end
+
it "parses a hex string correctly" do
expect(parse_string("<48656C6C6F>").parse_token).to eql("Hello")
end
diff --git a/spec/reader/filter/ascii85_spec.rb b/spec/reader/filter/ascii85_spec.rb
index 8d58990..ce40535 100644
--- a/spec/reader/filter/ascii85_spec.rb
+++ b/spec/reader/filter/ascii85_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::Filter::Ascii85 do
diff --git a/spec/reader/filter/ascii_hex_spec.rb b/spec/reader/filter/ascii_hex_spec.rb
index 092a831..ac233d5 100644
--- a/spec/reader/filter/ascii_hex_spec.rb
+++ b/spec/reader/filter/ascii_hex_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::Filter::AsciiHex do
diff --git a/spec/reader/filter/flate_spec.rb b/spec/reader/filter/flate_spec.rb
index 85fee3a..09a7387 100644
--- a/spec/reader/filter/flate_spec.rb
+++ b/spec/reader/filter/flate_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::Filter::Flate do
@@ -13,6 +14,19 @@ describe PDF::Reader::Filter::Flate do
end
end
+ context "an RFC1950 (zlib) deflated stream with an extra byte on the end" do
+ let(:deflated_path) {
+ File.dirname(__FILE__) + "/../../data/stream-with-extra-byte.z"
+ }
+ let(:deflated_data) { binread(deflated_path) }
+ it "inflates correctly" do
+ filter = PDF::Reader::Filter::Flate.new
+ result = filter.filter(deflated_data)
+ expect(result).to start_with("q")
+ expect(result).to end_with("ET\n")
+ end
+ end
+
context "a raw RFC1951 deflated stream" do
let(:deflated_path) {
File.dirname(__FILE__) + "/../../data/hello-world.deflate"
diff --git a/spec/reader/filter/lzw_spec.rb b/spec/reader/filter/lzw_spec.rb
index e223324..845b259 100644
--- a/spec/reader/filter/lzw_spec.rb
+++ b/spec/reader/filter/lzw_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::Filter::Lzw do
diff --git a/spec/reader/filter/null_spec.rb b/spec/reader/filter/null_spec.rb
index 3529b67..34fae73 100644
--- a/spec/reader/filter/null_spec.rb
+++ b/spec/reader/filter/null_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::Filter::Null do
diff --git a/spec/reader/filter/run_length_spec.rb b/spec/reader/filter/run_length_spec.rb
index f5fb890..0c3e126 100644
--- a/spec/reader/filter/run_length_spec.rb
+++ b/spec/reader/filter/run_length_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::Filter::RunLength do
diff --git a/spec/reader/orientation_detector_spec.rb b/spec/reader/orientation_detector_spec.rb
deleted file mode 100644
index 10adb21..0000000
--- a/spec/reader/orientation_detector_spec.rb
+++ /dev/null
@@ -1,69 +0,0 @@
-# coding: utf-8
-
-describe PDF::Reader::OrientationDetector do
- describe "#orientation" do
-
- context "with a portrait page and no rotation" do
- let!(:detector) {
- PDF::Reader::OrientationDetector.new(:MediaBox => [0, 0, 612, 792])
- }
- it "returns portrait" do
- expect(detector.orientation).to eq('portrait')
- end
- end
-
- context "with a portrait page and -90° rotation" do
- let!(:detector) {
- PDF::Reader::OrientationDetector.new(:MediaBox => [0, 0, 612, 792], :Rotate => 270)
- }
- it "returns landscape" do
- expect(detector.orientation).to eq('landscape')
- end
- end
-
- context "with a portrait page and 360° rotation" do
- let!(:detector) {
- PDF::Reader::OrientationDetector.new(:MediaBox => [0, 0, 612, 792], :Rotate => 360)
- }
- it "returns portrait" do
- expect(detector.orientation).to eq('portrait')
- end
- end
-
- context "with a landscape page and no rotation" do
- let!(:detector) {
- PDF::Reader::OrientationDetector.new(:MediaBox => [0, 0, 792, 612])
- }
- it "returns landscape" do
- expect(detector.orientation).to eq('landscape')
- end
- end
-
- context "with a landscape page and 90° rotation" do
- let!(:detector) {
- PDF::Reader::OrientationDetector.new(:MediaBox => [0, 0, 792, 612], :Rotate => 90)
- }
- it "returns portrait" do
- expect(detector.orientation).to eq('portrait')
- end
- end
-
- context "with a landscape page and 360° rotation" do
- let!(:detector) {
- PDF::Reader::OrientationDetector.new(:MediaBox => [0, 0, 792, 612], :Rotate => 360)
- }
- it "returns landscape" do
- expect(detector.orientation).to eq('landscape')
- end
- end
-
- context "with a portrait page that uses negative Y co-ordinates" do
- let!(:detector) {
- PDF::Reader::OrientationDetector.new(:MediaBox => [0,792,612,0])
- }
- it "returns portrait" do
- expect(detector.orientation).to eq('portrait')
- end
- end
- end
-end
diff --git a/spec/reader/register_receiver_spec.rb b/spec/reader/register_receiver_spec.rb
index f3bf19b..ee16608 100644
--- a/spec/reader/register_receiver_spec.rb
+++ b/spec/reader/register_receiver_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# encoding: utf-8
describe PDF::Reader::RegisterReceiver do
diff --git a/spec/reader_spec.rb b/spec/reader_spec.rb
index aa9b78b..0258df8 100644
--- a/spec/reader_spec.rb
+++ b/spec/reader_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader do
diff --git a/spec/reference_spec.rb b/spec/reference_spec.rb
index ad46084..d33f1f1 100644
--- a/spec/reference_spec.rb
+++ b/spec/reference_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::Reference do
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 6311a17..d694e7f 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,3 +1,4 @@
+# typed: strict
# coding: utf-8
require "rubygems"
diff --git a/spec/stream_spec.rb b/spec/stream_spec.rb
index a44a789..9f255f2 100644
--- a/spec/stream_spec.rb
+++ b/spec/stream_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::Stream do
@@ -83,27 +84,16 @@ end
EOF
}
- it "raises a MalformedPDFError" do
- File.open(pdf_spec_file("zlib_stream_issue"), "rb") do |io|
- ohash = PDF::Reader::ObjectHash.new(io)
- ref = PDF::Reader::Reference.new(30,0)
- obj = ohash.object(ref)
- expect { obj.unfiltered_data }.to raise_error(PDF::Reader::MalformedPDFError)
- end
- end
-
- # Acrobat manages to decode this one, so maybe we can too
- it "raises makes an effor to decode the stream anyway" do
- # TODO: if I can find a way to convince the ruby zlib bindings to ignore a checksum failure,
- # delete the previous spec and use this one instead
- pending
- File.open(pdf_spec_file("zlib_stream_issue"), "rb") do |io|
- ohash = PDF::Reader::ObjectHash.new(io)
- ref = PDF::Reader::Reference.new(30,0)
- obj = ohash.object(ref)
+ context "with a zlib stream that has a single trailing garbage byte" do
+ it "makes an effort to decode the stream anyway" do
+ File.open(pdf_spec_file("zlib_stream_issue"), "rb") do |io|
+ ohash = PDF::Reader::ObjectHash.new(io)
+ ref = PDF::Reader::Reference.new(30,0)
+ obj = ohash.object(ref)
- expect(obj).to be_a_kind_of(PDF::Reader::Stream)
- expect(obj.unfiltered_data).to eql(decoded_stream.strip)
+ expect(obj).to be_a_kind_of(PDF::Reader::Stream)
+ expect(obj.unfiltered_data).to eql(decoded_stream.strip)
+ end
end
end
end
diff --git a/spec/support/buffer_helper.rb b/spec/support/buffer_helper.rb
index adc5868..3f685db 100644
--- a/spec/support/buffer_helper.rb
+++ b/spec/support/buffer_helper.rb
@@ -1,3 +1,4 @@
+# typed: true
# coding: utf-8
module BufferHelper
diff --git a/spec/support/callback_helper.rb b/spec/support/callback_helper.rb
index f636e8b..7b7442e 100644
--- a/spec/support/callback_helper.rb
+++ b/spec/support/callback_helper.rb
@@ -1,3 +1,4 @@
+# typed: true
# coding: utf-8
class CallbackHelper
diff --git a/spec/support/duck_types/width_calculator.rb b/spec/support/duck_types/width_calculator.rb
index d9b8ede..7836a74 100644
--- a/spec/support/duck_types/width_calculator.rb
+++ b/spec/support/duck_types/width_calculator.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
# All objects that implement the WidthCalculator duck type must conform to
diff --git a/spec/support/encoding_helper.rb b/spec/support/encoding_helper.rb
index ced98a2..a4a275a 100644
--- a/spec/support/encoding_helper.rb
+++ b/spec/support/encoding_helper.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
module EncodingHelper
diff --git a/spec/support/matchers.rb b/spec/support/matchers.rb
new file mode 100644
index 0000000..cf966c3
--- /dev/null
+++ b/spec/support/matchers.rb
@@ -0,0 +1,17 @@
+# typed: false
+# coding: utf-8
+
+# A custom matcher for confirming a Point is close to another point. This is helpful
+# because the x and y co-ordinates of a point are floats so we can't match on them exactly
+RSpec::Matchers.define :be_close_to do |close_to_point|
+ match do |actual_point|
+ (actual_point.x >= close_to_point.x - 0.01) &&
+ (actual_point.x <= close_to_point.x + 0.01) &&
+ (actual_point.y >= close_to_point.y - 0.01) &&
+ (actual_point.y <= close_to_point.y + 0.01)
+ end
+ failure_message do |actual_point|
+ "expected that (#{actual_point.x},#{actual_point.y}) would be within" +
+ " 0.01 of (#{close_to_point.x},#{close_to_point.y})"
+ end
+end
diff --git a/spec/support/parser_helper.rb b/spec/support/parser_helper.rb
index 79681e1..812708c 100644
--- a/spec/support/parser_helper.rb
+++ b/spec/support/parser_helper.rb
@@ -1,3 +1,4 @@
+# typed: true
# coding: utf-8
module ParserHelper
diff --git a/spec/support/reader_spec_helper.rb b/spec/support/reader_spec_helper.rb
index 8394782..8917126 100644
--- a/spec/support/reader_spec_helper.rb
+++ b/spec/support/reader_spec_helper.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
# some helper methods available to all specs
diff --git a/spec/syncronized_cache_spec.rb b/spec/syncronized_cache_spec.rb
index 1e40e89..09730b4 100644
--- a/spec/syncronized_cache_spec.rb
+++ b/spec/syncronized_cache_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
require 'pdf/reader/synchronized_cache'
diff --git a/spec/text_run_spec.rb b/spec/text_run_spec.rb
index 8814575..8b2102e 100644
--- a/spec/text_run_spec.rb
+++ b/spec/text_run_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::TextRun do
diff --git a/spec/transformation_matrix_spec.rb b/spec/transformation_matrix_spec.rb
index 6436bfa..186a746 100644
--- a/spec/transformation_matrix_spec.rb
+++ b/spec/transformation_matrix_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
# The results in these specs were generated at
@@ -5,14 +6,18 @@
describe PDF::Reader::TransformationMatrix do
describe "#multiply!" do
- class PDF::Reader::TransformationMatrix
- # a helper method for tests
- def multiply_with_an_object!(m2)
- multiply!(
- m2.a, m2.b,
- m2.c, m2.d,
- m2.e, m2.f
- )
+ module PDF
+ class Reader
+ class TransformationMatrix
+ # a helper method for tests
+ def multiply_with_an_object!(m2)
+ multiply!(
+ m2.a, m2.b,
+ m2.c, m2.d,
+ m2.e, m2.f
+ )
+ end
+ end
end
end
context "with [2,3,0 4,5,0 6 7 1]" do
diff --git a/spec/width_calculator/built_in_spec.rb b/spec/width_calculator/built_in_spec.rb
index 7e31d08..9c7ac10 100644
--- a/spec/width_calculator/built_in_spec.rb
+++ b/spec/width_calculator/built_in_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::WidthCalculator::BuiltIn do
@@ -27,6 +28,23 @@ describe PDF::Reader::WidthCalculator::BuiltIn do
end
end
+ context "With Helvetica and a custom encoding that overwrites standard codepoints" do
+ # Codepoint 196 (tilde) is mapped to German umlaut Ä
+ let(:encoding) { PDF::Reader::Encoding.new({:Differences => [196, :Adieresis]}) }
+ let(:font) { double(:basefont => :Helvetica,
+ :subtype => :Type1,
+ :encoding => encoding) }
+
+ let(:width_calculator) {
+ PDF::Reader::WidthCalculator::BuiltIn.new(font)
+ }
+
+ it "returns the correct width for the overwritten codepoint" do
+ # tilde = 333, Ä = 667
+ expect(width_calculator.glyph_width(196)).to eq(667)
+ end
+ end
+
context "With Foo, a font that isn't part of the built-in 14" do
let!(:encoding) { PDF::Reader::Encoding.new(:WinAnsiEncoding) }
let!(:font) { double(:basefont => :Foo,
diff --git a/spec/width_calculator/composite_spec.rb b/spec/width_calculator/composite_spec.rb
index cb4dc38..2f63519 100644
--- a/spec/width_calculator/composite_spec.rb
+++ b/spec/width_calculator/composite_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::WidthCalculator::Composite do
diff --git a/spec/width_calculator/true_type_spec.rb b/spec/width_calculator/true_type_spec.rb
index d68394f..7aef69c 100644
--- a/spec/width_calculator/true_type_spec.rb
+++ b/spec/width_calculator/true_type_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::WidthCalculator::TrueType do
diff --git a/spec/width_calculator/type_one_or_three_spec.rb b/spec/width_calculator/type_one_or_three_spec.rb
index 38f4266..c2d6356 100644
--- a/spec/width_calculator/type_one_or_three_spec.rb
+++ b/spec/width_calculator/type_one_or_three_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::WidthCalculator::TypeOneOrThree do
diff --git a/spec/width_calculator/type_zero_spec.rb b/spec/width_calculator/type_zero_spec.rb
index 33251a7..fc01d63 100644
--- a/spec/width_calculator/type_zero_spec.rb
+++ b/spec/width_calculator/type_zero_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
describe PDF::Reader::WidthCalculator::TypeZero do
diff --git a/spec/xref_spec.rb b/spec/xref_spec.rb
index 16020d6..92f5705 100644
--- a/spec/xref_spec.rb
+++ b/spec/xref_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
# coding: utf-8
# expose the xrefs hash inside the XRef class so we can ensure it's built correctly
diff --git a/tools/fuzz.rb b/tools/fuzz.rb
new file mode 100755
index 0000000..cd28d69
--- /dev/null
+++ b/tools/fuzz.rb
@@ -0,0 +1,300 @@
+#!/usr/bin/env ruby
+###################################################
+# ----------------------------------------------- #
+# Fuzz pdf-reader Ruby gem with mutated PDF files #
+# ----------------------------------------------- #
+# #
+# Each test case is written to 'fuzz.pdf' in the #
+# current working directory. #
+# #
+# Crashes and the associated backtrace are saved #
+# in the 'crashes' directory in the current #
+# working directory. #
+# #
+###################################################
+# ~ bcoles
+
+require 'date'
+require 'pdf-reader'
+require 'colorize'
+require 'fileutils'
+require 'timeout'
+require 'securerandom'
+
+VERBOSE = false
+OUTPUT_DIR = "#{Dir.pwd}/crashes".freeze
+
+#
+# Show usage
+#
+def usage
+ puts 'Usage: ./fuzz.rb <FILE1> [FILE2] [FILE3] [...]'
+ puts 'Example: ./tools/fuzz.rb spec/data/**.pdf'
+ exit 1
+end
+
+#
+# Print status message
+#
+# @param [String] msg message to print
+#
+def print_status(msg = '')
+ puts '[*] '.blue + msg if VERBOSE
+end
+
+#
+# Print progress messages
+#
+# @param [String] msg message to print
+#
+def print_good(msg = '')
+ puts '[+] '.green + msg if VERBOSE
+end
+
+#
+# Print error message
+#
+# @param [String] msg message to print
+#
+def print_error(msg = '')
+ puts '[-] '.red + msg
+end
+
+#
+# Setup environment
+#
+def setup
+ FileUtils.mkdir_p OUTPUT_DIR unless File.directory? OUTPUT_DIR
+rescue => e
+ print_error "Could not create output directory '#{OUTPUT_DIR}': #{e}"
+ exit 1
+end
+
+#
+# Generate a mutated PDF file with a single mitated byte
+#
+# @param [Path] f path to PDF file
+#
+def mutate_byte(f)
+ data = IO.binread f
+ position = SecureRandom.random_number data.size
+ new_byte = SecureRandom.random_number 256
+ new_data = data.dup.tap { |s| s.setbyte(position, new_byte) }
+
+ File.open(@fuzz_outfile, 'w') do |file|
+ file.write new_data
+ end
+end
+
+#
+# Generate a mutated PDF file with multiple mutated bytes
+#
+# @param [Path] f path to PDF file
+#
+def mutate_bytes(f)
+ data = IO.binread f
+ fuzz_factor = 200
+ num_writes = rand((data.size / fuzz_factor.to_f).ceil) + 1
+
+ new_data = data.dup
+ num_writes.times do
+ position = SecureRandom.random_number data.size
+ new_byte = SecureRandom.random_number 256
+ new_data.tap { |stream| stream.setbyte position, new_byte }
+ end
+
+ File.open(@fuzz_outfile, 'w') do |file|
+ file.write new_data
+ end
+end
+
+#
+# Generate a mutated PDF file with all integers replaced by '-1'
+#
+# @param [Path] f path to PDF file
+#
+def clobber_integers(f)
+ data = IO.binread f
+ new_data = data.dup.gsub(/\d/, '-1')
+
+ File.open(@fuzz_outfile, 'w') do |file|
+ file.write new_data
+ end
+end
+
+#
+# Generate a mutated PDF file with all strings 3 characters or longer
+# replaced with 2000 'A' characters
+#
+# @param [Path] f path to PDF file
+#
+def clobber_strings(f)
+ data = IO.binread f
+ new_data = data.dup.gsub(/[a-zA-Z]{3,}/, 'A' * 2000)
+
+ File.open(@fuzz_outfile, 'w') do |file|
+ file.write new_data
+ end
+end
+
+#
+# Read a PDF file
+#
+# @param [String] f path to PDF file
+#
+def read(f)
+ print_status "Processing '#{f}'"
+ begin
+ reader = PDF::Reader.new f
+ rescue PDF::Reader::MalformedPDFError
+ print_status "Could not parse PDF '#{f}': PDF is malformed"
+ return
+ rescue PDF::Reader::UnsupportedFeatureError
+ print_status "Could not parse PDF '#{f}': PDF::Reader::UnsupportedFeatureError"
+ return
+ end
+ print_good 'Processing complete'
+
+ print_status "Parsing '#{f}'"
+ begin
+ parse reader
+ rescue PDF::Reader::UnsupportedFeatureError
+ print_status "Could not parse PDF '#{f}': PDF::Reader::UnsupportedFeatureError"
+ return
+ rescue PDF::Reader::MalformedPDFError
+ print_status "Could not parse PDF '#{f}': PDF is malformed"
+ return
+ end
+ print_good 'Parsing complete'
+end
+
+#
+# Parse PDF
+#
+def parse(reader)
+ print_status "Version: #{reader.pdf_version}"
+ print_status "Info: #{reader.info}"
+ print_status "Metadata: #{reader.metadata}"
+ print_status "Objects: #{reader.objects}"
+ print_status "Pages: #{reader.page_count}"
+
+ print_status 'Parsing PDF contents...'
+ contents = ''
+ reader.pages.each do |page|
+ contents << page.fonts.to_s
+ contents << page.text #.force_encoding('utf-8')
+ contents << page.raw_content.force_encoding('utf-8')
+ end
+ # puts contents if VERBOSE
+end
+
+#
+# Show summary of crashes
+#
+def summary
+ puts
+ puts "Complete! Crashes saved to '#{OUTPUT_DIR}'"
+ puts
+ puts `/usr/bin/head -n1 #{OUTPUT_DIR}/*.trace` if File.exist? '/usr/bin/head'
+end
+
+#
+# Report error message to STDOUT
+# and save fuzz test case and backtrace to OUTPUT_DIR
+#
+def report_crash(e)
+ puts " - #{e.message}"
+ puts e.backtrace.first
+ fname = "#{DateTime.now.strftime('%Y%m%d%H%M%S%N')}_crash_#{rand(1000)}"
+ FileUtils.mv @fuzz_outfile, "#{OUTPUT_DIR}/#{fname}.pdf"
+ File.open("#{OUTPUT_DIR}/#{fname}.pdf.trace", 'w') do |file|
+ file.write "#{e.message}\n#{e.backtrace.join "\n"}"
+ end
+end
+
+#
+# Test pdf-reader with the mutated file
+#
+def test
+ Timeout.timeout(@timeout) do
+ read @fuzz_outfile
+ end
+rescue SystemStackError => e
+ report_crash e
+rescue Timeout::Error => e
+ report_crash e
+rescue SyntaxError => e
+ report_crash e
+rescue => e
+ raise e unless e.backtrace.join("\n") =~ %r{pdf-reader}
+ report_crash e
+end
+
+#
+# Generate random byte mutations and run test
+#
+# @param [String] f path to PDF file
+#
+def fuzz_bytes(f)
+ iterations = 1000
+ 1.upto(iterations) do |i|
+ print "\r#{(i * 100) / iterations} % (#{i} / #{iterations})"
+ mutate_bytes f
+ test
+ end
+end
+
+#
+# Generate integer mutations and run tests
+#
+# @param [String] f path to PDF file
+#
+def fuzz_integers(f)
+ clobber_integers f
+ test
+end
+
+#
+# Generate string mutations and run tests
+#
+# @param [String] f path to PDF file
+#
+def fuzz_strings(f)
+ clobber_strings f
+ test
+end
+
+puts '-' * 60
+puts '% Fuzzer for pdf-reader Ruby gem'
+puts '-' * 60
+puts
+
+usage if ARGV[0].nil?
+
+setup
+
+@timeout = 15
+@fuzz_outfile = 'fuzz.pdf'
+
+trap 'SIGINT' do
+ puts
+ puts 'Caught interrupt. Exiting...'
+ summary
+ exit 130
+end
+
+ARGV.each do |f|
+ unless File.exist? f
+ print_error "Could not find file '#{f}'"
+ next
+ end
+
+ fuzz_integers f
+ fuzz_strings f
+ fuzz_bytes f
+
+ puts '-' * 60
+end
+
+summary
+
diff --git a/tools/read-pdf.rb b/tools/read-pdf.rb
index 3566221..ecd6d86 100644
--- a/tools/read-pdf.rb
+++ b/tools/read-pdf.rb
@@ -6,7 +6,7 @@
require 'pdf-reader'
require 'colorize'
-$QUIET = false
+$QUIET = ARGV.delete('--quiet')
#
# Print status message
@@ -40,7 +40,7 @@ end
#
# @param [File] file PDF file
#
-def read doc
+def read(doc)
print_status "Processing '#{doc}'"
begin
@fname = doc
@@ -60,7 +60,7 @@ def read doc
rescue PDF::Reader::UnsupportedFeatureError
print_error "Could not parse PDF '#{doc}': PDF::Reader::UnsupportedFeatureError"
exit 1
- rescue PDF::Reader::MalformedPDFError => e
+ rescue PDF::Reader::MalformedPDFError
print_error "Could not parse PDF '#{doc}': PDF is malformed"
exit 1
end
@@ -78,18 +78,27 @@ def parse(reader)
print_status "Pages: #{reader.page_count}"
print_status 'Parsing PDF contents...'
- contents = ''
reader.pages.each do |page|
- contents << page.text.to_s
- contents << page.fonts.to_s
- contents << page.text.to_s
- contents << page.raw_content.to_s
+ text = page.text.to_s
+ unless $QUIET
+ print_status 'Page text'
+ puts text
+ end
+ text = page.fonts.to_s
+ unless $QUIET
+ print_status 'Page fonts'
+ puts text
+ end
+ text = page.raw_content.to_s
+ unless $QUIET
+ print_status 'Page raw_content'
+ puts text
+ end
end
- #puts contents unless $QUIET
end
def usage
- print_status "./read-pdf.rb <FILE>"
+ print_status "./read-pdf.rb <FILE> [--quiet]"
exit 1
end
@@ -103,4 +112,3 @@ else
print_error "Could not find #{doc}"
exit 1
end
-
Debdiff
[The following lists of changes regard files as different if they have different names, permissions or owners.]
Files in second set of .debs but not in first
-rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf-reader.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/aes_v2_security_handler.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/aes_v3_security_handler.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/afm/Courier-Bold.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/afm/Courier-BoldOblique.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/afm/Courier-Oblique.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/afm/Courier.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/afm/Helvetica-Bold.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/afm/Helvetica-BoldOblique.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/afm/Helvetica-Oblique.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/afm/Helvetica.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/afm/MustRead.html -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/afm/Symbol.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/afm/Times-Bold.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/afm/Times-BoldItalic.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/afm/Times-Italic.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/afm/Times-Roman.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/afm/ZapfDingbats.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/bounding_rectangle_runs_filter.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/buffer.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/cid_widths.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/cmap.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/encoding.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/encodings/mac_expert.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/encodings/mac_roman.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/encodings/pdf_doc.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/encodings/standard.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/encodings/symbol.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/encodings/win_ansi.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/encodings/zapf_dingbats.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/error.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/filter.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/filter/ascii85.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/filter/ascii_hex.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/filter/depredict.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/filter/flate.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/filter/lzw.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/filter/null.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/filter/run_length.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/font.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/font_descriptor.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/form_xobject.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/glyph_hash.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/glyphlist-zapfdingbats.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/glyphlist.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/key_builder_v5.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/lzw.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/no_text_filter.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/null_security_handler.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/object_cache.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/object_hash.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/object_stream.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/overlapping_runs_filter.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/page.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/page_layout.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/page_state.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/page_text_receiver.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/pages_strategy.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/parser.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/point.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/print_receiver.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/rc4_security_handler.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/rectangle.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/reference.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/register_receiver.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/resources.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/security_handler_factory.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/standard_key_builder.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/stream.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/synchronized_cache.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/text_run.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/token.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/transformation_matrix.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/type_check.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/unimplemented_security_handler.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/validating_receiver.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/width_calculator.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/width_calculator/built_in.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/width_calculator/composite.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/width_calculator/true_type.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/width_calculator/type_one_or_three.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/width_calculator/type_zero.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/xref.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/lib/pdf/reader/zero_width_runs_filter.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/rbi/pdf-reader.rbi -rw-r--r-- root/root /usr/share/rubygems-integration/all/specifications/pdf-reader-2.11.0.gemspec -rwxr-xr-x root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/bin/pdf_callbacks -rwxr-xr-x root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/bin/pdf_object -rwxr-xr-x root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.11.0/bin/pdf_text
Files in first set of .debs but not in second
-rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf-reader.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/afm/Courier-Bold.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/afm/Courier-BoldOblique.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/afm/Courier-Oblique.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/afm/Courier.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/afm/Helvetica-Bold.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/afm/Helvetica-BoldOblique.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/afm/Helvetica-Oblique.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/afm/Helvetica.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/afm/MustRead.html -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/afm/Symbol.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/afm/Times-Bold.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/afm/Times-BoldItalic.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/afm/Times-Italic.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/afm/Times-Roman.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/afm/ZapfDingbats.afm -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/buffer.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/cid_widths.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/cmap.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/encoding.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/encodings/mac_expert.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/encodings/mac_roman.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/encodings/pdf_doc.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/encodings/standard.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/encodings/symbol.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/encodings/win_ansi.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/encodings/zapf_dingbats.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/error.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/filter.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/filter/ascii85.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/filter/ascii_hex.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/filter/depredict.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/filter/flate.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/filter/lzw.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/filter/null.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/filter/run_length.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/font.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/font_descriptor.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/form_xobject.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/glyph_hash.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/glyphlist.txt -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/lzw.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/null_security_handler.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/object_cache.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/object_hash.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/object_stream.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/orientation_detector.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/overlapping_runs_filter.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/page.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/page_layout.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/page_state.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/page_text_receiver.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/pages_strategy.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/parser.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/print_receiver.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/reference.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/register_receiver.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/resource_methods.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/standard_security_handler.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/standard_security_handler_v5.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/stream.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/synchronized_cache.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/text_run.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/token.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/transformation_matrix.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/unimplemented_security_handler.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/width_calculator.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/width_calculator/built_in.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/width_calculator/composite.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/width_calculator/true_type.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/width_calculator/type_one_or_three.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/width_calculator/type_zero.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/lib/pdf/reader/xref.rb -rw-r--r-- root/root /usr/share/rubygems-integration/all/specifications/pdf-reader-2.4.1.gemspec -rwxr-xr-x root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/bin/pdf_callbacks -rwxr-xr-x root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/bin/pdf_object -rwxr-xr-x root/root /usr/share/rubygems-integration/all/gems/pdf-reader-2.4.1/bin/pdf_text
Control files: lines which differ (wdiff format)
Depends: ruby, ruby-ascii85 (>= 1.0.0), 1.0), ruby-rc4, ruby-hashery (>= 2.0), ruby-ttfunk, ruby-afm (>= 0.2.1)