"No existe ningún ajuste llamado __" al intentar ejecutar especificaciones en el plugin de encuestas

Hola,

Estoy creando un plugin y estoy intentando escribir algunas pruebas, pero cuando intento ejecutar las especificaciones del plugin poll mediante

bundle exec rake plugin:spec poll

como se ve aquí, obtengo este error:

Ocurrió un error al cargar ./plugins/poll/spec/integration/poll_endpoints_spec.rb.
Error en la prueba: raise ArgumentError.new(“No existe una configuración llamada ‘#{name}’”)

ArgumentError:
  No existe una configuración llamada 'discourse_narrative_bot_enabled'
# ./lib/site_settings/defaults_provider.rb:58:in `set_regardless_of_locale'
# ./config/environments/test.rb:74:in `block (3 levels) in <main>'
# ./config/environments/test.rb:63:in `tap'
# ./config/environments/test.rb:63:in `block (2 levels) in <main>'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:68:in `block in execute_hook'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:61:in `with_execution_control'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:66:in `execute_hook'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:52:in `block in run_load_hooks'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:51:in `each'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:51:in `run_load_hooks'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/application/finisher.rb:140:in `block in <module:Finisher>'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:32:in `instance_exec'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:32:in `run'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:61:in `block in run_initializers'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:60:in `run_initializers'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/application.rb:384:in `initialize!'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/railtie.rb:207:in `public_send'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/railtie.rb:207:in `method_missing'
# ./config/environment.rb:7:in `<top (required)>'
# ./spec/rails_helper.rb:56:in `require'
# ./spec/rails_helper.rb:56:in `<top (required)>'
# ./plugins/poll/spec/integration/poll_endpoints_spec.rb:3:in `require'
# ./plugins/poll/spec/integration/poll_endpoints_spec.rb:3:in `<top (required)>'

¿Qué estoy haciendo mal al intentar ejecutar las pruebas del plugin poll? ¿Por qué esta configuración en particular no se carga en la configuración predeterminada?

Gracias.

Para ejecutar solo las pruebas de la encuesta, el comando es: bundle exec rake "plugin:spec[poll]" (o más corto: bin/rake "plugin:spec[poll]"); de lo contrario, estarás ejecutando las pruebas de todos los plugins.

En cuanto al error que estás obteniendo, no estoy seguro. ¿Está migrada la base de datos de pruebas? (bin/rails db:migrate RAILS_ENV=test)

2 Me gusta

Gracias. Como dijiste, sí ejecutó todas las pruebas de los plugins, lo que solucioné temporalmente eliminando los otros plugins. Me basé en esto, pero resulta que los paréntesis estaban en el lugar equivocado.

Sí, la base de datos se migra en el entorno de prueba. Solucioné este error comentando la línea raise ArgumentError.new("No setting named '#{name}' exists") y reemplazándola con un puts, y muestra que solo discourse_narrative_bot_enabled desencadena este error; todos los demás ajustes están bien. No creo que hayamos hecho nada con esta configuración. De todos modos, como mi prueba se ejecutó correctamente ignorando este error, puedo dejar la solución temporal en mi Discourse local. Cuando descubra qué lo causó realmente, actualizaré esta publicación.

1 me gusta

Actualmente estoy recibiendo este error exacto en CI al intentar ejecutar las migraciones en la base de datos:

Run bin/rake db:create
rake aborted!
ArgumentError: No setting named 'discourse_narrative_bot_enabled' exists
/home/runner/work/discourse-multilingual/discourse-multilingual/lib/site_settings/defaults_provider.rb:58:in `set_regardless_of_locale'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environments/test.rb:73:in `block (3 levels) in <main>'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environments/test.rb:63:in `tap'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environments/test.rb:63:in `block (2 levels) in <main>'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:79:in `block in execute_hook'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:72:in `with_execution_control'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:77:in `execute_hook'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:63:in `block in run_load_hooks'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:62:in `each'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:62:in `run_load_hooks'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application/finisher.rb:87:in `block in <module:Finisher>'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:32:in `instance_exec'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:32:in `run'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:61:in `block in run_initializers'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:60:in `run_initializers'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application.rb:372:in `initialize!'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environment.rb:7:in `<main>'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/zeitwerk-2.6.0/lib/zeitwerk/kernel.rb:35:in `require'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application.rb:348:in `require_environment!'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application.rb:511:in `block in run_tasks_blocks'
Tasks: TOP => db:migrate => db:load_config => environment
(See full trace by running task with --trace)
Error: Process completed with exit code 1.

Parece ser causado por esta línea en el núcleo:

1 me gusta

Equipo, esto me está matando.

Nuestro CI está fallando en db:migrate debido a esto.

Es casi una copia literal de el CI para el plugin discourse-chat, pero con la adición de un cronograma.

Nuestro CI funciona para PRs y commits, pero en el trabajo cron falla aquí cada vez.

Puedo reproducir esto en la consola de rails con un bloque similar:

[19] pry(main)> SiteSetting.defaults.tap do |s|
[19] pry(main)*   s.set_regardless_of_locale(:discourse_narrative_bot_enab, false)
[19] pry(main)* end
ArgumentError: No setting named 'discourse_narrative_bot_enab' exists

Esto funciona si pongo:

[21] pry(main)> SiteSetting.defaults.tap do |s|
[21] pry(main)*   if s.has_setting? :discourse_narrative_bot_enab
[21] pry(main)*     s.set_regardless_of_locale(:discourse_narrative_bot_enab, false)
[21] pry(main)*   end
[21] pry(main)* end

Y solo para comprobar, falla con:

[21] pry(main)> SiteSetting.defaults.tap do |s|
[21] pry(main)*   if s.has_setting? :discourse_narrative_bot_enabled
[21] pry(main)*     s.set_regardless_of_locale(:discourse_narrative_bot_enab, false)
[21] pry(main)*   end
[21] pry(main)* end

Así que propongo el siguiente cambio en un PR que estaría feliz de enviar:

 if ENV['LOAD_PLUGINS'] == '1' && s.has_setting? :discourse_narrative_bot_enabled

Por alguna razón, la presencia del plugin de bot narrativo no se puede garantizar?

En estos ejemplos, la configuración del sitio es discourse_narrative_bot_enab, no discourse_narrative_bot_enabled. Supongo que una vez que eso se corrija, ¿no se podrá reproducir?

Lo más sorprendente aquí es:

Eso sugiere una diferencia en el entorno de ejecución para las ejecuciones programadas :thinking:

Mirando uno de los registros de fallos, parece que GitHub está clonando el plugin multilingüe directamente en el directorio plugins, en lugar de en su propio directorio. Por lo tanto, está esencialmente ‘desinstalando’ todos los plugins principales (y fallando en instalarse correctamente).

Sospecho que, para que el cron funcione, tendremos que reemplazar todas las ocurrencias de github.event.repository.name con algo más:

https://github.com/paviliondev/discourse-multilingual/blob/main/.github/workflows/plugin-tests.yml#L40

Mirando la documentación, no parece haber una forma consistente de obtener el nombre del repositorio (sin el propietario), por lo que necesitaremos algún truco. Creo que esto debería funcionar:

cc @cvx - ¿quizás deberíamos usar esta técnica en el CI de la plantilla de plugin/tema?

2 Me gusta

Esto fue deliberado para forzar un error (y manejarlo).

¡Oh, vaya, buena observación, gracias!

2 Me gusta

fusionado, muchas gracias @David, fue muy amable de tu parte.

¡Definitivamente :beers: por mi cuenta si alguna vez estoy en tu zona! :slight_smile:

2 Me gusta

Para tu información, las pruebas de cron se ejecutaron perfectamente, gracias de nuevo. :tada:

1 me gusta

@cvx acaba de compartir este artículo conmigo:

Así que la solución alternativa y poco elegante del nombre del repositorio ya no debería ser necesaria para los trabajos cron :tada: cc @merefield

1 me gusta