Compare commits
232 commits
kb_develop
...
kb_lts
Author | SHA1 | Date | |
---|---|---|---|
|
8b6e55b8dc | ||
|
6a9212459f | ||
|
46fec44ecc | ||
|
898e89bfad | ||
|
c33fea88b2 | ||
|
7e47439787 | ||
|
245a74f9ca | ||
|
d2842db18d | ||
|
346c37df80 | ||
|
20f06798a0 | ||
|
e66aaee1a4 | ||
|
9bfbba3224 | ||
|
378af3a0a0 | ||
|
d096965eec | ||
|
2abaa9b68a | ||
|
df36f12d46 | ||
|
0e8f23ebee | ||
|
3c851f2d21 | ||
|
af63f9564c | ||
|
b6278e0d39 | ||
|
ec9644b9a6 | ||
|
4e94e72911 | ||
|
836c02d816 | ||
|
8bc6f3c73c | ||
|
f9a929ed5c | ||
|
d675803f07 | ||
|
a2d3de48f4 | ||
|
a53ec866d5 | ||
|
3ab66262de | ||
|
a02ff33f0e | ||
|
a652293842 | ||
|
63ad8254ff | ||
|
8fe1cefe4c | ||
|
86f15cef66 | ||
|
49820ecefa | ||
|
9d2e59bb45 | ||
|
6fcb1f5799 | ||
|
297ad9aeb8 | ||
|
e1be281e3d | ||
|
c06436eb91 | ||
|
d1854798c9 | ||
|
a2c7f7f690 | ||
|
6f2a3fa5d1 | ||
|
7b7d404efe | ||
|
0fc738a323 | ||
|
5cb36daa0f | ||
|
a8039dda13 | ||
|
0a345ad5e1 | ||
|
29c35ef4f9 | ||
|
13bab94265 | ||
|
161aa0f8f6 | ||
|
fe92b241b2 | ||
|
a5641a9244 | ||
|
31ad8c7fdf | ||
|
77b7b8caaa | ||
|
6896542a76 | ||
|
a5b4a2b7e7 | ||
|
d4bf22b632 | ||
|
4fb4721072 | ||
|
df974a912b | ||
|
6cd9bd6ae1 | ||
|
9b6219c48f | ||
|
88b2d6eca5 | ||
|
846f59c6e9 | ||
|
17f69c0002 | ||
|
1e87634a43 | ||
|
5fd7cd79e0 | ||
|
fcae9435ec | ||
|
55408f8085 | ||
|
3f75c6f048 | ||
|
bfc287fd6b | ||
|
19ed22dc58 | ||
|
520b2086af | ||
|
e925fd6802 | ||
|
75d7e4fbdd | ||
|
e511b02de5 | ||
|
441c8712e1 | ||
|
cc2bfe5188 | ||
|
c2a19f8a81 | ||
|
c93aacafde | ||
|
9740c7eaea | ||
|
8ab0ca7d64 | ||
|
7920aa59e8 | ||
|
943792c187 | ||
|
186f916192 | ||
|
f9c41ae43b | ||
|
b8edc95e8a | ||
|
16213a678d | ||
|
a8dd32102f | ||
|
6fc07ff31f | ||
|
997b021b69 | ||
|
2865bfadaf | ||
|
8c72e80019 | ||
|
8cf78825a2 | ||
|
67b2e62331 | ||
|
56b7d1a7b6 | ||
|
51ef619140 | ||
|
e69780ec59 | ||
|
c3be5a3d2e | ||
|
86807e4799 | ||
|
0143c9d3e1 | ||
|
ab3f9852f2 | ||
|
7af69f5cf5 | ||
|
f784213c64 | ||
|
6536d96d1b | ||
|
ed8e4bab4c | ||
|
6a5ea61928 | ||
|
c329c56625 | ||
|
6ba77a9feb | ||
|
631a037524 | ||
|
bdb6650ebc | ||
|
f3ad918950 | ||
|
9a7802655f | ||
|
328a9b8157 | ||
|
4fd22acb4a | ||
|
28b666b0d5 | ||
|
fbb07893b8 | ||
|
4fbaadaf1b | ||
|
c5d56de98d | ||
|
e8c1a13dd4 | ||
|
188d9bdbf6 | ||
|
f6588fe079 | ||
|
0e4e98fad1 | ||
|
15de520201 | ||
|
684f99908f | ||
|
55581c9335 | ||
|
7d3899d5c9 | ||
|
f0a1dc1f1e | ||
|
35f830b7ec | ||
|
d0cc051298 | ||
|
9190f53d7b | ||
|
d9b9e66bb5 | ||
|
e4ec4ce217 | ||
|
870ee80fd3 | ||
|
76a37bd040 | ||
|
7c8ca0c6d6 | ||
|
f1700523f1 | ||
|
0b0c7af2c1 | ||
|
1a33d348d0 | ||
|
6d43b63275 | ||
|
ae2dce813a | ||
|
b7230cd759 | ||
|
5274a399d6 | ||
|
3bae139748 | ||
|
088c8482ff | ||
|
0cdc6faa46 | ||
|
8a306337e5 | ||
|
a6641f828b | ||
|
58969aed33 | ||
|
ae71ed50e8 | ||
|
1d42b6b82f | ||
|
4633bb8ce0 | ||
|
1ab050eb52 | ||
|
4eb98ef755 | ||
|
7a22999f92 | ||
|
c5c464804d | ||
|
779237f054 | ||
|
b377f82b1d | ||
|
6fe2a47357 | ||
|
2dbf176d23 | ||
|
499bc716a5 | ||
|
3837ec2227 | ||
|
1998c561b2 | ||
|
c0a9db3611 | ||
|
01caa18e5b | ||
|
c609b726cb | ||
|
4d96d716c4 | ||
|
3ecc991f63 | ||
|
8f2dac0567 | ||
|
dfc8fcc6f0 | ||
|
e8c5754142 | ||
|
0a01bc01d2 | ||
|
a12b7551cf | ||
|
7abc61887f | ||
|
279be07679 | ||
|
11db9e44b1 | ||
|
eb280d93a9 | ||
|
49d561178d | ||
|
33f254be42 | ||
|
ad7f23556b | ||
|
b21c0458b6 | ||
|
4a5f0f9259 | ||
|
4f6d89f161 | ||
|
5ba8141df9 | ||
|
4b10bf23ab | ||
|
aa5e50e5d5 | ||
|
3e4bd83326 | ||
|
e17ddc1b6a | ||
|
7edb05337e | ||
|
267e9cbcc8 | ||
|
06123147d5 | ||
|
d7875adad2 | ||
|
e227885d0b | ||
|
38105dfbaa | ||
|
e8b6c16b52 | ||
|
e9b69478d1 | ||
|
0dec7b450b | ||
|
5cce294953 | ||
|
f0a8bad941 | ||
|
d79c88394b | ||
|
4f62dbdd64 | ||
|
90371a4fc4 | ||
|
71b60b09f4 | ||
|
2af8b653cb | ||
|
5863a7756e | ||
|
9310c1c81b | ||
|
4b8fe9df73 | ||
|
7b9496322f | ||
|
09115731d6 | ||
|
e11100d782 | ||
|
252ea2fc67 | ||
|
8d02e58ff4 | ||
|
1076a6cd62 | ||
|
54a07731d1 | ||
|
81d7cfd544 | ||
|
e6f4c91c5c | ||
|
de86e822f4 | ||
|
4c38706474 | ||
|
4fc2523546 | ||
|
d5bc10b711 | ||
|
c66ade7de8 | ||
|
bece853e3c | ||
|
700ae1f918 | ||
|
13205b54fd | ||
|
8be33d4316 | ||
|
cdedae6d63 | ||
|
aa69ca74ed | ||
|
156d32689b | ||
|
ef149674f0 | ||
|
129705db44 | ||
|
8383288219 | ||
|
eea2654236 |
4847 changed files with 120699 additions and 229286 deletions
|
@ -1,59 +0,0 @@
|
||||||
---
|
|
||||||
:position: before
|
|
||||||
:position_in_additional_file_patterns: before
|
|
||||||
:position_in_class: before
|
|
||||||
:position_in_factory: before
|
|
||||||
:position_in_fixture: before
|
|
||||||
:position_in_routes: before
|
|
||||||
:position_in_serializer: before
|
|
||||||
:position_in_test: before
|
|
||||||
:classified_sort: true
|
|
||||||
:exclude_controllers: true
|
|
||||||
:exclude_factories: true
|
|
||||||
:exclude_fixtures: true
|
|
||||||
:exclude_helpers: true
|
|
||||||
:exclude_scaffolds: true
|
|
||||||
:exclude_serializers: true
|
|
||||||
:exclude_sti_subclasses: true
|
|
||||||
:exclude_tests: true
|
|
||||||
:force: false
|
|
||||||
:format_markdown: false
|
|
||||||
:format_rdoc: false
|
|
||||||
:format_yard: false
|
|
||||||
:frozen: false
|
|
||||||
:ignore_model_sub_dir: false
|
|
||||||
:ignore_unknown_models: false
|
|
||||||
:include_version: false
|
|
||||||
:show_complete_foreign_keys: false
|
|
||||||
:show_foreign_keys: false
|
|
||||||
:show_indexes: false
|
|
||||||
:simple_indexes: false
|
|
||||||
:sort: false
|
|
||||||
:timestamp: false
|
|
||||||
:trace: false
|
|
||||||
:with_comment: true
|
|
||||||
:with_column_comments: true
|
|
||||||
:with_table_comments: true
|
|
||||||
:active_admin: false
|
|
||||||
:command:
|
|
||||||
:debug: false
|
|
||||||
:hide_default_column_types: ''
|
|
||||||
:hide_limit_column_types: 'integer,boolean'
|
|
||||||
:ignore_columns:
|
|
||||||
:ignore_routes:
|
|
||||||
:models: true
|
|
||||||
:routes: false
|
|
||||||
:skip_on_db_migrate: false
|
|
||||||
:target_action: :do_annotations
|
|
||||||
:wrapper:
|
|
||||||
:wrapper_close:
|
|
||||||
:wrapper_open:
|
|
||||||
:classes_default_to_s: []
|
|
||||||
:additional_file_patterns: []
|
|
||||||
:model_dir:
|
|
||||||
- app/models
|
|
||||||
:require: []
|
|
||||||
:root_dir:
|
|
||||||
- ''
|
|
||||||
|
|
||||||
:show_check_constraints: false
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
[production]
|
||||||
defaults
|
defaults
|
||||||
> 0.2%
|
not IE 11
|
||||||
firefox >= 78
|
|
||||||
ios >= 15.6
|
|
||||||
not dead
|
not dead
|
||||||
not OperaMini all
|
|
||||||
|
[development]
|
||||||
|
supports es6-module
|
||||||
|
|
10
.bundler-audit.yml
Normal file
10
.bundler-audit.yml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
ignore:
|
||||||
|
# devise-two-factor advisory about brute-forcing TOTP
|
||||||
|
# We have rate-limits on authentication endpoints in place (including second
|
||||||
|
# factor verification) since Mastodon v3.2.0
|
||||||
|
- CVE-2024-0227
|
||||||
|
# devise-two-factor advisory about generated secrets being weaker than expected
|
||||||
|
# We call `generate_otp_secret` ourselves with a requested length of 32 characters,
|
||||||
|
# which exceeds the recommended remediation of 26 characters, so we're safe
|
||||||
|
- CVE-2024-8796
|
|
@ -1,18 +1,20 @@
|
||||||
# For details, see https://github.com/devcontainers/images/tree/main/src/ruby
|
# For details, see https://github.com/devcontainers/images/tree/main/src/ruby
|
||||||
FROM mcr.microsoft.com/devcontainers/ruby:1-3.3-bookworm
|
FROM mcr.microsoft.com/devcontainers/ruby:1-3.2-bullseye
|
||||||
|
|
||||||
# Install node version from .nvmrc
|
# Install Rails
|
||||||
WORKDIR /app
|
# RUN gem install rails webdrivers
|
||||||
COPY .nvmrc .
|
|
||||||
RUN /bin/bash --login -i -c "nvm install"
|
|
||||||
|
|
||||||
# Install additional OS packages
|
ARG NODE_VERSION="16"
|
||||||
RUN apt-get update && \
|
RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"
|
||||||
export DEBIAN_FRONTEND=noninteractive && \
|
|
||||||
apt-get -y install --no-install-recommends libicu-dev libidn11-dev ffmpeg imagemagick libvips42 libpam-dev
|
|
||||||
|
|
||||||
# Disable download prompt for Corepack
|
# [Optional] Uncomment this section to install additional OS packages.
|
||||||
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0
|
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
|
||||||
|
&& apt-get -y install --no-install-recommends libicu-dev libidn11-dev ffmpeg imagemagick libpam-dev
|
||||||
|
|
||||||
# Move welcome message to where VS Code expects it
|
# [Optional] Uncomment this line to install additional gems.
|
||||||
COPY .devcontainer/welcome-message.txt /usr/local/etc/vscode-dev-containers/first-run-notice.txt
|
RUN gem install foreman
|
||||||
|
|
||||||
|
# [Optional] Uncomment this line to install global node packages.
|
||||||
|
RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g yarn" 2>&1
|
||||||
|
|
||||||
|
COPY welcome-message.txt /usr/local/etc/vscode-dev-containers/first-run-notice.txt
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "Mastodon on GitHub Codespaces",
|
"name": "Mastodon on GitHub Codespaces",
|
||||||
"dockerComposeFile": "../compose.yaml",
|
"dockerComposeFile": "../docker-compose.yml",
|
||||||
"service": "app",
|
"service": "app",
|
||||||
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
|
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
|
||||||
|
|
||||||
|
@ -23,8 +23,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"remoteUser": "root",
|
|
||||||
|
|
||||||
"otherPortsAttributes": {
|
"otherPortsAttributes": {
|
||||||
"onAutoForward": "silent"
|
"onAutoForward": "silent"
|
||||||
},
|
},
|
||||||
|
@ -39,7 +37,7 @@
|
||||||
},
|
},
|
||||||
|
|
||||||
"onCreateCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}",
|
"onCreateCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}",
|
||||||
"postCreateCommand": "bin/setup",
|
"postCreateCommand": ".devcontainer/post-create.sh",
|
||||||
"waitFor": "postCreateCommand",
|
"waitFor": "postCreateCommand",
|
||||||
|
|
||||||
"customizations": {
|
"customizations": {
|
||||||
|
|
|
@ -1,91 +0,0 @@
|
||||||
services:
|
|
||||||
app:
|
|
||||||
working_dir: /workspaces/mastodon/
|
|
||||||
build:
|
|
||||||
context: ..
|
|
||||||
dockerfile: .devcontainer/Dockerfile
|
|
||||||
volumes:
|
|
||||||
- ..:/workspaces/mastodon:cached
|
|
||||||
environment:
|
|
||||||
RAILS_ENV: development
|
|
||||||
NODE_ENV: development
|
|
||||||
BIND: 0.0.0.0
|
|
||||||
BOOTSNAP_CACHE_DIR: /tmp
|
|
||||||
REDIS_HOST: redis
|
|
||||||
REDIS_PORT: '6379'
|
|
||||||
DB_HOST: db
|
|
||||||
DB_USER: postgres
|
|
||||||
DB_PASS: postgres
|
|
||||||
DB_PORT: '5432'
|
|
||||||
ES_ENABLED: 'true'
|
|
||||||
ES_HOST: es
|
|
||||||
ES_PORT: '9200'
|
|
||||||
LIBRE_TRANSLATE_ENDPOINT: http://libretranslate:5000
|
|
||||||
LOCAL_DOMAIN: ${LOCAL_DOMAIN:-localhost:3000}
|
|
||||||
# Overrides default command so things don't shut down after the process ends.
|
|
||||||
command: sleep infinity
|
|
||||||
ports:
|
|
||||||
- '3000:3000'
|
|
||||||
- '3035:3035'
|
|
||||||
- '4000:4000'
|
|
||||||
networks:
|
|
||||||
- external_network
|
|
||||||
- internal_network
|
|
||||||
|
|
||||||
db:
|
|
||||||
image: postgres:14-alpine
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- postgres-data:/var/lib/postgresql/data
|
|
||||||
environment:
|
|
||||||
POSTGRES_USER: postgres
|
|
||||||
POSTGRES_DB: postgres
|
|
||||||
POSTGRES_PASSWORD: postgres
|
|
||||||
POSTGRES_HOST_AUTH_METHOD: trust
|
|
||||||
networks:
|
|
||||||
- internal_network
|
|
||||||
|
|
||||||
redis:
|
|
||||||
image: redis:7-alpine
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- redis-data:/data
|
|
||||||
networks:
|
|
||||||
- internal_network
|
|
||||||
|
|
||||||
es:
|
|
||||||
image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
|
|
||||||
restart: unless-stopped
|
|
||||||
environment:
|
|
||||||
ES_JAVA_OPTS: -Xms512m -Xmx512m
|
|
||||||
cluster.name: es-mastodon
|
|
||||||
discovery.type: single-node
|
|
||||||
bootstrap.memory_lock: 'true'
|
|
||||||
volumes:
|
|
||||||
- es-data:/usr/share/elasticsearch/data
|
|
||||||
networks:
|
|
||||||
- internal_network
|
|
||||||
ulimits:
|
|
||||||
memlock:
|
|
||||||
soft: -1
|
|
||||||
hard: -1
|
|
||||||
|
|
||||||
libretranslate:
|
|
||||||
image: libretranslate/libretranslate:v1.6.2
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- lt-data:/home/libretranslate/.local
|
|
||||||
networks:
|
|
||||||
- external_network
|
|
||||||
- internal_network
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
postgres-data:
|
|
||||||
redis-data:
|
|
||||||
es-data:
|
|
||||||
lt-data:
|
|
||||||
|
|
||||||
networks:
|
|
||||||
external_network:
|
|
||||||
internal_network:
|
|
||||||
internal: true
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "Mastodon on local machine",
|
"name": "Mastodon on local machine",
|
||||||
"dockerComposeFile": "compose.yaml",
|
"dockerComposeFile": "docker-compose.yml",
|
||||||
"service": "app",
|
"service": "app",
|
||||||
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
|
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
|
||||||
|
|
||||||
|
@ -23,14 +23,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"remoteUser": "root",
|
|
||||||
|
|
||||||
"otherPortsAttributes": {
|
"otherPortsAttributes": {
|
||||||
"onAutoForward": "silent"
|
"onAutoForward": "silent"
|
||||||
},
|
},
|
||||||
|
|
||||||
"onCreateCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}",
|
"onCreateCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}",
|
||||||
"postCreateCommand": "bin/setup",
|
"postCreateCommand": ".devcontainer/post-create.sh",
|
||||||
"waitFor": "postCreateCommand",
|
"waitFor": "postCreateCommand",
|
||||||
|
|
||||||
"customizations": {
|
"customizations": {
|
||||||
|
|
90
.devcontainer/docker-compose.yml
Normal file
90
.devcontainer/docker-compose.yml
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
version: '3'
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
volumes:
|
||||||
|
- ../..:/workspaces:cached
|
||||||
|
environment:
|
||||||
|
RAILS_ENV: development
|
||||||
|
NODE_ENV: development
|
||||||
|
BIND: 0.0.0.0
|
||||||
|
REDIS_HOST: redis
|
||||||
|
REDIS_PORT: '6379'
|
||||||
|
DB_HOST: db
|
||||||
|
DB_USER: postgres
|
||||||
|
DB_PASS: postgres
|
||||||
|
DB_PORT: '5432'
|
||||||
|
ES_ENABLED: 'true'
|
||||||
|
ES_HOST: es
|
||||||
|
ES_PORT: '9200'
|
||||||
|
LIBRE_TRANSLATE_ENDPOINT: http://libretranslate:5000
|
||||||
|
# Overrides default command so things don't shut down after the process ends.
|
||||||
|
command: sleep infinity
|
||||||
|
ports:
|
||||||
|
- '127.0.0.1:3000:3000'
|
||||||
|
- '127.0.0.1:3035:3035'
|
||||||
|
- '127.0.0.1:4000:4000'
|
||||||
|
networks:
|
||||||
|
- external_network
|
||||||
|
- internal_network
|
||||||
|
|
||||||
|
db:
|
||||||
|
image: postgres:14-alpine
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- postgres-data:/var/lib/postgresql/data
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
POSTGRES_DB: postgres
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
POSTGRES_HOST_AUTH_METHOD: trust
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:7-alpine
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- redis-data:/data
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
|
||||||
|
es:
|
||||||
|
image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
ES_JAVA_OPTS: -Xms512m -Xmx512m
|
||||||
|
cluster.name: es-mastodon
|
||||||
|
discovery.type: single-node
|
||||||
|
bootstrap.memory_lock: 'true'
|
||||||
|
volumes:
|
||||||
|
- es-data:/usr/share/elasticsearch/data
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
ulimits:
|
||||||
|
memlock:
|
||||||
|
soft: -1
|
||||||
|
hard: -1
|
||||||
|
|
||||||
|
libretranslate:
|
||||||
|
image: libretranslate/libretranslate:v1.3.11
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- lt-data:/home/libretranslate/.local
|
||||||
|
networks:
|
||||||
|
- external_network
|
||||||
|
- internal_network
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
postgres-data:
|
||||||
|
redis-data:
|
||||||
|
es-data:
|
||||||
|
lt-data:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
external_network:
|
||||||
|
internal_network:
|
||||||
|
internal: true
|
26
.devcontainer/post-create.sh
Executable file
26
.devcontainer/post-create.sh
Executable file
|
@ -0,0 +1,26 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e # Fail the whole script on first error
|
||||||
|
|
||||||
|
# Fetch Ruby gem dependencies
|
||||||
|
bundle config path 'vendor/bundle'
|
||||||
|
bundle config with 'development test'
|
||||||
|
bundle install
|
||||||
|
|
||||||
|
# Make Gemfile.lock pristine again
|
||||||
|
git checkout -- Gemfile.lock
|
||||||
|
|
||||||
|
# Fetch Javascript dependencies
|
||||||
|
yarn --frozen-lockfile
|
||||||
|
|
||||||
|
# [re]create, migrate, and seed the test database
|
||||||
|
RAILS_ENV=test ./bin/rails db:setup
|
||||||
|
|
||||||
|
# [re]create, migrate, and seed the development database
|
||||||
|
RAILS_ENV=development ./bin/rails db:setup
|
||||||
|
|
||||||
|
# Precompile assets for development
|
||||||
|
RAILS_ENV=development ./bin/rails assets:precompile
|
||||||
|
|
||||||
|
# Precompile assets for test
|
||||||
|
RAILS_ENV=test NODE_ENV=tests ./bin/rails assets:precompile
|
|
@ -1,7 +1,8 @@
|
||||||
👋 Welcome to your Mastodon Dev Container!
|
👋 Welcome to "Mastodon" in GitHub Codespaces!
|
||||||
|
|
||||||
🛠️ Your environment is fully setup with all the required software.
|
🛠️ Your environment is fully setup with all the required software.
|
||||||
|
|
||||||
💥 Run `bin/dev` to start the application processes.
|
🔍 To explore VS Code to its fullest, search using the Command Palette (Cmd/Ctrl + Shift + P or F1).
|
||||||
|
|
||||||
|
📝 Edit away, run your app as usual, and we'll automatically make it available for you to access.
|
||||||
|
|
||||||
🥼 Run `RAILS_ENV=test bin/rails assets:precompile && RAILS_ENV=test bin/rspec` to run the test suite.
|
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
public/system
|
public/system
|
||||||
public/assets
|
public/assets
|
||||||
public/packs
|
public/packs
|
||||||
public/packs-test
|
|
||||||
node_modules
|
node_modules
|
||||||
neo4j
|
neo4j
|
||||||
vendor/bundle
|
vendor/bundle
|
||||||
|
@ -20,9 +19,3 @@ postgres14
|
||||||
redis
|
redis
|
||||||
elasticsearch
|
elasticsearch
|
||||||
chart
|
chart
|
||||||
.yarn/
|
|
||||||
!.yarn/patches
|
|
||||||
!.yarn/plugins
|
|
||||||
!.yarn/releases
|
|
||||||
!.yarn/sdks
|
|
||||||
!.yarn/versions
|
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
# Required by ActiveRecord encryption feature
|
|
||||||
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=fkSxKD2bF396kdQbrP1EJ7WbU7ZgNokR
|
|
||||||
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=r0hvVmzBVsjxC7AMlwhOzmtc36ZCOS1E
|
|
||||||
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=PhdFyyfy5xJ7WVd2lWBpcPScRQHzRTNr
|
|
|
@ -1,5 +1,5 @@
|
||||||
# This is a sample configuration file. You can generate your configuration
|
# This is a sample configuration file. You can generate your configuration
|
||||||
# with the `bundle exec rails mastodon:setup` interactive setup wizard, but to customize
|
# with the `rake mastodon:setup` interactive setup wizard, but to customize
|
||||||
# your setup even further, you'll need to edit it manually. This sample does
|
# your setup even further, you'll need to edit it manually. This sample does
|
||||||
# not demonstrate all available configuration options. Please look at
|
# not demonstrate all available configuration options. Please look at
|
||||||
# https://docs.joinmastodon.org/admin/config/ for the full documentation.
|
# https://docs.joinmastodon.org/admin/config/ for the full documentation.
|
||||||
|
@ -40,25 +40,14 @@ ES_PASS=password
|
||||||
|
|
||||||
# Secrets
|
# Secrets
|
||||||
# -------
|
# -------
|
||||||
# Make sure to use `bundle exec rails secret` to generate secrets
|
# Make sure to use `rake secret` to generate secrets
|
||||||
# -------
|
# -------
|
||||||
SECRET_KEY_BASE=
|
SECRET_KEY_BASE=
|
||||||
OTP_SECRET=
|
OTP_SECRET=
|
||||||
|
|
||||||
# Encryption secrets
|
|
||||||
# ------------------
|
|
||||||
# Must be available (and set to same values) for all server processes
|
|
||||||
# These are private/secret values, do not share outside hosting environment
|
|
||||||
# Use `bin/rails db:encryption:init` to generate fresh secrets
|
|
||||||
# Do NOT change these secrets once in use, as this would cause data loss and other issues
|
|
||||||
# ------------------
|
|
||||||
# ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=
|
|
||||||
# ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=
|
|
||||||
# ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=
|
|
||||||
|
|
||||||
# Web Push
|
# Web Push
|
||||||
# --------
|
# --------
|
||||||
# Generate with `bundle exec rails mastodon:webpush:generate_vapid_key`
|
# Generate with `rake mastodon:webpush:generate_vapid_key`
|
||||||
# --------
|
# --------
|
||||||
VAPID_PRIVATE_KEY=
|
VAPID_PRIVATE_KEY=
|
||||||
VAPID_PUBLIC_KEY=
|
VAPID_PUBLIC_KEY=
|
||||||
|
@ -79,9 +68,6 @@ AWS_ACCESS_KEY_ID=
|
||||||
AWS_SECRET_ACCESS_KEY=
|
AWS_SECRET_ACCESS_KEY=
|
||||||
S3_ALIAS_HOST=files.example.com
|
S3_ALIAS_HOST=files.example.com
|
||||||
|
|
||||||
# Optional list of hosts that are allowed to serve media for your instance
|
|
||||||
# EXTRA_MEDIA_HOSTS=https://data.example1.com,https://data.example2.com
|
|
||||||
|
|
||||||
# IP and session retention
|
# IP and session retention
|
||||||
# -----------------------
|
# -----------------------
|
||||||
# Make sure to modify the scheduling of ip_cleanup_scheduler in config/sidekiq.yml
|
# Make sure to modify the scheduling of ip_cleanup_scheduler in config/sidekiq.yml
|
||||||
|
@ -89,27 +75,3 @@ S3_ALIAS_HOST=files.example.com
|
||||||
# -----------------------
|
# -----------------------
|
||||||
IP_RETENTION_PERIOD=31556952
|
IP_RETENTION_PERIOD=31556952
|
||||||
SESSION_RETENTION_PERIOD=31556952
|
SESSION_RETENTION_PERIOD=31556952
|
||||||
|
|
||||||
# Fetch All Replies Behavior
|
|
||||||
# --------------------------
|
|
||||||
# When a user expands a post (DetailedStatus view), fetch all of its replies
|
|
||||||
# (default: false)
|
|
||||||
FETCH_REPLIES_ENABLED=false
|
|
||||||
|
|
||||||
# Period to wait between fetching replies (in minutes)
|
|
||||||
FETCH_REPLIES_COOLDOWN_MINUTES=15
|
|
||||||
|
|
||||||
# Period to wait after a post is first created before fetching its replies (in minutes)
|
|
||||||
FETCH_REPLIES_INITIAL_WAIT_MINUTES=5
|
|
||||||
|
|
||||||
# Max number of replies to fetch - total, recursively through a whole reply tree
|
|
||||||
FETCH_REPLIES_MAX_GLOBAL=1000
|
|
||||||
|
|
||||||
# Max number of replies to fetch - for a single post
|
|
||||||
FETCH_REPLIES_MAX_SINGLE=500
|
|
||||||
|
|
||||||
# Max number of replies Collection pages to fetch - total
|
|
||||||
FETCH_REPLIES_MAX_PAGES=500
|
|
||||||
|
|
||||||
# Maximum allowed character count
|
|
||||||
MAX_CHARS=5555
|
|
||||||
|
|
13
.env.test
13
.env.test
|
@ -1,13 +1,10 @@
|
||||||
# In test, compile the NodeJS code as if we are in production
|
# Node.js
|
||||||
NODE_ENV=production
|
NODE_ENV=tests
|
||||||
# Federation
|
# Federation
|
||||||
LOCAL_DOMAIN=cb6e6126.ngrok.io
|
LOCAL_DOMAIN=cb6e6126.ngrok.io
|
||||||
LOCAL_HTTPS=true
|
LOCAL_HTTPS=true
|
||||||
# Elasticsearch
|
# Elasticsearch
|
||||||
|
ES_ENABLED=false
|
||||||
|
ES_HOST=localhost
|
||||||
|
ES_PORT=9200
|
||||||
ES_PREFIX=test
|
ES_PREFIX=test
|
||||||
|
|
||||||
# Secret values required by ActiveRecord encryption feature
|
|
||||||
# Use `bin/rails db:encryption:init` to generate fresh secrets
|
|
||||||
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=test_determinist_key_DO_NOT_USE_IN_PRODUCTION
|
|
||||||
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=test_salt_DO_NOT_USE_IN_PRODUCTION
|
|
||||||
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=test_primary_key_DO_NOT_USE_IN_PRODUCTION
|
|
||||||
|
|
13
.eslintignore
Normal file
13
.eslintignore
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
/build/**
|
||||||
|
/coverage/**
|
||||||
|
/db/**
|
||||||
|
/lib/**
|
||||||
|
/log/**
|
||||||
|
/node_modules/**
|
||||||
|
/nonobox/**
|
||||||
|
/public/**
|
||||||
|
!/public/embed.js
|
||||||
|
/spec/**
|
||||||
|
/tmp/**
|
||||||
|
/vendor/**
|
||||||
|
!.eslintrc.js
|
384
.eslintrc.js
Normal file
384
.eslintrc.js
Normal file
|
@ -0,0 +1,384 @@
|
||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
|
||||||
|
extends: [
|
||||||
|
'eslint:recommended',
|
||||||
|
'plugin:react/recommended',
|
||||||
|
'plugin:react-hooks/recommended',
|
||||||
|
'plugin:jsx-a11y/recommended',
|
||||||
|
'plugin:import/recommended',
|
||||||
|
'plugin:promise/recommended',
|
||||||
|
'plugin:jsdoc/recommended',
|
||||||
|
'plugin:prettier/recommended',
|
||||||
|
],
|
||||||
|
|
||||||
|
env: {
|
||||||
|
browser: true,
|
||||||
|
node: true,
|
||||||
|
es6: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
globals: {
|
||||||
|
ATTACHMENT_HOST: false,
|
||||||
|
},
|
||||||
|
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
|
||||||
|
plugins: [
|
||||||
|
'react',
|
||||||
|
'jsx-a11y',
|
||||||
|
'import',
|
||||||
|
'promise',
|
||||||
|
'@typescript-eslint',
|
||||||
|
'formatjs',
|
||||||
|
],
|
||||||
|
|
||||||
|
parserOptions: {
|
||||||
|
sourceType: 'module',
|
||||||
|
ecmaFeatures: {
|
||||||
|
jsx: true,
|
||||||
|
},
|
||||||
|
ecmaVersion: 2021,
|
||||||
|
requireConfigFile: false,
|
||||||
|
babelOptions: {
|
||||||
|
configFile: false,
|
||||||
|
presets: ['@babel/react', '@babel/env'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
settings: {
|
||||||
|
react: {
|
||||||
|
version: 'detect',
|
||||||
|
},
|
||||||
|
'import/ignore': [
|
||||||
|
'node_modules',
|
||||||
|
'\\.(css|scss|json)$',
|
||||||
|
],
|
||||||
|
'import/resolver': {
|
||||||
|
typescript: {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
rules: {
|
||||||
|
'consistent-return': 'error',
|
||||||
|
'dot-notation': 'error',
|
||||||
|
eqeqeq: ['error', 'always', { 'null': 'ignore' }],
|
||||||
|
'jsx-quotes': ['error', 'prefer-single'],
|
||||||
|
'no-case-declarations': 'off',
|
||||||
|
'no-catch-shadow': 'error',
|
||||||
|
'no-console': [
|
||||||
|
'warn',
|
||||||
|
{
|
||||||
|
allow: [
|
||||||
|
'error',
|
||||||
|
'warn',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'no-empty': 'off',
|
||||||
|
'no-restricted-properties': [
|
||||||
|
'error',
|
||||||
|
{ property: 'substring', message: 'Use .slice instead of .substring.' },
|
||||||
|
{ property: 'substr', message: 'Use .slice instead of .substr.' },
|
||||||
|
],
|
||||||
|
'no-restricted-syntax': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
// eslint-disable-next-line no-restricted-syntax
|
||||||
|
selector: 'Literal[value=/•/], JSXText[value=/•/]',
|
||||||
|
// eslint-disable-next-line no-restricted-syntax
|
||||||
|
message: "Use '·' (middle dot) instead of '•' (bullet)",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'no-self-assign': 'off',
|
||||||
|
'no-unused-expressions': 'error',
|
||||||
|
'no-unused-vars': 'off',
|
||||||
|
'@typescript-eslint/no-unused-vars': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
vars: 'all',
|
||||||
|
args: 'after-used',
|
||||||
|
destructuredArrayIgnorePattern: '^_',
|
||||||
|
ignoreRestSiblings: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'valid-typeof': 'error',
|
||||||
|
|
||||||
|
'react/jsx-filename-extension': ['error', { extensions: ['.jsx', 'tsx'] }],
|
||||||
|
'react/jsx-boolean-value': 'error',
|
||||||
|
'react/display-name': 'off',
|
||||||
|
'react/jsx-fragments': ['error', 'syntax'],
|
||||||
|
'react/jsx-equals-spacing': 'error',
|
||||||
|
'react/jsx-no-bind': 'error',
|
||||||
|
'react/jsx-no-useless-fragment': 'error',
|
||||||
|
'react/jsx-no-target-blank': 'off',
|
||||||
|
'react/jsx-tag-spacing': 'error',
|
||||||
|
'react/jsx-uses-react': 'off', // not needed with new JSX transform
|
||||||
|
'react/jsx-wrap-multilines': 'error',
|
||||||
|
'react/no-deprecated': 'off',
|
||||||
|
'react/no-unknown-property': 'off',
|
||||||
|
'react/react-in-jsx-scope': 'off', // not needed with new JSX transform
|
||||||
|
'react/self-closing-comp': 'error',
|
||||||
|
|
||||||
|
// recommended values found in https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/src/index.js
|
||||||
|
'jsx-a11y/accessible-emoji': 'warn',
|
||||||
|
'jsx-a11y/click-events-have-key-events': 'off',
|
||||||
|
'jsx-a11y/label-has-associated-control': 'off',
|
||||||
|
'jsx-a11y/media-has-caption': 'off',
|
||||||
|
'jsx-a11y/no-autofocus': 'off',
|
||||||
|
// recommended rule is:
|
||||||
|
// 'jsx-a11y/no-interactive-element-to-noninteractive-role': [
|
||||||
|
// 'error',
|
||||||
|
// {
|
||||||
|
// tr: ['none', 'presentation'],
|
||||||
|
// canvas: ['img'],
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
'jsx-a11y/no-interactive-element-to-noninteractive-role': 'off',
|
||||||
|
// recommended rule is:
|
||||||
|
// 'jsx-a11y/no-noninteractive-element-interactions': [
|
||||||
|
// 'error',
|
||||||
|
// {
|
||||||
|
// body: ['onError', 'onLoad'],
|
||||||
|
// iframe: ['onError', 'onLoad'],
|
||||||
|
// img: ['onError', 'onLoad'],
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
'jsx-a11y/no-noninteractive-element-interactions': [
|
||||||
|
'warn',
|
||||||
|
{
|
||||||
|
handlers: [
|
||||||
|
'onClick',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
// recommended rule is:
|
||||||
|
// 'jsx-a11y/no-noninteractive-tabindex': [
|
||||||
|
// 'error',
|
||||||
|
// {
|
||||||
|
// tags: [],
|
||||||
|
// roles: ['tabpanel'],
|
||||||
|
// allowExpressionValues: true,
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
'jsx-a11y/no-noninteractive-tabindex': 'off',
|
||||||
|
'jsx-a11y/no-onchange': 'warn',
|
||||||
|
// recommended is full 'error'
|
||||||
|
'jsx-a11y/no-static-element-interactions': [
|
||||||
|
'warn',
|
||||||
|
{
|
||||||
|
handlers: [
|
||||||
|
'onClick',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
// See https://github.com/import-js/eslint-plugin-import/blob/main/config/recommended.js
|
||||||
|
'import/extensions': [
|
||||||
|
'error',
|
||||||
|
'always',
|
||||||
|
{
|
||||||
|
js: 'never',
|
||||||
|
jsx: 'never',
|
||||||
|
mjs: 'never',
|
||||||
|
ts: 'never',
|
||||||
|
tsx: 'never',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'import/first': 'error',
|
||||||
|
'import/newline-after-import': 'error',
|
||||||
|
'import/no-anonymous-default-export': 'error',
|
||||||
|
'import/no-extraneous-dependencies': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
devDependencies: [
|
||||||
|
'config/webpack/**',
|
||||||
|
'app/javascript/mastodon/performance.js',
|
||||||
|
'app/javascript/mastodon/test_setup.js',
|
||||||
|
'app/javascript/**/__tests__/**',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'import/no-amd': 'error',
|
||||||
|
'import/no-commonjs': 'error',
|
||||||
|
'import/no-import-module-exports': 'error',
|
||||||
|
'import/no-relative-packages': 'error',
|
||||||
|
'import/no-self-import': 'error',
|
||||||
|
'import/no-useless-path-segments': 'error',
|
||||||
|
'import/no-webpack-loader-syntax': 'error',
|
||||||
|
|
||||||
|
'import/order': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
alphabetize: { order: 'asc' },
|
||||||
|
'newlines-between': 'always',
|
||||||
|
groups: [
|
||||||
|
'builtin',
|
||||||
|
'external',
|
||||||
|
'internal',
|
||||||
|
'parent',
|
||||||
|
['index', 'sibling'],
|
||||||
|
'object',
|
||||||
|
],
|
||||||
|
pathGroups: [
|
||||||
|
// React core packages
|
||||||
|
{
|
||||||
|
pattern: '{react,react-dom,react-dom/client,prop-types}',
|
||||||
|
group: 'builtin',
|
||||||
|
position: 'after',
|
||||||
|
},
|
||||||
|
// I18n
|
||||||
|
{
|
||||||
|
pattern: '{react-intl,intl-messageformat}',
|
||||||
|
group: 'builtin',
|
||||||
|
position: 'after',
|
||||||
|
},
|
||||||
|
// Common React utilities
|
||||||
|
{
|
||||||
|
pattern: '{classnames,react-helmet,react-router-dom}',
|
||||||
|
group: 'external',
|
||||||
|
position: 'before',
|
||||||
|
},
|
||||||
|
// Immutable / Redux / data store
|
||||||
|
{
|
||||||
|
pattern: '{immutable,react-redux,react-immutable-proptypes,react-immutable-pure-component,reselect}',
|
||||||
|
group: 'external',
|
||||||
|
position: 'before',
|
||||||
|
},
|
||||||
|
// Internal packages
|
||||||
|
{
|
||||||
|
pattern: '{mastodon/**}',
|
||||||
|
group: 'internal',
|
||||||
|
position: 'after',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
pathGroupsExcludedImportTypes: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
'promise/always-return': 'off',
|
||||||
|
'promise/catch-or-return': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
allowFinally: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'promise/no-callback-in-promise': 'off',
|
||||||
|
'promise/no-nesting': 'off',
|
||||||
|
'promise/no-promise-in-callback': 'off',
|
||||||
|
|
||||||
|
'formatjs/blocklist-elements': 'error',
|
||||||
|
'formatjs/enforce-default-message': ['error', 'literal'],
|
||||||
|
'formatjs/enforce-description': 'off', // description values not currently used
|
||||||
|
'formatjs/enforce-id': 'off', // Explicit IDs are used in the project
|
||||||
|
'formatjs/enforce-placeholders': 'off', // Issues in short_number.jsx
|
||||||
|
'formatjs/enforce-plural-rules': 'error',
|
||||||
|
'formatjs/no-camel-case': 'off', // disabledAccount is only non-conforming
|
||||||
|
'formatjs/no-complex-selectors': 'error',
|
||||||
|
'formatjs/no-emoji': 'error',
|
||||||
|
'formatjs/no-id': 'off', // IDs are used for translation keys
|
||||||
|
'formatjs/no-invalid-icu': 'error',
|
||||||
|
'formatjs/no-literal-string-in-jsx': 'off', // Should be looked at, but mainly flagging punctuation outside of strings
|
||||||
|
'formatjs/no-multiple-plurals': 'off', // Only used by hashtag.jsx
|
||||||
|
'formatjs/no-multiple-whitespaces': 'error',
|
||||||
|
'formatjs/no-offset': 'error',
|
||||||
|
'formatjs/no-useless-message': 'error',
|
||||||
|
'formatjs/prefer-formatted-message': 'error',
|
||||||
|
'formatjs/prefer-pound-in-plural': 'error',
|
||||||
|
|
||||||
|
'jsdoc/check-types': 'off',
|
||||||
|
'jsdoc/no-undefined-types': 'off',
|
||||||
|
'jsdoc/require-jsdoc': 'off',
|
||||||
|
'jsdoc/require-param-description': 'off',
|
||||||
|
'jsdoc/require-property-description': 'off',
|
||||||
|
'jsdoc/require-returns-description': 'off',
|
||||||
|
'jsdoc/require-returns': 'off',
|
||||||
|
},
|
||||||
|
|
||||||
|
overrides: [
|
||||||
|
{
|
||||||
|
files: [
|
||||||
|
'*.config.js',
|
||||||
|
'.*rc.js',
|
||||||
|
'ide-helper.js',
|
||||||
|
'config/webpack/**/*',
|
||||||
|
'config/formatjs-formatter.js',
|
||||||
|
],
|
||||||
|
|
||||||
|
env: {
|
||||||
|
commonjs: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
parserOptions: {
|
||||||
|
sourceType: 'script',
|
||||||
|
},
|
||||||
|
|
||||||
|
rules: {
|
||||||
|
'import/no-commonjs': 'off',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
files: [
|
||||||
|
'**/*.ts',
|
||||||
|
'**/*.tsx',
|
||||||
|
],
|
||||||
|
|
||||||
|
extends: [
|
||||||
|
'eslint:recommended',
|
||||||
|
'plugin:@typescript-eslint/strict-type-checked',
|
||||||
|
'plugin:@typescript-eslint/stylistic-type-checked',
|
||||||
|
'plugin:react/recommended',
|
||||||
|
'plugin:react-hooks/recommended',
|
||||||
|
'plugin:jsx-a11y/recommended',
|
||||||
|
'plugin:import/recommended',
|
||||||
|
'plugin:import/typescript',
|
||||||
|
'plugin:promise/recommended',
|
||||||
|
'plugin:jsdoc/recommended-typescript',
|
||||||
|
'plugin:prettier/recommended',
|
||||||
|
],
|
||||||
|
|
||||||
|
parserOptions: {
|
||||||
|
project: true,
|
||||||
|
tsconfigRootDir: __dirname,
|
||||||
|
},
|
||||||
|
|
||||||
|
rules: {
|
||||||
|
'import/consistent-type-specifier-style': ['error', 'prefer-top-level'],
|
||||||
|
|
||||||
|
'@typescript-eslint/consistent-type-definitions': ['warn', 'interface'],
|
||||||
|
'@typescript-eslint/consistent-type-exports': 'error',
|
||||||
|
'@typescript-eslint/consistent-type-imports': 'error',
|
||||||
|
"@typescript-eslint/prefer-nullish-coalescing": ['error', {ignorePrimitives: {boolean: true}}],
|
||||||
|
|
||||||
|
'jsdoc/require-jsdoc': 'off',
|
||||||
|
|
||||||
|
// Those rules set stricter rules for TS files
|
||||||
|
// to enforce better practices when converting from JS
|
||||||
|
'import/no-default-export': 'warn',
|
||||||
|
'react/prefer-stateless-function': 'warn',
|
||||||
|
'react/function-component-definition': ['error', { namedComponents: 'arrow-function' }],
|
||||||
|
'react/jsx-uses-react': 'off', // not needed with new JSX transform
|
||||||
|
'react/react-in-jsx-scope': 'off', // not needed with new JSX transform
|
||||||
|
'react/prop-types': 'off',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
files: [
|
||||||
|
'**/__tests__/*.js',
|
||||||
|
'**/__tests__/*.jsx',
|
||||||
|
],
|
||||||
|
|
||||||
|
env: {
|
||||||
|
jest: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
files: [
|
||||||
|
'streaming/**/*',
|
||||||
|
],
|
||||||
|
rules: {
|
||||||
|
'import/no-commonjs': 'off',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
4
.github/FUNDING.yml
vendored
4
.github/FUNDING.yml
vendored
|
@ -1 +1,3 @@
|
||||||
custom: https://fantia.jp/fanclubs/484677
|
patreon: mastodon
|
||||||
|
open_collective: mastodon
|
||||||
|
custom: https://sponsor.joinmastodon.org
|
||||||
|
|
74
.github/ISSUE_TEMPLATE/1.bug_report.yml
vendored
74
.github/ISSUE_TEMPLATE/1.bug_report.yml
vendored
|
@ -1,74 +0,0 @@
|
||||||
name: バグ報告
|
|
||||||
description: kmyblueのバグ報告(ただし情報改竄、秘密情報の漏洩、システムの破損などが発生するバグは、こちらではなく「Security」タブよりセキュリティインシデントとして報告してください)
|
|
||||||
labels: [bug]
|
|
||||||
body:
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: バグの再現手順
|
|
||||||
description: どのように操作したらバグが発生したのか、バグが発生する直前までの手順を順番に詳しく教えてください
|
|
||||||
value: |
|
|
||||||
1.
|
|
||||||
2.
|
|
||||||
3.
|
|
||||||
...
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: 期待する動作
|
|
||||||
description: どのように動いてほしかったですか?
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: 実際の動作
|
|
||||||
description: どのようなバグが発生しましたか?
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: 詳しい情報
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: バグが発生したkmyblueサーバーのドメイン
|
|
||||||
description: サーバー固有の問題の可能性もありますので、プライバシー上可能な範囲内で、できるだけ書いてください
|
|
||||||
placeholder: kmy.blue
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: バグが発生したkmyblueのバージョン
|
|
||||||
description: |
|
|
||||||
Mastodonではなくkmyblueのバージョンを記述してください。例えばバージョン表記が `v4.2.0+kmyblue.5.1-LTS` の場合、バージョンは `5.1`になります
|
|
||||||
|
|
||||||
バージョンは、PCだと画面左下、スマホだと概要画面の一番下に書いてあります
|
|
||||||
placeholder: '5.1'
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: ブラウザの名前
|
|
||||||
description: |
|
|
||||||
ブラウザの名前を書いてください。可能であればバージョンも併記してください
|
|
||||||
placeholder: Firefox 105.0.3
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: OS
|
|
||||||
description: |
|
|
||||||
あなたのOSと、できればバージョンも教えてください。スマホの場合は、「Android」「iPhone」にバージョンをつけてください
|
|
||||||
placeholder: Windows11
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: その他の詳細情報
|
|
||||||
description: |
|
|
||||||
あなたの環境が特殊な場合、詳しいことを教えてください(例: VPS、tor、学内LANなど)
|
|
||||||
|
|
||||||
サーバー管理者の場合は、Ruby、Node.jsのバージョン、Cloudflareの使用可否なども可能なら書いてください
|
|
||||||
validations:
|
|
||||||
required: false
|
|
76
.github/ISSUE_TEMPLATE/1.web_bug_report.yml
vendored
Normal file
76
.github/ISSUE_TEMPLATE/1.web_bug_report.yml
vendored
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
name: Bug Report (Web Interface)
|
||||||
|
description: If you are using Mastodon's web interface and something is not working as expected
|
||||||
|
labels: [bug, 'status/to triage', 'area/web interface']
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Make sure that you are submitting a new bug that was not previously reported or already fixed.
|
||||||
|
|
||||||
|
Please use a concise and distinct title for the issue.
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Steps to reproduce the problem
|
||||||
|
description: What were you trying to do?
|
||||||
|
value: |
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Expected behaviour
|
||||||
|
description: What should have happened?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Actual behaviour
|
||||||
|
description: What happened?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Detailed description
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Mastodon instance
|
||||||
|
description: The address of the Mastodon instance where you experienced the issue
|
||||||
|
placeholder: mastodon.social
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Mastodon version
|
||||||
|
description: |
|
||||||
|
This is displayed at the bottom of the About page, eg. `v4.1.2+nightly-20230627`
|
||||||
|
placeholder: v4.1.2
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Browser name and version
|
||||||
|
description: |
|
||||||
|
What browser are you using when getting this bug? Please specify the version as well.
|
||||||
|
placeholder: Firefox 105.0.3
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Operating system
|
||||||
|
description: |
|
||||||
|
What OS are you running? Please specify the version as well.
|
||||||
|
placeholder: macOS 13.4.1
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Technical details
|
||||||
|
description: |
|
||||||
|
Any additional technical details you may have. This can include the full error log, inspector's output…
|
||||||
|
validations:
|
||||||
|
required: false
|
16
.github/ISSUE_TEMPLATE/2.feature_request.yml
vendored
16
.github/ISSUE_TEMPLATE/2.feature_request.yml
vendored
|
@ -1,16 +0,0 @@
|
||||||
name: 機能要望
|
|
||||||
description: 機能の提案
|
|
||||||
labels: [enhancement]
|
|
||||||
body:
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: 欲しい機能
|
|
||||||
description: 欲しい機能の詳細を書いてください
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: 必要性
|
|
||||||
description: この機能はあなたにとってなぜ必要でしょうか?どういった状況で使われるものですか?
|
|
||||||
validations:
|
|
||||||
required: true
|
|
65
.github/ISSUE_TEMPLATE/2.server_bug_report.yml
vendored
Normal file
65
.github/ISSUE_TEMPLATE/2.server_bug_report.yml
vendored
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
name: Bug Report (server / API)
|
||||||
|
description: |
|
||||||
|
If something is not working as expected, but is not from using the web interface.
|
||||||
|
labels: [bug, 'status/to triage']
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Make sure that you are submitting a new bug that was not previously reported or already fixed.
|
||||||
|
|
||||||
|
Please use a concise and distinct title for the issue.
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Steps to reproduce the problem
|
||||||
|
description: What were you trying to do?
|
||||||
|
value: |
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Expected behaviour
|
||||||
|
description: What should have happened?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Actual behaviour
|
||||||
|
description: What happened?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Detailed description
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Mastodon instance
|
||||||
|
description: The address of the Mastodon instance where you experienced the issue
|
||||||
|
placeholder: mastodon.social
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Mastodon version
|
||||||
|
description: |
|
||||||
|
This is displayed at the bottom of the About page, eg. `v4.1.2+nightly-20230627`
|
||||||
|
placeholder: v4.1.2
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Technical details
|
||||||
|
description: |
|
||||||
|
Any additional technical details you may have, like logs or error traces
|
||||||
|
value: |
|
||||||
|
If this is happening on your own Mastodon server, please fill out those:
|
||||||
|
- Ruby version: (from `ruby --version`, eg. v3.1.2)
|
||||||
|
- Node.js version: (from `node --version`, eg. v18.16.0)
|
||||||
|
validations:
|
||||||
|
required: false
|
22
.github/ISSUE_TEMPLATE/3.feature_request.yml
vendored
Normal file
22
.github/ISSUE_TEMPLATE/3.feature_request.yml
vendored
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
name: Feature Request
|
||||||
|
description: I have a suggestion
|
||||||
|
labels: [suggestion]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Please use a concise and distinct title for the issue.
|
||||||
|
|
||||||
|
Consider: Could it be implemented as a 3rd party app using the REST API instead?
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Pitch
|
||||||
|
description: Describe your idea for a feature. Make sure it has not already been suggested/implemented/turned down before.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Motivation
|
||||||
|
description: Why do you think this feature is needed? Who would benefit from it?
|
||||||
|
validations:
|
||||||
|
required: true
|
28
.github/ISSUE_TEMPLATE/3.spec_change_request.yml
vendored
28
.github/ISSUE_TEMPLATE/3.spec_change_request.yml
vendored
|
@ -1,28 +0,0 @@
|
||||||
name: 仕様変更・改善要望
|
|
||||||
description: 既存の仕様や挙動変更の要望
|
|
||||||
labels: [specchange]
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: 意図したものとは明らかに異なる挙動をしているものはバグとして、もともと仕様として決められた動きをしているものを変更したいときはこちらでお願いします
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: 挙動を変更してほしい機能や動作
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: 現在の挙動
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: 変更してほしい新しい挙動
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: 必要性
|
|
||||||
description: この変更はあなたにとってなぜ必要でしょうか?どういった状況で使われるものですか?
|
|
||||||
validations:
|
|
||||||
required: true
|
|
74
.github/ISSUE_TEMPLATE/3.troubleshooting.yml
vendored
74
.github/ISSUE_TEMPLATE/3.troubleshooting.yml
vendored
|
@ -1,74 +0,0 @@
|
||||||
name: Deployment troubleshooting
|
|
||||||
description: |
|
|
||||||
You are a server administrator and you are encountering a technical issue during installation, upgrade or operations of Mastodon.
|
|
||||||
labels: ['status/to triage']
|
|
||||||
type: 'Troubleshooting'
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
Make sure that you are submitting a new bug that was not previously reported or already fixed.
|
|
||||||
|
|
||||||
Please use a concise and distinct title for the issue.
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Steps to reproduce the problem
|
|
||||||
description: What were you trying to do?
|
|
||||||
value: |
|
|
||||||
1.
|
|
||||||
2.
|
|
||||||
3.
|
|
||||||
...
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: Expected behaviour
|
|
||||||
description: What should have happened?
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: Actual behaviour
|
|
||||||
description: What happened?
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Detailed description
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: Mastodon instance
|
|
||||||
description: The address of the Mastodon instance where you experienced the issue
|
|
||||||
placeholder: mastodon.social
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: Mastodon version
|
|
||||||
description: |
|
|
||||||
This is displayed at the bottom of the About page, eg. `v4.4.0-alpha.1`
|
|
||||||
placeholder: v4.3.0
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Environment
|
|
||||||
description: |
|
|
||||||
Details about your environment, like how Mastodon is deployed, if containers are used, version numbers, etc.
|
|
||||||
value: |
|
|
||||||
Please at least include those informations:
|
|
||||||
- Operating system: (eg. Ubuntu 22.04)
|
|
||||||
- Ruby version: (from `ruby --version`, eg. v3.4.1)
|
|
||||||
- Node.js version: (from `node --version`, eg. v20.18.0)
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Technical details
|
|
||||||
description: |
|
|
||||||
Any additional technical details you may have, like logs or error traces
|
|
||||||
validations:
|
|
||||||
required: false
|
|
6
.github/ISSUE_TEMPLATE/config.yml
vendored
6
.github/ISSUE_TEMPLATE/config.yml
vendored
|
@ -1 +1,5 @@
|
||||||
blank_issues_enabled: true
|
blank_issues_enabled: false
|
||||||
|
contact_links:
|
||||||
|
- name: GitHub Discussions
|
||||||
|
url: https://github.com/mastodon/mastodon/discussions
|
||||||
|
about: Please ask and answer questions here.
|
||||||
|
|
42
.github/actions/setup-javascript/action.yml
vendored
42
.github/actions/setup-javascript/action.yml
vendored
|
@ -1,42 +0,0 @@
|
||||||
name: 'Setup Javascript'
|
|
||||||
description: 'Setup a Javascript environment ready to run the Mastodon code'
|
|
||||||
inputs:
|
|
||||||
onlyProduction:
|
|
||||||
description: Only install production dependencies
|
|
||||||
default: 'false'
|
|
||||||
|
|
||||||
runs:
|
|
||||||
using: 'composite'
|
|
||||||
steps:
|
|
||||||
- name: Set up Node.js
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version-file: '.nvmrc'
|
|
||||||
|
|
||||||
# The following is needed because we can not use `cache: true` for `setup-node`, as it does not support Corepack yet and mess up with the cache location if ran after Node is installed
|
|
||||||
- name: Enable corepack
|
|
||||||
shell: bash
|
|
||||||
run: corepack enable
|
|
||||||
|
|
||||||
- name: Get yarn cache directory path
|
|
||||||
id: yarn-cache-dir-path
|
|
||||||
shell: bash
|
|
||||||
run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- uses: actions/cache@v4
|
|
||||||
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
|
|
||||||
with:
|
|
||||||
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
|
||||||
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-yarn-
|
|
||||||
|
|
||||||
- name: Install all yarn packages
|
|
||||||
shell: bash
|
|
||||||
run: yarn install --immutable
|
|
||||||
if: inputs.onlyProduction == 'false'
|
|
||||||
|
|
||||||
- name: Install all production yarn packages
|
|
||||||
shell: bash
|
|
||||||
run: yarn workspaces focus --production
|
|
||||||
if: inputs.onlyProduction != 'false'
|
|
23
.github/actions/setup-ruby/action.yml
vendored
23
.github/actions/setup-ruby/action.yml
vendored
|
@ -1,23 +0,0 @@
|
||||||
name: 'Setup RUby'
|
|
||||||
description: 'Setup a Ruby environment ready to run the Mastodon code'
|
|
||||||
inputs:
|
|
||||||
ruby-version:
|
|
||||||
description: The Ruby version to install
|
|
||||||
default: '.ruby-version'
|
|
||||||
additional-system-dependencies:
|
|
||||||
description: 'Additional packages to install'
|
|
||||||
|
|
||||||
runs:
|
|
||||||
using: 'composite'
|
|
||||||
steps:
|
|
||||||
- name: Install system dependencies
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y libicu-dev libidn11-dev libvips42 ${{ inputs.additional-system-dependencies }}
|
|
||||||
|
|
||||||
- name: Set up Ruby
|
|
||||||
uses: ruby/setup-ruby@v1
|
|
||||||
with:
|
|
||||||
ruby-version: ${{ inputs.ruby-version }}
|
|
||||||
bundler-cache: true
|
|
13
.github/codecov.yml
vendored
13
.github/codecov.yml
vendored
|
@ -1,13 +0,0 @@
|
||||||
comment: false # Do not leave PR comments
|
|
||||||
coverage:
|
|
||||||
status:
|
|
||||||
project:
|
|
||||||
default:
|
|
||||||
# GitHub status check is not blocking
|
|
||||||
informational: true
|
|
||||||
patch:
|
|
||||||
default:
|
|
||||||
# GitHub status check is not blocking
|
|
||||||
informational: true
|
|
||||||
github_checks:
|
|
||||||
annotations: false
|
|
54
.github/renovate.json5
vendored
54
.github/renovate.json5
vendored
|
@ -2,21 +2,17 @@
|
||||||
$schema: 'https://docs.renovatebot.com/renovate-schema.json',
|
$schema: 'https://docs.renovatebot.com/renovate-schema.json',
|
||||||
extends: [
|
extends: [
|
||||||
'config:recommended',
|
'config:recommended',
|
||||||
'customManagers:dockerfileVersions',
|
|
||||||
':labels(dependencies)',
|
':labels(dependencies)',
|
||||||
|
':maintainLockFilesMonthly', // update non-direct dependencies monthly
|
||||||
':prConcurrentLimitNone', // Remove limit for open PRs at any time.
|
':prConcurrentLimitNone', // Remove limit for open PRs at any time.
|
||||||
':prHourlyLimit2', // Rate limit PR creation to a maximum of two per hour.
|
':prHourlyLimit2', // Rate limit PR creation to a maximum of two per hour.
|
||||||
],
|
],
|
||||||
rebaseWhen: 'conflicted',
|
|
||||||
minimumReleaseAge: '3', // Wait 3 days after the package has been published before upgrading it
|
minimumReleaseAge: '3', // Wait 3 days after the package has been published before upgrading it
|
||||||
// packageRules order is important, they are applied from top to bottom and are merged,
|
// packageRules order is important, they are applied from top to bottom and are merged,
|
||||||
// meaning the most important ones must be at the bottom, for example grouping rules
|
// meaning the most important ones must be at the bottom, for example grouping rules
|
||||||
// If we do not want a package to be grouped with others, we need to set its groupName
|
// If we do not want a package to be grouped with others, we need to set its groupName
|
||||||
// to `null` after any other rule set it to something.
|
// to `null` after any other rule set it to something.
|
||||||
dependencyDashboardHeader: 'This issue lists Renovate updates and detected dependencies. Read the [Dependency Dashboard](https://docs.renovatebot.com/key-concepts/dashboard/) docs to learn more. Before approving any upgrade: read the description and comments in the [`renovate.json5` file](https://github.com/mastodon/mastodon/blob/main/.github/renovate.json5).',
|
dependencyDashboardHeader: 'This issue lists Renovate updates and detected dependencies. Read the [Dependency Dashboard](https://docs.renovatebot.com/key-concepts/dashboard/) docs to learn more. Before approving any upgrade: read the description and comments in the [`renovate.json5` file](https://github.com/mastodon/mastodon/blob/main/.github/renovate.json5).',
|
||||||
postUpdateOptions: ['yarnDedupeHighest'],
|
|
||||||
// The types are now included in recent versions,we ignore them here until we upgrade and remove the dependency
|
|
||||||
ignoreDeps: ['@types/emoji-mart'],
|
|
||||||
packageRules: [
|
packageRules: [
|
||||||
{
|
{
|
||||||
// Require Dependency Dashboard Approval for major version bumps of these node packages
|
// Require Dependency Dashboard Approval for major version bumps of these node packages
|
||||||
|
@ -26,7 +22,6 @@
|
||||||
'react-hotkeys', // Requires code changes
|
'react-hotkeys', // Requires code changes
|
||||||
|
|
||||||
// Requires Webpacker upgrade or replacement
|
// Requires Webpacker upgrade or replacement
|
||||||
'@svgr/webpack',
|
|
||||||
'@types/webpack',
|
'@types/webpack',
|
||||||
'babel-loader',
|
'babel-loader',
|
||||||
'compression-webpack-plugin',
|
'compression-webpack-plugin',
|
||||||
|
@ -54,6 +49,7 @@
|
||||||
matchManagers: ['bundler'],
|
matchManagers: ['bundler'],
|
||||||
matchPackageNames: [
|
matchPackageNames: [
|
||||||
'rack', // Needs to be synced with Rails version
|
'rack', // Needs to be synced with Rails version
|
||||||
|
'sprockets', // Requires manual upgrade https://github.com/rails/sprockets/blob/master/UPGRADING.md#guide-to-upgrading-from-sprockets-3x-to-4x
|
||||||
'strong_migrations', // Requires manual upgrade
|
'strong_migrations', // Requires manual upgrade
|
||||||
'sidekiq', // Requires manual upgrade
|
'sidekiq', // Requires manual upgrade
|
||||||
'sidekiq-unique-jobs', // Requires manual upgrades and sync with Sidekiq version
|
'sidekiq-unique-jobs', // Requires manual upgrades and sync with Sidekiq version
|
||||||
|
@ -63,7 +59,7 @@
|
||||||
dependencyDashboardApproval: true,
|
dependencyDashboardApproval: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Update GitHub Actions and Docker images weekly
|
// Update Github Actions and Docker images weekly
|
||||||
matchManagers: ['github-actions', 'dockerfile', 'docker-compose'],
|
matchManagers: ['github-actions', 'dockerfile', 'docker-compose'],
|
||||||
extends: ['schedule:weekly'],
|
extends: ['schedule:weekly'],
|
||||||
},
|
},
|
||||||
|
@ -90,7 +86,6 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Update devDependencies every week, with one grouped PR
|
// Update devDependencies every week, with one grouped PR
|
||||||
matchManagers: ['npm'],
|
|
||||||
matchDepTypes: 'devDependencies',
|
matchDepTypes: 'devDependencies',
|
||||||
matchUpdateTypes: ['patch', 'minor'],
|
matchUpdateTypes: ['patch', 'minor'],
|
||||||
groupName: 'devDependencies (non-major)',
|
groupName: 'devDependencies (non-major)',
|
||||||
|
@ -99,30 +94,14 @@
|
||||||
{
|
{
|
||||||
// Group all eslint-related packages with `eslint` in the same PR
|
// Group all eslint-related packages with `eslint` in the same PR
|
||||||
matchManagers: ['npm'],
|
matchManagers: ['npm'],
|
||||||
matchPackageNames: [
|
matchPackageNames: ['eslint'],
|
||||||
'eslint',
|
matchPackagePrefixes: ['eslint-', '@typescript-eslint/'],
|
||||||
'eslint-*',
|
|
||||||
'typescript-eslint',
|
|
||||||
'@eslint/*',
|
|
||||||
'globals',
|
|
||||||
],
|
|
||||||
matchUpdateTypes: ['patch', 'minor'],
|
matchUpdateTypes: ['patch', 'minor'],
|
||||||
groupName: 'eslint (non-major)',
|
groupName: 'eslint (non-major)',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
// Group actions/*-artifact in the same PR
|
|
||||||
matchManagers: ['github-actions'],
|
|
||||||
matchPackageNames: [
|
|
||||||
'actions/download-artifact',
|
|
||||||
'actions/upload-artifact',
|
|
||||||
],
|
|
||||||
matchUpdateTypes: ['major'],
|
|
||||||
groupName: 'artifact actions (major)',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
// Update @types/* packages every week, with one grouped PR
|
// Update @types/* packages every week, with one grouped PR
|
||||||
matchManagers: ['npm'],
|
matchPackagePrefixes: '@types/',
|
||||||
matchPackageNames: '@types/*',
|
|
||||||
matchUpdateTypes: ['patch', 'minor'],
|
matchUpdateTypes: ['patch', 'minor'],
|
||||||
groupName: 'DefinitelyTyped types (non-major)',
|
groupName: 'DefinitelyTyped types (non-major)',
|
||||||
extends: ['schedule:weekly'],
|
extends: ['schedule:weekly'],
|
||||||
|
@ -136,27 +115,6 @@
|
||||||
],
|
],
|
||||||
groupName: null, // We dont want them to belong to any group
|
groupName: null, // We dont want them to belong to any group
|
||||||
},
|
},
|
||||||
{
|
|
||||||
// Group all RuboCop packages with `rubocop` in the same PR
|
|
||||||
matchManagers: ['bundler'],
|
|
||||||
matchPackageNames: ['rubocop', 'rubocop-*'],
|
|
||||||
matchUpdateTypes: ['patch', 'minor'],
|
|
||||||
groupName: 'RuboCop (non-major)',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
// Group all RSpec packages with `rspec` in the same PR
|
|
||||||
matchManagers: ['bundler'],
|
|
||||||
matchPackageNames: ['rspec', 'rspec-*'],
|
|
||||||
matchUpdateTypes: ['patch', 'minor'],
|
|
||||||
groupName: 'RSpec (non-major)',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
// Group all opentelemetry-ruby packages in the same PR
|
|
||||||
matchManagers: ['bundler'],
|
|
||||||
matchPackageNames: ['opentelemetry-*'],
|
|
||||||
matchUpdateTypes: ['patch', 'minor'],
|
|
||||||
groupName: 'opentelemetry-ruby (non-major)',
|
|
||||||
},
|
|
||||||
// Add labels depending on package manager
|
// Add labels depending on package manager
|
||||||
{ matchManagers: ['npm', 'nvm'], addLabels: ['javascript'] },
|
{ matchManagers: ['npm', 'nvm'], addLabels: ['javascript'] },
|
||||||
{ matchManagers: ['bundler', 'ruby-version'], addLabels: ['ruby'] },
|
{ matchManagers: ['bundler', 'ruby-version'], addLabels: ['ruby'] },
|
||||||
|
|
21
.github/stylelint-matcher.json
vendored
Normal file
21
.github/stylelint-matcher.json
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"problemMatcher": [
|
||||||
|
{
|
||||||
|
"owner": "stylelint",
|
||||||
|
"pattern": [
|
||||||
|
{
|
||||||
|
"regexp": "^([^\\s].*)$",
|
||||||
|
"file": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"regexp": "^\\s+((\\d+):(\\d+))?\\s+(✖|×)\\s+(.*)\\s{2,}(.*)$",
|
||||||
|
"line": 2,
|
||||||
|
"column": 3,
|
||||||
|
"message": 5,
|
||||||
|
"code": 6,
|
||||||
|
"loop": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
60
.github/workflows/build-security.yml
vendored
60
.github/workflows/build-security.yml
vendored
|
@ -1,60 +0,0 @@
|
||||||
name: Build security nightly container image
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
compute-suffix:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.repository == 'mastodon/mastodon'
|
|
||||||
steps:
|
|
||||||
- id: version_vars
|
|
||||||
env:
|
|
||||||
TZ: Etc/UTC
|
|
||||||
run: |
|
|
||||||
echo mastodon_version_prerelease=nightly.$(date --date='next day' +'%Y-%m-%d')-security>> $GITHUB_OUTPUT
|
|
||||||
outputs:
|
|
||||||
prerelease: ${{ steps.version_vars.outputs.mastodon_version_prerelease }}
|
|
||||||
|
|
||||||
build-image:
|
|
||||||
needs: compute-suffix
|
|
||||||
uses: ./.github/workflows/build-container-image.yml
|
|
||||||
with:
|
|
||||||
file_to_build: Dockerfile
|
|
||||||
cache: false
|
|
||||||
push_to_images: |
|
|
||||||
tootsuite/mastodon
|
|
||||||
ghcr.io/mastodon/mastodon
|
|
||||||
version_prerelease: ${{ needs.compute-suffix.outputs.prerelease }}
|
|
||||||
labels: |
|
|
||||||
org.opencontainers.image.description=Nightly build image used for testing purposes
|
|
||||||
flavor: |
|
|
||||||
latest=auto
|
|
||||||
tags: |
|
|
||||||
type=raw,value=edge
|
|
||||||
type=raw,value=nightly
|
|
||||||
type=raw,value=${{ needs.compute-suffix.outputs.prerelease }}
|
|
||||||
secrets: inherit
|
|
||||||
|
|
||||||
build-image-streaming:
|
|
||||||
needs: compute-suffix
|
|
||||||
uses: ./.github/workflows/build-container-image.yml
|
|
||||||
with:
|
|
||||||
file_to_build: streaming/Dockerfile
|
|
||||||
cache: false
|
|
||||||
push_to_images: |
|
|
||||||
tootsuite/mastodon-streaming
|
|
||||||
ghcr.io/mastodon/mastodon-streaming
|
|
||||||
version_prerelease: ${{ needs.compute-suffix.outputs.prerelease }}
|
|
||||||
labels: |
|
|
||||||
org.opencontainers.image.description=Nightly build image used for testing purposes
|
|
||||||
flavor: |
|
|
||||||
latest=auto
|
|
||||||
tags: |
|
|
||||||
type=raw,value=edge
|
|
||||||
type=raw,value=nightly
|
|
||||||
type=raw,value=${{ needs.compute-suffix.outputs.prerelease }}
|
|
||||||
secrets: inherit
|
|
20
.github/workflows/bundler-audit.yml
vendored
20
.github/workflows/bundler-audit.yml
vendored
|
@ -1,22 +1,19 @@
|
||||||
name: Bundler Audit
|
name: Bundler Audit
|
||||||
on:
|
on:
|
||||||
merge_group:
|
|
||||||
push:
|
push:
|
||||||
branches:
|
branches-ignore:
|
||||||
- 'main'
|
- 'dependabot/**'
|
||||||
- 'kb*'
|
|
||||||
- 'upstream-*'
|
|
||||||
- 'releases/*'
|
|
||||||
- 'stable-*'
|
|
||||||
paths:
|
paths:
|
||||||
- 'Gemfile*'
|
- 'Gemfile*'
|
||||||
- '.ruby-version'
|
- '.ruby-version'
|
||||||
|
- '.bundler-audit.yml'
|
||||||
- '.github/workflows/bundler-audit.yml'
|
- '.github/workflows/bundler-audit.yml'
|
||||||
|
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- 'Gemfile*'
|
- 'Gemfile*'
|
||||||
- '.ruby-version'
|
- '.ruby-version'
|
||||||
|
- '.bundler-audit.yml'
|
||||||
- '.github/workflows/bundler-audit.yml'
|
- '.github/workflows/bundler-audit.yml'
|
||||||
|
|
||||||
schedule:
|
schedule:
|
||||||
|
@ -26,17 +23,18 @@ jobs:
|
||||||
security:
|
security:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
env:
|
|
||||||
BUNDLE_ONLY: development
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Clone repository
|
- name: Clone repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install native Ruby dependencies
|
||||||
|
run: sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
|
|
||||||
- name: Set up Ruby
|
- name: Set up Ruby
|
||||||
uses: ruby/setup-ruby@v1
|
uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
|
ruby-version: .ruby-version
|
||||||
bundler-cache: true
|
bundler-cache: true
|
||||||
|
|
||||||
- name: Run bundler-audit
|
- name: Run bundler-audit
|
||||||
run: bin/bundler-audit check --update
|
run: bundle exec bundler-audit
|
||||||
|
|
48
.github/workflows/check-i18n.yml
vendored
48
.github/workflows/check-i18n.yml
vendored
|
@ -2,19 +2,9 @@ name: Check i18n
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches: [main]
|
||||||
- 'main'
|
|
||||||
- 'kb*'
|
|
||||||
- 'upstream-*'
|
|
||||||
- 'releases/*'
|
|
||||||
- 'stable-*'
|
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches: [main]
|
||||||
- 'main'
|
|
||||||
- 'kb*'
|
|
||||||
- 'upstream-*'
|
|
||||||
- 'releases/*'
|
|
||||||
- 'stable-*'
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
RAILS_ENV: test
|
RAILS_ENV: test
|
||||||
|
@ -24,16 +14,30 @@ permissions:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check-i18n:
|
check-i18n:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Set up Ruby environment
|
- name: Install system dependencies
|
||||||
uses: ./.github/actions/setup-ruby
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
|
|
||||||
- name: Set up Javascript environment
|
- name: Set up Ruby
|
||||||
uses: ./.github/actions/setup-javascript
|
uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: .ruby-version
|
||||||
|
bundler-cache: true
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
cache: yarn
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install all yarn packages
|
||||||
|
run: yarn --frozen-lockfile
|
||||||
|
|
||||||
- name: Check for missing strings in English JSON
|
- name: Check for missing strings in English JSON
|
||||||
run: |
|
run: |
|
||||||
|
@ -41,18 +45,18 @@ jobs:
|
||||||
git diff --exit-code
|
git diff --exit-code
|
||||||
|
|
||||||
- name: Check locale file normalization
|
- name: Check locale file normalization
|
||||||
run: bin/i18n-tasks check-normalized
|
run: bundle exec i18n-tasks check-normalized
|
||||||
|
|
||||||
- name: Check for unused strings
|
- name: Check for unused strings
|
||||||
run: bin/i18n-tasks unused
|
run: bundle exec i18n-tasks unused
|
||||||
|
|
||||||
- name: Check for missing strings in English YML
|
- name: Check for missing strings in English YML
|
||||||
run: |
|
run: |
|
||||||
bin/i18n-tasks add-missing -l en
|
bundle exec i18n-tasks add-missing -l en
|
||||||
git diff --exit-code
|
git diff --exit-code
|
||||||
|
|
||||||
- name: Check for wrong string interpolations
|
- name: Check for wrong string interpolations
|
||||||
run: bin/i18n-tasks check-consistent-interpolations
|
run: bundle exec i18n-tasks check-consistent-interpolations
|
||||||
|
|
||||||
- name: Check that all required locale files exist
|
- name: Check that all required locale files exist
|
||||||
run: bin/rake repo:check_locales_files
|
run: bundle exec rake repo:check_locales_files
|
||||||
|
|
22
.github/workflows/codeql.yml
vendored
22
.github/workflows/codeql.yml
vendored
|
@ -1,21 +1,11 @@
|
||||||
name: 'CodeQL'
|
name: 'CodeQL'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
merge_group:
|
|
||||||
push:
|
push:
|
||||||
branches:
|
branches: ['main']
|
||||||
- 'main'
|
|
||||||
- 'kb*'
|
|
||||||
- 'upstream-*'
|
|
||||||
- 'releases/*'
|
|
||||||
- 'stable-*'
|
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
# The branches below must be a subset of the branches above
|
||||||
- 'main'
|
branches: ['main']
|
||||||
- 'kb*'
|
|
||||||
- 'upstream-*'
|
|
||||||
- 'releases/*'
|
|
||||||
- 'stable-*'
|
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '22 6 * * 1'
|
- cron: '22 6 * * 1'
|
||||||
|
|
||||||
|
@ -41,7 +31,7 @@ jobs:
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v3
|
uses: github/codeql-action/init@v2
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
|
@ -54,7 +44,7 @@ jobs:
|
||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
|
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v3
|
uses: github/codeql-action/autobuild@v2
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||||
|
@ -67,6 +57,6 @@ jobs:
|
||||||
# ./location_of_script_within_repo/buildscript.sh
|
# ./location_of_script_within_repo/buildscript.sh
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v3
|
uses: github/codeql-action/analyze@v2
|
||||||
with:
|
with:
|
||||||
category: '/language:${{matrix.language}}'
|
category: '/language:${{matrix.language}}'
|
||||||
|
|
69
.github/workflows/crowdin-download-stable.yml
vendored
69
.github/workflows/crowdin-download-stable.yml
vendored
|
@ -1,69 +0,0 @@
|
||||||
name: Crowdin / Download translations (stable branches)
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
download-translations-stable:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.repository == 'mastodon/mastodon'
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Increase Git http.postBuffer
|
|
||||||
# This is needed due to a bug in Ubuntu's cURL version?
|
|
||||||
# See https://github.com/orgs/community/discussions/55820
|
|
||||||
run: |
|
|
||||||
git config --global http.version HTTP/1.1
|
|
||||||
git config --global http.postBuffer 157286400
|
|
||||||
|
|
||||||
# Download the translation files from Crowdin
|
|
||||||
- name: crowdin action
|
|
||||||
uses: crowdin/github-action@v2
|
|
||||||
with:
|
|
||||||
upload_sources: false
|
|
||||||
upload_translations: false
|
|
||||||
download_translations: true
|
|
||||||
crowdin_branch_name: ${{ github.base_ref || github.ref_name }}
|
|
||||||
push_translations: false
|
|
||||||
create_pull_request: false
|
|
||||||
env:
|
|
||||||
CROWDIN_PROJECT_ID: ${{ vars.CROWDIN_PROJECT_ID }}
|
|
||||||
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
|
|
||||||
|
|
||||||
# As the files are extracted from a Docker container, they belong to root:root
|
|
||||||
# We need to fix this before the next steps
|
|
||||||
- name: Fix file permissions
|
|
||||||
run: sudo chown -R runner:docker .
|
|
||||||
|
|
||||||
# This is needed to run the normalize step
|
|
||||||
- name: Set up Ruby environment
|
|
||||||
uses: ./.github/actions/setup-ruby
|
|
||||||
|
|
||||||
- name: Run i18n normalize task
|
|
||||||
run: bin/i18n-tasks normalize
|
|
||||||
|
|
||||||
# Create or update the pull request
|
|
||||||
- name: Create Pull Request
|
|
||||||
uses: peter-evans/create-pull-request@v7.0.6
|
|
||||||
with:
|
|
||||||
commit-message: 'New Crowdin translations'
|
|
||||||
title: 'New Crowdin Translations for ${{ github.base_ref || github.ref_name }} (automated)'
|
|
||||||
author: 'GitHub Actions <noreply@github.com>'
|
|
||||||
body: |
|
|
||||||
New Crowdin translations, automated with GitHub Actions
|
|
||||||
|
|
||||||
See `.github/workflows/crowdin-download.yml`
|
|
||||||
|
|
||||||
This PR will be updated every day with new translations.
|
|
||||||
|
|
||||||
Due to a limitation in GitHub Actions, checks are not running on this PR without manual action.
|
|
||||||
If you want to run the checks, then close and re-open it.
|
|
||||||
branch: i18n/crowdin/translations-${{ github.base_ref || github.ref_name }}
|
|
||||||
base: ${{ github.base_ref || github.ref_name }}
|
|
||||||
labels: i18n
|
|
25
.github/workflows/format-check.yml
vendored
25
.github/workflows/format-check.yml
vendored
|
@ -1,25 +0,0 @@
|
||||||
name: Check formatting
|
|
||||||
on:
|
|
||||||
merge_group:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- 'main'
|
|
||||||
- 'kb*'
|
|
||||||
- 'upstream-*'
|
|
||||||
- 'releases/*'
|
|
||||||
- 'stable-*'
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lint:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Clone repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set up Javascript environment
|
|
||||||
uses: ./.github/actions/setup-javascript
|
|
||||||
|
|
||||||
- name: Check formatting with Prettier
|
|
||||||
run: yarn format:check
|
|
26
.github/workflows/lint-css.yml
vendored
26
.github/workflows/lint-css.yml
vendored
|
@ -1,13 +1,9 @@
|
||||||
name: CSS Linting
|
name: CSS Linting
|
||||||
on:
|
on:
|
||||||
merge_group:
|
|
||||||
push:
|
push:
|
||||||
branches:
|
branches-ignore:
|
||||||
- 'main'
|
- 'dependabot/**'
|
||||||
- 'kb*'
|
- 'renovate/**'
|
||||||
- 'upstream-*'
|
|
||||||
- 'releases/*'
|
|
||||||
- 'stable-*'
|
|
||||||
paths:
|
paths:
|
||||||
- 'package.json'
|
- 'package.json'
|
||||||
- 'yarn.lock'
|
- 'yarn.lock'
|
||||||
|
@ -39,8 +35,18 @@ jobs:
|
||||||
- name: Clone repository
|
- name: Clone repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Set up Javascript environment
|
- name: Set up Node.js
|
||||||
uses: ./.github/actions/setup-javascript
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
cache: yarn
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install all yarn packages
|
||||||
|
run: yarn --frozen-lockfile
|
||||||
|
|
||||||
|
- uses: xt0rted/stylelint-problem-matcher@v1
|
||||||
|
|
||||||
|
- run: echo "::add-matcher::.github/stylelint-matcher.json"
|
||||||
|
|
||||||
- name: Stylelint
|
- name: Stylelint
|
||||||
run: yarn lint:css --custom-formatter @csstools/stylelint-formatter-github
|
run: yarn lint:sass
|
||||||
|
|
22
.github/workflows/lint-haml.yml
vendored
22
.github/workflows/lint-haml.yml
vendored
|
@ -1,13 +1,9 @@
|
||||||
name: Haml Linting
|
name: Haml Linting
|
||||||
on:
|
on:
|
||||||
merge_group:
|
|
||||||
push:
|
push:
|
||||||
branches:
|
branches-ignore:
|
||||||
- 'main'
|
- 'dependabot/**'
|
||||||
- 'kb*'
|
- 'renovate/**'
|
||||||
- 'upstream-*'
|
|
||||||
- 'releases/*'
|
|
||||||
- 'stable-*'
|
|
||||||
paths:
|
paths:
|
||||||
- '.github/workflows/haml-lint-problem-matcher.json'
|
- '.github/workflows/haml-lint-problem-matcher.json'
|
||||||
- '.github/workflows/lint-haml.yml'
|
- '.github/workflows/lint-haml.yml'
|
||||||
|
@ -30,20 +26,22 @@ on:
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
env:
|
|
||||||
BUNDLE_ONLY: development
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Clone repository
|
- name: Clone repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install native Ruby dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
|
|
||||||
- name: Set up Ruby
|
- name: Set up Ruby
|
||||||
uses: ruby/setup-ruby@v1
|
uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
|
ruby-version: .ruby-version
|
||||||
bundler-cache: true
|
bundler-cache: true
|
||||||
|
|
||||||
- name: Run haml-lint
|
- name: Run haml-lint
|
||||||
run: |
|
run: |
|
||||||
echo "::add-matcher::.github/workflows/haml-lint-problem-matcher.json"
|
echo "::add-matcher::.github/workflows/haml-lint-problem-matcher.json"
|
||||||
bin/haml-lint --reporter github
|
bundle exec haml-lint
|
||||||
|
|
26
.github/workflows/lint-js.yml
vendored
26
.github/workflows/lint-js.yml
vendored
|
@ -1,20 +1,16 @@
|
||||||
name: JavaScript Linting
|
name: JavaScript Linting
|
||||||
on:
|
on:
|
||||||
merge_group:
|
|
||||||
push:
|
push:
|
||||||
branches:
|
branches-ignore:
|
||||||
- 'main'
|
- 'dependabot/**'
|
||||||
- 'kb*'
|
- 'renovate/**'
|
||||||
- 'upstream-*'
|
|
||||||
- 'releases/*'
|
|
||||||
- 'stable-*'
|
|
||||||
paths:
|
paths:
|
||||||
- 'package.json'
|
- 'package.json'
|
||||||
- 'yarn.lock'
|
- 'yarn.lock'
|
||||||
- 'tsconfig.json'
|
- 'tsconfig.json'
|
||||||
- '.nvmrc'
|
- '.nvmrc'
|
||||||
- '.prettier*'
|
- '.prettier*'
|
||||||
- 'eslint.config.mjs'
|
- '.eslint*'
|
||||||
- '**/*.js'
|
- '**/*.js'
|
||||||
- '**/*.jsx'
|
- '**/*.jsx'
|
||||||
- '**/*.ts'
|
- '**/*.ts'
|
||||||
|
@ -28,7 +24,7 @@ on:
|
||||||
- 'tsconfig.json'
|
- 'tsconfig.json'
|
||||||
- '.nvmrc'
|
- '.nvmrc'
|
||||||
- '.prettier*'
|
- '.prettier*'
|
||||||
- 'eslint.config.mjs'
|
- '.eslint*'
|
||||||
- '**/*.js'
|
- '**/*.js'
|
||||||
- '**/*.jsx'
|
- '**/*.jsx'
|
||||||
- '**/*.ts'
|
- '**/*.ts'
|
||||||
|
@ -43,11 +39,17 @@ jobs:
|
||||||
- name: Clone repository
|
- name: Clone repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Set up Javascript environment
|
- name: Set up Node.js
|
||||||
uses: ./.github/actions/setup-javascript
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
cache: yarn
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install all yarn packages
|
||||||
|
run: yarn --frozen-lockfile
|
||||||
|
|
||||||
- name: ESLint
|
- name: ESLint
|
||||||
run: yarn workspaces foreach --all --parallel run lint:js --max-warnings 0
|
run: yarn lint:js --max-warnings 0
|
||||||
|
|
||||||
- name: Typecheck
|
- name: Typecheck
|
||||||
run: yarn typecheck
|
run: yarn typecheck
|
||||||
|
|
44
.github/workflows/lint-json.yml
vendored
Normal file
44
.github/workflows/lint-json.yml
vendored
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
name: JSON Linting
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches-ignore:
|
||||||
|
- 'dependabot/**'
|
||||||
|
- 'renovate/**'
|
||||||
|
paths:
|
||||||
|
- 'package.json'
|
||||||
|
- 'yarn.lock'
|
||||||
|
- '.nvmrc'
|
||||||
|
- '.prettier*'
|
||||||
|
- '**/*.json'
|
||||||
|
- '.github/workflows/lint-json.yml'
|
||||||
|
- '!app/javascript/mastodon/locales/*.json'
|
||||||
|
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'package.json'
|
||||||
|
- 'yarn.lock'
|
||||||
|
- '.nvmrc'
|
||||||
|
- '.prettier*'
|
||||||
|
- '**/*.json'
|
||||||
|
- '.github/workflows/lint-json.yml'
|
||||||
|
- '!app/javascript/mastodon/locales/*.json'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Clone repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
cache: yarn
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install all yarn packages
|
||||||
|
run: yarn --frozen-lockfile
|
||||||
|
|
||||||
|
- name: Prettier
|
||||||
|
run: yarn lint:json
|
44
.github/workflows/lint-md.yml
vendored
Normal file
44
.github/workflows/lint-md.yml
vendored
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
name: Markdown Linting
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches-ignore:
|
||||||
|
- 'dependabot/**'
|
||||||
|
- 'renovate/**'
|
||||||
|
paths:
|
||||||
|
- '.github/workflows/lint-md.yml'
|
||||||
|
- '.nvmrc'
|
||||||
|
- '.prettier*'
|
||||||
|
- '**/*.md'
|
||||||
|
- '!AUTHORS.md'
|
||||||
|
- 'package.json'
|
||||||
|
- 'yarn.lock'
|
||||||
|
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- '.github/workflows/lint-md.yml'
|
||||||
|
- '.nvmrc'
|
||||||
|
- '.prettier*'
|
||||||
|
- '**/*.md'
|
||||||
|
- '!AUTHORS.md'
|
||||||
|
- 'package.json'
|
||||||
|
- 'yarn.lock'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Clone repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
cache: yarn
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install all yarn packages
|
||||||
|
run: yarn --frozen-lockfile
|
||||||
|
|
||||||
|
- name: Prettier
|
||||||
|
run: yarn lint:md
|
23
.github/workflows/lint-ruby.yml
vendored
23
.github/workflows/lint-ruby.yml
vendored
|
@ -1,18 +1,13 @@
|
||||||
name: Ruby Linting
|
name: Ruby Linting
|
||||||
on:
|
on:
|
||||||
merge_group:
|
|
||||||
push:
|
push:
|
||||||
branches:
|
branches-ignore:
|
||||||
- 'main'
|
- 'dependabot/**'
|
||||||
- 'kb*'
|
- 'renovate/**'
|
||||||
- 'upstream-*'
|
|
||||||
- 'releases/*'
|
|
||||||
- 'stable-*'
|
|
||||||
paths:
|
paths:
|
||||||
- 'Gemfile*'
|
- 'Gemfile*'
|
||||||
- '.rubocop*.yml'
|
- '.rubocop*.yml'
|
||||||
- '.ruby-version'
|
- '.ruby-version'
|
||||||
- 'bin/rubocop'
|
|
||||||
- 'config/brakeman.ignore'
|
- 'config/brakeman.ignore'
|
||||||
- '**/*.rb'
|
- '**/*.rb'
|
||||||
- '**/*.rake'
|
- '**/*.rake'
|
||||||
|
@ -23,7 +18,6 @@ on:
|
||||||
- 'Gemfile*'
|
- 'Gemfile*'
|
||||||
- '.rubocop*.yml'
|
- '.rubocop*.yml'
|
||||||
- '.ruby-version'
|
- '.ruby-version'
|
||||||
- 'bin/rubocop'
|
|
||||||
- 'config/brakeman.ignore'
|
- 'config/brakeman.ignore'
|
||||||
- '**/*.rb'
|
- '**/*.rb'
|
||||||
- '**/*.rake'
|
- '**/*.rake'
|
||||||
|
@ -33,24 +27,25 @@ jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
env:
|
|
||||||
BUNDLE_ONLY: development
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Clone repository
|
- name: Clone repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install native Ruby dependencies
|
||||||
|
run: sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
|
|
||||||
- name: Set up Ruby
|
- name: Set up Ruby
|
||||||
uses: ruby/setup-ruby@v1
|
uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
|
ruby-version: .ruby-version
|
||||||
bundler-cache: true
|
bundler-cache: true
|
||||||
|
|
||||||
- name: Set-up RuboCop Problem Matcher
|
- name: Set-up RuboCop Problem Matcher
|
||||||
uses: r7kamura/rubocop-problem-matchers-action@v1
|
uses: r7kamura/rubocop-problem-matchers-action@v1
|
||||||
|
|
||||||
- name: Run rubocop
|
- name: Run rubocop
|
||||||
run: bin/rubocop
|
run: bundle exec rubocop
|
||||||
|
|
||||||
- name: Run brakeman
|
- name: Run brakeman
|
||||||
if: always() # Run both checks, even if the first failed
|
if: always() # Run both checks, even if the first failed
|
||||||
run: bin/brakeman
|
run: bundle exec brakeman
|
||||||
|
|
46
.github/workflows/lint-yml.yml
vendored
Normal file
46
.github/workflows/lint-yml.yml
vendored
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
name: YML Linting
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches-ignore:
|
||||||
|
- 'dependabot/**'
|
||||||
|
- 'renovate/**'
|
||||||
|
paths:
|
||||||
|
- 'package.json'
|
||||||
|
- 'yarn.lock'
|
||||||
|
- '.nvmrc'
|
||||||
|
- '.prettier*'
|
||||||
|
- '**/*.yaml'
|
||||||
|
- '**/*.yml'
|
||||||
|
- '.github/workflows/lint-yml.yml'
|
||||||
|
- '!config/locales/*.yml'
|
||||||
|
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'package.json'
|
||||||
|
- 'yarn.lock'
|
||||||
|
- '.nvmrc'
|
||||||
|
- '.prettier*'
|
||||||
|
- '**/*.yaml'
|
||||||
|
- '**/*.yml'
|
||||||
|
- '.github/workflows/lint-yml.yml'
|
||||||
|
- '!config/locales/*.yml'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Clone repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
cache: yarn
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install all yarn packages
|
||||||
|
run: yarn --frozen-lockfile
|
||||||
|
|
||||||
|
- name: Prettier
|
||||||
|
run: yarn lint:yml
|
3
.github/workflows/rebase-needed.yml
vendored
3
.github/workflows/rebase-needed.yml
vendored
|
@ -10,7 +10,6 @@ permissions:
|
||||||
jobs:
|
jobs:
|
||||||
label-rebase-needed:
|
label-rebase-needed:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: github.repository == 'mastodon/mastodon'
|
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
@ -18,7 +17,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check for merge conflicts
|
- name: Check for merge conflicts
|
||||||
uses: eps1lon/actions-label-merge-conflict@v3
|
uses: eps1lon/actions-label-merge-conflict@releases/2.x
|
||||||
with:
|
with:
|
||||||
dirtyLabel: 'rebase needed :construction:'
|
dirtyLabel: 'rebase needed :construction:'
|
||||||
repoToken: '${{ secrets.GITHUB_TOKEN }}'
|
repoToken: '${{ secrets.GITHUB_TOKEN }}'
|
||||||
|
|
22
.github/workflows/test-js.yml
vendored
22
.github/workflows/test-js.yml
vendored
|
@ -1,13 +1,9 @@
|
||||||
name: JavaScript Testing
|
name: JavaScript Testing
|
||||||
on:
|
on:
|
||||||
merge_group:
|
|
||||||
push:
|
push:
|
||||||
branches:
|
branches-ignore:
|
||||||
- 'main'
|
- 'dependabot/**'
|
||||||
- 'kb*'
|
- 'renovate/**'
|
||||||
- 'upstream-*'
|
|
||||||
- 'releases/*'
|
|
||||||
- 'stable-*'
|
|
||||||
paths:
|
paths:
|
||||||
- 'package.json'
|
- 'package.json'
|
||||||
- 'yarn.lock'
|
- 'yarn.lock'
|
||||||
|
@ -39,8 +35,14 @@ jobs:
|
||||||
- name: Clone repository
|
- name: Clone repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Set up Javascript environment
|
- name: Set up Node.js
|
||||||
uses: ./.github/actions/setup-javascript
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
cache: yarn
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
- name: JavaScript testing
|
- name: Install all yarn packages
|
||||||
|
run: yarn --frozen-lockfile
|
||||||
|
|
||||||
|
- name: Jest testing
|
||||||
run: yarn jest --reporters github-actions summary
|
run: yarn jest --reporters github-actions summary
|
||||||
|
|
111
.github/workflows/test-migrations-one-step.yml
vendored
Normal file
111
.github/workflows/test-migrations-one-step.yml
vendored
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
name: Test one step migrations
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches-ignore:
|
||||||
|
- 'dependabot/**'
|
||||||
|
- 'renovate/**'
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
pre_job:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
should_skip: ${{ steps.skip_check.outputs.should_skip }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- id: skip_check
|
||||||
|
uses: fkirc/skip-duplicate-actions@v5
|
||||||
|
with:
|
||||||
|
paths: '["Gemfile*", ".ruby-version", "**/*.rb", ".github/workflows/test-migrations-one-step.yml", "lib/tasks/tests.rake"]'
|
||||||
|
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: pre_job
|
||||||
|
if: needs.pre_job.outputs.should_skip != 'true'
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
postgres:
|
||||||
|
- 14-alpine
|
||||||
|
- 15-alpine
|
||||||
|
|
||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: postgres:${{ matrix.postgres}}
|
||||||
|
env:
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
options: >-
|
||||||
|
--health-cmd pg_isready
|
||||||
|
--health-interval 10s
|
||||||
|
--health-timeout 5s
|
||||||
|
--health-retries 5
|
||||||
|
ports:
|
||||||
|
- 5432:5432
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:7-alpine
|
||||||
|
options: >-
|
||||||
|
--health-cmd "redis-cli ping"
|
||||||
|
--health-interval 10s
|
||||||
|
--health-timeout 5s
|
||||||
|
--health-retries 5
|
||||||
|
ports:
|
||||||
|
- 6379:6379
|
||||||
|
|
||||||
|
env:
|
||||||
|
CONTINUOUS_INTEGRATION: true
|
||||||
|
DB_HOST: localhost
|
||||||
|
DB_USER: postgres
|
||||||
|
DB_PASS: postgres
|
||||||
|
DISABLE_SIMPLECOV: true
|
||||||
|
RAILS_ENV: test
|
||||||
|
BUNDLE_CLEAN: true
|
||||||
|
BUNDLE_FROZEN: true
|
||||||
|
BUNDLE_WITHOUT: 'development production'
|
||||||
|
BUNDLE_JOBS: 3
|
||||||
|
BUNDLE_RETRY: 3
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install native Ruby dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
|
|
||||||
|
- name: Set up bundler cache
|
||||||
|
uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: .ruby-version
|
||||||
|
bundler-cache: true
|
||||||
|
|
||||||
|
- name: Create database
|
||||||
|
run: './bin/rails db:create'
|
||||||
|
|
||||||
|
- name: Run migrations up to v2.0.0
|
||||||
|
run: './bin/rails db:migrate VERSION=20171010025614'
|
||||||
|
|
||||||
|
- name: Populate database with test data
|
||||||
|
run: './bin/rails tests:migrations:populate_v2'
|
||||||
|
|
||||||
|
- name: Run migrations up to v2.4.0
|
||||||
|
run: './bin/rails db:migrate VERSION=20180514140000'
|
||||||
|
|
||||||
|
- name: Populate database with test data
|
||||||
|
run: './bin/rails tests:migrations:populate_v2_4'
|
||||||
|
|
||||||
|
- name: Run migrations up to v2.4.3
|
||||||
|
run: './bin/rails db:migrate VERSION=20180707154237'
|
||||||
|
|
||||||
|
- name: Populate database with test data
|
||||||
|
run: './bin/rails tests:migrations:populate_v2_4_3'
|
||||||
|
|
||||||
|
- name: Run all remaining migrations
|
||||||
|
run: './bin/rails db:migrate'
|
||||||
|
|
||||||
|
- name: Check migration result
|
||||||
|
run: './bin/rails tests:migrations:check_database'
|
119
.github/workflows/test-migrations-two-step.yml
vendored
Normal file
119
.github/workflows/test-migrations-two-step.yml
vendored
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
name: Test two step migrations
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches-ignore:
|
||||||
|
- 'dependabot/**'
|
||||||
|
- 'renovate/**'
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
pre_job:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
should_skip: ${{ steps.skip_check.outputs.should_skip }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- id: skip_check
|
||||||
|
uses: fkirc/skip-duplicate-actions@v5
|
||||||
|
with:
|
||||||
|
paths: '["Gemfile*", ".ruby-version", "**/*.rb", ".github/workflows/test-migrations-two-step.yml", "lib/tasks/tests.rake"]'
|
||||||
|
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: pre_job
|
||||||
|
if: needs.pre_job.outputs.should_skip != 'true'
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
postgres:
|
||||||
|
- 14-alpine
|
||||||
|
- 15-alpine
|
||||||
|
|
||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: postgres:${{ matrix.postgres}}
|
||||||
|
env:
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
options: >-
|
||||||
|
--health-cmd pg_isready
|
||||||
|
--health-interval 10s
|
||||||
|
--health-timeout 5s
|
||||||
|
--health-retries 5
|
||||||
|
ports:
|
||||||
|
- 5432:5432
|
||||||
|
redis:
|
||||||
|
image: redis:7-alpine
|
||||||
|
options: >-
|
||||||
|
--health-cmd "redis-cli ping"
|
||||||
|
--health-interval 10s
|
||||||
|
--health-timeout 5s
|
||||||
|
--health-retries 5
|
||||||
|
ports:
|
||||||
|
- 6379:6379
|
||||||
|
|
||||||
|
env:
|
||||||
|
CONTINUOUS_INTEGRATION: true
|
||||||
|
DB_HOST: localhost
|
||||||
|
DB_USER: postgres
|
||||||
|
DB_PASS: postgres
|
||||||
|
DISABLE_SIMPLECOV: true
|
||||||
|
RAILS_ENV: test
|
||||||
|
BUNDLE_CLEAN: true
|
||||||
|
BUNDLE_FROZEN: true
|
||||||
|
BUNDLE_WITHOUT: 'development production'
|
||||||
|
BUNDLE_JOBS: 3
|
||||||
|
BUNDLE_RETRY: 3
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install native Ruby dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
|
|
||||||
|
- name: Set up bundler cache
|
||||||
|
uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: .ruby-version
|
||||||
|
bundler-cache: true
|
||||||
|
|
||||||
|
- name: Create database
|
||||||
|
run: './bin/rails db:create'
|
||||||
|
|
||||||
|
- name: Run migrations up to v2.0.0
|
||||||
|
run: './bin/rails db:migrate VERSION=20171010025614'
|
||||||
|
|
||||||
|
- name: Populate database with test data
|
||||||
|
run: './bin/rails tests:migrations:populate_v2'
|
||||||
|
|
||||||
|
- name: Run pre-deployment migrations up to v2.4.0
|
||||||
|
run: './bin/rails db:migrate VERSION=20180514140000'
|
||||||
|
env:
|
||||||
|
SKIP_POST_DEPLOYMENT_MIGRATIONS: true
|
||||||
|
|
||||||
|
- name: Populate database with test data
|
||||||
|
run: './bin/rails tests:migrations:populate_v2_4'
|
||||||
|
|
||||||
|
- name: Run migrations up to v2.4.3
|
||||||
|
run: './bin/rails db:migrate VERSION=20180707154237'
|
||||||
|
env:
|
||||||
|
SKIP_POST_DEPLOYMENT_MIGRATIONS: true
|
||||||
|
|
||||||
|
- name: Populate database with test data
|
||||||
|
run: './bin/rails tests:migrations:populate_v2_4_3'
|
||||||
|
|
||||||
|
- name: Run all remaining pre-deployment migrations
|
||||||
|
run: './bin/rails db:migrate'
|
||||||
|
env:
|
||||||
|
SKIP_POST_DEPLOYMENT_MIGRATIONS: true
|
||||||
|
|
||||||
|
- name: Run all post-deployment migrations
|
||||||
|
run: './bin/rails db:migrate'
|
||||||
|
|
||||||
|
- name: Check migration result
|
||||||
|
run: './bin/rails tests:migrations:check_database'
|
115
.github/workflows/test-migrations.yml
vendored
115
.github/workflows/test-migrations.yml
vendored
|
@ -1,115 +0,0 @@
|
||||||
name: Historical data migration test
|
|
||||||
|
|
||||||
on:
|
|
||||||
merge_group:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- 'main'
|
|
||||||
- 'kb*'
|
|
||||||
- 'upstream-*'
|
|
||||||
- 'releases/*'
|
|
||||||
- 'stable-*'
|
|
||||||
paths:
|
|
||||||
- 'Gemfile*'
|
|
||||||
- '.ruby-version'
|
|
||||||
- '**/*.rb'
|
|
||||||
- '.github/workflows/test-migrations.yml'
|
|
||||||
- 'lib/tasks/tests.rake'
|
|
||||||
- 'lib/tasks/db.rake'
|
|
||||||
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- 'Gemfile*'
|
|
||||||
- '.ruby-version'
|
|
||||||
- '**/*.rb'
|
|
||||||
- '.github/workflows/test-migrations.yml'
|
|
||||||
- 'lib/tasks/tests.rake'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
postgres:
|
|
||||||
- 14-alpine
|
|
||||||
- 15-alpine
|
|
||||||
- 16-alpine
|
|
||||||
- 17-alpine
|
|
||||||
|
|
||||||
services:
|
|
||||||
postgres:
|
|
||||||
image: postgres:${{ matrix.postgres}}
|
|
||||||
env:
|
|
||||||
POSTGRES_PASSWORD: postgres
|
|
||||||
POSTGRES_USER: postgres
|
|
||||||
options: >-
|
|
||||||
--health-cmd pg_isready
|
|
||||||
--health-interval 10ms
|
|
||||||
--health-timeout 3s
|
|
||||||
--health-retries 50
|
|
||||||
ports:
|
|
||||||
- 5432:5432
|
|
||||||
|
|
||||||
redis:
|
|
||||||
image: redis:7-alpine
|
|
||||||
options: >-
|
|
||||||
--health-cmd "redis-cli ping"
|
|
||||||
--health-interval 10ms
|
|
||||||
--health-timeout 3s
|
|
||||||
--health-retries 50
|
|
||||||
ports:
|
|
||||||
- 6379:6379
|
|
||||||
|
|
||||||
env:
|
|
||||||
DB_HOST: localhost
|
|
||||||
DB_USER: postgres
|
|
||||||
DB_PASS: postgres
|
|
||||||
RAILS_ENV: test
|
|
||||||
BUNDLE_CLEAN: true
|
|
||||||
BUNDLE_FROZEN: true
|
|
||||||
BUNDLE_WITHOUT: 'development:production'
|
|
||||||
BUNDLE_JOBS: 3
|
|
||||||
BUNDLE_RETRY: 3
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set up Ruby environment
|
|
||||||
uses: ./.github/actions/setup-ruby
|
|
||||||
|
|
||||||
- name: Ensure no errors with `db:prepare`
|
|
||||||
run: |
|
|
||||||
bin/rails db:drop
|
|
||||||
bin/rails db:prepare
|
|
||||||
bin/rails db:migrate
|
|
||||||
|
|
||||||
- name: Ensure no errors with `db:prepare` and SKIP_POST_DEPLOYMENT_MIGRATIONS
|
|
||||||
run: |
|
|
||||||
bin/rails db:drop
|
|
||||||
SKIP_POST_DEPLOYMENT_MIGRATIONS=true bin/rails db:prepare
|
|
||||||
bin/rails db:migrate
|
|
||||||
|
|
||||||
- name: Test "one step migration" flow
|
|
||||||
run: |
|
|
||||||
bin/rails db:drop
|
|
||||||
bin/rails db:create
|
|
||||||
bin/rails tests:migrations:prepare_database
|
|
||||||
bin/rails db:migrate
|
|
||||||
bin/rails tests:migrations:check_database
|
|
||||||
|
|
||||||
- name: Test "two step migration" flow
|
|
||||||
run: |
|
|
||||||
bin/rails db:drop
|
|
||||||
bin/rails db:create
|
|
||||||
SKIP_POST_DEPLOYMENT_MIGRATIONS=true bin/rails tests:migrations:prepare_database
|
|
||||||
|
|
||||||
# Migrate up to v4.2.0 breakpoint
|
|
||||||
bin/rails db:migrate VERSION=20230907150100
|
|
||||||
|
|
||||||
# Migrate the rest
|
|
||||||
SKIP_POST_DEPLOYMENT_MIGRATIONS=true bin/rails db:migrate
|
|
||||||
bin/rails db:migrate
|
|
||||||
bin/rails tests:migrations:check_database
|
|
454
.github/workflows/test-ruby.yml
vendored
454
.github/workflows/test-ruby.yml
vendored
|
@ -1,14 +1,10 @@
|
||||||
name: Ruby Testing
|
name: Ruby Testing
|
||||||
|
|
||||||
on:
|
on:
|
||||||
merge_group:
|
|
||||||
push:
|
push:
|
||||||
branches:
|
branches-ignore:
|
||||||
- 'main'
|
- 'dependabot/**'
|
||||||
- 'kb*'
|
- 'renovate/**'
|
||||||
- 'upstream-*'
|
|
||||||
- 'releases/*'
|
|
||||||
- 'stable-*'
|
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
@ -32,47 +28,42 @@ jobs:
|
||||||
env:
|
env:
|
||||||
RAILS_ENV: ${{ matrix.mode }}
|
RAILS_ENV: ${{ matrix.mode }}
|
||||||
BUNDLE_WITH: ${{ matrix.mode }}
|
BUNDLE_WITH: ${{ matrix.mode }}
|
||||||
SECRET_KEY_BASE_DUMMY: 1
|
OTP_SECRET: precompile_placeholder
|
||||||
|
SECRET_KEY_BASE: precompile_placeholder
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Set up Ruby environment
|
- name: Set up Node.js
|
||||||
uses: ./.github/actions/setup-ruby
|
uses: actions/setup-node@v3
|
||||||
|
|
||||||
- name: Set up Javascript environment
|
|
||||||
uses: ./.github/actions/setup-javascript
|
|
||||||
with:
|
with:
|
||||||
onlyProduction: 'true'
|
cache: yarn
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
- name: Cache assets from compilation
|
- name: Install native Ruby dependencies
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
public/assets
|
|
||||||
public/packs
|
|
||||||
public/packs-test
|
|
||||||
tmp/cache/webpacker
|
|
||||||
key: ${{ matrix.mode }}-assets-${{ github.head_ref || github.ref_name }}-${{ github.sha }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ matrix.mode }}-assets-${{ github.head_ref || github.ref_name }}-${{ github.sha }}
|
|
||||||
${{ matrix.mode }}-assets-${{ github.head_ref || github.ref_name }}
|
|
||||||
${{ matrix.mode }}-assets-main
|
|
||||||
${{ matrix.mode }}-assets
|
|
||||||
|
|
||||||
- name: Precompile assets
|
|
||||||
run: |-
|
|
||||||
bin/rails assets:precompile
|
|
||||||
|
|
||||||
- name: Archive asset artifacts
|
|
||||||
run: |
|
run: |
|
||||||
tar --exclude={"*.br","*.gz"} -zcf artifacts.tar.gz public/assets public/packs*
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
- name: Set up bundler cache
|
||||||
|
uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: .ruby-version
|
||||||
|
bundler-cache: true
|
||||||
|
|
||||||
|
- run: yarn --frozen-lockfile --production
|
||||||
|
- name: Precompile assets
|
||||||
|
# Previously had set this, but it's not supported
|
||||||
|
# export NODE_OPTIONS=--openssl-legacy-provider
|
||||||
|
run: |-
|
||||||
|
./bin/rails assets:precompile
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
if: matrix.mode == 'test'
|
if: matrix.mode == 'test'
|
||||||
with:
|
with:
|
||||||
path: |-
|
path: |-
|
||||||
./artifacts.tar.gz
|
./public/assets
|
||||||
|
./public/packs-test
|
||||||
name: ${{ github.sha }}
|
name: ${{ github.sha }}
|
||||||
retention-days: 0
|
retention-days: 0
|
||||||
|
|
||||||
|
@ -90,9 +81,9 @@ jobs:
|
||||||
POSTGRES_USER: postgres
|
POSTGRES_USER: postgres
|
||||||
options: >-
|
options: >-
|
||||||
--health-cmd pg_isready
|
--health-cmd pg_isready
|
||||||
--health-interval 10ms
|
--health-interval 10s
|
||||||
--health-timeout 3s
|
--health-timeout 5s
|
||||||
--health-retries 50
|
--health-retries 5
|
||||||
ports:
|
ports:
|
||||||
- 5432:5432
|
- 5432:5432
|
||||||
|
|
||||||
|
@ -100,9 +91,9 @@ jobs:
|
||||||
image: redis:7-alpine
|
image: redis:7-alpine
|
||||||
options: >-
|
options: >-
|
||||||
--health-cmd "redis-cli ping"
|
--health-cmd "redis-cli ping"
|
||||||
--health-interval 10ms
|
--health-interval 10s
|
||||||
--health-timeout 3s
|
--health-timeout 5s
|
||||||
--health-retries 50
|
--health-retries 5
|
||||||
ports:
|
ports:
|
||||||
- 6379:6379
|
- 6379:6379
|
||||||
|
|
||||||
|
@ -110,7 +101,7 @@ jobs:
|
||||||
DB_HOST: localhost
|
DB_HOST: localhost
|
||||||
DB_USER: postgres
|
DB_USER: postgres
|
||||||
DB_PASS: postgres
|
DB_PASS: postgres
|
||||||
COVERAGE: ${{ matrix.ruby-version == '.ruby-version' }}
|
DISABLE_SIMPLECOV: true
|
||||||
RAILS_ENV: test
|
RAILS_ENV: test
|
||||||
ALLOW_NOPAM: true
|
ALLOW_NOPAM: true
|
||||||
PAM_ENABLED: true
|
PAM_ENABLED: true
|
||||||
|
@ -121,148 +112,48 @@ jobs:
|
||||||
SAML_ENABLED: true
|
SAML_ENABLED: true
|
||||||
CAS_ENABLED: true
|
CAS_ENABLED: true
|
||||||
BUNDLE_WITH: 'pam_authentication test'
|
BUNDLE_WITH: 'pam_authentication test'
|
||||||
GITHUB_RSPEC: ${{ matrix.ruby-version == '.ruby-version' && github.event.pull_request && 'true' }}
|
CI_JOBS: ${{ matrix.ci_job }}/4
|
||||||
ES_ENABLED: false
|
ES_ENABLED: false
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
ruby-version:
|
ruby-version:
|
||||||
- '3.2'
|
- '3.0'
|
||||||
- '3.3'
|
- '3.1'
|
||||||
- '.ruby-version'
|
- '.ruby-version'
|
||||||
|
ci_job:
|
||||||
|
- 1
|
||||||
|
- 2
|
||||||
|
- 3
|
||||||
|
- 4
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v3
|
||||||
with:
|
with:
|
||||||
path: './'
|
path: './public'
|
||||||
name: ${{ github.sha }}
|
name: ${{ github.sha }}
|
||||||
|
|
||||||
- name: Expand archived asset artifacts
|
- name: Update package index
|
||||||
run: |
|
run: sudo apt-get update
|
||||||
tar xvzf artifacts.tar.gz
|
|
||||||
|
|
||||||
- name: Set up Ruby environment
|
- name: Install native Ruby dependencies
|
||||||
uses: ./.github/actions/setup-ruby
|
run: sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
|
|
||||||
|
- name: Install additional system dependencies
|
||||||
|
run: sudo apt-get install -y ffmpeg imagemagick libpam-dev
|
||||||
|
|
||||||
|
- name: Set up bundler cache
|
||||||
|
uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: ${{ matrix.ruby-version}}
|
ruby-version: ${{ matrix.ruby-version}}
|
||||||
additional-system-dependencies: ffmpeg imagemagick libpam-dev
|
bundler-cache: true
|
||||||
|
|
||||||
- name: Load database schema
|
|
||||||
run: |
|
|
||||||
bin/rails db:setup
|
|
||||||
bin/flatware fan bin/rails db:test:prepare
|
|
||||||
|
|
||||||
- name: Cache RSpec persistence file
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
tmp/rspec/examples.txt
|
|
||||||
key: rspec-persistence-${{ github.head_ref || github.ref_name }}-${{ github.sha }}
|
|
||||||
restore-keys: |
|
|
||||||
rspec-persistence-${{ github.head_ref || github.ref_name }}-${{ github.sha }}-${{ matrix.ruby-version }}
|
|
||||||
rspec-persistence-${{ github.head_ref || github.ref_name }}-${{ github.sha }}
|
|
||||||
rspec-persistence-${{ github.head_ref || github.ref_name }}
|
|
||||||
rspec-persistence-main
|
|
||||||
rspec-persistence
|
|
||||||
|
|
||||||
- run: bin/flatware rspec -r ./spec/flatware_helper.rb
|
|
||||||
|
|
||||||
- name: Upload coverage reports to Codecov
|
|
||||||
if: matrix.ruby-version == '.ruby-version'
|
|
||||||
uses: codecov/codecov-action@v5
|
|
||||||
with:
|
|
||||||
files: coverage/lcov/*.lcov
|
|
||||||
env:
|
|
||||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
||||||
|
|
||||||
test-libvips:
|
|
||||||
name: Libvips tests
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
needs:
|
|
||||||
- build
|
|
||||||
|
|
||||||
services:
|
|
||||||
postgres:
|
|
||||||
image: postgres:14-alpine
|
|
||||||
env:
|
|
||||||
POSTGRES_PASSWORD: postgres
|
|
||||||
POSTGRES_USER: postgres
|
|
||||||
options: >-
|
|
||||||
--health-cmd pg_isready
|
|
||||||
--health-interval 10ms
|
|
||||||
--health-timeout 3s
|
|
||||||
--health-retries 50
|
|
||||||
ports:
|
|
||||||
- 5432:5432
|
|
||||||
|
|
||||||
redis:
|
|
||||||
image: redis:7-alpine
|
|
||||||
options: >-
|
|
||||||
--health-cmd "redis-cli ping"
|
|
||||||
--health-interval 10ms
|
|
||||||
--health-timeout 3s
|
|
||||||
--health-retries 50
|
|
||||||
ports:
|
|
||||||
- 6379:6379
|
|
||||||
|
|
||||||
env:
|
|
||||||
DB_HOST: localhost
|
|
||||||
DB_USER: postgres
|
|
||||||
DB_PASS: postgres
|
|
||||||
COVERAGE: ${{ matrix.ruby-version == '.ruby-version' }}
|
|
||||||
RAILS_ENV: test
|
|
||||||
ALLOW_NOPAM: true
|
|
||||||
PAM_ENABLED: true
|
|
||||||
PAM_DEFAULT_SERVICE: pam_test
|
|
||||||
PAM_CONTROLLED_SERVICE: pam_test_controlled
|
|
||||||
OIDC_ENABLED: true
|
|
||||||
OIDC_SCOPE: read
|
|
||||||
SAML_ENABLED: true
|
|
||||||
CAS_ENABLED: true
|
|
||||||
BUNDLE_WITH: 'pam_authentication test'
|
|
||||||
GITHUB_RSPEC: ${{ matrix.ruby-version == '.ruby-version' && github.event.pull_request && 'true' }}
|
|
||||||
MASTODON_USE_LIBVIPS: true
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
ruby-version:
|
|
||||||
- '3.2'
|
|
||||||
- '3.3'
|
|
||||||
- '.ruby-version'
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
path: './'
|
|
||||||
name: ${{ github.sha }}
|
|
||||||
|
|
||||||
- name: Expand archived asset artifacts
|
|
||||||
run: |
|
|
||||||
tar xvzf artifacts.tar.gz
|
|
||||||
|
|
||||||
- name: Set up Ruby environment
|
|
||||||
uses: ./.github/actions/setup-ruby
|
|
||||||
with:
|
|
||||||
ruby-version: ${{ matrix.ruby-version}}
|
|
||||||
additional-system-dependencies: ffmpeg libpam-dev
|
|
||||||
|
|
||||||
- name: Load database schema
|
- name: Load database schema
|
||||||
run: './bin/rails db:create db:schema:load db:seed'
|
run: './bin/rails db:create db:schema:load db:seed'
|
||||||
|
|
||||||
- run: bin/rspec --tag attachment_processing
|
- run: bundle exec rake rspec_chunked
|
||||||
|
|
||||||
- name: Upload coverage reports to Codecov
|
|
||||||
if: matrix.ruby-version == '.ruby-version'
|
|
||||||
uses: codecov/codecov-action@v5
|
|
||||||
with:
|
|
||||||
files: coverage/lcov/mastodon.lcov
|
|
||||||
env:
|
|
||||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
||||||
|
|
||||||
test-e2e:
|
test-e2e:
|
||||||
name: End to End testing
|
name: End to End testing
|
||||||
|
@ -279,9 +170,9 @@ jobs:
|
||||||
POSTGRES_USER: postgres
|
POSTGRES_USER: postgres
|
||||||
options: >-
|
options: >-
|
||||||
--health-cmd pg_isready
|
--health-cmd pg_isready
|
||||||
--health-interval 10ms
|
--health-interval 10s
|
||||||
--health-timeout 3s
|
--health-timeout 5s
|
||||||
--health-retries 50
|
--health-retries 5
|
||||||
ports:
|
ports:
|
||||||
- 5432:5432
|
- 5432:5432
|
||||||
|
|
||||||
|
@ -289,9 +180,9 @@ jobs:
|
||||||
image: redis:7-alpine
|
image: redis:7-alpine
|
||||||
options: >-
|
options: >-
|
||||||
--health-cmd "redis-cli ping"
|
--health-cmd "redis-cli ping"
|
||||||
--health-interval 10ms
|
--health-interval 10s
|
||||||
--health-timeout 3s
|
--health-timeout 5s
|
||||||
--health-retries 50
|
--health-retries 5
|
||||||
ports:
|
ports:
|
||||||
- 6379:6379
|
- 6379:6379
|
||||||
|
|
||||||
|
@ -299,62 +190,71 @@ jobs:
|
||||||
DB_HOST: localhost
|
DB_HOST: localhost
|
||||||
DB_USER: postgres
|
DB_USER: postgres
|
||||||
DB_PASS: postgres
|
DB_PASS: postgres
|
||||||
|
DISABLE_SIMPLECOV: true
|
||||||
RAILS_ENV: test
|
RAILS_ENV: test
|
||||||
BUNDLE_WITH: test
|
BUNDLE_WITH: test
|
||||||
ES_ENABLED: false
|
ES_ENABLED: false
|
||||||
LOCAL_DOMAIN: localhost:3000
|
|
||||||
LOCAL_HTTPS: false
|
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
ruby-version:
|
ruby-version:
|
||||||
- '3.2'
|
- '3.0'
|
||||||
- '3.3'
|
- '3.1'
|
||||||
- '.ruby-version'
|
- '.ruby-version'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v3
|
||||||
with:
|
with:
|
||||||
path: './'
|
path: './public'
|
||||||
name: ${{ github.sha }}
|
name: ${{ github.sha }}
|
||||||
|
|
||||||
- name: Expand archived asset artifacts
|
- name: Update package index
|
||||||
run: |
|
run: sudo apt-get update
|
||||||
tar xvzf artifacts.tar.gz
|
|
||||||
|
|
||||||
- name: Set up Ruby environment
|
- name: Set up Node.js
|
||||||
uses: ./.github/actions/setup-ruby
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
cache: yarn
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install native Ruby dependencies
|
||||||
|
run: sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
|
|
||||||
|
- name: Install additional system dependencies
|
||||||
|
run: sudo apt-get install -y ffmpeg imagemagick
|
||||||
|
|
||||||
|
- name: Set up bundler cache
|
||||||
|
uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: ${{ matrix.ruby-version}}
|
ruby-version: ${{ matrix.ruby-version}}
|
||||||
additional-system-dependencies: ffmpeg imagemagick
|
bundler-cache: true
|
||||||
|
|
||||||
- name: Set up Javascript environment
|
- run: yarn --frozen-lockfile
|
||||||
uses: ./.github/actions/setup-javascript
|
|
||||||
|
|
||||||
- name: Load database schema
|
- name: Load database schema
|
||||||
run: './bin/rails db:create db:schema:load db:seed'
|
run: './bin/rails db:create db:schema:load db:seed'
|
||||||
|
|
||||||
- run: bin/rspec spec/system --tag streaming --tag js
|
- run: bundle exec rake spec:system
|
||||||
|
|
||||||
- name: Archive logs
|
- name: Archive logs
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
name: e2e-logs-${{ matrix.ruby-version }}
|
name: e2e-logs-${{ matrix.ruby-version }}
|
||||||
path: log/
|
path: log/
|
||||||
|
|
||||||
- name: Archive test screenshots
|
- name: Archive test screenshots
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
name: e2e-screenshots
|
name: e2e-screenshots
|
||||||
path: tmp/capybara/
|
path: tmp/screenshots/
|
||||||
|
|
||||||
test-search:
|
test-search:
|
||||||
name: Elastic Search integration testing
|
name: Testing search
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
needs:
|
needs:
|
||||||
|
@ -368,9 +268,9 @@ jobs:
|
||||||
POSTGRES_USER: postgres
|
POSTGRES_USER: postgres
|
||||||
options: >-
|
options: >-
|
||||||
--health-cmd pg_isready
|
--health-cmd pg_isready
|
||||||
--health-interval 10ms
|
--health-interval 10s
|
||||||
--health-timeout 3s
|
--health-timeout 5s
|
||||||
--health-retries 50
|
--health-retries 5
|
||||||
ports:
|
ports:
|
||||||
- 5432:5432
|
- 5432:5432
|
||||||
|
|
||||||
|
@ -378,36 +278,22 @@ jobs:
|
||||||
image: redis:7-alpine
|
image: redis:7-alpine
|
||||||
options: >-
|
options: >-
|
||||||
--health-cmd "redis-cli ping"
|
--health-cmd "redis-cli ping"
|
||||||
--health-interval 10ms
|
--health-interval 10s
|
||||||
--health-timeout 3s
|
--health-timeout 5s
|
||||||
--health-retries 50
|
--health-retries 5
|
||||||
ports:
|
ports:
|
||||||
- 6379:6379
|
- 6379:6379
|
||||||
|
|
||||||
elasticsearch:
|
elasticsearch:
|
||||||
image: ${{ contains(matrix.search-image, 'elasticsearch') && matrix.search-image || '' }}
|
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.13
|
||||||
env:
|
env:
|
||||||
discovery.type: single-node
|
discovery.type: single-node
|
||||||
xpack.security.enabled: false
|
xpack.security.enabled: false
|
||||||
options: >-
|
options: >-
|
||||||
--health-cmd "curl http://localhost:9200/_cluster/health"
|
--health-cmd "curl http://localhost:9200/_cluster/health"
|
||||||
--health-interval 2s
|
--health-interval 10s
|
||||||
--health-timeout 3s
|
--health-timeout 5s
|
||||||
--health-retries 50
|
--health-retries 10
|
||||||
ports:
|
|
||||||
- 9200:9200
|
|
||||||
|
|
||||||
opensearch:
|
|
||||||
image: ${{ contains(matrix.search-image, 'opensearch') && matrix.search-image || '' }}
|
|
||||||
env:
|
|
||||||
discovery.type: single-node
|
|
||||||
DISABLE_INSTALL_DEMO_CONFIG: true
|
|
||||||
DISABLE_SECURITY_PLUGIN: true
|
|
||||||
options: >-
|
|
||||||
--health-cmd "curl http://localhost:9200/_cluster/health"
|
|
||||||
--health-interval 2s
|
|
||||||
--health-timeout 3s
|
|
||||||
--health-retries 50
|
|
||||||
ports:
|
ports:
|
||||||
- 9200:9200
|
- 9200:9200
|
||||||
|
|
||||||
|
@ -415,6 +301,7 @@ jobs:
|
||||||
DB_HOST: localhost
|
DB_HOST: localhost
|
||||||
DB_USER: postgres
|
DB_USER: postgres
|
||||||
DB_PASS: postgres
|
DB_PASS: postgres
|
||||||
|
DISABLE_SIMPLECOV: true
|
||||||
RAILS_ENV: test
|
RAILS_ENV: test
|
||||||
BUNDLE_WITH: test
|
BUNDLE_WITH: test
|
||||||
ES_ENABLED: true
|
ES_ENABLED: true
|
||||||
|
@ -425,139 +312,56 @@ jobs:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
ruby-version:
|
ruby-version:
|
||||||
- '3.2'
|
- '3.0'
|
||||||
- '3.3'
|
- '3.1'
|
||||||
- '.ruby-version'
|
- '.ruby-version'
|
||||||
search-image:
|
|
||||||
- docker.elastic.co/elasticsearch/elasticsearch:7.17.13
|
|
||||||
include:
|
|
||||||
- ruby-version: '.ruby-version'
|
|
||||||
search-image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2
|
|
||||||
- ruby-version: '.ruby-version'
|
|
||||||
search-image: opensearchproject/opensearch:2
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v3
|
||||||
with:
|
with:
|
||||||
path: './'
|
path: './public'
|
||||||
name: ${{ github.sha }}
|
name: ${{ github.sha }}
|
||||||
|
|
||||||
- name: Set up Ruby environment
|
- name: Update package index
|
||||||
uses: ./.github/actions/setup-ruby
|
run: sudo apt-get update
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
cache: yarn
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install native Ruby dependencies
|
||||||
|
run: sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
|
|
||||||
|
- name: Install additional system dependencies
|
||||||
|
run: sudo apt-get install -y ffmpeg imagemagick
|
||||||
|
|
||||||
|
- name: Set up bundler cache
|
||||||
|
uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: ${{ matrix.ruby-version}}
|
ruby-version: ${{ matrix.ruby-version}}
|
||||||
additional-system-dependencies: ffmpeg imagemagick
|
bundler-cache: true
|
||||||
|
|
||||||
- name: Set up Javascript environment
|
- run: yarn --frozen-lockfile
|
||||||
uses: ./.github/actions/setup-javascript
|
|
||||||
|
|
||||||
- name: Load database schema
|
- name: Load database schema
|
||||||
run: './bin/rails db:create db:schema:load db:seed'
|
run: './bin/rails db:create db:schema:load db:seed'
|
||||||
|
|
||||||
- run: bin/rspec --tag search
|
- run: bundle exec rake spec:search
|
||||||
|
|
||||||
- name: Archive logs
|
- name: Archive logs
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
name: test-search-logs-${{ matrix.ruby-version }}
|
name: test-search-logs-${{ matrix.ruby-version }}
|
||||||
path: log/
|
path: log/
|
||||||
|
|
||||||
- name: Archive test screenshots
|
- name: Archive test screenshots
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
name: test-search-screenshots
|
name: test-search-screenshots
|
||||||
path: tmp/capybara/
|
path: tmp/screenshots/
|
||||||
|
|
||||||
test-back-and-return:
|
|
||||||
name: Back to original and return test
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
needs:
|
|
||||||
- build
|
|
||||||
|
|
||||||
services:
|
|
||||||
postgres:
|
|
||||||
image: postgres:14-alpine
|
|
||||||
env:
|
|
||||||
POSTGRES_PASSWORD: postgres
|
|
||||||
POSTGRES_USER: postgres
|
|
||||||
options: >-
|
|
||||||
--health-cmd pg_isready
|
|
||||||
--health-interval 10s
|
|
||||||
--health-timeout 5s
|
|
||||||
--health-retries 5
|
|
||||||
ports:
|
|
||||||
- 5432:5432
|
|
||||||
|
|
||||||
redis:
|
|
||||||
image: redis:7-alpine
|
|
||||||
options: >-
|
|
||||||
--health-cmd "redis-cli ping"
|
|
||||||
--health-interval 10s
|
|
||||||
--health-timeout 5s
|
|
||||||
--health-retries 5
|
|
||||||
ports:
|
|
||||||
- 6379:6379
|
|
||||||
|
|
||||||
env:
|
|
||||||
DB_HOST: localhost
|
|
||||||
DB_USER: postgres
|
|
||||||
DB_PASS: postgres
|
|
||||||
DISABLE_SIMPLECOV: ${{ matrix.ruby-version != '.ruby-version' }}
|
|
||||||
RAILS_ENV: test
|
|
||||||
ALLOW_NOPAM: true
|
|
||||||
PAM_ENABLED: true
|
|
||||||
PAM_DEFAULT_SERVICE: pam_test
|
|
||||||
PAM_CONTROLLED_SERVICE: pam_test_controlled
|
|
||||||
OIDC_ENABLED: true
|
|
||||||
OIDC_SCOPE: read
|
|
||||||
SAML_ENABLED: true
|
|
||||||
CAS_ENABLED: true
|
|
||||||
BUNDLE_WITH: 'pam_authentication test'
|
|
||||||
GITHUB_RSPEC: ${{ matrix.ruby-version == '.ruby-version' && github.event.pull_request && 'true' }}
|
|
||||||
ES_ENABLED: false
|
|
||||||
BACK_UPSTREAM_FORCE: true
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
ruby-version:
|
|
||||||
- '.ruby-version'
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
path: './'
|
|
||||||
name: ${{ github.sha }}
|
|
||||||
|
|
||||||
- name: Expand archived asset artifacts
|
|
||||||
run: |
|
|
||||||
tar xvzf artifacts.tar.gz
|
|
||||||
|
|
||||||
- name: Set up Ruby environment
|
|
||||||
uses: ./.github/actions/setup-ruby
|
|
||||||
with:
|
|
||||||
ruby-version: ${{ matrix.ruby-version}}
|
|
||||||
additional-system-dependencies: ffmpeg imagemagick libpam-dev
|
|
||||||
|
|
||||||
- name: Load database schema
|
|
||||||
run: './bin/rails db:create db:schema:load db:seed'
|
|
||||||
|
|
||||||
- name: Back to upstream schema
|
|
||||||
run: 'bundle exec rake dangerous:back_upstream'
|
|
||||||
|
|
||||||
- name: Return to kmyblue
|
|
||||||
run: './bin/rails db:migrate'
|
|
||||||
|
|
||||||
- run: bin/rspec
|
|
||||||
|
|
||||||
- name: Upload coverage reports to Codecov
|
|
||||||
if: matrix.ruby-version == '.ruby-version'
|
|
||||||
uses: codecov/codecov-action@v3
|
|
||||||
with:
|
|
||||||
files: coverage/lcov/mastodon-back-ret.lcov
|
|
||||||
|
|
22
.gitignore
vendored
22
.gitignore
vendored
|
@ -24,15 +24,16 @@
|
||||||
/public/packs-test
|
/public/packs-test
|
||||||
.env
|
.env
|
||||||
.env.production
|
.env.production
|
||||||
|
.env.development
|
||||||
/node_modules/
|
/node_modules/
|
||||||
/build/
|
/build/
|
||||||
|
|
||||||
# Ignore elasticsearch config
|
|
||||||
/.elasticsearch.yml
|
|
||||||
|
|
||||||
# Ignore Vagrant files
|
# Ignore Vagrant files
|
||||||
.vagrant/
|
.vagrant/
|
||||||
|
|
||||||
|
# Ignore Capistrano customizations
|
||||||
|
/config/deploy/*
|
||||||
|
|
||||||
# Ignore IDE files
|
# Ignore IDE files
|
||||||
.vscode/
|
.vscode/
|
||||||
.idea/
|
.idea/
|
||||||
|
@ -57,23 +58,8 @@ npm-debug.log
|
||||||
yarn-error.log
|
yarn-error.log
|
||||||
yarn-debug.log
|
yarn-debug.log
|
||||||
|
|
||||||
# From https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored
|
|
||||||
.pnp.*
|
|
||||||
.yarn/*
|
|
||||||
!.yarn/patches
|
|
||||||
!.yarn/plugins
|
|
||||||
!.yarn/releases
|
|
||||||
!.yarn/sdks
|
|
||||||
!.yarn/versions
|
|
||||||
|
|
||||||
# Ignore vagrant log files
|
# Ignore vagrant log files
|
||||||
*-cloudimg-console.log
|
*-cloudimg-console.log
|
||||||
|
|
||||||
# Ignore Docker option files
|
# Ignore Docker option files
|
||||||
docker-compose.override.yml
|
docker-compose.override.yml
|
||||||
|
|
||||||
# Ignore dotenv .local files
|
|
||||||
.env*.local
|
|
||||||
|
|
||||||
# Ignore local-only rspec configuration
|
|
||||||
.rspec-local
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ inherits_from: .haml-lint_todo.yml
|
||||||
|
|
||||||
exclude:
|
exclude:
|
||||||
- 'vendor/**/*'
|
- 'vendor/**/*'
|
||||||
|
- lib/templates/haml/scaffold/_form.html.haml
|
||||||
|
|
||||||
require:
|
require:
|
||||||
- ./lib/linter/haml_middle_dot.rb
|
- ./lib/linter/haml_middle_dot.rb
|
||||||
|
@ -11,7 +12,3 @@ linters:
|
||||||
enabled: true
|
enabled: true
|
||||||
MiddleDot:
|
MiddleDot:
|
||||||
enabled: true
|
enabled: true
|
||||||
LineLength:
|
|
||||||
max: 300
|
|
||||||
ViewLength:
|
|
||||||
max: 200 # Override default value of 100 inherited from rubocop
|
|
||||||
|
|
|
@ -1,36 +1,49 @@
|
||||||
# This configuration was generated by
|
# This configuration was generated by
|
||||||
# `haml-lint --auto-gen-config`
|
# `haml-lint --auto-gen-config`
|
||||||
# on 2024-01-09 11:30:07 -0500 using Haml-Lint version 0.53.0.
|
# on 2023-07-20 09:47:50 -0400 using Haml-Lint version 0.48.0.
|
||||||
# The point is for the user to remove these configuration records
|
# The point is for the user to remove these configuration records
|
||||||
# one by one as the lints are removed from the code base.
|
# one by one as the lints are removed from the code base.
|
||||||
# Note that changes in the inspected code, or installation of new
|
# Note that changes in the inspected code, or installation of new
|
||||||
# versions of Haml-Lint, may require this file to be generated again.
|
# versions of Haml-Lint, may require this file to be generated again.
|
||||||
|
|
||||||
linters:
|
linters:
|
||||||
# Offense count: 1
|
# Offense count: 951
|
||||||
LineLength:
|
LineLength:
|
||||||
exclude:
|
enabled: false
|
||||||
- 'app/views/admin/ng_rules/_ng_rule_fields.html.haml'
|
|
||||||
- 'app/views/admin/roles/_form.html.haml'
|
|
||||||
|
|
||||||
# Offense count: 9
|
# Offense count: 22
|
||||||
|
UnnecessaryStringOutput:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
# Offense count: 57
|
||||||
RuboCop:
|
RuboCop:
|
||||||
exclude:
|
enabled: false
|
||||||
- 'app/views/home/index.html.haml'
|
|
||||||
|
|
||||||
|
# Offense count: 3
|
||||||
ViewLength:
|
ViewLength:
|
||||||
exclude:
|
exclude:
|
||||||
- 'app/views/admin/accounts/index.html.haml'
|
- 'app/views/admin/accounts/show.html.haml'
|
||||||
- 'app/views/admin/instances/show.html.haml'
|
- 'app/views/admin/instances/show.html.haml'
|
||||||
- 'app/views/admin/ng_rules/_ng_rule_fields.html.haml'
|
- 'app/views/admin/reports/show.html.haml'
|
||||||
- 'app/views/admin/settings/discovery/show.html.haml'
|
- 'app/views/disputes/strikes/show.html.haml'
|
||||||
- 'app/views/settings/preferences/appearance/show.html.haml'
|
|
||||||
- 'app/views/settings/preferences/other/show.html.haml'
|
|
||||||
|
|
||||||
|
# Offense count: 32
|
||||||
InstanceVariables:
|
InstanceVariables:
|
||||||
exclude:
|
exclude:
|
||||||
|
- 'app/views/admin/reports/_actions.html.haml'
|
||||||
|
- 'app/views/admin/roles/_form.html.haml'
|
||||||
|
- 'app/views/admin/webhooks/_form.html.haml'
|
||||||
|
- 'app/views/auth/registrations/_status.html.haml'
|
||||||
|
- 'app/views/auth/sessions/two_factor/_otp_authentication_form.html.haml'
|
||||||
|
- 'app/views/authorize_interactions/_post_follow_actions.html.haml'
|
||||||
|
- 'app/views/invites/_form.html.haml'
|
||||||
|
- 'app/views/relationships/_account.html.haml'
|
||||||
|
- 'app/views/shared/_og.html.haml'
|
||||||
- 'app/views/application/_sidebar.html.haml'
|
- 'app/views/application/_sidebar.html.haml'
|
||||||
- 'app/views/admin/ng_rules/_ng_rule_fields.html.haml'
|
|
||||||
- 'app/views/admin/ng_words/keywords/_ng_word.html.haml'
|
# Offense count: 3
|
||||||
- 'app/views/admin/ng_words/white_list/_specified_domain.html.haml'
|
IdNames:
|
||||||
- 'app/views/admin/sensitive_words/_sensitive_word.html.haml'
|
exclude:
|
||||||
|
- 'app/views/authorize_interactions/error.html.haml'
|
||||||
|
- 'app/views/oauth/authorizations/error.html.haml'
|
||||||
|
- 'app/views/shared/_error_messages.html.haml'
|
||||||
|
|
|
@ -1 +1,4 @@
|
||||||
|
#!/bin/sh
|
||||||
|
. "$(dirname "$0")/_/husky.sh"
|
||||||
|
|
||||||
yarn lint-staged
|
yarn lint-staged
|
||||||
|
|
19
.nanoignore
Normal file
19
.nanoignore
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
.DS_Store
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
|
||||||
|
.bundle/
|
||||||
|
.cache/
|
||||||
|
config/deploy/*
|
||||||
|
coverage
|
||||||
|
docs/
|
||||||
|
.env
|
||||||
|
log/*.log
|
||||||
|
neo4j/
|
||||||
|
node_modules/
|
||||||
|
public/assets/
|
||||||
|
public/system/
|
||||||
|
spec/
|
||||||
|
tmp/
|
||||||
|
.vagrant/
|
||||||
|
vendor/bundle/
|
2
.nvmrc
2
.nvmrc
|
@ -1 +1 @@
|
||||||
22.14
|
20.7
|
||||||
|
|
|
@ -31,6 +31,9 @@
|
||||||
# Ignore Vagrant files
|
# Ignore Vagrant files
|
||||||
.vagrant/
|
.vagrant/
|
||||||
|
|
||||||
|
# Ignore Capistrano customizations
|
||||||
|
/config/deploy/*
|
||||||
|
|
||||||
# Ignore IDE files
|
# Ignore IDE files
|
||||||
.vscode/
|
.vscode/
|
||||||
.idea/
|
.idea/
|
||||||
|
@ -54,16 +57,8 @@
|
||||||
# Ignore Docker option files
|
# Ignore Docker option files
|
||||||
docker-compose.override.yml
|
docker-compose.override.yml
|
||||||
|
|
||||||
# Ignore public
|
|
||||||
/public/assets
|
|
||||||
/public/emoji
|
|
||||||
/public/packs
|
|
||||||
/public/packs-test
|
|
||||||
/public/system
|
|
||||||
|
|
||||||
# Ignore emoji map file
|
# Ignore emoji map file
|
||||||
/app/javascript/mastodon/features/emoji/emoji_map.json
|
/app/javascript/mastodon/features/emoji/emoji_map.json
|
||||||
/app/javascript/mastodon/features/emoji/emoji_sheet.json
|
|
||||||
|
|
||||||
# Ignore locale files
|
# Ignore locale files
|
||||||
/app/javascript/mastodon/locales/*.json
|
/app/javascript/mastodon/locales/*.json
|
||||||
|
@ -81,6 +76,3 @@ app/javascript/styles/mastodon/reset.scss
|
||||||
|
|
||||||
# Ignore the generated AUTHORS.md
|
# Ignore the generated AUTHORS.md
|
||||||
AUTHORS.md
|
AUTHORS.md
|
||||||
|
|
||||||
# Process a few selected JS files
|
|
||||||
!lint-staged.config.js
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
singleQuote: true,
|
singleQuote: true,
|
||||||
jsxSingleQuote: true
|
jsxSingleQuote: true
|
||||||
};
|
}
|
||||||
|
|
1
.profile
Normal file
1
.profile
Normal file
|
@ -0,0 +1 @@
|
||||||
|
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/.apt/lib/x86_64-linux-gnu:/app/.apt/usr/lib/x86_64-linux-gnu/mesa:/app/.apt/usr/lib/x86_64-linux-gnu/pulseaudio:/app/.apt/usr/lib/x86_64-linux-gnu/openblas-pthread
|
1
.rspec
1
.rspec
|
@ -1,2 +1,3 @@
|
||||||
--color
|
--color
|
||||||
--require spec_helper
|
--require spec_helper
|
||||||
|
--format Fuubar
|
||||||
|
|
236
.rubocop.yml
236
.rubocop.yml
|
@ -1,36 +1,214 @@
|
||||||
---
|
# Can be removed once all rules are addressed or moved to this file as documented overrides
|
||||||
AllCops:
|
inherit_from: .rubocop_todo.yml
|
||||||
CacheRootDirectory: tmp
|
|
||||||
DisplayStyleGuide: true
|
|
||||||
Exclude:
|
|
||||||
- Vagrantfile
|
|
||||||
- config/initializers/json_ld*
|
|
||||||
- lib/mastodon/migration_helpers.rb
|
|
||||||
ExtraDetails: true
|
|
||||||
NewCops: enable
|
|
||||||
TargetRubyVersion: 3.2 # Oldest supported ruby version
|
|
||||||
|
|
||||||
inherit_from:
|
|
||||||
- .rubocop/layout.yml
|
|
||||||
- .rubocop/metrics.yml
|
|
||||||
- .rubocop/naming.yml
|
|
||||||
- .rubocop/rails.yml
|
|
||||||
- .rubocop/rspec_rails.yml
|
|
||||||
- .rubocop/rspec.yml
|
|
||||||
- .rubocop/style.yml
|
|
||||||
- .rubocop/i18n.yml
|
|
||||||
- .rubocop/custom.yml
|
|
||||||
- .rubocop_todo.yml
|
|
||||||
- .rubocop/strict.yml
|
|
||||||
|
|
||||||
|
# Used for merging with exclude lists with .rubocop_todo.yml
|
||||||
inherit_mode:
|
inherit_mode:
|
||||||
merge:
|
merge:
|
||||||
- Exclude
|
- Exclude
|
||||||
|
|
||||||
plugins:
|
require:
|
||||||
- rubocop-capybara
|
|
||||||
- rubocop-i18n
|
|
||||||
- rubocop-performance
|
|
||||||
- rubocop-rails
|
- rubocop-rails
|
||||||
- rubocop-rspec
|
- rubocop-rspec
|
||||||
- rubocop-rspec_rails
|
- rubocop-performance
|
||||||
|
- rubocop-capybara
|
||||||
|
- ./lib/linter/rubocop_middle_dot
|
||||||
|
|
||||||
|
AllCops:
|
||||||
|
TargetRubyVersion: 3.0 # Set to minimum supported version of CI
|
||||||
|
DisplayCopNames: true
|
||||||
|
DisplayStyleGuide: true
|
||||||
|
ExtraDetails: true
|
||||||
|
UseCache: true
|
||||||
|
CacheRootDirectory: tmp
|
||||||
|
NewCops: enable # Opt-in to newly added rules
|
||||||
|
Exclude:
|
||||||
|
- 'db/schema.rb'
|
||||||
|
- 'bin/*'
|
||||||
|
- 'node_modules/**/*'
|
||||||
|
- 'Vagrantfile'
|
||||||
|
- 'vendor/**/*'
|
||||||
|
- 'lib/json_ld/*' # Generated files
|
||||||
|
- 'lib/templates/**/*'
|
||||||
|
|
||||||
|
# Reason: Prefer Hashes without extreme indentation
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_layout.html#layoutfirsthashelementindentation
|
||||||
|
Layout/FirstHashElementIndentation:
|
||||||
|
EnforcedStyle: consistent
|
||||||
|
|
||||||
|
# Reason: Currently disabled in .rubocop_todo.yml
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_layout.html#layoutlinelength
|
||||||
|
Layout/LineLength:
|
||||||
|
Max: 320 # Default of 120 causes a duplicate entry in generated todo file
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_lint.html#lintuselessaccessmodifier
|
||||||
|
Lint/UselessAccessModifier:
|
||||||
|
ContextCreatingMethods:
|
||||||
|
- class_methods
|
||||||
|
|
||||||
|
## Disable most Metrics/*Length cops
|
||||||
|
# Reason: those are often triggered and force significant refactors when this happend
|
||||||
|
# but the team feel they are not really improving the code quality.
|
||||||
|
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsblocklength
|
||||||
|
Metrics/BlockLength:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsclasslength
|
||||||
|
Metrics/ClassLength:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsmethodlength
|
||||||
|
Metrics/MethodLength:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsmodulelength
|
||||||
|
Metrics/ModuleLength:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
## End Disable Metrics/*Length cops
|
||||||
|
|
||||||
|
# Reason: Currently disabled in .rubocop_todo.yml
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsabcsize
|
||||||
|
Metrics/AbcSize:
|
||||||
|
Exclude:
|
||||||
|
- 'app/serializers/initial_state_serializer.rb'
|
||||||
|
- 'lib/mastodon/cli/*.rb'
|
||||||
|
- db/*migrate/**/*
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsblocknesting
|
||||||
|
Metrics/BlockNesting:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/mastodon/cli/*.rb'
|
||||||
|
|
||||||
|
# Reason: Currently disabled in .rubocop_todo.yml
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricscyclomaticcomplexity
|
||||||
|
Metrics/CyclomaticComplexity:
|
||||||
|
Exclude:
|
||||||
|
- 'app/lib/feed_manager.rb'
|
||||||
|
- 'app/policies/status_policy.rb'
|
||||||
|
- 'app/services/activitypub/process_account_service.rb'
|
||||||
|
- 'app/services/delivery_antenna_service.rb'
|
||||||
|
- 'app/services/post_status_service.rb'
|
||||||
|
- lib/mastodon/cli/*.rb
|
||||||
|
- db/*migrate/**/*
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsparameterlists
|
||||||
|
Metrics/ParameterLists:
|
||||||
|
CountKeywordArgs: false
|
||||||
|
|
||||||
|
Metrics/PerceivedComplexity:
|
||||||
|
Exclude:
|
||||||
|
- 'app/policies/status_policy.rb'
|
||||||
|
- 'app/services/delivery_antenna_service.rb'
|
||||||
|
- 'app/services/post_status_service.rb'
|
||||||
|
|
||||||
|
# Reason: Prevailing style is argument file paths
|
||||||
|
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsfilepath
|
||||||
|
Rails/FilePath:
|
||||||
|
EnforcedStyle: arguments
|
||||||
|
|
||||||
|
# Reason: Prevailing style uses numeric status codes, matches RSpec/Rails/HttpStatus
|
||||||
|
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railshttpstatus
|
||||||
|
Rails/HttpStatus:
|
||||||
|
EnforcedStyle: numeric
|
||||||
|
|
||||||
|
# Reason: Allowed in `tootctl` CLI code and in boot ENV checker
|
||||||
|
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsexit
|
||||||
|
Rails/Exit:
|
||||||
|
Exclude:
|
||||||
|
- 'config/boot.rb'
|
||||||
|
- 'lib/mastodon/cli/*.rb'
|
||||||
|
|
||||||
|
# Reason: Some single letter camel case files shouldn't be split
|
||||||
|
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecfilepath
|
||||||
|
RSpec/FilePath:
|
||||||
|
CustomTransform:
|
||||||
|
ActivityPub: activitypub # Ignore the snake_case due to the amount of files to rename
|
||||||
|
DeepL: deepl
|
||||||
|
FetchOEmbedService: fetch_oembed_service
|
||||||
|
JsonLdHelper: jsonld_helper
|
||||||
|
OEmbedController: oembed_controller
|
||||||
|
OStatus: ostatus
|
||||||
|
NodeInfoController: nodeinfo_controller # NodeInfo isn't snake_cased for any of the instances
|
||||||
|
Exclude:
|
||||||
|
- 'spec/config/initializers/rack_attack_spec.rb' # namespaces usually have separate folder
|
||||||
|
- 'spec/lib/sanitize_config_spec.rb' # namespaces usually have separate folder
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecnamedsubject
|
||||||
|
RSpec/NamedSubject:
|
||||||
|
EnforcedStyle: named_only
|
||||||
|
|
||||||
|
# Reason: Prevailing style choice
|
||||||
|
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecnottonot
|
||||||
|
RSpec/NotToNot:
|
||||||
|
EnforcedStyle: to_not
|
||||||
|
|
||||||
|
# Reason: Prevailing style uses numeric status codes, matches Rails/HttpStatus
|
||||||
|
# https://docs.rubocop.org/rubocop-rspec/cops_rspec_rails.html#rspecrailshttpstatus
|
||||||
|
RSpec/Rails/HttpStatus:
|
||||||
|
EnforcedStyle: numeric
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#styleclassandmodulechildren
|
||||||
|
Style/ClassAndModuleChildren:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Reason: Classes mostly self-document with their names
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#styledocumentation
|
||||||
|
Style/Documentation:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Reason: Enforce modern Ruby style
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylehashsyntax
|
||||||
|
Style/HashSyntax:
|
||||||
|
EnforcedStyle: ruby19_no_mixed_keys
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylenumericliterals
|
||||||
|
Style/NumericLiterals:
|
||||||
|
AllowedPatterns:
|
||||||
|
- \d{4}_\d{2}_\d{2}_\d{6} # For DB migration date version number readability
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylepercentliteraldelimiters
|
||||||
|
Style/PercentLiteralDelimiters:
|
||||||
|
PreferredDelimiters:
|
||||||
|
'%i': '()'
|
||||||
|
'%w': '()'
|
||||||
|
|
||||||
|
# Reason: Prefer less indentation in conditional assignments
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#styleredundantbegin
|
||||||
|
Style/RedundantBegin:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Reason: Overridden to reduce implicit StandardError rescues
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylerescuestandarderror
|
||||||
|
Style/RescueStandardError:
|
||||||
|
EnforcedStyle: implicit
|
||||||
|
|
||||||
|
# Reason: Simplify some spec layouts
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylesemicolon
|
||||||
|
Style/Semicolon:
|
||||||
|
AllowAsExpressionSeparator: true
|
||||||
|
|
||||||
|
# Reason: Originally disabled for CodeClimate, and no config consensus has been found
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylesymbolarray
|
||||||
|
Style/SymbolArray:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#styletrailingcommainarrayliteral
|
||||||
|
Style/TrailingCommaInArrayLiteral:
|
||||||
|
EnforcedStyleForMultiline: 'comma'
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#styletrailingcommainhashliteral
|
||||||
|
Style/TrailingCommaInHashLiteral:
|
||||||
|
EnforcedStyleForMultiline: 'comma'
|
||||||
|
|
||||||
|
Style/MiddleDot:
|
||||||
|
Enabled: true
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
require:
|
|
||||||
- ../lib/linter/rubocop_middle_dot
|
|
||||||
|
|
||||||
Style/MiddleDot:
|
|
||||||
Enabled: true
|
|
|
@ -1,12 +0,0 @@
|
||||||
I18n/RailsI18n:
|
|
||||||
Enabled: true
|
|
||||||
Exclude:
|
|
||||||
- 'config/**/*'
|
|
||||||
- 'db/**/*'
|
|
||||||
- 'lib/**/*'
|
|
||||||
- 'spec/**/*'
|
|
||||||
I18n/GetText:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
I18n/RailsI18n/DecorateStringFormattingUsingInterpolation:
|
|
||||||
Enabled: false
|
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
Layout/FirstHashElementIndentation:
|
|
||||||
EnforcedStyle: consistent
|
|
||||||
|
|
||||||
Layout/LineLength:
|
|
||||||
Max: 300 # Default of 120 causes a duplicate entry in generated todo file
|
|
|
@ -1,29 +0,0 @@
|
||||||
---
|
|
||||||
Metrics/AbcSize:
|
|
||||||
Exclude:
|
|
||||||
- 'app/serializers/initial_state_serializer.rb'
|
|
||||||
- lib/mastodon/cli/*.rb
|
|
||||||
|
|
||||||
Metrics/BlockLength:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Metrics/ClassLength:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Metrics/CyclomaticComplexity:
|
|
||||||
Exclude:
|
|
||||||
- 'app/lib/feed_manager.rb'
|
|
||||||
- 'app/policies/status_policy.rb'
|
|
||||||
- 'app/services/activitypub/process_account_service.rb'
|
|
||||||
- 'app/services/delivery_antenna_service.rb'
|
|
||||||
- 'app/services/post_status_service.rb'
|
|
||||||
- lib/mastodon/cli/*.rb
|
|
||||||
|
|
||||||
Metrics/MethodLength:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Metrics/ModuleLength:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Metrics/ParameterLists:
|
|
||||||
CountKeywordArgs: false
|
|
|
@ -1,3 +0,0 @@
|
||||||
---
|
|
||||||
Naming/BlockForwarding:
|
|
||||||
EnforcedStyle: explicit
|
|
|
@ -1,26 +0,0 @@
|
||||||
---
|
|
||||||
Rails/BulkChangeTable:
|
|
||||||
Enabled: false # Conflicts with strong_migrations features
|
|
||||||
|
|
||||||
Rails/Delegate:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Rails/FilePath:
|
|
||||||
EnforcedStyle: arguments
|
|
||||||
|
|
||||||
Rails/HttpStatus:
|
|
||||||
EnforcedStyle: numeric
|
|
||||||
|
|
||||||
Rails/NegateInclude:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Rails/RakeEnvironment:
|
|
||||||
Exclude: # Tasks are doing local work which do not need full env loaded
|
|
||||||
- lib/tasks/auto_annotate_models.rake
|
|
||||||
- lib/tasks/emojis.rake
|
|
||||||
- lib/tasks/mastodon.rake
|
|
||||||
- lib/tasks/repo.rake
|
|
||||||
- lib/tasks/statistics.rake
|
|
||||||
|
|
||||||
Rails/SkipsModelValidations:
|
|
||||||
Enabled: false
|
|
|
@ -1,29 +0,0 @@
|
||||||
---
|
|
||||||
RSpec/ExampleLength:
|
|
||||||
CountAsOne: ['array', 'heredoc', 'method_call']
|
|
||||||
Max: 20 # Override default of 5
|
|
||||||
|
|
||||||
RSpec/MultipleExpectations:
|
|
||||||
Max: 10 # Overrides default of 1
|
|
||||||
|
|
||||||
RSpec/MultipleMemoizedHelpers:
|
|
||||||
Max: 20 # Overrides default of 5
|
|
||||||
Exclude:
|
|
||||||
- 'spec/services/delete_account_service_spec.rb'
|
|
||||||
|
|
||||||
RSpec/NamedSubject:
|
|
||||||
EnforcedStyle: named_only
|
|
||||||
|
|
||||||
RSpec/NestedGroups:
|
|
||||||
Max: 10 # Overrides default of 3
|
|
||||||
|
|
||||||
RSpec/NotToNot:
|
|
||||||
EnforcedStyle: to_not
|
|
||||||
|
|
||||||
RSpec/SpecFilePathFormat:
|
|
||||||
CustomTransform:
|
|
||||||
ActivityPub: activitypub
|
|
||||||
DeepL: deepl
|
|
||||||
FetchOEmbedService: fetch_oembed_service
|
|
||||||
OEmbedController: oembed_controller
|
|
||||||
OStatus: ostatus
|
|
|
@ -1,3 +0,0 @@
|
||||||
---
|
|
||||||
RSpecRails/HttpStatus:
|
|
||||||
EnforcedStyle: numeric
|
|
|
@ -1,24 +0,0 @@
|
||||||
Lint/Debugger: # Remove any `binding.pry`
|
|
||||||
Enabled: true
|
|
||||||
Exclude: []
|
|
||||||
|
|
||||||
RSpec/Focus: # Require full spec run on CI
|
|
||||||
Enabled: true
|
|
||||||
Exclude: []
|
|
||||||
|
|
||||||
Rails/Output: # Remove any `puts` debugging
|
|
||||||
inherit_mode:
|
|
||||||
merge:
|
|
||||||
- Include
|
|
||||||
Enabled: true
|
|
||||||
Exclude: []
|
|
||||||
Include:
|
|
||||||
- spec/**/*.rb
|
|
||||||
|
|
||||||
Rails/FindEach: # Using `each` could impact performance, use `find_each`
|
|
||||||
Enabled: true
|
|
||||||
Exclude: []
|
|
||||||
|
|
||||||
Rails/UniqBeforePluck: # Require `uniq.pluck` and not `pluck.uniq`
|
|
||||||
Enabled: true
|
|
||||||
Exclude: []
|
|
|
@ -1,63 +0,0 @@
|
||||||
---
|
|
||||||
Style/ArrayIntersect:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Style/ClassAndModuleChildren:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Style/Documentation:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Style/FormatStringToken:
|
|
||||||
AllowedMethods:
|
|
||||||
- redirect_with_vary # Route redirects are not token-formatted
|
|
||||||
inherit_mode:
|
|
||||||
merge:
|
|
||||||
- AllowedMethods
|
|
||||||
|
|
||||||
Style/HashAsLastArrayItem:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Style/HashSyntax:
|
|
||||||
EnforcedShorthandSyntax: either
|
|
||||||
EnforcedStyle: ruby19_no_mixed_keys
|
|
||||||
|
|
||||||
Style/IfUnlessModifier:
|
|
||||||
Exclude:
|
|
||||||
- '**/*.haml'
|
|
||||||
|
|
||||||
Style/KeywordArgumentsMerging:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Style/NumericLiterals:
|
|
||||||
AllowedPatterns:
|
|
||||||
- \d{4}_\d{2}_\d{2}_\d{6}
|
|
||||||
|
|
||||||
Style/PercentLiteralDelimiters:
|
|
||||||
PreferredDelimiters:
|
|
||||||
'%i': ()
|
|
||||||
'%w': ()
|
|
||||||
|
|
||||||
Style/RedundantBegin:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Style/RedundantFetchBlock:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Style/RescueStandardError:
|
|
||||||
EnforcedStyle: implicit
|
|
||||||
|
|
||||||
Style/SafeNavigationChainLength:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Style/SymbolArray:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Style/TrailingCommaInArrayLiteral:
|
|
||||||
EnforcedStyleForMultiline: comma
|
|
||||||
|
|
||||||
Style/TrailingCommaInHashLiteral:
|
|
||||||
EnforcedStyleForMultiline: comma
|
|
||||||
|
|
||||||
Style/WordArray:
|
|
||||||
MinSize: 3 # Override default of 2
|
|
|
@ -1,20 +1,113 @@
|
||||||
# This configuration was generated by
|
# This configuration was generated by
|
||||||
# `rubocop --auto-gen-config --auto-gen-only-exclude --no-offense-counts --no-auto-gen-timestamp`
|
# `rubocop --auto-gen-config --auto-gen-only-exclude --no-exclude-limit --no-offense-counts --no-auto-gen-timestamp`
|
||||||
# using RuboCop version 1.75.2.
|
# using RuboCop version 1.56.1.
|
||||||
# The point is for the user to remove these configuration records
|
# The point is for the user to remove these configuration records
|
||||||
# one by one as the offenses are removed from the code base.
|
# one by one as the offenses are removed from the code base.
|
||||||
# Note that changes in the inspected code, or installation of new
|
# Note that changes in the inspected code, or installation of new
|
||||||
# versions of RuboCop, may require this file to be generated again.
|
# versions of RuboCop, may require this file to be generated again.
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: TreatCommentsAsGroupSeparators, ConsiderPunctuation, Include.
|
||||||
|
# Include: **/*.gemfile, **/Gemfile, **/gems.rb
|
||||||
|
Bundler/OrderedGems:
|
||||||
|
Exclude:
|
||||||
|
- 'Gemfile'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: EnforcedStyle, IndentationWidth.
|
||||||
|
# SupportedStyles: with_first_argument, with_fixed_indentation
|
||||||
|
Layout/ArgumentAlignment:
|
||||||
|
Exclude:
|
||||||
|
- 'config/initializers/cors.rb'
|
||||||
|
- 'config/initializers/session_store.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
|
||||||
|
# SupportedHashRocketStyles: key, separator, table
|
||||||
|
# SupportedColonStyles: key, separator, table
|
||||||
|
# SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit
|
||||||
|
Layout/HashAlignment:
|
||||||
|
Exclude:
|
||||||
|
- 'config/environments/production.rb'
|
||||||
|
- 'config/initializers/rack_attack.rb'
|
||||||
|
- 'config/routes.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: AllowDoxygenCommentStyle, AllowGemfileRubyComment.
|
||||||
|
Layout/LeadingCommentSpace:
|
||||||
|
Exclude:
|
||||||
|
- 'config/application.rb'
|
||||||
|
- 'config/initializers/3_omniauth.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
|
||||||
|
# URISchemes: http, https
|
||||||
|
Layout/LineLength:
|
||||||
|
Exclude:
|
||||||
|
- 'app/models/account.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: EnforcedStyle.
|
||||||
|
# SupportedStyles: require_no_space, require_space
|
||||||
|
Layout/SpaceInLambdaLiteral:
|
||||||
|
Exclude:
|
||||||
|
- 'config/environments/production.rb'
|
||||||
|
- 'config/initializers/content_security_policy.rb'
|
||||||
|
|
||||||
|
# Configuration parameters: AllowComments, AllowEmptyLambdas.
|
||||||
|
Lint/EmptyBlock:
|
||||||
|
Exclude:
|
||||||
|
- 'spec/controllers/api/v2/search_controller_spec.rb'
|
||||||
|
- 'spec/fabricators/access_token_fabricator.rb'
|
||||||
|
- 'spec/fabricators/conversation_fabricator.rb'
|
||||||
|
- 'spec/fabricators/system_key_fabricator.rb'
|
||||||
|
- 'spec/lib/activitypub/adapter_spec.rb'
|
||||||
|
- 'spec/models/user_role_spec.rb'
|
||||||
|
|
||||||
Lint/NonLocalExitFromIterator:
|
Lint/NonLocalExitFromIterator:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'app/helpers/json_ld_helper.rb'
|
- 'app/helpers/jsonld_helper.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
Lint/OrAssignmentToConstant:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/sanitize_ext/sanitize_config.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: IgnoreEmptyBlocks, AllowUnusedKeywordArguments.
|
||||||
|
Lint/UnusedBlockArgument:
|
||||||
|
Exclude:
|
||||||
|
- 'config/initializers/content_security_policy.rb'
|
||||||
|
- 'config/initializers/doorkeeper.rb'
|
||||||
|
- 'config/initializers/paperclip.rb'
|
||||||
|
- 'config/initializers/simple_form.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
Lint/UselessAssignment:
|
||||||
|
Exclude:
|
||||||
|
- 'app/services/activitypub/process_status_update_service.rb'
|
||||||
|
- 'config/initializers/3_omniauth.rb'
|
||||||
|
- 'db/migrate/20190511134027_add_silenced_at_suspended_at_to_accounts.rb'
|
||||||
|
- 'db/post_migrate/20190511152737_remove_suspended_silenced_account_fields.rb'
|
||||||
|
- 'spec/controllers/api/v1/favourites_controller_spec.rb'
|
||||||
|
- 'spec/controllers/concerns/account_controller_concern_spec.rb'
|
||||||
|
- 'spec/helpers/jsonld_helper_spec.rb'
|
||||||
|
- 'spec/models/account_spec.rb'
|
||||||
|
- 'spec/models/domain_block_spec.rb'
|
||||||
|
- 'spec/models/status_spec.rb'
|
||||||
|
- 'spec/models/user_spec.rb'
|
||||||
|
- 'spec/models/webauthn_credentials_spec.rb'
|
||||||
|
- 'spec/services/account_search_service_spec.rb'
|
||||||
|
- 'spec/services/post_status_service_spec.rb'
|
||||||
|
- 'spec/services/precompute_feed_service_spec.rb'
|
||||||
|
- 'spec/services/resolve_url_service_spec.rb'
|
||||||
|
- 'spec/views/statuses/show.html.haml_spec.rb'
|
||||||
|
|
||||||
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
|
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
|
||||||
Metrics/AbcSize:
|
Metrics/AbcSize:
|
||||||
Max: 82
|
Max: 144
|
||||||
|
|
||||||
# Configuration parameters: CountBlocks, CountModifierForms, Max.
|
# Configuration parameters: CountBlocks, Max.
|
||||||
Metrics/BlockNesting:
|
Metrics/BlockNesting:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'lib/tasks/mastodon.rake'
|
- 'lib/tasks/mastodon.rake'
|
||||||
|
@ -26,46 +119,597 @@ Metrics/CyclomaticComplexity:
|
||||||
# Configuration parameters: AllowedMethods, AllowedPatterns.
|
# Configuration parameters: AllowedMethods, AllowedPatterns.
|
||||||
Metrics/PerceivedComplexity:
|
Metrics/PerceivedComplexity:
|
||||||
Max: 27
|
Max: 27
|
||||||
|
|
||||||
|
# Configuration parameters: EnforcedStyle, CheckMethodNames, CheckSymbols, AllowedIdentifiers, AllowedPatterns.
|
||||||
|
# SupportedStyles: snake_case, normalcase, non_integer
|
||||||
|
# AllowedIdentifiers: capture3, iso8601, rfc1123_date, rfc822, rfc2822, rfc3339, x86_64
|
||||||
|
Naming/VariableNumber:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'app/policies/status_policy.rb'
|
- 'db/migrate/20180106000232_add_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb'
|
||||||
- 'app/services/delivery_antenna_service.rb'
|
- 'db/migrate/20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb'
|
||||||
- 'app/services/post_status_service.rb'
|
- 'db/migrate/20190820003045_update_statuses_index.rb'
|
||||||
|
- 'db/migrate/20190823221802_add_local_index_to_statuses.rb'
|
||||||
|
- 'db/migrate/20200119112504_add_public_index_to_statuses.rb'
|
||||||
|
- 'db/migrate/20231212225737_improve_index_for_public_timeline_speed.rb'
|
||||||
|
- 'spec/models/account_spec.rb'
|
||||||
|
- 'spec/models/domain_block_spec.rb'
|
||||||
|
- 'spec/models/user_spec.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
# Configuration parameters: SafeMultiline.
|
||||||
|
Performance/DeletePrefix:
|
||||||
|
Exclude:
|
||||||
|
- 'app/models/featured_tag.rb'
|
||||||
|
|
||||||
|
Performance/MapMethodChain:
|
||||||
|
Exclude:
|
||||||
|
- 'app/models/feed.rb'
|
||||||
|
- 'lib/mastodon/cli/maintenance.rb'
|
||||||
|
- 'spec/services/bulk_import_service_spec.rb'
|
||||||
|
- 'spec/services/import_service_spec.rb'
|
||||||
|
|
||||||
|
RSpec/AnyInstance:
|
||||||
|
Exclude:
|
||||||
|
- 'spec/controllers/activitypub/inboxes_controller_spec.rb'
|
||||||
|
- 'spec/controllers/admin/accounts_controller_spec.rb'
|
||||||
|
- 'spec/controllers/admin/resets_controller_spec.rb'
|
||||||
|
- 'spec/controllers/admin/settings/branding_controller_spec.rb'
|
||||||
|
- 'spec/controllers/api/v1/media_controller_spec.rb'
|
||||||
|
- 'spec/controllers/auth/sessions_controller_spec.rb'
|
||||||
|
- 'spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb'
|
||||||
|
- 'spec/controllers/settings/two_factor_authentication/recovery_codes_controller_spec.rb'
|
||||||
|
- 'spec/lib/request_spec.rb'
|
||||||
|
- 'spec/lib/status_filter_spec.rb'
|
||||||
|
- 'spec/models/account_spec.rb'
|
||||||
|
- 'spec/models/setting_spec.rb'
|
||||||
|
- 'spec/services/activitypub/process_collection_service_spec.rb'
|
||||||
|
- 'spec/validators/follow_limit_validator_spec.rb'
|
||||||
|
- 'spec/workers/activitypub/delivery_worker_spec.rb'
|
||||||
|
- 'spec/workers/web/push_notification_worker_spec.rb'
|
||||||
|
|
||||||
|
# Configuration parameters: CountAsOne.
|
||||||
|
RSpec/ExampleLength:
|
||||||
|
Max: 22
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: EnforcedStyle.
|
||||||
|
# SupportedStyles: implicit, each, example
|
||||||
|
RSpec/HookArgument:
|
||||||
|
Exclude:
|
||||||
|
- 'spec/controllers/api/v1/streaming_controller_spec.rb'
|
||||||
|
- 'spec/controllers/well_known/webfinger_controller_spec.rb'
|
||||||
|
- 'spec/helpers/instance_helper_spec.rb'
|
||||||
|
- 'spec/models/user_spec.rb'
|
||||||
|
- 'spec/rails_helper.rb'
|
||||||
|
- 'spec/serializers/activitypub/note_serializer_spec.rb'
|
||||||
|
- 'spec/serializers/activitypub/update_poll_serializer_spec.rb'
|
||||||
|
- 'spec/services/import_service_spec.rb'
|
||||||
|
|
||||||
|
# Configuration parameters: AssignmentOnly.
|
||||||
|
RSpec/InstanceVariable:
|
||||||
|
Exclude:
|
||||||
|
- 'spec/controllers/api/v1/streaming_controller_spec.rb'
|
||||||
|
- 'spec/controllers/auth/confirmations_controller_spec.rb'
|
||||||
|
- 'spec/controllers/auth/passwords_controller_spec.rb'
|
||||||
|
- 'spec/controllers/auth/sessions_controller_spec.rb'
|
||||||
|
- 'spec/controllers/concerns/export_controller_concern_spec.rb'
|
||||||
|
- 'spec/controllers/home_controller_spec.rb'
|
||||||
|
- 'spec/controllers/settings/two_factor_authentication/webauthn_credentials_controller_spec.rb'
|
||||||
|
- 'spec/controllers/statuses_cleanup_controller_spec.rb'
|
||||||
|
- 'spec/models/concerns/account_finder_concern_spec.rb'
|
||||||
|
- 'spec/models/concerns/account_interactions_spec.rb'
|
||||||
|
- 'spec/models/public_feed_spec.rb'
|
||||||
|
- 'spec/serializers/activitypub/note_serializer_spec.rb'
|
||||||
|
- 'spec/serializers/activitypub/update_poll_serializer_spec.rb'
|
||||||
|
- 'spec/services/remove_status_service_spec.rb'
|
||||||
|
- 'spec/services/search_service_spec.rb'
|
||||||
|
- 'spec/services/unblock_domain_service_spec.rb'
|
||||||
|
|
||||||
|
RSpec/LetSetup:
|
||||||
|
Exclude:
|
||||||
|
- 'spec/controllers/admin/accounts_controller_spec.rb'
|
||||||
|
- 'spec/controllers/admin/action_logs_controller_spec.rb'
|
||||||
|
- 'spec/controllers/admin/instances_controller_spec.rb'
|
||||||
|
- 'spec/controllers/admin/reports/actions_controller_spec.rb'
|
||||||
|
- 'spec/controllers/admin/statuses_controller_spec.rb'
|
||||||
|
- 'spec/controllers/api/v1/accounts/statuses_controller_spec.rb'
|
||||||
|
- 'spec/controllers/api/v1/admin/accounts_controller_spec.rb'
|
||||||
|
- 'spec/controllers/api/v1/filters_controller_spec.rb'
|
||||||
|
- 'spec/controllers/api/v1/followed_tags_controller_spec.rb'
|
||||||
|
- 'spec/controllers/api/v2/admin/accounts_controller_spec.rb'
|
||||||
|
- 'spec/controllers/api/v2/filters/keywords_controller_spec.rb'
|
||||||
|
- 'spec/controllers/api/v2/filters/statuses_controller_spec.rb'
|
||||||
|
- 'spec/controllers/auth/confirmations_controller_spec.rb'
|
||||||
|
- 'spec/controllers/auth/passwords_controller_spec.rb'
|
||||||
|
- 'spec/controllers/auth/sessions_controller_spec.rb'
|
||||||
|
- 'spec/controllers/follower_accounts_controller_spec.rb'
|
||||||
|
- 'spec/controllers/following_accounts_controller_spec.rb'
|
||||||
|
- 'spec/controllers/oauth/authorized_applications_controller_spec.rb'
|
||||||
|
- 'spec/controllers/oauth/tokens_controller_spec.rb'
|
||||||
|
- 'spec/controllers/settings/imports_controller_spec.rb'
|
||||||
|
- 'spec/lib/activitypub/activity/delete_spec.rb'
|
||||||
|
- 'spec/lib/vacuum/applications_vacuum_spec.rb'
|
||||||
|
- 'spec/lib/vacuum/preview_cards_vacuum_spec.rb'
|
||||||
|
- 'spec/models/account_spec.rb'
|
||||||
|
- 'spec/models/account_statuses_cleanup_policy_spec.rb'
|
||||||
|
- 'spec/models/canonical_email_block_spec.rb'
|
||||||
|
- 'spec/models/status_spec.rb'
|
||||||
|
- 'spec/models/user_spec.rb'
|
||||||
|
- 'spec/services/account_statuses_cleanup_service_spec.rb'
|
||||||
|
- 'spec/services/activitypub/fetch_featured_collection_service_spec.rb'
|
||||||
|
- 'spec/services/activitypub/fetch_remote_status_service_spec.rb'
|
||||||
|
- 'spec/services/activitypub/process_account_service_spec.rb'
|
||||||
|
- 'spec/services/activitypub/process_collection_service_spec.rb'
|
||||||
|
- 'spec/services/batched_remove_status_service_spec.rb'
|
||||||
|
- 'spec/services/block_domain_service_spec.rb'
|
||||||
|
- 'spec/services/bulk_import_service_spec.rb'
|
||||||
|
- 'spec/services/delete_account_service_spec.rb'
|
||||||
|
- 'spec/services/import_service_spec.rb'
|
||||||
|
- 'spec/services/notify_service_spec.rb'
|
||||||
|
- 'spec/services/remove_status_service_spec.rb'
|
||||||
|
- 'spec/services/report_service_spec.rb'
|
||||||
|
- 'spec/services/resolve_account_service_spec.rb'
|
||||||
|
- 'spec/services/suspend_account_service_spec.rb'
|
||||||
|
- 'spec/services/unallow_domain_service_spec.rb'
|
||||||
|
- 'spec/services/unsuspend_account_service_spec.rb'
|
||||||
|
- 'spec/workers/scheduler/user_cleanup_scheduler_spec.rb'
|
||||||
|
|
||||||
|
RSpec/MessageChain:
|
||||||
|
Exclude:
|
||||||
|
- 'spec/controllers/api/v1/media_controller_spec.rb'
|
||||||
|
- 'spec/models/concerns/remotable_spec.rb'
|
||||||
|
- 'spec/models/session_activation_spec.rb'
|
||||||
|
- 'spec/models/setting_spec.rb'
|
||||||
|
|
||||||
|
# Configuration parameters: EnforcedStyle.
|
||||||
|
# SupportedStyles: have_received, receive
|
||||||
|
RSpec/MessageSpies:
|
||||||
|
Exclude:
|
||||||
|
- 'spec/controllers/admin/accounts_controller_spec.rb'
|
||||||
|
- 'spec/helpers/admin/account_moderation_notes_helper_spec.rb'
|
||||||
|
- 'spec/lib/webfinger_resource_spec.rb'
|
||||||
|
- 'spec/models/admin/account_action_spec.rb'
|
||||||
|
- 'spec/models/concerns/remotable_spec.rb'
|
||||||
|
- 'spec/models/follow_request_spec.rb'
|
||||||
|
- 'spec/models/identity_spec.rb'
|
||||||
|
- 'spec/models/session_activation_spec.rb'
|
||||||
|
- 'spec/models/setting_spec.rb'
|
||||||
|
- 'spec/services/activitypub/fetch_replies_service_spec.rb'
|
||||||
|
- 'spec/services/activitypub/process_collection_service_spec.rb'
|
||||||
|
- 'spec/spec_helper.rb'
|
||||||
|
- 'spec/validators/status_length_validator_spec.rb'
|
||||||
|
|
||||||
|
RSpec/MultipleExpectations:
|
||||||
|
Max: 8
|
||||||
|
|
||||||
|
# Configuration parameters: AllowSubject.
|
||||||
|
RSpec/MultipleMemoizedHelpers:
|
||||||
|
Max: 21
|
||||||
|
|
||||||
|
# Configuration parameters: AllowedGroups.
|
||||||
|
RSpec/NestedGroups:
|
||||||
|
Max: 6
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
Rails/ApplicationController:
|
||||||
|
Exclude:
|
||||||
|
- 'app/controllers/health_controller.rb'
|
||||||
|
|
||||||
|
# Configuration parameters: Include.
|
||||||
|
# Include: db/**/*.rb
|
||||||
|
Rails/CreateTableWithTimestamps:
|
||||||
|
Exclude:
|
||||||
|
- 'db/migrate/20170508230434_create_conversation_mutes.rb'
|
||||||
|
- 'db/migrate/20170823162448_create_status_pins.rb'
|
||||||
|
- 'db/migrate/20171116161857_create_list_accounts.rb'
|
||||||
|
- 'db/migrate/20180929222014_create_account_conversations.rb'
|
||||||
|
- 'db/migrate/20181007025445_create_pghero_space_stats.rb'
|
||||||
|
- 'db/migrate/20190103124649_create_scheduled_statuses.rb'
|
||||||
|
- 'db/migrate/20220824233535_create_status_trends.rb'
|
||||||
|
- 'db/migrate/20221006061337_create_preview_card_trends.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: Severity.
|
||||||
|
Rails/DuplicateAssociation:
|
||||||
|
Exclude:
|
||||||
|
- 'app/serializers/activitypub/collection_serializer.rb'
|
||||||
|
- 'app/serializers/activitypub/note_serializer.rb'
|
||||||
|
|
||||||
|
# Configuration parameters: Include.
|
||||||
|
# Include: app/models/**/*.rb
|
||||||
|
Rails/HasAndBelongsToMany:
|
||||||
|
Exclude:
|
||||||
|
- 'app/models/concerns/account_associations.rb'
|
||||||
|
- 'app/models/preview_card.rb'
|
||||||
|
- 'app/models/status.rb'
|
||||||
|
- 'app/models/tag.rb'
|
||||||
|
|
||||||
|
# Configuration parameters: Include.
|
||||||
|
# Include: app/models/**/*.rb
|
||||||
|
Rails/HasManyOrHasOneDependent:
|
||||||
|
Exclude:
|
||||||
|
- 'app/models/concerns/account_counters.rb'
|
||||||
|
- 'app/models/conversation.rb'
|
||||||
|
- 'app/models/custom_emoji.rb'
|
||||||
|
- 'app/models/custom_emoji_category.rb'
|
||||||
|
- 'app/models/domain_block.rb'
|
||||||
|
- 'app/models/invite.rb'
|
||||||
|
- 'app/models/status.rb'
|
||||||
|
- 'app/models/user.rb'
|
||||||
|
- 'app/models/web/push_subscription.rb'
|
||||||
|
|
||||||
|
Rails/I18nLocaleTexts:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/tasks/mastodon.rake'
|
||||||
|
- 'spec/helpers/flashes_helper_spec.rb'
|
||||||
|
|
||||||
|
# Configuration parameters: Include.
|
||||||
|
# Include: app/controllers/**/*.rb, app/mailers/**/*.rb
|
||||||
|
Rails/LexicallyScopedActionFilter:
|
||||||
|
Exclude:
|
||||||
|
- 'app/controllers/auth/passwords_controller.rb'
|
||||||
|
- 'app/controllers/auth/registrations_controller.rb'
|
||||||
|
- 'app/controllers/auth/sessions_controller.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
Rails/NegateInclude:
|
||||||
|
Exclude:
|
||||||
|
- 'app/controllers/concerns/signature_verification.rb'
|
||||||
|
- 'app/helpers/jsonld_helper.rb'
|
||||||
|
- 'app/lib/activitypub/activity/create.rb'
|
||||||
|
- 'app/lib/activitypub/activity/move.rb'
|
||||||
|
- 'app/lib/feed_manager.rb'
|
||||||
|
- 'app/lib/link_details_extractor.rb'
|
||||||
|
- 'app/models/concerns/attachmentable.rb'
|
||||||
|
- 'app/models/concerns/remotable.rb'
|
||||||
|
- 'app/models/custom_filter.rb'
|
||||||
|
- 'app/services/activitypub/process_status_update_service.rb'
|
||||||
|
- 'app/services/fetch_link_card_service.rb'
|
||||||
|
- 'app/services/search_service.rb'
|
||||||
|
- 'app/workers/web/push_notification_worker.rb'
|
||||||
|
- 'lib/paperclip/color_extractor.rb'
|
||||||
|
|
||||||
Rails/OutputSafety:
|
Rails/OutputSafety:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'config/initializers/simple_form.rb'
|
- 'config/initializers/simple_form.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
# Configuration parameters: Include.
|
||||||
|
# Include: **/Rakefile, **/*.rake
|
||||||
|
Rails/RakeEnvironment:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/tasks/auto_annotate_models.rake'
|
||||||
|
- 'lib/tasks/db.rake'
|
||||||
|
- 'lib/tasks/emojis.rake'
|
||||||
|
- 'lib/tasks/mastodon.rake'
|
||||||
|
- 'lib/tasks/repo.rake'
|
||||||
|
- 'lib/tasks/statistics.rake'
|
||||||
|
|
||||||
|
# Configuration parameters: Include.
|
||||||
|
# Include: db/**/*.rb
|
||||||
|
Rails/ReversibleMigration:
|
||||||
|
Exclude:
|
||||||
|
- 'db/migrate/20160223164502_make_uris_nullable_in_statuses.rb'
|
||||||
|
- 'db/migrate/20161122163057_remove_unneeded_indexes.rb'
|
||||||
|
- 'db/migrate/20170205175257_remove_devices.rb'
|
||||||
|
- 'db/migrate/20170322143850_change_primary_key_to_bigint_on_statuses.rb'
|
||||||
|
- 'db/migrate/20170520145338_change_language_filter_to_opt_out.rb'
|
||||||
|
- 'db/migrate/20170609145826_remove_default_language_from_statuses.rb'
|
||||||
|
- 'db/migrate/20170711225116_fix_null_booleans.rb'
|
||||||
|
- 'db/migrate/20171129172043_add_index_on_stream_entries.rb'
|
||||||
|
- 'db/migrate/20171212195226_remove_duplicate_indexes_in_lists.rb'
|
||||||
|
- 'db/migrate/20171226094803_more_faster_index_on_notifications.rb'
|
||||||
|
- 'db/migrate/20180106000232_add_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb'
|
||||||
|
- 'db/migrate/20180617162849_remove_unused_indexes.rb'
|
||||||
|
- 'db/migrate/20220827195229_change_canonical_email_blocks_nullable.rb'
|
||||||
|
|
||||||
|
# Configuration parameters: ForbiddenMethods, AllowedMethods.
|
||||||
|
# ForbiddenMethods: decrement!, decrement_counter, increment!, increment_counter, insert, insert!, insert_all, insert_all!, toggle!, touch, touch_all, update_all, update_attribute, update_column, update_columns, update_counters, upsert, upsert_all
|
||||||
|
Rails/SkipsModelValidations:
|
||||||
|
Exclude:
|
||||||
|
- 'app/controllers/admin/invites_controller.rb'
|
||||||
|
- 'app/controllers/concerns/session_tracking_concern.rb'
|
||||||
|
- 'app/models/concerns/account_merging.rb'
|
||||||
|
- 'app/models/concerns/expireable.rb'
|
||||||
|
- 'app/models/status.rb'
|
||||||
|
- 'app/models/trends/links.rb'
|
||||||
|
- 'app/models/trends/preview_card_batch.rb'
|
||||||
|
- 'app/models/trends/preview_card_provider_batch.rb'
|
||||||
|
- 'app/models/trends/status_batch.rb'
|
||||||
|
- 'app/models/trends/statuses.rb'
|
||||||
|
- 'app/models/trends/tag_batch.rb'
|
||||||
|
- 'app/models/trends/tags.rb'
|
||||||
|
- 'app/models/user.rb'
|
||||||
|
- 'app/services/activitypub/process_status_update_service.rb'
|
||||||
|
- 'app/services/approve_appeal_service.rb'
|
||||||
|
- 'app/services/block_domain_service.rb'
|
||||||
|
- 'app/services/delete_account_service.rb'
|
||||||
|
- 'app/services/process_mentions_service.rb'
|
||||||
|
- 'app/services/unallow_domain_service.rb'
|
||||||
|
- 'app/services/unblock_domain_service.rb'
|
||||||
|
- 'app/services/update_status_service.rb'
|
||||||
|
- 'app/workers/activitypub/post_upgrade_worker.rb'
|
||||||
|
- 'app/workers/move_worker.rb'
|
||||||
|
- 'app/workers/scheduler/ip_cleanup_scheduler.rb'
|
||||||
|
- 'app/workers/scheduler/scheduled_statuses_scheduler.rb'
|
||||||
|
- 'db/migrate/20161203164520_add_from_account_id_to_notifications.rb'
|
||||||
|
- 'db/migrate/20170105224407_add_shortcode_to_media_attachments.rb'
|
||||||
|
- 'db/migrate/20170209184350_add_reply_to_statuses.rb'
|
||||||
|
- 'db/migrate/20170304202101_add_type_to_media_attachments.rb'
|
||||||
|
- 'db/migrate/20180528141303_fix_accounts_unique_index.rb'
|
||||||
|
- 'db/migrate/20180609104432_migrate_web_push_subscriptions2.rb'
|
||||||
|
- 'db/migrate/20181207011115_downcase_custom_emoji_domains.rb'
|
||||||
|
- 'db/migrate/20190511134027_add_silenced_at_suspended_at_to_accounts.rb'
|
||||||
|
- 'db/migrate/20191007013357_update_pt_locales.rb'
|
||||||
|
- 'db/migrate/20220316233212_update_kurdish_locales.rb'
|
||||||
|
- 'db/migrate/20240109035435_remove_hidden_anonymous_from_domain_blocks.rb'
|
||||||
|
- 'db/post_migrate/20190511152737_remove_suspended_silenced_account_fields.rb'
|
||||||
|
- 'db/post_migrate/20200917193528_migrate_notifications_type.rb'
|
||||||
|
- 'db/post_migrate/20201017234926_fill_account_suspension_origin.rb'
|
||||||
|
- 'db/post_migrate/20220617202502_migrate_roles.rb'
|
||||||
|
- 'db/post_migrate/20221101190723_backfill_admin_action_logs.rb'
|
||||||
|
- 'db/post_migrate/20221206114142_backfill_admin_action_logs_again.rb'
|
||||||
|
- 'lib/mastodon/cli/accounts.rb'
|
||||||
|
- 'lib/mastodon/cli/main.rb'
|
||||||
|
- 'lib/mastodon/cli/maintenance.rb'
|
||||||
|
- 'spec/controllers/api/v1/admin/accounts_controller_spec.rb'
|
||||||
|
- 'spec/lib/activitypub/activity/follow_spec.rb'
|
||||||
|
- 'spec/services/follow_service_spec.rb'
|
||||||
|
- 'spec/services/update_account_service_spec.rb'
|
||||||
|
|
||||||
|
# Configuration parameters: Include.
|
||||||
|
# Include: db/**/*.rb
|
||||||
|
Rails/ThreeStateBooleanColumn:
|
||||||
|
Exclude:
|
||||||
|
- 'db/migrate/20160325130944_add_admin_to_users.rb'
|
||||||
|
- 'db/migrate/20161123093447_add_sensitive_to_statuses.rb'
|
||||||
|
- 'db/migrate/20170123203248_add_reject_media_to_domain_blocks.rb'
|
||||||
|
- 'db/migrate/20170127165745_add_devise_two_factor_to_users.rb'
|
||||||
|
- 'db/migrate/20170209184350_add_reply_to_statuses.rb'
|
||||||
|
- 'db/migrate/20170330163835_create_imports.rb'
|
||||||
|
- 'db/migrate/20170905165803_add_local_to_statuses.rb'
|
||||||
|
- 'db/migrate/20181203021853_add_discoverable_to_accounts.rb'
|
||||||
|
- 'db/migrate/20190509164208_add_by_moderator_to_tombstone.rb'
|
||||||
|
- 'db/migrate/20190805123746_add_capabilities_to_tags.rb'
|
||||||
|
- 'db/migrate/20191212163405_add_hide_collections_to_accounts.rb'
|
||||||
|
- 'db/migrate/20200309150742_add_forwarded_to_reports.rb'
|
||||||
|
- 'db/migrate/20210609202149_create_login_activities.rb'
|
||||||
|
- 'db/migrate/20210621221010_add_skip_sign_in_token_to_users.rb'
|
||||||
|
- 'db/migrate/20211031031021_create_preview_card_providers.rb'
|
||||||
|
- 'db/migrate/20211115032527_add_trendable_to_preview_cards.rb'
|
||||||
|
- 'db/migrate/20220202200743_add_trendable_to_accounts.rb'
|
||||||
|
- 'db/migrate/20220202200926_add_trendable_to_statuses.rb'
|
||||||
|
- 'db/migrate/20220303000827_add_ordered_media_attachment_ids_to_status_edits.rb'
|
||||||
|
- 'db/migrate/20230314021909_add_group_message_following_only_to_accounts.rb'
|
||||||
|
- 'db/migrate/20230314081013_add_group_allow_private_message_to_accounts.rb'
|
||||||
|
- 'db/migrate/20230412005311_add_markdown_to_statuses.rb'
|
||||||
|
- 'db/migrate/20230412073021_add_markdown_to_status_edits.rb'
|
||||||
|
- 'db/migrate/20230428111230_add_emoji_reaction_streaming_to_accounts.rb'
|
||||||
|
- 'db/migrate/20230510004621_remove_stop_emoji_reaction_streaming_from_accounts.rb'
|
||||||
|
|
||||||
|
# Configuration parameters: Include.
|
||||||
|
# Include: app/models/**/*.rb
|
||||||
|
Rails/UniqueValidationWithoutIndex:
|
||||||
|
Exclude:
|
||||||
|
- 'app/models/account_alias.rb'
|
||||||
|
- 'app/models/custom_filter_status.rb'
|
||||||
|
- 'app/models/identity.rb'
|
||||||
|
- 'app/models/webauthn_credential.rb'
|
||||||
|
|
||||||
|
# Configuration parameters: Include.
|
||||||
|
# Include: app/models/**/*.rb
|
||||||
|
Rails/UnusedIgnoredColumns:
|
||||||
|
Exclude:
|
||||||
|
- 'app/models/account.rb'
|
||||||
|
- 'app/models/account_stat.rb'
|
||||||
|
- 'app/models/admin/action_log.rb'
|
||||||
|
- 'app/models/custom_filter.rb'
|
||||||
|
- 'app/models/email_domain_block.rb'
|
||||||
|
- 'app/models/report.rb'
|
||||||
|
- 'app/models/status_edit.rb'
|
||||||
|
- 'app/models/user.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
# Configuration parameters: EnforcedStyle.
|
||||||
|
# SupportedStyles: exists, where
|
||||||
|
Rails/WhereExists:
|
||||||
|
Exclude:
|
||||||
|
- 'app/controllers/activitypub/inboxes_controller.rb'
|
||||||
|
- 'app/controllers/admin/email_domain_blocks_controller.rb'
|
||||||
|
- 'app/controllers/auth/registrations_controller.rb'
|
||||||
|
- 'app/lib/activitypub/activity/create.rb'
|
||||||
|
- 'app/lib/delivery_failure_tracker.rb'
|
||||||
|
- 'app/lib/feed_manager.rb'
|
||||||
|
- 'app/lib/status_cache_hydrator.rb'
|
||||||
|
- 'app/lib/suspicious_sign_in_detector.rb'
|
||||||
|
- 'app/models/concerns/account_interactions.rb'
|
||||||
|
- 'app/models/featured_tag.rb'
|
||||||
|
- 'app/models/poll.rb'
|
||||||
|
- 'app/models/session_activation.rb'
|
||||||
|
- 'app/models/status.rb'
|
||||||
|
- 'app/models/user.rb'
|
||||||
|
- 'app/policies/status_policy.rb'
|
||||||
|
- 'app/serializers/rest/announcement_serializer.rb'
|
||||||
|
- 'app/serializers/rest/tag_serializer.rb'
|
||||||
|
- 'app/services/activitypub/fetch_remote_status_service.rb'
|
||||||
|
- 'app/services/app_sign_up_service.rb'
|
||||||
|
- 'app/services/vote_service.rb'
|
||||||
|
- 'app/validators/reaction_validator.rb'
|
||||||
|
- 'app/validators/vote_validator.rb'
|
||||||
|
- 'app/workers/move_worker.rb'
|
||||||
|
- 'db/migrate/20190529143559_preserve_old_layout_for_existing_users.rb'
|
||||||
|
- 'lib/tasks/tests.rake'
|
||||||
|
- 'spec/models/account_spec.rb'
|
||||||
|
- 'spec/services/activitypub/process_collection_service_spec.rb'
|
||||||
|
- 'spec/services/purge_domain_service_spec.rb'
|
||||||
|
- 'spec/services/unallow_domain_service_spec.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: AllowOnConstant, AllowOnSelfClass.
|
||||||
|
Style/CaseEquality:
|
||||||
|
Exclude:
|
||||||
|
- 'config/initializers/trusted_proxies.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: AllowedMethods, AllowedPatterns.
|
||||||
|
# AllowedMethods: ==, equal?, eql?
|
||||||
|
Style/ClassEqualityComparison:
|
||||||
|
Exclude:
|
||||||
|
- 'app/helpers/jsonld_helper.rb'
|
||||||
|
- 'app/serializers/activitypub/outbox_serializer.rb'
|
||||||
|
|
||||||
|
Style/ClassVars:
|
||||||
|
Exclude:
|
||||||
|
- 'config/initializers/devise.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
Style/CombinableLoops:
|
||||||
|
Exclude:
|
||||||
|
- 'app/models/form/custom_emoji_batch.rb'
|
||||||
|
- 'app/models/form/ip_block_batch.rb'
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
# Configuration parameters: AllowedVars.
|
# Configuration parameters: AllowedVars.
|
||||||
Style/FetchEnvVar:
|
Style/FetchEnvVar:
|
||||||
Exclude:
|
Exclude:
|
||||||
|
- 'app/lib/redis_configuration.rb'
|
||||||
|
- 'app/lib/translation_service.rb'
|
||||||
|
- 'config/environments/development.rb'
|
||||||
- 'config/environments/production.rb'
|
- 'config/environments/production.rb'
|
||||||
- 'config/initializers/2_limited_federation_mode.rb'
|
- 'config/initializers/2_limited_federation_mode.rb'
|
||||||
- 'config/initializers/3_omniauth.rb'
|
- 'config/initializers/3_omniauth.rb'
|
||||||
|
- 'config/initializers/blacklists.rb'
|
||||||
- 'config/initializers/cache_buster.rb'
|
- 'config/initializers/cache_buster.rb'
|
||||||
|
- 'config/initializers/content_security_policy.rb'
|
||||||
- 'config/initializers/devise.rb'
|
- 'config/initializers/devise.rb'
|
||||||
- 'config/initializers/paperclip.rb'
|
- 'config/initializers/paperclip.rb'
|
||||||
- 'config/initializers/vapid.rb'
|
- 'config/initializers/vapid.rb'
|
||||||
|
- 'lib/mastodon/premailer_webpack_strategy.rb'
|
||||||
|
- 'lib/mastodon/redis_config.rb'
|
||||||
- 'lib/tasks/repo.rake'
|
- 'lib/tasks/repo.rake'
|
||||||
|
- 'spec/features/profile_spec.rb'
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
# Configuration parameters: EnforcedStyle, MaxUnannotatedPlaceholdersAllowed, Mode, AllowedMethods, AllowedPatterns.
|
# Configuration parameters: EnforcedStyle, MaxUnannotatedPlaceholdersAllowed, AllowedMethods, AllowedPatterns.
|
||||||
# SupportedStyles: annotated, template, unannotated
|
# SupportedStyles: annotated, template, unannotated
|
||||||
# AllowedMethods: redirect
|
# AllowedMethods: redirect
|
||||||
Style/FormatStringToken:
|
Style/FormatStringToken:
|
||||||
Exclude:
|
Exclude:
|
||||||
|
- 'app/models/privacy_policy.rb'
|
||||||
- 'config/initializers/devise.rb'
|
- 'config/initializers/devise.rb'
|
||||||
- 'lib/paperclip/color_extractor.rb'
|
- 'lib/paperclip/color_extractor.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
Style/GlobalStdStream:
|
||||||
|
Exclude:
|
||||||
|
- 'config/boot.rb'
|
||||||
|
- 'config/environments/development.rb'
|
||||||
|
- 'config/environments/production.rb'
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
# Configuration parameters: MinBodyLength, AllowConsecutiveConditionals.
|
# Configuration parameters: MinBodyLength, AllowConsecutiveConditionals.
|
||||||
Style/GuardClause:
|
Style/GuardClause:
|
||||||
Enabled: false
|
Exclude:
|
||||||
|
- 'app/controllers/admin/confirmations_controller.rb'
|
||||||
|
- 'app/controllers/auth/confirmations_controller.rb'
|
||||||
|
- 'app/controllers/auth/passwords_controller.rb'
|
||||||
|
- 'app/controllers/settings/two_factor_authentication/webauthn_credentials_controller.rb'
|
||||||
|
- 'app/lib/activitypub/activity/block.rb'
|
||||||
|
- 'app/lib/request.rb'
|
||||||
|
- 'app/lib/request_pool.rb'
|
||||||
|
- 'app/lib/webfinger.rb'
|
||||||
|
- 'app/lib/webfinger_resource.rb'
|
||||||
|
- 'app/models/concerns/account_counters.rb'
|
||||||
|
- 'app/models/concerns/ldap_authenticable.rb'
|
||||||
|
- 'app/models/tag.rb'
|
||||||
|
- 'app/models/user.rb'
|
||||||
|
- 'app/services/fan_out_on_write_service.rb'
|
||||||
|
- 'app/services/post_status_service.rb'
|
||||||
|
- 'app/services/process_hashtags_service.rb'
|
||||||
|
- 'app/workers/move_worker.rb'
|
||||||
|
- 'app/workers/redownload_avatar_worker.rb'
|
||||||
|
- 'app/workers/redownload_header_worker.rb'
|
||||||
|
- 'app/workers/redownload_media_worker.rb'
|
||||||
|
- 'app/workers/remote_account_refresh_worker.rb'
|
||||||
|
- 'config/initializers/devise.rb'
|
||||||
|
- 'db/migrate/20170901141119_truncate_preview_cards.rb'
|
||||||
|
- 'db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb'
|
||||||
|
- 'lib/devise/two_factor_ldap_authenticatable.rb'
|
||||||
|
- 'lib/devise/two_factor_pam_authenticatable.rb'
|
||||||
|
- 'lib/mastodon/cli/accounts.rb'
|
||||||
|
- 'lib/mastodon/cli/maintenance.rb'
|
||||||
|
- 'lib/mastodon/cli/media.rb'
|
||||||
|
- 'lib/paperclip/attachment_extensions.rb'
|
||||||
|
- 'lib/tasks/repo.rake'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: EnforcedStyle.
|
||||||
|
# SupportedStyles: braces, no_braces
|
||||||
|
Style/HashAsLastArrayItem:
|
||||||
|
Exclude:
|
||||||
|
- 'app/controllers/admin/statuses_controller.rb'
|
||||||
|
- 'app/controllers/api/v1/statuses_controller.rb'
|
||||||
|
- 'app/models/concerns/account_counters.rb'
|
||||||
|
- 'app/models/concerns/status_threading_concern.rb'
|
||||||
|
- 'app/models/status.rb'
|
||||||
|
- 'app/services/batched_remove_status_service.rb'
|
||||||
|
- 'app/services/notify_service.rb'
|
||||||
|
- 'db/migrate/20181024224956_migrate_account_conversations.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
Style/HashTransformValues:
|
||||||
|
Exclude:
|
||||||
|
- 'app/serializers/rest/web_push_subscription_serializer.rb'
|
||||||
|
- 'app/services/import_service.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
Style/IfUnlessModifier:
|
||||||
|
Exclude:
|
||||||
|
- 'config/environments/production.rb'
|
||||||
|
- 'config/initializers/devise.rb'
|
||||||
|
- 'config/initializers/ffmpeg.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
# Configuration parameters: InverseMethods, InverseBlocks.
|
||||||
|
Style/InverseMethods:
|
||||||
|
Exclude:
|
||||||
|
- 'app/models/custom_filter.rb'
|
||||||
|
- 'app/services/update_account_service.rb'
|
||||||
|
- 'spec/controllers/activitypub/replies_controller_spec.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: EnforcedStyle.
|
||||||
|
# SupportedStyles: line_count_dependent, lambda, literal
|
||||||
|
Style/Lambda:
|
||||||
|
Exclude:
|
||||||
|
- 'config/initializers/simple_form.rb'
|
||||||
|
- 'config/routes.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
Style/MapToHash:
|
||||||
|
Exclude:
|
||||||
|
- 'app/models/status.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
# Configuration parameters: EnforcedStyle.
|
||||||
|
# SupportedStyles: literals, strict
|
||||||
|
Style/MutableConstant:
|
||||||
|
Exclude:
|
||||||
|
- 'app/models/tag.rb'
|
||||||
|
- 'app/services/delete_account_service.rb'
|
||||||
|
- 'lib/mastodon/migration_warning.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
Style/NilLambda:
|
||||||
|
Exclude:
|
||||||
|
- 'config/initializers/paperclip.rb'
|
||||||
|
|
||||||
# Configuration parameters: AllowedMethods.
|
# Configuration parameters: AllowedMethods.
|
||||||
# AllowedMethods: respond_to_missing?
|
# AllowedMethods: respond_to_missing?
|
||||||
Style/OptionalBooleanParameter:
|
Style/OptionalBooleanParameter:
|
||||||
Exclude:
|
Exclude:
|
||||||
|
- 'app/helpers/admin/account_moderation_notes_helper.rb'
|
||||||
|
- 'app/helpers/jsonld_helper.rb'
|
||||||
- 'app/lib/admin/system_check/message.rb'
|
- 'app/lib/admin/system_check/message.rb'
|
||||||
- 'app/lib/request.rb'
|
- 'app/lib/request.rb'
|
||||||
- 'app/lib/webfinger.rb'
|
- 'app/lib/webfinger.rb'
|
||||||
|
@ -73,6 +717,14 @@ Style/OptionalBooleanParameter:
|
||||||
- 'app/services/fetch_resource_service.rb'
|
- 'app/services/fetch_resource_service.rb'
|
||||||
- 'app/workers/domain_block_worker.rb'
|
- 'app/workers/domain_block_worker.rb'
|
||||||
- 'app/workers/unfollow_follow_worker.rb'
|
- 'app/workers/unfollow_follow_worker.rb'
|
||||||
|
- 'lib/mastodon/redis_config.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: PreferredDelimiters.
|
||||||
|
Style/PercentLiteralDelimiters:
|
||||||
|
Exclude:
|
||||||
|
- 'config/deploy.rb'
|
||||||
|
- 'config/initializers/doorkeeper.rb'
|
||||||
|
|
||||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
# Configuration parameters: EnforcedStyle.
|
# Configuration parameters: EnforcedStyle.
|
||||||
|
@ -86,3 +738,114 @@ Style/RedundantConstantBase:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'config/environments/production.rb'
|
- 'config/environments/production.rb'
|
||||||
- 'config/initializers/sidekiq.rb'
|
- 'config/initializers/sidekiq.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
# Configuration parameters: SafeForConstants.
|
||||||
|
Style/RedundantFetchBlock:
|
||||||
|
Exclude:
|
||||||
|
- 'config/initializers/1_hosts.rb'
|
||||||
|
- 'config/initializers/chewy.rb'
|
||||||
|
- 'config/initializers/devise.rb'
|
||||||
|
- 'config/initializers/paperclip.rb'
|
||||||
|
- 'config/puma.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: AllowMultipleReturnValues.
|
||||||
|
Style/RedundantReturn:
|
||||||
|
Exclude:
|
||||||
|
- 'app/controllers/api/v1/directories_controller.rb'
|
||||||
|
- 'app/controllers/auth/confirmations_controller.rb'
|
||||||
|
- 'app/lib/ostatus/tag_manager.rb'
|
||||||
|
- 'app/models/form/import.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
# Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods, MaxChainLength.
|
||||||
|
# AllowedMethods: present?, blank?, presence, try, try!
|
||||||
|
Style/SafeNavigation:
|
||||||
|
Exclude:
|
||||||
|
- 'app/models/concerns/account_finder_concern.rb'
|
||||||
|
- 'app/models/status.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: EnforcedStyle.
|
||||||
|
# SupportedStyles: only_raise, only_fail, semantic
|
||||||
|
Style/SignalException:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/devise/two_factor_ldap_authenticatable.rb'
|
||||||
|
- 'lib/devise/two_factor_pam_authenticatable.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
Style/SingleArgumentDig:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/webpacker/manifest_extensions.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: EnforcedStyle.
|
||||||
|
# SupportedStyles: require_parentheses, require_no_parentheses
|
||||||
|
Style/StabbyLambdaParentheses:
|
||||||
|
Exclude:
|
||||||
|
- 'config/environments/production.rb'
|
||||||
|
- 'config/initializers/content_security_policy.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
Style/StderrPuts:
|
||||||
|
Exclude:
|
||||||
|
- 'config/boot.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
# Configuration parameters: Mode.
|
||||||
|
Style/StringConcatenation:
|
||||||
|
Exclude:
|
||||||
|
- 'config/initializers/paperclip.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
|
||||||
|
# SupportedStyles: single_quotes, double_quotes
|
||||||
|
Style/StringLiterals:
|
||||||
|
Exclude:
|
||||||
|
- 'config/environments/production.rb'
|
||||||
|
- 'config/initializers/backtrace_silencers.rb'
|
||||||
|
- 'config/initializers/http_client_proxy.rb'
|
||||||
|
- 'config/initializers/rack_attack.rb'
|
||||||
|
- 'config/initializers/webauthn.rb'
|
||||||
|
- 'config/routes.rb'
|
||||||
|
- 'db/schema.rb'
|
||||||
|
|
||||||
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
|
# Configuration parameters: AllowMethodsWithArguments, AllowedMethods, AllowedPatterns, AllowComments.
|
||||||
|
# AllowedMethods: define_method, mail, respond_to
|
||||||
|
Style/SymbolProc:
|
||||||
|
Exclude:
|
||||||
|
- 'config/initializers/3_omniauth.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: EnforcedStyle, AllowSafeAssignment.
|
||||||
|
# SupportedStyles: require_parentheses, require_no_parentheses, require_parentheses_when_complex
|
||||||
|
Style/TernaryParentheses:
|
||||||
|
Exclude:
|
||||||
|
- 'config/environments/development.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: EnforcedStyleForMultiline.
|
||||||
|
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
||||||
|
Style/TrailingCommaInArguments:
|
||||||
|
Exclude:
|
||||||
|
- 'config/initializers/paperclip.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: EnforcedStyleForMultiline.
|
||||||
|
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
||||||
|
Style/TrailingCommaInHashLiteral:
|
||||||
|
Exclude:
|
||||||
|
- 'config/environments/production.rb'
|
||||||
|
- 'config/environments/test.rb'
|
||||||
|
|
||||||
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
|
# Configuration parameters: EnforcedStyle, MinSize, WordRegex.
|
||||||
|
# SupportedStyles: percent, brackets
|
||||||
|
Style/WordArray:
|
||||||
|
Exclude:
|
||||||
|
- 'app/helpers/languages_helper.rb'
|
||||||
|
- 'config/initializers/cors.rb'
|
||||||
|
- 'spec/controllers/settings/imports_controller_spec.rb'
|
||||||
|
- 'spec/models/form/import_spec.rb'
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
3.4.3
|
3.2.3
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
{
|
|
||||||
"ignore_dirs": ["node_modules/", "public/"]
|
|
||||||
}
|
|
BIN
.yarn/install-state.gz
Normal file
BIN
.yarn/install-state.gz
Normal file
Binary file not shown.
|
@ -1,13 +0,0 @@
|
||||||
diff --git a/lib/index.js b/lib/index.js
|
|
||||||
index 16ed6be8be8f555cc99096c2ff60954b42dc313d..d009c069770d066ad0db7ad02de1ea473a29334e 100644
|
|
||||||
--- a/lib/index.js
|
|
||||||
+++ b/lib/index.js
|
|
||||||
@@ -99,7 +99,7 @@ function lodash(_ref) {
|
|
||||||
|
|
||||||
var node = _ref3;
|
|
||||||
|
|
||||||
- if ((0, _types.isModuleDeclaration)(node)) {
|
|
||||||
+ if ((0, _types.isImportDeclaration)(node) || (0, _types.isExportDeclaration)(node)) {
|
|
||||||
isModule = true;
|
|
||||||
break;
|
|
||||||
}
|
|
49
.yarnclean
Normal file
49
.yarnclean
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
# test directories
|
||||||
|
__tests__
|
||||||
|
test
|
||||||
|
tests
|
||||||
|
powered-test
|
||||||
|
|
||||||
|
# asset directories
|
||||||
|
docs
|
||||||
|
doc
|
||||||
|
website
|
||||||
|
images
|
||||||
|
# assets
|
||||||
|
|
||||||
|
# examples
|
||||||
|
example
|
||||||
|
examples
|
||||||
|
|
||||||
|
# code coverage directories
|
||||||
|
coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# build scripts
|
||||||
|
Makefile
|
||||||
|
Gulpfile.js
|
||||||
|
Gruntfile.js
|
||||||
|
|
||||||
|
# configs
|
||||||
|
.tern-project
|
||||||
|
.gitattributes
|
||||||
|
.editorconfig
|
||||||
|
.*ignore
|
||||||
|
.eslintrc
|
||||||
|
.jshintrc
|
||||||
|
.flowconfig
|
||||||
|
.documentup.json
|
||||||
|
.yarn-metadata.json
|
||||||
|
.*.yml
|
||||||
|
*.yml
|
||||||
|
|
||||||
|
# misc
|
||||||
|
*.gz
|
||||||
|
*.md
|
||||||
|
|
||||||
|
# for specific ignore
|
||||||
|
!.svgo.yml
|
||||||
|
!sass-lint/**/*.yml
|
||||||
|
|
||||||
|
# breaks lint-staged or generally anything using https://github.com/eemeli/yaml/issues/384
|
||||||
|
!**/yaml/dist/**/doc
|
|
@ -1 +0,0 @@
|
||||||
nodeLinker: node-modules
|
|
|
@ -1,18 +0,0 @@
|
||||||
# Authors for kmyblue fork
|
|
||||||
|
|
||||||
## 貢献者
|
|
||||||
|
|
||||||
kmyblueフォークは、以下の方の貢献によって成り立っています。
|
|
||||||
本家Mastodonの貢献者については、`AUTHORS.md`をご覧ください。
|
|
||||||
|
|
||||||
- [aoisensi](https://github.com/aoisensi)
|
|
||||||
- [KMY](https://github.com/kmycode)
|
|
||||||
- [S-H-GAMELINKS](https://github.com/S-H-GAMELINKS)
|
|
||||||
- [Yuicho](https://github.com/yuicho)
|
|
||||||
|
|
||||||
## 特記
|
|
||||||
|
|
||||||
kmyblueフォークの開発にあたって、API・Activity仕様の設計(一部機能については内部仕様)策定の過程で下記リポジトリのコードを参考にしました。
|
|
||||||
kmyblueフォークに直接貢献したわけではありませんが、以下のリポジトリにある絵文字リアクション機能・検索範囲機能のコードのうち一部にkmyblueへ転写した箇所がございますため、お名前記載させていただきます。
|
|
||||||
|
|
||||||
- [Fedibird](https://github.com/fedibird/mastodon)
|
|
10
Aptfile
10
Aptfile
|
@ -1,5 +1,5 @@
|
||||||
libidn12
|
ffmpeg
|
||||||
# for idn-ruby on heroku-24 stack
|
libopenblas0-pthread
|
||||||
|
libpq-dev
|
||||||
# use https://github.com/heroku/heroku-buildpack-activestorage-preview
|
libxdamage1
|
||||||
# in place for ffmpeg and its dependent packages to reduce slag size
|
libxfixes3
|
||||||
|
|
2859
CHANGELOG.md
2859
CHANGELOG.md
File diff suppressed because it is too large
Load diff
43
CHANGELOG_KB.md
Normal file
43
CHANGELOG_KB.md
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
# kmyblue の変更履歴
|
||||||
|
|
||||||
|
## 4.2.0 kb-RC1 - 2023/5/23
|
||||||
|
|
||||||
|
### 追加
|
||||||
|
|
||||||
|
- カスタム絵文字の`isSensitive`値のサポート (from Misskey)
|
||||||
|
- カスタム絵文字の検索用のエイリアスキーワード
|
||||||
|
- アンテナの STL(ソーシャルタイムライン)モード
|
||||||
|
- アカウントの投稿数、フォロー数、フォロワー数の隠蔽
|
||||||
|
- @WEB - ブーストされた投稿において、ブースト自体の公開範囲の表示
|
||||||
|
- @WEB - 投稿をブーストするとき、ユーザー設定に関わらず常にダイアログを表示するメニュー項目
|
||||||
|
- ダイアログによりブースト自体の公開範囲が指定可能
|
||||||
|
- @WEB - 設定画面において、kmyblue 独自の設定項目にマーク
|
||||||
|
- ブースト時に公開範囲を指定していなかった場合、デフォルトで適用される公開範囲の設定
|
||||||
|
- 投稿文章や画像の AI 利用に対して不快感を表明する設定
|
||||||
|
- スタンプのストリーミングを停止する設定
|
||||||
|
- Glitch-soc 互換スタンプ API(※当該 PR はまだ Glitch で審査中)
|
||||||
|
- アンテナでブーストを無視する設定
|
||||||
|
- 投稿につけられたスタンプ総数の表示
|
||||||
|
- @WEB - ユーザーメニューにアンテナの項目
|
||||||
|
- 投稿自動削除機能にスタンプ条件指定
|
||||||
|
|
||||||
|
### 変更
|
||||||
|
|
||||||
|
- @WEB - 横長絵文字の絵文字ピッカー内における表示スタイル
|
||||||
|
- 画像のない投稿のセンシティブフラグについて、指定がない場合に限り常に`false`
|
||||||
|
- 「絵文字リアクション」を「スタンプ」に改称
|
||||||
|
- アカウントのフィールドの最大数を4から6に拡張
|
||||||
|
- Searchability API を Fedibird 互換に
|
||||||
|
- @WEB - 表示可能な画像の最大数を8から16に引き上げ
|
||||||
|
- 全文検索の時系列順表示を廃止
|
||||||
|
- 画像添付と投票を一つの投稿で共存可能
|
||||||
|
- @WEB - 右側サイドメニューに表示されるリスト数を4から8に引き上げ
|
||||||
|
- ホーム・リストの投稿保持数を800から1000に引き上げ
|
||||||
|
- @ADMIN - アカウントの表示名、ID の正規表現検索
|
||||||
|
|
||||||
|
### 修正
|
||||||
|
|
||||||
|
- スタンプが投稿のキャッシュに反映・更新されない問題
|
||||||
|
- デバッグ時に発生する`outbox`の一部エラー
|
||||||
|
- スタンプを削除する API において、API の戻り値に削除されたスタンプが残っている問題
|
||||||
|
- 休眠ユーザーにアンテナの投稿が配信される問題
|
|
@ -4,17 +4,17 @@ kmyblueは、コミュニティの意見も聞くには聞きますが導入す
|
||||||
|
|
||||||
## バグ報告
|
## バグ報告
|
||||||
|
|
||||||
バグについて、L最新よりも過去のバージョンへの対応は、LTSや特別な場合以外は行いません。
|
バグについて、最新よりも過去のバージョンへの対応は特別な場合以外は行いません。
|
||||||
|
|
||||||
以下のいずれかの方法で報告してください。
|
以下のいずれかの方法で報告してください。
|
||||||
|
|
||||||
- [GitHub Issues](https://github.com/kmycode/mastodon/issues) (セキュリティインシデントはここの一番下から)
|
- [GitHub Issues](https://github.com/kmycode/mastodon/issues)
|
||||||
- [kmyblue開発者への連絡](https://kmy.blue/@askyq)
|
- [kmyblue開発者への連絡](https://kmy.blue/@askyq)
|
||||||
- [kmyblue開発者へのメール](https://kmy.blue/about)
|
- [kmyblue開発者へのメール](https://kmy.blue/about)
|
||||||
|
|
||||||
## 翻訳、プルリクエスト
|
## 翻訳、プルリクエスト
|
||||||
|
|
||||||
新しい機能や既存機能の修正については、プルリクエストのためにコードを作成する前に、まずGitHub Issuesで機能の提案を行いkmyblue開発者の考えを聞くことをおすすめします。バグ修正、翻訳、テストコードなどは基本受け入れますが、依存モジュールのバージョンアップについては特別な事情がなければ本家Mastodonよりも先に行かないようにしてください。
|
新しい機能や既存機能の修正については、プルリクエストのためにコードを作成する前に、まずGitHub Issuesで機能の提案を行いkmyblue開発者の考えを聞くことをおすすめします。バグ修正、翻訳、テストコードなどは基本受け入れますが、依存モジュールのバージョンアップについては本家Mastodonよりも先に行かないようにしてください。
|
||||||
|
|
||||||
プルリクエストのタイトルには、プルリクエストの内容が明確になるようなものを設定してください。
|
プルリクエストのタイトルには、プルリクエストの内容が明確になるようなものを設定してください。
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@ kmyblueは、コミュニティの意見も聞くには聞きますが導入す
|
||||||
|
|
||||||
kmyblueが意図的に実装していない機能は、例えば以下のものがあります。詳しい理由が知りたい場合は[この記事を参照するか](https://note.com/kmycode/n/n463410b5e03c)、別途お問い合わせください。もちろん明確な根拠がある場合、あなたはこれに抗議する権利を有しますが、あなたがこのkmyblueをフォークして新しいリポジトリを作るほうがより自由でしょう。
|
kmyblueが意図的に実装していない機能は、例えば以下のものがあります。詳しい理由が知りたい場合は[この記事を参照するか](https://note.com/kmycode/n/n463410b5e03c)、別途お問い合わせください。もちろん明確な根拠がある場合、あなたはこれに抗議する権利を有しますが、あなたがこのkmyblueをフォークして新しいリポジトリを作るほうがより自由でしょう。
|
||||||
|
|
||||||
|
- 引用機能
|
||||||
- お気に入り一覧の公開
|
- お気に入り一覧の公開
|
||||||
- ブックマーク分類の公開
|
- ブックマーク分類の公開
|
||||||
- Fedibird、Misskeyにあるような詳細な画面表示オプション
|
- 他のサーバーの投稿に対して他のサーバーのアカウントが行った絵文字リアクションの受け入れ
|
||||||
|
|
15
Capfile
Normal file
15
Capfile
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'capistrano/setup'
|
||||||
|
require 'capistrano/deploy'
|
||||||
|
require 'capistrano/scm/git'
|
||||||
|
|
||||||
|
install_plugin Capistrano::SCM::Git
|
||||||
|
|
||||||
|
require 'capistrano/rbenv'
|
||||||
|
require 'capistrano/bundler'
|
||||||
|
require 'capistrano/yarn'
|
||||||
|
require 'capistrano/rails/assets'
|
||||||
|
require 'capistrano/rails/migrations'
|
||||||
|
|
||||||
|
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
|
469
Dockerfile
469
Dockerfile
|
@ -1,404 +1,105 @@
|
||||||
# syntax=docker/dockerfile:1.12
|
# syntax=docker/dockerfile:1.4
|
||||||
|
# This needs to be bookworm-slim because the Ruby image is built on bookworm-slim
|
||||||
|
ARG NODE_VERSION="20.6-bookworm-slim"
|
||||||
|
|
||||||
# This file is designed for production server deployment, not local development work
|
FROM ghcr.io/moritzheiber/ruby-jemalloc:3.2.3-slim as ruby
|
||||||
# For a containerized local dev environment, see: https://github.com/mastodon/mastodon/blob/main/docs/DEVELOPMENT.md#docker
|
FROM node:${NODE_VERSION} as build
|
||||||
|
|
||||||
# Please see https://docs.docker.com/engine/reference/builder for information about
|
COPY --link --from=ruby /opt/ruby /opt/ruby
|
||||||
# the extended buildx capabilities used in this file.
|
|
||||||
# Make sure multiarch TARGETPLATFORM is available for interpolation
|
|
||||||
# See: https://docs.docker.com/build/building/multi-platform/
|
|
||||||
ARG TARGETPLATFORM=${TARGETPLATFORM}
|
|
||||||
ARG BUILDPLATFORM=${BUILDPLATFORM}
|
|
||||||
ARG BASE_REGISTRY="docker.io"
|
|
||||||
|
|
||||||
# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.4.x"]
|
ENV DEBIAN_FRONTEND="noninteractive" \
|
||||||
# renovate: datasource=docker depName=docker.io/ruby
|
PATH="${PATH}:/opt/ruby/bin"
|
||||||
ARG RUBY_VERSION="3.4.2"
|
|
||||||
# # Node.js version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
|
|
||||||
# renovate: datasource=node-version depName=node
|
|
||||||
ARG NODE_MAJOR_VERSION="22"
|
|
||||||
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"]
|
|
||||||
ARG DEBIAN_VERSION="bookworm"
|
|
||||||
# Node.js image to use for base image based on combined variables (ex: 20-bookworm-slim)
|
|
||||||
FROM ${BASE_REGISTRY}/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim AS node
|
|
||||||
# Ruby image to use for base image based on combined variables (ex: 3.4.x-slim-bookworm)
|
|
||||||
FROM ${BASE_REGISTRY}/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} AS ruby
|
|
||||||
|
|
||||||
# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||||
# Example: v4.3.0-nightly.2023.11.09+pr-123456
|
|
||||||
# Overwrite existence of 'alpha.X' in version.rb [--build-arg MASTODON_VERSION_PRERELEASE="nightly.2023.11.09"]
|
WORKDIR /opt/mastodon
|
||||||
|
COPY Gemfile* package.json yarn.lock /opt/mastodon/
|
||||||
|
|
||||||
|
# hadolint ignore=DL3008
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get -yq dist-upgrade && \
|
||||||
|
apt-get install -y --no-install-recommends build-essential \
|
||||||
|
git \
|
||||||
|
libicu-dev \
|
||||||
|
libidn-dev \
|
||||||
|
libpq-dev \
|
||||||
|
libjemalloc-dev \
|
||||||
|
zlib1g-dev \
|
||||||
|
libgdbm-dev \
|
||||||
|
libgmp-dev \
|
||||||
|
libssl-dev \
|
||||||
|
libyaml-0-2 \
|
||||||
|
ca-certificates \
|
||||||
|
libreadline8 \
|
||||||
|
python3 \
|
||||||
|
shared-mime-info && \
|
||||||
|
bundle config set --local deployment 'true' && \
|
||||||
|
bundle config set --local without 'development test' && \
|
||||||
|
bundle config set silence_root_warning true && \
|
||||||
|
bundle install -j"$(nproc)" && \
|
||||||
|
yarn install --pure-lockfile --production --network-timeout 600000 && \
|
||||||
|
yarn cache clean
|
||||||
|
|
||||||
|
FROM node:${NODE_VERSION}
|
||||||
|
|
||||||
|
# Use those args to specify your own version flags & suffixes
|
||||||
ARG MASTODON_VERSION_PRERELEASE=""
|
ARG MASTODON_VERSION_PRERELEASE=""
|
||||||
# Append build metadata or fork information to version.rb [--build-arg MASTODON_VERSION_METADATA="pr-123456"]
|
|
||||||
ARG MASTODON_VERSION_METADATA=""
|
ARG MASTODON_VERSION_METADATA=""
|
||||||
# Will be available as Mastodon::Version.source_commit
|
|
||||||
ARG SOURCE_COMMIT=""
|
|
||||||
|
|
||||||
# Allow Ruby on Rails to serve static files
|
|
||||||
# See: https://docs.joinmastodon.org/admin/config/#rails_serve_static_files
|
|
||||||
ARG RAILS_SERVE_STATIC_FILES="true"
|
|
||||||
# Allow to use YJIT compiler
|
|
||||||
# See: https://github.com/ruby/ruby/blob/v3_2_4/doc/yjit/yjit.md
|
|
||||||
ARG RUBY_YJIT_ENABLE="1"
|
|
||||||
# Timezone used by the Docker container and runtime, change with [--build-arg TZ=Europe/Berlin]
|
|
||||||
ARG TZ="Etc/UTC"
|
|
||||||
# Linux UID (user id) for the mastodon user, change with [--build-arg UID=1234]
|
|
||||||
ARG UID="991"
|
ARG UID="991"
|
||||||
# Linux GID (group id) for the mastodon user, change with [--build-arg GID=1234]
|
|
||||||
ARG GID="991"
|
ARG GID="991"
|
||||||
|
|
||||||
# Apply Mastodon build options based on options above
|
COPY --link --from=ruby /opt/ruby /opt/ruby
|
||||||
ENV \
|
|
||||||
# Apply Mastodon version information
|
|
||||||
MASTODON_VERSION_PRERELEASE="${MASTODON_VERSION_PRERELEASE}" \
|
|
||||||
MASTODON_VERSION_METADATA="${MASTODON_VERSION_METADATA}" \
|
|
||||||
SOURCE_COMMIT="${SOURCE_COMMIT}" \
|
|
||||||
# Apply Mastodon static files and YJIT options
|
|
||||||
RAILS_SERVE_STATIC_FILES=${RAILS_SERVE_STATIC_FILES} \
|
|
||||||
RUBY_YJIT_ENABLE=${RUBY_YJIT_ENABLE} \
|
|
||||||
# Apply timezone
|
|
||||||
TZ=${TZ}
|
|
||||||
|
|
||||||
ENV \
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||||
# Configure the IP to bind Mastodon to when serving traffic
|
|
||||||
BIND="0.0.0.0" \
|
|
||||||
# Use production settings for Yarn, Node.js and related tools
|
|
||||||
NODE_ENV="production" \
|
|
||||||
# Use production settings for Ruby on Rails
|
|
||||||
RAILS_ENV="production" \
|
|
||||||
# Add Ruby and Mastodon installation to the PATH
|
|
||||||
DEBIAN_FRONTEND="noninteractive" \
|
|
||||||
PATH="${PATH}:/opt/ruby/bin:/opt/mastodon/bin" \
|
|
||||||
# Optimize jemalloc 5.x performance
|
|
||||||
MALLOC_CONF="narenas:2,background_thread:true,thp:never,dirty_decay_ms:1000,muzzy_decay_ms:0" \
|
|
||||||
# Enable libvips, should not be changed
|
|
||||||
MASTODON_USE_LIBVIPS=true \
|
|
||||||
# Sidekiq will touch tmp/sidekiq_process_has_started_and_will_begin_processing_jobs to indicate it is ready. This can be used for a readiness check in Kubernetes
|
|
||||||
MASTODON_SIDEKIQ_READY_FILENAME=sidekiq_process_has_started_and_will_begin_processing_jobs
|
|
||||||
|
|
||||||
# Set default shell used for running commands
|
ENV DEBIAN_FRONTEND="noninteractive" \
|
||||||
SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-c"]
|
PATH="${PATH}:/opt/ruby/bin:/opt/mastodon/bin"
|
||||||
|
|
||||||
ARG TARGETPLATFORM
|
# Ignoring these here since we don't want to pin any versions and the Debian image removes apt-get content after use
|
||||||
|
# hadolint ignore=DL3008,DL3009
|
||||||
|
RUN apt-get update && \
|
||||||
|
echo "Etc/UTC" > /etc/localtime && \
|
||||||
|
groupadd -g "${GID}" mastodon && \
|
||||||
|
useradd -l -u "$UID" -g "${GID}" -m -d /opt/mastodon mastodon && \
|
||||||
|
apt-get -y --no-install-recommends install whois \
|
||||||
|
wget \
|
||||||
|
procps \
|
||||||
|
libssl3 \
|
||||||
|
libpq5 \
|
||||||
|
imagemagick \
|
||||||
|
ffmpeg \
|
||||||
|
libjemalloc2 \
|
||||||
|
libicu72 \
|
||||||
|
libidn12 \
|
||||||
|
libyaml-0-2 \
|
||||||
|
file \
|
||||||
|
ca-certificates \
|
||||||
|
tzdata \
|
||||||
|
libreadline8 \
|
||||||
|
tini && \
|
||||||
|
ln -s /opt/mastodon /mastodon
|
||||||
|
|
||||||
RUN echo "Target platform is $TARGETPLATFORM"
|
# Note: no, cleaning here since Debian does this automatically
|
||||||
|
# See the file /etc/apt/apt.conf.d/docker-clean within the Docker image's filesystem
|
||||||
|
|
||||||
RUN \
|
COPY --chown=mastodon:mastodon . /opt/mastodon
|
||||||
# Remove automatic apt cache Docker cleanup scripts
|
COPY --chown=mastodon:mastodon --from=build /opt/mastodon /opt/mastodon
|
||||||
rm -f /etc/apt/apt.conf.d/docker-clean; \
|
|
||||||
# Sets timezone
|
|
||||||
echo "${TZ}" > /etc/localtime; \
|
|
||||||
# Creates mastodon user/group and sets home directory
|
|
||||||
groupadd -g "${GID}" mastodon; \
|
|
||||||
useradd -l -u "${UID}" -g "${GID}" -m -d /opt/mastodon mastodon; \
|
|
||||||
# Creates /mastodon symlink to /opt/mastodon
|
|
||||||
ln -s /opt/mastodon /mastodon;
|
|
||||||
|
|
||||||
# Set /opt/mastodon as working directory
|
ENV RAILS_ENV="production" \
|
||||||
|
NODE_ENV="production" \
|
||||||
|
RAILS_SERVE_STATIC_FILES="true" \
|
||||||
|
BIND="0.0.0.0" \
|
||||||
|
MASTODON_VERSION_PRERELEASE="${MASTODON_VERSION_PRERELEASE}" \
|
||||||
|
MASTODON_VERSION_METADATA="${MASTODON_VERSION_METADATA}"
|
||||||
|
|
||||||
|
# Set the run user
|
||||||
|
USER mastodon
|
||||||
WORKDIR /opt/mastodon
|
WORKDIR /opt/mastodon
|
||||||
|
|
||||||
# Add backport repository for some specific packages where we need the latest version
|
# Precompile assets
|
||||||
RUN echo 'deb http://deb.debian.org/debian bookworm-backports main' >> /etc/apt/sources.list
|
RUN OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile
|
||||||
|
|
||||||
# hadolint ignore=DL3008,DL3005
|
# Set the work dir and the container entry point
|
||||||
RUN \
|
|
||||||
# Mount Apt cache and lib directories from Docker buildx caches
|
|
||||||
--mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \
|
|
||||||
--mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \
|
|
||||||
# Apt update & upgrade to check for security updates to Debian image
|
|
||||||
apt-get update; \
|
|
||||||
apt-get dist-upgrade -yq; \
|
|
||||||
# Install jemalloc, curl and other necessary components
|
|
||||||
apt-get install -y --no-install-recommends \
|
|
||||||
curl \
|
|
||||||
file \
|
|
||||||
libjemalloc2 \
|
|
||||||
patchelf \
|
|
||||||
procps \
|
|
||||||
tini \
|
|
||||||
tzdata \
|
|
||||||
wget \
|
|
||||||
; \
|
|
||||||
# Patch Ruby to use jemalloc
|
|
||||||
patchelf --add-needed libjemalloc.so.2 /usr/local/bin/ruby; \
|
|
||||||
# Discard patchelf after use
|
|
||||||
apt-get purge -y \
|
|
||||||
patchelf \
|
|
||||||
;
|
|
||||||
|
|
||||||
# Create temporary build layer from base image
|
|
||||||
FROM ruby AS build
|
|
||||||
|
|
||||||
ARG TARGETPLATFORM
|
|
||||||
|
|
||||||
# hadolint ignore=DL3008
|
|
||||||
RUN \
|
|
||||||
# Mount Apt cache and lib directories from Docker buildx caches
|
|
||||||
--mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \
|
|
||||||
--mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \
|
|
||||||
# Install build tools and bundler dependencies from APT
|
|
||||||
apt-get install -y --no-install-recommends \
|
|
||||||
autoconf \
|
|
||||||
automake \
|
|
||||||
build-essential \
|
|
||||||
cmake \
|
|
||||||
git \
|
|
||||||
libgdbm-dev \
|
|
||||||
libglib2.0-dev \
|
|
||||||
libgmp-dev \
|
|
||||||
libicu-dev \
|
|
||||||
libidn-dev \
|
|
||||||
libpq-dev \
|
|
||||||
libssl-dev \
|
|
||||||
libtool \
|
|
||||||
libyaml-dev \
|
|
||||||
meson \
|
|
||||||
nasm \
|
|
||||||
pkg-config \
|
|
||||||
shared-mime-info \
|
|
||||||
xz-utils \
|
|
||||||
# libvips components
|
|
||||||
libcgif-dev \
|
|
||||||
libexif-dev \
|
|
||||||
libexpat1-dev \
|
|
||||||
libgirepository1.0-dev \
|
|
||||||
libheif-dev/bookworm-backports \
|
|
||||||
libimagequant-dev \
|
|
||||||
libjpeg62-turbo-dev \
|
|
||||||
liblcms2-dev \
|
|
||||||
liborc-dev \
|
|
||||||
libspng-dev \
|
|
||||||
libtiff-dev \
|
|
||||||
libwebp-dev \
|
|
||||||
# ffmpeg components
|
|
||||||
libdav1d-dev \
|
|
||||||
liblzma-dev \
|
|
||||||
libmp3lame-dev \
|
|
||||||
libopus-dev \
|
|
||||||
libsnappy-dev \
|
|
||||||
libvorbis-dev \
|
|
||||||
libvpx-dev \
|
|
||||||
libx264-dev \
|
|
||||||
libx265-dev \
|
|
||||||
;
|
|
||||||
|
|
||||||
# Create temporary libvips specific build layer from build layer
|
|
||||||
FROM build AS libvips
|
|
||||||
|
|
||||||
# libvips version to compile, change with [--build-arg VIPS_VERSION="8.15.2"]
|
|
||||||
# renovate: datasource=github-releases depName=libvips packageName=libvips/libvips
|
|
||||||
ARG VIPS_VERSION=8.16.1
|
|
||||||
# libvips download URL, change with [--build-arg VIPS_URL="https://github.com/libvips/libvips/releases/download"]
|
|
||||||
ARG VIPS_URL=https://github.com/libvips/libvips/releases/download
|
|
||||||
|
|
||||||
WORKDIR /usr/local/libvips/src
|
|
||||||
# Download and extract libvips source code
|
|
||||||
ADD ${VIPS_URL}/v${VIPS_VERSION}/vips-${VIPS_VERSION}.tar.xz /usr/local/libvips/src/
|
|
||||||
RUN tar xf vips-${VIPS_VERSION}.tar.xz;
|
|
||||||
|
|
||||||
WORKDIR /usr/local/libvips/src/vips-${VIPS_VERSION}
|
|
||||||
|
|
||||||
# Configure and compile libvips
|
|
||||||
RUN \
|
|
||||||
meson setup build --prefix /usr/local/libvips --libdir=lib -Ddeprecated=false -Dintrospection=disabled -Dmodules=disabled -Dexamples=false; \
|
|
||||||
cd build; \
|
|
||||||
ninja; \
|
|
||||||
ninja install;
|
|
||||||
|
|
||||||
# Create temporary ffmpeg specific build layer from build layer
|
|
||||||
FROM build AS ffmpeg
|
|
||||||
|
|
||||||
# ffmpeg version to compile, change with [--build-arg FFMPEG_VERSION="7.0.x"]
|
|
||||||
# renovate: datasource=repology depName=ffmpeg packageName=openpkg_current/ffmpeg
|
|
||||||
ARG FFMPEG_VERSION=7.1
|
|
||||||
# ffmpeg download URL, change with [--build-arg FFMPEG_URL="https://ffmpeg.org/releases"]
|
|
||||||
ARG FFMPEG_URL=https://ffmpeg.org/releases
|
|
||||||
|
|
||||||
WORKDIR /usr/local/ffmpeg/src
|
|
||||||
# Download and extract ffmpeg source code
|
|
||||||
ADD ${FFMPEG_URL}/ffmpeg-${FFMPEG_VERSION}.tar.xz /usr/local/ffmpeg/src/
|
|
||||||
RUN tar xf ffmpeg-${FFMPEG_VERSION}.tar.xz;
|
|
||||||
|
|
||||||
WORKDIR /usr/local/ffmpeg/src/ffmpeg-${FFMPEG_VERSION}
|
|
||||||
|
|
||||||
# Configure and compile ffmpeg
|
|
||||||
RUN \
|
|
||||||
./configure \
|
|
||||||
--prefix=/usr/local/ffmpeg \
|
|
||||||
--toolchain=hardened \
|
|
||||||
--disable-debug \
|
|
||||||
--disable-devices \
|
|
||||||
--disable-doc \
|
|
||||||
--disable-ffplay \
|
|
||||||
--disable-network \
|
|
||||||
--disable-static \
|
|
||||||
--enable-ffmpeg \
|
|
||||||
--enable-ffprobe \
|
|
||||||
--enable-gpl \
|
|
||||||
--enable-libdav1d \
|
|
||||||
--enable-libmp3lame \
|
|
||||||
--enable-libopus \
|
|
||||||
--enable-libsnappy \
|
|
||||||
--enable-libvorbis \
|
|
||||||
--enable-libvpx \
|
|
||||||
--enable-libwebp \
|
|
||||||
--enable-libx264 \
|
|
||||||
--enable-libx265 \
|
|
||||||
--enable-shared \
|
|
||||||
--enable-version3 \
|
|
||||||
; \
|
|
||||||
make -j$(nproc); \
|
|
||||||
make install;
|
|
||||||
|
|
||||||
# Create temporary bundler specific build layer from build layer
|
|
||||||
FROM build AS bundler
|
|
||||||
|
|
||||||
ARG TARGETPLATFORM
|
|
||||||
|
|
||||||
# Copy Gemfile config into working directory
|
|
||||||
COPY Gemfile* /opt/mastodon/
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
# Mount Ruby Gem caches
|
|
||||||
--mount=type=cache,id=gem-cache-${TARGETPLATFORM},target=/usr/local/bundle/cache/,sharing=locked \
|
|
||||||
# Configure bundle to prevent changes to Gemfile and Gemfile.lock
|
|
||||||
bundle config set --global frozen "true"; \
|
|
||||||
# Configure bundle to not cache downloaded Gems
|
|
||||||
bundle config set --global cache_all "false"; \
|
|
||||||
# Configure bundle to only process production Gems
|
|
||||||
bundle config set --local without "development test"; \
|
|
||||||
# Configure bundle to not warn about root user
|
|
||||||
bundle config set silence_root_warning "true"; \
|
|
||||||
# Download and install required Gems
|
|
||||||
bundle install -j"$(nproc)";
|
|
||||||
|
|
||||||
# Create temporary assets build layer from build layer
|
|
||||||
FROM build AS precompiler
|
|
||||||
|
|
||||||
ARG TARGETPLATFORM
|
|
||||||
|
|
||||||
# Copy Mastodon sources into layer
|
|
||||||
COPY . /opt/mastodon/
|
|
||||||
|
|
||||||
# Copy Node.js binaries/libraries into layer
|
|
||||||
COPY --from=node /usr/local/bin /usr/local/bin
|
|
||||||
COPY --from=node /usr/local/lib /usr/local/lib
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
# Configure Corepack
|
|
||||||
rm /usr/local/bin/yarn*; \
|
|
||||||
corepack enable; \
|
|
||||||
corepack prepare --activate;
|
|
||||||
|
|
||||||
# hadolint ignore=DL3008
|
|
||||||
RUN \
|
|
||||||
--mount=type=cache,id=corepack-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/corepack,sharing=locked \
|
|
||||||
--mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \
|
|
||||||
# Install Node.js packages
|
|
||||||
yarn workspaces focus --production @mastodon/mastodon;
|
|
||||||
|
|
||||||
# Copy libvips components into layer for precompiler
|
|
||||||
COPY --from=libvips /usr/local/libvips/bin /usr/local/bin
|
|
||||||
COPY --from=libvips /usr/local/libvips/lib /usr/local/lib
|
|
||||||
# Copy bundler packages into layer for precompiler
|
|
||||||
COPY --from=bundler /opt/mastodon /opt/mastodon/
|
|
||||||
COPY --from=bundler /usr/local/bundle/ /usr/local/bundle/
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
ldconfig; \
|
|
||||||
# Use Ruby on Rails to create Mastodon assets
|
|
||||||
SECRET_KEY_BASE_DUMMY=1 \
|
|
||||||
bundle exec rails assets:precompile; \
|
|
||||||
# Cleanup temporary files
|
|
||||||
rm -fr /opt/mastodon/tmp;
|
|
||||||
|
|
||||||
# Prep final Mastodon Ruby layer
|
|
||||||
FROM ruby AS mastodon
|
|
||||||
|
|
||||||
ARG TARGETPLATFORM
|
|
||||||
|
|
||||||
# hadolint ignore=DL3008
|
|
||||||
RUN \
|
|
||||||
# Mount Apt cache and lib directories from Docker buildx caches
|
|
||||||
--mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \
|
|
||||||
--mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \
|
|
||||||
# Mount Corepack and Yarn caches from Docker buildx caches
|
|
||||||
--mount=type=cache,id=corepack-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/corepack,sharing=locked \
|
|
||||||
--mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \
|
|
||||||
# Apt update install non-dev versions of necessary components
|
|
||||||
apt-get install -y --no-install-recommends \
|
|
||||||
libexpat1 \
|
|
||||||
libglib2.0-0 \
|
|
||||||
libicu72 \
|
|
||||||
libidn12 \
|
|
||||||
libpq5 \
|
|
||||||
libreadline8 \
|
|
||||||
libssl3 \
|
|
||||||
libyaml-0-2 \
|
|
||||||
# libvips components
|
|
||||||
libcgif0 \
|
|
||||||
libexif12 \
|
|
||||||
libheif1/bookworm-backports \
|
|
||||||
libimagequant0 \
|
|
||||||
libjpeg62-turbo \
|
|
||||||
liblcms2-2 \
|
|
||||||
liborc-0.4-0 \
|
|
||||||
libspng0 \
|
|
||||||
libtiff6 \
|
|
||||||
libwebp7 \
|
|
||||||
libwebpdemux2 \
|
|
||||||
libwebpmux3 \
|
|
||||||
# ffmpeg components
|
|
||||||
libdav1d6 \
|
|
||||||
libmp3lame0 \
|
|
||||||
libopencore-amrnb0 \
|
|
||||||
libopencore-amrwb0 \
|
|
||||||
libopus0 \
|
|
||||||
libsnappy1v5 \
|
|
||||||
libtheora0 \
|
|
||||||
libvorbis0a \
|
|
||||||
libvorbisenc2 \
|
|
||||||
libvorbisfile3 \
|
|
||||||
libvpx7 \
|
|
||||||
libx264-164 \
|
|
||||||
libx265-199 \
|
|
||||||
;
|
|
||||||
|
|
||||||
# Copy Mastodon sources into final layer
|
|
||||||
COPY . /opt/mastodon/
|
|
||||||
|
|
||||||
# Copy compiled assets to layer
|
|
||||||
COPY --from=precompiler /opt/mastodon/public/packs /opt/mastodon/public/packs
|
|
||||||
COPY --from=precompiler /opt/mastodon/public/assets /opt/mastodon/public/assets
|
|
||||||
# Copy bundler components to layer
|
|
||||||
COPY --from=bundler /usr/local/bundle/ /usr/local/bundle/
|
|
||||||
# Copy libvips components to layer
|
|
||||||
COPY --from=libvips /usr/local/libvips/bin /usr/local/bin
|
|
||||||
COPY --from=libvips /usr/local/libvips/lib /usr/local/lib
|
|
||||||
# Copy ffpmeg components to layer
|
|
||||||
COPY --from=ffmpeg /usr/local/ffmpeg/bin /usr/local/bin
|
|
||||||
COPY --from=ffmpeg /usr/local/ffmpeg/lib /usr/local/lib
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
ldconfig; \
|
|
||||||
# Smoketest media processors
|
|
||||||
vips -v; \
|
|
||||||
ffmpeg -version; \
|
|
||||||
ffprobe -version;
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
# Precompile bootsnap code for faster Rails startup
|
|
||||||
bundle exec bootsnap precompile --gemfile app/ lib/;
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
# Pre-create and chown system volume to Mastodon user
|
|
||||||
mkdir -p /opt/mastodon/public/system; \
|
|
||||||
chown mastodon:mastodon /opt/mastodon/public/system; \
|
|
||||||
# Set Mastodon user as owner of tmp folder
|
|
||||||
chown -R mastodon:mastodon /opt/mastodon/tmp;
|
|
||||||
|
|
||||||
# Set the running user for resulting container
|
|
||||||
USER mastodon
|
|
||||||
# Expose default Puma ports
|
|
||||||
EXPOSE 3000
|
|
||||||
# Set container tini as default entry point
|
|
||||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||||||
|
EXPOSE 3000 4000
|
||||||
|
|
|
@ -1,35 +1,19 @@
|
||||||
# Federation
|
## ActivityPub federation in Mastodon
|
||||||
|
|
||||||
## Supported federation protocols and standards
|
|
||||||
|
|
||||||
- [ActivityPub](https://www.w3.org/TR/activitypub/) (Server-to-Server)
|
|
||||||
- [WebFinger](https://webfinger.net/)
|
|
||||||
- [Http Signatures](https://datatracker.ietf.org/doc/html/draft-cavage-http-signatures)
|
|
||||||
- [NodeInfo](https://nodeinfo.diaspora.software/)
|
|
||||||
|
|
||||||
## Supported FEPs
|
|
||||||
|
|
||||||
- [FEP-67ff: FEDERATION.md](https://codeberg.org/fediverse/fep/src/branch/main/fep/67ff/fep-67ff.md)
|
|
||||||
- [FEP-f1d5: NodeInfo in Fediverse Software](https://codeberg.org/fediverse/fep/src/branch/main/fep/f1d5/fep-f1d5.md)
|
|
||||||
- [FEP-8fcf: Followers collection synchronization across servers](https://codeberg.org/fediverse/fep/src/branch/main/fep/8fcf/fep-8fcf.md)
|
|
||||||
- [FEP-5feb: Search indexing consent for actors](https://codeberg.org/fediverse/fep/src/branch/main/fep/5feb/fep-5feb.md)
|
|
||||||
|
|
||||||
## ActivityPub in Mastodon
|
|
||||||
|
|
||||||
Mastodon largely follows the ActivityPub server-to-server specification but it makes uses of some non-standard extensions, some of which are required for interacting with Mastodon at all.
|
Mastodon largely follows the ActivityPub server-to-server specification but it makes uses of some non-standard extensions, some of which are required for interacting with Mastodon at all.
|
||||||
|
|
||||||
- [Supported ActivityPub vocabulary](https://docs.joinmastodon.org/spec/activitypub/)
|
Supported vocabulary: https://docs.joinmastodon.org/spec/activitypub/
|
||||||
|
|
||||||
### Required extensions
|
### Required extensions
|
||||||
|
|
||||||
#### WebFinger
|
#### Webfinger
|
||||||
|
|
||||||
In Mastodon, users are identified by a `username` and `domain` pair (e.g., `Gargron@mastodon.social`).
|
In Mastodon, users are identified by a `username` and `domain` pair (e.g., `Gargron@mastodon.social`).
|
||||||
This is used both for discovery and for unambiguously mentioning users across the fediverse. Furthermore, this is part of Mastodon's database design from its very beginnings.
|
This is used both for discovery and for unambiguously mentioning users across the fediverse. Furthermore, this is part of Mastodon's database design from its very beginnings.
|
||||||
|
|
||||||
As a result, Mastodon requires that each ActivityPub actor uniquely maps back to an `acct:` URI that can be resolved via WebFinger.
|
As a result, Mastodon requires that each ActivityPub actor uniquely maps back to an `acct:` URI that can be resolved via WebFinger.
|
||||||
|
|
||||||
- [WebFinger information and examples](https://docs.joinmastodon.org/spec/webfinger/)
|
More information and examples are available at: https://docs.joinmastodon.org/spec/webfinger/
|
||||||
|
|
||||||
#### HTTP Signatures
|
#### HTTP Signatures
|
||||||
|
|
||||||
|
@ -37,13 +21,11 @@ In order to authenticate activities, Mastodon relies on HTTP Signatures, signing
|
||||||
|
|
||||||
Mastodon requires all `POST` requests to be signed, and MAY require `GET` requests to be signed, depending on the configuration of the Mastodon server.
|
Mastodon requires all `POST` requests to be signed, and MAY require `GET` requests to be signed, depending on the configuration of the Mastodon server.
|
||||||
|
|
||||||
- [HTTP Signatures information and examples](https://docs.joinmastodon.org/spec/security/#http)
|
More information on HTTP Signatures, as well as examples, can be found here: https://docs.joinmastodon.org/spec/security/#http
|
||||||
|
|
||||||
### Optional extensions
|
### Optional extensions
|
||||||
|
|
||||||
- [Linked-Data Signatures](https://docs.joinmastodon.org/spec/security/#ld)
|
- Linked-Data Signatures: https://docs.joinmastodon.org/spec/security/#ld
|
||||||
- [Bearcaps](https://docs.joinmastodon.org/spec/bearcaps/)
|
- Bearcaps: https://docs.joinmastodon.org/spec/bearcaps/
|
||||||
|
- Followers collection synchronization: https://codeberg.org/fediverse/fep/src/branch/main/fep/8fcf/fep-8fcf.md
|
||||||
### Additional documentation
|
- Search indexing consent for actors: https://codeberg.org/fediverse/fep/src/branch/main/fep/5feb/fep-5feb.md
|
||||||
|
|
||||||
- [Mastodon documentation](https://docs.joinmastodon.org/)
|
|
||||||
|
|
163
Gemfile
163
Gemfile
|
@ -1,36 +1,34 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
ruby '>= 3.2.0', '< 3.5.0'
|
ruby '>= 3.0.0'
|
||||||
|
|
||||||
gem 'propshaft'
|
|
||||||
gem 'puma', '~> 6.3'
|
gem 'puma', '~> 6.3'
|
||||||
gem 'rack', '~> 2.2.7'
|
gem 'rails', '~> 7.0'
|
||||||
gem 'rails', '~> 8.0'
|
gem 'sprockets', '~> 3.7.2'
|
||||||
gem 'thor', '~> 1.2'
|
gem 'thor', '~> 1.2'
|
||||||
|
gem 'rack', '~> 2.2.7'
|
||||||
|
|
||||||
gem 'dotenv'
|
|
||||||
gem 'haml-rails', '~>2.0'
|
gem 'haml-rails', '~>2.0'
|
||||||
gem 'pg', '~> 1.5'
|
gem 'pg', '~> 1.5'
|
||||||
gem 'pghero'
|
gem 'pghero'
|
||||||
|
gem 'dotenv-rails', '~> 2.8'
|
||||||
|
|
||||||
gem 'aws-sdk-core', '< 3.216.0', require: false # TODO: https://github.com/mastodon/mastodon/pull/34173#issuecomment-2733378873
|
|
||||||
gem 'aws-sdk-s3', '~> 1.123', require: false
|
gem 'aws-sdk-s3', '~> 1.123', require: false
|
||||||
gem 'blurhash', '~> 0.1'
|
gem 'fog-core', '<= 2.4.0'
|
||||||
gem 'fog-core', '<= 2.6.0'
|
gem 'fog-openstack', '~> 0.3', require: false
|
||||||
gem 'fog-openstack', '~> 1.0', require: false
|
|
||||||
gem 'jd-paperclip-azure', '~> 3.0', require: false
|
|
||||||
gem 'kt-paperclip', '~> 7.2'
|
gem 'kt-paperclip', '~> 7.2'
|
||||||
gem 'ruby-vips', '~> 2.2', require: false
|
gem 'md-paperclip-azure', '~> 2.2', require: false
|
||||||
|
gem 'blurhash', '~> 0.1'
|
||||||
|
|
||||||
gem 'active_model_serializers', '~> 0.10'
|
gem 'active_model_serializers', '~> 0.10'
|
||||||
gem 'addressable', '~> 2.8'
|
gem 'addressable', '~> 2.8'
|
||||||
gem 'bootsnap', '~> 1.18.0', require: false
|
gem 'bootsnap', '~> 1.16.0', require: false
|
||||||
gem 'browser'
|
gem 'browser'
|
||||||
gem 'charlock_holmes', '~> 0.7.7'
|
gem 'charlock_holmes', '~> 0.7.7'
|
||||||
gem 'chewy', '~> 7.3'
|
gem 'chewy', '~> 7.3'
|
||||||
gem 'devise', '~> 4.9'
|
gem 'devise', '~> 4.9'
|
||||||
gem 'devise-two-factor'
|
gem 'devise-two-factor', '~> 4.1'
|
||||||
|
|
||||||
group :pam_authentication, optional: true do
|
group :pam_authentication, optional: true do
|
||||||
gem 'devise_pam_authenticatable2', '~> 9.2'
|
gem 'devise_pam_authenticatable2', '~> 9.2'
|
||||||
|
@ -38,104 +36,80 @@ end
|
||||||
|
|
||||||
gem 'net-ldap', '~> 0.18'
|
gem 'net-ldap', '~> 0.18'
|
||||||
|
|
||||||
gem 'omniauth', '~> 2.0'
|
# TODO: Point back at released omniauth-cas gem when PR merged
|
||||||
gem 'omniauth-cas', '~> 3.0.0.beta.1'
|
# https://github.com/dlindahl/omniauth-cas/pull/68
|
||||||
gem 'omniauth_openid_connect', '~> 0.8.0'
|
gem 'omniauth-cas', github: 'stanhu/omniauth-cas', ref: '4211e6d05941b4a981f9a36b49ec166cecd0e271'
|
||||||
gem 'omniauth-rails_csrf_protection', '~> 1.0'
|
|
||||||
gem 'omniauth-saml', '~> 2.0'
|
gem 'omniauth-saml', '~> 2.0'
|
||||||
|
gem 'omniauth_openid_connect', '~> 0.6.1'
|
||||||
|
gem 'omniauth', '~> 2.0'
|
||||||
|
gem 'omniauth-rails_csrf_protection', '~> 1.0'
|
||||||
|
|
||||||
gem 'color_diff', '~> 0.1'
|
gem 'color_diff', '~> 0.1'
|
||||||
gem 'csv', '~> 3.2'
|
|
||||||
gem 'discard', '~> 1.2'
|
gem 'discard', '~> 1.2'
|
||||||
gem 'doorkeeper', '~> 5.6'
|
gem 'doorkeeper', '~> 5.6'
|
||||||
gem 'faraday-httpclient'
|
gem 'ed25519', '~> 1.3'
|
||||||
gem 'fast_blank', '~> 1.0'
|
gem 'fast_blank', '~> 1.0'
|
||||||
gem 'fastimage'
|
gem 'fastimage'
|
||||||
gem 'hiredis', '~> 0.6'
|
gem 'hiredis', '~> 0.6'
|
||||||
|
gem 'redis-namespace', '~> 1.10'
|
||||||
gem 'htmlentities', '~> 4.3'
|
gem 'htmlentities', '~> 4.3'
|
||||||
gem 'http', '~> 5.2.0'
|
gem 'http', '~> 5.1'
|
||||||
gem 'http_accept_language', '~> 2.1'
|
gem 'http_accept_language', '~> 2.1'
|
||||||
gem 'httplog', '~> 1.7.0', require: false
|
gem 'httplog', '~> 1.6.2'
|
||||||
gem 'i18n'
|
|
||||||
gem 'idn-ruby', require: 'idn'
|
gem 'idn-ruby', require: 'idn'
|
||||||
gem 'inline_svg'
|
|
||||||
gem 'irb', '~> 1.8'
|
|
||||||
gem 'kaminari', '~> 1.2'
|
gem 'kaminari', '~> 1.2'
|
||||||
gem 'link_header', '~> 0.0'
|
gem 'link_header', '~> 0.0'
|
||||||
gem 'linzer', '~> 0.6.1'
|
gem 'mime-types', '~> 3.5.0', require: 'mime/types/columnar'
|
||||||
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
|
|
||||||
gem 'mime-types', '~> 3.6.0', require: 'mime/types/columnar'
|
|
||||||
gem 'mutex_m'
|
|
||||||
gem 'nokogiri', '~> 1.15'
|
gem 'nokogiri', '~> 1.15'
|
||||||
|
gem 'nsa'
|
||||||
gem 'oj', '~> 3.14'
|
gem 'oj', '~> 3.14'
|
||||||
gem 'ox', '~> 2.14'
|
gem 'ox', '~> 2.14'
|
||||||
gem 'parslet'
|
gem 'parslet'
|
||||||
gem 'premailer-rails'
|
gem 'public_suffix', '~> 5.0'
|
||||||
gem 'public_suffix', '~> 6.0'
|
|
||||||
gem 'pundit', '~> 2.3'
|
gem 'pundit', '~> 2.3'
|
||||||
|
gem 'premailer-rails'
|
||||||
gem 'rack-attack', '~> 6.6'
|
gem 'rack-attack', '~> 6.6'
|
||||||
gem 'rack-cors', '~> 2.0', require: 'rack/cors'
|
gem 'rack-cors', '~> 2.0', require: 'rack/cors'
|
||||||
gem 'rails-i18n', '~> 8.0'
|
gem 'rails-i18n', '~> 7.0'
|
||||||
|
gem 'rails-settings-cached', '~> 0.6', git: 'https://github.com/mastodon/rails-settings-cached.git', branch: 'v0.6.6-aliases-true'
|
||||||
gem 'redcarpet', '~> 3.6'
|
gem 'redcarpet', '~> 3.6'
|
||||||
gem 'redis', '~> 4.5', require: ['redis', 'redis/connection/hiredis']
|
gem 'redis', '~> 4.5', require: ['redis', 'redis/connection/hiredis']
|
||||||
gem 'redis-namespace', '~> 1.10'
|
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
|
||||||
gem 'rqrcode', '~> 2.2'
|
gem 'rqrcode', '~> 2.2'
|
||||||
gem 'ruby-progressbar', '~> 1.13'
|
gem 'ruby-progressbar', '~> 1.13'
|
||||||
gem 'sanitize', '~> 7.0'
|
gem 'sanitize', '~> 6.0'
|
||||||
gem 'scenic', '~> 1.7'
|
gem 'scenic', '~> 1.7'
|
||||||
gem 'sidekiq', '~> 6.5'
|
gem 'sidekiq', '~> 6.5'
|
||||||
gem 'sidekiq-bulk', '~> 0.2.0'
|
|
||||||
gem 'sidekiq-scheduler', '~> 5.0'
|
gem 'sidekiq-scheduler', '~> 5.0'
|
||||||
gem 'sidekiq-unique-jobs', '~> 7.1'
|
gem 'sidekiq-unique-jobs', '~> 7.1'
|
||||||
gem 'simple_form', '~> 5.2'
|
gem 'sidekiq-bulk', '~> 0.2.0'
|
||||||
gem 'simple-navigation', '~> 4.4'
|
gem 'simple-navigation', '~> 4.4'
|
||||||
gem 'stoplight', '~> 4.1'
|
gem 'simple_form', '~> 5.2'
|
||||||
gem 'strong_migrations'
|
gem 'sprockets-rails', '~> 3.4', require: 'sprockets/railtie'
|
||||||
|
gem 'stoplight', '~> 3.0.1'
|
||||||
|
gem 'strong_migrations', '~> 0.8'
|
||||||
gem 'tty-prompt', '~> 0.23', require: false
|
gem 'tty-prompt', '~> 0.23', require: false
|
||||||
gem 'twitter-text', '~> 3.1.0'
|
gem 'twitter-text', '~> 3.1.0'
|
||||||
gem 'tzinfo-data', '~> 1.2023'
|
gem 'tzinfo-data', '~> 1.2023'
|
||||||
gem 'webauthn', '~> 3.0'
|
|
||||||
gem 'webpacker', '~> 5.4'
|
gem 'webpacker', '~> 5.4'
|
||||||
gem 'webpush', github: 'mastodon/webpush', ref: '9631ac63045cfabddacc69fc06e919b4c13eb913'
|
gem 'webpush', github: 'ClearlyClaire/webpush', ref: 'f14a4d52e201128b1b00245d11b6de80d6cfdcd9'
|
||||||
|
gem 'webauthn', '~> 3.0'
|
||||||
|
|
||||||
gem 'json-ld'
|
gem 'json-ld'
|
||||||
gem 'json-ld-preloaded', '~> 3.2'
|
gem 'json-ld-preloaded', '~> 3.2'
|
||||||
gem 'rdf-normalize', '~> 0.5'
|
gem 'rdf-normalize', '~> 0.5'
|
||||||
|
|
||||||
gem 'prometheus_exporter', '~> 2.2', require: false
|
gem 'private_address_check', '~> 0.5'
|
||||||
|
|
||||||
gem 'opentelemetry-api', '~> 1.5.0'
|
|
||||||
|
|
||||||
group :opentelemetry do
|
|
||||||
gem 'opentelemetry-exporter-otlp', '~> 0.30.0', require: false
|
|
||||||
gem 'opentelemetry-instrumentation-active_job', '~> 0.8.0', require: false
|
|
||||||
gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.22.0', require: false
|
|
||||||
gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.22.0', require: false
|
|
||||||
gem 'opentelemetry-instrumentation-excon', '~> 0.23.0', require: false
|
|
||||||
gem 'opentelemetry-instrumentation-faraday', '~> 0.26.0', require: false
|
|
||||||
gem 'opentelemetry-instrumentation-http', '~> 0.24.0', require: false
|
|
||||||
gem 'opentelemetry-instrumentation-http_client', '~> 0.23.0', require: false
|
|
||||||
gem 'opentelemetry-instrumentation-net_http', '~> 0.23.0', require: false
|
|
||||||
gem 'opentelemetry-instrumentation-pg', '~> 0.30.0', require: false
|
|
||||||
gem 'opentelemetry-instrumentation-rack', '~> 0.26.0', require: false
|
|
||||||
gem 'opentelemetry-instrumentation-rails', '~> 0.36.0', require: false
|
|
||||||
gem 'opentelemetry-instrumentation-redis', '~> 0.26.0', require: false
|
|
||||||
gem 'opentelemetry-instrumentation-sidekiq', '~> 0.26.0', require: false
|
|
||||||
gem 'opentelemetry-sdk', '~> 1.4', require: false
|
|
||||||
end
|
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
# Enable usage of all available CPUs/cores during spec runs
|
# Used to split testing into chunks in CI
|
||||||
gem 'flatware-rspec'
|
gem 'rspec_chunked', '~> 0.6'
|
||||||
|
|
||||||
# Adds RSpec Error/Warning annotations to GitHub PRs on the Files tab
|
# RSpec progress bar formatter
|
||||||
gem 'rspec-github', '~> 3.0', require: false
|
gem 'fuubar', '~> 2.5'
|
||||||
|
|
||||||
# RSpec helpers for email specs
|
# Extra RSpec extenion methods and helpers for sidekiq
|
||||||
gem 'email_spec'
|
gem 'rspec-sidekiq', '~> 4.0'
|
||||||
|
|
||||||
# Extra RSpec extension methods and helpers for sidekiq
|
|
||||||
gem 'rspec-sidekiq', '~> 5.0'
|
|
||||||
|
|
||||||
# Browser integration testing
|
# Browser integration testing
|
||||||
gem 'capybara', '~> 3.39'
|
gem 'capybara', '~> 3.39'
|
||||||
|
@ -145,36 +119,42 @@ group :test do
|
||||||
gem 'database_cleaner-active_record'
|
gem 'database_cleaner-active_record'
|
||||||
|
|
||||||
# Used to mock environment variables
|
# Used to mock environment variables
|
||||||
gem 'climate_control'
|
gem 'climate_control', '~> 0.2'
|
||||||
|
|
||||||
|
# Generating fake data for specs
|
||||||
|
gem 'faker', '~> 3.2'
|
||||||
|
|
||||||
|
# Generate test objects for specs
|
||||||
|
gem 'fabrication', '~> 2.30'
|
||||||
|
|
||||||
|
# Add back helpers functions removed in Rails 5.1
|
||||||
|
gem 'rails-controller-testing', '~> 1.0'
|
||||||
|
|
||||||
# Validate schemas in specs
|
# Validate schemas in specs
|
||||||
gem 'json-schema', '~> 5.0'
|
gem 'json-schema', '~> 4.0'
|
||||||
|
|
||||||
# Test harness fo rack components
|
# Test harness fo rack components
|
||||||
gem 'rack-test', '~> 2.1'
|
gem 'rack-test', '~> 2.1'
|
||||||
|
|
||||||
gem 'shoulda-matchers'
|
# Coverage formatter for RSpec test if DISABLE_SIMPLECOV is false
|
||||||
|
|
||||||
# Coverage formatter for RSpec
|
|
||||||
gem 'simplecov', '~> 0.22', require: false
|
gem 'simplecov', '~> 0.22', require: false
|
||||||
gem 'simplecov-lcov', '~> 0.8', require: false
|
|
||||||
|
|
||||||
# Stub web requests for specs
|
# Stub web requests for specs
|
||||||
gem 'webmock', '~> 3.18'
|
gem 'webmock', '~> 3.18'
|
||||||
|
|
||||||
|
gem 'rspec-retry', '>= 0.6.2'
|
||||||
end
|
end
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
# Code linting CLI and plugins
|
# Code linting CLI and plugins
|
||||||
gem 'rubocop', require: false
|
gem 'rubocop', require: false
|
||||||
gem 'rubocop-capybara', require: false
|
gem 'rubocop-capybara', require: false
|
||||||
gem 'rubocop-i18n', require: false
|
|
||||||
gem 'rubocop-performance', require: false
|
gem 'rubocop-performance', require: false
|
||||||
gem 'rubocop-rails', require: false
|
gem 'rubocop-rails', require: false
|
||||||
gem 'rubocop-rspec', require: false
|
gem 'rubocop-rspec', require: false
|
||||||
gem 'rubocop-rspec_rails', require: false
|
|
||||||
|
|
||||||
# Annotates modules with schema
|
# Annotates modules with schema
|
||||||
gem 'annotaterb', '~> 4.13', require: false
|
gem 'annotate', '~> 3.2'
|
||||||
|
|
||||||
# Enhanced error message pages for development
|
# Enhanced error message pages for development
|
||||||
gem 'better_errors', '~> 2.9'
|
gem 'better_errors', '~> 2.9'
|
||||||
|
@ -182,49 +162,46 @@ group :development do
|
||||||
|
|
||||||
# Preview mail in the browser
|
# Preview mail in the browser
|
||||||
gem 'letter_opener', '~> 1.8'
|
gem 'letter_opener', '~> 1.8'
|
||||||
gem 'letter_opener_web', '~> 3.0'
|
gem 'letter_opener_web', '~> 2.0'
|
||||||
|
|
||||||
# Security analysis CLI tools
|
# Security analysis CLI tools
|
||||||
gem 'brakeman', '~> 7.0', require: false
|
gem 'brakeman', '~> 6.0', require: false
|
||||||
gem 'bundler-audit', '~> 0.9', require: false
|
gem 'bundler-audit', '~> 0.9', require: false
|
||||||
|
|
||||||
# Linter CLI for HAML files
|
# Linter CLI for HAML files
|
||||||
gem 'haml_lint', require: false
|
gem 'haml_lint', require: false
|
||||||
|
|
||||||
|
# Deployment automation
|
||||||
|
gem 'capistrano', '~> 3.17'
|
||||||
|
gem 'capistrano-rails', '~> 1.6'
|
||||||
|
gem 'capistrano-rbenv', '~> 2.2'
|
||||||
|
gem 'capistrano-yarn', '~> 2.0'
|
||||||
|
|
||||||
# Validate missing i18n keys
|
# Validate missing i18n keys
|
||||||
gem 'i18n-tasks', '~> 1.0', require: false
|
gem 'i18n-tasks', '~> 1.0', require: false
|
||||||
end
|
end
|
||||||
|
|
||||||
group :development, :test do
|
group :development, :test do
|
||||||
# Interactive Debugging tools
|
|
||||||
gem 'debug', '~> 1.8', require: false
|
|
||||||
|
|
||||||
# Generate fake data values
|
|
||||||
gem 'faker', '~> 3.2'
|
|
||||||
|
|
||||||
# Generate factory objects
|
|
||||||
gem 'fabrication', '~> 2.30'
|
|
||||||
|
|
||||||
# Profiling tools
|
# Profiling tools
|
||||||
gem 'memory_profiler', require: false
|
gem 'memory_profiler', require: false
|
||||||
gem 'ruby-prof', require: false
|
gem 'ruby-prof', require: false
|
||||||
gem 'stackprof', require: false
|
gem 'stackprof', require: false
|
||||||
gem 'test-prof', require: false
|
gem 'test-prof'
|
||||||
|
|
||||||
# RSpec runner for rails
|
# RSpec runner for rails
|
||||||
gem 'rspec-rails', '~> 7.0'
|
gem 'rspec-rails', '~> 6.0'
|
||||||
end
|
end
|
||||||
|
|
||||||
group :production do
|
group :production do
|
||||||
gem 'lograge', '~> 0.12'
|
gem 'lograge', '~> 0.12'
|
||||||
end
|
end
|
||||||
|
|
||||||
gem 'cocoon', '~> 1.2'
|
|
||||||
gem 'concurrent-ruby', require: false
|
gem 'concurrent-ruby', require: false
|
||||||
gem 'connection_pool', require: false
|
gem 'connection_pool', require: false
|
||||||
gem 'xorcist', '~> 1.1'
|
gem 'xorcist', '~> 1.1'
|
||||||
|
gem 'cocoon', '~> 1.2'
|
||||||
|
|
||||||
gem 'net-http', '~> 0.6.0'
|
gem 'net-http', '~> 0.3.2'
|
||||||
gem 'rubyzip', '~> 2.3'
|
gem 'rubyzip', '~> 2.3'
|
||||||
|
|
||||||
gem 'hcaptcha', '~> 7.1'
|
gem 'hcaptcha', '~> 7.1'
|
||||||
|
|
1160
Gemfile.lock
1160
Gemfile.lock
File diff suppressed because it is too large
Load diff
2
Procfile
2
Procfile
|
@ -11,4 +11,4 @@ worker: bundle exec sidekiq
|
||||||
#
|
#
|
||||||
# and let the main app use the separate app:
|
# and let the main app use the separate app:
|
||||||
#
|
#
|
||||||
# heroku config:set STREAMING_API_BASE_URL=wss://<streaming-app-random>.herokuapp.com -a <main-app>
|
# heroku config:set STREAMING_API_BASE_URL=wss://<streaming-app>.herokuapp.com -a <main-app>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
web: env PORT=3000 RAILS_ENV=development bundle exec puma -C config/puma.rb
|
web: env PORT=3000 RAILS_ENV=development bundle exec puma -C config/puma.rb
|
||||||
sidekiq: env PORT=3000 RAILS_ENV=development bundle exec sidekiq
|
sidekiq: env PORT=3000 RAILS_ENV=development bundle exec sidekiq
|
||||||
stream: env PORT=4000 yarn workspace @mastodon/streaming start
|
stream: env PORT=4000 yarn run start
|
||||||
webpack: bin/webpack-dev-server
|
webpack: bin/webpack-dev-server
|
||||||
|
|
173
README.md
173
README.md
|
@ -1,27 +1,172 @@
|
||||||
NAS is an KMY & Mastodon Fork
|
# kmyblue
|
||||||
|
|
||||||
The following are just a few of the most common features. There are many other minor changes to the specifications.
|
[](https://github.com/kmycode/mastodon/actions/workflows/test-ruby.yml)
|
||||||
|
|
||||||
Emoji reactions
|
kmyblueは[Mastodon](https://github.com/mastodon/mastodon)のフォークです。創作作家のためのMastodonを目指して開発しました。
|
||||||
|
|
||||||
Local Public (Does not appear on the federated timeline of remote servers, but does appear on followers' home timelines. This is different from local only)
|
kmyblueはフォーク名であり、同時に[サーバー名](https://kmy.blue)でもあります。以下は特に記述がない限り、フォークとしてのkmyblueをさします。
|
||||||
|
|
||||||
Bookmark classification
|
kmyblueは AGPL ライセンスで公開されているため、どなたでも自由にフォークし、このソースコードを元に自分でサーバーを立てて公開することができます。また ActivityPub に参加することもできます。確かにサーバーkmyblueは創作作家向けのものですが、フォークとしてのkmyblueはサーバーとは別物であり、作者と政治的に対立するコミュニティ、創作活動の一部(エロ関係含む)または全体を否定するコミュニティなどにも平等にお使いいただけます。サーバーkmyblueのルールを適用する必要もなく、「Anyone But Kmyblue」なルールを設定することすら許容されます。
|
||||||
|
kmyblueは、特に未収載投稿の検索が強化されているため、ローカルタイムラインに掲載されていない投稿も検索・購読することが可能な場合があります。閉鎖的なコミュニティ、あまり目立ちたくないコミュニティには特に強力な機能を提供します。それ以外のコミュニティに対しても、kmyblueはプライバシーを考慮したうえで強力な検索・購読機能を提供するため、汎用サーバーとして利用するにも十分な機能が揃っています。
|
||||||
|
|
||||||
Set who can search your posts for each post (Searchability)
|
ただしkmyblueにおいて**テストコードは飾り**でしかありません。これはkmyblueを利用する人が本家Mastodonより圧倒的に少なく、バグやセキュリティインシデントを発見するだけの人数が足りないことを意味します。kmyblueは対策として自動テストを拡充しています。独自機能のテストを記述するだけでなく、本家のテストコードの補強も行っておりますが、確認漏れは必ず発生するものです。不具合が発生しても自己責任になります。既知のバグもいくつかありますし、直す予定のないものも含まれます。
|
||||||
|
|
||||||
Quote posts, modest quotes (references)
|
テストコード、Lint どちらも動いています。
|
||||||
|
|
||||||
Record posts that meet certain conditions such as domains, accounts, and keywords (Subscriptions/Antennas)
|
## インストール方法
|
||||||
|
|
||||||
Send posts to a designated set of followers (Circles) (different from direct messages)
|
[Wiki](https://github.com/kmycode/mastodon/wiki/Installation)を参照してください。
|
||||||
|
|
||||||
Notification of new posts on lists
|
## 開発への参加方法
|
||||||
|
|
||||||
Exclude posts from people you follow when filtering posts
|
CONTRIBUTING.mdを参照してください。
|
||||||
|
|
||||||
Hide number of followers and followings
|
## テスト
|
||||||
|
|
||||||
Automatically delete posts after a specified time has passed
|
```
|
||||||
|
# デバッグ実行(以下のいずれか)
|
||||||
|
foreman start
|
||||||
|
DB_USER=postgres DB_PASS=password foreman start
|
||||||
|
|
||||||
Expanding moderation functions
|
# 一部を除く全てのテストを行う
|
||||||
|
RAILS_ENV=test bundle exec rspec spec
|
||||||
|
|
||||||
|
# ElasticSearch連携テストを行う
|
||||||
|
RAILS_ENV=test ES_ENABLED=true RUN_SEARCH_SPECS=true bundle exec rspec spec/search
|
||||||
|
```
|
||||||
|
|
||||||
|
## kmyblueの強み
|
||||||
|
|
||||||
|
### 本家Mastodonへの積極的追従
|
||||||
|
|
||||||
|
kmyblueは、いくつかのフォークと異なり、追加機能を控えめにする代わりに本家Mastodonに積極的に追従を行います。バージョン 4 には 4 のよさがありますが、技術的に可能である限り、バージョン 5 へのアップグレードもやぶさかではありません。
|
||||||
|
kmyblueの追加機能そのままに、Mastodonの新機能も利用できるよう調整を行います。
|
||||||
|
|
||||||
|
### 絵文字リアクション対応
|
||||||
|
|
||||||
|
kmyblueは絵文字リアクションに対応しているフォークの1つです。絵文字リアクションは Misskey 標準搭載の機能で、需要が高い機能である割には、サーバーに負荷がかかるため本家Mastodonには搭載されていません。絵文字リアクションによってユーザーは「お気に入り」以上「返信」以下のコミュニケーションを気軽に行うことができ、Mastodonの利用体験が向上します。
|
||||||
|
各ユーザーが自分の投稿に絵文字リアクションをつけることを拒否できるほか、サーバー全体として絵文字リアクションを無効にする設定も可能です(この場合、他サーバーから来た絵文字リアクションはお気に入りとして保存されます)
|
||||||
|
|
||||||
|
## kmyblueのブランチ
|
||||||
|
|
||||||
|
- **main** - 管理者が本家MastodonにPRするときに使うことがあります
|
||||||
|
- **kb_development** - 現在kmyblue本体で使われているソースコードです
|
||||||
|
- **kb_lts** - LTSの管理に使います。LTSはこのブランチから公開されます
|
||||||
|
- **kb_patch** - 修正パッチの管理に使います。マイナーバージョンアップデートは通常このブランチから公開されます
|
||||||
|
- **kb_migration** - 本家Mastodonへの追従を目的としたブランチです。`kb_development`上で開発を進めているときに利用します
|
||||||
|
- **kb_migration_development** - 本家Mastodonへ追従し、かつその上で開発するときに使うブランチです。最新の本家コードでリファクタリングが行われ、`kb_development`と`kb_migration`の互換性の維持が困難になったときに利用します。ここで追加された機能は原則、本家Mastodonのバージョンアップと同時に`kb_development`に反映されます
|
||||||
|
|
||||||
|
## 本家Mastodonからの追加機能
|
||||||
|
|
||||||
|
kmyblueは、本家Mastodonにいくつかの改造を加えています。以下に示します。
|
||||||
|
|
||||||
|
### ローカル公開
|
||||||
|
|
||||||
|
未収載を拡張した公開範囲です。本来のみ収載の公開範囲に加えて、自分のサーバーのローカルタイムラインに掲載されます。他のサーバーの連合タイムラインに載せたくない、自分と属性の近い人達が集まったサーバーと自分のフォロワーにだけ見せたい投稿に用います。
|
||||||
|
|
||||||
|
### スタンプ(絵文字リアクション)
|
||||||
|
|
||||||
|
kmyblue内での呼称はスタンプですが、一般には絵文字リアクションと呼ばれる機能です。自分や他人の投稿に絵文字をつけることができます。kmyblueのスタンプは Fedibird の絵文字リアクションと互換性のある API を持っているため、Fedibird 対応アプリでkmyblueのスタンプ機能を利用できる場合があります。
|
||||||
|
|
||||||
|
kmyblueは、1つのアカウントが1つの投稿に複数のスタンプ(絵文字リアクション)を最大3個までつけることが可能です。また、下記機能にも対応しています。
|
||||||
|
|
||||||
|
- 他のサーバーのアカウントがつけたスタンプに相乗りする
|
||||||
|
- 自分がスタンプを付けた投稿一覧を見る
|
||||||
|
- トレンド投稿の選定条件にスタンプを付けたアカウントの数を考慮する
|
||||||
|
- 投稿の自動削除で削除条件にスタンプの数を指定する
|
||||||
|
|
||||||
|
kmyblueは、他のサーバーの投稿にスタンプをつけることで、相手サーバーに情報を送信します。ただしスタンプに対応していないサーバーにおいては、お気に入りとして通知されます。
|
||||||
|
|
||||||
|
### アンテナ
|
||||||
|
|
||||||
|
「自分はフォローしていないが連合タイムラインに流れているアカウント」の投稿を購読することが可能です。アンテナはドメイン、アカウント、ハッシュタグ、キーワードの4種類の絞り込み条件を持ち、複合指定することで AND 条件として働きます。アンテナによって検出された投稿は、指定されたリスト、またはホームタイムラインに追加されます。
|
||||||
|
アンテナ専用のタイムラインも存在し、ここではアンテナで拾った投稿が流れます。これはリストやホームに配置しなくても容易に確認できます。
|
||||||
|
|
||||||
|
ドメイン購読において、自分自身のドメインを指定できることも特長の1つです。また、STL(ソーシャルタイムライン)モードにも対応しています。
|
||||||
|
|
||||||
|
絞り込まれた投稿は、さらにドメイン、アカウント、ハッシュタグ、キーワードの4種類の条件を指定して除外することができます。これはOR条件として働きます。
|
||||||
|
|
||||||
|
アンテナの条件指定は複雑ですが、Webクライアントに搭載された編集画面では、事前の説明がなくても条件指定の落とし穴に気づきやすいようにしています。
|
||||||
|
|
||||||
|
自分の投稿がアンテナに検出されるのを拒否することもできます。この拒否設定は、ActivityPubで他サーバーにも共有されますが、対応するかはそれぞれの判断に委ねられます。
|
||||||
|
|
||||||
|
### サークル
|
||||||
|
|
||||||
|
自分のフォロワーの中でも特に対象を絞ってサークルという単位にまとめ、対象アカウントのみが閲覧可能な投稿を送信できます。ただしこれはMastodonサーバーとしか共有できません。(4.2.0-rc1現在、本家Mastodonではバグのため正常に受信できません)
|
||||||
|
|
||||||
|
相互フォロー限定投稿にも対応しています。
|
||||||
|
|
||||||
|
### 期間限定投稿
|
||||||
|
|
||||||
|
例えば`#exp10m`タグをつけると、その投稿は 10 分後に自動削除されます。秒、分、時、日の4種類の指定に対応、数値は4桁まで、5 分未満の時間指定も可能ですが編集が絡むと意図通り動作しないことがあります。
|
||||||
|
|
||||||
|
このハッシュタグがついた投稿を編集しても、実際に削除される時刻は編集時刻ではなく、投稿時刻から起算されます。
|
||||||
|
|
||||||
|
### グループ
|
||||||
|
|
||||||
|
kmyblueはグループ機能に対応しています。グループのフォロワーからグループアカウントへのメンションはすべてブーストされ、グループのフォロワー全員に届きます。なおこれは本家Mastodonでも今後実装予定の機能です。
|
||||||
|
|
||||||
|
### ドメインブロックの拡張
|
||||||
|
|
||||||
|
ドメインブロック機能が大幅に拡張され、「制限」「停止」としなくても、細分化された操作を個別にブロックすることができます。これによって、相手サーバーとの交流が完全に遮断されるリスクを減らします。適切に管理されておらず善良なユーザーとスパム/攻撃者が同居するようなサーバーへの対策として有効です。
|
||||||
|
|
||||||
|
- お気に入り・絵文字リアクションのみをブロック
|
||||||
|
- メンションのみをブロック
|
||||||
|
- 相手からのフォローを強制的に審査制にする
|
||||||
|
- 相手からのフォローを全てブロック
|
||||||
|
|
||||||
|
他にも、「自分のサーバーの特定投稿を相手サーバーに送信しない」設定が可能です。これはセンシティブな投稿などを政治的な理由で送信することが難しいサーバーへの対策として実装しました。
|
||||||
|
|
||||||
|
#### Misskey 対策
|
||||||
|
|
||||||
|
Misskey およびそのフォーク(Calckey など)は、**フォローしていないアカウントの未収載投稿**を自由に検索・購読することができます。これはMastodonの設計とは根本的に異なる仕様です。kmyblueでは、そのサーバーに未収載投稿を送信するときに「フォロワーのみ」に変更します。他のサーバーには未収載として送信されます。この動作は新規登録したばかりのユーザーにおいてはデフォルトではオフとなっており、ユーザー各自の設定が必要になります。
|
||||||
|
|
||||||
|
### モデレーションの拡張
|
||||||
|
|
||||||
|
管理の効率化、規約違反・法律違反コンテンツへの迅速な対応(特にアカウント停止を伴わずに済むようにすること)を目的として、モデレーション機能を拡張しています。
|
||||||
|
|
||||||
|
#### 各投稿の操作
|
||||||
|
|
||||||
|
各投稿について、強制的な CW 付与、強制的な画像 NSFW フラグ付与、編集履歴の削除、画像の削除、投稿の削除が行なえます。操作は即時反映されます。
|
||||||
|
|
||||||
|
#### アカウントの正規表現検索
|
||||||
|
|
||||||
|
アカウント名、表示名について正規表現で検索できます。ただし動作は重くなります。
|
||||||
|
|
||||||
|
#### 全画像の閲覧
|
||||||
|
|
||||||
|
「未収載」「フォロワーのみ」「指定された相手のみ」公開範囲のものも含め、すべての画像を閲覧できる画面があります。法令、サーバー規約に違反した画像を見つけるために必要です。
|
||||||
|
|
||||||
|
### AI 学習禁止メタタグ
|
||||||
|
|
||||||
|
ユーザー生成コンテンツが含まれる全てのページに、AI 学習を禁止するメタタグを挿入しています。ただし各ユーザーのプロフィールページ・投稿ページに限り、ユーザーは各自設定で AI 学習禁止メタタグを除去することが可能です。
|
||||||
|
|
||||||
|
### リンクのテキストと実際のリンク先の異なるものの強調表示
|
||||||
|
|
||||||
|
Misskey およびそのフォーク(Calckey など)では、MFM を利用することにより、例えば「https://google.co.jp/ 」に向けたリンクを「https://www.yahoo.co.jp/ 」というテキストで掲載することが容易です。それに関する基本的な詐欺を見分けることができます。ただし実際にフィッシング詐欺への効果があるかは疑問です。
|
||||||
|
|
||||||
|
### 投票項目数の拡張
|
||||||
|
|
||||||
|
投票について、本家Mastodonでは4項目までですが、kmyblueでは8個までに拡張しています。
|
||||||
|
|
||||||
|
### 連合から送られてくる投稿の添付画像最大数の拡張
|
||||||
|
|
||||||
|
本家Mastodonでは4個までですが、kmyblueでは8個までに拡張しています。ただし Web クライアントでの表示には、各自ユーザーによる設定が必要です。kmyblueローカルから投稿できる画像の枚数に変更はありません。
|
||||||
|
|
||||||
|
### 検索許可
|
||||||
|
|
||||||
|
ユーザーは各投稿に「検索許可」パラメータを付与できます。ここで「公開」が指定された投稿は、誰でも自由に検索機能を用いて検索することができます(全文検索に限る)。検索許可に対応していないクライアントアプリから投稿した時の値は、ユーザーが設定することができます。
|
||||||
|
|
||||||
|
これは Fedibird の「検索範囲」機能に対応します。API に互換性はありませんが、ActivityPub 仕様は共通しています。
|
||||||
|
|
||||||
|
なおMisskeyからの投稿は、検索許可が自動的に「全て」になります。
|
||||||
|
|
||||||
|
### トレンドの拡張
|
||||||
|
|
||||||
|
本家マストドンでは、センシティブフラグのついた全ての投稿がトレンドに掲載されません。kmyblueはその中でも、「センシティブフラグはついているが、画像が添付されておらず CW 付きでもない」投稿をトレンドに掲載します。
|
||||||
|
|
||||||
|
本来このような投稿はトレンドに掲載すべきでありませんが、本家Mastodonの Web クライアントでは文章だけの投稿のセンシティブフラグを自由に操作できないことを理由とした独自対応となります。
|
||||||
|
|
||||||
|
### Sidekiq ヘルスチェック
|
||||||
|
|
||||||
|
Sidekiq のヘルスチェックを目的として、30秒に1回ずつ指定された URL に HEAD リクエストを送信します。送信先 URL は、環境変数(または`.env.production`)に`SIDEKIQ_HEALTH_FETCH_URL`として指定します。
|
||||||
|
|
2
Rakefile
2
Rakefile
|
@ -3,6 +3,6 @@
|
||||||
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
||||||
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
||||||
|
|
||||||
require_relative 'config/application'
|
require File.expand_path('config/application', __dir__)
|
||||||
|
|
||||||
Rails.application.load_tasks
|
Rails.application.load_tasks
|
||||||
|
|
26
SECURITY.md
26
SECURITY.md
|
@ -1,20 +1,20 @@
|
||||||
# セキュリティポリシー
|
# Security Policy
|
||||||
|
|
||||||
kmyblueのプログラムにおいてセキュリティインシデントを発見した場合、kmyblueに報告してください。
|
If you believe you've identified a security vulnerability in Mastodon (a bug that allows something to happen that shouldn't be possible), you can either:
|
||||||
|
|
||||||
kmyblueにセキュリティインシデントを報告する場合、以下の手順を踏んでください。
|
- open a [Github security issue on the Mastodon project](https://github.com/mastodon/mastodon/security/advisories/new)
|
||||||
|
- reach us at <security@joinmastodon.org>
|
||||||
|
|
||||||
- [こちらのリンクから新規インシデントを起票してください](https://github.com/kmycode/mastodon/security/advisories/new)
|
You should _not_ report such issues on public GitHub issues or in other public spaces to give us time to publish a fix for the issue without exposing Mastodon's users to increased risk.
|
||||||
- メール <tt@kmycode.net>、または[@askyq@kmy.blue](https://kmy.blue/@askyq)宛に、**セキュリティインシデントを起票したことだけ**を連絡してください。セキュリティインシデントの内容は、絶対に連絡に含めないでください(リンクくらいなら含めていいかな)
|
|
||||||
|
|
||||||
他のkmyblueフォークの利用者の安全のために少しでも時間稼ぎをしなければいけないので、この問題をIssueを含む公開された場所で記述しないでください。
|
## Scope
|
||||||
|
|
||||||
## 範囲
|
A "vulnerability in Mastodon" is a vulnerability in the code distributed through our main source code repository on GitHub. Vulnerabilities that are specific to a given installation (e.g. misconfiguration) should be reported to the owner of that installation and not us.
|
||||||
|
|
||||||
こちらが対応できる範囲は、当リポジトリで公開しているソースコードのみとなります。当リポジトリの依存パッケージ内に問題がある場合は、そちらに報告してください。
|
## Supported Versions
|
||||||
|
|
||||||
もしあなたに専門知識があり、それが本家Mastodon由来の問題であると信じるに足る根拠がある場合、kmyblueではなくMastodonのほうに報告してください。kmyblueに報告されても、Mastodonより先に修正してしまうことでMastodonにセキュリティリスクを発生させる可能性がありますし、本家Mastodonの対応を待つにしてもkmyblueのほうに来てしまったセキュリティインシデントの対応に困ります(本家がなかなか対応してくれない可能性を考えると削除しづらい)。もし間違ってkmyblueに来た場合、kmyblue開発者の責任で振り分けを行います。
|
| Version | Supported |
|
||||||
|
| ------- | --------- |
|
||||||
## サポートするバージョン
|
| 4.2.x | Yes |
|
||||||
|
| 4.1.x | Yes |
|
||||||
(サポート期間)[https://github.com/kmycode/mastodon/wiki/%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E6%9C%9F%E9%96%93] を参照してください。
|
| < 4.1 | No |
|
||||||
|
|
19
Vagrantfile
vendored
19
Vagrantfile
vendored
|
@ -10,11 +10,7 @@ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
|
||||||
sudo apt-add-repository 'deb https://dl.yarnpkg.com/debian/ stable main'
|
sudo apt-add-repository 'deb https://dl.yarnpkg.com/debian/ stable main'
|
||||||
|
|
||||||
# Add repo for NodeJS
|
# Add repo for NodeJS
|
||||||
sudo mkdir -p /etc/apt/keyrings
|
curl -sL https://deb.nodesource.com/setup_16.x | sudo bash -
|
||||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
|
|
||||||
NODE_MAJOR=20
|
|
||||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
|
|
||||||
sudo apt-get update
|
|
||||||
|
|
||||||
# Add firewall rule to redirect 80 to PORT and save
|
# Add firewall rule to redirect 80 to PORT and save
|
||||||
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port #{ENV["PORT"]}
|
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port #{ENV["PORT"]}
|
||||||
|
@ -116,7 +112,7 @@ bundle install
|
||||||
|
|
||||||
# Install node modules
|
# Install node modules
|
||||||
sudo corepack enable
|
sudo corepack enable
|
||||||
corepack prepare
|
yarn set version classic
|
||||||
yarn install
|
yarn install
|
||||||
|
|
||||||
# Build Mastodon
|
# Build Mastodon
|
||||||
|
@ -151,12 +147,6 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
||||||
vb.customize ["modifyvm", :id, "--nictype2", "virtio"]
|
vb.customize ["modifyvm", :id, "--nictype2", "virtio"]
|
||||||
end
|
end
|
||||||
|
|
||||||
config.vm.provider :libvirt do |libvirt|
|
|
||||||
libvirt.cpus = 3
|
|
||||||
libvirt.memory = 8192
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
# This uses the vagrant-hostsupdater plugin, and lets you
|
# This uses the vagrant-hostsupdater plugin, and lets you
|
||||||
# access the development site at http://mastodon.local.
|
# access the development site at http://mastodon.local.
|
||||||
# If you change it, also change it in .env.vagrant before provisioning
|
# If you change it, also change it in .env.vagrant before provisioning
|
||||||
|
@ -174,12 +164,11 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
||||||
if config.vm.networks.any? { |type, options| type == :private_network }
|
if config.vm.networks.any? { |type, options| type == :private_network }
|
||||||
config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ['rw', 'actimeo=1']
|
config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ['rw', 'actimeo=1']
|
||||||
else
|
else
|
||||||
config.vm.synced_folder ".", "/vagrant", type: "rsync", create: true, rsync__args: ["--verbose", "--archive", "--delete", "-z"]
|
config.vm.synced_folder ".", "/vagrant"
|
||||||
end
|
end
|
||||||
|
|
||||||
# Otherwise, you can access the site at http://localhost:3000 and http://localhost:4000 , http://localhost:8080
|
# Otherwise, you can access the site at http://localhost:3000 and http://localhost:4000 , http://localhost:8080
|
||||||
config.vm.network :forwarded_port, guest: 3000, host: 3000
|
config.vm.network :forwarded_port, guest: 3000, host: 3000
|
||||||
config.vm.network :forwarded_port, guest: 3035, host: 3035
|
|
||||||
config.vm.network :forwarded_port, guest: 4000, host: 4000
|
config.vm.network :forwarded_port, guest: 4000, host: 4000
|
||||||
config.vm.network :forwarded_port, guest: 8080, host: 8080
|
config.vm.network :forwarded_port, guest: 8080, host: 8080
|
||||||
config.vm.network :forwarded_port, guest: 9200, host: 9200
|
config.vm.network :forwarded_port, guest: 9200, host: 9200
|
||||||
|
@ -195,7 +184,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
||||||
|
|
||||||
config.vm.post_up_message = <<MESSAGE
|
config.vm.post_up_message = <<MESSAGE
|
||||||
To start server
|
To start server
|
||||||
$ vagrant ssh -c "cd /vagrant && bin/dev"
|
$ vagrant ssh -c "cd /vagrant && foreman start"
|
||||||
MESSAGE
|
MESSAGE
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
9
app.json
9
app.json
|
@ -90,15 +90,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"buildpacks": [
|
"buildpacks": [
|
||||||
{
|
|
||||||
"url": "https://github.com/heroku/heroku-buildpack-activestorage-preview"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"url": "https://github.com/heroku/heroku-buildpack-apt"
|
"url": "https://github.com/heroku/heroku-buildpack-apt"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"url": "heroku/nodejs"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"url": "heroku/ruby"
|
"url": "heroku/ruby"
|
||||||
}
|
}
|
||||||
|
@ -106,6 +100,5 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"postdeploy": "bundle exec rails db:migrate && bundle exec rails db:seed"
|
"postdeploy": "bundle exec rails db:migrate && bundle exec rails db:seed"
|
||||||
},
|
},
|
||||||
"addons": ["heroku-postgresql", "heroku-redis"],
|
"addons": ["heroku-postgresql", "heroku-redis"]
|
||||||
"stack": "heroku-24"
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,9 +3,150 @@
|
||||||
class AccountsIndex < Chewy::Index
|
class AccountsIndex < Chewy::Index
|
||||||
include DatetimeClampingConcern
|
include DatetimeClampingConcern
|
||||||
|
|
||||||
# ElasticSearch config is moved to "/config/elasticsearch.default.yml".
|
DEVELOPMENT_SETTINGS = {
|
||||||
# Edit it when original Mastodon changed ElasticSearch config.
|
filter: {
|
||||||
settings index: index_preset(refresh_interval: '30s'), analysis: ChewyConfig.instance.accounts
|
english_stop: {
|
||||||
|
type: 'stop',
|
||||||
|
stopwords: '_english_',
|
||||||
|
},
|
||||||
|
|
||||||
|
english_stemmer: {
|
||||||
|
type: 'stemmer',
|
||||||
|
language: 'english',
|
||||||
|
},
|
||||||
|
|
||||||
|
english_possessive_stemmer: {
|
||||||
|
type: 'stemmer',
|
||||||
|
language: 'possessive_english',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
analyzer: {
|
||||||
|
natural: {
|
||||||
|
tokenizer: 'standard',
|
||||||
|
filter: %w(
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
elision
|
||||||
|
english_possessive_stemmer
|
||||||
|
english_stop
|
||||||
|
english_stemmer
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
sudachi_analyzer: {
|
||||||
|
tokenizer: 'standard',
|
||||||
|
filter: %w(
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
elision
|
||||||
|
english_possessive_stemmer
|
||||||
|
english_stop
|
||||||
|
english_stemmer
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
verbatim: {
|
||||||
|
tokenizer: 'standard',
|
||||||
|
filter: %w(lowercase asciifolding cjk_width),
|
||||||
|
},
|
||||||
|
|
||||||
|
edge_ngram: {
|
||||||
|
tokenizer: 'edge_ngram',
|
||||||
|
filter: %w(lowercase asciifolding cjk_width),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
tokenizer: {
|
||||||
|
edge_ngram: {
|
||||||
|
type: 'edge_ngram',
|
||||||
|
min_gram: 1,
|
||||||
|
max_gram: 15,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}.freeze
|
||||||
|
|
||||||
|
PRODUCTION_SETTINGS = {
|
||||||
|
filter: {
|
||||||
|
english_stop: {
|
||||||
|
type: 'stop',
|
||||||
|
stopwords: '_english_',
|
||||||
|
},
|
||||||
|
|
||||||
|
english_stemmer: {
|
||||||
|
type: 'stemmer',
|
||||||
|
language: 'english',
|
||||||
|
},
|
||||||
|
|
||||||
|
english_possessive_stemmer: {
|
||||||
|
type: 'stemmer',
|
||||||
|
language: 'possessive_english',
|
||||||
|
},
|
||||||
|
|
||||||
|
my_posfilter: {
|
||||||
|
type: 'sudachi_part_of_speech',
|
||||||
|
stoptags: [
|
||||||
|
'助詞',
|
||||||
|
'助動詞',
|
||||||
|
'補助記号,句点',
|
||||||
|
'補助記号,読点',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
analyzer: {
|
||||||
|
natural: {
|
||||||
|
tokenizer: 'standard',
|
||||||
|
filter: %w(
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
elision
|
||||||
|
english_possessive_stemmer
|
||||||
|
english_stop
|
||||||
|
english_stemmer
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
sudachi_analyzer: {
|
||||||
|
filter: %w(
|
||||||
|
my_posfilter
|
||||||
|
sudachi_normalizedform
|
||||||
|
),
|
||||||
|
type: 'custom',
|
||||||
|
tokenizer: 'sudachi_tokenizer',
|
||||||
|
},
|
||||||
|
|
||||||
|
verbatim: {
|
||||||
|
tokenizer: 'standard',
|
||||||
|
filter: %w(lowercase asciifolding cjk_width),
|
||||||
|
},
|
||||||
|
|
||||||
|
edge_ngram: {
|
||||||
|
tokenizer: 'edge_ngram',
|
||||||
|
filter: %w(lowercase asciifolding cjk_width),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
tokenizer: {
|
||||||
|
edge_ngram: {
|
||||||
|
type: 'edge_ngram',
|
||||||
|
min_gram: 1,
|
||||||
|
max_gram: 15,
|
||||||
|
},
|
||||||
|
|
||||||
|
sudachi_tokenizer: {
|
||||||
|
resources_path: '/etc/elasticsearch/sudachi',
|
||||||
|
split_mode: 'A',
|
||||||
|
type: 'sudachi_tokenizer',
|
||||||
|
discard_punctuation: 'true',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}.freeze
|
||||||
|
|
||||||
|
settings index: index_preset(refresh_interval: '30s'), analysis: Rails.env.test? ? DEVELOPMENT_SETTINGS : PRODUCTION_SETTINGS
|
||||||
|
|
||||||
index_scope ::Account.searchable.includes(:account_stat)
|
index_scope ::Account.searchable.includes(:account_stat)
|
||||||
|
|
||||||
|
@ -16,15 +157,8 @@ class AccountsIndex < Chewy::Index
|
||||||
field(:properties, type: 'keyword', value: ->(account) { account.searchable_properties })
|
field(:properties, type: 'keyword', value: ->(account) { account.searchable_properties })
|
||||||
field(:last_status_at, type: 'date', value: ->(account) { clamp_date(account.last_status_at || account.created_at) })
|
field(:last_status_at, type: 'date', value: ->(account) { clamp_date(account.last_status_at || account.created_at) })
|
||||||
field(:domain, type: 'keyword', value: ->(account) { account.domain || '' })
|
field(:domain, type: 'keyword', value: ->(account) { account.domain || '' })
|
||||||
field(:display_name, type: 'text', analyzer: ChewyConfig.instance.accounts_analyzers.dig('display_name', 'analyzer')) do
|
field(:display_name, type: 'text', analyzer: 'verbatim') { field :edge_ngram, type: 'text', analyzer: 'edge_ngram', search_analyzer: 'verbatim' }
|
||||||
field :edge_ngram, type: 'text', analyzer: ChewyConfig.instance.accounts_analyzers.dig('display_name', 'edge_ngram', 'analyzer'), search_analyzer: ChewyConfig.instance.accounts_analyzers.dig('display_name', 'edge_ngram', 'search_analyzer')
|
field(:username, type: 'text', analyzer: 'verbatim', value: ->(account) { [account.username, account.domain].compact.join('@') }) { field :edge_ngram, type: 'text', analyzer: 'edge_ngram', search_analyzer: 'verbatim' }
|
||||||
end
|
field(:text, type: 'text', analyzer: 'sudachi_analyzer', value: ->(account) { account.searchable_text })
|
||||||
field(:username, type: 'text', analyzer: ChewyConfig.instance.accounts_analyzers.dig('username', 'analyzer'), value: lambda { |account|
|
|
||||||
[account.username, account.domain].compact.join('@')
|
|
||||||
}) do
|
|
||||||
field :edge_ngram, type: 'text', analyzer: ChewyConfig.instance.accounts_analyzers.dig('username', 'edge_ngram', 'analyzer'),
|
|
||||||
search_analyzer: ChewyConfig.instance.accounts_analyzers.dig('username', 'edge_ngram', 'search_analyzer')
|
|
||||||
end
|
|
||||||
field(:text, type: 'text', analyzer: ChewyConfig.instance.accounts_analyzers.dig('text', 'analyzer'), value: ->(account) { account.searchable_text }) { field(:stemmed, type: 'text', analyzer: ChewyConfig.instance.accounts_analyzers.dig('text', 'stemmed', 'analyzer')) }
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,20 +3,156 @@
|
||||||
class PublicStatusesIndex < Chewy::Index
|
class PublicStatusesIndex < Chewy::Index
|
||||||
include DatetimeClampingConcern
|
include DatetimeClampingConcern
|
||||||
|
|
||||||
# ElasticSearch config is moved to "/config/elasticsearch.default.yml".
|
DEVELOPMENT_SETTINGS = {
|
||||||
# Edit it when original Mastodon changed ElasticSearch config.
|
filter: {
|
||||||
settings index: index_preset(refresh_interval: '30s', number_of_shards: 5), analysis: ChewyConfig.instance.public_statuses
|
english_stop: {
|
||||||
|
type: 'stop',
|
||||||
|
stopwords: '_english_',
|
||||||
|
},
|
||||||
|
|
||||||
|
english_stemmer: {
|
||||||
|
type: 'stemmer',
|
||||||
|
language: 'english',
|
||||||
|
},
|
||||||
|
|
||||||
|
english_possessive_stemmer: {
|
||||||
|
type: 'stemmer',
|
||||||
|
language: 'possessive_english',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
analyzer: {
|
||||||
|
verbatim: {
|
||||||
|
tokenizer: 'uax_url_email',
|
||||||
|
filter: %w(lowercase),
|
||||||
|
},
|
||||||
|
|
||||||
|
content: {
|
||||||
|
tokenizer: 'standard',
|
||||||
|
filter: %w(
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
elision
|
||||||
|
english_possessive_stemmer
|
||||||
|
english_stop
|
||||||
|
english_stemmer
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
sudachi_analyzer: {
|
||||||
|
tokenizer: 'standard',
|
||||||
|
filter: %w(
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
elision
|
||||||
|
english_possessive_stemmer
|
||||||
|
english_stop
|
||||||
|
english_stemmer
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
hashtag: {
|
||||||
|
tokenizer: 'keyword',
|
||||||
|
filter: %w(
|
||||||
|
word_delimiter_graph
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}.freeze
|
||||||
|
|
||||||
|
PRODUCTION_SETTINGS = {
|
||||||
|
filter: {
|
||||||
|
english_stop: {
|
||||||
|
type: 'stop',
|
||||||
|
stopwords: '_english_',
|
||||||
|
},
|
||||||
|
|
||||||
|
english_stemmer: {
|
||||||
|
type: 'stemmer',
|
||||||
|
language: 'english',
|
||||||
|
},
|
||||||
|
|
||||||
|
english_possessive_stemmer: {
|
||||||
|
type: 'stemmer',
|
||||||
|
language: 'possessive_english',
|
||||||
|
},
|
||||||
|
|
||||||
|
my_posfilter: {
|
||||||
|
type: 'sudachi_part_of_speech',
|
||||||
|
stoptags: [
|
||||||
|
'助詞',
|
||||||
|
'助動詞',
|
||||||
|
'補助記号,句点',
|
||||||
|
'補助記号,読点',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
analyzer: {
|
||||||
|
content: {
|
||||||
|
tokenizer: 'uax_url_email',
|
||||||
|
filter: %w(
|
||||||
|
english_possessive_stemmer
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
english_stop
|
||||||
|
english_stemmer
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
hashtag: {
|
||||||
|
tokenizer: 'keyword',
|
||||||
|
filter: %w(
|
||||||
|
word_delimiter_graph
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
sudachi_analyzer: {
|
||||||
|
tokenizer: 'sudachi_tokenizer',
|
||||||
|
type: 'custom',
|
||||||
|
filter: %w(
|
||||||
|
english_possessive_stemmer
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
english_stop
|
||||||
|
english_stemmer
|
||||||
|
my_posfilter
|
||||||
|
sudachi_normalizedform
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
tokenizer: {
|
||||||
|
sudachi_tokenizer: {
|
||||||
|
resources_path: '/etc/elasticsearch/sudachi',
|
||||||
|
split_mode: 'A',
|
||||||
|
type: 'sudachi_tokenizer',
|
||||||
|
discard_punctuation: 'true',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}.freeze
|
||||||
|
|
||||||
|
settings index: index_preset(refresh_interval: '30s', number_of_shards: 5), analysis: Rails.env.test? ? DEVELOPMENT_SETTINGS : PRODUCTION_SETTINGS
|
||||||
|
|
||||||
index_scope ::Status.unscoped
|
index_scope ::Status.unscoped
|
||||||
.kept
|
.kept
|
||||||
.indexable
|
.indexable
|
||||||
.includes(:media_attachments, :preloadable_poll, :tags, :account, preview_cards_status: :preview_card)
|
.includes(:media_attachments, :preloadable_poll, :preview_cards, :tags, :account)
|
||||||
|
|
||||||
root date_detection: false do
|
root date_detection: false do
|
||||||
field(:id, type: 'long')
|
field(:id, type: 'long')
|
||||||
field(:account_id, type: 'long')
|
field(:account_id, type: 'long')
|
||||||
field(:text, type: 'text', analyzer: ChewyConfig.instance.public_statuses_analyzers.dig('text', 'analyzer'), value: ->(status) { status.searchable_text }) { field(:stemmed, type: 'text', analyzer: ChewyConfig.instance.public_statuses_analyzers.dig('text', 'stemmed', 'analyzer')) }
|
field(:text, type: 'text', analyzer: 'sudachi_analyzer', value: ->(status) { status.searchable_text })
|
||||||
field(:tags, type: 'text', analyzer: ChewyConfig.instance.public_statuses_analyzers.dig('tags', 'analyzer'), value: ->(status) { status.tags.map(&:display_name) })
|
field(:tags, type: 'text', analyzer: 'hashtag', value: ->(status) { status.tags.map(&:display_name) })
|
||||||
field(:language, type: 'keyword')
|
field(:language, type: 'keyword')
|
||||||
field(:domain, type: 'keyword', value: ->(status) { status.account.domain || '' })
|
field(:domain, type: 'keyword', value: ->(status) { status.account.domain || '' })
|
||||||
field(:properties, type: 'keyword', value: ->(status) { status.searchable_properties })
|
field(:properties, type: 'keyword', value: ->(status) { status.searchable_properties })
|
||||||
|
|
|
@ -3,13 +3,153 @@
|
||||||
class StatusesIndex < Chewy::Index
|
class StatusesIndex < Chewy::Index
|
||||||
include DatetimeClampingConcern
|
include DatetimeClampingConcern
|
||||||
|
|
||||||
# ElasticSearch config is moved to "/config/elasticsearch.default.yml".
|
DEVELOPMENT_SETTINGS = {
|
||||||
# Edit it when original Mastodon changed ElasticSearch config.
|
filter: {
|
||||||
settings index: index_preset(refresh_interval: '30s', number_of_shards: 5), analysis: ChewyConfig.instance.statuses
|
english_stop: {
|
||||||
|
type: 'stop',
|
||||||
|
stopwords: '_english_',
|
||||||
|
},
|
||||||
|
|
||||||
|
english_stemmer: {
|
||||||
|
type: 'stemmer',
|
||||||
|
language: 'english',
|
||||||
|
},
|
||||||
|
|
||||||
|
english_possessive_stemmer: {
|
||||||
|
type: 'stemmer',
|
||||||
|
language: 'possessive_english',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
analyzer: {
|
||||||
|
verbatim: {
|
||||||
|
tokenizer: 'uax_url_email',
|
||||||
|
filter: %w(lowercase),
|
||||||
|
},
|
||||||
|
|
||||||
|
content: {
|
||||||
|
tokenizer: 'standard',
|
||||||
|
filter: %w(
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
elision
|
||||||
|
english_possessive_stemmer
|
||||||
|
english_stop
|
||||||
|
english_stemmer
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
sudachi_analyzer: {
|
||||||
|
tokenizer: 'standard',
|
||||||
|
filter: %w(
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
elision
|
||||||
|
english_possessive_stemmer
|
||||||
|
english_stop
|
||||||
|
english_stemmer
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
hashtag: {
|
||||||
|
tokenizer: 'keyword',
|
||||||
|
filter: %w(
|
||||||
|
word_delimiter_graph
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}.freeze
|
||||||
|
|
||||||
|
PRODUCTION_SETTINGS = {
|
||||||
|
filter: {
|
||||||
|
english_stop: {
|
||||||
|
type: 'stop',
|
||||||
|
stopwords: '_english_',
|
||||||
|
},
|
||||||
|
|
||||||
|
english_stemmer: {
|
||||||
|
type: 'stemmer',
|
||||||
|
language: 'english',
|
||||||
|
},
|
||||||
|
|
||||||
|
english_possessive_stemmer: {
|
||||||
|
type: 'stemmer',
|
||||||
|
language: 'possessive_english',
|
||||||
|
},
|
||||||
|
|
||||||
|
my_posfilter: {
|
||||||
|
type: 'sudachi_part_of_speech',
|
||||||
|
stoptags: [
|
||||||
|
'助詞',
|
||||||
|
'助動詞',
|
||||||
|
'補助記号,句点',
|
||||||
|
'補助記号,読点',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
analyzer: {
|
||||||
|
verbatim: {
|
||||||
|
tokenizer: 'uax_url_email',
|
||||||
|
filter: %w(lowercase),
|
||||||
|
},
|
||||||
|
|
||||||
|
content: {
|
||||||
|
tokenizer: 'uax_url_email',
|
||||||
|
filter: %w(
|
||||||
|
english_possessive_stemmer
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
english_stop
|
||||||
|
english_stemmer
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
hashtag: {
|
||||||
|
tokenizer: 'keyword',
|
||||||
|
filter: %w(
|
||||||
|
word_delimiter_graph
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
sudachi_analyzer: {
|
||||||
|
tokenizer: 'sudachi_tokenizer',
|
||||||
|
type: 'custom',
|
||||||
|
filter: %w(
|
||||||
|
english_possessive_stemmer
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
english_stop
|
||||||
|
english_stemmer
|
||||||
|
my_posfilter
|
||||||
|
sudachi_normalizedform
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
tokenizer: {
|
||||||
|
sudachi_tokenizer: {
|
||||||
|
resources_path: '/etc/elasticsearch/sudachi',
|
||||||
|
split_mode: 'A',
|
||||||
|
type: 'sudachi_tokenizer',
|
||||||
|
discard_punctuation: 'true',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}.freeze
|
||||||
|
|
||||||
|
settings index: index_preset(refresh_interval: '30s', number_of_shards: 5), analysis: Rails.env.test? ? DEVELOPMENT_SETTINGS : PRODUCTION_SETTINGS
|
||||||
|
|
||||||
index_scope ::Status.unscoped.kept.without_reblogs.includes(
|
index_scope ::Status.unscoped.kept.without_reblogs.includes(
|
||||||
:account,
|
:account,
|
||||||
:media_attachments,
|
:media_attachments,
|
||||||
|
:preview_cards,
|
||||||
:local_mentioned,
|
:local_mentioned,
|
||||||
:local_favorited,
|
:local_favorited,
|
||||||
:local_reblogged,
|
:local_reblogged,
|
||||||
|
@ -17,7 +157,6 @@ class StatusesIndex < Chewy::Index
|
||||||
:local_emoji_reacted,
|
:local_emoji_reacted,
|
||||||
:tags,
|
:tags,
|
||||||
:local_referenced,
|
:local_referenced,
|
||||||
preview_cards_status: :preview_card,
|
|
||||||
preloadable_poll: :local_voters
|
preloadable_poll: :local_voters
|
||||||
),
|
),
|
||||||
delete_if: lambda { |status|
|
delete_if: lambda { |status|
|
||||||
|
@ -31,8 +170,8 @@ class StatusesIndex < Chewy::Index
|
||||||
root date_detection: false do
|
root date_detection: false do
|
||||||
field(:id, type: 'long')
|
field(:id, type: 'long')
|
||||||
field(:account_id, type: 'long')
|
field(:account_id, type: 'long')
|
||||||
field(:text, type: 'text', analyzer: ChewyConfig.instance.statuses_analyzers.dig('text', 'analyzer'), value: ->(status) { status.searchable_text }) { field(:stemmed, type: 'text', analyzer: ChewyConfig.instance.statuses_analyzers.dig('text', 'stemmed', 'analyzer')) }
|
field(:text, type: 'text', analyzer: 'sudachi_analyzer', value: ->(status) { status.searchable_text })
|
||||||
field(:tags, type: 'text', analyzer: ChewyConfig.instance.statuses_analyzers.dig('tags', 'analyzer'), value: ->(status) { status.tags.map(&:display_name) })
|
field(:tags, type: 'text', analyzer: 'hashtag', value: ->(status) { status.tags.map(&:display_name) })
|
||||||
field(:searchable_by, type: 'long', value: ->(status) { status.searchable_by })
|
field(:searchable_by, type: 'long', value: ->(status) { status.searchable_by })
|
||||||
field(:mentioned_by, type: 'long', value: ->(status) { status.mentioned_by })
|
field(:mentioned_by, type: 'long', value: ->(status) { status.mentioned_by })
|
||||||
field(:favourited_by, type: 'long', value: ->(status) { status.favourited_by })
|
field(:favourited_by, type: 'long', value: ->(status) { status.favourited_by })
|
||||||
|
|
|
@ -3,9 +3,36 @@
|
||||||
class TagsIndex < Chewy::Index
|
class TagsIndex < Chewy::Index
|
||||||
include DatetimeClampingConcern
|
include DatetimeClampingConcern
|
||||||
|
|
||||||
# ElasticSearch config is moved to "/config/elasticsearch.default.yml".
|
settings index: index_preset(refresh_interval: '30s'), analysis: {
|
||||||
# Edit it when original Mastodon changed ElasticSearch config.
|
analyzer: {
|
||||||
settings index: index_preset(refresh_interval: '30s'), analysis: ChewyConfig.instance.tags
|
content: {
|
||||||
|
tokenizer: 'keyword',
|
||||||
|
filter: %w(
|
||||||
|
word_delimiter_graph
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
edge_ngram: {
|
||||||
|
tokenizer: 'edge_ngram',
|
||||||
|
filter: %w(
|
||||||
|
lowercase
|
||||||
|
asciifolding
|
||||||
|
cjk_width
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
tokenizer: {
|
||||||
|
edge_ngram: {
|
||||||
|
type: 'edge_ngram',
|
||||||
|
min_gram: 2,
|
||||||
|
max_gram: 15,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
index_scope ::Tag.listable
|
index_scope ::Tag.listable
|
||||||
|
|
||||||
|
@ -14,9 +41,7 @@ class TagsIndex < Chewy::Index
|
||||||
end
|
end
|
||||||
|
|
||||||
root date_detection: false do
|
root date_detection: false do
|
||||||
field(:name, type: 'text', analyzer: ChewyConfig.instance.tags_analyzers.dig('name', 'analyzer'), value: :display_name) do
|
field(:name, type: 'text', analyzer: 'content', value: :display_name) { field(:edge_ngram, type: 'text', analyzer: 'edge_ngram', search_analyzer: 'content') }
|
||||||
field(:edge_ngram, type: 'text', analyzer: ChewyConfig.instance.tags_analyzers.dig('name', 'edge_ngram', 'analyzer'), search_analyzer: ChewyConfig.instance.tags_analyzers.dig('name', 'edge_ngram', 'search_analyzer'))
|
|
||||||
end
|
|
||||||
field(:reviewed, type: 'boolean', value: ->(tag) { tag.reviewed? })
|
field(:reviewed, type: 'boolean', value: ->(tag) { tag.reviewed? })
|
||||||
field(:usage, type: 'long', value: ->(tag, crutches) { tag.history.aggregate(crutches.time_period).accounts })
|
field(:usage, type: 'long', value: ->(tag, crutches) { tag.history.aggregate(crutches.time_period).accounts })
|
||||||
field(:last_status_at, type: 'date', value: ->(tag) { clamp_date(tag.last_status_at || tag.created_at) })
|
field(:last_status_at, type: 'date', value: ->(tag) { clamp_date(tag.last_status_at || tag.created_at) })
|
||||||
|
|
|
@ -5,7 +5,15 @@ class AboutController < ApplicationController
|
||||||
|
|
||||||
skip_before_action :require_functional!
|
skip_before_action :require_functional!
|
||||||
|
|
||||||
|
before_action :set_instance_presenter
|
||||||
|
|
||||||
def show
|
def show
|
||||||
expires_in(15.seconds, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.day) unless user_signed_in?
|
expires_in(15.seconds, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.day) unless user_signed_in?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_instance_presenter
|
||||||
|
@instance_presenter = InstancePresenter.new
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -18,6 +18,8 @@ class AccountsController < ApplicationController
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html do
|
format.html do
|
||||||
expires_in(15.seconds, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.hour) unless user_signed_in?
|
expires_in(15.seconds, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.hour) unless user_signed_in?
|
||||||
|
|
||||||
|
@rss_url = rss_url
|
||||||
end
|
end
|
||||||
|
|
||||||
format.rss do
|
format.rss do
|
||||||
|
@ -25,7 +27,7 @@ class AccountsController < ApplicationController
|
||||||
|
|
||||||
limit = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE
|
limit = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE
|
||||||
@statuses = filtered_statuses.without_reblogs.limit(limit)
|
@statuses = filtered_statuses.without_reblogs.limit(limit)
|
||||||
@statuses = preload_collection(@statuses, Status)
|
@statuses = cache_collection(@statuses, Status)
|
||||||
end
|
end
|
||||||
|
|
||||||
format.json do
|
format.json do
|
||||||
|
@ -46,15 +48,13 @@ class AccountsController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def default_statuses
|
def default_statuses
|
||||||
if current_account.present?
|
visibilities = [:public, :unlisted, :public_unlisted]
|
||||||
@account.statuses.distributable_visibility
|
visibilities << :login unless current_account.nil?
|
||||||
else
|
@account.statuses.where(visibility: visibilities)
|
||||||
@account.statuses.distributable_visibility_for_anonymous
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def only_media_scope
|
def only_media_scope
|
||||||
Status.joins(:media_attachments).merge(@account.media_attachments).group(:id)
|
Status.joins(:media_attachments).merge(@account.media_attachments.reorder(nil)).group(:id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def no_replies_scope
|
def no_replies_scope
|
||||||
|
@ -86,21 +86,29 @@ class AccountsController < ApplicationController
|
||||||
short_account_url(@account, format: 'rss')
|
short_account_url(@account, format: 'rss')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
helper_method :rss_url
|
|
||||||
|
|
||||||
def media_requested?
|
def media_requested?
|
||||||
path_without_format.end_with?('/media') && !tag_requested?
|
request.path.split('.').first.end_with?('/media') && !tag_requested?
|
||||||
end
|
end
|
||||||
|
|
||||||
def replies_requested?
|
def replies_requested?
|
||||||
path_without_format.end_with?('/with_replies') && !tag_requested?
|
request.path.split('.').first.end_with?('/with_replies') && !tag_requested?
|
||||||
end
|
end
|
||||||
|
|
||||||
def tag_requested?
|
def tag_requested?
|
||||||
path_without_format.end_with?(Addressable::URI.parse("/tagged/#{params[:tag]}").normalize)
|
request.path.split('.').first.end_with?(Addressable::URI.parse("/tagged/#{params[:tag]}").normalize)
|
||||||
end
|
end
|
||||||
|
|
||||||
def path_without_format
|
def cached_filtered_status_page
|
||||||
request.path.split('.').first
|
cache_collection_paginated_by_id(
|
||||||
|
filtered_statuses,
|
||||||
|
Status,
|
||||||
|
PAGE_SIZE,
|
||||||
|
params_slice(:max_id, :min_id, :since_id)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def params_slice(*keys)
|
||||||
|
params.slice(*keys).permit(*keys)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue