Masataka Kuwabara

Let's write RBS!

RubyKaigi 2023

00:00:01.500 foreign
00:00:25.880 Hello everyone. I am an application engineer, and I also work on robust maintenance. I am not a threat...
00:00:33.300 Before this talk, I would like to introduce the RBS project contributors. This is a tribute to all the project contributors.
00:00:40.620 Thank you to these contributors.
00:00:54.860 So, today's agenda consists of two parts. First, I will introduce a new feature that has been added in RBS 3.1.
00:01:02.520 I originally planned to include Q&A, but I have limited time. In the second part, I will demonstrate how to write RBS.
00:01:11.340 I apologize, but I will not cover the basics of RBS, such as syntax and usage, because they are already documented. While I was writing this talk, I visited Ruby projects and wrote an article...
00:01:27.659 This article is available in Japanese, but it might be helpful for you.
00:01:40.500 Now, let’s talk about the new features introduced in RBS. First, I present the RBS Subtract feature. The RBS Subtract removes duplicate method definitions.
00:02:00.659 For instance, if you have two files, one is ARBS and the other is BRBS, the command removes duplicates in ARBS.
00:02:14.700 The result of the operation is effectively ARBS minus BRBS. This feature also supports overwrite options.
00:02:27.560 This feature was originally developed by Cytosan, and I took over from there. Thank you, Cytosan.
00:02:36.840 Let’s dive into the subtract behavior. Here is an example.
00:02:45.180 Consider a case where ARBS has the full method, and BRBS has just the method alone. If we run ARBS subtract BRBS, the output will contain only ARBS.
00:03:05.480 This command is necessary because it modifies or changes files in a meaningful way. Let’s consider a scenario where you are developing an existing Ruby application and introducing RBS. In this case, you might want to use an RBS generator.
00:03:40.980 You will need to write all of the RBS for your large application, which can be quite challenging. For instance, using an RBS generator will help facilitate the process.
00:04:07.620 The generated code may appear untyped.
00:04:12.299 You might think about editing the auto-generated code, but this is not a good idea as changes may be lost later.
00:04:34.440 We need to manage RBS files and generated database files separately, but this can lead to problems.
00:04:55.220 At least, you should avoid downloading duplicates. This can lead to inconsistent method definitions.
00:05:10.440 The solution to this issues is the RBS subtract command. It effectively removes duplication.
00:05:23.000 After executing RBS subtract, you will find that the resultant RBS and RBS Input files will have the same method definitions.
00:05:31.860 Here’s an example workflow demonstrating how to use this command.
00:05:45.220 First, we generate the application’s RBS, which saves prototype files in a common directory. The generated source should be from the app directory...
00:06:01.200 You may want to edit the generated file. It's possible to add a new file to handle it.
00:06:11.220 After this step, you have to remove duplicates from the other RBS files using the subtract command.
00:06:22.360 In such cases, you can use the subtract command to maintain consistency.
00:06:32.840 And once done, the RBS will be available for type checking with the generated library for your application.
00:06:45.240 For more information, this feature was implemented in a display case, and I've documented the design in detail.
00:06:58.000 I also shared a URL to Twitter along with a Wiki hashtag for further exploration.
00:07:10.980 The next feature is RBS pass. This command parses RBS files and checks for syntax errors.
00:07:30.000 For instance, an RBS file with no errors will be processed without issue, but if an error exists, it will be reported.
00:07:50.880 This feature has been available in RBS for a while, but I would like to introduce a new option to this command.
00:08:01.740 The new option is a high query, allowing for an even more precise type check.
00:08:19.500 With RBS 3.1, you no longer need to write to a file for type checks.
00:08:28.660 You only need to specify a string as an option from the command line.
00:08:37.819 The command will dynamically specify the context for passing syntax.
00:08:49.420 Although I won’t go into detail today due to time constraints, other tools added to the RBS collection can also assist.
00:09:01.620 Several tool features are also described in previous presentations or documentation.
00:09:12.440 Next, I will demonstrate writing RBS using VS Code with certain extensions.
00:09:26.500 However, you can also use other editors that support the LSP format to write RBS.
00:09:38.000 This link contains more tools and how to elevate RBS while providing several examples.
00:09:50.100 Today, I will showcase how I introduce RBS to an existing application called 'CI'. You may not be familiar with this repository, but it is a small implementation...
00:10:06.120 Here are the steps I took to demonstrate the service correction and how to write the ARBS files.
00:10:18.200 Let’s kick off this demonstration with the CI repository.
00:10:34.160 First, you need to set up some gems for type checking. The gems should be included in the development group.
00:10:43.200 RBS must also be listed under the dependencies.
00:10:52.080 After this, we accurately require the necessary features.
00:11:02.920 Once we’ve done that, you should install the gems with Bundler.
00:11:17.379 Now we have an RBS setting file. Let’s take a look at this file...
00:11:27.540 While editing today’s file is not required, configuration of where to download RBS and which gems to ignore is.
00:11:41.540 This serves as an initialization step after which we can install and run the RBS command.
00:11:55.180 Once we execute the commands, the RBS files are created.
00:12:06.060 The resulting structure will depend on the gem name and version.
00:12:18.300 The generated directory will be ignored and managed, so there is no need to version control it.
00:12:29.300 Our next step is to configure the Steep settings, which helps in checking the RBS.
00:12:41.560 We typically utilize the `steep init` command to generate this configuration file.
00:12:53.460 You need to specify the RBS directory and set the app directory as the location of the targets.
00:13:03.720 After setting up, make sure to commit your changes.
00:13:15.180 Following this, we generate the RBS files from the application code.
00:13:29.920 To achieve this, we may need to utilize several commands including RBS subtract.
00:13:43.080 Today, I’ve prepared a temporary directory for these experiments...
00:13:57.220 I’ll describe the processes involved with the temporary RBS file structure.
00:14:09.079 The first command you might find is the clean-up task, which just removes the alternatives.
00:14:20.660 Subsequently, corrections are executed, generating RBS files within the project directory.
00:14:33.680 Subtraction will allow resolution of any conflicting definitions.
00:14:49.540 Now, we perform the essential setup commands.
00:15:05.420 Once the commands are executed, our preparation is complete.
00:15:17.540 You'll see numerous errors due to the newly incorporated RBS files.
00:15:25.780 The target today is a specific file where we want to improve upon the existing type definitions.
00:15:38.860 We’ll need to address any untyped method definitions, such as this one in the file.
00:15:52.360 Selecting the appropriate method is essential to clarify its definitions.
00:16:05.220 In this case, the variable is typed correctly, thanks to the AWS libraries.
00:16:18.300 Once we resolve this, we need to add type definitions.
00:16:30.700 This method generally accepts a variety of inputs, from integers to other types.
00:16:44.080 The goal is to enforce stricter type checks.
00:16:57.560 We’ll attempt to reject undesired input while specifying what must be accepted.
00:17:09.820 This process is all about ensuring our types are precisely defined.
00:17:23.340 Now let's move onto error handling in methods.
00:17:38.340 We’ll analyze what exists in our current workspace.
00:17:50.200 Successfully running the necessary commands will help us finalize our RBS definitions.
00:18:00.780 We'll review and correct any remaining untyped definitions.
00:18:08.760 After we clean up, we’ll proceed to review and analyze the remaining methods and coordinates.
00:18:19.780 As you can see, the dynamic aspect of RBS types really assists with defining methods effectively.
00:18:29.440 After completing the revisions today, we’ll compile our findings.
00:18:39.420 In the final target, we will make sure all necessary operations are successful.
00:18:46.920 Thank you for listening to my talk.
00:18:51.820 I'd like to introduce a subsequent event.
00:19:00.300 The first is a discussion hosted by my fellow colleagues about Ruby, open-source software contributions, and community projects.
00:19:15.720 In this session, we encourage participation, and I invite everyone to join.
00:19:28.920 We also had a session yesterday discussing open-source contributions by well-known individuals.
00:19:42.120 So, if you are interested in further engagement, please attend our next event.
00:19:58.060 Finally, I would like to conclude my session.
00:20:08.300 Today, I shared the new features in RBS 3.1 including the RBS subtract functionality, as well as a demonstration on how to implement these changes.
00:20:24.620 Thank you for your attention!
00:20:37.540 Now for the implementation details on RBS subtract, I will quickly show you how this operates.
00:20:56.360 This involves the subtractor, a straightforward tool managing duplicate definitions.
00:21:05.420 The method recursively calls itself to effectively manage redundant entries.
00:21:20.680 During this process, it checks for existing definitions and records the relevant data.
00:21:35.900 Overall, it simplifies how we deal with redundant definitions across the board.
00:21:52.200 And with this, I appreciate your attentiveness throughout my presentation.
00:22:06.480 foreign