DEV: Update lint-configs and rubocop-discourse (#31728)

…and autofix issues

---------

Co-authored-by: David Taylor <david@taylorhq.com>
This commit is contained in:
Jarek Radosz 2025-03-10 19:52:19 +01:00 committed by GitHub
parent 329e1055cf
commit 25048b5a8d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
78 changed files with 424 additions and 156 deletions

View File

@ -495,17 +495,18 @@ GEM
unicode-display_width (>= 2.4.0, < 4.0)
rubocop-ast (1.38.1)
parser (>= 3.3.1.0)
rubocop-capybara (2.21.0)
rubocop (~> 1.41)
rubocop-discourse (3.11.0)
rubocop-capybara (2.22.0)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
rubocop-discourse (3.12.1)
activesupport (>= 6.1)
lint_roller (>= 1.1.0)
rubocop (>= 1.72.0)
rubocop-capybara (>= 2.0.0)
rubocop-factory_bot (>= 2.0.0)
rubocop-rails (>= 2.25.0)
rubocop (>= 1.73.2)
rubocop-capybara (>= 2.22.0)
rubocop-factory_bot (>= 2.27.0)
rubocop-rails (>= 2.30.3)
rubocop-rspec (>= 3.0.1)
rubocop-rspec_rails (>= 2.30.0)
rubocop-rspec_rails (>= 2.31.0)
rubocop-factory_bot (2.27.0)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
@ -518,9 +519,10 @@ GEM
rubocop-rspec (3.5.0)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
rubocop-rspec_rails (2.30.0)
rubocop (~> 1.61)
rubocop-rspec (~> 3, >= 3.0.1)
rubocop-rspec_rails (2.31.0)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
rubocop-rspec (~> 3.5)
ruby-prof (1.7.1)
ruby-progressbar (1.13.0)
ruby-readability (0.7.2)
@ -1028,12 +1030,12 @@ CHECKSUMS
rtlcss (0.2.1) sha256=213d5a00bf61267f93a7a516d699d77e1cc5f396743abb33c01e3f3243a7bf60
rubocop (1.73.2) sha256=35cd1b1365ba97234323fe771abcecd09c9b77098464cd726c76aa7d9bc12b5d
rubocop-ast (1.38.1) sha256=80ecbe2ac9bb26693cab9405bf72b41b85a1f909f20f021b983c32c2e7d857fe
rubocop-capybara (2.21.0) sha256=5d264efdd8b6c7081a3d4889decf1451a1cfaaec204d81534e236bc825b280ab
rubocop-discourse (3.11.0) sha256=4746848050aec458c079495c1aded5c4c6f3813644b73c8e35633fe93c87c83a
rubocop-capybara (2.22.0) sha256=9c3a6704ed0243e5332fdc45112b4bb90fc4cfd23a7f175f74af4a01e21627d0
rubocop-discourse (3.12.1) sha256=ebf7e2224f053047372071419052828c3e3a01bccb14ea1f282ac143547df9bc
rubocop-factory_bot (2.27.0) sha256=de9918bc4e1406b3025da87c5c34c91dd6c3e802cd59339790631f963a5652ba
rubocop-rails (2.30.3) sha256=fc5a6506daa916d15e282cc806943afa64a020bf592b93a94025d89a2a78a715
rubocop-rspec (3.5.0) sha256=710c942fe1af884ba8eea75cbb8bdbb051929a2208880a6fc2e2dce1eed5304c
rubocop-rspec_rails (2.30.0) sha256=888112e83f9d7ef7ad2397e9d69a0b9614a4bae24f072c399804a180f80c4c46
rubocop-rspec_rails (2.31.0) sha256=775375e18a26a1184a812ef3054b79d218e85601b9ae897f38f8be24dddf1f45
ruby-prof (1.7.1) sha256=026393448cf92fd24a91739bf71ccd2bfe88fe8a1401ee8afc4948a16d62ea24
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
ruby-readability (0.7.2) sha256=7351ddc89ac62ecdd35336acb1313ac29dc1dad9745d59f25109ec2215c6580c

View File

@ -1,2 +1,3 @@
import CustomizationBase from "admin/adapters/customization-base";
export default CustomizationBase;

View File

@ -15,6 +15,7 @@ import SiteSetting from "admin/models/site-setting";
export default class AdminAreaSettings extends Component {
@service siteSettings;
@service router;
@tracked settings = [];
@tracked loading = false;
@tracked showBreadcrumb = this.args.showBreadcrumb ?? true;

View File

@ -15,6 +15,7 @@ import SimpleList from "admin/components/simple-list";
export default class AdminBrandingLogoForm extends Component {
@service siteSettings;
@service toasts;
@tracked placeholders = {};
@tracked loading = false;

View File

@ -12,6 +12,7 @@ import AdminFlagItem from "admin/components/admin-flag-item";
export default class AdminConfigAreasFlags extends Component {
@service site;
@service siteSettings;
@tracked flags = this.site.flagTypes;
get addFlagButtonDisabled() {

View File

@ -13,6 +13,7 @@ import SiteSetting from "admin/components/site-setting";
export default class AdminFilteredSiteSettings extends Component {
@service currentUser;
@tracked visibleSettings;
@tracked loading = true;

View File

@ -12,6 +12,7 @@ export default class AdminPenaltyPostAction extends Component {
postEdit = null;
@equal("postAction", "edit") editing;
@discourseComputed
penaltyActions() {
return ACTIONS.map((id) => {

View File

@ -13,6 +13,7 @@ import AdminSectionLandingWrapper from "admin/components/admin-section-landing-w
export default class AdminReports extends Component {
@service siteSettings;
@tracked reports;
@tracked filter = "";

View File

@ -16,6 +16,7 @@ import DTooltip from "float-kit/components/d-tooltip";
export default class DiscourseNewFeatureItem extends Component {
@service siteSettings;
@service toasts;
@tracked experimentEnabled = this.args.item.experiment_enabled;
@tracked toggleExperimentDisabled = false;

View File

@ -11,6 +11,7 @@ import DMenu from "float-kit/components/d-menu";
export default class EmbeddableHost extends Component {
@service dialog;
@tracked category = null;
@tracked tags = null;
@tracked user = null;

View File

@ -6,6 +6,7 @@ import { isEmpty } from "@ember/utils";
import discourseComputed from "discourse/lib/decorators";
import UppyUpload from "discourse/lib/uppy/uppy-upload";
import { i18n } from "discourse-i18n";
const DEFAULT_GROUP = "default";
export default class EmojiUploader extends Component {

View File

@ -6,6 +6,7 @@ import { i18n } from "discourse-i18n";
export default class StartBackup extends Component {
@service siteSettings;
@tracked includeUploads = true;
get canManageUploadsInBackup() {

View File

@ -8,6 +8,7 @@ import { i18n } from "discourse-i18n";
export default class AdminBadgesAwardController extends Controller {
@service dialog;
@tracked saving = false;
@tracked replaceBadgeOwners = false;
@tracked grantExistingHolders = false;

View File

@ -8,6 +8,7 @@ import { i18n } from "discourse-i18n";
export default class AdminCustomizeColorsShowController extends Controller {
@service dialog;
@service router;
onlyOverridden = false;
@computed("model.colors.[]", "onlyOverridden")

View File

@ -8,6 +8,7 @@ export default class AdminEmbeddingIndexController extends Controller {
@service router;
@service site;
@controller adminEmbedding;
@alias("adminEmbedding.embedding") embedding;
get showEmbeddingCode() {

View File

@ -1,5 +1,6 @@
import Controller from "@ember/controller";
import { i18n } from "discourse-i18n";
export const DEFAULT_PERIOD = "yearly";
export default class AdminSearchLogsIndexController extends Controller {

View File

@ -1,2 +1,3 @@
import Controller from "@ember/controller";
export default class AdminUserController extends Controller {}

View File

@ -9,6 +9,7 @@ export default class AdminWebHooksShowController extends Controller {
@service dialog;
@service router;
@controller adminWebHooks;
@tracked status;
queryParams = ["status"];

View File

@ -7,6 +7,7 @@ import { i18n } from "discourse-i18n";
export default class ColorSchemeColor extends EmberObject {
// Whether the current value is different than Discourse's default color scheme.
@propertyNotEqual("hex", "default_hex") overridden;
@on("init")
startTrackingChanges() {
this.set("originals", { hex: this.hex || "FFFFFF" });

View File

@ -39,6 +39,7 @@ export default class ColorScheme extends EmberObject {
}
@not("id") newRecord;
init() {
super.init(...arguments);

View File

@ -14,6 +14,7 @@ export default class ScreenedIpAddress extends EmberObject {
}
@equal("action_name", "block") isBlocked;
@discourseComputed("action_name")
actionName(actionName) {
return i18n(`admin.logs.screened_ips.actions.${actionName}`);

View File

@ -7,6 +7,7 @@ import IncomingEmailModal from "../components/modal/incoming-email";
export default class AdminEmailBouncedRoute extends AdminEmailLogs {
@service modal;
status = "bounced";
@action

View File

@ -6,6 +6,7 @@ import IncomingEmailModal from "../components/modal/incoming-email";
export default class AdminEmailRejectedRoute extends AdminEmailIncomings {
@service modal;
status = "rejected";
@action

View File

@ -14,6 +14,7 @@ export default class AdminRoute extends DiscourseRoute {
@service currentUser;
@service adminSidebarStateManager;
@service modal;
@tracked initialSidebarState;
titleToken() {

View File

@ -4,6 +4,7 @@ import { configNavForPlugin } from "discourse/lib/admin-plugin-config-nav";
export default class AdminPluginNavManager extends Service {
@service currentUser;
@tracked currentPlugin;
// NOTE (martin) This is a temporary solution so we know whether to

View File

@ -6,6 +6,7 @@ import { ADMIN_PANEL, MAIN_PANEL } from "discourse/lib/sidebar/panels";
export default class AdminSidebarStateManager extends Service {
@service sidebarState;
@service currentUser;
@alias("sidebarState.currentUserUsingAdminSidebar")
currentUserUsingAdminSidebar;
@alias("sidebarState.isForcingAdminSidebar") isForcingAdminSidebar;

View File

@ -1,3 +1,4 @@
import Component from "@ember/component";
// Exists so plugins can use it
export default class CategoriesTopicList extends Component {}

View File

@ -16,6 +16,7 @@ let _messagesCache = {};
@classNameBindings(":composer-popup-container", "hidden")
export default class ComposerMessages extends Component {
@service modal;
@tracked showShareModal;
checkedMessages = false;

View File

@ -10,6 +10,7 @@ import { cook } from "discourse/lib/text";
export default class CookText extends Component {
@service siteSettings;
@tracked cooked = null;
constructor(owner, args) {

View File

@ -25,6 +25,7 @@ const HEADLESS_ACTIONS = ["new", "edit"];
export default class DPageHeader extends Component {
@service site;
@service router;
@tracked shouldDisplay = true;
constructor() {

View File

@ -7,6 +7,7 @@ import { service } from "@ember/service";
export default class DirectoryItemUserFieldValueComponent extends Component {
@service router;
get fieldData() {
const { item, column } = this.args;
return item?.user?.user_fields?.[column.user_field_id];

View File

@ -11,6 +11,7 @@ import LoadMore from "discourse/mixins/load-more";
export default class DiscoveryTopicsList extends Component.extend(LoadMore) {
@service appEvents;
@service documentTitle;
eyelineSelector = ".topic-list-item";
@on("didInsertElement")

View File

@ -21,6 +21,7 @@ const maxMembersToDisplay = 10;
)
export default class GroupCardContents extends CardContentsBase {
@service composer;
@setting("allow_profile_backgrounds") allowBackgrounds;
@setting("enable_badges") showBadges;

View File

@ -7,6 +7,7 @@ import PluginOutlet from "discourse/components/plugin-outlet";
import icon from "discourse/helpers/d-icon";
import { i18n } from "discourse-i18n";
import GroupDropdown from "select-kit/components/group-dropdown";
export default class GroupNavigation extends Component {
@service site;

View File

@ -6,6 +6,7 @@ import { bind } from "discourse/lib/decorators";
export default class HorizontalOverflowNav extends Component {
@service site;
@tracked hasScroll;
@tracked hideRightScroll = false;
@tracked hideLeftScroll = true;

View File

@ -11,6 +11,7 @@ import { i18n } from "discourse-i18n";
export default class InvitePanel extends Component {
@service site;
@readOnly("currentUser.staff") isStaff;
@readOnly("currentUser.admin") isAdmin;
@alias("inviteModel.id") topicId;

View File

@ -10,6 +10,7 @@ import $ from "jquery";
@classNames("mobile-nav")
export default class MobileNav extends Component {
@service router;
selectedHtml = null;
@on("init")

View File

@ -10,6 +10,7 @@ import { allowsImages } from "discourse/lib/uploads";
export default class AvatarSelectorModal extends Component {
@service currentUser;
@service siteSettings;
@tracked gravatarRefreshDisabled = false;
@tracked gravatarFailed = false;
@tracked uploading = false;

View File

@ -29,6 +29,7 @@ export function addBulkDropdownAction(name, customAction) {
export default class BulkTopicActions extends Component {
@service router;
@service toasts;
@tracked activeComponent = null;
@tracked tags = [];
@tracked categoryId;

View File

@ -13,6 +13,7 @@ import { i18n } from "discourse-i18n";
export default class ChangePostNoticeModal extends Component {
@service currentUser;
@tracked post = this.args.model.post;
@tracked notice = this.args.model.post.notice?.raw ?? "";
@tracked saving = false;

View File

@ -9,6 +9,7 @@ import { i18n } from "discourse-i18n";
export default class CustomizeFormTemplateViewModal extends Component {
@service router;
@service dialog;
@tracked showPreview = false;
@action

View File

@ -21,6 +21,7 @@ import DTooltip from "float-kit/components/d-tooltip";
export default class SpreadsheetEditor extends Component {
@service dialog;
@tracked showEditReason = false;
@tracked loading = true;
spreadsheet = null;

View File

@ -49,6 +49,7 @@ const ARGS_DEPRECATION_MSG =
export default class PluginOutletComponent extends Component {
@service clientErrorHandler;
context = {
...helperContext(),
get() {

View File

@ -3,6 +3,7 @@ import { service } from "@ember/service";
export default class SearchMenuPanel extends Component {
@service site;
get animationClass() {
return this.site.mobileView || this.site.narrowDesktopView
? "slide-in"

View File

@ -8,6 +8,7 @@ import concatClass from "discourse/helpers/concat-class";
export default class SignupProgressBar extends Component {
@service siteSettings;
@service site;
@tracked steps = [];
constructor() {

View File

@ -12,6 +12,7 @@ import { i18n } from "discourse-i18n";
export default class PrivateMessageMap extends Component {
@service site;
@tracked isEditing = false;
get participantsClasses() {

View File

@ -1,5 +1,6 @@
import Controller, { inject as controller } from "@ember/controller";
import { action } from "@ember/object";
export default class GroupActivityPostsController extends Controller {
@controller group;
@controller groupActivity;

View File

@ -9,6 +9,7 @@ import { i18n } from "discourse-i18n";
export default class extends Controller {
@service currentUser;
@service siteSettings;
@tracked saved = false;
@tracked customAttrNames = [];

View File

@ -14,6 +14,7 @@ export default class ReviewIndexController extends Controller {
@service currentUser;
@service dialog;
@service toasts;
queryParams = [
"priority",
"type",

View File

@ -39,6 +39,7 @@ import Post from "discourse/models/post";
import Topic from "discourse/models/topic";
import TopicTimer from "discourse/models/topic-timer";
import { i18n } from "discourse-i18n";
let customPostMessageCallbacks = {};
const RETRIES_ON_RATE_LIMIT = 4;

View File

@ -19,6 +19,7 @@ export default class UserController extends Controller {
@optionalService adminTools;
@controller("user-notifications") userNotifications;
@setting("moderators_view_emails") canModeratorsViewEmails;
@equal("router.currentRouteName", "user.summary") isSummaryRoute;

View File

@ -1,5 +1,6 @@
import { next } from "@ember/runloop";
import getURL from "discourse/lib/get-url";
let _started = false;
let cache = {};
let transitionCount = 0;

View File

@ -13,6 +13,7 @@ export default class PostBookmarkManager {
@service currentUser;
@service bookmarkApi;
@controller("topic") topicController;
@tracked trackedBookmark;
@tracked bookmarkModel;

View File

@ -9,6 +9,7 @@ export default class TopicBookmarkManager {
@service currentUser;
@service bookmarkApi;
@controller("topic") topicController;
@tracked trackedBookmark;
@tracked bookmarkModel;

View File

@ -44,6 +44,7 @@ export default class Group extends RestModel {
requestersOffset = null;
@equal("mentionable_level", 99) canEveryoneMention;
init() {
super.init(...arguments);
this.setProperties({ members: [], requesters: [] });

View File

@ -1,4 +1,5 @@
import deprecated from "discourse/lib/deprecated";
export { default, flushMap } from "discourse/services/store";
deprecated(

View File

@ -10,6 +10,7 @@ export default class InterfaceColor extends Service {
@service appEvents;
@service siteSettings;
@service session;
@tracked forcedColorMode;
get lightModeForced() {

View File

@ -62,6 +62,7 @@ class Timer {
@disableImplicitInjections
export default class LoadingSlider extends Service.extend(Evented) {
@service siteSettings;
@tracked loading = false;
@tracked stillLoading = false;

View File

@ -17,6 +17,7 @@ export const UNSCROLLED = Symbol("unscrolled"),
@disableImplicitInjections
export default class ScrollDirection extends Service {
@service router;
@tracked lastScrollDirection = UNSCROLLED;
#lastScroll = null;

View File

@ -10,6 +10,7 @@ acceptance("Acceptance | decorateCookedElement", function () {
test("decorator with renderGlimmer works", async function (assert) {
class DemoComponent extends Component {
static eventLog = [];
constructor() {
DemoComponent.eventLog.push("created");
super(...arguments);

View File

@ -16,6 +16,7 @@ class CatAdapter extends RestAdapter {
class CachedCatAdapter extends RestAdapter {
primaryKey = "cat_id";
cache = true;
apiNameFor() {
return "cat";
}

View File

@ -1,4 +1,5 @@
import { set } from "@ember/object";
export default function (helpers) {
const { response } = helpers;

View File

@ -232,6 +232,7 @@ module("Unit | class-prepend", function () {
(Superclass) =>
class extends Superclass {
static someStaticField = this;
static someStaticMethod() {
return this;
}

View File

@ -5,6 +5,7 @@ import {
grantableBadges,
isBadgeGrantable,
} from "discourse/lib/grant-badge-utils";
module("Unit | Utility | Grant Badge", function (hooks) {
setupTest(hooks);

View File

@ -217,6 +217,7 @@ module("Unit | Utils | decorators", function (hooks) {
withSilencedDeprecations("discourse.utils-decorators-observes", () => {
NativeClassWithObserver = class extends EmberObject {
counter = 0;
@observes("value")
incrementCounter() {
this.set("counter", this.counter + 1);
@ -257,6 +258,7 @@ module("Unit | Utils | decorators", function (hooks) {
withSilencedDeprecations("discourse.utils-decorators-on", () => {
NativeClassWithOn = class extends EmberObject {
counter = 0;
@on("init")
incrementCounter() {
this.set("counter", this.counter + 1);

View File

@ -3,6 +3,7 @@ import { classNames } from "@ember-decorators/component";
import { i18n } from "discourse-i18n";
import NotificationOptionsComponent from "select-kit/components/notifications-button";
import { pluginApiIdentifiers, selectKitOptions } from "./select-kit";
@selectKitOptions({
i18nPrefix: "category.notifications",
showFullTitle: false,

View File

@ -21,6 +21,7 @@ export default class CategorySelector extends MultiSelectComponent {
blockedCategories = null;
@mapBy("categories", "id") value;
init() {
super.init(...arguments);

View File

@ -18,6 +18,7 @@ export default class SelectKitFilter extends Component.extend(UtilsMixin) {
tabIndex = -1;
@not("isHidden") isExpanded;
@computed(
"selectKit.options.{filterable,allowAny,autoFilterable}",
"content.[]"

View File

@ -39,6 +39,7 @@ export default class SelectKitRow extends Component.extend(UtilsMixin) {
role = "menuitemradio";
@reads("item.lang") lang;
didInsertElement() {
super.didInsertElement(...arguments);

View File

@ -4,15 +4,8 @@ export default [
...DiscourseRecommended,
{
rules: {
"ember/no-classic-classes": "error",
"discourse/i18n-import-location": "error",
"discourse/i18n-t": "error",
"discourse/discourse-common-imports": "error",
"qunit/no-assert-equal-boolean": "error",
"qunit/no-assert-equal": "error",
"qunit/no-loose-assertions": "error",
"qunit/no-negated-ok": "error",
"qunit/no-ok-equality": "error",
},
},
{

View File

@ -6,7 +6,7 @@
"license": "GPL-2.0-only",
"devDependencies": {
"@babel/plugin-proposal-decorators": "^7.25.9",
"@discourse/lint-configs": "^2.9.0",
"@discourse/lint-configs": "^2.11.0",
"@discourse/moment-timezone-names-translations": "^1.0.0",
"@fortawesome/fontawesome-free": "6.7.2",
"@glint/core": "1.4.1-unstable.34c4510",
@ -20,9 +20,9 @@
"chrome-launcher": "^1.1.2",
"chrome-remote-interface": "^0.33.3",
"concurrently": "^9.1.2",
"ember-template-lint": "7.0.0",
"ember-template-lint": "7.0.1",
"esbuild": "^0.25.0",
"eslint": "9.21.0",
"eslint": "9.22.0",
"jsdoc": "^4.0.4",
"lefthook": "^1.11.3",
"licensee": "^11.1.1",

View File

@ -9,6 +9,7 @@ import DAFieldLabel from "./da-field-label";
export default class GroupField extends BaseField {
@service store;
@tracked allCustomFields = [];
<template>

View File

@ -10,6 +10,7 @@ import DAFieldLabel from "./da-field-label";
export default class GroupField extends BaseField {
@service store;
@tracked allCustomFields = [];
<template>

View File

@ -10,6 +10,7 @@ import { i18n } from "discourse-i18n";
export default class AutomationEdit extends Controller {
@service dialog;
@service router;
error = null;
isUpdatingAutomation = false;
isTriggeringAutomation = false;

View File

@ -5,6 +5,7 @@ import { service } from "@ember/service";
export default class AutomationNew extends Controller {
@service router;
@tracked filterText = "";
@action

View File

@ -7,6 +7,7 @@ import ChatFabricators from "discourse/plugins/chat/discourse/lib/fabricators";
export default class ChatStyleguideChatThreadListItem extends Component {
@service currentUser;
@tracked thread;
constructor() {

View File

@ -22,6 +22,7 @@ export default class ChatChannelsManager extends Service {
@service router;
@service site;
@service siteSettings;
@tracked _cached = new TrackedObject();
async find(id, options = { fetchIfNotFound: true }) {

462
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff