Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tapioca does not generate a signature for ActiveSupport's Time#rfc3339 #2082

Open
davidstosik opened this issue Nov 21, 2024 · 1 comment
Open

Comments

@davidstosik
Copy link

I've discussed this with @andyw8 on Slack.
I'm working on a Rails application that uses Sorbet and Tapioca.
Using Time.now.rfc3339 in the app introduced a Sorbet error:

app/jobs/dead_translations/snapshot_job.rb:190: Method rfc3339 does not exist on Time https://srb.help/7003
     190 |          time: end_time.rfc3339,
                                   ^^^^^^^
  Got Time originating from:
    app/jobs/dead_translations/snapshot_job.rb:186:
     186 |    def get_live_translations(prefix, end_time)
                                                ^^^^^^^^
  There is a singleton class method with the same name:
    sorbet/rbi/gems/[email protected]:21563: Defined here
       21563 |    def rfc3339(str); end
                  ^^^^^^^^^^^^^^^^
    Either:
    - use .class to call it, or
    - remove self. from its definition to make it an instance method
  Autocorrect: Use -a to autocorrect
    app/jobs/dead_translations/snapshot_job.rb:190: Insert .class
     190 |          time: end_time.rfc3339,

Time#rfc3339 is defined in an ActiveSupport core extension: activesupport/core_ext/time/conversions, as an alias to Time#xmlschema, which itself is defined in Ruby's Time class (here).

$ ruby -e "puts Time.now.xmlschema"
-e:1:in `<main>': undefined method `xmlschema' for an instance of Time (NoMethodError)

puts Time.now.xmlschema
             ^^^^^^^^^^

$ ruby -rtime -e "puts Time.now.xmlschema"
2024-11-22T01:16:39+09:00

$ ruby -rtime -e "puts Time.now.rfc3339"
-e:1:in `<main>': undefined method `rfc3339' for an instance of Time (NoMethodError)

puts Time.now.rfc3339
             ^^^^^^^^

$ ruby -ractive_support/core_ext/time/conversions -e "puts Time.now.rfc3339"
2024-11-22T01:17:10+09:00

What's weird is that Tapioca appears to be able to pick up another method defined with alias_method in the same active_support/core_ext/time/conversions file. (This one: to_formatted_s.)

In another experiment, I tried adding def xmlschema; end in that file, active_support/core_ext/time/conversions, before the line alias_method :rfc3339, :xmlschema. When I run bin/tapioca gem activesupport, it adds the signatures for both Time#xmlschema and Time#rfc3339 to sorbet/rbi/gems/[email protected].

I tried adding either or both of the two lines below in the sorbet/tapioca/require.rb file, but it does not seem to change anything, unfortunately.

require "time"
require "active_support/core_ext/time/conversions"

Also note that Sorbet defines a signature for Time#xmlschema, here.

Finally, I tried replacing Time.now.rfc3339 with Time.now.xmlschema in my code, and now the Sorbet error is gone, so I'll simply go with that for now.

@KaanOzkan
Copy link
Contributor

Looks similar to #640

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants