From 5f47e909c75fff4ff10b87a8ad75285569eb2e42 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Mon, 2 Oct 2023 00:25:26 +0900 Subject: [PATCH] active_model: Support ActiveModel::* mix-ins --- lib/rbs_rails/active_model.rb | 18 +++++++++++++++++- sig/rbs_rails/active_model.rbs | 1 + test/expectations/article.rbs | 6 +++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/rbs_rails/active_model.rb b/lib/rbs_rails/active_model.rb index 4ddb5da..52b5a92 100644 --- a/lib/rbs_rails/active_model.rb +++ b/lib/rbs_rails/active_model.rb @@ -42,7 +42,7 @@ def generate private def klass_decl <<~RBS #{header} - def self.attribute: (Symbol name, ?Symbol? cast_type, ?untyped default, **untyped) -> void + #{mixins} #{attributes} #{footer} @@ -69,6 +69,22 @@ def self.attribute: (Symbol name, ?Symbol? cast_type, ?untyped default, **untype end.join("\n") end + private def mixins + mixins = [] + if klass < ::ActiveModel::Model + mixins << "include ::ActiveModel::Model" + end + if klass < ::ActiveModel::Attributes + mixins << "include ::ActiveModel::Attributes" + mixins << "extend ::ActiveModel::Attributes::ClassMethods" + end + if klass < ::ActiveModel::Validations + mixins << "include ::ActiveModel::Validations" + mixins << "extend ::ActiveModel::Validations::ClassMethods" + end + mixins.join("\n") + end + private def attributes # @type var model: untyped model = klass diff --git a/sig/rbs_rails/active_model.rbs b/sig/rbs_rails/active_model.rbs index 3fa54e6..3746627 100644 --- a/sig/rbs_rails/active_model.rbs +++ b/sig/rbs_rails/active_model.rbs @@ -15,6 +15,7 @@ module RbsRails def klass_decl: () -> String def header: () -> String + def mixins: () -> String def attributes: () -> String def footer: () -> String diff --git a/test/expectations/article.rbs b/test/expectations/article.rbs index 8106726..90ea43f 100644 --- a/test/expectations/article.rbs +++ b/test/expectations/article.rbs @@ -1,5 +1,9 @@ class Article < ::Object - def self.attribute: (Symbol name, ?Symbol? cast_type, ?untyped default, **untyped) -> void + include ::ActiveModel::Model + include ::ActiveModel::Attributes + extend ::ActiveModel::Attributes::ClassMethods + include ::ActiveModel::Validations + extend ::ActiveModel::Validations::ClassMethods def blog_id: () -> Integer? def blog_id=: (Integer? value) -> Integer?