From e52db1c3b5b00bdd3095c342a9fa9dbe55155296 Mon Sep 17 00:00:00 2001 From: Naoki Nishiguchi Date: Wed, 27 Aug 2025 19:00:57 +0900 Subject: [PATCH 1/2] Introduce RBS + Steep and add initial signatures - Add Steep & RBS as development dependencies - Add Steepfile and sig/ with initial public API signatures - Self constraints for define_method-based methods --- Steepfile | 5 +++++ lib/predicateable.rb | 3 ++- predicateable.gemspec | 2 ++ sig/predicateable.rbs | 12 ++++++++++-- sig/predicateable/version.rbs | 3 +++ 5 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 Steepfile create mode 100644 sig/predicateable/version.rbs diff --git a/Steepfile b/Steepfile new file mode 100644 index 0000000..db0fc84 --- /dev/null +++ b/Steepfile @@ -0,0 +1,5 @@ +target :lib do + signature "sig" + + check "lib" +end \ No newline at end of file diff --git a/lib/predicateable.rb b/lib/predicateable.rb index 0b846cd..f630f60 100644 --- a/lib/predicateable.rb +++ b/lib/predicateable.rb @@ -13,7 +13,8 @@ def predicate(name, values, prefix: false, strict: false) method = prefix ? "#{name}_#{value}?" : "#{value}?" define_method(method) do - actual = send(name) + # @type self: Object + actual = public_send(name) if strict actual == value diff --git a/predicateable.gemspec b/predicateable.gemspec index 6ee0b7a..b033aad 100644 --- a/predicateable.gemspec +++ b/predicateable.gemspec @@ -31,4 +31,6 @@ Gem::Specification.new do |spec| spec.add_development_dependency "rake", "~> 13.0" spec.add_development_dependency "minitest", "~> 5.22" + spec.add_development_dependency "rbs", "~> 3.9" + spec.add_development_dependency "steep", "~> 1.10" end diff --git a/sig/predicateable.rbs b/sig/predicateable.rbs index 7e62b0e..29a9d24 100644 --- a/sig/predicateable.rbs +++ b/sig/predicateable.rbs @@ -1,4 +1,12 @@ module Predicateable - VERSION: String - # See the writing guide of rbs: https://github.com/ruby/rbs#guides + def self.included: (Module base) -> void + + module ClassMethods : Module + def predicate: ( + Symbol | String name, + Array[Symbol | String] values, + ?prefix: bool, + ?strict: bool + ) -> Array[Symbol | String] + end end diff --git a/sig/predicateable/version.rbs b/sig/predicateable/version.rbs new file mode 100644 index 0000000..b9039f2 --- /dev/null +++ b/sig/predicateable/version.rbs @@ -0,0 +1,3 @@ +module Predicateable + VERSION: String +end From ff2031958d5723615e8f2656671174631b854b23 Mon Sep 17 00:00:00 2001 From: Naoki Nishiguchi Date: Wed, 27 Aug 2025 19:18:11 +0900 Subject: [PATCH 2/2] Set up GitHub Actions for type checking --- .github/workflows/{test.yml => ci.yml} | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) rename .github/workflows/{test.yml => ci.yml} (55%) diff --git a/.github/workflows/test.yml b/.github/workflows/ci.yml similarity index 55% rename from .github/workflows/test.yml rename to .github/workflows/ci.yml index 55ce66d..15d752d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/ci.yml @@ -1,10 +1,10 @@ -name: Test +name: CI on: push: jobs: - rspec: + test: runs-on: ubuntu-latest strategy: @@ -23,3 +23,17 @@ jobs: bundler-cache: true - run: bundle exec rake test + + steep: + name: Type check (Steep) + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.4.4' + bundler-cache: true + + - run: bundle exec steep check