"Nessuna impostazione chiamata __ esiste" quando si tenta di eseguire le specifiche sul plugin poll

Ciao,

Sto sviluppando un plugin e sto cercando di scrivere alcuni test, ma quando provo a eseguire gli spec del plugin poll tramite

bundle exec rake plugin:spec poll

come si vede qui, ricevo questo errore:

Si è verificato un errore durante il caricamento di ./plugins/poll/spec/integration/poll_endpoints_spec.rb.
Errore di esecuzione: raise ArgumentError.new(“No setting named ‘#{name}’ exists”)

ArgumentError:
  No setting named 'discourse_narrative_bot_enabled' exists
# ./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)>'

Cosa sto sbagliando nel tentativo di eseguire i test del plugin poll? Perché questa specifica impostazione non viene caricata nella locale predefinita?

Grazie.

Per eseguire solo gli spec del poll, il comando è: bundle exec rake "plugin:spec[poll]" (o in forma abbreviata: bin/rake "plugin:spec[poll]"), altrimenti vengono eseguiti tutti gli spec dei plugin.

Per quanto riguarda l’errore che stai riscontrando, non sono sicuro. Il database di test è stato migrato? (bin/rails db:migrate RAILS_ENV=test)

Grazie. Come hai detto, ha eseguito tutti gli spec dei plugin, cosa che ho aggirato rimuovendo gli altri plugin. Mi basavo su questo, ma sembra che le parentesi fossero posizionate nel punto sbagliato.

Sì, il database è migrato nell’ambiente di test. Ho aggirato questo errore commentando la riga raise ArgumentError.new("No setting named '#{name}' exists") e sostituendola con un puts, e risulta che solo discourse_narrative_bot_enabled genera questo errore; tutte le altre impostazioni sono corrette. Non credo che abbiamo fatto nulla con questa impostazione. Comunque, dato che il mio spec è stato eseguito correttamente ignorando questo errore, posso lasciare la soluzione temporanea nel mio Discourse locale. Quando scoprirò cosa ha effettivamente causato questo problema, aggiornerò questo post.

Attualmente sto riscontrando questo esatto errore in CI quando tento di eseguire le migrazioni sul database:

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.

Sembra essere causato da questa riga nel core:

Squadra, mi sta uccidendo.

La nostra CI si interrompe su db:migrate a causa di questo.

È quasi una copia verbatim della CI per il plugin discourse-chat, ma con l’aggiunta di una pianificazione cron.

La nostra CI funziona per PR e commit, ma con il job cron fallisce qui ogni volta.

Sono in grado di riprodurre questo sulla console rails con un blocco simile:

[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

Questo funziona se metto:

[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

E solo per controllare, fallisce 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

Quindi propongo la seguente modifica in una PR che sarei felice di inviare:

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

Per qualche motivo la presenza del plugin narrative bot non può essere garantita?

In questi esempi, l’impostazione del sito è discourse_narrative_bot_enab, non discourse_narrative_bot_enabled. Suppongo che una volta corretta, non sia riproducibile?

La cosa più sorprendente qui è:

Ciò suggerisce una differenza nell’ambiente di runtime per le esecuzioni pianificate :thinking:

Guardando uno dei log di errore, sembra che GitHub stia clonando il plugin multilingue direttamente nella directory plugins, anziché nella sua directory. Quindi, sta essenzialmente “disinstallando” tutti i plugin principali (e non riuscendo a installarsi correttamente).

Sospetto che, per far funzionare il cron, dovremo sostituire tutte le occorrenze di github.event.repository.name con qualcos’altro:

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

Guardando la documentazione, non sembra esserci un modo coerente per ottenere il nome del repository (senza il proprietario), quindi avremo bisogno di qualche espediente. Penso che questo dovrebbe funzionare:

cc @cvx - forse dovremmo usare questa tecnica nel CI del modello di plugin/tema?

Questo è stato deliberato per forzare un errore (e gestirlo).

Oooh cavolo, bella osservazione grazie!

unito, grazie mille @David sei stato molto gentile.

Sicuramente :birra: offerte da me se dovessi mai passare dalle tue parti! :sorriso:

Per tua informazione, i test di cron sono appena stati eseguiti perfettamente, grazie ancora.:tada:

@cvx ha appena condiviso questo articolo con me:

Quindi la soluzione alternativa “hacky” del nome del repository non dovrebbe più essere necessaria per i cron job :tada: cc @merefield