"لا يوجد إعداد باسم __" عند محاولة تشغيل المواصفات على المكون الإضافي للاستطلاع

مرحباً،

أنا أقوم بإنشاء إضافة (plugin) وأحاول كتابة بعض الاختبارات، ولكن عند محاولة تشغيل مواصفات إضافة الاستبيان (poll plugin) عبر

bundle exec rake plugin:spec poll

كما هو موضح هنا، أحصل على الخطأ التالي:

حدث خطأ أثناء تحميل ./plugins/poll/spec/integration/poll_endpoints_spec.rb.
فشل في التنفيذ: 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)>'

ما الخطأ الذي أقوم به عند محاولة تشغيل اختبارات إضافة الاستبيان؟ ولماذا لا يتم تحميل هذا الإعداد المحدد إلى اللغة الافتراضية؟

شكراً لك.

لتشغيل اختبارات الاستطلاع فقط، استخدم الأمر: bundle exec rake "plugin:spec[poll]" (أو بشكل أقصر: bin/rake "plugin:spec[poll]")؛ وإلا فستقوم بتشغيل جميع اختبارات الإضافات.

بشأن الخطأ الذي تواجهه، لست متأكدًا. هل تم ترحيل قاعدة بيانات الاختبار؟ (bin/rails db:migrate RAILS_ENV=test)

إعجابَين (2)

شكرًا لك. كما قلت، لقد تم تنفيذ جميع مواصفات الإضافات، وقد تجاوزت هذه المشكلة بإزالة الإضافات الأخرى. كنت أسترشد بـ هذا، لكن اتضح أن الأقواس كانت في المكان الخاطئ.

نعم، تم ترحيل قاعدة البيانات في بيئة الاختبار. تجاوزت هذه الخطأ عن طريق التعليق على السطر raise ArgumentError.new("No setting named '#{name}' exists") واستبداله بـ puts، وأظهر أن discourse_narrative_bot_enabled فقط هو ما يسبب هذا الخطأ؛ فجميع الإعدادات الأخرى سليمة. لا أعتقد أننا قمنا بأي شيء مع هذا الإعداد. على أي حال، بما أن مواصفاتاتي تعمل بشكل صحيح مع تجاهل هذا الخطأ، يمكنني ترك الحل المؤقت في discourse المحلي الخاص بي. وعندما أكتشف ما الذي تسبب في ذلك فعليًا، سأقوم بتحديث هذا المنشور.

إعجاب واحد (1)

أواجه حاليًا هذا الخطأ بالضبط في CI عند محاولة تشغيل عمليات الترحيل على قاعدة البيانات:

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.

يبدو أنه ناتج عن هذا السطر في النواة:

إعجاب واحد (1)

الفريق، هذا يقتلني.

نظام التكامل المستمر الخاص بنا يتعطل عند db:migrate بسبب هذا.

إنه نسخة طبق الأصل تقريبًا من نظام التكامل المستمر لمكون discourse-chat الإضافي، ولكن مع إضافة جدول زمني للمهام المجدولة.

يعمل نظام التكامل المستمر الخاص بنا لطلبات السحب والالتزامات، ولكن في مهمة مجدولة يفشل هنا في كل مرة.

أنا قادر على إعادة إنتاج هذا في وحدة تحكم Rails بواسطة كتلة مشابهة:

[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

هذا يعمل إذا وضعت:

[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

وللتحقق فقط، يفشل مع:

[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

لذلك أقترح التغيير التالي في طلب سحب يسعدني تقديمه:

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

لسبب ما، لا يمكن ضمان وجود المكون الإضافي للروبوت السردي؟

في هذه الأمثلة، لديك إعداد الموقع كـ discourse_narrative_bot_enab، وليس discourse_narrative_bot_enabled. أنا أخمن بمجرد تصحيح ذلك، لن يكون قابلاً لإعادة الإنتاج؟

الشيء الأكثر مفاجأة هنا هو:

هذا يشير إلى اختلاف في بيئة التشغيل للمشغلات المجدولة :thinking:

بالنظر إلى أحد سجلات الفشل يبدو أن GitHub يقوم باستنساخ المكون الإضافي متعدد اللغات مباشرة في دليل plugins، بدلاً من دليل خاص به. لذلك فهو “يزيل تثبيت” جميع المكونات الإضافية الأساسية (ويفشل في تثبيت نفسه بشكل صحيح)

أعتقد أنه لجعل cron يعمل، سنحتاج إلى استبدال جميع تكرارات github.event.repository.name بشيء آخر:

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

بالنظر إلى المستندات، لا يبدو أن هناك طريقة متسقة للحصول على اسم المستودع (بدون المالك)، لذلك سنحتاج إلى بعض الحيل. أعتقد أن هذا يجب أن ينجح:

ملاحظة @cvx - ربما يجب أن نستخدم هذه التقنية في قالب المكون الإضافي/القالب CI؟

إعجابَين (2)

كان هذا متعمداً لإجبار حدوث خطأ (والتعامل معه).

أوه يا إلهي، ملاحظة جيدة شكراً لك!

إعجابَين (2)

تم الدمج، شكراً جزيلاً لك @David، كان ذلك لطفاً منك.

بالتأكيد :beers: على حسابي إذا مررت بمنطقتك! :slight_smile:

إعجابَين (2)

للعلم، تم تشغيل اختبارات cron بشكل مثالي، شكرًا لك مرة أخرى.:tada:

إعجاب واحد (1)

@cvx شاركني هذا المقال:

لذلك، لم يعد من المفترض أن يكون الحل البديل المخترق لاسم المستودع مطلوبًا لوظائف cron :tada: م.م @merefield

إعجاب واحد (1)