• Stars
    star
    1,872
  • Rank 23,749 (Top 0.5 %)
  • Language
    Ruby
  • License
    Other
  • Created about 5 years ago
  • Updated 7 days ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Type Signature for Ruby

RBS

RBS is a language to describe the structure of Ruby programs. You can write down the definition of a class or module: methods defined in the class, instance variables and their types, and inheritance/mix-in relations. It also allows declaring constants and global variables.

The following is a small example of RBS for a chat app.

module ChatApp
  VERSION: String

  class User
    attr_reader login: String
    attr_reader email: String

    def initialize: (login: String, email: String) -> void
  end

  class Bot
    attr_reader name: String
    attr_reader email: String
    attr_reader owner: User

    def initialize: (name: String, owner: User) -> void
  end

  class Message
    attr_reader id: String
    attr_reader string: String
    attr_reader from: User | Bot                     # `|` means union types: `#from` can be `User` or `Bot`
    attr_reader reply_to: Message?                   # `?` means optional type: `#reply_to` can be `nil`

    def initialize: (from: User | Bot, string: String) -> void

    def reply: (from: User | Bot, string: String) -> Message
  end

  class Channel
    attr_reader name: String
    attr_reader messages: Array[Message]
    attr_reader users: Array[User]
    attr_reader bots: Array[Bot]

    def initialize: (name: String) -> void

    def each_member: () { (User | Bot) -> void } -> void  # `{` and `}` means block.
                   | () -> Enumerator[User | Bot, void]   # Method can be overloaded.
  end
end

The Target Version

  • The standard library signatures targets the latest release of Ruby. (3.2 as of 2023.)
  • The library code targets non-EOL versions of Ruby. (>= 3.0 as of 2023.)

Installation

Install the rbs gem. $ gem install rbs from the command line, or add a line in your Gemfile.

gem "rbs"

CLI

The gem ships with the rbs command line tool to demonstrate what it can do and help develop RBS.

$ rbs version
$ rbs list
$ rbs ancestors ::Object
$ rbs methods ::Object
$ rbs method Object then

An end user of rbs will probably find rbs prototype the most useful. This command generates boilerplate signature declarations for ruby files. For example, say you have written the below ruby script.

# person.rb
class Person
  attr_reader :name
  attr_reader :contacts

  def initialize(name:)
    @name = name
    @contacts = []
  end

  def speak
    "I'm #{@name} and I love Ruby!"
  end
end

Running prototype on the above will automatically generate

$ rbs prototype rb person.rb
class Person
  @name: untyped

  @contacts: untyped

  attr_reader name: untyped

  attr_reader contacts: untyped

  def initialize: (name: untyped) -> void

  def speak: () -> ::String
end

It prints signatures for all methods, classes, instance variables, and constants. This is only a starting point, and you should edit the output to match your signature more accurately.

rbs prototype offers three options.

  • rb generates from just the available Ruby code
  • rbi generates from Sorbet RBI
  • runtime generates from runtime API

Library

There are two important concepts, environment and definition.

An environment is a dictionary that keeps track of all declarations. What is the declaration associated with String class? An environment will give you the answer.

A definition gives you the detail of the class. What is the type of the return value of gsub method of the String class? The definition for String class knows the list of methods it provides and their types.

The following is a small code to retrieve the definition of the String#gsub method.

require "rbs"

loader = RBS::EnvironmentLoader.new()

# loader.add(path: Pathname("sig"))   # Load .rbs files from `sig` directory
# loader.add(library: "pathname")     # Load pathname library

environment = RBS::Environment.from_loader(loader).resolve_type_names

# ::String
string = RBS::TypeName.new(name: :String, namespace: RBS::Namespace.root)

# Class declaration for ::String
decl = environment.class_decls[string]

# Builder provides the translation from `declaration` to `definition`
builder = RBS::DefinitionBuilder.new(env: environment)

# Definition of instance of String
instance = builder.build_instance(string)

# Print the types of `gsub` method:
puts instance.methods[:gsub].method_types.join("\n")
# Outputs =>
#  (::Regexp | ::string pattern, ::string replacement) -> ::String
#  (::Regexp | ::string pattern, ::Hash[::String, ::String] hash) -> ::String
#  (::Regexp | ::string pattern) { (::String match) -> ::_ToS } -> ::String
#  (::Regexp | ::string pattern) -> ::Enumerator[::String, self]

# Definition of singleton of String
singleton = builder.build_singleton(string)
# No `gsub` method for String singleton
puts singleton.methods[:gsub]

