DEV: Import discourse-plugin-skeleton files, fix errors (#22)

DEV: Import discourse-plugin-skeleton files, fix errors (#22)

Includes:

  • DEV: Import discourse-plugin-skeleton files
  • DEV: Change category ids to avoid clashing with core fixtures
  • DEV: Deep clone fixtures to avoid pollution
  • DEV: Don’t override computed properties in tests
  • FIX: Logical error (All numbers are truthy in ruby)
  • DEV: Use query/queryAll instead of find
  • DEV: Fix the edit button class in tests
  • DEV: Fix rubocop issues
  • DEV: Fix eslint issues
  • DEV: Fix ember-template-lint issues
  • DEV: Run prettier
  • DEV: Fix Gemfile.lock platforms
  • DEV: Merge two Category.reopen calls
diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 0000000..7898fbf
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,3 @@
+{
+  "extends": "eslint-config-discourse"
+}
diff --git a/.github/workflows/plugin-linting.yml b/.github/workflows/plugin-linting.yml
new file mode 100644
index 0000000..3d7f6d9
--- /dev/null
+++ b/.github/workflows/plugin-linting.yml
@@ -0,0 +1,52 @@
+name: Linting
+
+on:
+  push:
+    branches:
+      - master
+      - main
+  pull_request:
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+
+    steps:
+      - uses: actions/checkout@v2
+
+      - name: Set up Node.js
+        uses: actions/setup-node@v1
+        with:
+          node-version: 12
+
+      - name: Set up ruby
+        uses: ruby/setup-ruby@v1
+        with:
+          ruby-version: 2.7
+          bundler-cache: true
+
+      - name: Yarn install
+        run: yarn install
+
+      - name: ESLint
+        if: ${{ always() }}
+        run: yarn eslint --ext .js,.js.es6 --no-error-on-unmatched-pattern {test,assets}/javascripts
+
+      - name: Prettier
+        if: ${{ always() }}
+        run: |
+          yarn prettier -v
+          if [ -d "assets" ]; then \
+            yarn prettier --list-different "assets/**/*.{scss,js,es6}" ; \
+          fi
+          if [ -d "test" ]; then \
+            yarn prettier --list-different "test/**/*.{js,es6}" ; \
+          fi
+
+      - name: Ember template lint
+        if: ${{ always() }}
+        run: yarn ember-template-lint assets/javascripts
+
+      - name: Rubocop
+        if: ${{ always() }}
+        run: bundle exec rubocop .
diff --git a/.github/workflows/plugin-tests.yml b/.github/workflows/plugin-tests.yml
new file mode 100644
index 0000000..cf0a527
--- /dev/null
+++ b/.github/workflows/plugin-tests.yml
@@ -0,0 +1,131 @@
+name: Plugin Tests
+
+on:
+  push:
+    branches:
+      - master
+      - main
+  pull_request:
+
+jobs:
+  build:
+    name: ${{ matrix.build_type }}
+    runs-on: ubuntu-latest
+    container: discourse/discourse_test:release
+    timeout-minutes: 60
+
+    env:
+      DISCOURSE_HOSTNAME: www.example.com
+      RUBY_GLOBAL_METHOD_CACHE_SIZE: 131072
+      RAILS_ENV: test
+      PGHOST: postgres
+      PGUSER: discourse
+      PGPASSWORD: discourse
+
+    strategy:
+      fail-fast: false
+
+      matrix:
+        build_type: ["backend", "frontend"]
+        ruby: ["2.7"]
+        postgres: ["12"]
+        redis: ["4.x"]
+
+    services:
+      postgres:
+        image: postgres:${{ matrix.postgres }}
+        ports:
+          - 5432:5432
+        env:
+          POSTGRES_USER: discourse
+          POSTGRES_PASSWORD: discourse
+        options: >-
+          --mount type=tmpfs,destination=/var/lib/postgresql/data
+          --health-cmd pg_isready
+          --health-interval 10s
+          --health-timeout 5s
+          --health-retries 5
+
+    steps:
+      - uses: actions/checkout@v2
+        with:
+          repository: discourse/discourse
+          fetch-depth: 1
+
+      - name: Install plugin
+        uses: actions/checkout@v2
+        with:
+          path: plugins/${{ github.event.repository.name }}
+          fetch-depth: 1
+
+      - name: Check spec existence
+        id: check_spec
+        uses: andstor/file-existence-action@v1
+        with:
+          files: "plugins/${{ github.event.repository.name }}/spec"
+
+      - name: Check qunit existence
+        id: check_qunit
+        uses: andstor/file-existence-action@v1
+        with:
+          files: "plugins/${{ github.event.repository.name }}/test/javascripts"
+
+      - name: Setup Git
+        run: |
+          git config --global user.email "ci@ci.invalid"
+          git config --global user.name "Discourse CI"
+
+      - name: Setup redis
+        uses: shogo82148/actions-setup-redis@v1
+        with:
+          redis-version: ${{ matrix.redis }}
+
+      - name: Bundler cache
+        uses: actions/cache@v2
+        with:
+          path: vendor/bundle
+          key: ${{ runner.os }}-${{ matrix.ruby }}-gem-${{ hashFiles('**/Gemfile.lock') }}
+          restore-keys: |
+            ${{ runner.os }}-${{ matrix.ruby }}-gem-
+
+      - name: Setup gems
+        run: |
+          bundle config --local path vendor/bundle
+          bundle config --local deployment true
+          bundle config --local without development
+          bundle install --jobs 4
+          bundle clean
+
+      - name: Lint English locale
+        if: matrix.build_type == 'backend'
+        run: bundle exec ruby script/i18n_lint.rb "plugins/${{ github.event.repository.name }}/locales/{client,server}.en.yml"
+
+      - name: Get yarn cache directory
+        id: yarn-cache-dir
+        run: echo "::set-output name=dir::$(yarn cache dir)"
+
+      - name: Yarn cache
+        uses: actions/cache@v2
+        id: yarn-cache
+        with:
+          path: ${{ steps.yarn-cache-dir.outputs.dir }}
+          key: ${{ runner.os }}-${{ matrix.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+          restore-keys: |
+            ${{ runner.os }}-${{ matrix.os }}-yarn-
+
+      - name: Yarn install
+        run: yarn install
+
+      - name: Migrate database
+        run: |
+          bin/rake db:create
+          bin/rake db:migrate
+
+      - name: Plugin RSpec
+        if: matrix.build_type == 'backend' && steps.check_spec.outputs.files_exists == 'true'
+        run: bin/rake plugin:spec[${{ github.event.repository.name }}]
+
+      - name: Plugin QUnit
+        if: matrix.build_type == 'frontend' && steps.check_qunit.outputs.files_exists == 'true'
+        run: bundle exec rake plugin:qunit['${{ github.event.repository.name }}','1200000']
+        timeout-minutes: 30
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+node_modules
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1 @@
+{}
diff --git a/.rubocop.yml b/.rubocop.yml
new file mode 100644
index 0000000..d46296c
--- /dev/null
+++ b/.rubocop.yml
@@ -0,0 +1,2 @@
+inherit_gem:
+  rubocop-discourse: default.yml
diff --git a/.template-lintrc.js b/.template-lintrc.js
new file mode 100644
index 0000000..a558b8e
--- /dev/null
+++ b/.template-lintrc.js
@@ -0,0 +1,4 @@
+module.exports = {
+  plugins: ["ember-template-lint-plugin-discourse"],
+  extends: "discourse:recommended",
+};
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..7da32ec
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+source 'https://rubygems.org'
+
+group :development do
+  gem 'rubocop-discourse'
+end
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 0000000..bfc5781
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,43 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    ast (2.4.2)
+    parallel (1.20.1)
+    parser (3.0.0.0)
+      ast (~> 2.4.1)
+    rainbow (3.0.0)
+    regexp_parser (2.1.1)
+    rexml (3.2.4)
+    rubocop (1.12.0)
+      parallel (~> 1.10)
+      parser (>= 3.0.0.0)
+      rainbow (>= 2.2.2, < 4.0)
+      regexp_parser (>= 1.8, < 3.0)
+      rexml
+      rubocop-ast (>= 1.2.0, < 2.0)
+      ruby-progressbar (~> 1.7)
+      unicode-display_width (>= 1.4.0, < 3.0)
+    rubocop-ast (1.4.1)
+      parser (>= 2.7.1.5)
+    rubocop-discourse (2.4.1)
+      rubocop (>= 1.1.0)
+      rubocop-rspec (>= 2.0.0)
+    rubocop-rspec (2.2.0)
+      rubocop (~> 1.0)
+      rubocop-ast (>= 1.1.0)
+    ruby-progressbar (1.11.0)
+    unicode-display_width (2.0.0)
+
+PLATFORMS
+  arm64-darwin-20
+  ruby
+  x86_64-darwin-18
+  x86_64-darwin-19
+  x86_64-darwin-20
+  x86_64-linux
+
+DEPENDENCIES
+  rubocop-discourse
+
+BUNDLED WITH
+   2.2.13
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..07206a0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2021 Civilized Discourse Construction Kit
+
+Permission is hereby granted, free of charge, to any person obtaining a copy

[... diff too long, it was truncated ...]

GitHub sha: 76019d06

This commit appears in #22 which was approved by markvanlan. It was merged by CvX.