fugakkbn / config_rbs_generator

This gem generates RBS files for `Settings` objects created by the config gem.
MIT License
1 stars 0 forks source link

Cannot run in Rails projects #20

Open fugakkbn opened 1 year ago

fugakkbn commented 1 year ago

We get an error when we run it on a Rails project.

$ bundle exec config_rbs_generate
bundler: failed to load command: config_rbs_generate (/Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/bin/config_rbs_generate)
(erb):38:in `<main>': uninitialized constant Rails (NameError)
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/3.0.0/erb.rb:905:in `eval'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/3.0.0/erb.rb:905:in `result'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/config-3.1.1/lib/config/sources/yaml_source.rb:19:in `load'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/config-3.1.1/lib/config/options.rb:38:in `block in reload!'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/config-3.1.1/lib/config/options.rb:37:in `each'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/config-3.1.1/lib/config/options.rb:37:in `reload!'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/config-3.1.1/lib/config.rb:48:in `load_files'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/config-3.1.1/lib/config.rb:56:in `load_and_set_settings'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/config_rbs_generator-0.1.0/config/initializers/config.rb:7:in `block in <top (required)>'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/config-3.1.1/lib/config.rb:32:in `setup'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/config_rbs_generator-0.1.0/config/initializers/config.rb:5:in `<top (required)>'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/config_rbs_generator-0.1.0/lib/config_rbs_generator.rb:4:in `require_relative'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/config_rbs_generator-0.1.0/lib/config_rbs_generator.rb:4:in `<top (required)>'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/config_rbs_generator-0.1.0/exe/config_rbs_generate:4:in `require_relative'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/config_rbs_generator-0.1.0/exe/config_rbs_generate:4:in `<top (required)>'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/bin/config_rbs_generate:25:in `load'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/bin/config_rbs_generate:25:in `<top (required)>'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/bundler-2.3.4/lib/bundler/cli/exec.rb:58:in `load'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/bundler-2.3.4/lib/bundler/cli/exec.rb:58:in `kernel_load'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/bundler-2.3.4/lib/bundler/cli/exec.rb:23:in `run'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/bundler-2.3.4/lib/bundler/cli.rb:484:in `exec'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/bundler-2.3.4/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/bundler-2.3.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/bundler-2.3.4/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/bundler-2.3.4/lib/bundler/cli.rb:31:in `dispatch'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/bundler-2.3.4/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/bundler-2.3.4/lib/bundler/cli.rb:25:in `start'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/bundler-2.3.4/exe/bundle:48:in `block in <top (required)>'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/bundler-2.3.4/lib/bundler/friendly_errors.rb:103:in `with_friendly_errors'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/bundler-2.3.4/exe/bundle:36:in `<top (required)>'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/bin/bundle:23:in `load'
        from /Users/fugakkbn/.rbenv/versions/3.0.4/bin/bundle:23:in `<main>'

I can see from the log that when the load_and_set_settings method of the config gem is called, it tries to run in the context of Rails. However, this gem does not have Rails installed, so it appears to be an error.

fugakkbn commented 1 year ago

In ~/.rbenv/versions/3.0.4/lib/ruby/3.0.0/erb.rb, @src is passed as the first argument of eval at line 905. This reads the file passed to the load_and_set_settings method. It calls the Rails object in @src. The uninitialized constant Rails (NameError) at the beginning of the error message seems to occur here.

In other words, the file is successfully passed from the Rails project. If we can handle Rails objects in the gem, the problem is solved.

fugakkbn commented 1 year ago

No. Is it really so? It's possible that the Rails object could be read after being converted.

Need to see how the Settings object is generated in a real Rails project

fugakkbn commented 1 year ago

Hmmm, it seems that @src is read as a Rails object even in the process of loading it in the Rails project. Maybe we still need to allow the gem to run in the context of Rails on the gem side.

fugakkbn commented 1 year ago

Or how about passing the Settings object directly? No need to re-generate what we originally have in our Rails project.

Is there any way to pass objects from Rails to gem?