Guides

Community

Here is a list of some places you can talk with active maintainers.

Development

After checking out the repo, run bin/setup to install dependencies. Then, run bundle exec rake test to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/rbs.

More Repositories

1

ruby

The Ruby Programming Language
Ruby
20,732
star
2

rake

A make-like build utility for Ruby.
Ruby
2,293
star
3

did_you_mean

The gem that has been saving people from typos since 2014
Ruby
1,870
star
4

debug

Debugging functionality for Ruby
Ruby
1,058
star
5

www.ruby-lang.org

Source of the https://www.ruby-lang.org website.
Ruby
856
star
6

rdoc

RDoc produces HTML and online documentation for Ruby projects.
Ruby
798
star
7

prism

Prism Ruby parser
C
755
star
8

setup-ruby

An action to download a prebuilt Ruby and add it to the PATH in 5 seconds
JavaScript
727
star
9

typeprof

An experimental type-level Ruby interpreter for testing and understanding Ruby code
Ruby
706
star
10

ruby.wasm

ruby.wasm is a collection of WebAssembly ports of the CRuby.
Ruby
603
star
11

spec

The Ruby Spec Suite aka ruby/spec
Ruby
556
star
12

psych

A libyaml wrapper for Ruby
Ruby
543
star
13

racc

Racc is an LALR(1) parser generator. It is written in Ruby itself, and generates ruby programs.
Yacc
530
star
14

irb

interactive Ruby
Ruby
351
star
15

syntax_suggest

Searching for unexpected `end` syntax errors takes a lot of time. Let this gem do it for you!
Ruby
344
star
16

curses

Ruby binding for curses, ncurses, and PDCurses. Formerly part of the ruby standard library.
C
285
star
17

webrick

HTTP server toolkit
Ruby
246
star
18

gem_rbs_collection

A collection of RBS for gems.
Ruby
235
star
19

reline

The compatible library with the API of Ruby's stdlib 'readline'
Ruby
234
star
20

openssl

Provides SSL, TLS and general purpose cryptography.
C
233
star
21

TryRuby

This 4th iteration of TryRuby is a website where you can learn the Ruby language.
Ruby
219
star
22

power_assert

Power Assert for Ruby
Ruby
186
star
23

vscode-rdbg

VSCode Ruby rdbg Debugger
TypeScript
165
star
24

rss

RSS reading and writing
Ruby
163
star
25

csv

CSV Reading and Writing
Ruby
159
star
26

lrama

Pure Ruby LALR parser generator
Ruby
158
star
27

drb

Distributed object system for Ruby
Ruby
154
star
28

fiddle

A libffi wrapper for Ruby.
Ruby
147
star
29

error_highlight

The gem enhances Exception#message by adding a short explanation where the exception is raised
Ruby
145
star
30

benchmark

The Benchmark module provides methods for benchmarking Ruby code, giving detailed reports on the time taken for each task.
Ruby
136
star
31

timeout

Timeout provides a way to auto-terminate a potentially long-running operation if it hasn't finished in a fixed amount of time.
Ruby
128
star
32

tk

Tk interface module using tcltklib
Ruby
115
star
33

rexml

REXML is an XML toolkit for Ruby
Ruby
110
star
34

bigdecimal

Arbitrary-precision decimal floating-point number library for Ruby
C
108
star
35

ostruct

OpenStruct implementation
Ruby
106
star
36

erb

An easy to use but powerful templating system for Ruby
Ruby
103
star
37

logger

simple logging utility
Ruby
97
star
38

net-http

Net::HTTP provides a rich library which can be used to build HTTP user-agents.
Ruby
84
star
39

open3

Open3 gives you access to stdin, stdout, and stderr when running other programs.
Ruby
79
star
40

dev-meeting-log

78
star
41

uri

URI is a module providing classes to handle Uniform Resource Identifiers
Ruby
69
star
42

ruby-docker-images

Ruby Docker Images
Ruby
69
star
43

pstore

PStore implements a file based persistence mechanism based on a Hash.
Ruby
67
star
44

date

A subclass of Object includes Comparable module for handling dates.
C
66
star
45

strscan

Provides lexical scanning operations on a String.
C
66
star
46

ipaddr

A class to manipulate an IP address
Ruby
62
star
47

ruby2_keywords

Shim library for Module#ruby2_keywords
Ruby
61
star
48

fileutils

Several file utility methods for copying, moving, removing, etc.
Ruby
60
star
49

