123456789_123456789_123456789_123456789_123456789_

Releasing a gem with RBS

You can release the RBS type definition of your gem included in the gem package. Just add your RBS files inside /sig directory, put them in your rubygem package, and release a new version. RBS gem will load the RBS files from your gem package automatically.

/sig directory

RBS gem tries to load a type definition of a gem from gem package first. It checks if there is /sig directory in the gem package and loads *.rbs files from the directory. So, everything you have to do to make your type definition available are:

  1. Add /sig directory in your gem package
  2. Put your RBS files inside the directory
  3. Make sure the RBS files are included in the gem package

Hidden RBS files

If you have RBS files you don't want to export to the gem users, you can put the files under a directory that starts with _`.

Assume you have three RBS files in your gem package:

foo.rbs and baz.rbs will be loaded from the gem package, but the internal.rbs will be skipped. This is only when you load RBS files of a library, for example through -r option given to rbs command. If you load RBS files as source code, for example through -I option given to rbs command, the hidden RBS files will be loaded too.

Adding manifest.yaml

manifest.yaml lets you declare dependencies to standard libraries. Here is an example, from RBS gem.

dependencies:
  - name: json
  - name: logger
  - name: optparse
  - name: pathname
  - name: rdoc
  - name: tsort

Note that you don't have to write the dependencies that are included in your .gemspec. RBS will detect the dependencies between gems, declared in .gemspec. manifest.yaml is a material for undeclared dependencies, which usually is for standard libraries.

Testing your type definition

If you develop your gem using a static type checker, like Steep, your type definition will be (mostly) correct and reliable. If not, we strongly recommend adding extra tests focusing on the RBS type definitions.

::RBS::UnitTest is a library to do that. assert_send_type is the most important assertion.

assert_send_type '(Regexp) { (String) -> String } -> String',
                 'hello', :gsub, /hello/, &proc { "foo" }

It calls String#gsub method and confirms if given arguments and the return value has correct types.

You can find examples under test/stdlib directory of RBS repository.