mirror of
https://gh.wpcy.net/https://github.com/discourse/discourse.git
synced 2026-05-18 11:31:20 +08:00
This PR implements stricter deprecation handling that enforces deprecation-free tests for core and preinstalled plugins, while allowing custom (non-preinstalled) plugins and themes to have deprecations without causing test failures. ### Key Changes #### CI Workflow Improvements - Split plugin system tests into separate CI targets: `core-plugins`, `official-plugins`, and `chat` - Enhance `bin/turbo_rspec` to accept comma-separated exclude patterns via `--exclude-pattern` - Simplify workflow configuration with default `shell: bash` and consolidated environment variables #### Plugin Classification & Detection - Centralize official plugins list in `config/official_plugins.json` for unified backend and frontend access - Detect preinstalled plugins by checking for absence of `.git` directory - Add `isOfficial` and `isPreinstalled` metadata flags to plugin info - Add `data-preinstalled` and `data-official` attributes to all plugin and theme script tags for runtime identification #### Deprecation Source Tracking - Track deprecation sources (core, plugin, or theme) through template map and resolver to attribute deprecations correctly - Improve `source-identifier.js` to detect admin UI plugin files in both development and production environments - Add source information to deprecation messages for better debugging #### Test Infrastructure - Modify `raise-on-deprecation` test helper to skip errors for custom (non-preinstalled) plugins and themes - Add `EMBER_RAISE_ON_DEPRECATION` environment variable to control deprecation throwing behavior in Rails tests - Automatically set `EMBER_RAISE_ON_DEPRECATION` for core and preinstalled plugin/theme specs in `rails_helper.rb` - Improve deprecation summary output for system specs with test/spec origin tracking #### Deprecation Workflow Enhancements - Add `dont-throw` handler for selective deprecation bypassing in test fixtures without raising errors - Add `dont-count` handler for preventing deprecation counting in specific scenarios (e.g., test fixtures) #### Deprecation Fixes - Fix pending deprecations across core plugins (chat, data-explorer, discourse-subscriptions, gamification, house-ads, reactions, rss-polling, styleguide) - Update import paths and remove deprecated patterns - Migrate deprecated Handlebars templates to JavaScript API ### Testing Strategy With these changes: - **Core and preinstalled plugins** must pass all tests without any deprecations - **Custom plugins and themes** can have deprecations without failing tests - Test fixtures can use `dont-throw` and `dont-count` handlers when testing deprecation behavior itself - System specs automatically configure deprecation enforcement based on test file location --------- Co-authored-by: David Taylor <david@taylorhq.com> Co-authored-by: Jarek Radosz <jradosz@gmail.com>
58 lines
1.8 KiB
Ruby
58 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module TurboTests
|
|
class JsonExample
|
|
def initialize(rspec_example)
|
|
@rspec_example = rspec_example
|
|
end
|
|
|
|
def to_json
|
|
{
|
|
execution_result: execution_result_to_json(@rspec_example.execution_result),
|
|
location: @rspec_example.location,
|
|
full_description: @rspec_example.full_description,
|
|
metadata: {
|
|
shared_group_inclusion_backtrace:
|
|
@rspec_example.metadata[:shared_group_inclusion_backtrace].map(
|
|
&method(:stack_frame_to_json)
|
|
),
|
|
extra_failure_lines: @rspec_example.metadata[:extra_failure_lines],
|
|
run_duration_ms: @rspec_example.metadata[:run_duration_ms],
|
|
process_pid: Process.pid,
|
|
js_deprecations: @rspec_example.metadata[:js_deprecations],
|
|
rerun_file_path: @rspec_example.metadata[:rerun_file_path],
|
|
active_record_debug_logs: @rspec_example.metadata[:active_record_debug_logs],
|
|
},
|
|
location_rerun_argument: @rspec_example.location_rerun_argument,
|
|
}
|
|
end
|
|
|
|
private
|
|
|
|
def stack_frame_to_json(frame)
|
|
{ shared_group_name: frame.shared_group_name, inclusion_location: frame.inclusion_location }
|
|
end
|
|
|
|
def exception_to_json(exception)
|
|
if exception
|
|
{
|
|
class_name: exception.class.name.to_s,
|
|
backtrace: exception.backtrace,
|
|
message: exception.message,
|
|
cause: exception_to_json(exception.cause),
|
|
}
|
|
end
|
|
end
|
|
|
|
def execution_result_to_json(result)
|
|
{
|
|
example_skipped?: result.example_skipped?,
|
|
pending_message: result.pending_message,
|
|
status: result.status,
|
|
pending_fixed?: result.pending_fixed?,
|
|
exception: exception_to_json(result.exception),
|
|
pending_exception: exception_to_json(result.pending_exception),
|
|
}
|
|
end
|
|
end
|
|
end
|