mspec

RSpec-like test runner for the Ruby Spec Suite
Ruby
57
star
50

shell

Shell implements an idiomatic Ruby interface for common UNIX shell commands
Ruby
57
star
51

matrix

An implementation of Matrix and Vector classes
Ruby
56
star
52

net-telnet

Provides telnet client functionality.
Ruby
56
star
53

iconv

iconv wrapper
C
54
star
54

tracer

Outputs a source level execution trace of a Ruby program.
Ruby
52
star
55

io-console

add console capabilities to IO instance
Ruby
51
star
56

docs.ruby-lang.org

Source of the docs.ruby-lang.org site
Ruby
48
star
57

digest

Provides a framework for message digest libraries.
C
48
star
58

optparse

OptionParser is a class for command-line option analysis.
Ruby
47
star
59

zlib

Ruby interface for the zlib compression/decompression library
C
43
star
60

securerandom

Interface for secure random number generator
Ruby
42
star
61

open-uri

OpenURI is an easy-to-use wrapper for Net::HTTP, Net::HTTPS and Net::FTP.
Ruby
41
star
62

net-imap

Ruby client api for Internet Message Access Protocol
Ruby
41
star
63

forwardable

Provides delegation of specified methods to a designated object
Ruby
40
star
64

chkbuild

Continuous Integration tool, mainly for Ruby
Ruby
40
star
65

net-smtp

This library provides functionality to send internet mail via SMTP, the Simple Mail Transfer Protocol.
Ruby
36
star
66

xmlrpc

The Ruby standard library package 'xmlrpc'
Ruby
35
star
67

resolv

A thread-aware DNS resolver library written in Ruby
Ruby
32
star
68

prime

Prime numbers and factorization library.
Ruby
32
star
69

cgi

CGI is a large class, providing several categories of methods, many of which are mixed in from other modules.
Ruby
32
star
70

stringio

Pseudo `IO` class from/to `String`.
Java
31
star
71

rubyci

The Ruby CI for chkbuild
Ruby
31
star
72

gserver

GServer implements a generic server
Ruby
31
star
73

observer

The Observer pattern provides a simple mechanism for one object to inform a set of interested third-party objects when its state changes.
Ruby
29
star
74

snap.ruby

Ruby snap
HTML
29
star
75

ruby-builder

A repository building Ruby/JRuby/TruffleRuby releases to be used in GitHub Actions
Ruby
28
star
76

tempfile

A utility class for managing temporary files.
Ruby
26
star
77

etc

Provides access to information typically stored in UNIX /etc directory.
C
26
star
78

profile

Ruby
26
star
79

net-ftp

This class implements the File Transfer Protocol.
Ruby
24
star
80

singleton

The Singleton module implements the Singleton pattern.
Ruby
24
star
81

yaml

This module provides a Ruby interface for data serialization in YAML format.
Ruby
24
star
82

net-protocol

The abstruct interface for net-* client.
Ruby
24
star
83

actions

Ruby
22
star
84

pathname

Pathname represents the name of a file or directory on the filesystem, but not the file itself.
Ruby
22
star
85

sdbm

Provides a simple file-based key-value store with String keys and values.
C
22
star
86

un

Utilities to replace common UNIX commands
Ruby
21
star
87

set

This library provides the Set class, which deals with a collection of unordered values with no duplicates.
Ruby
21
star
88

syck

Syck from stdlib turned in to a gem
C
20
star
89

pp

Provides a PrettyPrinter for Ruby objects
Ruby
19
star
90

English

Ruby
19
star
91

play-ruby

Ruby Playground Website
TypeScript
19
star
92

base64

Support for encoding and decoding binary data using a Base64 representation
Ruby
18
star
93

git.ruby-lang.org

Manifest for the Ruby git server
Ruby
17
star
94

net-pop

This library provides functionality for retrieving email via POP3, the Post Office Protocol version 3. For details of POP3
Ruby
17
star
95

repl_type_completor

Ruby
17
star
96

delegate

This library provides three different ways to delegate method calls to an object.
Ruby
17
star
97

ruby-dev-builder

CRuby Dev Builds for GitHub Actions
Ruby
16
star
98

rbs_json_schema

Generate RBS files from JSON Schema
Ruby
16
star
99

redmine_rd_formatter

A redmine plugin for supporting RD as a wiki format
Ruby
15
star
100

b.r-l.o

[Fork] Redmine for b.r-l.o
Ruby
14
star