"
colors:
title: "Кольори"
long_title: "Схеми Кольорів"
@@ -1328,6 +1341,7 @@ uk:
delete_confirm: "Видалити цю кольорову схему?"
undo: "скасувати"
undo_title: "Скасувати ваші зміни цього кольору з часу останнього збереження."
+ revert: "Повернути"
primary:
name: 'основний'
secondary:
@@ -1345,6 +1359,7 @@ uk:
success:
name: 'успіх'
love:
+ name: 'любов'
description: "Колір кнопки \"Подобається\"."
email:
title: "Листів"
@@ -1415,6 +1430,8 @@ uk:
block: "block"
do_nothing: "do nothing"
staff_actions:
+ all: "всі"
+ filter: "Filter:"
title: "Дії персоналу"
clear_filters: "Показати все"
staff_user: "Член персоналу"
@@ -1453,6 +1470,8 @@ uk:
revoke_admin: "відкликати адміністраторство"
grant_moderation: "зробити модератором"
revoke_moderation: "відкликати модераторство"
+ deleted_tag: "видалити тег"
+ lock_trust_level: "заблокувати рівень довіри"
screened_emails:
title: "Screened Emails"
description: "Коли хтось намагатиметься створити новий обліковий запис, наступні електронні скриньки буде перевірено, і реєстрацію заблоковано, або вжито якихось інших дій."
@@ -1609,6 +1628,7 @@ uk:
confirm: 'Підтвердження'
site_text:
edit: 'редагувати'
+ revert: "Повернути зміни"
go_back: "Повернутись до пошуку"
show_overriden: 'Показувати тільки перевизначені'
site_settings:
@@ -1639,9 +1659,14 @@ uk:
uncategorized: 'Інше'
backups: "Backups"
login: "Вхід"
+ plugins: "Плагіни"
user_preferences: "Налаштування"
+ tags: "Теги"
search: "Пошук"
+ groups: "Групи"
badges:
+ title: Значки
+ new_badge: Новий значок
new: Новий
name: Ім'я
badge: Значок
diff --git a/config/locales/client.ur.yml b/config/locales/client.ur.yml
index 877e03260c0..324705cd3b8 100644
--- a/config/locales/client.ur.yml
+++ b/config/locales/client.ur.yml
@@ -132,19 +132,19 @@ ur:
bootstrap_mode_disabled: "بوٹسٹریپ کا موڈ اگلے 24 گھنٹوں میں غیر فعال کر دیا جائے گا۔"
s3:
regions:
- us_east_1: "امریکی مشرق (شمالی ورجینیا)"
- us_west_1: "امریکی مغرب (شمالی کیلی فورنیا)"
- us_west_2: "امریکی مغرب (اوریگن)"
- us_gov_west_1: "اے ڈبلیو ایس گَو کلاوڈ (امریکہ)"
- eu_west_1: "یورپی یونین (آئر لینڈ)"
- eu_central_1: "یورپی یونین (فرینکفرٹ)"
- ap_southeast_1: "ایشیا پیسفک (سنگاپور)"
- ap_southeast_2: "ایشیا پیسفک (سڈنی)"
- ap_south_1: "ایشیا پیسفک (ممبئی)"
ap_northeast_1: "ایشیا پیسفک (ٹوکیو)"
ap_northeast_2: "ایشیا پیسفک (سیول)"
- sa_east_1: "ایشیا پیسفک (ساؤ پالو)"
+ ap_south_1: "ایشیا پیسفک (ممبئی)"
+ ap_southeast_1: "ایشیا پیسفک (سنگاپور)"
+ ap_southeast_2: "ایشیا پیسفک (سڈنی)"
cn_north_1: "چین (بیجنگ)"
+ eu_central_1: "یورپی یونین (فرینکفرٹ)"
+ eu_west_1: "یورپی یونین (آئر لینڈ)"
+ sa_east_1: "ایشیا پیسفک (ساؤ پالو)"
+ us_east_1: "امریکی مشرق (شمالی ورجینیا)"
+ us_gov_west_1: "اے ڈبلیو ایس گَو کلاوڈ (امریکہ)"
+ us_west_1: "امریکی مغرب (شمالی کیلی فورنیا)"
+ us_west_2: "امریکی مغرب (اوریگن)"
edit: 'اس ٹاپک کے عنوان اور زمرے میں ترمیم کریں'
not_implemented: "یہ خصوصیت ابھی تک لاگو نہیں کی گئی، معضرت!"
no_value: "نہیں "
diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml
index 52935a2e794..61e69c2510e 100644
--- a/config/locales/client.vi.yml
+++ b/config/locales/client.vi.yml
@@ -130,20 +130,20 @@ vi:
default_description: "Mặc định"
s3:
regions:
- us_east_1: "US East (N. Virginia)"
- us_west_1: "US West (N. California)"
- us_west_2: "US West (Oregon)"
- us_gov_west_1: "AWS GovCloud (US)"
- eu_west_1: "EU (Ireland)"
- eu_west_2: "EU (London)"
- eu_central_1: "EU (Frankfurt)"
- ap_southeast_1: "Asia Pacific (Singapore)"
- ap_southeast_2: "Asia Pacific (Sydney)"
- ap_south_1: "Châu Á Thái Bình Dương (Mumbai)"
ap_northeast_1: "Asia Pacific (Tokyo)"
ap_northeast_2: "Asia Pacific (Seoul)"
- sa_east_1: "South America (Sao Paulo)"
+ ap_south_1: "Châu Á Thái Bình Dương (Mumbai)"
+ ap_southeast_1: "Asia Pacific (Singapore)"
+ ap_southeast_2: "Asia Pacific (Sydney)"
cn_north_1: "Trung Quốc (Bắc Kinh)"
+ eu_central_1: "EU (Frankfurt)"
+ eu_west_1: "EU (Ireland)"
+ eu_west_2: "EU (London)"
+ sa_east_1: "South America (Sao Paulo)"
+ us_east_1: "US East (N. Virginia)"
+ us_gov_west_1: "AWS GovCloud (US)"
+ us_west_1: "US West (N. California)"
+ us_west_2: "US West (Oregon)"
edit: 'sửa tiêu đề và chuyên mục của chủ đề'
not_implemented: "Tính năng này chưa được hoàn thiện hết, xin lỗi!"
no_value: "Không"
diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml
index a482f16dde0..b50b1b65984 100644
--- a/config/locales/client.zh_CN.yml
+++ b/config/locales/client.zh_CN.yml
@@ -130,20 +130,20 @@ zh_CN:
default_description: "默认"
s3:
regions:
- us_east_1: "美国东部(N. Virginia)"
- us_west_1: "美国西部(N. California)"
- us_west_2: "美国西部(Oregon)"
- us_gov_west_1: "政府专用(US)"
- eu_west_1: "欧洲(Ireland)"
- eu_west_2: "欧洲(London)"
- eu_central_1: "欧洲(Frankfurt)"
- ap_southeast_1: "亚太地区(Singapore)"
- ap_southeast_2: "亚太地区(Sydney)"
- ap_south_1: "亚太地区(Mumbai)"
ap_northeast_1: "亚太地区(Tokyo)"
ap_northeast_2: "亚太地区(Seoul)"
- sa_east_1: "南美(Sao Paulo)"
+ ap_south_1: "亚太地区(Mumbai)"
+ ap_southeast_1: "亚太地区(Singapore)"
+ ap_southeast_2: "亚太地区(Sydney)"
cn_north_1: "中国(Beijing)"
+ eu_central_1: "欧洲(Frankfurt)"
+ eu_west_1: "欧洲(Ireland)"
+ eu_west_2: "欧洲(London)"
+ sa_east_1: "南美(Sao Paulo)"
+ us_east_1: "美国东部(N. Virginia)"
+ us_gov_west_1: "政府专用(US)"
+ us_west_1: "美国西部(N. California)"
+ us_west_2: "美国西部(Oregon)"
edit: '编辑标题和分类'
not_implemented: "非常抱歉,这个功能仍在开发中!"
no_value: "否"
diff --git a/config/locales/client.zh_TW.yml b/config/locales/client.zh_TW.yml
index 3749292d44f..0e63b67de49 100644
--- a/config/locales/client.zh_TW.yml
+++ b/config/locales/client.zh_TW.yml
@@ -123,19 +123,19 @@ zh_TW:
bootstrap_mode_disabled: "初始化模式將會在24小時後關閉。"
s3:
regions:
- us_east_1: "美國東部 (北維珍尼亞州)"
- us_west_1: "美國西部 (北加州)"
- us_west_2: "美國西部 (奧勒岡州)"
- us_gov_west_1: "AWS GovCloud (美國)"
- eu_west_1: "歐洲 (愛爾蘭)"
- eu_central_1: "歐洲 (法蘭克福)"
- ap_southeast_1: "亞太地區 (新加坡)"
- ap_southeast_2: "亞太地區 (悉尼)"
- ap_south_1: "亞太地區 (孟買)"
ap_northeast_1: "亞太地區 (東京)"
ap_northeast_2: "亞太地區 (首爾)"
- sa_east_1: "南美洲 (聖保羅)"
+ ap_south_1: "亞太地區 (孟買)"
+ ap_southeast_1: "亞太地區 (新加坡)"
+ ap_southeast_2: "亞太地區 (悉尼)"
cn_north_1: "中國 (北京)"
+ eu_central_1: "歐洲 (法蘭克福)"
+ eu_west_1: "歐洲 (愛爾蘭)"
+ sa_east_1: "南美洲 (聖保羅)"
+ us_east_1: "美國東部 (北維珍尼亞州)"
+ us_gov_west_1: "AWS GovCloud (美國)"
+ us_west_1: "美國西部 (北加州)"
+ us_west_2: "美國西部 (奧勒岡州)"
edit: '編輯此討論話題的標題與分類'
not_implemented: "抱歉,此功能尚未開放。"
no_value: "否"
diff --git a/config/locales/server.ar.yml b/config/locales/server.ar.yml
index ab722fe3f9d..59d9ab5c0c0 100644
--- a/config/locales/server.ar.yml
+++ b/config/locales/server.ar.yml
@@ -1363,7 +1363,7 @@ ar:
errors: "%{errors}"
not_available: "غير متاح. جرّب %{suggestion} ؟"
something_already_taken: "حدث خطأ ما, ربما اسم المستخدم و البريد الالكتروني مسجل مسبقا, جرب رابط نسيان كلمة المرور."
- omniauth_error: "نأسف, هناك خطأ في تصريح حسابك. ربما لم تعطي تصريح؟"
+ omniauth_error: "نأسف، حدث خطأ في استيثاق حسابك. لربمّا لم تقبل الاستيثاق؟"
omniauth_error_unknown: "حدث خطأ ما في معالجة دخولك، الرجاء إعادة المحاولة."
new_registrations_disabled: "لا يُسمح بتسجيل حساب جديد بهذا الوقت "
password_too_long: "كلمة السّرّ مقصورة على 200 محرف."
diff --git a/config/locales/server.cs.yml b/config/locales/server.cs.yml
index 7251571b057..0dc576ad1fd 100644
--- a/config/locales/server.cs.yml
+++ b/config/locales/server.cs.yml
@@ -164,6 +164,7 @@ cs:
admins: "admins"
moderators: "moderators"
staff: "staff"
+ trust_level_0: "trust_level_0"
trust_level_1: "trust_level_1"
trust_level_2: "trust_level_2"
trust_level_3: "trust_level_3"
@@ -187,6 +188,8 @@ cs:
attributes:
category:
name: "Název kategorie"
+ topic:
+ title: 'Nadpis'
post:
raw: "Tělo"
user_profile:
@@ -206,12 +209,17 @@ cs:
common: "je jedno z 10 000 nejčastějších hesel. Použijte prosím bezpečnější heslo."
same_as_username: "je stejné jako vaše uživatelské jméno. Zkuste vymyslet bezpečnější heslo."
same_as_email: "je stejné jako váš email. Zkuste vymyslet bezpečnější heslo."
+ same_as_current: "je stejné jako vaše současné heslo."
+ unique_characters: "má příliš mnoho opakujících se znaků. Použijte prosím bezpečnější heslo."
ip_address:
signup_not_allowed: "Registrace z této adresy není povolena."
color_scheme_color:
attributes:
hex:
invalid: "není platná barva"
+ post_reply:
+ base:
+ different_topic: "Příspěvek a odpověď musí patřit ke stejnému tématu."
<<: *errors
user_profile:
no_info_other: "
%{name} o sobě zatím žádné informace nevyplnil
"
diff --git a/config/locales/server.da.yml b/config/locales/server.da.yml
index ea748fa7e04..7fc9167b53a 100644
--- a/config/locales/server.da.yml
+++ b/config/locales/server.da.yml
@@ -1150,40 +1150,8 @@ da:
invite_mailer:
subject_template: "%{invitee_name} inviterede dig til '%{topic_title}' på %{site_domain_name}"
- text_body_template: |
- %{invitee_name} inviterede dig til en debat om
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- på
-
- > %{site_title} -- %{site_description}
-
- Hvis du er interesseret, så klik på linket herunder:
-
- %{invite_link}
custom_invite_mailer:
subject_template: "%{invitee_name} inviterede dig til '%{topic_title}' på %{site_domain_name}"
- text_body_template: |
- %{invitee_name} inviterede dig til en debat
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- på
-
- > %{site_title} -- %{site_description}
-
- Med denne besked
-
- > %{user_custom_message}
-
- Hvis du er interesseret, så klik på linket herunder:
-
- %{invite_link}
invite_forum_mailer:
subject_template: "%{invitee_name} inviterede dig til at oprette dig på %{site_domain_name}"
custom_invite_forum_mailer:
diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml
index 5792ad524cd..de23ebad7d9 100644
--- a/config/locales/server.de.yml
+++ b/config/locales/server.de.yml
@@ -1519,41 +1519,9 @@ de:
invite_mailer:
title: "Einladung zu einem Thema"
subject_template: "%{invitee_name} hat dich zum Thema '%{topic_title}' auf %{site_domain_name} eingeladen"
- text_body_template: |
- %{invitee_name} hat dich eingeladen zur Diskussion
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- bei
-
- > %{site_title} -- %{site_description}
-
- Wenn du interessiert bist, klicke auf den folgenden Link:
-
- %{invite_link}
custom_invite_mailer:
title: "Einladung zu einem Thema (mit Nachricht)"
subject_template: "%{invitee_name} hat dich eingeladen zu '%{topic_title}' auf %{site_domain_name}"
- text_body_template: |
- %{invitee_name} hat dich eingeladen zur Diskussion
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- bei
-
- > %{site_title} -- %{site_description}
-
- Mit dieser Notiz:
-
- > %{user_custom_message}
-
- Falls du Interesse hast, klicke auf den nachfolgenden Link:
-
- %{invite_link}
invite_forum_mailer:
title: "Einladung zur Teilnahme"
subject_template: "%{invitee_name} hat dich eingeladen %{site_domain_name} beizutreten"
@@ -2100,26 +2068,6 @@ de:
visit_link_to_respond: "[Rufe das Thema auf](%{base_url}%{url}), um zu antworten."
visit_link_to_respond_pm: "[Rufe die Nachricht auf](%{base_url}%{url}), um zu antworten."
posted_by: "Erstellt von %{username} am %{post_date}"
- invited_to_private_message_body: |
- %{username} hat dich zu einer Unterhaltung eingeladen
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- auf
-
- > %{site_title} -- %{site_description}
- invited_to_topic_body: |
- %{username} hat dich zu einer Diskussion eingeladen
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- auf
-
- > %{site_title} -- %{site_description}
user_invited_to_private_message_pm:
title: "Benutzer zu Nachricht eingeladen"
subject_template: "[%{email_prefix}] %{username} hat dich zu einer Unterhaltung '%{topic_title}' eingeladen"
diff --git a/config/locales/server.el.yml b/config/locales/server.el.yml
index 3ad65a40043..57ecd3f5ca7 100644
--- a/config/locales/server.el.yml
+++ b/config/locales/server.el.yml
@@ -1449,43 +1449,9 @@ el:
invite_mailer:
title: "Προσκάλεσε τον αποστολέα"
subject_template: "%{invitee_name} σε προσκάλεσε σε '%{topic_title}' πάνω σε %{site_domain_name}"
- text_body_template: |
- %{invitee_name} σας προσκάλεσε σε μία συζήτηση
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- στο
-
- > %{site_title} -- %{site_description}
-
- Εάν σε ενδιαφέρει, κάνε κλικ στο σύνδεσμο παρακάτω:
-
- %{invite_link}
custom_invite_mailer:
title: "Προσαρμοσμένη Πρόσκληση Ταχυδρομείου"
subject_template: "%{invitee_name} σε προσκάλεσε στο %{topic_title}' του %{site_domain_name}"
- text_body_template: |
- %{invitee_name} σας προσκάλεσε σε μία συζήτηση
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- στο
-
- > %{site_title} -- %{site_description}
-
- Με αυτή τη σημείωση
-
- > %{user_custom_message}
-
- Εάν σε ενδιαφέρει, κάνε κλικ στο σύνδεσμο παρακάτω:
-
- %{invite_link}
-
- Αυτή η πρόσκληση προέρχεται από έμπιστο χρήστη, επομένως ένας λογαριασμός θα δημιουργηθεί αυτόματα για εσένα χρησιμοποιώντας αυτή τη διεύθυνση ηλεκτρονικού ταχυδρομείου.
invite_forum_mailer:
title: "Προσκαλέστε τον Μέιλερ του Φόρουμ"
subject_template: "%{invitee_name} σε προσκάλεσε να συμμετέχεις στο %{site_domain_name}"
@@ -1941,26 +1907,6 @@ el:
visit_link_to_respond: "[Visit Topic](%{base_url}%{url}) για να αποκριθείς."
visit_link_to_respond_pm: "[Visit Message](%{base_url}%{url}) για να αποκριθείς."
posted_by: "Δημοσιεύθηκε από %{username} στις %{post_date}"
- invited_to_private_message_body: |
- %{username} σας προσκάλεσε σε ένα μήνυμα
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- στο
-
- > %{site_title} -- %{site_description}
- invited_to_topic_body: |
- %{username} σας προσκάλεσε σε μία συζήτηση
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- στο
-
- > %{site_title} -- %{site_description}
user_invited_to_private_message_pm:
title: "Ο χρήστης προσκλήθηκε σε προσωπικό μήνυμα"
text_body_template: |
diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml
index 775899a0f78..1c2b48bfedb 100644
--- a/config/locales/server.es.yml
+++ b/config/locales/server.es.yml
@@ -357,7 +357,6 @@ es:
translation_overrides:
attributes:
value:
- invalid_interpolation_keys: 'Las siguientes claves de interpolación no son válidas: "%{keys}"'
missing_interpolation_keys: 'Las siguientes claves de interpolación se perdieron: "%{keys}"'
<<: *errors
user_profile:
@@ -1534,45 +1533,9 @@ es:
invite_mailer:
title: "Invitar Usuario"
subject_template: "%{invitee_name} te invitó a '%{topic_title}' en %{site_domain_name}"
- text_body_template: |
- %{invitee_name} te invitó a un debate
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- en
-
- > %{site_title} -- %{site_description}
-
- Si estás interesado, haz clic en el siguiente enlace:
-
- %{invite_link}
-
- Esta invitación proviene de un usuario de confianza, por lo que puedes comentar en el tema inmediatamente.
custom_invite_mailer:
title: "Personalizar Invitar Usuario"
subject_template: "%{invitee_name} te ha invitado a '%{topic_title}' en %{site_domain_name}"
- text_body_template: |
- %{invitee_name} te ha invitado a un debate
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- en
-
- > %{site_title} -- %{site_description}
-
- Mensaje de %{invitee_name}:
-
- %{user_custom_message}
-
- Si estás interesado en participar, haz clic en el enlace debajo:
-
- %{invite_link}
-
- Esta invitación viene de un usuario en el que confiamos, por lo que podrás responder inmediatamente.
invite_forum_mailer:
title: "Invitación suscripción del foro"
subject_template: "%{invitee_name} te invitó a unirte a %{site_domain_name}"
@@ -2137,26 +2100,6 @@ es:
visit_link_to_respond: "[Visita el tema](%{base_url}%{url}) para responder."
visit_link_to_respond_pm: "[Visita el mensaje](%{base_url}%{url}) para responder."
posted_by: "Publicado por %{username} el %{post_date}"
- invited_to_private_message_body: |
- %{username} te invitó a un mensaje directo
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- en
-
- > %{site_title} -- %{site_description}
- invited_to_topic_body: |
- %{username} te invitó a un tema de debate
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- en
-
- > %{site_title} -- %{site_description}
user_invited_to_private_message_pm:
title: "Usuario invitado a MP"
subject_template: "[%{email_prefix}] %{username} te ha invitado a un hilo de mensajes en '%{topic_title}'"
diff --git a/config/locales/server.fa_IR.yml b/config/locales/server.fa_IR.yml
index a1dc35576d4..5ba4500c5a9 100644
--- a/config/locales/server.fa_IR.yml
+++ b/config/locales/server.fa_IR.yml
@@ -1464,41 +1464,9 @@ fa_IR:
invite_mailer:
title: "دعوت نامهرسان"
subject_template: "%{invitee_name} شما را به %{topic_title}' در %{site_domain_name} دعوت کرده"
- text_body_template: |
- %{invitee_name} شما را به گفتگو دعوت کرده
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- at
-
- > %{site_title} -- %{site_description}
-
- اگر علاقهمند هستید روی لینک زیر کلیک کنید:
-
- %{invite_link}
custom_invite_mailer:
title: "دعوت سفارشی نامهرسان"
subject_template: "%{invitee_name} شما را به '%{topic_title}' در %{site_domain_name} دعوت کرده"
- text_body_template: |
- %{invitee_name} شما را به گفتگو دعوت کرده
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- at
-
- > %{site_title} -- %{site_description}
-
- با این یادداشت
-
- > %{user_custom_message}
-
- اگر علاقهمند هستید روی لینک زیر کلیک کنید:
-
- %{invite_link}
invite_forum_mailer:
title: "دعوت نامهرسان انجمن"
subject_template: "%{invitee_name} به عضویت در %{site_domain_name} دعوت شدید"
@@ -2000,26 +1968,6 @@ fa_IR:
visit_link_to_respond: "[موضوع را](%{base_url}%{url}) برای ارسال پاسخ ببینید."
visit_link_to_respond_pm: "[پیام را](%{base_url}%{url}) برای ارسال پاسخ ببینید."
posted_by: "نوشته شده توسط {username}% در تاریخ {post_date}%"
- invited_to_private_message_body: |
- %{username} شما را به یک پیام دعوت کرده
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- در
-
- > %{site_title} -- %{site_description}
- invited_to_topic_body: |
- %{username} شما را به یک بحث دعوت کرده
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- در
-
- > %{site_title} -- %{site_description}
user_invited_to_private_message_pm:
title: "کاربر دعوت شده به پیام خصوصی"
subject_template: "[%{email_prefix}] %{username} شما را به پیام '%{topic_title}' دعوت کرده"
diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml
index d2aad62daa6..99481189cba 100644
--- a/config/locales/server.fi.yml
+++ b/config/locales/server.fi.yml
@@ -175,6 +175,7 @@ fi:
user_is_suspended: "Hyllytetyt käyttäjät eivät saa luoda viestejä."
topic_not_found: "Jotain on mennyt pieleen. Ehkä tämä ketju on suljettu tai poistettu sillä välin, kun katselit sitä?"
not_accepting_pms: "Pahoittelut, %{username} ei ota vastaan yksityisviestejä tällä hetkellä."
+ max_pm_recepients: "Pahoittelut, voit lähettää viestin enintään %{recipients_limit} vastaanottajalle."
just_posted_that: "on liian samanlainen kuin aiempi viestisi"
invalid_characters: "sisältää epäkelpoja merkkejä"
is_invalid: "vaikuttaa epäselvältä, olihan se kokonainen virke?"
@@ -358,7 +359,6 @@ fi:
translation_overrides:
attributes:
value:
- invalid_interpolation_keys: 'Nämä interpolaatioavaimet eivät kelpaa: "%{keys}"'
missing_interpolation_keys: 'Nämä interpolaatioavaimet puuttuvat: "%{keys}"'
<<: *errors
user_profile:
@@ -655,6 +655,7 @@ fi:
remove: "Tämä ketju ei ole enää banneri. Sitä ei näytetä enää jokaisen sivun ylälaidassa."
unsubscribed:
title: "Tilaus peruttu!"
+ description: "Tilaus osoitteeseen %{email} on peruttu. Voit muuttaa sähköpostiasetuksia käyttäjäasetuksissasi."
topic_description: "Tilaa %{link} uudelleen ketjun alla tai oikealla puolen sijaitsevan ilmoitusvalikon kautta."
unsubscribe:
title: "Peru tilaus"
@@ -865,6 +866,8 @@ fi:
search_tokenize_chinese_japanese_korean: "Pakota haku käsittelemään kiinaa/japania/koreaa myös muunkielisillä sivustoilla"
search_prefer_recent_posts: "Jos hakeminen suurelta palstaltasi on hidasta, tämä asetus kokeilee hakemistorakennetta, jossa tuoreimmat viestit ovat ensin"
search_recent_posts_size: "Kuinka monta tuoretta viestiä pidetään hakemistossa"
+ log_search_queries: "Pidä lokia käyttäjien tekemistä hauista"
+ search_query_log_max_size: "Kuinka monta hakukyselyä säilötään enintään"
allow_uncategorized_topics: "Salli ketjujen luominen valitsematta aluetta. VAROITUS: Alueettomat ketjut täytyy siirtää jollekin alueelle ennen kuin poistat asetuksen käytöstä."
allow_duplicate_topic_titles: "Salli ketjun luominen identtisellä otsikolla."
unique_posts_mins: "Kuinka monen minuutin kuluttua käyttäjä voi lähettää uudestaan samansisältöisen viestin"
@@ -1296,6 +1299,7 @@ fi:
auto_close_messages_post_count: "Maksimimäärä viestejä yksityisketjussa, kunnes se suljetaan automaattisesti (0 poistaaksesi käytöstä)"
auto_close_topics_post_count: "Maksimimäärä viestejä ketjussa, kunnes se suljetaan automaattisesti (0 poistaaksesi käytöstä)"
code_formatting_style: "Viestikentän koodipainike käyttää oletuksena tätä koodimuotoilutyyliä"
+ max_allowed_message_recipients: "Kuinka monta vastaanottajaa yksityisviestillä voi olla."
default_email_digest_frequency: "Kuinka usein käyttäjille lähetetään sähköpostikooste oletuksena."
default_include_tl0_in_digests: "Sisällytä uusien käyttäjien viestit sähköpostikoosteisiin oletuksena. Tätä voi muuttaa käyttäjäasetuksissa."
default_email_private_messages: "Lähetä oletuksena sähköposti, kun joku lähettää käyttäjälle viestin."
@@ -1364,6 +1368,8 @@ fi:
email_polling_disabled: "Sinun täytyy ottaa käyttöön joko manuaalinen tai POP3 pollaus ennen sähköpostivastauksia."
user_locale_not_enabled: "'allow user locale' täytyy olla asetettuna ennen tämän asetuksen ottamista käyttöön."
invalid_regex: "Säännöllinen lauseke ei kelpaa tai ei ole sallittu."
+ email_editable_enabled: "Asetus 'email editable' on otettava pois käytöstä ennen tämän asetuksen käyttöönottoa."
+ enable_sso_disabled: "Asetus 'enable sso' on otettava käyttöön ennen tämän asetuksen käyttöönottoa."
search:
within_post: "#%{post_number} käyttäjältä %{username}"
types:
@@ -1528,36 +1534,35 @@ fi:
invite_mailer:
title: "Kutsu keskusteluun"
subject_template: "%{invitee_name} kutsui sinut ketjuun '%{topic_title}' sivustolla %{site_domain_name}"
- text_body_template: |+
+ text_body_template: |
%{invitee_name} kutsui sinut keskusteluun
- > **%{topic_title}**
+ > #### %{topic_title}
>
> %{topic_excerpt}
- keskustelupalstalla
+ sivustolla
> %{site_title} -- %{site_description}
Jos kiinnostuit, klikkaa alla olevaa linkkiä:
%{invite_link}
-
custom_invite_mailer:
title: "Kutsu keskusteluun saatesanoilla"
subject_template: "%{invitee_name} kutsui sinut ketjuun '%{topic_title}' sivustolla %{site_domain_name}"
text_body_template: |
%{invitee_name} kutsui sinut keskusteluun
- > **%{topic_title}**
+ > #### %{topic_title}
>
> %{topic_excerpt}
- keskustelupalstalla
+ sivustolla
> %{site_title} -- %{site_description}
- tällaisin saatesanoin:
+ tällaisin saatesanoin
> %{user_custom_message}
@@ -2121,7 +2126,7 @@ fi:
invited_to_private_message_body: |
%{username} kutsui sinut yksityiskeskusteluun
- > **%{topic_title}**
+ > #### %{topic_title}
>
> %{topic_excerpt}
@@ -2129,9 +2134,9 @@ fi:
> %{site_title} -- %{site_description}
invited_to_topic_body: |
- %{username} kutsui sinut keskusteluun
+ %{username} kustui sinut keskusteluun
- > **%{topic_title}**
+ > #### %{topic_title}
>
> %{topic_excerpt}
diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml
index cd44c0a4586..79dafa2f0af 100644
--- a/config/locales/server.fr.yml
+++ b/config/locales/server.fr.yml
@@ -357,7 +357,6 @@ fr:
translation_overrides:
attributes:
value:
- invalid_interpolation_keys: 'Les clés d''interpolation suivantes sont invalides : « %{keys} »'
missing_interpolation_keys: 'Les clés d''interpolation suivantes sont absentes : « %{keys} »'
<<: *errors
user_profile:
@@ -1527,41 +1526,9 @@ fr:
invite_mailer:
title: "Invitiation"
subject_template: "%{invitee_name} vous a invité(e) à participer à « %{topic_title} » sur %{site_domain_name}"
- text_body_template: |
- %{invitee_name} vous a invité(e) à une discussion
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- à
-
- > %{site_title} -- %{site_description}
-
- Si cela vous intéresse, cliquez sur le lien ci-dessous :
-
- %{invite_link}
custom_invite_mailer:
title: "Invitation personnalisée"
subject_template: "%{invitee_name} vous a invité(e) à participer à « %{topic_title} » sur %{site_domain_name}"
- text_body_template: |
- %{invitee_name} vous a invité(e) à une discussion
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- à
-
- > %{site_title} -- %{site_description}
-
- Avec ce message :
-
- > %{user_custom_message}
-
- Si cela vous intéresse, cliquez sur le lien ci-dessous :
-
- %{invite_link}
invite_forum_mailer:
title: "Invitation sur le forum"
subject_template: "%{invitee_name} vous a invité(e) à rejoindre %{site_domain_name}"
@@ -2091,26 +2058,6 @@ fr:
visit_link_to_respond: "[Voir le sujet](%{base_url}%{url}) pour répondre."
visit_link_to_respond_pm: "[Voir le message](%{base_url}%{url}) pour répondre."
posted_by: "Redigé par %{username} le %{post_date}"
- invited_to_private_message_body: |
- %{username} vous a invité(e) à un message
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- sur
-
- > %{site_title} -- %{site_description}
- invited_to_topic_body: |
- %{username} vous a invité(e) à une discussion
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- sur
-
- > %{site_title} -- %{site_description}
user_invited_to_private_message_pm:
title: "Utilisateur invité au MP"
subject_template: "[%{email_prefix}] %{username} vous a invité dans la conversation « %{topic_title} »"
diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml
index d809362bdc1..4ad04ee299f 100644
--- a/config/locales/server.he.yml
+++ b/config/locales/server.he.yml
@@ -175,6 +175,7 @@ he:
user_is_suspended: "משתמשים מושעים אינם מורשים לפרסם."
topic_not_found: "משהו השתבש אולי נושא זה נסגר או נמחק בזמן שקראתם אותו?"
not_accepting_pms: "מצטעים, %{username} לא מקבל הודעות כרגע."
+ max_pm_recepients: "מצטערים, אתם יכולים לשלוח הודעה לכל היותר ל-%{recipients_limit} נמענים."
just_posted_that: "דומה מידי למה שפרסמתם לאחרונה"
invalid_characters: "מכיל תווים לא תקניים"
is_invalid: "נראה לא ברור, האם זה משפט שלם?"
@@ -854,6 +855,8 @@ he:
search_tokenize_chinese_japanese_korean: "אלצו את החיפוש לנתח סינית/יפנית/קוריאנית גם באתרים שאינם בשפות אלו"
search_prefer_recent_posts: "אם חיפוש בפורום הגדול שלכם איטי, אופציה זו מנסה לאנדקס קודם כל את הפוסטים החדשים יותר"
search_recent_posts_size: "כמה פוסטים חדשים לשמור באינדקס"
+ log_search_queries: "רישום שאילתות חיפוש שמתבצעות על ידי משתמשים"
+ search_query_log_max_size: "מספר מקסימלי של שאילתות חיפוש לשימור"
allow_uncategorized_topics: "הרשה לפתוח נושאים ללא קטגוריה. אזהרה: אם יש נושאים ללא קטגוריה, יש לסדר אותם לפני שמבטלים את האופציה. "
allow_duplicate_topic_titles: "אשרו נושאים עם כותרות זהות או משוכפלות."
unique_posts_mins: "כמה דקות לפני שמשתמש יכול לפרסם את אותו תוכן שוב"
@@ -1520,41 +1523,9 @@ he:
invite_mailer:
title: "שולח-מיילים להזמנה"
subject_template: "הוזמנת על ידי %{invitee_name} ל '%{topic_title}' ב%{site_domain_name}"
- text_body_template: |
- %{invitee_name} הזמין/ה אתכם לדיון
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- ב
-
- > %{site_title} -- %{site_description}
-
- אם אתם מעוניינים, לחצו על הקישור למטה:
-
- %{invite_link}
custom_invite_mailer:
title: "שולח-מיילים מותאם-אישית להזמנה"
subject_template: "%{invitee_name} הזמין/הזמינה אותך לדיון '%{topic_title}' באתר %{site_domain_name}"
- text_body_template: |
- %{invitee_name} הזמין/ה אתכם לדיון
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- ב
-
- > %{site_title} -- %{site_description}
-
- עם הערה זו
-
- > %{user_custom_message}
-
- אם אתם מעוניינים, לחצו על הקישור למטה:
-
- %{invite_link}
invite_forum_mailer:
title: "שולח-מיילים להזמנה לפורום"
subject_template: "%{invitee_name} הזמינ/ה אתכם להצטרף ל%{site_domain_name}"
@@ -2087,26 +2058,6 @@ he:
visit_link_to_respond: "[בקרו בנושא](%{base_url}%{url}) כדי לענות."
visit_link_to_respond_pm: "[בקרו בהודעה](%{base_url}%{url}) כדי לענות."
posted_by: "פורסם על ידי %{username} ב %{post_date}"
- invited_to_private_message_body: |
- %{username} הזמין אותך להודעה
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- באתר
-
- > %{site_title} -- %{site_description}
- invited_to_topic_body: |
- %{username} הזמין/הזמינה אותך לדיון
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- באתר
-
- > %{site_title} -- %{site_description}
user_invited_to_private_message_pm:
title: "משתמש/ת הוזמן/ה להודעה פרטית"
subject_template: "[%{email_prefix}] %{username} הזמין אותך להודעה '%{topic_title}'"
diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml
index ad31c6d81b5..24e8bfcb8c6 100644
--- a/config/locales/server.it.yml
+++ b/config/locales/server.it.yml
@@ -175,6 +175,7 @@ it:
user_is_suspended: "Agli utenti sospesi non è permesso creare messaggi."
topic_not_found: "Quancosa non ha funzionato. Forse questo argomento è stato chiuso o cancellato mentre lo leggevi."
not_accepting_pms: "Spiacenti, %{username} non accetta messaggi al momento."
+ max_pm_recepients: "Spiacenti, puoi inviare un messaggio ad un massimo di %{recipients_limit} destinatari."
just_posted_that: "è troppo simile a ciò che hai appena pubblicato"
invalid_characters: "contiene caratteri non validi"
is_invalid: "sembra poco chiaro, è una frase completa?"
@@ -360,7 +361,6 @@ it:
translation_overrides:
attributes:
value:
- invalid_interpolation_keys: 'Le seguenti chiavi(e) di interpolazione non sono valide: "%{keys}"'
missing_interpolation_keys: 'Le seguenti chiavi(e) di interpolazione sono mancanti: "%{keys}"'
<<: *errors
user_profile:
@@ -868,6 +868,7 @@ it:
search_tokenize_chinese_japanese_korean: "Attiva la tokenizzazione dei caratteri Cinesi/Giapponesi/Coreani nella ricerca anche sui siti non CJK"
search_prefer_recent_posts: "Se il tuo forum è corposo e la ricerca è lenta, questa opzione tenta di indicizzare prima i messaggi più recenti"
search_recent_posts_size: "Quanti messaggi recenti mantenere nell'indice"
+ search_query_log_max_size: "Quantità massima di query di ricerca da mantenere"
allow_uncategorized_topics: "Permetti la creazione di argomenti senza categoria. ATTENZIONE: se ci sono argomenti senza categoria, devi ricategorizzarli prima di disabilitare questa opzione."
allow_duplicate_topic_titles: "Permetti più argomenti con lo stesso identico titolo"
unique_posts_mins: "Quanti minuti prima che un utente possa inviare un altro argomento con lo stesso contenuto"
@@ -1169,12 +1170,15 @@ it:
disable_emails: "Evita che Discourse invii qualunque tipo di email"
strip_images_from_short_emails: "Elimina le immagini dalle email aventi dimensione inferiore a 2800 Byte."
short_email_length: "Lunghezza delle email brevi in Byte"
+ unsubscribe_via_email: "Consenti agli utenti di annullare la sottoscrizione alle email inviando una email con 'unsubscribe' nell'oggetto o nel corpo"
+ delete_email_logs_after_days: "Elimina i log delle email dopo (N) giorni. 0 per mantenerli indefinitamente"
max_emails_per_day_per_user: "Numero massimo di email da inviare agli utenti per giorno. 0 per disabilitare il limite"
enable_staged_users: "Crea automaticamente utenti temporanei quando si elaborano le email in arrivo."
maximum_staged_users_per_email: "Numero massimo di utenti temporanei creati quando si elaborano le email in arrivo."
auto_generated_whitelist: "Lista degli indirizzi email che non verranno verificati per i contenuti generati automaticamente. Esempio: foo@bar.com|discourse@bar.com"
block_auto_generated_emails: "Bloccare le email in arrivo identificate come generate automaticamente."
ignore_by_title: "Ignora le email in arrivo in base al loro titolo."
+ mailgun_api_key: "Chiave API Segreta di Mailgun usata per verificare i messaggi webhook. "
attachment_content_type_blacklist: "Elenco delle parole chiave utilizzate per mettere in blacklist gli allegati in base al tipo di contenuto."
attachment_filename_blacklist: "Elenco delle parole chiave utilizzate per mettere in blacklist gli allegati in base al nome del file."
enable_forwarded_emails: "[BETA] Consenti agli utenti di creare un argomento inviando una email."
@@ -1204,22 +1208,85 @@ it:
allow_animated_thumbnails: "Genera miniature animate delle gif animate."
default_avatars: "URL degli avatar che verranno utilizzati come predefiniti per i nuovi utenti, fintanto che non li cambieranno esplicitamente."
automatically_download_gravatars: "Scarica i Gravatars per gli utenti quando viene creato l'account o quando viene modificata l'email"
+ digest_topics: "Numero massimo di argomenti di successo da mostrare nell'email riepilogativa."
+ digest_posts: "Numero massimo dei messaggi di successo da mostrare nell'email riepilogativa."
+ digest_min_excerpt_length: "Lunghezza minima dell'estratto del messaggio nell'email riepilogativa, in caratteri."
+ suppress_digest_email_after_days: "Sopprimi le email di riepilogo per gli utenti che non visitano il sito per più di (n) giorni."
+ digest_suppress_categories: "Sopprimi queste categorie dalle email riepilogative."
+ disable_digest_emails: "Disabilita le email riepilogative per tutti gli utenti."
+ email_accent_bg_color: "Colore da usare come background per alcuni elementi delle email HTML. Inserire il nome di un colore ('red') o un valore esadecimale ('#FF000')."
+ email_link_color: "Colore dei collegamenti nelle email HTML. Inserire il nome di un colore ('blue') o un valore esadecimale ('#0000FF')."
+ max_daily_gravatar_crawls: "Numero massimo di volte al giorno in cui Discourse controllerà Gravatar per gli avatar personalizzati"
+ public_user_custom_fields: "Una whitelist di campi personalizzati di un utente che possono essere mostrati pubblicamente."
+ staff_user_custom_fields: "Una whitelist di campi personalizzati di un utente che possono essere mostrati allo staff."
+ enable_user_directory: "Fornire una directory degli utenti per la navigazione"
+ enable_group_directory: "Fornire una directory dei gruppi per la navigazione"
+ allow_anonymous_posting: "Permetti agli utenti di passare alla modalità anonima"
+ anonymous_posting_min_trust_level: "Livello di esperienza minimo richiesto per abilitare la pubblicazione in modalità anonima"
+ hide_user_profiles_from_public: "Disabilita schede utenti, profili utenti e directory utenti per gli utenti anonimi."
allow_profile_backgrounds: "Permetti agli utenti di caricare immagini di sfondo per il profilo."
+ sequential_replies_threshold: "Numero di messaggi che un utente deve pubblicare di fila in un argomento prima che gli venga ricordato delle troppe risposte sequenziali."
+ get_a_room_threshold: "Numero di messaggi che un utente deve inviare alla stessa persona nello stesso argomento prima di essere avvertito."
enable_mobile_theme: "I dispositivi mobili usano un tema apposito, con possibilità di passare alla visualizzazione completa. Disabilita questa opzione se vuoi usare un foglio di stile personalizzato che sia completamente reattivo."
+ dominating_topic_minimum_percent: "Quale percentuale di messaggi un utente deve pubblicare in un argomento prima di essere avvertito che sta eccessivamente dominando l'argomento."
+ disable_avatar_education_message: "Disabilita il messaggio educativo per cambiare avatar"
suppress_uncategorized_badge: "Non mostrare il distintivo per gli argomenti senza categoria nell'elenco degli argomenti."
global_notice: "Mostra a tutti i visitatori un avviso con striscione globale URGENTE, EMERGENZA, lascia vuoto per nasconderlo (HTML consentito)."
+ disable_edit_notifications: "Disabilita le notifiche di modifica dall'utente system quando 'download_remote_images_to_local' è attivo."
+ automatically_unpin_topics: " Spunta automaticamente gli argomenti quando l'utente arriva in fondo. "
+ read_time_word_count: "Conteggio di parole al minuto per calcolare il tempo stimato di lettura."
+ native_app_install_banner: "Domanda ai visitatori ricorrenti di installare l'app nativa di Discourse."
+ share_anonymized_statistics: "Condividi statistiche anonime di utilizzo."
full_name_required: "Il nome completo è un campo obbligatorio del profilo utente."
+ enable_names: "Mostra il nome completo dell'utente su profilo, scheda utente e email. Disabilita per nascondere il nome completo ovunque."
+ display_name_on_posts: "Mostra il nome completo dell'utente sui messaggi oltre allo @username."
short_progress_text_threshold: "Quando il numero di messaggi di un argomento supera questo valore, la barra di avanzamento mostrerà solo il numero di messaggi attuale. Se modifichi l'ampiezza della barra di avanzamento, potresti dover cambiare questo valore."
default_code_lang: "Ai blocchi di codice GitHub viene applicata l'evidenziazione della sintassi del linguaggio di programmazione di default (lang-auto, ruby, python ecc.)"
+ warn_reviving_old_topic_age: "Quando qualcuno inizia a rispondere ad un argomento in cui l'ultima risposta è più vecchia di tale numero di giorni, verrà visualizzato un avviso. Disabilita impostando su 0."
+ autohighlight_all_code: "Forza l'evidenziazione della sintassi del codice nei blocchi di testo preformattato, anche se non è stato specificato il linguaggio di programmazione. "
+ highlighted_languages: "Regole di evidenziazione della sintassi incluse. (Avviso: includere troppe lingue può influire sulle prestazioni) vedi: https://highlightjs.org/static/demo/ per una dimostrazione"
embed_by_username: "Nome utente Discourse dell'utente che crea gli argomenti incorporati."
embed_truncate: "Tronca i messaggi incorporati."
+ allowed_href_schemes: "Schemi consentiti nei collegamenti in aggiunta a http e https."
embed_post_limit: "Numero massimo di messaggi da incorporare."
+ embed_username_required: "E' richiesto il nome utente per la creazione di argomenti."
+ embed_whitelist_selector: "Selettore CSS per gli elementi da permettere negli embed."
+ embed_blacklist_selector: "Selettore CSS per gli elementi che sono rimossi dagli embed."
+ notify_about_flags_after: "Se ci sono segnalazioni che non sono state revisionate dopo un tale numero di ore, invia un messaggio privato allo staff. Imposta a 0 per disattivare. "
show_create_topics_notice: "Se il sito ha meno di 5 argomenti pubblici, mostra un avviso chiedendo agli amministratori di creare qualche argomento."
+ delete_drafts_older_than_n_days: Elimina bozze più vecchie di (n) giorni.
+ bootstrap_mode_min_users: "Numero minimo di utenti richiesto per disabilitare la modalità bootstrap (imposta a 0 per disattivare)"
+ prevent_anons_from_downloading_files: "Impedire agli utenti anonimi di scaricare gli allegati. ATTENZIONE: questo impedirà a qualsiasi risorsa del sito pubblicata come allegato di funzionare ad eccezione delle immagini."
enable_emoji: "Attiva gli emoji"
+ enforce_square_emoji: "Forza tutte le emoji ad un aspetto di proporzioni quadrate."
+ approve_post_count: "La quantità di messaggi di un utente nuovo o di base che deve essere approvata"
+ approve_unless_trust_level: "I messaggi degli utenti al di sotto di questo livello di esperienza devono essere approvati"
+ approve_new_topics_unless_trust_level: "I nuovi argomenti degli utenti al di sotto di questo livello di esperienza devono essere approvati"
+ notify_about_queued_posts_after: "Se ci sono messaggi che devono essere revisionati dopo un tale numero di ore, una email verrà inviata a contact_email. Imposta a 0 per disattivare queste email."
+ auto_close_messages_post_count: "Numero massimo di messaggi consentiti in un messaggio privato prima di essere automaticamente chiuso (0 per disabilitare)"
+ auto_close_topics_post_count: "Numero massimo di messaggi consentiti in un argomento prima di essere automaticamente chiuso (0 per disabilitare)"
+ max_allowed_message_recipients: "Numero massimo di destinatari consentiti in un messaggio privato."
+ default_email_digest_frequency: "Con quale frequenza gli utenti ricevono email riepilogative di default."
+ default_email_private_messages: " Invia una email quando qualcuno scrive un messaggio ad un utente di default."
+ default_email_direct: "Invia una email quando qualcuno cita/risponde/menziona un utente di default."
+ default_email_mailing_list_mode: "Invia una email per ogni nuovo messaggio di default."
+ default_email_mailing_list_mode_frequency: "Con quale frequenza gli utenti che hanno attivato la modalità mailing list riceveranno email di default."
+ disable_mailing_list_mode: "Impedisci agli utenti di attivare la modalità mailing list."
+ default_email_always: "Invia una notifica via email anche quando l'utente è attivo di default."
+ default_email_previous_replies: "Includi risposte precedenti nelle email di default."
+ default_email_in_reply_to: "Includi un estratto della risposta ad un messaggio nelle email di default."
+ default_other_new_topic_duration_minutes: "Condizione globale predefinita per cui un argomento viene considerato nuovo."
+ default_other_auto_track_topics_after_msecs: "Tempo globale predefinito prima che un argomento venga automaticamente seguito."
+ default_other_notification_level_when_replying: "Livello di notifica globale predefinito quando un utente risponde ad un argomento."
+ default_other_external_links_in_new_tab: "Apri i collegamenti esterni in una nuova scheda di default. "
+ default_other_enable_quoting: "Attiva rispondi citando per il testo evidenziato di default."
default_other_disable_jump_reply: "Per default non saltare al messaggio dell'utente dopo la sua risposta."
default_categories_watching: "Elenco di categorie osservate per default."
default_categories_tracking: "Elenco di categorie seguite per default."
default_categories_muted: "Elenco di categorie silenziate per default."
+ max_user_api_reqs_per_day: "Numero massimo di richieste giornaliere per la chiave API utente "
+ max_user_api_reqs_per_minute: "Numero massimo di richieste al minuto per la chiave API utente"
+ max_api_keys_per_user: "Numero massimo di chiavi API utente per utente"
tagging_enabled: "Abilitare le etichette per gli argomenti?"
min_trust_to_create_tag: "Il livello di esperienza minimo per creare un'etichetta."
max_tags_per_topic: "Il numero massimo di etichette che si possono applicare ad un argomento."
diff --git a/config/locales/server.ja.yml b/config/locales/server.ja.yml
index 6435fbb2b47..2c9cb4eabd8 100644
--- a/config/locales/server.ja.yml
+++ b/config/locales/server.ja.yml
@@ -14,6 +14,8 @@ ja:
formats:
short: "%Y-%d-%m"
short_no_year: "%B %-d"
+ date_only: "%B%-d、%Y"
+ long: "%B%-d、%Y、%I:%M%P"
date:
month_names: [null, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]
<<: *datetime_formats
@@ -29,8 +31,13 @@ ja:
purge_reason: "放棄されていたため自動的に削除、アカウントを停止しました。"
disable_remote_images_download_reason: "ディスク容量が不足しているため、リモートでの画像ダウンロードは無効になっています。"
anonymous: "匿名"
+ remove_posts_deleted_by_author: "著者によって削除されました。"
+ themes:
+ bad_color_scheme: "テーマを更新できないなら、カラースキームを無効にしてください。"
+ other_error: "サーバーに不具合があるので、テーマを更新してください。"
emails:
incoming:
+ default_subject: "このトピックはタイトルが必要です。"
show_trimmed_content: "続きを読む"
errors: &errors
format: '%{attribute} %{message}'
@@ -945,6 +952,7 @@ ja:
deferred: "伝えてくれてありがとうございます。調査しています"
deferred_and_deleted: "伝えてくれてありがとうございます。投稿を削除しました"
system_messages:
+ contents_hidden: "内容を確認するためにその投稿を訪問して下さい。"
welcome_user:
subject_template: "%{site_name} へようこそ!"
welcome_invite:
@@ -1138,19 +1146,53 @@ ja:
editor:
name: 編集者
description: はじめて投稿を編集する
+ long_description: |
+ このバッジは自分自身の投稿を初回編集した際に授与されます。永久的に編集しないとしても編集は良いアイデアです。-自分自身の投稿を改良したり、細部の間違いを修正したり、何か初期投稿をミスしたときにも内容を追加できます。編集はあなたの投稿をこれまでより良いものにします!
+ basic_user:
+ long_description: |
+ このバッジは信用レベルが1に達した時に授与されます。サイトに出入りして下さったり、我々のコミュニティがどういうものなのかを学ぶためにトピックに目を通して下さり有難うございます。あなたのユーザー条件は次の通りです;全ての必要なコミュニティ要素が許可されました。個人メッセージ、フラグ付け、wiki編集、および複数の画像とリンクの投稿
+ regular:
+ long_description: |
+ このバッジは信用レベルが3に達した時に授与されます。
+ あなたは今最もアクティブな読者の一人であり、我々のコミュニティを素晴らしいものに変えてくれる信用できる貢献者です。カテゴライズしなおしたり、トピック名を付け替えたり、スパムフラグを利用したり、プライベートラウンジエリアにアクセスしたりすることができ、日ごとにいいねが増えるでしょう。
+ welcome:
+ long_description: |
+ このバッジは投稿に対して初めていいね!された時に授与されます。おめでとうございます、投稿した内容についてあなたのコミュニティメンバーは興味深く、クールで有能です!
autobiographer:
name: あなたはだれ?
description: プロフィールをすべて書く
+ long_description: |
+ このバッジはご自身のユーザープロフィールを記入またはプロフィール写真を選択すると授与されます。コミュニティに対してあなたがどういう人物であるか、また改善について興味がある物をもう少し詳しくお知らせ頂き、更に結びつきのあるコミュニティへ。連携しましょう!
+ anniversary:
+ long_description: |
+ このバッジは一年間メンバーで有り続け、少なくともその年に一回は投稿したときに授与されます。サイトに出入りして下さったり、我々のコミュニティに貢献して下さり有難うございます。我々はあなたを必要としています。
nice_post:
name: ナイスな返事
+ long_description: |
+ このバッジはあなたの返信が10回いいね!されたときに授与されます。あなたの返信はコミュニティにとってとても印象深く、会話を促進することに役立っています!
good_post:
name: イカす返事
+ long_description: |
+ このバッジはあなたが25回いいね!されたときに授与されます。あなたの返答は特別で参加者のために会話をよりよいものに変えてくれました!
great_post:
name: 素晴らしい返事
+ long_description: |
+ このバッジは50回いいね!されたときに授与されます。素晴らしい!あなたの返答は心をつかみ、魅力的で、とても陽気で、洞察力がありそしてコミュニティをとても大切にされていました。
nice_topic:
name: ナイスなトピック
+ long_description: |
+ このバッジはあなたのトピックが10回いいね!されたときに授与されます。あなたはコミュニティが楽しめるような興味深い会話を開始しました!
good_topic:
name: イカすトピック
+ nice_share:
+ long_description: |
+ このバッジは共有リンクが25人のサイト訪問者からクリックされた時に授与されます。我々のディスカッションとこのコミュニティについて展開して下さり有難うございます!
+ good_share:
+ long_description: |
+ このバッジは共有リンクが300人のサイト訪問者からクリックされた時に授与されます。素晴らしい出来です!素晴らしいディスカッションで注目を集め、コミュニティの成長を助けてくれました。
+ great_share:
+ long_description: |
+ このバッジは共有リンクが1000人のサイト訪問者からクリックされた時に授与されます。恐るべし数です!莫大な人数への興味深い討論であなたは昇格しました、そして大胆な手法で我々のコミュニティの成長を助けてくれました!
first_flag:
name: はじめの通報
description: 通報した投稿
diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml
index 2bffa0478e7..2805b2b9ac3 100644
--- a/config/locales/server.ko.yml
+++ b/config/locales/server.ko.yml
@@ -344,7 +344,6 @@ ko:
translation_overrides:
attributes:
value:
- invalid_interpolation_keys: '다음 interpolation key가 유효하지 않습니다: "%{keys}"'
missing_interpolation_keys: '다음 interpolation key가 없습니다: "%{keys}"'
<<: *errors
user_profile:
@@ -1044,7 +1043,8 @@ ko:
tl3_requires_posts_read_all_time: "VIP 사용자-3 이 되기 위해 꼭 보아야 하는 글타래의 전체 개수"
tl3_requires_max_flagged: "회원 레벨3의 자격을 얻으려면, 지난 (tl3 time period)일 동안 x명의 사용자로부터 x개 이상의 포스트를 신고당한 일이 없어야 합니다. x 값을 설정.(0이상)"
tl3_promotion_min_duration: "회원등급이 2로 떨어진 후 다시 VIP 사용자-3 이 될 수 있는 최소 일 수"
- tl3_requires_likes_given: "회원 레벨3 자격을 얻기 위하여 지난 (tl3 time period)동안 받아야 하는 최소 좋아요 수."
+ tl3_requires_likes_given: "회원 레벨3 자격을 얻기 위하여 지난 (tl3 time period)동안 줘야 하는 최소 좋아요 수."
+ tl3_requires_likes_received: "회원 레벨3 자격을 얻기 위하여 지난 (tl3 time period)일 동안 받아야 하는 최소 좋아요 수."
tl3_links_no_follow: "VIP 사용자-3 의 글에 있는 링크에서 rel=nofollow 를 제거하지 마시오."
min_trust_to_create_topic: "새로운 주제를 생성하기 위한 최소 회원등급"
min_trust_to_edit_wiki_post: "위키로 설정된 글 수정할 수 있는 최소 회원등급"
@@ -1053,12 +1053,14 @@ ko:
min_trust_to_send_messages: "새로운 개인 메시지를 보내기 위한 최소 신뢰도"
newuser_max_links: "새로운 사용자가 글에 붙일 수 있는 최대 링크 개수"
newuser_max_images: "새로운 사용자가 글에 붙일 수 있는 최대 이미지 개수"
- newuser_max_attachments: "새로운 사용자가 포트에 붙일 수 있는 최대 첨부파일 개수"
- newuser_max_mentions_per_post: "새료운 사용자가 글에 사용할 수 있는 최대 @name 알림 개수"
- newuser_max_replies_per_topic: "다른 사용자가 답글을 달기 전, 새로운 사용자가 개별 글타래에 달 수 있는 최대 답글 개수"
+ newuser_max_attachments: "새로운 사용자가 포스트에 첨부할 수 있는 최대 파일 개수"
+ newuser_max_mentions_per_post: "새로운 사용자가 글에서 쓸 수 있는 최대 @아이디 멘션 개수"
+ newuser_max_replies_per_topic: "다른 사용자가 댓글을 달기 전, 새로운 사용자가 개별 토픽에 달 수 있는 최대 답글 개수"
max_mentions_per_post: "글 당 사용할 수 있는 최대 @name 알림의 수"
+ max_users_notified_per_group_mention: "그룹이 멘션을 받으면 알림을 받는 최대사용자의 수(최대치에 도달하면 알림이 전송되지 않음)"
create_thumbnails: "글의 너무 큰 크기의 이미지는 thumnails와 lightbox를 만든다."
email_time_window_mins: "알림 메일을 보내기 전 대기 기간(분), 사용자에게 글의 변경하고 완료할 수 있는 기회를 준다."
+ private_email_time_window_seconds: "사용자가 메시지를 재편집할 기회를 주기 위하여 개인 알림 메일을 보내기 이전에 설정한 시간만큼 대기합니다."
email_posts_context: "알림메일의 내용에 추가할 기존 답글 수"
flush_timings_secs: "사용자의 이용 시간 데이터를 서버로 보내는 기간(초)"
title_max_word_length: "글타래 제목안에 단어들의 최대 길이"
@@ -1068,12 +1070,15 @@ ko:
title_fancy_entities: "글타래 제목에 일반 ASCII 문자로 만든 기호들을 보기 좋은 HTML로 변환시켜준다. 참고: SmartyPants http://daringfireball.net/projects/smartypants/"
min_title_similar_length: "유사 글타래에 대한 체크가 있기 전, 최소 제목 글자 수"
min_body_similar_length: "유사 글타래에 대한 체크가 있기 전, 글의 최소 본문 글자 수"
+ desktop_category_page_style: "/categories 페이지의 비주얼 스타일"
category_colors: "허용된 카테고리에 사용될 hexadecimal 색상 값의 리스트"
category_style: "카테고리 뱃지 시각 스타일"
max_image_size_kb: "최대 이미지 업로드 사이즈(kB). 이 설정은 꼭 nginx / apache와 proxy에도 적용해야 합니다."
max_attachment_size_kb: "최대 첨부파일 업로드 사이즈(kB). 이 설정은 꼭 nginx / apache와 proxy에도 적용해야 합니다."
authorized_extensions: "파일 업로드에 허용되는 확장자 리스트 ('*'을 사용하면 모든 타입의 파일이 가능합니다.)"
+ theme_authorized_extensions: "테마 업로드에 허용되는 확장자 목록('*'를 입력하면 모든 확장자 허용)"
max_similar_results: "새로운 글타래를 작성할 때, 에디터 위에 보여줄 비슷한 글타래들의 개수. 제목과 본문을 바탕으로 비교합니다."
+ max_image_megapixels: "이미지의 최대 메가픽셀수"
title_prettify: "일반적인 제목의 오타 및 오류를 수정해준다. 모두 대문자로 쓰거나, 첫자가 소문자이거나(영문), 복수의 !, ? 혹은 마침표(.)가 중복으로 들어간 것 등"
topic_views_heat_low: "글타래가 연하게 하이라이트 되기 위한 조회수"
topic_views_heat_medium: "글타래가 적당하게 하이라이트 되기 위한 조회수"
@@ -1090,8 +1095,11 @@ ko:
faq_url: "FAQ주소가 있으면 전체 URL을 적어주세요."
tos_url: "이용약관이 있으면 전체 URL을 적어주세요."
privacy_policy_url: "개인정보 보호가 있으면 전체 URL을 적어주세요."
+ newuser_spam_host_threshold: "새로운 사용자가 동일한 호스트의 링크를 포스팅하더라도 스팸으로 간주되지 않는 최대 포스팅 수 `newuser_spam_host_threshold`"
white_listed_spam_host_domains: "스팸 호스트 테스트로부터 제외할 도메인 리스트. 새로운 사용자는 새로운 사용자는 헤당 도메인에 대한 링크를 포함하는 글를 생성하는데 제한되지 않는다."
staff_like_weight: "스태프가 좋아요를 눌렀을 때 부여할 가산점"
+ topic_view_duration_hours: "N 시간마다 IP/User 별로 새 토픽 조회수를 셉니다."
+ user_profile_view_duration_hours: "N 시간마다 IP/User 별로 새 프로필 조회수를 셉니다."
levenshtein_distance_spammer_emails: "스패머 메일을 체크할 때, 허용할 다른 글자 개수(fuzzy match)"
max_new_accounts_per_registration_ip: "(n) 회원등급의 0개의 계정(스태프도 tl2 이상도 아닌 계정만)이 이 IP에 있으면, 새로운 회원가입 방지."
min_ban_entries_for_roll_up: "Roll up 버튼을 눌렀을 때, 적어도 (N)개의 엔트리가 있다면 새 subnet ban 엔트리를 만듭니다."
@@ -1099,16 +1107,40 @@ ko:
max_age_unmatched_ips: "(N)일 뒤에 안 맞는 막힌 IP 접근을 지웁니다."
num_flaggers_to_close_topic: "추후 중재를 위해 자동으로 글타래를 일시정지시킬 최소 신고자 수"
num_flags_to_close_topic: "추후 중재를 위해 자동으로 글타래를 일시정지시킬 최소 신고 횟수"
+ num_hours_to_close_topic: "운영진 중재를 위하여 토픽을 중지시킬 시간"
auto_respond_to_flag_actions: "신고 기각 시 자동 답변 활성화"
+ min_first_post_typing_time: "사용자가 첫번째 포스트를 작성할 때 타이핑에 소요해야 하는 밀리초. 설정값에 도달하지 않았을 때는 자동으로 승인 큐에 포함됩니다. 승인 0으로 설정하면 해제됩니다.(해제는 권장하지 않습니다)"
+ auto_block_fast_typers_on_first_post: " min_first_post_typing_time에 도달하지 않은 사용자를 자동으로 차단"
auto_block_fast_typers_max_trust_level: "빠른 타이핑이 감지되면 자동 차단을 적용할 최대 신뢰도"
+ auto_block_first_post_regex: "첫번째 포스트를 검사하여 통과하면 사용자를 차단하고 승인 대기열에 포함시키는 대소문자 구분이 없는 정규표현식. 예: raging|a[bc]a, 는 raging, aba, aca를 포함한 첫번째 포스트를 차단합니다. 첫번째 포스트에만 적용됩니다."
reply_by_email_enabled: "이메일을 통해 주제에 답글을 달 수 있음."
reply_by_email_address: "이메일 주소로 답글을 다는 템플릿. 예: %{reply_key}@reply.myforum.com"
+ alternative_reply_by_email_addresses: "수신된 이메일에 대한 답장메일의 대체 템플릿 목록. 예: %{reply_key}@reply.example.com|replies+%{reply_key}@example.com"
incoming_email_prefer_html: "수신 이메일에 text 대신 HTML을 사용"
disable_emails: "Discourse가 어떤 메일로 보내지 못하도록 합니다."
strip_images_from_short_emails: "2800바이트, 즉 2.73 KB 이내 사이즈를 가지도록 이미지를 빼주세요."
short_email_length: "짦은 이메일 바이트 길이"
display_name_on_email_from: "이메일 보낸사람 필드에 전체 이름을 표시"
+ unsubscribe_via_email: "사용자가 이메일 제목이나 내용에 'unsubscribe' 를 포함시켜서 답장하면 이메일 구독을 해지가 되도록 허용"
+ unsubscribe_via_email_footer: "이메일의 하단에 이메일 mailto: 링크 방식의 구독해지 링크를 첨부하기"
+ delete_email_logs_after_days: "(N) 일이 지나면 이메일 로그 삭제하기. 0으로 설정하면 삭제하지 않음"
+ max_emails_per_day_per_user: "사용자에게 보낼 이메일의 하루 최대치. 0으로 설정하면 제한없음."
+ enable_staged_users: "수신 이메일 처리 중일 때 자동으로 격리된 회원 생성."
+ maximum_staged_users_per_email: "수신된 이메일을 처리하는 동안 생성할 최대 격리회원 수"
+ auto_generated_whitelist: "자동 생성 메일로 체크되지 않는 이메일 주소의 목록. 예: foo@bar.com|discourse@bar.com"
+ block_auto_generated_emails: "자동 생성된 이메일로 확인된 수신 이메일 차단."
+ ignore_by_title: "제목을 기준으로 수신 메일 무시."
+ mailgun_api_key: "webhook 메시지를 확인할 Mailgun Secret API 키"
+ soft_bounce_score: "임시 반송이 일어났을 때 사용자에게 반송 스코어 추가."
+ hard_bounce_score: "영구 반송이 일어났을 때 사용자에게 반송 스코어 추가."
+ bounce_score_threshold: "사용자에게 메일을 보낼 최대 반송 스코어."
+ bounce_score_threshold_deactivate: "사용자를 비활성화 할 최대 반송 스코어."
+ reset_bounce_score_after_days: "X 일 이후 반송 스코어 자동 초기화."
+ attachment_content_type_blacklist: "콘텐츠 타입을 기준으로 첨부를 차단할 키워드 블랙리스트."
+ attachment_filename_blacklist: "파일 이름을 기준으로 첨부를 차단할 키워드 블랙리스트."
enable_forwarded_emails: "[베타] 사용자가 이메일 포워딩으로 토픽을 생성할 수 있도록 허용"
+ always_show_trimmed_content: "항상 수신 메일의 다듬어진 부분을 표시. 경고: 메일 주소가 드러날 수 있습니다."
+ private_email: "개인 정보 보호를 위하여 이메일에 포스트나 토픽의 내용 미포함."
manual_polling_enabled: "이메일 답장을 위한 API를 사용하여 이메일 푸시"
pop3_polling_enabled: "POP3를 이용한 이메일 설문조사"
pop3_polling_ssl: "SSL로 POP3 서버를 연결합니다. (추천)"
@@ -1123,29 +1155,52 @@ ko:
email_in_min_trust: "이메일을 통해 새 글타래를 포스팅 할 수 있는 최소 사용자 회원등급"
email_prefix: "이메일 제목에 쓰일 [라벨]. 설정하지 않으면 기본적으로 'title(필수 설정의)' 이 된다."
email_site_title: "사이트에서 전송되는 이메일의 보내는 이를 사이트 이름으로 설정. 설정하지 않으면 'title(필수 설정의)'이 된다. 만약 'title'에 보내는 이에 허용되지 않는 글자가 포함되어 있으면 이 설정이 사용된다."
+ find_related_post_with_key: "응답 포스트를 찾을 때는 reply 키만 사용.(Amazon SES 사용 시 권장)"
minimum_topics_similar: "새로운 글타래를 작성할 때, 유사한 글타래들을 보여주기 위해 존재해야 할 최소 글타래 개수"
relative_date_duration: "절대적 날짜(9월 3일) 대신 상대적 날짜(7일 전)가 사용될 일 수 (글타래가 작성된 이후부터)"
delete_user_max_post_age: "(x)일 이전의 첫 글가 있는 유저는 삭제할 수 없음."
delete_all_posts_max: "전체 글 지우기 버튼을 통해 한번에 삭제할 수 있는 최대 글 수. 만약 사용자가 이것보다 많은 글을 가지고 있으면 한번에 삭제 할 수 없다."
username_change_period: "등록 후 사용자 이름 최소 유지 일 수(0은 사용자 이름 변경을 막음)"
email_editable: "가입 후 이메일 주소 변경 허용"
+ logout_redirect: "로그아웃 후에 리디렉션할 위치 (예: http://somesite.com/logout)"
+ allow_uploaded_avatars: "사용자가 커스텀 프로필 사진을 올릴 수 있도록 허용."
+ allow_animated_avatars: "사용자가 프로필 사진으로 애니메이션 GIF 파일을 올릴 수 있도록 허용. 경고: 이 설정을 바꾼 후 avatars:refresh rake task 를 실행."
allow_animated_thumbnails: "움직이는 gif로 썸네일을 만듭니다."
default_avatars: "신규가입자가 받게될 기본 아바타 URL"
automatically_download_gravatars: "사용자가 계정을 만들거나 이메일을 변경하자마자 Gravatar를 다운로드합니다."
+ digest_topics: "요약 이메일에 표시할 인기 토픽의 최대 개수."
+ digest_posts: "요약 이메일에 표시할 인기 포스트의 최대 개수."
+ digest_other_topics: "요약 이메일의 '신규 토픽과 팔로우하는 카테고리'에 표시되는 토픽의 최대 개수."
+ digest_min_excerpt_length: "요약 이메일에서 발췌된 포스트의 최소 표시 글자 수."
+ suppress_digest_email_after_days: "(n) 일 이상 사이트를 방문하지 않은 사용자에게는 요약 이메일 보내지 않기."
+ digest_suppress_categories: "요약 이메일에서 이 카테고리 숨기기."
disable_digest_emails: "모든 사용자에게 요약 이메일 전송 해제하기"
+ email_accent_bg_color: "강조 색상은 HTML 이메일의 몇몇 요소의 배경색상으로 사용됩니다. 색상명('red')이나 hex 값('#FF0000')을 입력하세요."
+ email_accent_fg_color: "텍스트 컬러는 HTML 이메일의 배경색상으로 렌더링됩니다. 색상명('white')나 hex값('#FFFFFF')을 입력하세요."
+ email_link_color: "HTML 이메일의 링크 색상. 색상명('blue')나 hex값('#0000FF')를 입력하세요."
+ detect_custom_avatars: "사용자가 커스텀 프로필 사진을 올렸는지의 체크 여부."
max_daily_gravatar_crawls: "하루에 Discourse가 커스텀 아파타를 위해 Gravatar를 체크하는 최대 횟수"
public_user_custom_fields: "유저가 쓸 수 있는 공개 커스텀 필드 목록"
staff_user_custom_fields: "스태프가 쓸 수 있는 공개 커스텀 필드 목록"
- enable_user_directory: "전체 유저 둘러보기 목록 제공"
+ enable_user_directory: "브라우징을 위한 유저의 디렉토리 제공"
+ enable_group_directory: "브라우징을 위한 그룹의 디렉토리 제공"
allow_anonymous_posting: "익명 모드 허용"
anonymous_posting_min_trust_level: "익명 게시 할 수 있는 최소 회원등급"
anonymous_account_duration_minutes: "한 익명이 익명계정을 만들 때 빨리 만드는 걸 막을 분 단위 시간 예: 600으로 정해놓으면 마지막 게시하고 익명 전환 후로 600분이 지나는 즉시 새 계정이 만들어 집니다."
+ hide_user_profiles_from_public: "익명사용자의 사용자 카드, 사용자 프로필, 사용자 디렉토리 해제."
+ user_website_domains_whitelist: "이 목록에 속한 도메인으로는 개인 웹사이트 등록 불가함. ` | `를 구분자로 한 목록."
allow_profile_backgrounds: "사용자에게 프로필 배경 이미지 업로드를 허용합니다."
+ sequential_replies_threshold: "너무 많은 연속 댓글을 달고 있다고 경고를 받지 않고 사용자가 연달아 쓸 수 있는 포스트 수."
+ get_a_room_threshold: "경고를 받지 않고, 같은 토픽에서 같은 사람에게 보낼 수 있는 허용 포스트 수."
enable_mobile_theme: "모바일 디바이스는 모바일 환경에 친화적인 테마를 사용합니다, 그리고 PC용 화면으로 전환할 수 있습니다. 만약 커스텀 스타일 시트를 사용한다면 이것을 비활성화 시키세요."
dominating_topic_minimum_percent: "한 글타래에서 한 사용자의 영향력을 결정하는 글 수의 퍼센트"
+ disable_avatar_education_message: "아바타 변경 교육 메시지 해제."
suppress_uncategorized_badge: "글타래 리스트에서 카테고리가 없는 글타래에 대한 훈장을 보여주지 않는다."
+ permalink_normalizations: "퍼마링크를 매칭하기 전에 다음 정규표현식을 적용. 예: /(topic.*)\\?.*/\\1 를 적용하면 토픽 루트에서 퀴리 스트링을 뽑아냅니다. 캡쳐된 값에 접근하려면 정규표현식+스트링 형식에 \\1 등을 사용하면 됩니다."
global_notice: "긴급, 비상 전체 배너를 모든 방문자에게 표시합니다. 숨기려면 빈칸으로 바꾸면 됩니다(HTML 허용)."
disable_edit_notifications: "'download_remote_images_to_local'가 활성화되있으면 시스템 사용자에 의한 수정 알림을 비활성화합니다."
+ automatically_unpin_topics: "사용자가 하단에 도달하면 토픽 고정을 자동 해제."
+ read_time_word_count: "읽은 시간 추정치 계산을 위한 1분 당 워드 카운트."
share_anonymized_statistics: "익명화된 사용 통계 공유하기"
full_name_required: "사용자 프로필에서 실명을 필수 입력 항목으로 설정"
enable_names: "사용자의 실명을 프로필, 사용자카드, 이메일에서 표시함. 실명을 표시하지 않으려면 체크를 해제하세요."
diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml
index bdf16364395..84074ab6c97 100644
--- a/config/locales/server.pl_PL.yml
+++ b/config/locales/server.pl_PL.yml
@@ -1348,40 +1348,8 @@ pl_PL:
subject_template: "Potwierdź, że nie chcesz już otrzymywać powiadomień mailowych ze strony %{site_title}"
invite_mailer:
subject_template: "%{invitee_name} zaprosił cię do '%{topic_title}' na %{site_domain_name}"
- text_body_template: |
- %{invitee_name} zaprosił cię do dyskusji
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- w serwisie
-
- > %{site_title} -- %{site_description}
-
- Jeśli jesteś zainteresowany, kliknij w link:
-
- %{invite_link}
custom_invite_mailer:
subject_template: "%{invitee_name} zaprosił cię do dyskusji '%{topic_title}' w serwisie %{site_domain_name}"
- text_body_template: |
- %{invitee_name} zaprosił cię do dyskusji
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- w serwisie
-
- > %{site_title} -- %{site_description}
-
- Informacja od zapraszającego:
-
- > %{user_custom_message}
-
- Jeśli jesteś zainteresowany, kliknij w link:
-
- %{invite_link}
invite_forum_mailer:
subject_template: "%{invitee_name} zaprosił cię do dołączenia do %{site_domain_name}"
text_body_template: |
@@ -1656,25 +1624,6 @@ pl_PL:
visit_link_to_respond: "[Zobacz Temat](%{base_url}%{url}) aby odpowiedzieć."
visit_link_to_respond_pm: "[Zobacz wiadomość](%{base_url}%{url}) aby odpowiedzieć."
posted_by: "Dodany przez %{username} w dniu %{post_date}"
- invited_to_private_message_body: |
- %{username} zaprosił cię do wiadomści
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- w
-
- > %{site_title} -- %{site_description}
- invited_to_topic_body: |
- %{username} zaprosił cię do dyskusji
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- w
-
- > %{site_title} -- %{site_description}
user_invited_to_private_message_pm:
title: "Użytkownik zaprosił do PW"
text_body_template: |
diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml
index 3f859154d67..7968d800baf 100644
--- a/config/locales/server.pt.yml
+++ b/config/locales/server.pt.yml
@@ -27,29 +27,35 @@ pt:
topics: "Tópicos"
posts: "mensagens"
loading: "A carregar"
+ powered_by_html: 'Desenvolvido por Discourse, e melhor visualização com o JavaScript ativado'
log_in: "Iniciar Sessão"
- purge_reason: "Conta removida automaticamente como conta abandonada, desactivada."
- disable_remote_images_download_reason: "O download remoto de imagens foi desativado por não haver espaço disponível no disco."
+ purge_reason: "Eliminada automaticamente como abandonada, conta desativada"
+ disable_remote_images_download_reason: "A transferência remota de imagens foi desativada por não haver espaço disponível no disco."
anonymous: "Anónimo"
+ remove_posts_deleted_by_author: "Eliminado pelo autor"
+ themes:
+ bad_color_scheme: "Não é possível atualizar o tema, esquema de cor inválido"
+ other_error: "Ocorreu algo de errado ao atualizar o tema"
emails:
incoming:
+ default_subject: "Este tópico precisa de um título"
show_trimmed_content: "Mostrar conteúdo aparado"
- maximum_staged_user_per_email_reached: "Foi atingido o número máximo de utilizadores temporários por email."
+ maximum_staged_user_per_email_reached: "Foi atingido o número máximo de utilizadores temporários criados por e-mail."
errors:
empty_email_error: "Acontece quando a informação não processada do email recebido veio em branco."
- no_message_id_error: "Acontece quando o email recebido não tem 'Message-Id' no cabeçalho da mensagem."
+ no_message_id_error: "Acontece quando o e-mail não tem 'Id. de Mensagem' no cabeçalho."
auto_generated_email_error: "Acontece quando o cabeçalho 'precedence' é definida como: 'list', 'junk' ou 'auto_reply', ou quando algum cabeçalho contém: 'auto-submitted', 'auto-replied' ou 'auto-generated'."
- no_body_detected_error: "Acontece quando conseguimos obter um corpo de mensagem e não existem anexos."
- inactive_user_error: "Acontece quando o remetente não está activo."
- blocked_user_error: "Acontece quando o remetente está bloqueado."
+ no_body_detected_error: "Acontece quando nós não conseguimos extrair um corpo e não existiam anexos."
+ inactive_user_error: "Acontece quando o remetente não está ativo."
+ blocked_user_error: "Acontece quando o remetente foi bloqueado."
bad_destination_address: "Acontece quando nenhum dos endereços de email nos campos para/cc/bcc coincide com um endereço de email configurado."
- strangers_not_allowed_error: "Acontece quando um utilizador tenta criar um tópico numa categoria da qual não é membro."
- insufficient_trust_level_error: "Acontece quando um utilizador tentar criar um tópico numa categoria para a qual não tem o nível de confiança necessário."
- reply_user_not_matching_error: "Acontece quando uma resposta veio de um endereço de email diferente do destinatário da notificação."
- topic_not_found_error: "Acontece quando a resposta veio de um tópico relacionado mas o tópico relacionado foi apagado."
- topic_closed_error: "Acontece quando uma resposta chegou mas o tópico relacionado foi fechado."
- bounced_email_error: "O email é um relatório de email redirecionado."
- screened_email_error: "Acontece quando a morada de email da pessoa que o enviou já foi confirmada."
+ strangers_not_allowed_error: "Acontece quando um utilizador tentou criar um novo tópico numa categoria em que não é membro."
+ insufficient_trust_level_error: "Acontece quando um utilizador tentou criar um novo tópico numa categoria em que não tem o nível de confiança necessário."
+ reply_user_not_matching_error: "Acontece quando uma resposta veio de um endereço de e-mail diferente de onde a notificação foi enviada."
+ topic_not_found_error: "Acontece quando é recebida uma resposta, mas que o tópico relacionado foi eliminado."
+ topic_closed_error: "Acontece quando é recebida uma resposta, mas que o tópico relacionado foi encerrado."
+ bounced_email_error: "A mensagem é um relatório de mensagem redirecionado."
+ screened_email_error: "Acontece quando o endereço de e-mail do remetente já foi confirmado."
errors: &errors
format: '%{attribute} %{message}'
messages:
@@ -103,6 +109,8 @@ pt:
max_username_length_range: "Não pode definir o máximo abaixo do mínimo."
default_categories_already_selected: "Não pode selecionar uma categoria usada noutra lista."
s3_upload_bucket_is_required: "Não pode ativar carregamentos para o S3 excepto se tiver fornecido o 's3_upload_bucket'."
+ invite:
+ not_found: "O seu código de convite é inválido. Por favor, contacte o administrador do site."
bulk_invite:
file_should_be_csv: "O ficheiro carregado deve ser do formato CSV."
error: "Ocorreu um erro ao carregar esse ficheiro. Por favor tente mais tarde."
@@ -125,6 +133,8 @@ pt:
embed:
start_discussion: "Iniciar Discussão"
continue: "Continuar Discussão"
+ no_hosts: "Não foram configurados anfitriões para incorporar."
+ configure: "Configurar Incorporação"
more_replies:
one: "mais 1 resposta"
other: "mais %{count} respostas"
@@ -158,6 +168,7 @@ pt:
spamming_host: "Pedimos desculpa, não pode colocar uma hiperligação para esse servidor."
user_is_suspended: "Utilizadores suspensos não têm permissão para publicar."
topic_not_found: "Algo de errado ocorreu. Talvez este tópico tenha sido fechado ou eliminado enquanto olhava para ele?"
+ not_accepting_pms: "Desculpe, de momento, %{username} não está a aceitar mensagens."
just_posted_that: "é demasiado semelhante ao que publicaste recentemente"
invalid_characters: "contem caracteres inválidos"
is_invalid: "parece pouco claro, é uma frase completa?"
@@ -177,6 +188,12 @@ pt:
latest: "Tópicos recentes"
hot: "Tópicos quentes"
top: "Melhores tópicos"
+ top_all: "Melhores tópicos de todos os tempos"
+ top_yearly: "Melhores tópicos do ano"
+ top_quarterly: "Melhores tópicos do trimestre"
+ top_monthly: "Melhores tópicos do mês"
+ top_weekly: "Melhores tópicos da semana"
+ top_daily: "Melhores tópicos do dia"
posts: "Últimas mensagens"
private_posts: "Mensagens privadas recentes"
group_posts: "Mensagens recentes em %{group_name}"
@@ -190,6 +207,8 @@ pt:
queue:
delete_reason: "Eliminado através da fila de moderação de mensagens"
groups:
+ success:
+ bulk_add: "%{users_added}utilizadores foram adicionados ao grupo."
errors:
can_not_modify_automatic: "Não pode modificar um grupo automático"
member_already_exist: "'%{username}' já é membro deste grupo."
@@ -197,6 +216,7 @@ pt:
invalid_incoming_email: "'%{email}' não é um endereço de email válido."
email_already_used_in_group: "'%{email}' já é utilizado pelo grupo '%{group_name}'."
email_already_used_in_category: "'%{email}' já é utilizado pela categoria '%{category_name}'."
+ cant_allow_membership_requests: "Não pode permitir pedidos de adesão para um grupo sem quaisquer donos."
default_names:
everyone: "todos"
admins: "administradores"
@@ -207,6 +227,9 @@ pt:
trust_level_2: "nivel_de_confianca_2"
trust_level_3: "nivel_de_confianca_3"
trust_level_4: "nivel_de_confianca_4"
+ request_membership_pm:
+ title: "Pedido de Adesão para @%{group_name}"
+ body: "Eu gostaria de de solicitar a adesão em @%{group_name}."
education:
until_posts:
one: "1 mensagem"
@@ -261,16 +284,28 @@ pt:
same_as_username: "é a mesma que o seu nome de utilizador. Por favor utilize uma palavra-passe mais segura."
same_as_email: "é a mesma que o seu email. Por favor utilize uma palavra-passe mais segura."
same_as_current: "é a mesma que a sua palavra-passe atual."
+ unique_characters: "tem demasiados carateres repetidos. Por favor, utilize uma palavra-passe mais segura."
ip_address:
signup_not_allowed: "A inscrição não é permitida através desta conta."
color_scheme_color:
attributes:
hex:
invalid: "não é uma cor válida"
+ post_reply:
+ base:
+ different_topic: "A publicação e a resposta devem pertencer ao mesmo tópico."
web_hook:
attributes:
payload_url:
invalid: "URL inválido. O URL deve incluir http:// ou https://. E espaços não são permitidos."
+ custom_emoji:
+ attributes:
+ name:
+ taken: já está a ser utilizado por outro emoji
+ topic_timer:
+ attributes:
+ execute_at:
+ in_the_past: "deve estar no futuro."
<<: *errors
user_profile:
no_info_other: "
%{name} ainda não colocou nada no campo Sobre Mim
"
@@ -280,6 +315,9 @@ pt:
meta_category_description: "Discussão sobre este sítio, a sua organização, como funciona, e como podemos melhorá-lo."
staff_category_name: "Pessoal"
staff_category_description: "Categoria privada para discussões do pessoal. Os tópicos estão apenas visíveis para administradores e moderadores."
+ assets_topic_title: "Ativos para o desenho do site"
+ discourse_welcome_topic:
+ title: "Bem-vindo ao Discourse"
lounge_welcome:
title: "Bem-vindo ao Salão"
body: |2+
@@ -433,6 +471,8 @@ pt:
other: "há quase %{count} anos atrás"
password_reset:
no_token: "Desculpe, essa hiperligação para alterar a palavra-passe é muito antiga. Selecione o botão Iniciar Sessão e utilize 'Esqueci a minha palavra-passe' para obter uma nova hiperligação."
+ choose_new: "Escolha uma nova palavra-passe"
+ choose: "Escolha uma palavra-passe"
update: 'Atualizar Palavra-passe'
save: 'Definir Palavra-passe'
title: 'Redefinir Palavra-passe'
@@ -455,43 +495,58 @@ pt:
welcome_to: "Bem-vindo a %{site_name}!"
approval_required: "Um moderador tem que aprovar a sua conta antes de poder aceder a este fórum. Irá receber um email quando a sua conta for aprovada!"
missing_session: "Não conseguimos detectar se a sua conta foi criada, pelo que pedimos que confirme que tem os cookies permitidos."
+ activated: "Desculpe, esta conta já foi ativada."
+ admin_confirm:
+ title: "Confirmar Conta de Administrador"
+ description: "Tem a certeza que o %{target_username} seja um administrador?"
+ grant: "Conceder Acesso de Administrador"
+ complete: "%{target_username} é agora um administrador."
+ back_to: "Voltar a %{title}"
post_action_types:
off_topic:
title: 'Fora de Contexto'
description: 'Esta mensagem não é relevante para a discussão corrente, conforme definido pelo título e pela primeira mensagem, e provavelmente deverá ser transferida para outro tópico.'
+ short_description: 'Não é relevante para a discussão'
long_form: 'sinalizou isto como fora de contexto'
spam:
title: 'Spam'
+ short_description: 'É um anúncio ou vandalismo'
long_form: 'sinalizou isto como spam'
email_title: '"%{title}" foi sinalizado como spam'
email_body: "%{link}\n\n%{message}"
inappropriate:
title: 'Inapropriado'
description: 'Esta mensagem contém conteúdo que uma pessoa sensata iria considerar ofensivo, abusivo, ou como uma violação das orientações da nossa comunidade.'
+ short_description: 'Uma violação das nossas orientações da comunidade'
long_form: 'sinalizou isto como inapropriado'
notify_user:
title: 'Enviar uma mensagem a @{{username}}'
description: 'Quero falar com esta pessoa diretamente e em privado acerca da sua mensagem.'
+ short_description: 'Eu quero falar com esta pessoa diretamente e em privado sobre a sua publicação.'
long_form: 'utilizador com mensagens'
email_title: 'A sua mensagem em "%{title}"'
email_body: "%{link}\n\n%{message}"
notify_moderators:
title: "Algo Mais"
description: 'Esta mensagem requer a atenção do pessoal por outra razão não listada acima.'
+ short_description: 'Requer a atenção da equipa por outra razão'
long_form: 'marcou isto para ser alvo da atenção do pessoal'
email_title: 'Uma mensagem em "%{title}" requer a atenção do pessoal'
email_body: "%{link}\n\n%{message}"
bookmark:
title: 'Adicionar Marcador'
description: 'Adicionar um marcador a esta mensagem'
+ short_description: 'Adicionar esta publicação aos marcadores'
long_form: 'adicionou um marcador a esta mensagem'
like:
title: 'Gostar'
description: 'Gostar desta mensagem'
+ short_description: 'Gostar desta publicação'
long_form: 'gostou disto'
vote:
title: 'Votar'
description: 'Votar nesta mensagem'
+ short_description: 'Votar para esta publicação'
long_form: 'votou nesta mensagem'
user_activity:
no_bookmarks:
@@ -1708,29 +1763,6 @@ pt:
visit_link_to_respond: "[Visitar Tópico](%{base_url}%{url}) para responder."
visit_link_to_respond_pm: "[Visitar Mensagem](%{base_url}%{url}) para responder."
posted_by: "Publicado por %{username} em %{post_date}"
- invited_to_private_message_body: |+
- %{username} convidou-o para uma mensagem
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- at
-
- > %{site_title} -- %{site_description}
-
- invited_to_topic_body: |+
- %{username} convidou-o para uma discussão
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- em
-
- > %{site_title} -- %{site_description}
-
-
user_invited_to_private_message_pm:
text_body_template: |
%{header_instructions}
diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml
index 1450f873a77..873cf7e69ad 100644
--- a/config/locales/server.pt_BR.yml
+++ b/config/locales/server.pt_BR.yml
@@ -1339,16 +1339,6 @@ pt_BR:
visit_link_to_respond: "[Visite o Tópico](%{base_url}%{url}) para responder."
visit_link_to_respond_pm: "[Visite o Mensagem](%{base_url}%{url}) para responder."
posted_by: "Postado por %{username} em %{post_date}"
- invited_to_topic_body: |
- %{username} convidou você para uma discussão
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- em
-
- > %{site_title} -- %{site_description}
user_invited_to_private_message_pm:
text_body_template: |
%{header_instructions}
diff --git a/config/locales/server.ro.yml b/config/locales/server.ro.yml
index e4413b92537..7bb1d31006d 100644
--- a/config/locales/server.ro.yml
+++ b/config/locales/server.ro.yml
@@ -1799,26 +1799,6 @@ ro:
visit_link_to_respond: "[Vizitează subiect](%{base_url}%{url}) pentru a răspunde."
visit_link_to_respond_pm: "[Vizitează subiect](%{base_url}%{url}) pentru a răspunde."
posted_by: "Postat de %{username} pe data %{post_date}"
- invited_to_private_message_body: |
- %{username} te-a invitat la un mesaj
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- pe
-
- > %{site_title} -- %{site_description}
- invited_to_topic_body: |
- %{username} te-a invitat la o discuție
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- pe
-
- > %{site_title} -- %{site_description}
user_invited_to_private_message_pm:
text_body_template: |
%{header_instructions}
diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml
index c624ff9a904..121a6b47670 100644
--- a/config/locales/server.ru.yml
+++ b/config/locales/server.ru.yml
@@ -32,6 +32,9 @@ ru:
disable_remote_images_download_reason: "Загрузка картинок была отключена из-за недостаточности места на диске."
anonymous: "Гость"
remove_posts_deleted_by_author: "Удалено автором"
+ themes:
+ bad_color_scheme: "Не могу обновить стиль, неверная цветовая гамма"
+ other_error: "Что-то пошло не так, при обновление стиля"
emails:
incoming:
default_subject: "Для темы необходим заголовок"
@@ -1261,6 +1264,7 @@ ru:
incorrect_username_email_or_password: "Неверное имя пользователя, адрес электронной почты или пароль"
wait_approval: "Спасибо за регистрацию. Мы оповестим вас, когда ваша учетная запись будет одобрена."
active: "Ваша учетная запись активирована и готова к использованию."
+ activate_email: "
Почти готово! Мы выслали письмо на %{email}. Пожалуйста, следуйте инструкциям в этом письме для активации вашей учетной записи.
Если письмо не пришло, пожалуйста, проверьте папку \"спам\", или попробуйте войти еще раз, чтобы выслать активационное письмо повторно.
"
not_activated: "Вы пока что не можете войти на сайт. Пожалуйста, следуйте инструкциям по активации учетной записи, которые мы отправили вам по электронной почтой."
not_allowed_from_ip_address: "Вход с этого IP в качестве пользователя %{username} запрещен."
admin_not_allowed_from_ip_address: "Вход с этого IP в качестве администратора запрещен."
diff --git a/config/locales/server.sq.yml b/config/locales/server.sq.yml
index 2e2d4eb90aa..1f5f989fb92 100644
--- a/config/locales/server.sq.yml
+++ b/config/locales/server.sq.yml
@@ -1040,26 +1040,6 @@ sq:
visit_link_to_respond: "[Shiko Temën](%{base_url}%{url}) për tu përgjigjur."
visit_link_to_respond_pm: "[Shiko Mesazhin](%{base_url}%/{url}) për tu përgjigjur."
posted_by: "Postuar nga %{username} më %{post_date}"
- invited_to_private_message_body: |
- %{username} ju ftoi tek mesazhi
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- në
-
- > %{site_title} -- %{site_description}
- invited_to_topic_body: |
- %{username} ju ftoi në një bisedë
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- tek
-
- > %{site_title} -- %{site_description}
user_invited_to_private_message_pm:
text_body_template: |
%{header_instructions}
diff --git a/config/locales/server.sv.yml b/config/locales/server.sv.yml
index e6242939a3d..9387c78ea48 100644
--- a/config/locales/server.sv.yml
+++ b/config/locales/server.sv.yml
@@ -1649,26 +1649,6 @@ sv:
visit_link_to_respond: "[Besök ämnet](%{base_url}%{url}) för att ge din respons. "
visit_link_to_respond_pm: "[Besök meddelanden](%{base_url}%{url}) för att ge din respons."
posted_by: "Postat av %{username} den %{post_date}"
- invited_to_private_message_body: |
- %{username} bjöd in dit till ett meddelande
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- vid
-
- > %{site_title} -- %{site_description}
- invited_to_topic_body: |
- %{username} bjöd in dig till en diskussion
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- vid
-
- > %{site_title} -- %{site_description}
user_invited_to_private_message_pm:
title: "Användare invitera personligt"
text_body_template: |
diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml
index 1e9ec205cb9..30d63f631a9 100644
--- a/config/locales/server.tr_TR.yml
+++ b/config/locales/server.tr_TR.yml
@@ -1324,26 +1324,6 @@ tr_TR:
visit_link_to_respond: "Cevaplamak için [konuyu ziyaret edin](%{base_url}%{url})."
visit_link_to_respond_pm: "Cevaplamak için [iletiyi ziyaret edin](%{base_url}%{url})."
posted_by: "%{post_date} tarihinde %{username} tarafından gönderildi"
- invited_to_private_message_body: |
- %{username} sizi bir iletiye davet etti
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- şurada
-
- > %{site_title} -- %{site_description}
- invited_to_topic_body: |
- %{username} sizi bir tartışmaya davet etti
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- şurada
-
- > %{site_title} -- %{site_description}
user_invited_to_private_message_pm:
text_body_template: |
%{header_instructions}
diff --git a/config/locales/server.vi.yml b/config/locales/server.vi.yml
index 346f3e56281..8445258d571 100644
--- a/config/locales/server.vi.yml
+++ b/config/locales/server.vi.yml
@@ -1285,26 +1285,6 @@ vi:
description: "Bạn không thích nhận mail giống mail này? Nhấn vào bỏ theo dõi để bỏ đăng ký ngay lập tức:"
only_reply_by_email: "Trả lời email này để phản hồi."
posted_by: "Đăng bởi %{{username} ngày %{post_date}"
- invited_to_private_message_body: |
- %{username} mời bạn xem
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- tại
-
- > %{site_title} -- %{site_description}
- invited_to_topic_body: |
- %{username} mời bạn thảo luận
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- tại
-
- > %{site_title} -- %{site_description}
user_posted_pm_staged:
subject_template: "%{optional_re}%{topic_title}"
digest:
diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml
index b81aabde716..4e788d4d501 100644
--- a/config/locales/server.zh_CN.yml
+++ b/config/locales/server.zh_CN.yml
@@ -1461,37 +1461,9 @@ zh_CN:
invite_mailer:
title: "要求发件人"
subject_template: "%{invitee_name} 邀请你参与 %{site_domain_name} 主题 '%{topic_title}' "
- text_body_template: |
- %{invitee_name}邀请你参与讨论:
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- 社区:
-
- > %{site_title} -- %{site_description}
-
- 如果你有兴趣,点击下方的链接:
-
- %{invite_link}
custom_invite_mailer:
title: "自定义邀请发件人"
subject_template: "%{invitee_name}邀请你'%{topic_title}'在%{site_domain_name}"
- text_body_template: |
- %{invitee_name}邀请你参与讨论:
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- 社区:
-
- > %{site_title} -- %{site_description}
-
- 如果你有兴趣,点击下方的链接:
-
- %{invite_link}
invite_forum_mailer:
title: "邀请论坛发件人"
subject_template: "%{invitee_name} 邀请你加入 %{site_domain_name}"
@@ -2032,26 +2004,6 @@ zh_CN:
visit_link_to_respond: "[访问主题](%{base_url}%{url})以回复."
visit_link_to_respond_pm: "[访问私信](%{base_url}%{url})以回复."
posted_by: "%{username}发表于%{post_date}"
- invited_to_private_message_body: |
- %{username} 邀请你至私信交流:
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- 论坛:
-
- > %{site_title} -- %{site_description}
- invited_to_topic_body: |
- %{username} 邀请你参与讨论:
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- 论坛:
-
- > %{site_title} -- %{site_description}
user_invited_to_private_message_pm:
title: "邀请用户至私信"
subject_template: "[%{email_prefix}] %{username}邀请你至私信“%{topic_title}”"
diff --git a/config/locales/server.zh_TW.yml b/config/locales/server.zh_TW.yml
index 16962647e74..bd0659b5795 100644
--- a/config/locales/server.zh_TW.yml
+++ b/config/locales/server.zh_TW.yml
@@ -1374,41 +1374,9 @@ zh_TW:
invite_mailer:
title: "邀請 Mailer"
subject_template: "%{invitee_name} 邀請你參與在 %{site_domain_name} 討論的話題 '%{topic_title}'"
- text_body_template: |
- %{invitee_name} 邀請你參與位於
-
- > %{site_title} -- %{site_description}
-
- 的以下討論
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- 如果你有興趣,請點擊下面的連結:
-
- %{invite_link}
custom_invite_mailer:
title: "客製邀請 Mailer"
subject_template: "%{invitee_name}邀請你'%{topic_title}'在%{site_domain_name}"
- text_body_template: |
- %{invitee_name} 留下以下留言
-
- > %{user_custom_message}
-
- 邀請你參與位於
-
- > %{site_title} -- %{site_description}
-
- 的討論
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- 如果你有興趣,請點擊下面的連結:
-
- %{invite_link}
invite_forum_mailer:
title: "邀請論壇 Mailer"
subject_template: "%{invitee_name} 邀請你加入 %{site_domain_name}"
@@ -1857,26 +1825,6 @@ zh_TW:
visit_link_to_respond: "[訪問主題](%{base_url}%{url})以回覆。"
visit_link_to_respond_pm: "[訪問\"私訊\"](%{base_url}%{url})以回覆。"
posted_by: "由 %{username} 張貼於 %{post_date}"
- invited_to_private_message_body: |
- %{username} 邀請你至消息交流:
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- 論壇:
-
- > %{site_title} -- %{site_description}
- invited_to_topic_body: |
- %{username} 邀請你參與討論:
-
- > **%{topic_title}**
- >
- > %{topic_excerpt}
-
- 論壇:
-
- > %{site_title} -- %{site_description}
user_invited_to_private_message_pm:
title: "用戶被邀請至私人訊息"
text_body_template: |
diff --git a/plugins/discourse-narrative-bot/config/locales/client.ja.yml b/plugins/discourse-narrative-bot/config/locales/client.ja.yml
index 8c2dc009047..3f573c644f3 100644
--- a/plugins/discourse-narrative-bot/config/locales/client.ja.yml
+++ b/plugins/discourse-narrative-bot/config/locales/client.ja.yml
@@ -5,4 +5,9 @@
# To work with us on translations, join this project:
# https://www.transifex.com/projects/p/discourse-org/
-ja: {}
+ja:
+ js:
+ discourse_narrative_bot:
+ welcome_post_type:
+ new_user_track: "全ての新規ユーザーのためにチュートリアルを開始します"
+ welcome_message: "全ての新規ユーザーにクイックスタートガイド付きのウェルカムメッセージを送信します"
diff --git a/plugins/discourse-narrative-bot/config/locales/client.pl_PL.yml b/plugins/discourse-narrative-bot/config/locales/client.pl_PL.yml
index feb22a4d65c..db756af6e9b 100644
--- a/plugins/discourse-narrative-bot/config/locales/client.pl_PL.yml
+++ b/plugins/discourse-narrative-bot/config/locales/client.pl_PL.yml
@@ -9,5 +9,5 @@ pl_PL:
js:
discourse_narrative_bot:
welcome_post_type:
- new_user_track: "Rozpocznij poradnik nowego użytkownika dla wszystkich nowych użytkownikó"
+ new_user_track: "Rozpocznij poradnik nowego użytkownika dla wszystkich nowych użytkowników"
welcome_message: "Wyślij wszystkim nowym użytkownikom wiadomość powitalną z szybkim przewodnikiem"
diff --git a/plugins/discourse-narrative-bot/config/locales/server.cs.yml b/plugins/discourse-narrative-bot/config/locales/server.cs.yml
index c0f2fec763b..e6fc1ed2bac 100644
--- a/plugins/discourse-narrative-bot/config/locales/server.cs.yml
+++ b/plugins/discourse-narrative-bot/config/locales/server.cs.yml
@@ -5,4 +5,93 @@
# To work with us on translations, join this project:
# https://www.transifex.com/projects/p/discourse-org/
-cs: {}
+cs:
+ badges:
+ certified:
+ name: Certifikován
+ description: "Dokončil náš tutorial pro nové uživatele"
+ discourse_narrative_bot:
+ dice:
+ trigger: "hodit"
+ invalid: |-
+ Omlouvám se, ale je matematicky nemožné hodit s touhle kombinací kostek. :confounded:
+ not_enough_dice: |-
+ Mám jen %{num_of_dice} kostek. Naprosto [ostudné](http://www.therobotsvoice.com/2009/04/the_10_most_shameful_rpg_dice.php).
+ out_of_range: |-
+ Víš, že [maximální počet stěn](https://www.wired.com/2016/05/mathematical-challenge-of-designing-the-worlds-most-complex-120-sided-dice) pro matematicky férovou kostku je 120?
+ results: |-
+ > :game_die: %{results}
+ quote:
+ trigger: "citát"
+ '1':
+ author: "Albert Einstein"
+ '2':
+ author: "Mahatma Gandhi"
+ '3':
+ author: "Dr Seuss"
+ '4':
+ author: "Charles-Guillaume Étienne"
+ '5':
+ author: "Theodore Roosevelt"
+ '6':
+ author: "Máma Forresta Gumpa"
+ '7':
+ author: "Neil Armstrong"
+ '8':
+ author: "Eleanor Roosevelt"
+ '9':
+ author: "Bruce Lee"
+ '10':
+ author: "Napoleon Hill"
+ results: |-
+ > :left_speech_bubble: _%{quote}_ — %{author}
+ magic_8_ball:
+ answers:
+ '1': "To je jisté"
+ '2': "Naprostá pravda"
+ '3': "Bez zaváhání"
+ '4': "Rozhodně ano"
+ '5': "Na to se můžeš spolehnout"
+ '6': "Podle mě ano"
+ '7': "Asi jo"
+ '8': "Vypadá to dobře"
+ '9': "Ano"
+ '10': "Dle znamení ano"
+ '11': "Odpověď nejistá, zeptej se znovu"
+ '12': "Zeptej se jindy"
+ '13': "To ti teď raději neřeknu"
+ '14': "To nyní nedokážu předpovědět"
+ '15': "Soustřeď se a zeptej se znovu"
+ '16': "S tím nepočítej"
+ '17': "Moje odpověď zní ne"
+ '18': "Dle mých zdrojů ne"
+ '19': "To nevypadá dobře"
+ '20': "To sotva"
+ result: |-
+ > :crystal_ball: %{result}
+ track_selector:
+ reset_trigger: 'začít'
+ skip_trigger: 'přeskočit'
+ help_trigger: 'zobrazit nápovědu'
+ random_mention:
+ reply: |-
+ Ahoj! Pokud chceš zjistit, co umím, napiš `@%{discobot_username} %{help_trigger}`.
+ tracks: |-
+ Zatím umím následující věci:
+
+ `@%{discobot_username} %{reset_trigger} %{default_track}`
+ > Začít jedním z následujících interaktivních průvodců: %{tracks}.
+ do_not_understand:
+ first_response: |-
+ Dík za odpověď!
+
+ Bohužel nejsem naprogramován nijak skvěle, takže jsem tomuhle neporozumněl. :frowning:
+ new_user_narrative:
+ reset_trigger: "nový uživatel"
+ hello:
+ title: ":robot: Zdravím!"
+ search:
+ not_found: |-
+ Hmm…vypadá to, že máš potíže. To mě mrzí. Hledal jsi pro výraz **capybara**?
+ advanced_user_narrative:
+ reset_trigger: 'pokročilý uživatel'
diff --git a/plugins/discourse-narrative-bot/config/locales/server.da.yml b/plugins/discourse-narrative-bot/config/locales/server.da.yml
index 9ca8189621d..482acc9a9ec 100644
--- a/plugins/discourse-narrative-bot/config/locales/server.da.yml
+++ b/plugins/discourse-narrative-bot/config/locales/server.da.yml
@@ -5,4 +5,30 @@
# To work with us on translations, join this project:
# https://www.transifex.com/projects/p/discourse-org/
-da: {}
+da:
+ badges:
+ certified:
+ name: Certificeret
+ description: "Fuldførte vores \"ny bruger\" vejledning"
+ licensed:
+ name: Licenseret
+ description: "Gennemført vores advancerede bruger vejledning"
+ discourse_narrative_bot:
+ bio: "Hej, jeg er ikke en rigtigt person. Jeg er en bot der kan lære dig om dette site. For at interaggere med mig, send mig en besked, eller nævn **`@%{discobot_username}`** overalt."
+ timeout:
+ message: |-
+ Hey @%{username}, jeg skriver fordi jeg ikke har hørt fra dig i et stykke tid.
+
+ - For at fortsætte, så kan du altid svare mig.
+
+ - Hvis du vil springe dette skridt over, så sig `%{skip_trigger}`.
+
+ - For at starte forfra, så sig `%{reset_trigger}`.
+
+ Hvis du helst vil være fri, så er det også okay. Jeg er en robot. Du sårer ikke mine følelser. :sob:
+ dice:
+ trigger: "Rul"
+ invalid: |-
+ Jeg beklager, det er matematisk umuligt at rulle den kombination af terninger. :confounded:
+ not_enough_dice: |-
+ I only have %{num_of_dice} dice. [Skamfuldt](http://www.therobotsvoice.com/2009/04/the_10_most_shameful_rpg_dice.php), jeg ved det!
diff --git a/plugins/discourse-narrative-bot/config/locales/server.es.yml b/plugins/discourse-narrative-bot/config/locales/server.es.yml
index dfa781c7b02..1e59bd0fb2e 100644
--- a/plugins/discourse-narrative-bot/config/locales/server.es.yml
+++ b/plugins/discourse-narrative-bot/config/locales/server.es.yml
@@ -28,14 +28,14 @@ es:
bio: "Hola, no soy una persona real. Soy un bot que puede enseñarte sobre este sitio. Para interactuar conmigo, me envías un mensaje o me mencionas **`@%{discobot_username}`** en cualquier lugar."
timeout:
message: |-
- Hey @%{username}, solo estoy verificando si estás porque no he oído de tí en un tiempo.
- - Para continuar, responde en cualquier momento.
+ Hola @%{username}, tan solo por ver si estás ahí, no he oído de ti en un tiempo.
+ - Para continuar, coméntame en cualquier momento.
- - Si gustas de saltar este paso, dime `%{skip_trigger}`.
+ - Si prefieres saltarte este paso, escribe `%{skip_trigger}`.
- - Para empezar de nuevo, dime `%{reset_trigger}`.
+ - Para empezar de nuevo, escribe `%{reset_trigger}`.
- Si prefieres no continuar, está OK también! Soy un robot. No herirás mis sentimientos. :sob:
+ Si prefieres no continuar, ¡perfecto! Soy un robot. No herirás mis sentimientos. :sob:
dice:
trigger: "tirar"
invalid: |-
@@ -43,40 +43,40 @@ es:
not_enough_dice: |-
Solo tengo %{num_of_dice} dados para jugar. Es vergonsozo lo sé!
out_of_range: |-
- ¿Sabías que el máximo número de lados para que un dado, matemáticamente correcto, es de 120 lados?
+ ¿Sabías que [el máximo número de lados](https://www.wired.com/2016/05/mathematical-challenge-of-designing-the-worlds-most-complex-120-sided-dice) para un dado matemáticamente correcto, es de 120?
results: |-
> :game_die: %{results}
quote:
trigger: "citar"
'1':
- quote: "In the middle of every difficulty lies opportunity"
+ quote: "Entre las dificultades se esconde la oportunidad"
author: "Albert Einstein"
'2':
- quote: "You must be the change you wish to see in the world."
+ quote: "Conviértete en el cambio que deseas ver en el mundo."
author: "Mahatma Gandhi"
'3':
- quote: "Don’t cry because it’s over, smile because it happened."
+ quote: "No llores porque terminó, sonríe porque sucedió."
author: "Dr Seuss"
'4':
- quote: "If you want something done right, do it yourself."
+ quote: "Si quieres algo bien hecho, hazlo tú mismo."
author: "Charles-Guillaume Étienne"
'5':
- quote: "Believe you can and you’re halfway there."
+ quote: "Cree en poder lograr algo y tendrás la mitad del camino hecho."
author: "Theodore Roosevelt"
'6':
- quote: "Life is like a box of chocolates. You never know what you’re gonna get."
- author: "Forrest Gump’s Mom"
+ quote: "La vida es como una caja de bombones, nunca sabes qué te va a tocar."
+ author: "La mamá de Forrest Gump"
'7':
- quote: "That’s one small step for a man, a giant leap for mankind."
+ quote: "Es un pequeño paso para un hombre, pero un gran salto para la humanidad."
author: "Neil Armstrong"
'8':
- quote: "Do one thing every day that scares you."
+ quote: "Todos los días haz algo que te dé miedo."
author: "Eleanor Roosevelt"
'9':
- quote: "Mistakes are always forgivable, if one has the courage to admit them."
+ quote: "Los errores son siempre perdonables, si uno tiene el coraje de admitirlos."
author: "Bruce Lee"
'10':
- quote: "Whatever the mind of man can conceive and believe, it can achieve."
+ quote: "Lo que la mente del hombre puede concebir y creer, es lo que la mente del hombre puede lograr."
author: "Napoleon Hill"
results: |-
> :left_speech_bubble: _%{quote}_ — %{author}
@@ -270,7 +270,7 @@ es:
- Notaste que hemos vuelto al comienzo del tema? Alimenta este pobre y hambriento capybara **respondiendo con el emoji `:herb:` ** y serás automáticamente enviado al final del tema.
+ Notaste que hemos vuelto al comienzo del tema? Alimenta este pobre y hambriento capybara **respondiendo con el emoji `:herb:`** y serás automáticamente enviado al final del tema.
reply: |-
Yay lo encontraste! :tada:
@@ -336,7 +336,8 @@ es:
Tenga en cuenta que sólo tiene 24 horas para recuperar una publicación.
category_hashtag:
instructions: |-
- ¿Sabía que puede hacer referencia a categorías y etiquetas en su publicación? Por ejemplo, has visto la %{category} categoría?
+ ¿Sabías que puedes hacer referencia a categorías y etiquetas en la publicación? Por ejemplo, has visto la categoría %{category}?
+
Escribe `#` en el medio de una oración y selecciona cualquier categoría o etiqueta.
not_found: |-
Hmm, no veo una categoría en ninguna parte. Nota que `#` no puede ser el primer carácter de la oración. ¿Puedes copiar esto en tu próxima respuesta?
@@ -349,12 +350,15 @@ es:
change_topic_notification_level:
instructions: |-
Cada tema tiene un nivel de notificación. Comienza en 'normal', lo que significa que normalmente sólo se notificará cuando alguien está hablando directamente con usted.
- De forma predeterminada, el nivel de notificación de un mensaje privado se establece en el nivel más alto de "observación", lo que significa que se le notificará cada nueva respuesta. Pero puede sobrescribir el nivel de notificación de _cualquier_ tema a 'vigilar', 'seguir' o 'silenciar'.
- Intentemos cambiar el nivel de notificación de este tema. Al final del tema, encontrarás un botón que muestra que estás **vigilando** este tema. ¿Puedes cambiar el nivel de notificación a **seguir**?
+
+ De forma predeterminada, el nivel de notificación de un mensaje privado se establece en el nivel más alto de 'observación', lo que significa que se le notificará cada nueva respuesta. Pero puede sobrescribir el nivel de notificación de _cualquier_ tema a 'vigilar', 'seguir' o 'silenciar'.
+
+ Intentemos cambiar el nivel de notificación de este tema. Al final de todo, encontrarás un botón que muestra que estás **vigilando** este tema. ¿Puedes cambiar el nivel de notificación a **seguir**?
not_found: |-
Parece que aún estás vigilando :eyes: este tema! Si tienes problemas para encontrar el botón del nivel de notificación, el mismo está debajo de todo el tema de debate.
reply: |-
¡Impresionante trabajo! Espero que no silencies este tema ya que puedo ser un poco hablador a veces :grin:.
+
Tenga en cuenta que cuando responde a un tema o lee un tema durante más de unos minutos, se establece automáticamente en un nivel de notificación de "seguimiento". Puedes cambiar esto en [tus preferencias de usuario](/my/preferences).
poll:
instructions: |-
diff --git a/plugins/discourse-narrative-bot/config/locales/server.it.yml b/plugins/discourse-narrative-bot/config/locales/server.it.yml
index 3c82b4c114f..e39d35d46cb 100644
--- a/plugins/discourse-narrative-bot/config/locales/server.it.yml
+++ b/plugins/discourse-narrative-bot/config/locales/server.it.yml
@@ -134,7 +134,7 @@ it:
Sfortunatamente, essendo un robot mal programmato, non l'ho capita bene. :frowning:
track_response: Puoi provare di nuovo, o se vuoi saltare questo passaggio, dimmi `%{skip_trigger}`. Altrimenti per ricominciare, dimmi `%{reset_trigger}`.
second_response: |-
- Aw, scusa. Non sto ancora capendo. :anguished:
+ Oh, scusa. Non sto ancora capendo. :anguished:
Sono solo un bot, ma se vuoi contattare una persona reale, guarda [la nostra pagina dei contatti](/about).
diff --git a/plugins/discourse-narrative-bot/config/locales/server.ja.yml b/plugins/discourse-narrative-bot/config/locales/server.ja.yml
index 8c2dc009047..7392733b527 100644
--- a/plugins/discourse-narrative-bot/config/locales/server.ja.yml
+++ b/plugins/discourse-narrative-bot/config/locales/server.ja.yml
@@ -5,4 +5,43 @@
# To work with us on translations, join this project:
# https://www.transifex.com/projects/p/discourse-org/
-ja: {}
+ja:
+ site_settings:
+ discourse_narrative_bot_enabled: 'ディスコースの自動ナレーターを許可してください。'
+ disable_discourse_narrative_bot_welcome_post: "ディスコースナレーター、ボットからのようこそ投稿を無効にしてください。"
+ discourse_narrative_bot_ignored_usernames: "ディスコースナレーター、ボットのユーザー名は気にするべきではありません。"
+ discourse_narrative_bot_disable_public_replies: "ディスコースナレーター、ボットからの返信を無効にして下さい。"
+ discourse_narrative_bot_welcome_post_delay: "ディスコースのナレーター、ボットのようこそ投稿を送信する前に(n)秒待ってください。"
+ badges:
+ certified:
+ name: 承認されました。
+ description: "新規ユーザーのチュートリアルが完了しました。"
+ long_description: |
+ このバッジは新規ユーザーチュートリアルの優れた結果のもと授与されました。あなたはディスカッションの基礎的なツールを学ぶための主導権を獲得したことが証明されました!
+ licensed:
+ name: 許可されました。
+ description: "上級のユーザーチュートリアルが完了しました。"
+ long_description: |
+ このバッジは上級ユーザーチュートリアルの優れた結果において授与されました。あなたは上級ディスカッションツールをマスターし、完全に許可されました。
+ discourse_narrative_bot:
+ bio: "初めまして。私は実在する人ではなく、このサイトについて教えることができるコンピュータプログラムです。私と情報交換するためにはメッセージを送信するか%{discobot_username}のどこかでちょっと話を出しておいて下さい。"
+ timeout:
+ message: |-
+ こんにちは%{username}、しばらく便りがなかったのでチェックをしているところです。
+
+ 続けるためには、私に時間のある時に返信してください。
+
+ もしこのステップをスキップしたい場合、%{skip_trigger}とおっしゃってください。
+
+ やり直したい場合、%{reset_trigger}とおっしゃってください。
+
+ 仮にこれらをしたくなくても、それもOKです。私はプログラムですから傷つきません。:くすん:
+ quote:
+ '1':
+ author: "アルベルト・アインシュタイン"
+ '2':
+ author: "マハトマガンジー"
+ '3':
+ quote: "終わったからと悲しまず、出会えたのだから微笑んでください。"
+ '4':
+ quote: "あなたが誰かに正しい行いを求めるのであれば、自分自身で行ってください。"
diff --git a/plugins/discourse-narrative-bot/config/locales/server.ko.yml b/plugins/discourse-narrative-bot/config/locales/server.ko.yml
index e89a8f37fb4..cd5eed86711 100644
--- a/plugins/discourse-narrative-bot/config/locales/server.ko.yml
+++ b/plugins/discourse-narrative-bot/config/locales/server.ko.yml
@@ -43,6 +43,8 @@ ko:
미안, 수학적으로 그 조합의 주사위는 돌릴 수 없어. :confounded:
not_enough_dice: |-
난 주사위 %{num_of_dice} 개밖에 안 남았어. [으으,](http://www.therobotsvoice.com/2009/04/the_10_most_shameful_rpg_dice.php), 그래, 나도 알아 안다고!
+ out_of_range: |-
+ 수학적으로 공평하면서도 [가장 큰 수](https://www.wired.com/2016/05/mathematical-challenge-of-designing-the-worlds-most-complex-120-sided-dice)를 가진 주사위의 면 수가 120이라는 거 아니?
results: |-
> :game_die: %{results}
quote:
@@ -82,26 +84,26 @@ ko:
magic_8_ball:
trigger: '운세'
answers:
- '1': "그것은 틀림없이"
- '2': "그건 확실히"
- '3': "의심 없이"
- '4': "응, 당연히"
- '5': "날 믿어도 돼"
- '6': "내가 보기에는 그래"
- '7': "분명히"
- '8': "나쁘지 않아"
- '9': "응"
- '10': "정황을 살펴보니 'Yes'야"
- '11': "모호한 답변이야. 다시 해보렴."
- '12': "다음에 다시 물어봐"
- '13': "지금은 알려주지 않는 게 좋겠어"
- '14': "지금은 예측할 수 없어"
- '15': "정신차리고 다시 물어보렴"
- '16': "너무 믿지는 말고"
- '17': "내 답은 'No'야"
- '18': "내 정보에 의하면 'No'야"
- '19': "전망이 별로"
- '20': "매우 의심스럽군"
+ '1': "이건 확실해."
+ '2': "이건 분명히 돼."
+ '3': "의심할 여지가 없지."
+ '4': "응, 당연히 그래."
+ '5': "믿어도 좋아."
+ '6': "맞아."
+ '7': "거의 확실해."
+ '8': "좋을 전망."
+ '9': "응."
+ '10': "괜찮아 보이는군."
+ '11': "흐릿하게 보이는군. 다시..."
+ '12': "다음에 다시 물어봐."
+ '13': "지금은 말하지 않는 편이 낫겠어."
+ '14': "지금은 예측할 수 없어."
+ '15': "집중해서 다시 물어봐."
+ '16': "꿈도 꾸지마."
+ '17': "내 대답은 '아니다'야."
+ '18': "내 정보에 의하면 '아니오'야."
+ '19': "안좋을 전망."
+ '20': "아주 의심스러워."
result: |-
> :crystal_ball: %{result}
track_selector:
@@ -111,6 +113,20 @@ ko:
random_mention:
reply: |-
내가 뭘 할 수 있는지 알고 싶다면 `@%{discobot_username} %{help_trigger}` 라고 말하렴.
+ tracks: |-
+ 나는 아래의 일을 할 수 있어.
+
+ `@%{discobot_username} %{reset_trigger} %{default_track}`
+ > 아래의 서로 이야기하기 중 하나를 골라서 시작해봐. %{tracks}.
+ bot_actions: |-
+ `@%{discobot_username} %{dice_trigger} 2d6`
+ > :game_die: 3, 6
+
+ `@%{discobot_username} %{quote_trigger}`
+ > :left_speech_bubble: _언젠가 다른 누군가도 당신이 그랬던 것 처럼 친절한 행동을 할 거라고 믿으면서, 보상에 대한 어떠한 기대도 없이 친절한 행동을 하라._ — 다이애나비
+
+ `@%{discobot_username} %{magic_8_ball_trigger}`
+ > :crystal_ball: 믿어도 좋아.
do_not_understand:
first_response: |-
우와, 답글을 써줘서 고마워!
@@ -209,6 +225,8 @@ ko:
더 알고 싶다면 아래에 있는 이걸 선택한 다음 **이 개인메시지 북마크**를 하렴. 너의 미래에 보내는 좋은 선물:gift:이 되겠지!
reply: |-
대단해! 이제는 [프로필의 북마크 탭](%{profile_page_url}/activity/bookmarks)만 눌러도 우리의 개인적인 대화를 손쉽게 뒤돌아 볼 수 있어. 우측 상단에 있는 프로필 사진만 선택하면 돼. ↗
+ not_found: |-
+ 어라, 이 토픽에는 북마크가 없는데? 포스트 별로 있는 북마크 버튼을 찾았니? 더 보기 를 눌러서 필요한 추가 기능이 있는지 살펴 봐.
emoji:
instructions: |-
내가 답글에서 조그마한 그림을 쓰는 걸 봤겠지?:blue_car::dash: 이런 걸 [이모지 (emoji)](https://en.wikipedia.org/wiki/Emoji)라고 해. 너도 답글에 **이모지를 추가**해 볼래? 아래 중에서 아무거나 해도 돼.
@@ -241,17 +259,49 @@ ko:
(그래, 내 아이디는 _disco_, 라고 써. 1970년대 토요일밤의 열기처럼 말이야. 난 [밤을 사랑하는 댄서라고!](https://www.youtube.com/watch?v=B_wGI3_sGf8) :dancer:)
flag:
instructions: |-
- 친근한 토론이 싫은 사람이 누가있겠어.그래서 [질서를 유지](%{guidelines_url})해야 해. 문제가 보인다면, 신고하기를 눌러서 작성자에게 개인적으로 알려주거나, 우리의[친절한 운영진](%{about_url})들에게 알려주렴.
+ 나는 우리 커뮤니티의 토론이 친근해서 좋단다. 계속 그렇게 되려면 [질서를 유지](%{guidelines_url})하는 데 너의 도움이 필요해. 문제가 보인다면, 신고하기를 눌러서 작성자에게 개인적으로 알려주거나, 우리의[친절한 운영진](%{about_url})들에게 알려주렴.
- > :imp: 어쩌고 저쩌고 나쁜 글
+ > :imp: 어쩌고 저쩌고 나쁜 글
뭘 할지 잘 알고 있지? **이 포스트 신고하기** 를 눌러서 부적절하다고 알려줘!
reply: |-
[우리의 운영진](/groups/staff)은 니가 한 신고내용을 개인 메시지로 알림받게 될 거야. 충분한 커뮤니티 회원들이 신고를 하면, 포스트의 내용이 숨겨지고 사전경고가 걸리게 돼.(난 실제로 나쁜 글을 쓴 건 아니니까:angel:, 이제 신고를 지울게.)
+ not_found: |-
+ 아이고, 나의 나쁜 포스트가 아직 신고가 안됐네. :worried: 부적절한 게시물로 **신고** 해주겠니 ? 더 보기 버튼을 누르면 포스트에 수행할 기능을 더 볼 수 있다는 걸 잊지마.
+ search:
+ instructions: |-
+ 이봐, 내가 이 토픽에 놀라운 걸 숨겼다구. 찾아보고 싶다면, 우측 상단에 있는 **검색 아이콘을** 선택해서 ↗ 찾아봐.
+
+ 이 토픽에서 "capybara"를 찾으면 돼.
+ hidden_message: |-
+ 어떻게 이 capybara를 놓칠 수 있어? :wink:
+
+
+
+ 다시 처음으로 온 걸 눈치챘어? 이 배고픈 불쌍한 capybara에게 **`:herb:` emoji로 답을 해서** 먹이를 주렴. 그러면 자동으로 끝으로 가게 될거야.
+ reply: |-
+ 예이, 찾았네! :tada:
+
+ - 더 자세히 검색하려면, [전체 검색 페이지](%{search_url})로 가보렴.
+
+ - 긴 대화에서 원하는 곳으로 건너 뛰려면, 우측에 있는 토픽 타임라인 컨트롤을 사용해봐 (모바일 기기에는 아래쪽에 있어).
+
+ - 진짜 실물 :keyboard:가 있다면, ?를 눌러서 간편한 단축키가 뭐가 있는지 알아봐.
+ not_found: |-
+ 흠.... 아무래도 문제가 있어 보이네. 미안해. 검색을 눌러서 **capybara**를 찾아봤어?
certificate:
alt: '목표달성 인증'
advanced_user_narrative:
reset_trigger: '고급 사용자'
+ cert_title: "고급 사용자 튜토리얼을 훌륭하게 완료한 것에 대한 보상으로"
title: ':arrow_up: 고급 사용자 기능'
+ edit:
+ bot_created_post_raw: "@%{discobot_username}는 내가 아는 한, 현존하는 가장 쿨한 봇이지:wink:"
+ instructions: |-
+ 누구나 실수해. 걱정마, 편집을 하면 그 실수를 언제든지 바로잡을 수 있거든!
+
+ 내가 너 대신 만든 이 포스트를 **편집**하는 걸로 시작해 볼래 ?
+ recover:
+ deleted_post_raw: '왜 @%{discobot_username}가 내 포스트를 지웠지? :anguished:'
certificate:
alt: '고급 사용자 추적 인증'
diff --git a/plugins/discourse-narrative-bot/config/locales/server.pl_PL.yml b/plugins/discourse-narrative-bot/config/locales/server.pl_PL.yml
index d1a75bbed13..0a6dc5859c0 100644
--- a/plugins/discourse-narrative-bot/config/locales/server.pl_PL.yml
+++ b/plugins/discourse-narrative-bot/config/locales/server.pl_PL.yml
@@ -8,6 +8,9 @@
pl_PL:
site_settings:
disable_discourse_narrative_bot_welcome_post: "Dezaktywuj wpis powitalny Discourse Narrative Bot"
+ badges:
+ certified:
+ name: Certyfikowany
discourse_narrative_bot:
quote:
trigger: "cytuj"
@@ -17,6 +20,11 @@ pl_PL:
author: "Mahatma Gandhi"
'3':
author: "Dr Seuss"
+ '5':
+ quote: "Uwierz w to że możesz, jesteś już w połowie drogi."
+ '6':
+ quote: "Życie jest jak pudełko czekoladek. Nigdy nie wiesz na co trafisz."
+ author: "Mama Forresta Gumpa"
'8':
author: "Eleanor Roosevelt"
'9':
diff --git a/plugins/discourse-narrative-bot/config/locales/server.ru.yml b/plugins/discourse-narrative-bot/config/locales/server.ru.yml
index 3a2ef5b4a72..351a7dcff71 100644
--- a/plugins/discourse-narrative-bot/config/locales/server.ru.yml
+++ b/plugins/discourse-narrative-bot/config/locales/server.ru.yml
@@ -25,9 +25,26 @@ ru:
long_description: |
Этот значок выдается после успешного завершения интерактивного передового руководство пользователя. Вы уже освоили почти все инструменты обсуждения — и теперь ты полностью готов к общению!
discourse_narrative_bot:
+ bio: "Здравствуйте! Я не реальный человек. Я бот, который может научить вас работать с этим сайтом. Чтобы взаимодействовать со мной, отправьте мне сообщение или упоминание **`@%{discobot_username}`** в любом месте."
+ timeout:
+ message: |-
+ Здравствуйте @%{username}, я просто проверяю, потому что я не слышал от вас в некоторое время.
+
+ - Чтобы продолжить, ответьте мне в любое время.
+
+ - Если вы хотите пропустить этот шаг, скажите `%{skip_trigger}`.
+
+ - Чтобы начать с самого начала, скажите `%{reset_trigger}`.
+
+ Если Вы не хотите отвечать, это тоже нормально. Я робот. Вы не сделаете мне больно. :sob:
dice:
+ trigger: "roll"
invalid: |-
Извините, даже математически невозможно бросить эту комбинацию костей. :confounded:
+ not_enough_dice: |-
+ У меня только %{num_of_dice} кости. [Посмотрите](http://www.therobotsvoice.com/2009/04/the_10_most_shameful_rpg_dice.php), что это такое!
+ out_of_range: |-
+ Знаете ли вы, что [максимальное количество сторон](https://www.wired.com/2016/05/mathematical-challenge-of-designing-the-worlds-most-complex-120-sided-dice) в кубиках может быть 120?
results: |-
> :game_die: %{results}
quote:
@@ -65,6 +82,7 @@ ru:
results: |-
> :left_speech_bubble: _%{quote}_ — %{author}
magic_8_ball:
+ trigger: 'fortune'
answers:
'1': "Это точно"
'2': "Это несомненно так"
@@ -86,6 +104,8 @@ ru:
'18': "Мои источники говорят, что нет"
'19': "Перспективы не очень хорошие"
'20': "Весьма сомнительно"
+ result: |-
+ > :crystal_ball: %{result}
track_selector:
reset_trigger: 'старт'
skip_trigger: 'пропустить'
@@ -93,23 +113,318 @@ ru:
random_mention:
reply: |-
Привет! Tтобы узнать, что я могу сделать, наберите: `@%{discobot_username} %{help_trigger}`.
+ tracks: |-
+ В настоящее время я знаю, как сделать следующие вещи:
+
+ `@%{discobot_username} %{reset_trigger} %{default_track}`
+ > Начинается одно из следующих интерактивных повествований: %{tracks}.
+ bot_actions: |-
+ `@%{discobot_username} %{dice_trigger} 2d6`
+ > :game_die: 3, 6
+
+ `@%{discobot_username} %{quote_trigger}`
+ > :left_speech_bubble: _Делайте добро, без ожидания награды, зная, что однажды кто-то может сделать то же самое для вас_ — Принцесса Диана
+
+ `@%{discobot_username} %{magic_8_ball_trigger}`
+ > :crystal_ball: Вы можете ответить на это
+ do_not_understand:
+ first_response: |-
+ Спасибо за ответ!
+
+ К сожалению я пока не очень хороший бот и только учусь. :frowning:
+ track_response: Вы можете попробовать еще раз, или если вы хотите пропустить этот шаг, скажите `%{skip_trigger}`. Если хотите начать все с самого начала, скажите `%{reset_trigger}`.
+ second_response: |-
+ Ой, извините. Я все еще не понимаю вас. :anguished:
+
+ Я просто Бот. Если вы хотите пообщаться с администрацией, то вот [их контакты](/about).
+
+ В то же время, я не буду стоять на вашем пути.
new_user_narrative:
reset_trigger: "новый пользователь"
+ cert_title: "В знак признания успешного завершения нового руководство пользователя"
+ hello:
+ title: ":robot: Поздравляю!"
+ message: |-
+ Спасибо %{title}, и Добро пожаловать!
+
+ - Я всего лишь робот, но [наш дружный коллектив](/about) готов помочь вам в любое время.
+
+ - По соображениям безопасности, мы временно ограничили то, что новые пользователи могут делать. Вы будете получать новые способности (и [значки](/badges)) по мере приобретения опыта.
+
+ - Мы верим в [цивилизованном поведении](/guidelines) в нашем сообществе.
+ onebox:
+ instructions: |-
+ Далее, вы можете поделиться одну из этих ссылок со мной? Ответить мне с **ссылкой с новой строки**. Эти ссылки добавят отличный обзор.
+
+ Чтобы скопировать ссылку, нажмите и удерживайте на мобильном, или правой кнопкой мыши:
+
+ - https://en.wikipedia.org/wiki/Inherently_funny_word
+ - https://en.wikipedia.org/wiki/Death_by_coconut
+ - https://en.wikipedia.org/wiki/Calculator_spelling
+ reply: |-
+ Здорово! Это будет работать для большинства ссылок. Помните, ссылка должна быть на одной линии _и_, ничего позади или впереди не должно находиться.
+ not_found: |-
+ К сожалению, я не смог найти ссылку в вашем ответе! :cry:
+
+ Может вы попробовать еще раз добавить следующую ссылку, на отдельной линии, в вашем следующем ответе?
+
+ - https://en.wikipedia.org/wiki/Exotic_Shorthair
+ images:
+ instructions: |-
+ Вот картинка единорога:
+
+
+
+ Если вам нравится она, то нажмите на лайк :heart: кнопку внизу поста.
+
+ А вы можете **ответить мне с картинкой?** В вашем следующем ответе пришлите мне любую картинку.
+ reply: |-
+ Отличная картинка – я нажал бы на :heart: если бы мог показать вам, как я ценю это :heart_eyes:
+ like_not_found: |-
+ Вам не нравится :heart: мой [пост?](%{url}) :crying_cat_face:
+ not_found: |-
+ Похоже, Вы не загрузите изображения, поэтому я выбрал картинку, которой вы _будете_ наслаждаться.
+
+ `%{image_url}`
+
+ Попробуйте загрузить это или вставить ссылку на отдельной строке!
formatting:
+ instructions: |-
+ Вы можете сделать некоторые слова **жирными** или _наклонными_ в своем ответе?
+
+ - например `**жирный**` или `_наклонный_`
+
+ - нажмите B или I кнопку в редакторе
reply: |-
Отличная работа! Формате HTML и BBCode также работа для форматирования – чтобы узнать больше, [попробуйте этот учебник](http://commonmark.org/help) :nerd:
+ not_found: |-
+ Оооо, я не нашел какого-либо форматирования в вашем ответе. :pencil2:
+
+ Можете ли вы попробовать еще раз? Используйте B или Iкурсив в редакторе, если вы застряли.
quoting:
+ instructions: |-
+ Вы можете попробовать процитировать меня при ответе, чтобы я точно знал, на какую часть вы отвечаете?
+
+ > Если это кофе, пожалуйста, принесите мне чай; если это чай, пожалуйста, принесите мне кофе.
+ >
+ > Мечтай так как будто будешь жить вечно. Живи так как будто умрешь завтра.
+ >
+ > Я всегда был лучшей компанией самому себе.
+
+ Выделите текст, который вы предпочитаете. Появится кнопка: **Цитата**. Нажмите на нее. Цитата должна появиться в вашем ответе.
+
+ Допишите, что-то ниже цитаты :thinking:
reply: |-
Молодец, вы выбрали мою любимую цитату! :left_speech_bubble:
+ not_found: |-
+ Хм, похоже, Вы не цитировали меня в своем ответе?
+
+ Выделите любой текст в моем посту. Должна появиться кнопка: **Цитата** . И нажмите: **Ответить**. Текст должен появится в редакторе. Можете ли вы попробовать еще раз?
+ bookmark:
+ instructions: |-
+ If you’d like to learn more, select below and **bookmark this private message**. If you do, there may be a :gift: in your future!
+ reply: |-
+ Отлично! Теперь вы можете легко найти свой путь назад к нашей частной беседе любой момент, прямо с [закладок в профиле](%{profile_page_url}/activity/bookmarks). Просто выберите фотографию профиля в правом верхнем углу ↗
+ not_found: |-
+ Ой, я не вижу никаких закладок в этом разделе. Вы нашли закладок под каждым постом? Используйте, показать больше для просмотра дополнительных инструментов в посту.
+ emoji:
+ instructions: |-
+ Возможно вы видели маленькие картинки в ответах :blue_car::dash: это называется [emoji](https://en.wikipedia.org/wiki/Emoji). Может вы **добавить emoji** в вашем ответе? Любой из этих вариантов будет работать:
+
+ - Написать `:) ;) :D :P :O`
+
+ - Введите двоеточие : и наберите emoji имя `:tada:`
+
+ - Нажмите на иконку в редакторы и выберите картинку
+ reply: |-
+ Это :sparkles: _emojitastic!_ :sparkles:
+ not_found: |-
+ Упс, я не вижу никаких смайликов в вашем ответе? О нет! :sob:
+
+ Попробуйте ввести двоеточие : чтобы вызвать emoji, а затем введите первые несколько букв того, что вы хотите, например,`:bird:`
+
+ Нажмите на кнопку со смайликом в редакторе.
+
+ (Если вы находитесь на мобильном устройстве, Вы также можете выбрать emoji прямо с клавиатуры.)
+ mention:
+ instructions: |-
+ Иногда вы, возможно, захотите, привлечь внимание человека, даже если Вы не отвечаете ему напрямую. Набрав `@` затем начните набирать его имя пользователя.
+
+ Вы можете позвать меня **`@%{discobot_username}`** в своем ответе?
+ reply: |-
+ _Кто-то произнес мое имя!?_ :raised_hand: Я верю, что вы это сделали! :wave: А вот и я! Спасибо, что упомянули меня. :ok_hand:
+ not_found: |-
+ Я не вижу свое имя в вашем ответе :frowning: Вы не можете снова упомянуть меня: `@%{discobot_username}` ?
+
+ (И да, мое имя пользователя пишется как _disco_, в 1970 году был такой танец. Я не [люблю ночную жизнь!](https://www.youtube.com/watch?v=B_wGI3_sGf8) :dancer:)
+ flag:
+ instructions: |-
+ Мне нравится наше дружеское общение, и мне нужна ваша помощь [сохранять цивилизованное общение](%{guidelines_url}). Если вы видите нарушения, пожалуйста, нажмите на флаг в сообщение. Автор сообщения, или [наш внимательный персонал](%{about_url}), узнают об этом.
+
+ > :imp: Я написал здесь, например, гадость
+
+ Я думаю, вы знаете, что делать. Нажмите на **флаг в этом посте** выбрать причину, как неуместное содержание!
+ reply: |-
+ [Наши сотрудники](/groups/staff) будут лично уведомлены о вашем сообщение. Если достаточное количество участников аналогично нажмет на этот флаг, то сообщение будет автоматически скрыто из-за предосторожности. (Так как я на самом деле не написать неприятный пост :angel:, я пошел туда и снял жалобу.)
+ not_found: |-
+ О нет, вы не пожаловались ещё на мой противный пост. :worried: вы можете пометить его как нарушающий правило пост, **флагом** ? Не забудьте попробовать воспользоваться еще кнопками, чтобы выявить дополнительные возможности.
+ search:
+ instructions: |-
+ _тсссс_ … Я спрятал сюрприз в этом разделе. Если вы готовы принять вызов, **выберите значок поиска** вверху справа ↗ для поиска сюрприза.
+
+ Попробуйте поискать этот термин "capybara" в этом топике
+ hidden_message: |-
+ Как же вы пропустили этого зверька капибара? :wink:
+
+
+
+ Вы заметили, что сейчас в самом начале поста? Покормите бедного, голодного капибару **отвечая: `:herb:` emoji** и вы будете автоматически вознаграждены.
+ reply: |-
+ Ура вы его нашли :tada:
+
+ - Для более детального поиска, зайдите на [полный поиск на странице](%{search_url}).
+
+ - Чтобы прыгать в любую точку в долгой дискуссии попробуйте шакалу управление справа (и внизу, на мобильном).
+
+ - Если у вас есть физическая :keyboard:, клавиатура ? для просмотра наших удобных сочетаний клавиш.
+ not_found: |-
+ Хмм, похоже у вас не получилось. Вы искали for the term **capybara**?
+ end:
+ message: |-
+ Спасибо, с меня @%{username}! Я сделала это для вас, я думаю вы это заслужили:
+
+ %{certificate}
+
+ Вот и все на сегодня! Проверьте [**последние сообщения**](/latest) или [**категории сообщества**](/categories). :sunglasses:
+
+ (Если вы хотите снова поговорить со мной, просто напишите мне сообщение тут или упомяните меня с `@%{discobot_username}` в любое время!)
certificate:
alt: 'Свидетельство о достижении'
advanced_user_narrative:
reset_trigger: 'продвинутый пользователь'
cert_title: "В знак признания успешного завершения расширенного руководства пользователя"
title: ':arrow_up: Расширенные функции пользователя'
+ start_message: |-
+ Как _продвинутый_ пользователь, вы можете посетить [вашу страницу](/my/preferences) и еще @%{username}? Есть много способов, чтобы настроить свой опыт, такие как выбор темной или светлой темы.
+
+ Но я отвлекся, давайте начнем!
edit:
bot_created_post_raw: "@%{discobot_username} безусловно, самый лучший бот, которого я знаю :wink:"
+ instructions: |-
+ Каждый делает ошибки. Но не волнуйтесь, вы всегда можете редактировать свои сообщения, чтобы их исправить!
+
+ Вы можете попробовать **редактировать** этот пост? Я создал его от Вашего имени.
+ not_found: |-
+ Похоже, что вы еще не изменили [пост](%{url}) который я создал для вас. Вы можете попробовать еще раз?
+
+ Используйте значок для вызова редактора.
+ reply: |-
+ Отличная работа!
+
+ Обратите внимание, что правки, сделанные после 5 минут показывают, как общественные изменения, и маленький значок карандаша появится в верхнем правом углу записи.
+ delete:
+ instructions: |-
+ Давайте попробуйте удалить один из постов.
+
+ Выберите любой из ранее созданных постов нажав **удалить**. Не удаляйте первый пост!
+ not_found: |-
+ Я не вижу удаленные посты еще? Помню show more will reveal delete.
+ reply: |-
+ Опсс! :boom:
+
+ Чтобы сохранить преемственность дискуссий, система удаляет не немедленно, поэтому пост будет удален через некоторое время.
recover:
deleted_post_raw: 'Почему @%{discobot_username} удалил моё сообщение? :anguished:'
+ instructions: |-
+ О нет! Похоже, я случайно удалил новый пост.
+
+ Можете ли вы сделать мне одолжение и **восстановить** его?
+ not_found: |-
+ Возникли проблемы? Помните показать еще, а восстановить.
+ reply: |-
+ Ух, это было отлично! Спасибо за ремонт, что :wink:
+
+ Запомните, что у вас есть только 24 часа, чтобы восстановить пост.
+ category_hashtag:
+ instructions: |-
+ Знаете ли вы, что вы можете обратитесь к категории и теги в вашем посте? Например, вы видели %{category} категорию?
+
+ Введите `#` в середине предложения и выберите любую категорию или тег.
+ not_found: |-
+ Хм, я не вижу категорию. Обратите внимание, что `#` не может быть первым символом. Вы можете скопировать это в вашем следующем ответе?
+
+ ```text
+ Я могу создать ссылку на категорию #
+ ```
+ reply: |-
+ Отлично! Это работает для всех категорий _и_ тегов, если теги включены.
+ change_topic_notification_level:
+ instructions: |-
+ Каждая тема имеет уровень уведомлений. Она начинается на 'нормальный', что означает, что вы нормально будете только получать уведомления, когда кто-то обращается непосредственно к вам.
+
+ По умолчанию, уровень уведомления на личное сообщение находится на самом высоком уровне 'смотреть', что означает, что вы будете получать уведомления о каждом новом ответе. Но вы можете переопределить уровня уведомлений для _любой_ теме 'смотреть', 'отслеживания' или 'отключен'.
+
+ Давайте попробуем изменить уровень уведомления по этой теме. Внизу темы, Вы найдете кнопку, которая показывает, что вы **смотрите** эту тему. Вы можете изменить уровень уведомления на **отслеживание**?
+ not_found: |-
+ Похоже, вы еще ищите :eyes: эту кнопку! Это кнопка находится в нижней части этого раздела.
+ reply: |-
+ Потрясающая работа! Я надеюсь, что вас я не утомил, поскольку могу быть немного болтлив :grin:.
+
+ Обратите внимание, что при ответе на тему, или если читать тему в течение более чем нескольких минут, он автоматически устанавливается на уровень уведомления 'отслеживание'. Вы можете изменить это в [ваших настройках](/my/preferences).
+ poll:
+ instructions: |-
+ Знаете ли вы, что можете добавить опрос в любой пост? Выберите этот значок в редакторе, а далее **Создать опрос**.
+ not_found: |-
+ Упс! Не было никакого опроса в вашем ответе.
+
+ Используйте этот значок шестеренки в редакторе, или скопируйте и вставьте этот опрос в своем следующей ответ:
+
+ ```text
+ [poll]
+ * :cat:
+ * :dog:
+ [/poll]
+ ```
+ reply: |-
+ Это хороший опрос! Как я вам в обучении?
+
+ [poll]
+ * :+1:
+ * :-1:
+ [/poll]
+ details:
+ instructions: |-
+ Иногда вы можете захотеть **скрыть подробности** в вашем ответе:
+
+ - Когда вы обсуждаете сюжет фильма или ТВ передачу, и хотите что-то скрыть под спойлером.
+
+ - Когда ваш пост нуждается в большом количестве дополнительных деталей, которые могут отвлекать, когда читаешь все сразу.
+
+ [details=Выберите этот параметр, чтобы увидеть, как это работает!]
+ 1. Выберите в вашем редакторе.
+ 2. Выберите "Скрыть подробности".
+ 3. Редактируйте данный и добавьте ваше содержание.
+ [/details]
+
+ Вы можете использовать следующий знак чтобы добавить детали в следующий свой ответ?
+ not_found: |-
+ У вас возникли проблемы при создание данного виджета? Попробуйте следующее в вашем ответе:
+
+ ```text
+ [details=Посмотреть далее]
+ Тут написаны подробности
+ [/details]
+ ```
+ reply: |-
+ Отличная работа — ваше внимание к _деталям_ достойна восхищения!
+ end:
+ message: |-
+ Вы прошли через это действительно как _продвинутый пользователь_ :bow:
+
+ %{certificate}
+
+ Это все, что я хотел сказать вам.
+
+ А сейчас до свидания! Если вы хотите снова поговорить со мной, отправить мне сообщение в любое время :sunglasses:
certificate:
alt: 'Свидетельство о прогрессе для опытных пользователей'
diff --git a/plugins/poll/config/locales/client.ar.yml b/plugins/poll/config/locales/client.ar.yml
index 7d96f76ebe8..d8999851434 100644
--- a/plugins/poll/config/locales/client.ar.yml
+++ b/plugins/poll/config/locales/client.ar.yml
@@ -74,6 +74,7 @@ ar:
insert: أدرج التصويت
help:
options_count: أدخل خيارين على الأقل
+ invalid_values: يجب أن تكون القيمة الدّنيا أصغر من القيمة العليا.
poll_type:
label: النوع
regular: اختيار من متعدد
diff --git a/plugins/poll/config/locales/client.ja.yml b/plugins/poll/config/locales/client.ja.yml
index e2a9dc48358..67a397d677a 100644
--- a/plugins/poll/config/locales/client.ja.yml
+++ b/plugins/poll/config/locales/client.ja.yml
@@ -13,10 +13,17 @@ ja:
total_votes:
other: "合計得票数"
average_rating: "平均評価: %{average}."
+ public:
+ title: "投票は公開されています。"
multiple:
help:
+ at_least_min_options:
+ other: "少なくとも%{count}の選択肢を選んでください"
up_to_max_options:
other: "%{count}個まで選ぶことができます"
+ x_options:
+ other: "%{count}の選択肢を選んでください"
+ between_min_and_max_options: "%{min}から%{max}の選択肢を選んでください"
cast-votes:
title: "投票する"
label: "投票する"
@@ -34,12 +41,25 @@ ja:
title: "投票を締め切る"
label: "投票を締め切る"
confirm: "この投票を締め切ってもよろしいですか?"
+ error_while_toggling_status: "申し訳ありませんが、この投票のステータスを切り替える際にエラーが発生しました。"
+ error_while_casting_votes: "申し訳ありませんが、投票の際にエラーが発生しました。"
+ error_while_fetching_voters: "申し訳ありませんが、有権者を表示する際にエラーが発生しました。"
ui_builder:
title: 投票を作成
+ insert: 投票の挿入
+ help:
+ options_count: 少なくとも2つの選択肢を入力してください
+ invalid_values: 最小値は最大値より小さくなければなりません。
poll_type:
label: タイプ
regular: 一つだけ選択
multiple: 複数選択
number: 数字で評価
+ poll_config:
+ max: 最大
+ min: 最小
+ step: 間隔
poll_public:
label: 誰が投票したか表示する
+ poll_options:
+ label: 1行ごとに1つの選択肢を入力します
diff --git a/plugins/poll/config/locales/client.pt.yml b/plugins/poll/config/locales/client.pt.yml
index fd11a05cd2c..a871a565819 100644
--- a/plugins/poll/config/locales/client.pt.yml
+++ b/plugins/poll/config/locales/client.pt.yml
@@ -16,7 +16,7 @@ pt:
other: "total de votos"
average_rating: "Classificação média: %{average}."
public:
- title: "Votos são públicos."
+ title: "Os votos são públicos."
multiple:
help:
at_least_min_options:
@@ -41,23 +41,23 @@ pt:
open:
title: "Abrir a sondagem"
label: "Abrir"
- confirm: "Tem a certeza que quer abrir esta sondagem?"
+ confirm: "Tem a certeza que deseja abrir esta sondagem?"
close:
title: "Fechar a sondagem"
label: "Fechar"
- confirm: "Tem a certeza que quer fechar esta sondagem?"
- error_while_toggling_status: "Pedimos desculpa, ocorreu um erro ao mudar o estado desta sondagem."
- error_while_casting_votes: "Pedimos desculpa, ocorreu um erro ao submeter os seus votos."
+ confirm: "Tem a certeza que deseja fechar esta sondagem?"
+ error_while_toggling_status: "Desculpe, ocorreu um erro ao alternar o estado desta sondagem."
+ error_while_casting_votes: "Desculpe, ocorreu um erro ao submeter os seus votos."
error_while_fetching_voters: "Pedimos desculpa, ocorreu um erro ao apresentar os eleitores."
ui_builder:
title: Criar Sondagem
insert: Inserir sondagem
help:
- options_count: Indique pelo menos 2 opções
+ options_count: Insira pelo menos 2 opções
poll_type:
label: Tipo
regular: Escolha Única
- multiple: Multipla escolha
+ multiple: Escolha Múltipla
number: Cotação numérica
poll_config:
max: Máximo
diff --git a/plugins/poll/config/locales/server.ja.yml b/plugins/poll/config/locales/server.ja.yml
index 7cb65b2a8ac..745f4869017 100644
--- a/plugins/poll/config/locales/server.ja.yml
+++ b/plugins/poll/config/locales/server.ja.yml
@@ -9,6 +9,7 @@ ja:
site_settings:
poll_enabled: "ユーザーによる投票を許可しますか?"
poll_maximum_options: "投票で許可されるオプションの最大数。"
+ poll_edit_window_mins: "ポスト作成後に投票を編集できる時間(分)"
poll:
multiple_polls_without_name: "名前のない複数の投票があります。一意に投票結果を識別するために、属性'name'を使用します。"
multiple_polls_with_same_name: "同じ名前: %{name} の複数の投票があります。一意に投票結果を識別するために、属性'name'を使用します。"
@@ -23,8 +24,12 @@ ja:
default_poll_with_multiple_choices_has_invalid_parameters: "複数の選択肢をもつ投票に無効なパラメータがあります。"
named_poll_with_multiple_choices_has_invalid_parameters: "複数の選択肢をもつ投票 %{name} に無効なパラメータがあります。"
requires_at_least_1_valid_option: "少なくとも1つの有効なオプションを選択する必要があります。"
+ default_cannot_be_made_public: "得票済みの投票は公開することができません。"
+ named_cannot_be_made_public: "投票 %{name} は得票済みのため公開することができません。"
edit_window_expired:
cannot_change_polls: "最初の%{minutes}分が経過するまで、投票の追加, 削除, 名前の変更はできません。"
+ op_cannot_edit_options: "最初の%{minutes}分が経過したため投票の選択肢を編集することはできません。投票の選択肢を編集したい場合はモデレータへ連絡してください。"
+ staff_cannot_add_or_remove_options: "最初の%{minutes}分が経過したため投票の選択肢を編集することはできません。このトピックを閉じて代わりに新しいトピックを作成する必要があります。"
no_polls_associated_with_this_post: "この投稿に関連付けられた投票はありません。"
no_poll_with_this_name: "この投稿に関連付けられた投票 %{name} はありません。"
post_is_deleted: "削除された投稿を操作する事はできません。"
diff --git a/plugins/poll/config/locales/server.pt.yml b/plugins/poll/config/locales/server.pt.yml
index 8e8708e6534..4968a67e161 100644
--- a/plugins/poll/config/locales/server.pt.yml
+++ b/plugins/poll/config/locales/server.pt.yml
@@ -36,7 +36,7 @@ pt:
no_poll_with_this_name: "Nenhuma sondagem com o nome %{name} está associada a esta publicação."
post_is_deleted: "Não é possível realizar ações em publicações eliminadas."
topic_must_be_open_to_vote: "O tópico tem que estar aberto para votar."
- poll_must_be_open_to_vote: "Sondagem tem que estar aberta para votar."
+ poll_must_be_open_to_vote: "A sondagem tem que estar aberta para votar."
topic_must_be_open_to_toggle_status: "O tópico tem que estar aberto para alternar o estado."
only_staff_or_op_can_toggle_status: "Apenas um membro da equipa de apoio ou o autor original pode alternar o estado da sondagem."
email:
diff --git a/public/403.ar.html b/public/403.ar.html
index 588c339ce93..eb86ac25872 100644
--- a/public/403.ar.html
+++ b/public/403.ar.html
@@ -1,3 +1,4 @@
+
` (case-insensitive; it
+need not match the start tag).
+
+2. **Start condition:** line begins with the string ``.
+
+3. **Start condition:** line begins with the string ``.\
+**End condition:** line contains the string `?>`.
+
+4. **Start condition:** line begins with the string ``.
+
+5. **Start condition:** line begins with the string
+``.
+
+6. **Start condition:** line begins the string `<` or ``
+followed by one of the strings (case-insensitive) `address`,
+`article`, `aside`, `base`, `basefont`, `blockquote`, `body`,
+`caption`, `center`, `col`, `colgroup`, `dd`, `details`, `dialog`,
+`dir`, `div`, `dl`, `dt`, `fieldset`, `figcaption`, `figure`,
+`footer`, `form`, `frame`, `frameset`,
+`h1`, `h2`, `h3`, `h4`, `h5`, `h6`, `head`, `header`, `hr`,
+`html`, `iframe`, `legend`, `li`, `link`, `main`, `menu`, `menuitem`,
+`meta`, `nav`, `noframes`, `ol`, `optgroup`, `option`, `p`, `param`,
+`section`, `source`, `summary`, `table`, `tbody`, `td`,
+`tfoot`, `th`, `thead`, `title`, `tr`, `track`, `ul`, followed
+by [whitespace], the end of the line, the string `>`, or
+the string `/>`.\
+**End condition:** line is followed by a [blank line].
+
+7. **Start condition:** line begins with a complete [open tag]
+or [closing tag] (with any [tag name] other than `script`,
+`style`, or `pre`) followed only by [whitespace]
+or the end of the line.\
+**End condition:** line is followed by a [blank line].
+
+All types of [HTML blocks] except type 7 may interrupt
+a paragraph. Blocks of type 7 may not interrupt a paragraph.
+(This restriction is intended to prevent unwanted interpretation
+of long tags inside a wrapped paragraph as starting HTML blocks.)
+
+Some simple examples follow. Here are some basic HTML blocks
+of type 6:
+
+```````````````````````````````` example
+
+
+
+ hi
+
+
+
+
+okay.
+.
+
+
+
+ hi
+
+
+
+
okay.
+````````````````````````````````
+
+
+```````````````````````````````` example
+
+*foo*
+````````````````````````````````
+
+
+Here we have two HTML blocks with a Markdown paragraph between them:
+
+```````````````````````````````` example
+
+
+*Markdown*
+
+
+.
+
+
Markdown
+
+````````````````````````````````
+
+
+The tag on the first line can be partial, as long
+as it is split where there would be whitespace:
+
+```````````````````````````````` example
+
+
+.
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+
+
+.
+
+
+````````````````````````````````
+
+
+An open tag need not be closed:
+```````````````````````````````` example
+
+*foo*
+
+*bar*
+.
+
+*foo*
+
bar
+````````````````````````````````
+
+
+
+A partial tag need not even be completed (garbage
+in, garbage out):
+
+```````````````````````````````` example
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+
+foo
+
+.
+
+foo
+
+````````````````````````````````
+
+
+Everything until the next blank line or end of document
+gets included in the HTML block. So, in the following
+example, what looks like a Markdown code block
+is actually part of the HTML block, which continues until a blank
+line or the end of the document is reached:
+
+```````````````````````````````` example
+
+``` c
+int x = 33;
+```
+.
+
+``` c
+int x = 33;
+```
+````````````````````````````````
+
+
+To start an [HTML block] with a tag that is *not* in the
+list of block-level tags in (6), you must put the tag by
+itself on the first line (and it must be complete):
+
+```````````````````````````````` example
+
+*bar*
+
+.
+
+*bar*
+
+````````````````````````````````
+
+
+In type 7 blocks, the [tag name] can be anything:
+
+```````````````````````````````` example
+
+*bar*
+
+.
+
+*bar*
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+
+*bar*
+
+.
+
+*bar*
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+
+*bar*
+.
+
+*bar*
+````````````````````````````````
+
+
+These rules are designed to allow us to work with tags that
+can function as either block-level or inline-level tags.
+The `` tag is a nice example. We can surround content with
+`` tags in three different ways. In this case, we get a raw
+HTML block, because the `` tag is on a line by itself:
+
+```````````````````````````````` example
+
+*foo*
+
+.
+
+*foo*
+
+````````````````````````````````
+
+
+In this case, we get a raw HTML block that just includes
+the `` tag (because it ends with the following blank
+line). So the contents get interpreted as CommonMark:
+
+```````````````````````````````` example
+
+
+*foo*
+
+
+.
+
+
foo
+
+````````````````````````````````
+
+
+Finally, in this case, the `` tags are interpreted
+as [raw HTML] *inside* the CommonMark paragraph. (Because
+the tag is not on a line by itself, we get inline HTML
+rather than an [HTML block].)
+
+```````````````````````````````` example
+*foo*
+.
+
foo
+````````````````````````````````
+
+
+HTML tags designed to contain literal content
+(`script`, `style`, `pre`), comments, processing instructions,
+and declarations are treated somewhat differently.
+Instead of ending at the first blank line, these blocks
+end at the first line containing a corresponding end tag.
+As a result, these blocks can contain blank lines:
+
+A pre tag (type 1):
+
+```````````````````````````````` example
+
+````````````````````````````````
+
+
+A script tag (type 1):
+
+```````````````````````````````` example
+
+okay
+.
+
+
okay
+````````````````````````````````
+
+
+A style tag (type 1):
+
+```````````````````````````````` example
+
+okay
+.
+
+
okay
+````````````````````````````````
+
+
+If there is no matching end tag, the block will end at the
+end of the document (or the enclosing [block quote][block quotes]
+or [list item][list items]):
+
+```````````````````````````````` example
+
+*foo*
+.
+
+
foo
+````````````````````````````````
+
+
+```````````````````````````````` example
+*bar*
+*baz*
+.
+*bar*
+
baz
+````````````````````````````````
+
+
+Note that anything on the last line after the
+end tag will be included in the [HTML block]:
+
+```````````````````````````````` example
+1. *bar*
+.
+1. *bar*
+````````````````````````````````
+
+
+A comment (type 2):
+
+```````````````````````````````` example
+
+okay
+.
+
+
+````````````````````````````````
+
+
+The opening tag can be indented 1-3 spaces, but not 4:
+
+```````````````````````````````` example
+
+
+
+.
+
+
<!-- foo -->
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+
+
+
+.
+
+
<div>
+
+````````````````````````````````
+
+
+An HTML block of types 1--6 can interrupt a paragraph, and need not be
+preceded by a blank line.
+
+```````````````````````````````` example
+Foo
+
+bar
+
+.
+
Foo
+
+bar
+
+````````````````````````````````
+
+
+However, a following blank line is needed, except at the end of
+a document, and except for blocks of types 1--5, above:
+
+```````````````````````````````` example
+
+bar
+
+*foo*
+.
+
+bar
+
+*foo*
+````````````````````````````````
+
+
+HTML blocks of type 7 cannot interrupt a paragraph:
+
+```````````````````````````````` example
+Foo
+
+baz
+.
+
+````````````````````````````````
+
+
+This rule differs from John Gruber's original Markdown syntax
+specification, which says:
+
+> The only restrictions are that block-level HTML elements —
+> e.g. `
`, `
`, `
`, `
`, etc. — must be separated from
+> surrounding content by blank lines, and the start and end tags of the
+> block should not be indented with tabs or spaces.
+
+In some ways Gruber's rule is more restrictive than the one given
+here:
+
+- It requires that an HTML block be preceded by a blank line.
+- It does not allow the start tag to be indented.
+- It requires a matching end tag, which it also does not allow to
+ be indented.
+
+Most Markdown implementations (including some of Gruber's own) do not
+respect all of these restrictions.
+
+There is one respect, however, in which Gruber's rule is more liberal
+than the one given here, since it allows blank lines to occur inside
+an HTML block. There are two reasons for disallowing them here.
+First, it removes the need to parse balanced tags, which is
+expensive and can require backtracking from the end of the document
+if no matching end tag is found. Second, it provides a very simple
+and flexible way of including Markdown content inside HTML tags:
+simply separate the Markdown from the HTML using blank lines:
+
+Compare:
+
+```````````````````````````````` example
+
+
+*Emphasized* text.
+
+
+.
+
+
Emphasized text.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+
+*Emphasized* text.
+
+.
+
+*Emphasized* text.
+
+````````````````````````````````
+
+
+Some Markdown implementations have adopted a convention of
+interpreting content inside tags as text if the open tag has
+the attribute `markdown=1`. The rule given above seems a simpler and
+more elegant way of achieving the same expressive power, which is also
+much simpler to parse.
+
+The main potential drawback is that one can no longer paste HTML
+blocks into Markdown documents with 100% reliability. However,
+*in most cases* this will work fine, because the blank lines in
+HTML are usually followed by HTML block tags. For example:
+
+```````````````````````````````` example
+
+
+
+
+
+Hi
+
+
+
+
+
+.
+
+
+
+Hi
+
+
+
+````````````````````````````````
+
+
+There are problems, however, if the inner tags are indented
+*and* separated by spaces, as then they will be interpreted as
+an indented code block:
+
+```````````````````````````````` example
+
+
+
+
+
+ Hi
+
+
+
+
+
+.
+
+
+
<td>
+ Hi
+</td>
+
+
+
+````````````````````````````````
+
+
+Fortunately, blank lines are usually not necessary and can be
+deleted. The exception is inside `
` tags, but as described
+above, raw HTML blocks starting with `
` *can* contain blank
+lines.
+
+## Link reference definitions
+
+A [link reference definition](@)
+consists of a [link label], indented up to three spaces, followed
+by a colon (`:`), optional [whitespace] (including up to one
+[line ending]), a [link destination],
+optional [whitespace] (including up to one
+[line ending]), and an optional [link
+title], which if it is present must be separated
+from the [link destination] by [whitespace].
+No further [non-whitespace characters] may occur on the line.
+
+A [link reference definition]
+does not correspond to a structural element of a document. Instead, it
+defines a label which can be used in [reference links]
+and reference-style [images] elsewhere in the document. [Link
+reference definitions] can come either before or after the links that use
+them.
+
+```````````````````````````````` example
+[foo]: /url "title"
+
+[foo]
+.
+
+````````````````````````````````
+
+
+However, it may not contain a [blank line]:
+
+```````````````````````````````` example
+[foo]: /url 'title
+
+with blank line'
+
+[foo]
+.
+
[foo]: /url 'title
+
with blank line'
+
[foo]
+````````````````````````````````
+
+
+The title may be omitted:
+
+```````````````````````````````` example
+[foo]:
+/url
+
+[foo]
+.
+
+````````````````````````````````
+
+
+A link can come before its corresponding definition:
+
+```````````````````````````````` example
+[foo]
+
+[foo]: url
+.
+
+````````````````````````````````
+
+
+If there are several matching definitions, the first one takes
+precedence:
+
+```````````````````````````````` example
+[foo]
+
+[foo]: first
+[foo]: second
+.
+
+````````````````````````````````
+
+
+As noted in the section on [Links], matching of labels is
+case-insensitive (see [matches]).
+
+```````````````````````````````` example
+[FOO]: /url
+
+[Foo]
+.
+
+````````````````````````````````
+
+
+Here is a link reference definition with no corresponding link.
+It contributes nothing to the document.
+
+```````````````````````````````` example
+[foo]: /url
+.
+````````````````````````````````
+
+
+Here is another one:
+
+```````````````````````````````` example
+[
+foo
+]: /url
+bar
+.
+
bar
+````````````````````````````````
+
+
+This is not a link reference definition, because there are
+[non-whitespace characters] after the title:
+
+```````````````````````````````` example
+[foo]: /url "title" ok
+.
+
[foo]: /url "title" ok
+````````````````````````````````
+
+
+This is a link reference definition, but it has no title:
+
+```````````````````````````````` example
+[foo]: /url
+"title" ok
+.
+
"title" ok
+````````````````````````````````
+
+
+This is not a link reference definition, because it is indented
+four spaces:
+
+```````````````````````````````` example
+ [foo]: /url "title"
+
+[foo]
+.
+
[foo]: /url "title"
+
+
[foo]
+````````````````````````````````
+
+
+This is not a link reference definition, because it occurs inside
+a code block:
+
+```````````````````````````````` example
+```
+[foo]: /url
+```
+
+[foo]
+.
+
+````````````````````````````````
+
+
+However, it can directly follow other block elements, such as headings
+and thematic breaks, and it need not be followed by a blank line.
+
+```````````````````````````````` example
+# [Foo]
+[foo]: /url
+> bar
+.
+
+````````````````````````````````
+
+
+[Link reference definitions] can occur
+inside block containers, like lists and block quotations. They
+affect the entire document, not just the container in which they
+are defined:
+
+```````````````````````````````` example
+[foo]
+
+> [foo]: /url
+.
+
+````````````````````````````````
+
+
+
+## Paragraphs
+
+A sequence of non-blank lines that cannot be interpreted as other
+kinds of blocks forms a [paragraph](@).
+The contents of the paragraph are the result of parsing the
+paragraph's raw content as inlines. The paragraph's raw content
+is formed by concatenating the lines and removing initial and final
+[whitespace].
+
+A simple example with two paragraphs:
+
+```````````````````````````````` example
+aaa
+
+bbb
+.
+
aaa
+
bbb
+````````````````````````````````
+
+
+Paragraphs can contain multiple lines, but no blank lines:
+
+```````````````````````````````` example
+aaa
+bbb
+
+ccc
+ddd
+.
+
aaa
+bbb
+
ccc
+ddd
+````````````````````````````````
+
+
+Multiple blank lines between paragraph have no effect:
+
+```````````````````````````````` example
+aaa
+
+
+bbb
+.
+
aaa
+
bbb
+````````````````````````````````
+
+
+Leading spaces are skipped:
+
+```````````````````````````````` example
+ aaa
+ bbb
+.
+
aaa
+bbb
+````````````````````````````````
+
+
+Lines after the first may be indented any amount, since indented
+code blocks cannot interrupt paragraphs.
+
+```````````````````````````````` example
+aaa
+ bbb
+ ccc
+.
+
aaa
+bbb
+ccc
+````````````````````````````````
+
+
+However, the first line may be indented at most three spaces,
+or an indented code block will be triggered:
+
+```````````````````````````````` example
+ aaa
+bbb
+.
+
aaa
+bbb
+````````````````````````````````
+
+
+```````````````````````````````` example
+ aaa
+bbb
+.
+
aaa
+
+
bbb
+````````````````````````````````
+
+
+Final spaces are stripped before inline parsing, so a paragraph
+that ends with two or more spaces will not end with a [hard line
+break]:
+
+```````````````````````````````` example
+aaa
+bbb
+.
+
aaa
+bbb
+````````````````````````````````
+
+
+## Blank lines
+
+[Blank lines] between block-level elements are ignored,
+except for the role they play in determining whether a [list]
+is [tight] or [loose].
+
+Blank lines at the beginning and end of the document are also ignored.
+
+```````````````````````````````` example
+
+
+aaa
+
+
+# aaa
+
+
+.
+
aaa
+
aaa
+````````````````````````````````
+
+
+
+# Container blocks
+
+A [container block] is a block that has other
+blocks as its contents. There are two basic kinds of container blocks:
+[block quotes] and [list items].
+[Lists] are meta-containers for [list items].
+
+We define the syntax for container blocks recursively. The general
+form of the definition is:
+
+> If X is a sequence of blocks, then the result of
+> transforming X in such-and-such a way is a container of type Y
+> with these blocks as its content.
+
+So, we explain what counts as a block quote or list item by explaining
+how these can be *generated* from their contents. This should suffice
+to define the syntax, although it does not give a recipe for *parsing*
+these constructions. (A recipe is provided below in the section entitled
+[A parsing strategy](#appendix-a-parsing-strategy).)
+
+## Block quotes
+
+A [block quote marker](@)
+consists of 0-3 spaces of initial indent, plus (a) the character `>` together
+with a following space, or (b) a single character `>` not followed by a space.
+
+The following rules define [block quotes]:
+
+1. **Basic case.** If a string of lines *Ls* constitute a sequence
+ of blocks *Bs*, then the result of prepending a [block quote
+ marker] to the beginning of each line in *Ls*
+ is a [block quote](#block-quotes) containing *Bs*.
+
+2. **Laziness.** If a string of lines *Ls* constitute a [block
+ quote](#block-quotes) with contents *Bs*, then the result of deleting
+ the initial [block quote marker] from one or
+ more lines in which the next [non-whitespace character] after the [block
+ quote marker] is [paragraph continuation
+ text] is a block quote with *Bs* as its content.
+ [Paragraph continuation text](@) is text
+ that will be parsed as part of the content of a paragraph, but does
+ not occur at the beginning of the paragraph.
+
+3. **Consecutiveness.** A document cannot contain two [block
+ quotes] in a row unless there is a [blank line] between them.
+
+Nothing else counts as a [block quote](#block-quotes).
+
+Here is a simple example:
+
+```````````````````````````````` example
+> # Foo
+> bar
+> baz
+.
+
+
Foo
+
bar
+baz
+
+````````````````````````````````
+
+
+The spaces after the `>` characters can be omitted:
+
+```````````````````````````````` example
+># Foo
+>bar
+> baz
+.
+
+
Foo
+
bar
+baz
+
+````````````````````````````````
+
+
+The `>` characters can be indented 1-3 spaces:
+
+```````````````````````````````` example
+ > # Foo
+ > bar
+ > baz
+.
+
+
Foo
+
bar
+baz
+
+````````````````````````````````
+
+
+Four spaces gives us a code block:
+
+```````````````````````````````` example
+ > # Foo
+ > bar
+ > baz
+.
+
> # Foo
+> bar
+> baz
+
+````````````````````````````````
+
+
+The Laziness clause allows us to omit the `>` before
+[paragraph continuation text]:
+
+```````````````````````````````` example
+> # Foo
+> bar
+baz
+.
+
+
Foo
+
bar
+baz
+
+````````````````````````````````
+
+
+A block quote can contain some lazy and some non-lazy
+continuation lines:
+
+```````````````````````````````` example
+> bar
+baz
+> foo
+.
+
+
bar
+baz
+foo
+
+````````````````````````````````
+
+
+Laziness only applies to lines that would have been continuations of
+paragraphs had they been prepended with [block quote markers].
+For example, the `> ` cannot be omitted in the second line of
+
+``` markdown
+> foo
+> ---
+```
+
+without changing the meaning:
+
+```````````````````````````````` example
+> foo
+---
+.
+
+
foo
+
+
+````````````````````````````````
+
+
+Similarly, if we omit the `> ` in the second line of
+
+``` markdown
+> - foo
+> - bar
+```
+
+then the block quote ends after the first line:
+
+```````````````````````````````` example
+> - foo
+- bar
+.
+
+
+
foo
+
+
+
+
bar
+
+````````````````````````````````
+
+
+For the same reason, we can't omit the `> ` in front of
+subsequent lines of an indented or fenced code block:
+
+```````````````````````````````` example
+> foo
+ bar
+.
+
+````````````````````````````````
+
+
+Note that in the following case, we have a [lazy
+continuation line]:
+
+```````````````````````````````` example
+> foo
+ - bar
+.
+
+
foo
+- bar
+
+````````````````````````````````
+
+
+To see why, note that in
+
+```markdown
+> foo
+> - bar
+```
+
+the `- bar` is indented too far to start a list, and can't
+be an indented code block because indented code blocks cannot
+interrupt paragraphs, so it is [paragraph continuation text].
+
+A block quote can be empty:
+
+```````````````````````````````` example
+>
+.
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+>
+>
+>
+.
+
+
+````````````````````````````````
+
+
+A block quote can have initial or final blank lines:
+
+```````````````````````````````` example
+>
+> foo
+>
+.
+
+
foo
+
+````````````````````````````````
+
+
+A blank line always separates block quotes:
+
+```````````````````````````````` example
+> foo
+
+> bar
+.
+
+
foo
+
+
+
bar
+
+````````````````````````````````
+
+
+(Most current Markdown implementations, including John Gruber's
+original `Markdown.pl`, will parse this example as a single block quote
+with two paragraphs. But it seems better to allow the author to decide
+whether two block quotes or one are wanted.)
+
+Consecutiveness means that if we put these block quotes together,
+we get a single block quote:
+
+```````````````````````````````` example
+> foo
+> bar
+.
+
+
foo
+bar
+
+````````````````````````````````
+
+
+To get a block quote with two paragraphs, use:
+
+```````````````````````````````` example
+> foo
+>
+> bar
+.
+
+
foo
+
bar
+
+````````````````````````````````
+
+
+Block quotes can interrupt paragraphs:
+
+```````````````````````````````` example
+foo
+> bar
+.
+
foo
+
+
bar
+
+````````````````````````````````
+
+
+In general, blank lines are not needed before or after block
+quotes:
+
+```````````````````````````````` example
+> aaa
+***
+> bbb
+.
+
+
aaa
+
+
+
+
bbb
+
+````````````````````````````````
+
+
+However, because of laziness, a blank line is needed between
+a block quote and a following paragraph:
+
+```````````````````````````````` example
+> bar
+baz
+.
+
+
bar
+baz
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+> bar
+
+baz
+.
+
+
bar
+
+
baz
+````````````````````````````````
+
+
+```````````````````````````````` example
+> bar
+>
+baz
+.
+
+
bar
+
+
baz
+````````````````````````````````
+
+
+It is a consequence of the Laziness rule that any number
+of initial `>`s may be omitted on a continuation line of a
+nested block quote:
+
+```````````````````````````````` example
+> > > foo
+bar
+.
+
+
+
+
foo
+bar
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+>>> foo
+> bar
+>>baz
+.
+
+
+
+
foo
+bar
+baz
+
+
+
+````````````````````````````````
+
+
+When including an indented code block in a block quote,
+remember that the [block quote marker] includes
+both the `>` and a following space. So *five spaces* are needed after
+the `>`:
+
+```````````````````````````````` example
+> code
+
+> not code
+.
+
+
code
+
+
+
+
not code
+
+````````````````````````````````
+
+
+
+## List items
+
+A [list marker](@) is a
+[bullet list marker] or an [ordered list marker].
+
+A [bullet list marker](@)
+is a `-`, `+`, or `*` character.
+
+An [ordered list marker](@)
+is a sequence of 1--9 arabic digits (`0-9`), followed by either a
+`.` character or a `)` character. (The reason for the length
+limit is that with 10 digits we start seeing integer overflows
+in some browsers.)
+
+The following rules define [list items]:
+
+1. **Basic case.** If a sequence of lines *Ls* constitute a sequence of
+ blocks *Bs* starting with a [non-whitespace character] and not separated
+ from each other by more than one blank line, and *M* is a list
+ marker of width *W* followed by 1 ≤ *N* ≤ 4 spaces, then the result
+ of prepending *M* and the following spaces to the first line of
+ *Ls*, and indenting subsequent lines of *Ls* by *W + N* spaces, is a
+ list item with *Bs* as its contents. The type of the list item
+ (bullet or ordered) is determined by the type of its list marker.
+ If the list item is ordered, then it is also assigned a start
+ number, based on the ordered list marker.
+
+ Exceptions: When the first list item in a [list] interrupts
+ a paragraph---that is, when it starts on a line that would
+ otherwise count as [paragraph continuation text]---then (a)
+ the lines *Ls* must not begin with a blank line, and (b) if
+ the list item is ordered, the start number must be 1.
+
+For example, let *Ls* be the lines
+
+```````````````````````````````` example
+A paragraph
+with two lines.
+
+ indented code
+
+> A block quote.
+.
+
A paragraph
+with two lines.
+
indented code
+
+
+
A block quote.
+
+````````````````````````````````
+
+
+And let *M* be the marker `1.`, and *N* = 2. Then rule #1 says
+that the following is an ordered list item with start number 1,
+and the same contents as *Ls*:
+
+```````````````````````````````` example
+1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+.
+
+
+
A paragraph
+with two lines.
+
indented code
+
+
+
A block quote.
+
+
+
+````````````````````````````````
+
+
+The most important thing to notice is that the position of
+the text after the list marker determines how much indentation
+is needed in subsequent blocks in the list item. If the list
+marker takes up two spaces, and there are three spaces between
+the list marker and the next [non-whitespace character], then blocks
+must be indented five spaces in order to fall under the list
+item.
+
+Here are some examples showing how far content must be indented to be
+put under the list item:
+
+```````````````````````````````` example
+- one
+
+ two
+.
+
+
one
+
+
two
+````````````````````````````````
+
+
+```````````````````````````````` example
+- one
+
+ two
+.
+
+
+
one
+
two
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+ - one
+
+ two
+.
+
+
one
+
+
two
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+ - one
+
+ two
+.
+
+
+
one
+
two
+
+
+````````````````````````````````
+
+
+It is tempting to think of this in terms of columns: the continuation
+blocks must be indented at least to the column of the first
+[non-whitespace character] after the list marker. However, that is not quite right.
+The spaces after the list marker determine how much relative indentation
+is needed. Which column this indentation reaches will depend on
+how the list item is embedded in other constructions, as shown by
+this example:
+
+```````````````````````````````` example
+ > > 1. one
+>>
+>> two
+.
+
+
+
+
+
one
+
two
+
+
+
+
+````````````````````````````````
+
+
+Here `two` occurs in the same column as the list marker `1.`,
+but is actually contained in the list item, because there is
+sufficient indentation after the last containing blockquote marker.
+
+The converse is also possible. In the following example, the word `two`
+occurs far to the right of the initial text of the list item, `one`, but
+it is not considered part of the list item, because it is not indented
+far enough past the blockquote marker:
+
+```````````````````````````````` example
+>>- one
+>>
+ > > two
+.
+
+
+
+
one
+
+
two
+
+
+````````````````````````````````
+
+
+Note that at least one space is needed between the list marker and
+any following content, so these are not list items:
+
+```````````````````````````````` example
+-one
+
+2.two
+.
+
-one
+
2.two
+````````````````````````````````
+
+
+A list item may contain blocks that are separated by more than
+one blank line.
+
+```````````````````````````````` example
+- foo
+
+
+ bar
+.
+
+
+
foo
+
bar
+
+
+````````````````````````````````
+
+
+A list item may contain any kind of block:
+
+```````````````````````````````` example
+1. foo
+
+ ```
+ bar
+ ```
+
+ baz
+
+ > bam
+.
+
+
+
foo
+
bar
+
+
baz
+
+
bam
+
+
+
+````````````````````````````````
+
+
+A list item that contains an indented code block will preserve
+empty lines within the code block verbatim.
+
+```````````````````````````````` example
+- Foo
+
+ bar
+
+
+ baz
+.
+
+
+
Foo
+
bar
+
+
+baz
+
+
+
+````````````````````````````````
+
+Note that ordered list start numbers must be nine digits or less:
+
+```````````````````````````````` example
+123456789. ok
+.
+
+
ok
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+1234567890. not ok
+.
+
1234567890. not ok
+````````````````````````````````
+
+
+A start number may begin with 0s:
+
+```````````````````````````````` example
+0. ok
+.
+
+
ok
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+003. ok
+.
+
+
ok
+
+````````````````````````````````
+
+
+A start number may not be negative:
+
+```````````````````````````````` example
+-1. not ok
+.
+
-1. not ok
+````````````````````````````````
+
+
+
+2. **Item starting with indented code.** If a sequence of lines *Ls*
+ constitute a sequence of blocks *Bs* starting with an indented code
+ block and not separated from each other by more than one blank line,
+ and *M* is a list marker of width *W* followed by
+ one space, then the result of prepending *M* and the following
+ space to the first line of *Ls*, and indenting subsequent lines of
+ *Ls* by *W + 1* spaces, is a list item with *Bs* as its contents.
+ If a line is empty, then it need not be indented. The type of the
+ list item (bullet or ordered) is determined by the type of its list
+ marker. If the list item is ordered, then it is also assigned a
+ start number, based on the ordered list marker.
+
+An indented code block will have to be indented four spaces beyond
+the edge of the region where text will be included in the list item.
+In the following case that is 6 spaces:
+
+```````````````````````````````` example
+- foo
+
+ bar
+.
+
+
+
foo
+
bar
+
+
+
+````````````````````````````````
+
+
+And in this case it is 11 spaces:
+
+```````````````````````````````` example
+ 10. foo
+
+ bar
+.
+
+
+
foo
+
bar
+
+
+
+````````````````````````````````
+
+
+If the *first* block in the list item is an indented code block,
+then by rule #2, the contents must be indented *one* space after the
+list marker:
+
+```````````````````````````````` example
+ indented code
+
+paragraph
+
+ more code
+.
+
indented code
+
+
paragraph
+
more code
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+1. indented code
+
+ paragraph
+
+ more code
+.
+
+
+
indented code
+
+
paragraph
+
more code
+
+
+
+````````````````````````````````
+
+
+Note that an additional space indent is interpreted as space
+inside the code block:
+
+```````````````````````````````` example
+1. indented code
+
+ paragraph
+
+ more code
+.
+
+
+
indented code
+
+
paragraph
+
more code
+
+
+
+````````````````````````````````
+
+
+Note that rules #1 and #2 only apply to two cases: (a) cases
+in which the lines to be included in a list item begin with a
+[non-whitespace character], and (b) cases in which
+they begin with an indented code
+block. In a case like the following, where the first block begins with
+a three-space indent, the rules do not allow us to form a list item by
+indenting the whole thing and prepending a list marker:
+
+```````````````````````````````` example
+ foo
+
+bar
+.
+
foo
+
bar
+````````````````````````````````
+
+
+```````````````````````````````` example
+- foo
+
+ bar
+.
+
+
foo
+
+
bar
+````````````````````````````````
+
+
+This is not a significant restriction, because when a block begins
+with 1-3 spaces indent, the indentation can always be removed without
+a change in interpretation, allowing rule #1 to be applied. So, in
+the above case:
+
+```````````````````````````````` example
+- foo
+
+ bar
+.
+
+
+
foo
+
bar
+
+
+````````````````````````````````
+
+
+3. **Item starting with a blank line.** If a sequence of lines *Ls*
+ starting with a single [blank line] constitute a (possibly empty)
+ sequence of blocks *Bs*, not separated from each other by more than
+ one blank line, and *M* is a list marker of width *W*,
+ then the result of prepending *M* to the first line of *Ls*, and
+ indenting subsequent lines of *Ls* by *W + 1* spaces, is a list
+ item with *Bs* as its contents.
+ If a line is empty, then it need not be indented. The type of the
+ list item (bullet or ordered) is determined by the type of its list
+ marker. If the list item is ordered, then it is also assigned a
+ start number, based on the ordered list marker.
+
+Here are some list items that start with a blank line but are not empty:
+
+```````````````````````````````` example
+-
+ foo
+-
+ ```
+ bar
+ ```
+-
+ baz
+.
+
+
foo
+
+
bar
+
+
+
+
baz
+
+
+
+````````````````````````````````
+
+When the list item starts with a blank line, the number of spaces
+following the list marker doesn't change the required indentation:
+
+```````````````````````````````` example
+-
+ foo
+.
+
+
foo
+
+````````````````````````````````
+
+
+A list item can begin with at most one blank line.
+In the following example, `foo` is not part of the list
+item:
+
+```````````````````````````````` example
+-
+
+ foo
+.
+
+
+
+
foo
+````````````````````````````````
+
+
+Here is an empty bullet list item:
+
+```````````````````````````````` example
+- foo
+-
+- bar
+.
+
+
foo
+
+
bar
+
+````````````````````````````````
+
+
+It does not matter whether there are spaces following the [list marker]:
+
+```````````````````````````````` example
+- foo
+-
+- bar
+.
+
+
foo
+
+
bar
+
+````````````````````````````````
+
+
+Here is an empty ordered list item:
+
+```````````````````````````````` example
+1. foo
+2.
+3. bar
+.
+
+
foo
+
+
bar
+
+````````````````````````````````
+
+
+A list may start or end with an empty list item:
+
+```````````````````````````````` example
+*
+.
+
+
+
+````````````````````````````````
+
+However, an empty list item cannot interrupt a paragraph:
+
+```````````````````````````````` example
+foo
+*
+
+foo
+1.
+.
+
foo
+*
+
foo
+1.
+````````````````````````````````
+
+
+4. **Indentation.** If a sequence of lines *Ls* constitutes a list item
+ according to rule #1, #2, or #3, then the result of indenting each line
+ of *Ls* by 1-3 spaces (the same for each line) also constitutes a
+ list item with the same contents and attributes. If a line is
+ empty, then it need not be indented.
+
+Indented one space:
+
+```````````````````````````````` example
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+.
+
+
+
A paragraph
+with two lines.
+
indented code
+
+
+
A block quote.
+
+
+
+````````````````````````````````
+
+
+Indented two spaces:
+
+```````````````````````````````` example
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+.
+
+
+
A paragraph
+with two lines.
+
indented code
+
+
+
A block quote.
+
+
+
+````````````````````````````````
+
+
+Indented three spaces:
+
+```````````````````````````````` example
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+.
+
+
+
A paragraph
+with two lines.
+
indented code
+
+
+
A block quote.
+
+
+
+````````````````````````````````
+
+
+Four spaces indent gives a code block:
+
+```````````````````````````````` example
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+.
+
1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+
+````````````````````````````````
+
+
+
+5. **Laziness.** If a string of lines *Ls* constitute a [list
+ item](#list-items) with contents *Bs*, then the result of deleting
+ some or all of the indentation from one or more lines in which the
+ next [non-whitespace character] after the indentation is
+ [paragraph continuation text] is a
+ list item with the same contents and attributes. The unindented
+ lines are called
+ [lazy continuation line](@)s.
+
+Here is an example with [lazy continuation lines]:
+
+```````````````````````````````` example
+ 1. A paragraph
+with two lines.
+
+ indented code
+
+ > A block quote.
+.
+
+
+
A paragraph
+with two lines.
+
indented code
+
+
+
A block quote.
+
+
+
+````````````````````````````````
+
+
+Indentation can be partially deleted:
+
+```````````````````````````````` example
+ 1. A paragraph
+ with two lines.
+.
+
+
A paragraph
+with two lines.
+
+````````````````````````````````
+
+
+These examples show how laziness can work in nested structures:
+
+```````````````````````````````` example
+> 1. > Blockquote
+continued here.
+.
+
+
+
+
+
Blockquote
+continued here.
+
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+> 1. > Blockquote
+> continued here.
+.
+
+
+
+
+
Blockquote
+continued here.
+
+
+
+
+````````````````````````````````
+
+
+
+6. **That's all.** Nothing that is not counted as a list item by rules
+ #1--5 counts as a [list item](#list-items).
+
+The rules for sublists follow from the general rules above. A sublist
+must be indented the same number of spaces a paragraph would need to be
+in order to be included in the list item.
+
+So, in this case we need two spaces indent:
+
+```````````````````````````````` example
+- foo
+ - bar
+ - baz
+ - boo
+.
+
+
foo
+
+
bar
+
+
baz
+
+
boo
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+One is not enough:
+
+```````````````````````````````` example
+- foo
+ - bar
+ - baz
+ - boo
+.
+
+
foo
+
bar
+
baz
+
boo
+
+````````````````````````````````
+
+
+Here we need four, because the list marker is wider:
+
+```````````````````````````````` example
+10) foo
+ - bar
+.
+
+
foo
+
+
bar
+
+
+
+````````````````````````````````
+
+
+Three is not enough:
+
+```````````````````````````````` example
+10) foo
+ - bar
+.
+
+
foo
+
+
+
bar
+
+````````````````````````````````
+
+
+A list may be the first block in a list item:
+
+```````````````````````````````` example
+- - foo
+.
+
+
+````````````````````````````````
+
+
+A list item can contain a heading:
+
+```````````````````````````````` example
+- # Foo
+- Bar
+ ---
+ baz
+.
+
+
+
Foo
+
+
+
Bar
+baz
+
+````````````````````````````````
+
+
+### Motivation
+
+John Gruber's Markdown spec says the following about list items:
+
+1. "List markers typically start at the left margin, but may be indented
+ by up to three spaces. List markers must be followed by one or more
+ spaces or a tab."
+
+2. "To make lists look nice, you can wrap items with hanging indents....
+ But if you don't want to, you don't have to."
+
+3. "List items may consist of multiple paragraphs. Each subsequent
+ paragraph in a list item must be indented by either 4 spaces or one
+ tab."
+
+4. "It looks nice if you indent every line of the subsequent paragraphs,
+ but here again, Markdown will allow you to be lazy."
+
+5. "To put a blockquote within a list item, the blockquote's `>`
+ delimiters need to be indented."
+
+6. "To put a code block within a list item, the code block needs to be
+ indented twice — 8 spaces or two tabs."
+
+These rules specify that a paragraph under a list item must be indented
+four spaces (presumably, from the left margin, rather than the start of
+the list marker, but this is not said), and that code under a list item
+must be indented eight spaces instead of the usual four. They also say
+that a block quote must be indented, but not by how much; however, the
+example given has four spaces indentation. Although nothing is said
+about other kinds of block-level content, it is certainly reasonable to
+infer that *all* block elements under a list item, including other
+lists, must be indented four spaces. This principle has been called the
+*four-space rule*.
+
+The four-space rule is clear and principled, and if the reference
+implementation `Markdown.pl` had followed it, it probably would have
+become the standard. However, `Markdown.pl` allowed paragraphs and
+sublists to start with only two spaces indentation, at least on the
+outer level. Worse, its behavior was inconsistent: a sublist of an
+outer-level list needed two spaces indentation, but a sublist of this
+sublist needed three spaces. It is not surprising, then, that different
+implementations of Markdown have developed very different rules for
+determining what comes under a list item. (Pandoc and python-Markdown,
+for example, stuck with Gruber's syntax description and the four-space
+rule, while discount, redcarpet, marked, PHP Markdown, and others
+followed `Markdown.pl`'s behavior more closely.)
+
+Unfortunately, given the divergences between implementations, there
+is no way to give a spec for list items that will be guaranteed not
+to break any existing documents. However, the spec given here should
+correctly handle lists formatted with either the four-space rule or
+the more forgiving `Markdown.pl` behavior, provided they are laid out
+in a way that is natural for a human to read.
+
+The strategy here is to let the width and indentation of the list marker
+determine the indentation necessary for blocks to fall under the list
+item, rather than having a fixed and arbitrary number. The writer can
+think of the body of the list item as a unit which gets indented to the
+right enough to fit the list marker (and any indentation on the list
+marker). (The laziness rule, #5, then allows continuation lines to be
+unindented if needed.)
+
+This rule is superior, we claim, to any rule requiring a fixed level of
+indentation from the margin. The four-space rule is clear but
+unnatural. It is quite unintuitive that
+
+``` markdown
+- foo
+
+ bar
+
+ - baz
+```
+
+should be parsed as two lists with an intervening paragraph,
+
+``` html
+
+
foo
+
+
bar
+
+
baz
+
+```
+
+as the four-space rule demands, rather than a single list,
+
+``` html
+
+
+
foo
+
bar
+
+
baz
+
+
+
+```
+
+The choice of four spaces is arbitrary. It can be learned, but it is
+not likely to be guessed, and it trips up beginners regularly.
+
+Would it help to adopt a two-space rule? The problem is that such
+a rule, together with the rule allowing 1--3 spaces indentation of the
+initial list marker, allows text that is indented *less than* the
+original list marker to be included in the list item. For example,
+`Markdown.pl` parses
+
+``` markdown
+ - one
+
+ two
+```
+
+as a single list item, with `two` a continuation paragraph:
+
+``` html
+
+
+
one
+
two
+
+
+```
+
+and similarly
+
+``` markdown
+> - one
+>
+> two
+```
+
+as
+
+``` html
+
+
+
+
one
+
two
+
+
+
+```
+
+This is extremely unintuitive.
+
+Rather than requiring a fixed indent from the margin, we could require
+a fixed indent (say, two spaces, or even one space) from the list marker (which
+may itself be indented). This proposal would remove the last anomaly
+discussed. Unlike the spec presented above, it would count the following
+as a list item with a subparagraph, even though the paragraph `bar`
+is not indented as far as the first paragraph `foo`:
+
+``` markdown
+ 10. foo
+
+ bar
+```
+
+Arguably this text does read like a list item with `bar` as a subparagraph,
+which may count in favor of the proposal. However, on this proposal indented
+code would have to be indented six spaces after the list marker. And this
+would break a lot of existing Markdown, which has the pattern:
+
+``` markdown
+1. foo
+
+ indented code
+```
+
+where the code is indented eight spaces. The spec above, by contrast, will
+parse this text as expected, since the code block's indentation is measured
+from the beginning of `foo`.
+
+The one case that needs special treatment is a list item that *starts*
+with indented code. How much indentation is required in that case, since
+we don't have a "first paragraph" to measure from? Rule #2 simply stipulates
+that in such cases, we require one space indentation from the list marker
+(and then the normal four spaces for the indented code). This will match the
+four-space rule in cases where the list marker plus its initial indentation
+takes four spaces (a common case), but diverge in other cases.
+
+## Lists
+
+A [list](@) is a sequence of one or more
+list items [of the same type]. The list items
+may be separated by any number of blank lines.
+
+Two list items are [of the same type](@)
+if they begin with a [list marker] of the same type.
+Two list markers are of the
+same type if (a) they are bullet list markers using the same character
+(`-`, `+`, or `*`) or (b) they are ordered list numbers with the same
+delimiter (either `.` or `)`).
+
+A list is an [ordered list](@)
+if its constituent list items begin with
+[ordered list markers], and a
+[bullet list](@) if its constituent list
+items begin with [bullet list markers].
+
+The [start number](@)
+of an [ordered list] is determined by the list number of
+its initial list item. The numbers of subsequent list items are
+disregarded.
+
+A list is [loose](@) if any of its constituent
+list items are separated by blank lines, or if any of its constituent
+list items directly contain two block-level elements with a blank line
+between them. Otherwise a list is [tight](@).
+(The difference in HTML output is that paragraphs in a loose list are
+wrapped in `
` tags, while paragraphs in a tight list are not.)
+
+Changing the bullet or ordered list delimiter starts a new list:
+
+```````````````````````````````` example
+- foo
+- bar
++ baz
+.
+
+
foo
+
bar
+
+
+
baz
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+1. foo
+2. bar
+3) baz
+.
+
+
foo
+
bar
+
+
+
baz
+
+````````````````````````````````
+
+
+In CommonMark, a list can interrupt a paragraph. That is,
+no blank line is needed to separate a paragraph from a following
+list:
+
+```````````````````````````````` example
+Foo
+- bar
+- baz
+.
+
Foo
+
+
bar
+
baz
+
+````````````````````````````````
+
+`Markdown.pl` does not allow this, through fear of triggering a list
+via a numeral in a hard-wrapped line:
+
+``` markdown
+The number of windows in my house is
+14. The number of doors is 6.
+```
+
+Oddly, though, `Markdown.pl` *does* allow a blockquote to
+interrupt a paragraph, even though the same considerations might
+apply.
+
+In CommonMark, we do allow lists to interrupt paragraphs, for
+two reasons. First, it is natural and not uncommon for people
+to start lists without blank lines:
+
+``` markdown
+I need to buy
+- new shoes
+- a coat
+- a plane ticket
+```
+
+Second, we are attracted to a
+
+> [principle of uniformity](@):
+> if a chunk of text has a certain
+> meaning, it will continue to have the same meaning when put into a
+> container block (such as a list item or blockquote).
+
+(Indeed, the spec for [list items] and [block quotes] presupposes
+this principle.) This principle implies that if
+
+``` markdown
+ * I need to buy
+ - new shoes
+ - a coat
+ - a plane ticket
+```
+
+is a list item containing a paragraph followed by a nested sublist,
+as all Markdown implementations agree it is (though the paragraph
+may be rendered without `
` tags, since the list is "tight"),
+then
+
+``` markdown
+I need to buy
+- new shoes
+- a coat
+- a plane ticket
+```
+
+by itself should be a paragraph followed by a nested sublist.
+
+Since it is well established Markdown practice to allow lists to
+interrupt paragraphs inside list items, the [principle of
+uniformity] requires us to allow this outside list items as
+well. ([reStructuredText](http://docutils.sourceforge.net/rst.html)
+takes a different approach, requiring blank lines before lists
+even inside other list items.)
+
+In order to solve of unwanted lists in paragraphs with
+hard-wrapped numerals, we allow only lists starting with `1` to
+interrupt paragraphs. Thus,
+
+```````````````````````````````` example
+The number of windows in my house is
+14. The number of doors is 6.
+.
+
The number of windows in my house is
+14. The number of doors is 6.
+````````````````````````````````
+
+We may still get an unintended result in cases like
+
+```````````````````````````````` example
+The number of windows in my house is
+1. The number of doors is 6.
+.
+
The number of windows in my house is
+
+
The number of doors is 6.
+
+````````````````````````````````
+
+but this rule should prevent most spurious list captures.
+
+There can be any number of blank lines between items:
+
+```````````````````````````````` example
+- foo
+
+- bar
+
+
+- baz
+.
+
+
+
foo
+
+
+
bar
+
+
+
baz
+
+
+````````````````````````````````
+
+```````````````````````````````` example
+- foo
+ - bar
+ - baz
+
+
+ bim
+.
+
+
foo
+
+
bar
+
+
+
baz
+
bim
+
+
+
+
+
+
+````````````````````````````````
+
+
+To separate consecutive lists of the same type, or to separate a
+list from an indented code block that would otherwise be parsed
+as a subparagraph of the final list item, you can insert a blank HTML
+comment:
+
+```````````````````````````````` example
+- foo
+- bar
+
+
+
+- baz
+- bim
+.
+
+````````````````````````````````
+
+
+List items need not be indented to the same level. The following
+list items will be treated as items at the same list level,
+since none is indented enough to belong to the previous list
+item:
+
+```````````````````````````````` example
+- a
+ - b
+ - c
+ - d
+ - e
+ - f
+ - g
+ - h
+- i
+.
+
+
a
+
b
+
c
+
d
+
e
+
f
+
g
+
h
+
i
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+1. a
+
+ 2. b
+
+ 3. c
+.
+
+
+
a
+
+
+
b
+
+
+
c
+
+
+````````````````````````````````
+
+
+This is a loose list, because there is a blank line between
+two of the list items:
+
+```````````````````````````````` example
+- a
+- b
+
+- c
+.
+
+
+
a
+
+
+
b
+
+
+
c
+
+
+````````````````````````````````
+
+
+So is this, with a empty second item:
+
+```````````````````````````````` example
+* a
+*
+
+* c
+.
+
+
+
a
+
+
+
+
c
+
+
+````````````````````````````````
+
+
+These are loose lists, even though there is no space between the items,
+because one of the items directly contains two block-level elements
+with a blank line between them:
+
+```````````````````````````````` example
+- a
+- b
+
+ c
+- d
+.
+
+
+
a
+
+
+
b
+
c
+
+
+
d
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+- a
+- b
+
+ [ref]: /url
+- d
+.
+
+
+
a
+
+
+
b
+
+
+
d
+
+
+````````````````````````````````
+
+
+This is a tight list, because the blank lines are in a code block:
+
+```````````````````````````````` example
+- a
+- ```
+ b
+
+
+ ```
+- c
+.
+
+
a
+
+
b
+
+
+
+
+
c
+
+````````````````````````````````
+
+
+This is a tight list, because the blank line is between two
+paragraphs of a sublist. So the sublist is loose while
+the outer list is tight:
+
+```````````````````````````````` example
+- a
+ - b
+
+ c
+- d
+.
+
+
a
+
+
+
b
+
c
+
+
+
+
d
+
+````````````````````````````````
+
+
+This is a tight list, because the blank line is inside the
+block quote:
+
+```````````````````````````````` example
+* a
+ > b
+ >
+* c
+.
+
+
a
+
+
b
+
+
+
c
+
+````````````````````````````````
+
+
+This list is tight, because the consecutive block elements
+are not separated by blank lines:
+
+```````````````````````````````` example
+- a
+ > b
+ ```
+ c
+ ```
+- d
+.
+
+
a
+
+
b
+
+
c
+
+
+
d
+
+````````````````````````````````
+
+
+A single-paragraph list is tight:
+
+```````````````````````````````` example
+- a
+.
+
+
a
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+- a
+ - b
+.
+
+
a
+
+
b
+
+
+
+````````````````````````````````
+
+
+This list is loose, because of the blank line between the
+two block elements in the list item:
+
+```````````````````````````````` example
+1. ```
+ foo
+ ```
+
+ bar
+.
+
+
+
foo
+
+
bar
+
+
+````````````````````````````````
+
+
+Here the outer list is loose, the inner list tight:
+
+```````````````````````````````` example
+* foo
+ * bar
+
+ baz
+.
+
+
+
foo
+
+
bar
+
+
baz
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+- a
+ - b
+ - c
+
+- d
+ - e
+ - f
+.
+
+
+
a
+
+
b
+
c
+
+
+
+
d
+
+
e
+
f
+
+
+
+````````````````````````````````
+
+
+# Inlines
+
+Inlines are parsed sequentially from the beginning of the character
+stream to the end (left to right, in left-to-right languages).
+Thus, for example, in
+
+```````````````````````````````` example
+`hi`lo`
+.
+
hilo`
+````````````````````````````````
+
+
+`hi` is parsed as code, leaving the backtick at the end as a literal
+backtick.
+
+## Backslash escapes
+
+Any ASCII punctuation character may be backslash-escaped:
+
+```````````````````````````````` example
+\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~
+.
+
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
+````````````````````````````````
+
+
+Backslashes before other characters are treated as literal
+backslashes:
+
+```````````````````````````````` example
+\→\A\a\ \3\φ\«
+.
+
\→\A\a\ \3\φ\«
+````````````````````````````````
+
+
+Escaped characters are treated as regular characters and do
+not have their usual Markdown meanings:
+
+```````````````````````````````` example
+\*not emphasized*
+\ not a tag
+\[not a link](/foo)
+\`not code`
+1\. not a list
+\* not a list
+\# not a heading
+\[foo]: /url "not a reference"
+.
+
*not emphasized*
+<br/> not a tag
+[not a link](/foo)
+`not code`
+1. not a list
+* not a list
+# not a heading
+[foo]: /url "not a reference"
+````````````````````````````````
+
+
+If a backslash is itself escaped, the following character is not:
+
+```````````````````````````````` example
+\\*emphasis*
+.
+
\emphasis
+````````````````````````````````
+
+
+A backslash at the end of the line is a [hard line break]:
+
+```````````````````````````````` example
+foo\
+bar
+.
+
foo
+bar
+````````````````````````````````
+
+
+Backslash escapes do not work in code blocks, code spans, autolinks, or
+raw HTML:
+
+```````````````````````````````` example
+`` \[\` ``
+.
+
\[\`
+````````````````````````````````
+
+
+```````````````````````````````` example
+ \[\]
+.
+
\[\]
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~
+\[\]
+~~~
+.
+
\[\]
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+
+.
+
+````````````````````````````````
+
+
+[Decimal numeric character
+references](@)
+consist of `` + a string of 1--8 arabic digits + `;`. A
+numeric character reference is parsed as the corresponding
+Unicode character. Invalid Unicode code points will be replaced by
+the REPLACEMENT CHARACTER (`U+FFFD`). For security reasons,
+the code point `U+0000` will also be replaced by `U+FFFD`.
+
+```````````````````````````````` example
+# Ӓ Ϡ
+.
+
# Ӓ Ϡ � �
+````````````````````````````````
+
+
+[Hexadecimal numeric character
+references](@) consist of `` +
+either `X` or `x` + a string of 1-8 hexadecimal digits + `;`.
+They too are parsed as the corresponding Unicode character (this
+time specified with a hexadecimal numeral instead of decimal).
+
+```````````````````````````````` example
+" ആ ಫ
+.
+
" ആ ಫ
+````````````````````````````````
+
+
+Here are some nonentities:
+
+```````````````````````````````` example
+  &x;
+&ThisIsNotDefined; &hi?;
+.
+
+````````````````````````````````
+
+
+Strings that are not on the list of HTML5 named entities are not
+recognized as entity references either:
+
+```````````````````````````````` example
+&MadeUpEntity;
+.
+
+````````````````````````````````
+
+
+Entity and numeric character references are treated as literal
+text in code spans and code blocks:
+
+```````````````````````````````` example
+`föö`
+.
+
föö
+````````````````````````````````
+
+
+```````````````````````````````` example
+ föfö
+.
+
föfö
+
+````````````````````````````````
+
+
+## Code spans
+
+A [backtick string](@)
+is a string of one or more backtick characters (`` ` ``) that is neither
+preceded nor followed by a backtick.
+
+A [code span](@) begins with a backtick string and ends with
+a backtick string of equal length. The contents of the code span are
+the characters between the two backtick strings, with leading and
+trailing spaces and [line endings] removed, and
+[whitespace] collapsed to single spaces.
+
+This is a simple code span:
+
+```````````````````````````````` example
+`foo`
+.
+
foo
+````````````````````````````````
+
+
+Here two backticks are used, because the code contains a backtick.
+This example also illustrates stripping of leading and trailing spaces:
+
+```````````````````````````````` example
+`` foo ` bar ``
+.
+
foo ` bar
+````````````````````````````````
+
+
+This example shows the motivation for stripping leading and trailing
+spaces:
+
+```````````````````````````````` example
+` `` `
+.
+
``
+````````````````````````````````
+
+
+[Line endings] are treated like spaces:
+
+```````````````````````````````` example
+``
+foo
+``
+.
+
foo
+````````````````````````````````
+
+
+Interior spaces and [line endings] are collapsed into
+single spaces, just as they would be by a browser:
+
+```````````````````````````````` example
+`foo bar
+ baz`
+.
+
foo bar baz
+````````````````````````````````
+
+
+Not all [Unicode whitespace] (for instance, non-breaking space) is
+collapsed, however:
+
+```````````````````````````````` example
+`a b`
+.
+
a b
+````````````````````````````````
+
+
+Q: Why not just leave the spaces, since browsers will collapse them
+anyway? A: Because we might be targeting a non-HTML format, and we
+shouldn't rely on HTML-specific rendering assumptions.
+
+(Existing implementations differ in their treatment of internal
+spaces and [line endings]. Some, including `Markdown.pl` and
+`showdown`, convert an internal [line ending] into a
+` ` tag. But this makes things difficult for those who like to
+hard-wrap their paragraphs, since a line break in the midst of a code
+span will cause an unintended line break in the output. Others just
+leave internal spaces as they are, which is fine if only HTML is being
+targeted.)
+
+```````````````````````````````` example
+`foo `` bar`
+.
+
foo `` bar
+````````````````````````````````
+
+
+Note that backslash escapes do not work in code spans. All backslashes
+are treated literally:
+
+```````````````````````````````` example
+`foo\`bar`
+.
+
foo\bar`
+````````````````````````````````
+
+
+Backslash escapes are never needed, because one can always choose a
+string of *n* backtick characters as delimiters, where the code does
+not contain any strings of exactly *n* backtick characters.
+
+Code span backticks have higher precedence than any other inline
+constructs except HTML tags and autolinks. Thus, for example, this is
+not parsed as emphasized text, since the second `*` is part of a code
+span:
+
+```````````````````````````````` example
+*foo`*`
+.
+
*foo*
+````````````````````````````````
+
+
+And this is not parsed as a link:
+
+```````````````````````````````` example
+[not a `link](/foo`)
+.
+
[not a link](/foo)
+````````````````````````````````
+
+
+Code spans, HTML tags, and autolinks have the same precedence.
+Thus, this is code:
+
+```````````````````````````````` example
+``
+.
+
+````````````````````````````````
+
+
+When a backtick string is not closed by a matching backtick string,
+we just have literal backticks:
+
+```````````````````````````````` example
+```foo``
+.
+
```foo``
+````````````````````````````````
+
+
+```````````````````````````````` example
+`foo
+.
+
`foo
+````````````````````````````````
+
+
+## Emphasis and strong emphasis
+
+John Gruber's original [Markdown syntax
+description](http://daringfireball.net/projects/markdown/syntax#em) says:
+
+> Markdown treats asterisks (`*`) and underscores (`_`) as indicators of
+> emphasis. Text wrapped with one `*` or `_` will be wrapped with an HTML
+> `` tag; double `*`'s or `_`'s will be wrapped with an HTML ``
+> tag.
+
+This is enough for most users, but these rules leave much undecided,
+especially when it comes to nested emphasis. The original
+`Markdown.pl` test suite makes it clear that triple `***` and
+`___` delimiters can be used for strong emphasis, and most
+implementations have also allowed the following patterns:
+
+``` markdown
+***strong emph***
+***strong** in emph*
+***emph* in strong**
+**in strong *emph***
+*in emph **strong***
+```
+
+The following patterns are less widely supported, but the intent
+is clear and they are useful (especially in contexts like bibliography
+entries):
+
+``` markdown
+*emph *with emph* in it*
+**strong **with strong** in it**
+```
+
+Many implementations have also restricted intraword emphasis to
+the `*` forms, to avoid unwanted emphasis in words containing
+internal underscores. (It is best practice to put these in code
+spans, but users often do not.)
+
+``` markdown
+internal emphasis: foo*bar*baz
+no emphasis: foo_bar_baz
+```
+
+The rules given below capture all of these patterns, while allowing
+for efficient parsing strategies that do not backtrack.
+
+First, some definitions. A [delimiter run](@) is either
+a sequence of one or more `*` characters that is not preceded or
+followed by a `*` character, or a sequence of one or more `_`
+characters that is not preceded or followed by a `_` character.
+
+A [left-flanking delimiter run](@) is
+a [delimiter run] that is (a) not followed by [Unicode whitespace],
+and (b) either not followed by a [punctuation character], or
+preceded by [Unicode whitespace] or a [punctuation character].
+For purposes of this definition, the beginning and the end of
+the line count as Unicode whitespace.
+
+A [right-flanking delimiter run](@) is
+a [delimiter run] that is (a) not preceded by [Unicode whitespace],
+and (b) either not preceded by a [punctuation character], or
+followed by [Unicode whitespace] or a [punctuation character].
+For purposes of this definition, the beginning and the end of
+the line count as Unicode whitespace.
+
+Here are some examples of delimiter runs.
+
+ - left-flanking but not right-flanking:
+
+ ```
+ ***abc
+ _abc
+ **"abc"
+ _"abc"
+ ```
+
+ - right-flanking but not left-flanking:
+
+ ```
+ abc***
+ abc_
+ "abc"**
+ "abc"_
+ ```
+
+ - Both left and right-flanking:
+
+ ```
+ abc***def
+ "abc"_"def"
+ ```
+
+ - Neither left nor right-flanking:
+
+ ```
+ abc *** def
+ a _ b
+ ```
+
+(The idea of distinguishing left-flanking and right-flanking
+delimiter runs based on the character before and the character
+after comes from Roopesh Chander's
+[vfmd](http://www.vfmd.org/vfmd-spec/specification/#procedure-for-identifying-emphasis-tags).
+vfmd uses the terminology "emphasis indicator string" instead of "delimiter
+run," and its rules for distinguishing left- and right-flanking runs
+are a bit more complex than the ones given here.)
+
+The following rules define emphasis and strong emphasis:
+
+1. A single `*` character [can open emphasis](@)
+ iff (if and only if) it is part of a [left-flanking delimiter run].
+
+2. A single `_` character [can open emphasis] iff
+ it is part of a [left-flanking delimiter run]
+ and either (a) not part of a [right-flanking delimiter run]
+ or (b) part of a [right-flanking delimiter run]
+ preceded by punctuation.
+
+3. A single `*` character [can close emphasis](@)
+ iff it is part of a [right-flanking delimiter run].
+
+4. A single `_` character [can close emphasis] iff
+ it is part of a [right-flanking delimiter run]
+ and either (a) not part of a [left-flanking delimiter run]
+ or (b) part of a [left-flanking delimiter run]
+ followed by punctuation.
+
+5. A double `**` [can open strong emphasis](@)
+ iff it is part of a [left-flanking delimiter run].
+
+6. A double `__` [can open strong emphasis] iff
+ it is part of a [left-flanking delimiter run]
+ and either (a) not part of a [right-flanking delimiter run]
+ or (b) part of a [right-flanking delimiter run]
+ preceded by punctuation.
+
+7. A double `**` [can close strong emphasis](@)
+ iff it is part of a [right-flanking delimiter run].
+
+8. A double `__` [can close strong emphasis]
+ it is part of a [right-flanking delimiter run]
+ and either (a) not part of a [left-flanking delimiter run]
+ or (b) part of a [left-flanking delimiter run]
+ followed by punctuation.
+
+9. Emphasis begins with a delimiter that [can open emphasis] and ends
+ with a delimiter that [can close emphasis], and that uses the same
+ character (`_` or `*`) as the opening delimiter. The
+ opening and closing delimiters must belong to separate
+ [delimiter runs]. If one of the delimiters can both
+ open and close emphasis, then the sum of the lengths of the
+ delimiter runs containing the opening and closing delimiters
+ must not be a multiple of 3.
+
+10. Strong emphasis begins with a delimiter that
+ [can open strong emphasis] and ends with a delimiter that
+ [can close strong emphasis], and that uses the same character
+ (`_` or `*`) as the opening delimiter. The
+ opening and closing delimiters must belong to separate
+ [delimiter runs]. If one of the delimiters can both open
+ and close strong emphasis, then the sum of the lengths of
+ the delimiter runs containing the opening and closing
+ delimiters must not be a multiple of 3.
+
+11. A literal `*` character cannot occur at the beginning or end of
+ `*`-delimited emphasis or `**`-delimited strong emphasis, unless it
+ is backslash-escaped.
+
+12. A literal `_` character cannot occur at the beginning or end of
+ `_`-delimited emphasis or `__`-delimited strong emphasis, unless it
+ is backslash-escaped.
+
+Where rules 1--12 above are compatible with multiple parsings,
+the following principles resolve ambiguity:
+
+13. The number of nestings should be minimized. Thus, for example,
+ an interpretation `...` is always preferred to
+ `...`.
+
+14. An interpretation `...` is always
+ preferred to `..`.
+
+15. When two potential emphasis or strong emphasis spans overlap,
+ so that the second begins before the first ends and ends after
+ the first ends, the first takes precedence. Thus, for example,
+ `*foo _bar* baz_` is parsed as `foo _bar baz_` rather
+ than `*foo bar* baz`.
+
+16. When there are two potential emphasis or strong emphasis spans
+ with the same closing delimiter, the shorter one (the one that
+ opens later) takes precedence. Thus, for example,
+ `**foo **bar baz**` is parsed as `**foo bar baz`
+ rather than `foo **bar baz`.
+
+17. Inline code spans, links, images, and HTML tags group more tightly
+ than emphasis. So, when there is a choice between an interpretation
+ that contains one of these elements and one that does not, the
+ former always wins. Thus, for example, `*[foo*](bar)` is
+ parsed as `*foo*` rather than as
+ `[foo](bar)`.
+
+These rules can be illustrated through a series of examples.
+
+Rule 1:
+
+```````````````````````````````` example
+*foo bar*
+.
+
foo bar
+````````````````````````````````
+
+
+This is not emphasis, because the opening `*` is followed by
+whitespace, and hence not part of a [left-flanking delimiter run]:
+
+```````````````````````````````` example
+a * foo bar*
+.
+
a * foo bar*
+````````````````````````````````
+
+
+This is not emphasis, because the opening `*` is preceded
+by an alphanumeric and followed by punctuation, and hence
+not part of a [left-flanking delimiter run]:
+
+```````````````````````````````` example
+a*"foo"*
+.
+
a*"foo"*
+````````````````````````````````
+
+
+Unicode nonbreaking spaces count as whitespace, too:
+
+```````````````````````````````` example
+* a *
+.
+
* a *
+````````````````````````````````
+
+
+Intraword emphasis with `*` is permitted:
+
+```````````````````````````````` example
+foo*bar*
+.
+
foobar
+````````````````````````````````
+
+
+```````````````````````````````` example
+5*6*78
+.
+
+````````````````````````````````
+
+
+This is not emphasis, because the opening `_` is followed by
+whitespace:
+
+```````````````````````````````` example
+_ foo bar_
+.
+
_ foo bar_
+````````````````````````````````
+
+
+This is not emphasis, because the opening `_` is preceded
+by an alphanumeric and followed by punctuation:
+
+```````````````````````````````` example
+a_"foo"_
+.
+
a_"foo"_
+````````````````````````````````
+
+
+Emphasis with `_` is not allowed inside words:
+
+```````````````````````````````` example
+foo_bar_
+.
+
foo_bar_
+````````````````````````````````
+
+
+```````````````````````````````` example
+5_6_78
+.
+
5_6_78
+````````````````````````````````
+
+
+```````````````````````````````` example
+пристаням_стремятся_
+.
+
пристаням_стремятся_
+````````````````````````````````
+
+
+Here `_` does not generate emphasis, because the first delimiter run
+is right-flanking and the second left-flanking:
+
+```````````````````````````````` example
+aa_"bb"_cc
+.
+
aa_"bb"_cc
+````````````````````````````````
+
+
+This is emphasis, even though the opening delimiter is
+both left- and right-flanking, because it is preceded by
+punctuation:
+
+```````````````````````````````` example
+foo-_(bar)_
+.
+
foo-(bar)
+````````````````````````````````
+
+
+Rule 3:
+
+This is not emphasis, because the closing delimiter does
+not match the opening delimiter:
+
+```````````````````````````````` example
+_foo*
+.
+
_foo*
+````````````````````````````````
+
+
+This is not emphasis, because the closing `*` is preceded by
+whitespace:
+
+```````````````````````````````` example
+*foo bar *
+.
+
*foo bar *
+````````````````````````````````
+
+
+A newline also counts as whitespace:
+
+```````````````````````````````` example
+*foo bar
+*
+.
+
*foo bar
+*
+````````````````````````````````
+
+
+This is not emphasis, because the second `*` is
+preceded by punctuation and followed by an alphanumeric
+(hence it is not part of a [right-flanking delimiter run]:
+
+```````````````````````````````` example
+*(*foo)
+.
+
*(*foo)
+````````````````````````````````
+
+
+The point of this restriction is more easily appreciated
+with this example:
+
+```````````````````````````````` example
+*(*foo*)*
+.
+
(foo)
+````````````````````````````````
+
+
+Intraword emphasis with `*` is allowed:
+
+```````````````````````````````` example
+*foo*bar
+.
+
foobar
+````````````````````````````````
+
+
+
+Rule 4:
+
+This is not emphasis, because the closing `_` is preceded by
+whitespace:
+
+```````````````````````````````` example
+_foo bar _
+.
+
_foo bar _
+````````````````````````````````
+
+
+This is not emphasis, because the second `_` is
+preceded by punctuation and followed by an alphanumeric:
+
+```````````````````````````````` example
+_(_foo)
+.
+
_(_foo)
+````````````````````````````````
+
+
+This is emphasis within emphasis:
+
+```````````````````````````````` example
+_(_foo_)_
+.
+
(foo)
+````````````````````````````````
+
+
+Intraword emphasis is disallowed for `_`:
+
+```````````````````````````````` example
+_foo_bar
+.
+
_foo_bar
+````````````````````````````````
+
+
+```````````````````````````````` example
+_пристаням_стремятся
+.
+
_пристаням_стремятся
+````````````````````````````````
+
+
+```````````````````````````````` example
+_foo_bar_baz_
+.
+
foo_bar_baz
+````````````````````````````````
+
+
+This is emphasis, even though the closing delimiter is
+both left- and right-flanking, because it is followed by
+punctuation:
+
+```````````````````````````````` example
+_(bar)_.
+.
+
+````````````````````````````````
+
+
+This is not strong emphasis, because the opening delimiter is
+followed by whitespace:
+
+```````````````````````````````` example
+** foo bar**
+.
+
** foo bar**
+````````````````````````````````
+
+
+This is not strong emphasis, because the opening `**` is preceded
+by an alphanumeric and followed by punctuation, and hence
+not part of a [left-flanking delimiter run]:
+
+```````````````````````````````` example
+a**"foo"**
+.
+
a**"foo"**
+````````````````````````````````
+
+
+Intraword strong emphasis with `**` is permitted:
+
+```````````````````````````````` example
+foo**bar**
+.
+
+````````````````````````````````
+
+
+This is not strong emphasis, because the opening delimiter is
+followed by whitespace:
+
+```````````````````````````````` example
+__ foo bar__
+.
+
__ foo bar__
+````````````````````````````````
+
+
+A newline counts as whitespace:
+```````````````````````````````` example
+__
+foo bar__
+.
+
__
+foo bar__
+````````````````````````````````
+
+
+This is not strong emphasis, because the opening `__` is preceded
+by an alphanumeric and followed by punctuation:
+
+```````````````````````````````` example
+a__"foo"__
+.
+
a__"foo"__
+````````````````````````````````
+
+
+Intraword strong emphasis is forbidden with `__`:
+
+```````````````````````````````` example
+foo__bar__
+.
+
foo__bar__
+````````````````````````````````
+
+
+```````````````````````````````` example
+5__6__78
+.
+
5__6__78
+````````````````````````````````
+
+
+```````````````````````````````` example
+пристаням__стремятся__
+.
+
пристаням__стремятся__
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo, __bar__, baz__
+.
+
foo, bar, baz
+````````````````````````````````
+
+
+This is strong emphasis, even though the opening delimiter is
+both left- and right-flanking, because it is preceded by
+punctuation:
+
+```````````````````````````````` example
+foo-__(bar)__
+.
+
foo-(bar)
+````````````````````````````````
+
+
+
+Rule 7:
+
+This is not strong emphasis, because the closing delimiter is preceded
+by whitespace:
+
+```````````````````````````````` example
+**foo bar **
+.
+
**foo bar **
+````````````````````````````````
+
+
+(Nor can it be interpreted as an emphasized `*foo bar *`, because of
+Rule 11.)
+
+This is not strong emphasis, because the second `**` is
+preceded by punctuation and followed by an alphanumeric:
+
+```````````````````````````````` example
+**(**foo)
+.
+
**(**foo)
+````````````````````````````````
+
+
+The point of this restriction is more easily appreciated
+with these examples:
+
+```````````````````````````````` example
+*(**foo**)*
+.
+
+````````````````````````````````
+
+
+Rule 8:
+
+This is not strong emphasis, because the closing delimiter is
+preceded by whitespace:
+
+```````````````````````````````` example
+__foo bar __
+.
+
__foo bar __
+````````````````````````````````
+
+
+This is not strong emphasis, because the second `__` is
+preceded by punctuation and followed by an alphanumeric:
+
+```````````````````````````````` example
+__(__foo)
+.
+
__(__foo)
+````````````````````````````````
+
+
+The point of this restriction is more easily appreciated
+with this example:
+
+```````````````````````````````` example
+_(__foo__)_
+.
+
(foo)
+````````````````````````````````
+
+
+Intraword strong emphasis is forbidden with `__`:
+
+```````````````````````````````` example
+__foo__bar
+.
+
__foo__bar
+````````````````````````````````
+
+
+```````````````````````````````` example
+__пристаням__стремятся
+.
+
__пристаням__стремятся
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo__bar__baz__
+.
+
foo__bar__baz
+````````````````````````````````
+
+
+This is strong emphasis, even though the closing delimiter is
+both left- and right-flanking, because it is followed by
+punctuation:
+
+```````````````````````````````` example
+__(bar)__.
+.
+
(bar).
+````````````````````````````````
+
+
+Rule 9:
+
+Any nonempty sequence of inline elements can be the contents of an
+emphasized span.
+
+```````````````````````````````` example
+*foo [bar](/url)*
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo
+bar*
+.
+
foo
+bar
+````````````````````````````````
+
+
+In particular, emphasis and strong emphasis can be nested
+inside emphasis:
+
+```````````````````````````````` example
+_foo __bar__ baz_
+.
+
foo bar baz
+````````````````````````````````
+
+
+```````````````````````````````` example
+_foo _bar_ baz_
+.
+
foo bar baz
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo_ bar_
+.
+
foo bar
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo *bar**
+.
+
foo bar
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo **bar** baz*
+.
+
foo bar baz
+````````````````````````````````
+
+```````````````````````````````` example
+*foo**bar**baz*
+.
+
foobarbaz
+````````````````````````````````
+
+Note that in the preceding case, the interpretation
+
+``` markdown
+
foobarbaz
+```
+
+
+is precluded by the condition that a delimiter that
+can both open and close (like the `*` after `foo`)
+cannot form emphasis if the sum of the lengths of
+the delimiter runs containing the opening and
+closing delimiters is a multiple of 3.
+
+The same condition ensures that the following
+cases are all strong emphasis nested inside
+emphasis, even when the interior spaces are
+omitted:
+
+
+```````````````````````````````` example
+***foo** bar*
+.
+
foo bar
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo **bar***
+.
+
foo bar
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo**bar***
+.
+
foobar
+````````````````````````````````
+
+
+Indefinite levels of nesting are possible:
+
+```````````````````````````````` example
+*foo **bar *baz* bim** bop*
+.
+
foo bar baz bim bop
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo [*bar*](/url)*
+.
+
+````````````````````````````````
+
+
+There can be no empty emphasis or strong emphasis:
+
+```````````````````````````````` example
+** is not an empty emphasis
+.
+
** is not an empty emphasis
+````````````````````````````````
+
+
+```````````````````````````````` example
+**** is not an empty strong emphasis
+.
+
**** is not an empty strong emphasis
+````````````````````````````````
+
+
+
+Rule 10:
+
+Any nonempty sequence of inline elements can be the contents of an
+strongly emphasized span.
+
+```````````````````````````````` example
+**foo [bar](/url)**
+.
+
+````````````````````````````````
+
+
+There can be no empty emphasis or strong emphasis:
+
+```````````````````````````````` example
+__ is not an empty emphasis
+.
+
__ is not an empty emphasis
+````````````````````````````````
+
+
+```````````````````````````````` example
+____ is not an empty strong emphasis
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo *\**
+.
+
foo *
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo *_*
+.
+
foo _
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo *****
+.
+
foo *****
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo **\***
+.
+
foo *
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo **_**
+.
+
foo _
+````````````````````````````````
+
+
+Note that when delimiters do not match evenly, Rule 11 determines
+that the excess literal `*` characters will appear outside of the
+emphasis, rather than inside it:
+
+```````````````````````````````` example
+**foo*
+.
+
*foo
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo**
+.
+
foo*
+````````````````````````````````
+
+
+```````````````````````````````` example
+***foo**
+.
+
*foo
+````````````````````````````````
+
+
+```````````````````````````````` example
+****foo*
+.
+
***foo
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo***
+.
+
foo*
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo****
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo _\__
+.
+
foo _
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo _*_
+.
+
foo *
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo _____
+.
+
foo _____
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo __\___
+.
+
foo _
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo __*__
+.
+
foo *
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo_
+.
+
_foo
+````````````````````````````````
+
+
+Note that when delimiters do not match evenly, Rule 12 determines
+that the excess literal `_` characters will appear outside of the
+emphasis, rather than inside it:
+
+```````````````````````````````` example
+_foo__
+.
+
foo_
+````````````````````````````````
+
+
+```````````````````````````````` example
+___foo__
+.
+
_foo
+````````````````````````````````
+
+
+```````````````````````````````` example
+____foo_
+.
+
___foo
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo___
+.
+
foo_
+````````````````````````````````
+
+
+```````````````````````````````` example
+_foo____
+.
+
foo___
+````````````````````````````````
+
+
+Rule 13 implies that if you want emphasis nested directly inside
+emphasis, you must use different delimiters:
+
+```````````````````````````````` example
+**foo**
+.
+
foo
+````````````````````````````````
+
+
+```````````````````````````````` example
+*_foo_*
+.
+
foo
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo__
+.
+
foo
+````````````````````````````````
+
+
+```````````````````````````````` example
+_*foo*_
+.
+
foo
+````````````````````````````````
+
+
+However, strong emphasis within strong emphasis is possible without
+switching delimiters:
+
+```````````````````````````````` example
+****foo****
+.
+
foo
+````````````````````````````````
+
+
+```````````````````````````````` example
+____foo____
+.
+
foo
+````````````````````````````````
+
+
+
+Rule 13 can be applied to arbitrarily long sequences of
+delimiters:
+
+```````````````````````````````` example
+******foo******
+.
+
+````````````````````````````````
+
+
+
+## Links
+
+A link contains [link text] (the visible text), a [link destination]
+(the URI that is the link destination), and optionally a [link title].
+There are two basic kinds of links in Markdown. In [inline links] the
+destination and title are given immediately after the link text. In
+[reference links] the destination and title are defined elsewhere in
+the document.
+
+A [link text](@) consists of a sequence of zero or more
+inline elements enclosed by square brackets (`[` and `]`). The
+following rules apply:
+
+- Links may not contain other links, at any level of nesting. If
+ multiple otherwise valid link definitions appear nested inside each
+ other, the inner-most definition is used.
+
+- Brackets are allowed in the [link text] only if (a) they
+ are backslash-escaped or (b) they appear as a matched pair of brackets,
+ with an open bracket `[`, a sequence of zero or more inlines, and
+ a close bracket `]`.
+
+- Backtick [code spans], [autolinks], and raw [HTML tags] bind more tightly
+ than the brackets in link text. Thus, for example,
+ `` [foo`]` `` could not be a link text, since the second `]`
+ is part of a code span.
+
+- The brackets in link text bind more tightly than markers for
+ [emphasis and strong emphasis]. Thus, for example, `*[foo*](url)` is a link.
+
+A [link destination](@) consists of either
+
+- a sequence of zero or more characters between an opening `<` and a
+ closing `>` that contains no spaces, line breaks, or unescaped
+ `<` or `>` characters, or
+
+- a nonempty sequence of characters that does not include
+ ASCII space or control characters, and includes parentheses
+ only if (a) they are backslash-escaped or (b) they are part of
+ a balanced pair of unescaped parentheses that is not itself
+ inside a balanced pair of unescaped parentheses.
+
+A [link title](@) consists of either
+
+- a sequence of zero or more characters between straight double-quote
+ characters (`"`), including a `"` character only if it is
+ backslash-escaped, or
+
+- a sequence of zero or more characters between straight single-quote
+ characters (`'`), including a `'` character only if it is
+ backslash-escaped, or
+
+- a sequence of zero or more characters between matching parentheses
+ (`(...)`), including a `)` character only if it is backslash-escaped.
+
+Although [link titles] may span multiple lines, they may not contain
+a [blank line].
+
+An [inline link](@) consists of a [link text] followed immediately
+by a left parenthesis `(`, optional [whitespace], an optional
+[link destination], an optional [link title] separated from the link
+destination by [whitespace], optional [whitespace], and a right
+parenthesis `)`. The link's text consists of the inlines contained
+in the [link text] (excluding the enclosing square brackets).
+The link's URI consists of the link destination, excluding enclosing
+`<...>` if present, with backslash-escapes in effect as described
+above. The link's title consists of the link title, excluding its
+enclosing delimiters, with backslash-escapes in effect as described
+above.
+
+Here is a simple inline link:
+
+```````````````````````````````` example
+[link](/uri "title")
+.
+
+````````````````````````````````
+
+
+The destination cannot contain spaces or line breaks,
+even if enclosed in pointy brackets:
+
+```````````````````````````````` example
+[link](/my uri)
+.
+
[link](/my uri)
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link]()
+.
+
[link](</my uri>)
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link](foo
+bar)
+.
+
[link](foo
+bar)
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link]()
+.
+
[link]()
+````````````````````````````````
+
+Parentheses inside the link destination may be escaped:
+
+```````````````````````````````` example
+[link](\(foo\))
+.
+
+````````````````````````````````
+
+One level of balanced parentheses is allowed without escaping:
+
+```````````````````````````````` example
+[link]((foo)and(bar))
+.
+
+````````````````````````````````
+
+However, if you have parentheses within parentheses, you need to escape
+or use the `<...>` form:
+
+```````````````````````````````` example
+[link](foo(and(bar)))
+.
+
[link](foo(and(bar)))
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link](foo(and\(bar\)))
+.
+
+````````````````````````````````
+
+
+Parentheses and other symbols can also be escaped, as usual
+in Markdown:
+
+```````````````````````````````` example
+[link](foo\)\:)
+.
+
+````````````````````````````````
+
+
+A link can contain fragment identifiers and queries:
+
+```````````````````````````````` example
+[link](#fragment)
+
+[link](http://example.com#fragment)
+
+[link](http://example.com?foo=3#frag)
+.
+
+````````````````````````````````
+
+
+Note that a backslash before a non-escapable character is
+just a backslash:
+
+```````````````````````````````` example
+[link](foo\bar)
+.
+
+````````````````````````````````
+
+
+URL-escaping should be left alone inside the destination, as all
+URL-escaped characters are also valid URL characters. Entity and
+numerical character references in the destination will be parsed
+into the corresponding Unicode code points, as usual. These may
+be optionally URL-escaped when written as HTML, but this spec
+does not enforce any particular policy for rendering URLs in
+HTML or other formats. Renderers may make different decisions
+about how to escape or normalize URLs in the output.
+
+```````````````````````````````` example
+[link](foo%20bä)
+.
+
+````````````````````````````````
+
+
+Note that, because titles can often be parsed as destinations,
+if you try to omit the destination and keep the title, you'll
+get unexpected results:
+
+```````````````````````````````` example
+[link]("title")
+.
+
+````````````````````````````````
+
+
+Titles may be in single quotes, double quotes, or parentheses:
+
+```````````````````````````````` example
+[link](/url "title")
+[link](/url 'title')
+[link](/url (title))
+.
+
+````````````````````````````````
+
+
+Backslash escapes and entity and numeric character references
+may be used in titles:
+
+```````````````````````````````` example
+[link](/url "title \""")
+.
+
+````````````````````````````````
+
+
+Titles must be separated from the link using a [whitespace].
+Other [Unicode whitespace] like non-breaking space doesn't work.
+
+```````````````````````````````` example
+[link](/url "title")
+.
+
+````````````````````````````````
+
+
+Nested balanced quotes are not allowed without escaping:
+
+```````````````````````````````` example
+[link](/url "title "and" title")
+.
+
[link](/url "title "and" title")
+````````````````````````````````
+
+
+But it is easy to work around this by using a different quote type:
+
+```````````````````````````````` example
+[link](/url 'title "and" title')
+.
+
+````````````````````````````````
+
+
+(Note: `Markdown.pl` did allow double quotes inside a double-quoted
+title, and its test suite included a test demonstrating this.
+But it is hard to see a good rationale for the extra complexity this
+brings, since there are already many ways---backslash escaping,
+entity and numeric character references, or using a different
+quote type for the enclosing title---to write titles containing
+double quotes. `Markdown.pl`'s handling of titles has a number
+of other strange features. For example, it allows single-quoted
+titles in inline links, but not reference links. And, in
+reference links but not inline links, it allows a title to begin
+with `"` and end with `)`. `Markdown.pl` 1.0.1 even allows
+titles with no closing quotation mark, though 1.0.2b8 does not.
+It seems preferable to adopt a simple, rational rule that works
+the same way in inline links and link reference definitions.)
+
+[Whitespace] is allowed around the destination and title:
+
+```````````````````````````````` example
+[link]( /uri
+ "title" )
+.
+
+````````````````````````````````
+
+
+But it is not allowed between the link text and the
+following parenthesis:
+
+```````````````````````````````` example
+[link] (/uri)
+.
+
[link] (/uri)
+````````````````````````````````
+
+
+The link text may contain balanced brackets, but not unbalanced ones,
+unless they are escaped:
+
+```````````````````````````````` example
+[link [foo [bar]]](/uri)
+.
+
+````````````````````````````````
+
+
+The link text may contain inline content:
+
+```````````````````````````````` example
+[link *foo **bar** `#`*](/uri)
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+[![moon](moon.jpg)](/uri)
+.
+
+````````````````````````````````
+
+
+However, links may not contain other links, at any level of nesting.
+
+```````````````````````````````` example
+[foo [bar](/uri)](/uri)
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+![[[foo](uri1)](uri2)](uri3)
+.
+
+````````````````````````````````
+
+
+These cases illustrate the precedence of link text grouping over
+emphasis grouping:
+
+```````````````````````````````` example
+*[foo*](/uri)
+.
+
+````````````````````````````````
+
+
+Note that brackets that *aren't* part of links do not take
+precedence:
+
+```````````````````````````````` example
+*foo [bar* baz]
+.
+
foo [bar baz]
+````````````````````````````````
+
+
+These cases illustrate the precedence of HTML tags, code spans,
+and autolinks over link grouping:
+
+```````````````````````````````` example
+[foo
+.
+
[foo
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo`](/uri)`
+.
+
[foo](/uri)
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo
+.
+
+````````````````````````````````
+
+
+There are three kinds of [reference link](@)s:
+[full](#full-reference-link), [collapsed](#collapsed-reference-link),
+and [shortcut](#shortcut-reference-link).
+
+A [full reference link](@)
+consists of a [link text] immediately followed by a [link label]
+that [matches] a [link reference definition] elsewhere in the document.
+
+A [link label](@) begins with a left bracket (`[`) and ends
+with the first right bracket (`]`) that is not backslash-escaped.
+Between these brackets there must be at least one [non-whitespace character].
+Unescaped square bracket characters are not allowed in
+[link labels]. A link label can have at most 999
+characters inside the square brackets.
+
+One label [matches](@)
+another just in case their normalized forms are equal. To normalize a
+label, perform the *Unicode case fold* and collapse consecutive internal
+[whitespace] to a single space. If there are multiple
+matching reference link definitions, the one that comes first in the
+document is used. (It is desirable in such cases to emit a warning.)
+
+The contents of the first link label are parsed as inlines, which are
+used as the link's text. The link's URI and title are provided by the
+matching [link reference definition].
+
+Here is a simple example:
+
+```````````````````````````````` example
+[foo][bar]
+
+[bar]: /url "title"
+.
+
+````````````````````````````````
+
+
+The rules for the [link text] are the same as with
+[inline links]. Thus:
+
+The link text may contain balanced brackets, but not unbalanced ones,
+unless they are escaped:
+
+```````````````````````````````` example
+[link [foo [bar]]][ref]
+
+[ref]: /uri
+.
+
+````````````````````````````````
+
+
+However, links may not contain other links, at any level of nesting.
+
+```````````````````````````````` example
+[foo [bar](/uri)][ref]
+
+[ref]: /uri
+.
+
+````````````````````````````````
+
+
+(In the examples above, we have two [shortcut reference links]
+instead of one [full reference link].)
+
+The following cases illustrate the precedence of link text grouping over
+emphasis grouping:
+
+```````````````````````````````` example
+*[foo*][ref]
+
+[ref]: /uri
+.
+
+````````````````````````````````
+
+
+These cases illustrate the precedence of HTML tags, code spans,
+and autolinks over link grouping:
+
+```````````````````````````````` example
+[foo
+
+[ref]: /uri
+.
+
+````````````````````````````````
+
+
+Unicode case fold is used:
+
+```````````````````````````````` example
+[Толпой][Толпой] is a Russian word.
+
+[ТОЛПОЙ]: /url
+.
+
+````````````````````````````````
+
+
+Consecutive internal [whitespace] is treated as one space for
+purposes of determining matching:
+
+```````````````````````````````` example
+[Foo
+ bar]: /url
+
+[Baz][Foo bar]
+.
+
+````````````````````````````````
+
+
+No [whitespace] is allowed between the [link text] and the
+[link label]:
+
+```````````````````````````````` example
+[foo] [bar]
+
+[bar]: /url "title"
+.
+
+````````````````````````````````
+
+
+This is a departure from John Gruber's original Markdown syntax
+description, which explicitly allows whitespace between the link
+text and the link label. It brings reference links in line with
+[inline links], which (according to both original Markdown and
+this spec) cannot have whitespace after the link text. More
+importantly, it prevents inadvertent capture of consecutive
+[shortcut reference links]. If whitespace is allowed between the
+link text and the link label, then in the following we will have
+a single reference link, not two shortcut reference links, as
+intended:
+
+``` markdown
+[foo]
+[bar]
+
+[foo]: /url1
+[bar]: /url2
+```
+
+(Note that [shortcut reference links] were introduced by Gruber
+himself in a beta version of `Markdown.pl`, but never included
+in the official syntax description. Without shortcut reference
+links, it is harmless to allow space between the link text and
+link label; but once shortcut references are introduced, it is
+too dangerous to allow this, as it frequently leads to
+unintended results.)
+
+When there are multiple matching [link reference definitions],
+the first is used:
+
+```````````````````````````````` example
+[foo]: /url1
+
+[foo]: /url2
+
+[bar][foo]
+.
+
+````````````````````````````````
+
+
+Note that matching is performed on normalized strings, not parsed
+inline content. So the following does not match, even though the
+labels define equivalent inline content:
+
+```````````````````````````````` example
+[bar][foo\!]
+
+[foo!]: /url
+.
+
[bar][foo!]
+````````````````````````````````
+
+
+[Link labels] cannot contain brackets, unless they are
+backslash-escaped:
+
+```````````````````````````````` example
+[foo][ref[]
+
+[ref[]: /uri
+.
+
+````````````````````````````````
+
+
+Note that in this example `]` is not backslash-escaped:
+
+```````````````````````````````` example
+[bar\\]: /uri
+
+[bar\\]
+.
+
+````````````````````````````````
+
+
+A [link label] must contain at least one [non-whitespace character]:
+
+```````````````````````````````` example
+[]
+
+[]: /uri
+.
+
+````````````````````````````````
+
+
+A [collapsed reference link](@)
+consists of a [link label] that [matches] a
+[link reference definition] elsewhere in the
+document, followed by the string `[]`.
+The contents of the first link label are parsed as inlines,
+which are used as the link's text. The link's URI and title are
+provided by the matching reference link definition. Thus,
+`[foo][]` is equivalent to `[foo][foo]`.
+
+```````````````````````````````` example
+[foo][]
+
+[foo]: /url "title"
+.
+
+````````````````````````````````
+
+
+
+As with full reference links, [whitespace] is not
+allowed between the two sets of brackets:
+
+```````````````````````````````` example
+[foo]
+[]
+
+[foo]: /url "title"
+.
+
+````````````````````````````````
+
+
+A [shortcut reference link](@)
+consists of a [link label] that [matches] a
+[link reference definition] elsewhere in the
+document and is not followed by `[]` or a link label.
+The contents of the first link label are parsed as inlines,
+which are used as the link's text. The link's URI and title
+are provided by the matching link reference definition.
+Thus, `[foo]` is equivalent to `[foo][]`.
+
+```````````````````````````````` example
+[foo]
+
+[foo]: /url "title"
+.
+
+````````````````````````````````
+
+
+A space after the link text should be preserved:
+
+```````````````````````````````` example
+[foo] bar
+
+[foo]: /url
+.
+
+````````````````````````````````
+
+
+If you just want bracketed text, you can backslash-escape the
+opening bracket to avoid links:
+
+```````````````````````````````` example
+\[foo]
+
+[foo]: /url "title"
+.
+
[foo]
+````````````````````````````````
+
+
+Note that this is a link, because a link label ends with the first
+following closing bracket:
+
+```````````````````````````````` example
+[foo*]: /url
+
+*[foo*]
+.
+
+````````````````````````````````
+
+In the following case `[bar][baz]` is parsed as a reference,
+`[foo]` as normal text:
+
+```````````````````````````````` example
+[foo][bar][baz]
+
+[baz]: /url
+.
+
+````````````````````````````````
+
+
+Here, though, `[foo][bar]` is parsed as a reference, since
+`[bar]` is defined:
+
+```````````````````````````````` example
+[foo][bar][baz]
+
+[baz]: /url1
+[bar]: /url2
+.
+
+````````````````````````````````
+
+
+Here `[foo]` is not parsed as a shortcut reference, because it
+is followed by a link label (even though `[bar]` is not defined):
+
+```````````````````````````````` example
+[foo][bar][baz]
+
+[baz]: /url1
+[foo]: /url2
+.
+
+````````````````````````````````
+
+
+
+## Images
+
+Syntax for images is like the syntax for links, with one
+difference. Instead of [link text], we have an
+[image description](@). The rules for this are the
+same as for [link text], except that (a) an
+image description starts with `![` rather than `[`, and
+(b) an image description may contain links.
+An image description has inline elements
+as its contents. When an image is rendered to HTML,
+this is standardly used as the image's `alt` attribute.
+
+```````````````````````````````` example
+![foo](/url "title")
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo *bar*]
+
+[foo *bar*]: train.jpg "train & tracks"
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo ![bar](/url)](/url2)
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo [bar](/url)](/url2)
+.
+
+````````````````````````````````
+
+
+Though this spec is concerned with parsing, not rendering, it is
+recommended that in rendering to HTML, only the plain string content
+of the [image description] be used. Note that in
+the above example, the alt attribute's value is `foo bar`, not `foo
+[bar](/url)` or `foo bar`. Only the plain string
+content is rendered, without formatting.
+
+```````````````````````````````` example
+![foo *bar*][]
+
+[foo *bar*]: train.jpg "train & tracks"
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo *bar*][foobar]
+
+[FOOBAR]: train.jpg "train & tracks"
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo](train.jpg)
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+My ![foo bar](/path/to/train.jpg "title" )
+.
+
My
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo]()
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+![](/url)
+.
+
+````````````````````````````````
+
+
+Reference-style:
+
+```````````````````````````````` example
+![foo][bar]
+
+[bar]: /url
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo][bar]
+
+[BAR]: /url
+.
+
+````````````````````````````````
+
+
+Collapsed:
+
+```````````````````````````````` example
+![foo][]
+
+[foo]: /url "title"
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+![*foo* bar][]
+
+[*foo* bar]: /url "title"
+.
+
+````````````````````````````````
+
+
+The labels are case-insensitive:
+
+```````````````````````````````` example
+![Foo][]
+
+[foo]: /url "title"
+.
+
+````````````````````````````````
+
+
+As with reference links, [whitespace] is not allowed
+between the two sets of brackets:
+
+```````````````````````````````` example
+![foo]
+[]
+
+[foo]: /url "title"
+.
+
+[]
+````````````````````````````````
+
+
+Shortcut:
+
+```````````````````````````````` example
+![foo]
+
+[foo]: /url "title"
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+![*foo* bar]
+
+[*foo* bar]: /url "title"
+.
+
+````````````````````````````````
+
+
+Note that link labels cannot contain unescaped brackets:
+
+```````````````````````````````` example
+![[foo]]
+
+[[foo]]: /url "title"
+.
+
![[foo]]
+
[[foo]]: /url "title"
+````````````````````````````````
+
+
+The link labels are case-insensitive:
+
+```````````````````````````````` example
+![Foo]
+
+[foo]: /url "title"
+.
+
+````````````````````````````````
+
+
+If you just want bracketed text, you can backslash-escape the
+opening `!` and `[`:
+
+```````````````````````````````` example
+\!\[foo]
+
+[foo]: /url "title"
+.
+
![foo]
+````````````````````````````````
+
+
+If you want a link after a literal `!`, backslash-escape the
+`!`:
+
+```````````````````````````````` example
+\![foo]
+
+[foo]: /url "title"
+.
+
+````````````````````````````````
+
+
+## Autolinks
+
+[Autolink](@)s are absolute URIs and email addresses inside
+`<` and `>`. They are parsed as links, with the URL or email address
+as the link label.
+
+A [URI autolink](@) consists of `<`, followed by an
+[absolute URI] not containing `<`, followed by `>`. It is parsed as
+a link to the URI, with the URI as the link's label.
+
+An [absolute URI](@),
+for these purposes, consists of a [scheme] followed by a colon (`:`)
+followed by zero or more characters other than ASCII
+[whitespace] and control characters, `<`, and `>`. If
+the URI includes these characters, they must be percent-encoded
+(e.g. `%20` for a space).
+
+For purposes of this spec, a [scheme](@) is any sequence
+of 2--32 characters beginning with an ASCII letter and followed
+by any combination of ASCII letters, digits, or the symbols plus
+("+"), period ("."), or hyphen ("-").
+
+Here are some valid autolinks:
+
+```````````````````````````````` example
+
+.
+
+````````````````````````````````
+
+
+Note that many strings that count as [absolute URIs] for
+purposes of this spec are not valid URIs, because their
+schemes are not registered or because of other problems
+with their syntax:
+
+```````````````````````````````` example
+
+.
+
+````````````````````````````````
+
+
+An [email autolink](@)
+consists of `<`, followed by an [email address],
+followed by `>`. The link's label is the email address,
+and the URL is `mailto:` followed by the email address.
+
+An [email address](@),
+for these purposes, is anything that matches
+the [non-normative regex from the HTML5
+spec](https://html.spec.whatwg.org/multipage/forms.html#e-mail-state-(type=email)):
+
+ /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?
+ (?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
+
+Examples of email autolinks:
+
+```````````````````````````````` example
+
+.
+
+````````````````````````````````
+
+
+Backslash-escapes do not work inside email autolinks:
+
+```````````````````````````````` example
+
+.
+
<foo+@bar.example.com>
+````````````````````````````````
+
+
+These are not autolinks:
+
+```````````````````````````````` example
+<>
+.
+
<>
+````````````````````````````````
+
+
+```````````````````````````````` example
+< http://foo.bar >
+.
+
< http://foo.bar >
+````````````````````````````````
+
+
+```````````````````````````````` example
+
+.
+
<m:abc>
+````````````````````````````````
+
+
+```````````````````````````````` example
+
+.
+
<foo.bar.baz>
+````````````````````````````````
+
+
+```````````````````````````````` example
+http://example.com
+.
+
http://example.com
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo@bar.example.com
+.
+
foo@bar.example.com
+````````````````````````````````
+
+
+## Raw HTML
+
+Text between `<` and `>` that looks like an HTML tag is parsed as a
+raw HTML tag and will be rendered in HTML without escaping.
+Tag and attribute names are not limited to current HTML tags,
+so custom tags (and even, say, DocBook tags) may be used.
+
+Here is the grammar for tags:
+
+A [tag name](@) consists of an ASCII letter
+followed by zero or more ASCII letters, digits, or
+hyphens (`-`).
+
+An [attribute](@) consists of [whitespace],
+an [attribute name], and an optional
+[attribute value specification].
+
+An [attribute name](@)
+consists of an ASCII letter, `_`, or `:`, followed by zero or more ASCII
+letters, digits, `_`, `.`, `:`, or `-`. (Note: This is the XML
+specification restricted to ASCII. HTML5 is laxer.)
+
+An [attribute value specification](@)
+consists of optional [whitespace],
+a `=` character, optional [whitespace], and an [attribute
+value].
+
+An [attribute value](@)
+consists of an [unquoted attribute value],
+a [single-quoted attribute value], or a [double-quoted attribute value].
+
+An [unquoted attribute value](@)
+is a nonempty string of characters not
+including spaces, `"`, `'`, `=`, `<`, `>`, or `` ` ``.
+
+A [single-quoted attribute value](@)
+consists of `'`, zero or more
+characters not including `'`, and a final `'`.
+
+A [double-quoted attribute value](@)
+consists of `"`, zero or more
+characters not including `"`, and a final `"`.
+
+An [open tag](@) consists of a `<` character, a [tag name],
+zero or more [attributes], optional [whitespace], an optional `/`
+character, and a `>` character.
+
+A [closing tag](@) consists of the string ``, a
+[tag name], optional [whitespace], and the character `>`.
+
+An [HTML comment](@) consists of ``,
+where *text* does not start with `>` or `->`, does not end with `-`,
+and does not contain `--`. (See the
+[HTML5 spec](http://www.w3.org/TR/html5/syntax.html#comments).)
+
+A [processing instruction](@)
+consists of the string ``, a string
+of characters not including the string `?>`, and the string
+`?>`.
+
+A [declaration](@) consists of the
+string ``, and the character `>`.
+
+A [CDATA section](@) consists of
+the string ``, and the string `]]>`.
+
+An [HTML tag](@) consists of an [open tag], a [closing tag],
+an [HTML comment], a [processing instruction], a [declaration],
+or a [CDATA section].
+
+Here are some simple open tags:
+
+```````````````````````````````` example
+
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+
+.
+
+````````````````````````````````
+
+
+Hard line breaks are for separating inline content within a block.
+Neither syntax for hard line breaks works at the end of a paragraph or
+other block element:
+
+```````````````````````````````` example
+foo\
+.
+
foo\
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo
+.
+
foo
+````````````````````````````````
+
+
+```````````````````````````````` example
+### foo\
+.
+
foo\
+````````````````````````````````
+
+
+```````````````````````````````` example
+### foo
+.
+
foo
+````````````````````````````````
+
+
+## Soft line breaks
+
+A regular line break (not in a code span or HTML tag) that is not
+preceded by two or more spaces or a backslash is parsed as a
+[softbreak](@). (A softbreak may be rendered in HTML either as a
+[line ending] or as a space. The result will be the same in
+browsers. In the examples here, a [line ending] will be used.)
+
+```````````````````````````````` example
+foo
+baz
+.
+
foo
+baz
+````````````````````````````````
+
+
+Spaces at the end of the line and beginning of the next line are
+removed:
+
+```````````````````````````````` example
+foo
+ baz
+.
+
foo
+baz
+````````````````````````````````
+
+
+A conforming parser may render a soft line break in HTML either as a
+line break or as a space.
+
+A renderer may also provide an option to render soft line breaks
+as hard line breaks.
+
+## Textual content
+
+Any characters not given an interpretation by the above rules will
+be parsed as plain textual content.
+
+```````````````````````````````` example
+hello $.;'there
+.
+
hello $.;'there
+````````````````````````````````
+
+
+```````````````````````````````` example
+Foo χρῆν
+.
+
Foo χρῆν
+````````````````````````````````
+
+
+Internal spaces are preserved verbatim:
+
+```````````````````````````````` example
+Multiple spaces
+.
+
Multiple spaces
+````````````````````````````````
+
+
+
+
+# Appendix: A parsing strategy
+
+In this appendix we describe some features of the parsing strategy
+used in the CommonMark reference implementations.
+
+## Overview
+
+Parsing has two phases:
+
+1. In the first phase, lines of input are consumed and the block
+structure of the document---its division into paragraphs, block quotes,
+list items, and so on---is constructed. Text is assigned to these
+blocks but not parsed. Link reference definitions are parsed and a
+map of links is constructed.
+
+2. In the second phase, the raw text contents of paragraphs and headings
+are parsed into sequences of Markdown inline elements (strings,
+code spans, links, emphasis, and so on), using the map of link
+references constructed in phase 1.
+
+At each point in processing, the document is represented as a tree of
+**blocks**. The root of the tree is a `document` block. The `document`
+may have any number of other blocks as **children**. These children
+may, in turn, have other blocks as children. The last child of a block
+is normally considered **open**, meaning that subsequent lines of input
+can alter its contents. (Blocks that are not open are **closed**.)
+Here, for example, is a possible document tree, with the open blocks
+marked by arrows:
+
+``` tree
+-> document
+ -> block_quote
+ paragraph
+ "Lorem ipsum dolor\nsit amet."
+ -> list (type=bullet tight=true bullet_char=-)
+ list_item
+ paragraph
+ "Qui *quodsi iracundia*"
+ -> list_item
+ -> paragraph
+ "aliquando id"
+```
+
+## Phase 1: block structure
+
+Each line that is processed has an effect on this tree. The line is
+analyzed and, depending on its contents, the document may be altered
+in one or more of the following ways:
+
+1. One or more open blocks may be closed.
+2. One or more new blocks may be created as children of the
+ last open block.
+3. Text may be added to the last (deepest) open block remaining
+ on the tree.
+
+Once a line has been incorporated into the tree in this way,
+it can be discarded, so input can be read in a stream.
+
+For each line, we follow this procedure:
+
+1. First we iterate through the open blocks, starting with the
+root document, and descending through last children down to the last
+open block. Each block imposes a condition that the line must satisfy
+if the block is to remain open. For example, a block quote requires a
+`>` character. A paragraph requires a non-blank line.
+In this phase we may match all or just some of the open
+blocks. But we cannot close unmatched blocks yet, because we may have a
+[lazy continuation line].
+
+2. Next, after consuming the continuation markers for existing
+blocks, we look for new block starts (e.g. `>` for a block quote).
+If we encounter a new block start, we close any blocks unmatched
+in step 1 before creating the new block as a child of the last
+matched block.
+
+3. Finally, we look at the remainder of the line (after block
+markers like `>`, list markers, and indentation have been consumed).
+This is text that can be incorporated into the last open
+block (a paragraph, code block, heading, or raw HTML).
+
+Setext headings are formed when we see a line of a paragraph
+that is a [setext heading underline].
+
+Reference link definitions are detected when a paragraph is closed;
+the accumulated text lines are parsed to see if they begin with
+one or more reference link definitions. Any remainder becomes a
+normal paragraph.
+
+We can see how this works by considering how the tree above is
+generated by four lines of Markdown:
+
+``` markdown
+> Lorem ipsum dolor
+sit amet.
+> - Qui *quodsi iracundia*
+> - aliquando id
+```
+
+At the outset, our document model is just
+
+``` tree
+-> document
+```
+
+The first line of our text,
+
+``` markdown
+> Lorem ipsum dolor
+```
+
+causes a `block_quote` block to be created as a child of our
+open `document` block, and a `paragraph` block as a child of
+the `block_quote`. Then the text is added to the last open
+block, the `paragraph`:
+
+``` tree
+-> document
+ -> block_quote
+ -> paragraph
+ "Lorem ipsum dolor"
+```
+
+The next line,
+
+``` markdown
+sit amet.
+```
+
+is a "lazy continuation" of the open `paragraph`, so it gets added
+to the paragraph's text:
+
+``` tree
+-> document
+ -> block_quote
+ -> paragraph
+ "Lorem ipsum dolor\nsit amet."
+```
+
+The third line,
+
+``` markdown
+> - Qui *quodsi iracundia*
+```
+
+causes the `paragraph` block to be closed, and a new `list` block
+opened as a child of the `block_quote`. A `list_item` is also
+added as a child of the `list`, and a `paragraph` as a child of
+the `list_item`. The text is then added to the new `paragraph`:
+
+``` tree
+-> document
+ -> block_quote
+ paragraph
+ "Lorem ipsum dolor\nsit amet."
+ -> list (type=bullet tight=true bullet_char=-)
+ -> list_item
+ -> paragraph
+ "Qui *quodsi iracundia*"
+```
+
+The fourth line,
+
+``` markdown
+> - aliquando id
+```
+
+causes the `list_item` (and its child the `paragraph`) to be closed,
+and a new `list_item` opened up as child of the `list`. A `paragraph`
+is added as a child of the new `list_item`, to contain the text.
+We thus obtain the final tree:
+
+``` tree
+-> document
+ -> block_quote
+ paragraph
+ "Lorem ipsum dolor\nsit amet."
+ -> list (type=bullet tight=true bullet_char=-)
+ list_item
+ paragraph
+ "Qui *quodsi iracundia*"
+ -> list_item
+ -> paragraph
+ "aliquando id"
+```
+
+## Phase 2: inline structure
+
+Once all of the input has been parsed, all open blocks are closed.
+
+We then "walk the tree," visiting every node, and parse raw
+string contents of paragraphs and headings as inlines. At this
+point we have seen all the link reference definitions, so we can
+resolve reference links as we go.
+
+``` tree
+document
+ block_quote
+ paragraph
+ str "Lorem ipsum dolor"
+ softbreak
+ str "sit amet."
+ list (type=bullet tight=true bullet_char=-)
+ list_item
+ paragraph
+ str "Qui "
+ emph
+ str "quodsi iracundia"
+ list_item
+ paragraph
+ str "aliquando id"
+```
+
+Notice how the [line ending] in the first paragraph has
+been parsed as a `softbreak`, and the asterisks in the first list item
+have become an `emph`.
+
+### An algorithm for parsing nested emphasis and links
+
+By far the trickiest part of inline parsing is handling emphasis,
+strong emphasis, links, and images. This is done using the following
+algorithm.
+
+When we're parsing inlines and we hit either
+
+- a run of `*` or `_` characters, or
+- a `[` or `![`
+
+we insert a text node with these symbols as its literal content, and we
+add a pointer to this text node to the [delimiter stack](@).
+
+The [delimiter stack] is a doubly linked list. Each
+element contains a pointer to a text node, plus information about
+
+- the type of delimiter (`[`, `![`, `*`, `_`)
+- the number of delimiters,
+- whether the delimiter is "active" (all are active to start), and
+- whether the delimiter is a potential opener, a potential closer,
+ or both (which depends on what sort of characters precede
+ and follow the delimiters).
+
+When we hit a `]` character, we call the *look for link or image*
+procedure (see below).
+
+When we hit the end of the input, we call the *process emphasis*
+procedure (see below), with `stack_bottom` = NULL.
+
+#### *look for link or image*
+
+Starting at the top of the delimiter stack, we look backwards
+through the stack for an opening `[` or `![` delimiter.
+
+- If we don't find one, we return a literal text node `]`.
+
+- If we do find one, but it's not *active*, we remove the inactive
+ delimiter from the stack, and return a literal text node `]`.
+
+- If we find one and it's active, then we parse ahead to see if
+ we have an inline link/image, reference link/image, compact reference
+ link/image, or shortcut reference link/image.
+
+ + If we don't, then we remove the opening delimiter from the
+ delimiter stack and return a literal text node `]`.
+
+ + If we do, then
+
+ * We return a link or image node whose children are the inlines
+ after the text node pointed to by the opening delimiter.
+
+ * We run *process emphasis* on these inlines, with the `[` opener
+ as `stack_bottom`.
+
+ * We remove the opening delimiter.
+
+ * If we have a link (and not an image), we also set all
+ `[` delimiters before the opening delimiter to *inactive*. (This
+ will prevent us from getting links within links.)
+
+#### *process emphasis*
+
+Parameter `stack_bottom` sets a lower bound to how far we
+descend in the [delimiter stack]. If it is NULL, we can
+go all the way to the bottom. Otherwise, we stop before
+visiting `stack_bottom`.
+
+Let `current_position` point to the element on the [delimiter stack]
+just above `stack_bottom` (or the first element if `stack_bottom`
+is NULL).
+
+We keep track of the `openers_bottom` for each delimiter
+type (`*`, `_`). Initialize this to `stack_bottom`.
+
+Then we repeat the following until we run out of potential
+closers:
+
+- Move `current_position` forward in the delimiter stack (if needed)
+ until we find the first potential closer with delimiter `*` or `_`.
+ (This will be the potential closer closest
+ to the beginning of the input -- the first one in parse order.)
+
+- Now, look back in the stack (staying above `stack_bottom` and
+ the `openers_bottom` for this delimiter type) for the
+ first matching potential opener ("matching" means same delimiter).
+
+- If one is found:
+
+ + Figure out whether we have emphasis or strong emphasis:
+ if both closer and opener spans have length >= 2, we have
+ strong, otherwise regular.
+
+ + Insert an emph or strong emph node accordingly, after
+ the text node corresponding to the opener.
+
+ + Remove any delimiters between the opener and closer from
+ the delimiter stack.
+
+ + Remove 1 (for regular emph) or 2 (for strong emph) delimiters
+ from the opening and closing text nodes. If they become empty
+ as a result, remove them and remove the corresponding element
+ of the delimiter stack. If the closing node is removed, reset
+ `current_position` to the next element in the stack.
+
+- If none in found:
+
+ + Set `openers_bottom` to the element before `current_position`.
+ (We know that there are no openers for this kind of closer up to and
+ including this point, so this puts a lower bound on future searches.)
+
+ + If the closer at `current_position` is not a potential opener,
+ remove it from the delimiter stack (since we know it can't
+ be a closer either).
+
+ + Advance `current_position` to the next element in the stack.
+
+After we're done, we remove all delimiters above `stack_bottom` from the
+delimiter stack.
+
From 89f34eb62bb080726f4ab375cf0390cfd2075fed Mon Sep 17 00:00:00 2001
From: Sam
Date: Thu, 20 Jul 2017 17:45:32 -0400
Subject: [PATCH 093/279] attempt to cache all emojis
---
config/nginx.sample.conf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/nginx.sample.conf b/config/nginx.sample.conf
index e7741c1eb3e..db59d012461 100644
--- a/config/nginx.sample.conf
+++ b/config/nginx.sample.conf
@@ -121,7 +121,7 @@ server {
}
# cache emojis
- location ~ /_?emoji.*\.(png|gif|jpg|jpeg)$/ {
+ location ~ /images/emoji/.*\.(png|gif|jpg|jpeg)(\?.*)?$/ {
expires 1y;
add_header Cache-Control public,immutable;
}
From e9e97f5bcf0f2aa518bbe636b9b2a448e27f8f70 Mon Sep 17 00:00:00 2001
From: Sam
Date: Thu, 20 Jul 2017 18:22:59 -0400
Subject: [PATCH 094/279] simplify emoji cache rule
---
config/nginx.sample.conf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/nginx.sample.conf b/config/nginx.sample.conf
index db59d012461..65b631aec30 100644
--- a/config/nginx.sample.conf
+++ b/config/nginx.sample.conf
@@ -121,7 +121,7 @@ server {
}
# cache emojis
- location ~ /images/emoji/.*\.(png|gif|jpg|jpeg)(\?.*)?$/ {
+ location ~ /images/emoji/ {
expires 1y;
add_header Cache-Control public,immutable;
}
From 62604e92970305388a0e4764c5e6597f9fd40e2e Mon Sep 17 00:00:00 2001
From: David Taylor
Date: Fri, 21 Jul 2017 01:59:54 +0100
Subject: [PATCH 095/279] Allow docker test rake task to be used for single
plugins (#4973)
* Allow docker test rake task to be used for single plugins
---
lib/tasks/docker.rake | 42 +++++++++++++++++++++++++++++++++++++-----
1 file changed, 37 insertions(+), 5 deletions(-)
diff --git a/lib/tasks/docker.rake b/lib/tasks/docker.rake
index 497f1ff8b77..cb5894863f7 100644
--- a/lib/tasks/docker.rake
+++ b/lib/tasks/docker.rake
@@ -1,3 +1,27 @@
+# rake docker:test is designed to be used inside the discourse/docker_test image
+# running it anywhere else will likely fail
+#
+# Environment Variables (specific to this rake task)
+# => SKIP_CORE set to 1 to skip core rspec tests
+# => INSTALL_OFFICIAL_PLUGINS set to 1 to install all core plugins before running tests
+# => JS_ONLY set to 1 to skip all rspec tests
+# => RUBY_ONLY set to 1 to skip all qunit tests
+# => SINGLE_PLUGIN set to plugin name to skip eslint, and only run plugin-specific rspec tests
+#
+# Other useful environment variables (not specific to this rake task)
+# => LOAD_PLUGINS set to 1 to load all plugins when running tests
+# => MODULE set to a qunit module name to run only those tests
+# => FILTER set to a qunit filter string to run only those tests
+# => COMMIT_HASH used by the discourse_test docker image to load a specific commit of discourse
+# this can also be set to a branch, e.g. "origin/tests-passed"
+#
+# Example usage:
+# Run all core tests:
+# docker run discourse/discourse_test:release
+# Run only rspec tests:
+# docker run -e RUBY_ONLY=1 discourse/discourse_test:release
+# Run all core and plugin tests (plugin mounted from host filesystem):
+# docker run -e LOAD_PLUGINS=1 -v $(pwd)/my-awesome-plugin:/var/www/discourse/plugins/my-awesome-plugin discourse/discourse_test:release
def run_or_fail(command)
pid = Process.spawn(command)
@@ -42,14 +66,22 @@ task 'docker:test' do
end
if ENV["LOAD_PLUGINS"]
- @good &&= run_or_fail("bundle exec rake plugin:spec")
+ if ENV["SINGLE_PLUGIN"]
+ @good &&= run_or_fail("bundle exec rake plugin:spec['#{ENV["SINGLE_PLUGIN"]}']")
+ else
+ @good &&= run_or_fail("bundle exec rake plugin:spec")
+ end
end
+
end
+
unless ENV["RUBY_ONLY"]
- @good &&= run_or_fail("eslint app/assets/javascripts")
- @good &&= run_or_fail("eslint --ext .es6 app/assets/javascripts")
- @good &&= run_or_fail("eslint --ext .es6 test/javascripts")
- @good &&= run_or_fail("eslint test/javascripts")
+ unless ENV["SINGLE_PLUGIN"]
+ @good &&= run_or_fail("eslint app/assets/javascripts")
+ @good &&= run_or_fail("eslint --ext .es6 app/assets/javascripts")
+ @good &&= run_or_fail("eslint --ext .es6 test/javascripts")
+ @good &&= run_or_fail("eslint test/javascripts")
+ end
@good &&= run_or_fail("bundle exec rake qunit:test['600000']")
end
From fe055871347c6864c8960f811536d67a77778852 Mon Sep 17 00:00:00 2001
From: Guo Xiang Tan
Date: Fri, 21 Jul 2017 13:37:32 +0900
Subject: [PATCH 096/279] Fix incorrect filename.
---
.../{basic_group_serializer.rb => basic_group_serializer_spec.rb} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename spec/serializers/{basic_group_serializer.rb => basic_group_serializer_spec.rb} (100%)
diff --git a/spec/serializers/basic_group_serializer.rb b/spec/serializers/basic_group_serializer_spec.rb
similarity index 100%
rename from spec/serializers/basic_group_serializer.rb
rename to spec/serializers/basic_group_serializer_spec.rb
From 0c9ea1aaf2cc809acd16da24f6a6e056ac5451e1 Mon Sep 17 00:00:00 2001
From: Joffrey JAFFEUX
Date: Fri, 21 Jul 2017 11:46:34 +0200
Subject: [PATCH 097/279] reduce emoji loading threshold
---
.../discourse/components/emoji-picker.js.es6 | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/app/assets/javascripts/discourse/components/emoji-picker.js.es6 b/app/assets/javascripts/discourse/components/emoji-picker.js.es6
index feb18dc5a93..cf9c2d704b1 100644
--- a/app/assets/javascripts/discourse/components/emoji-picker.js.es6
+++ b/app/assets/javascripts/discourse/components/emoji-picker.js.es6
@@ -282,7 +282,7 @@ export default Ember.Component.extend({
_bindSectionsScroll() {
$list.on("scroll", () => {
- Ember.run.debounce(this, this._checkVisibleSection, 500);
+ Ember.run.debounce(this, this._checkVisibleSection, 150);
Ember.run.debounce(this, this._storeScrollPosition, 100);
});
},
@@ -334,7 +334,7 @@ export default Ember.Component.extend({
if(preloadedSection && !preloadedSection.$section.hasClass("loaded")) {
preloadedSection.$section.addClass("loaded");
const $visibleEmojis = preloadedSection.$section.find(".emoji[src='']");
- Ember.run.later(this, () => this._loadVisibleEmojis($visibleEmojis), 3000);
+ Ember.run.later(this, () => this._loadVisibleEmojis($visibleEmojis), 1500);
}
}
},
@@ -508,7 +508,12 @@ export default Ember.Component.extend({
$icon.parent().attr("title"),
diversity || $icon.hasClass("diversity")
);
- $icon.attr("src", "");
+
+ // force visual reloading if needed
+ if($icon.attr("src") !== "") {
+ $icon.attr("src", "");
+ }
+
$icon.attr("src", emojiUrlFor(code));
},
});
From 1ca0c33802e71a5dc3bf00f23dca241ea4ac35a5 Mon Sep 17 00:00:00 2001
From: Joffrey JAFFEUX
Date: Fri, 21 Jul 2017 12:01:39 +0200
Subject: [PATCH 098/279] FIX: dot not close emoji-picker when click is inside
picker
---
.../javascripts/discourse/components/emoji-picker.js.es6 | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/app/assets/javascripts/discourse/components/emoji-picker.js.es6 b/app/assets/javascripts/discourse/components/emoji-picker.js.es6
index cf9c2d704b1..76b730a97c1 100644
--- a/app/assets/javascripts/discourse/components/emoji-picker.js.es6
+++ b/app/assets/javascripts/discourse/components/emoji-picker.js.es6
@@ -148,7 +148,9 @@ export default Ember.Component.extend({
.on("click", () => this.set("active", false));
this.$(document).on("click.emoji-picker", (event) => {
- if(event.target.className.indexOf("grippie") === -1) {
+ const onPicker = $(event.target).parents(".emoji-picker").length === 1;
+ const onGrippie = event.target.className.indexOf("grippie") > -1;
+ if(!onPicker && !onGrippie) {
this.set("active", false);
return false;
}
From c906bd3f2242e4ab5457c60bcca4cff51fee2ec5 Mon Sep 17 00:00:00 2001
From: Joffrey JAFFEUX
Date: Fri, 21 Jul 2017 13:35:29 +0200
Subject: [PATCH 099/279] emoji-picker refactoring
---
.../discourse/components/emoji-picker.js.es6 | 47 +++++++++++--------
.../acceptance/emoji-picker-test.js.es6 | 35 ++++----------
2 files changed, 37 insertions(+), 45 deletions(-)
diff --git a/app/assets/javascripts/discourse/components/emoji-picker.js.es6 b/app/assets/javascripts/discourse/components/emoji-picker.js.es6
index 76b730a97c1..a7e04e17555 100644
--- a/app/assets/javascripts/discourse/components/emoji-picker.js.es6
+++ b/app/assets/javascripts/discourse/components/emoji-picker.js.es6
@@ -5,16 +5,21 @@ import KeyValueStore from "discourse/lib/key-value-store";
import { emojis } from "pretty-text/emoji/data";
import { extendedEmojiList, isSkinTonableEmoji } from "pretty-text/emoji";
-const recentTemplate = findRawTemplate("emoji-picker-recent");
-const pickerTemplate = findRawTemplate("emoji-picker");
-export const keyValueStore = new KeyValueStore("discourse_emojis_");
-export const EMOJI_USAGE = "emojiUsage";
-export const EMOJI_SCROLL_Y = "emojiScrollY";
-export const EMOJI_SELECTED_DIVERSITY = "emojiSelectedDiversity";
+const keyValueStore = new KeyValueStore("discourse_emojis_");
+const EMOJI_USAGE = "emojiUsage";
+const EMOJI_SCROLL_Y = "emojiScrollY";
+const EMOJI_SELECTED_DIVERSITY = "emojiSelectedDiversity";
const PER_ROW = 11;
const customEmojis = _.map(_.keys(extendedEmojiList()), code => {
return { code, src: emojiUrlFor(code) };
});
+
+export function resetCache() {
+ keyValueStore.setObject({ key: EMOJI_USAGE, value: [] });
+ keyValueStore.setObject({ key: EMOJI_SCROLL_Y, value: 0 });
+ keyValueStore.setObject({ key: EMOJI_SELECTED_DIVERSITY, value: 1 });
+}
+
let $picker, $filter, $results, $list;
export default Ember.Component.extend({
@@ -22,7 +27,7 @@ export default Ember.Component.extend({
this._super();
this._unbindEvents();
- this.appEvents.off('emoji-picker:close');
+ this.appEvents.off("emoji-picker:close");
},
didDestroyElement() {
@@ -34,7 +39,7 @@ export default Ember.Component.extend({
didInsertElement() {
this._super();
- this.appEvents.on('emoji-picker:close', () => this.set("active", false));
+ this.appEvents.on("emoji-picker:close", () => this.set("active", false));
$picker = this.$(".emoji-picker");
@@ -92,7 +97,7 @@ export default Ember.Component.extend({
return { code, src: emojiUrlFor(code) };
});
const model = { recentEmojis };
- const template = recentTemplate(model);
+ const template = findRawTemplate("emoji-picker-recent")(model);
$recentSectionGroup.html(template);
this._bindHover($recentSectionGroup);
},
@@ -108,7 +113,7 @@ export default Ember.Component.extend({
},
show() {
- const template = pickerTemplate({ customEmojis });
+ const template = findRawTemplate("emoji-picker")({ customEmojis });
$picker.html(template);
this.$().append("");
@@ -121,7 +126,7 @@ export default Ember.Component.extend({
this._bindEvents();
- Ember.run.scheduleOnce('afterRender', this, function() {
+ Ember.run.scheduleOnce("afterRender", this, function() {
this._setDiversity();
this._positionPicker();
this._scrollTo();
@@ -271,11 +276,11 @@ export default Ember.Component.extend({
.off("touchstart")
.on("touchstart", "a", (touchStartEvent) => {
const $this = $(touchStartEvent.currentTarget);
- $this.on('touchend', (touchEndEvent) => {
+ $this.on("touchend", (touchEndEvent) => {
handler.bind(self)(touchEndEvent);
- $this.off('touchend');
+ $this.off("touchend");
});
- $this.on('touchmove', () => $this.off('touchend') );
+ $this.on("touchmove", () => $this.off("touchend") );
});
} else {
$emojisContainer.off("click").on("click", "a", e => handler.bind(this)(e) );
@@ -381,10 +386,9 @@ export default Ember.Component.extend({
top: "50%",
display: "flex"
};
- attributes = _.merge(attributes, options);
this.$(".emoji-picker-modal").addClass("fadeIn");
- $picker.css(attributes);
+ $picker.css(_.merge(attributes, options));
};
const mobilePositioning = options => {
@@ -397,10 +401,9 @@ export default Ember.Component.extend({
top: "50%",
display: "flex"
};
- attributes = _.merge(attributes, options);
this.$(".emoji-picker-modal").addClass("fadeIn");
- $picker.css(attributes);
+ $picker.css(_.merge(attributes, options));
};
const desktopPositioning = options => {
@@ -415,12 +418,16 @@ export default Ember.Component.extend({
display:
"flex"
};
- attributes = _.merge(attributes, options);
this.$(".emoji-picker-modal").removeClass("fadeIn");
- $picker.css(attributes);
+ $picker.css(_.merge(attributes, options));
};
+ if(Ember.testing) {
+ desktopPositioning();
+ return;
+ }
+
if(this.site.isMobileDevice) {
mobilePositioning();
} else {
diff --git a/test/javascripts/acceptance/emoji-picker-test.js.es6 b/test/javascripts/acceptance/emoji-picker-test.js.es6
index ae8c8e5969d..d361f5936a1 100644
--- a/test/javascripts/acceptance/emoji-picker-test.js.es6
+++ b/test/javascripts/acceptance/emoji-picker-test.js.es6
@@ -1,22 +1,13 @@
import { acceptance } from "helpers/qunit-helpers";
import { IMAGE_VERSION as v } from 'pretty-text/emoji';
-import {
- keyValueStore,
- EMOJI_USAGE,
- EMOJI_SCROLL_Y,
- EMOJI_SELECTED_DIVERSITY
-} from 'discourse/components/emoji-picker';
+import { resetCache } from 'discourse/components/emoji-picker';
acceptance("EmojiPicker", {
loggedIn: true,
- beforeEach() {
- keyValueStore.setObject({ key: EMOJI_USAGE, value: [] });
- keyValueStore.setObject({ key: EMOJI_SCROLL_Y, value: 0 });
- keyValueStore.setObject({ key: EMOJI_SELECTED_DIVERSITY, value: 1 });
- }
+ beforeEach() { resetCache() }
});
-QUnit.skip("emoji picker can be opened/closed", assert => {
+QUnit.test("emoji picker can be opened/closed", assert => {
visit("/t/internationalization-localization/280");
click("#topic-footer-buttons .btn.create");
@@ -39,7 +30,7 @@ QUnit.skip("emoji picker can be opened/closed", assert => {
});
});
-QUnit.skip("emojis can be hovered to display info", assert => {
+QUnit.test("emojis can be hovered to display info", assert => {
visit("/t/internationalization-localization/280");
click("#topic-footer-buttons .btn.create");
@@ -56,7 +47,7 @@ QUnit.skip("emojis can be hovered to display info", assert => {
});
});
-QUnit.skip("emoji picker has sections", assert => {
+QUnit.test("emoji picker has sections", assert => {
visit("/t/internationalization-localization/280");
click("#topic-footer-buttons .btn.create");
click("button.emoji.btn");
@@ -68,16 +59,10 @@ QUnit.skip("emoji picker has sections", assert => {
0,
"it scrolls to section"
);
-
- assert.equal(
- find(".emoji-picker .categories-column a[title='travel']").parent().hasClass('current'),
- true,
- "it highlights section icon"
- );
});
});
-QUnit.skip("emoji picker triggers event when picking emoji", assert => {
+QUnit.test("emoji picker triggers event when picking emoji", assert => {
visit("/t/internationalization-localization/280");
click("#topic-footer-buttons .btn.create");
click("button.emoji.btn");
@@ -92,7 +77,7 @@ QUnit.skip("emoji picker triggers event when picking emoji", assert => {
});
});
-QUnit.skip("emoji picker has a list of recently used emojis", assert => {
+QUnit.test("emoji picker has a list of recently used emojis", assert => {
visit("/t/internationalization-localization/280");
click("#topic-footer-buttons .btn.create");
click("button.emoji.btn");
@@ -135,7 +120,7 @@ QUnit.skip("emoji picker has a list of recently used emojis", assert => {
});
});
-QUnit.skip("emoji picker correctly orders recently used emojis", assert => {
+QUnit.test("emoji picker correctly orders recently used emojis", assert => {
visit("/t/internationalization-localization/280");
click("#topic-footer-buttons .btn.create");
click("button.emoji.btn");
@@ -159,7 +144,7 @@ QUnit.skip("emoji picker correctly orders recently used emojis", assert => {
});
});
-QUnit.skip("emoji picker lazy loads emojis", assert => {
+QUnit.test("emoji picker lazy loads emojis", assert => {
visit("/t/internationalization-localization/280");
click("#topic-footer-buttons .btn.create");
@@ -176,7 +161,7 @@ QUnit.skip("emoji picker lazy loads emojis", assert => {
});
-QUnit.skip("emoji picker persists state", assert => {
+QUnit.test("emoji picker persists state", assert => {
visit("/t/internationalization-localization/280");
click("#topic-footer-buttons .btn.create");
From 1ce1953ee1d66e8bb0e19dd8834f3c0d9e760381 Mon Sep 17 00:00:00 2001
From: Joffrey JAFFEUX
Date: Fri, 21 Jul 2017 13:35:55 +0200
Subject: [PATCH 100/279] =?UTF-8?q?FIX:=20makes=20sure=20we=20don=E2=80=99?=
=?UTF-8?q?t=20track=20when=20clicking=20on=20recent=20emojis?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../javascripts/discourse/components/emoji-picker.js.es6 | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/app/assets/javascripts/discourse/components/emoji-picker.js.es6 b/app/assets/javascripts/discourse/components/emoji-picker.js.es6
index a7e04e17555..2a573b5934f 100644
--- a/app/assets/javascripts/discourse/components/emoji-picker.js.es6
+++ b/app/assets/javascripts/discourse/components/emoji-picker.js.es6
@@ -259,7 +259,10 @@ export default Ember.Component.extend({
const handler = (event) => {
const code = this._codeForEmojiLink($(event.currentTarget));
- this._trackEmojiUsage(code);
+ if($(event.currentTarget).parents(".section[data-section='recent']").length === 0) {
+ this._trackEmojiUsage(code);
+ }
+
this.sendAction("emojiSelected", code);
if(this.$(".emoji-picker-modal").hasClass("fadeIn")) {
From 79c8b505e86c5b6bb4d89ceb0edf7ca1a9e28866 Mon Sep 17 00:00:00 2001
From: Joffrey JAFFEUX
Date: Fri, 21 Jul 2017 14:18:02 +0200
Subject: [PATCH 101/279] FIX: faster successive loading of emojis
---
.../discourse/components/emoji-picker.js.es6 | 32 +++++++++++++++----
.../templates/emoji-picker.raw.hbs.erb | 8 ++---
2 files changed, 28 insertions(+), 12 deletions(-)
diff --git a/app/assets/javascripts/discourse/components/emoji-picker.js.es6 b/app/assets/javascripts/discourse/components/emoji-picker.js.es6
index 2a573b5934f..d032c63abf3 100644
--- a/app/assets/javascripts/discourse/components/emoji-picker.js.es6
+++ b/app/assets/javascripts/discourse/components/emoji-picker.js.es6
@@ -9,12 +9,14 @@ const keyValueStore = new KeyValueStore("discourse_emojis_");
const EMOJI_USAGE = "emojiUsage";
const EMOJI_SCROLL_Y = "emojiScrollY";
const EMOJI_SELECTED_DIVERSITY = "emojiSelectedDiversity";
+const EMOJI_CACHED_SECTIONS = "emojiCachedSections";
const PER_ROW = 11;
const customEmojis = _.map(_.keys(extendedEmojiList()), code => {
return { code, src: emojiUrlFor(code) };
});
export function resetCache() {
+ keyValueStore.setObject({ key: EMOJI_CACHED_SECTIONS, value: [] });
keyValueStore.setObject({ key: EMOJI_USAGE, value: [] });
keyValueStore.setObject({ key: EMOJI_SCROLL_Y, value: 0 });
keyValueStore.setObject({ key: EMOJI_SELECTED_DIVERSITY, value: 1 });
@@ -43,6 +45,10 @@ export default Ember.Component.extend({
$picker = this.$(".emoji-picker");
+ if (!keyValueStore.getObject(EMOJI_CACHED_SECTIONS)) {
+ keyValueStore.setObject({ key: EMOJI_CACHED_SECTIONS, value: [] });
+ }
+
if (!keyValueStore.getObject(EMOJI_USAGE)) {
keyValueStore.setObject({ key: EMOJI_USAGE, value: [] });
} else if(_.isPlainObject(keyValueStore.getObject(EMOJI_USAGE))) {
@@ -328,14 +334,15 @@ export default Ember.Component.extend({
}
if(selectedSection) {
+ const sectionTitle = selectedSection.$section.data("section");
$picker.find(".category-icon").removeClass("current");
- $picker.find(`.category-icon a[title='${selectedSection.$section.data("section")}']`)
+ $picker.find(`.category-icon a[title='${sectionTitle}']`)
.parent()
.addClass("current");
if(!selectedSection.$section.hasClass("loaded")) {
selectedSection.$section.addClass("loaded");
- this._loadVisibleEmojis(selectedSection.$section.find(".emoji[src='']"));
+ this._loadSection(selectedSection.$section);
}
//preload surrounding sections
@@ -343,8 +350,7 @@ export default Ember.Component.extend({
const preloadedSection = sections[selectedSectionIndex + 1] || sections[selectedSectionIndex - 1];
if(preloadedSection && !preloadedSection.$section.hasClass("loaded")) {
preloadedSection.$section.addClass("loaded");
- const $visibleEmojis = preloadedSection.$section.find(".emoji[src='']");
- Ember.run.later(this, () => this._loadVisibleEmojis($visibleEmojis), 1500);
+ this._loadSection(preloadedSection.$section);
}
}
},
@@ -469,8 +475,22 @@ export default Ember.Component.extend({
$picker.find(".info").css("max-width", infoMaxWidth);
},
- _loadVisibleEmojis($visibleEmojis) {
- $.each($visibleEmojis, (_, icon) => this._setIconSrc(icon) );
+ _loadSection($section) {
+ const sectionName = $section.data("section");
+ if(keyValueStore.getObject(EMOJI_CACHED_SECTIONS).indexOf(sectionName) > -1) {
+ $.each($section.find(".emoji[src='']"), (_, icon) => this._setIconSrc(icon) );
+ } else {
+ Ember.run.later(
+ this, () => {
+ keyValueStore.setObject({
+ key: EMOJI_CACHED_SECTIONS,
+ value: keyValueStore.getObject(EMOJI_CACHED_SECTIONS).concat(sectionName)
+ });
+ $.each($section.find(".emoji[src='']"), (_, icon) => this._setIconSrc(icon) );
+ },
+ 1500
+ );
+ }
},
_codeWithDiversity(code, diversity) {
diff --git a/app/assets/javascripts/discourse/templates/emoji-picker.raw.hbs.erb b/app/assets/javascripts/discourse/templates/emoji-picker.raw.hbs.erb
index e5f8a72139e..97f9c694c99 100644
--- a/app/assets/javascripts/discourse/templates/emoji-picker.raw.hbs.erb
+++ b/app/assets/javascripts/discourse/templates/emoji-picker.raw.hbs.erb
@@ -48,13 +48,9 @@
{{i18n 'emoji_picker.<%= group["name"] %>'}}
+ MD
- # note, hashes should remain stable even if emoji changes cause text content is hashed
- expect(n cooked).to eq(n expected)
+ # note, hashes should remain stable even if emoji changes cause text content is hashed
+ expect(n cooked).to eq(n expected)
- end
end
end
From f3f7dd02d159339f1e139677d283775d670f4029 Mon Sep 17 00:00:00 2001
From: Ryan Mulligan
Date: Tue, 25 Jul 2017 11:40:02 -0700
Subject: [PATCH 203/279] safely call html_safe on category description
The `categories.description` column is not modified as "not null", so it is possible for the description to be nil. This changes the code not call html_safe on nil.
---
app/views/categories/index.html.erb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb
index 5084a7e01f4..2733cc8167b 100644
--- a/app/views/categories/index.html.erb
+++ b/app/views/categories/index.html.erb
@@ -6,7 +6,7 @@
\ No newline at end of file
+
diff --git a/app/assets/javascripts/discourse/templates/tag-groups.hbs b/app/assets/javascripts/discourse/templates/tag-groups.hbs
index 139874e75d0..a4c0ec21de7 100644
--- a/app/assets/javascripts/discourse/templates/tag-groups.hbs
+++ b/app/assets/javascripts/discourse/templates/tag-groups.hbs
@@ -7,10 +7,10 @@
"
diff = DiscourseDiff.new(v[:prev] || "", v[:cur] || "")
output << diff.side_by_side_markdown
end
- render json: {side_by_side: output}
+ render json: { side_by_side: output }
end
protected
@@ -67,11 +65,11 @@ class Admin::StaffActionLogsController < Admin::AdminController
def child_themes(theme)
return "" unless children = theme["child_themes"]
- children.map{|row| row["name"]}.join(" ").to_s
+ children.map { |row| row["name"] }.join(" ").to_s
end
def load_diff(hash, key, val)
- if f=val["theme_fields"]
+ if f = val["theme_fields"]
f.each do |row|
entry = hash[row["target"] + " " + row["name"]] ||= {}
entry[key] = row["value"]
diff --git a/app/controllers/admin/themes_controller.rb b/app/controllers/admin/themes_controller.rb
index d6adf207411..4b8a8c58359 100644
--- a/app/controllers/admin/themes_controller.rb
+++ b/app/controllers/admin/themes_controller.rb
@@ -62,7 +62,7 @@ class Admin::ThemesController < Admin::AdminController
}
respond_to do |format|
- format.json { render json: payload}
+ format.json { render json: payload }
end
end
@@ -77,7 +77,7 @@ class Admin::ThemesController < Admin::AdminController
if @theme.save
update_default_theme
log_theme_change(nil, @theme)
- format.json { render json: @theme, status: :created}
+ format.json { render json: @theme, status: :created }
else
format.json { render json: @theme.errors, status: :unprocessable_entity }
end
@@ -100,7 +100,7 @@ class Admin::ThemesController < Admin::AdminController
@theme.child_theme_relation.to_a.each do |child|
if expected.include?(child.child_theme_id)
- expected.reject!{|id| id == child.child_theme_id}
+ expected.reject! { |id| id == child.child_theme_id }
else
child.destroy
end
@@ -133,12 +133,12 @@ class Admin::ThemesController < Admin::AdminController
update_default_theme
log_theme_change(original_json, @theme)
- format.json { render json: @theme, status: :created}
+ format.json { render json: @theme, status: :created }
else
format.json {
error = @theme.errors[:color_scheme] ? I18n.t("themes.bad_color_scheme") : I18n.t("themes.other_error")
- render json: {errors: [ error ]}, status: :unprocessable_entity
+ render json: { errors: [ error ] }, status: :unprocessable_entity
}
end
end
@@ -192,13 +192,14 @@ class Admin::ThemesController < Admin::AdminController
begin
# deep munge is a train wreck, work around it for now
params[:theme][:child_theme_ids] ||= [] if params[:theme].key?(:child_theme_ids)
- params.require(:theme)
- .permit(:name,
- :color_scheme_id,
- :default,
- :user_selectable,
- theme_fields: [:name, :target, :value, :upload_id, :type_id],
- child_theme_ids: [])
+ params.require(:theme).permit(
+ :name,
+ :color_scheme_id,
+ :default,
+ :user_selectable,
+ theme_fields: [:name, :target, :value, :upload_id, :type_id],
+ child_theme_ids: []
+ )
end
end
diff --git a/app/controllers/admin/user_fields_controller.rb b/app/controllers/admin/user_fields_controller.rb
index 596b53e4ee1..2af8832e333 100644
--- a/app/controllers/admin/user_fields_controller.rb
+++ b/app/controllers/admin/user_fields_controller.rb
@@ -51,8 +51,7 @@ class Admin::UserFieldsController < Admin::AdminController
options = params[:user_field][:options]
if options.present?
UserFieldOption.where(user_field_id: field.id).delete_all
- field.user_field_options_attributes = options.map {|o| {value: o} }.uniq
+ field.user_field_options_attributes = options.map { |o| { value: o } }.uniq
end
end
end
-
diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb
index 5db8236745c..f1f85fe82a2 100644
--- a/app/controllers/admin/users_controller.rb
+++ b/app/controllers/admin/users_controller.rb
@@ -77,7 +77,7 @@ class Admin::UsersController < Admin::AdminController
@user.logged_out
render json: success_json
else
- render json: {error: I18n.t('admin_js.admin.users.id_not_found')}, status: 404
+ render json: { error: I18n.t('admin_js.admin.users.id_not_found') }, status: 404
end
end
@@ -154,8 +154,7 @@ class Admin::UsersController < Admin::AdminController
guardian.ensure_can_change_trust_level!(@user)
level = params[:level].to_i
-
- if !@user.trust_level_locked && [0,1,2].include?(level) && Promotion.send("tl#{level+1}_met?", @user)
+ if !@user.trust_level_locked && [0, 1, 2].include?(level) && Promotion.send("tl#{level + 1}_met?", @user)
@user.trust_level_locked = true
@user.save
end
@@ -187,7 +186,7 @@ class Admin::UsersController < Admin::AdminController
unless @user.trust_level_locked
p = Promotion.new(@user)
- 2.times{ p.review }
+ 2.times { p.review }
p.review_tl2
if @user.trust_level == 3 && Promotion.tl3_lost?(@user)
@user.change_trust_level!(2, log_action_for: current_user)
@@ -242,7 +241,7 @@ class Admin::UsersController < Admin::AdminController
d = UserDestroyer.new(current_user)
User.where(id: params[:users]).each do |u|
- success_count += 1 if guardian.can_delete_user?(u) and d.destroy(u, params.slice(:context)) rescue UserDestroyer::PostsExistError
+ success_count += 1 if guardian.can_delete_user?(u) && d.destroy(u, params.slice(:context)) rescue UserDestroyer::PostsExistError
end
render json: {
@@ -339,12 +338,12 @@ class Admin::UsersController < Admin::AdminController
user.save!
user.grant_admin!
user.change_trust_level!(4)
- user.email_tokens.update_all confirmed: true
+ user.email_tokens.update_all confirmed: true
email_token = user.email_tokens.create(email: user.email)
unless params[:send_email] == '0' || params[:send_email] == 'false'
- Jobs.enqueue( :critical_user_email,
+ Jobs.enqueue(:critical_user_email,
type: :account_created,
user_id: user.id,
email_token: email_token.token)
diff --git a/app/controllers/admin/watched_words_controller.rb b/app/controllers/admin/watched_words_controller.rb
index a2f777d8f55..119562dc4e0 100644
--- a/app/controllers/admin/watched_words_controller.rb
+++ b/app/controllers/admin/watched_words_controller.rb
@@ -28,7 +28,7 @@ class Admin::WatchedWordsController < Admin::AdminController
File.open(file.tempfile, encoding: "ISO-8859-1").each_line do |line|
WatchedWord.create_or_update_word(word: line, action_key: action_key) unless line.empty?
end
- data = {url: '/ok'}
+ data = { url: '/ok' }
rescue => e
data = failed_json.merge(errors: [e.message])
end
diff --git a/app/controllers/admin/web_hooks_controller.rb b/app/controllers/admin/web_hooks_controller.rb
index 4deb554c8b7..c3b2cfe9ef0 100644
--- a/app/controllers/admin/web_hooks_controller.rb
+++ b/app/controllers/admin/web_hooks_controller.rb
@@ -6,10 +6,10 @@ class Admin::WebHooksController < Admin::AdminController
offset = params[:offset].to_i
web_hooks = WebHook.limit(limit)
- .offset(offset)
- .includes(:web_hook_event_types)
- .includes(:categories)
- .includes(:groups)
+ .offset(offset)
+ .includes(:web_hook_event_types)
+ .includes(:categories)
+ .includes(:groups)
json = {
web_hooks: serialize_data(web_hooks, AdminWebHookSerializer),
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 7527f4a9ba0..1484df2603b 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -147,7 +147,7 @@ class ApplicationController < ActionController::Base
render_json_error I18n.t('read_only_mode_enabled'), type: :read_only, status: 503
end
- def rescue_discourse_actions(type, status_code, include_ember=false)
+ def rescue_discourse_actions(type, status_code, include_ember = false)
show_json_errors = (request.format && request.format.json?) ||
(request.xhr?) ||
@@ -175,7 +175,7 @@ class ApplicationController < ActionController::Base
def set_current_user_for_logs
if current_user
- Logster.add_to_env(request.env,"username",current_user.username)
+ Logster.add_to_env(request.env, "username", current_user.username)
response.headers["X-Discourse-Username"] = current_user.username
end
response.headers["X-Discourse-Route"] = "#{controller_name}/#{action_name}"
@@ -298,9 +298,9 @@ class ApplicationController < ActionController::Base
current_user ? SiteSetting.homepage : SiteSetting.anonymous_homepage
end
- def serialize_data(obj, serializer, opts=nil)
+ def serialize_data(obj, serializer, opts = nil)
# If it's an array, apply the serializer as an each_serializer to the elements
- serializer_opts = {scope: guardian}.merge!(opts || {})
+ serializer_opts = { scope: guardian }.merge!(opts || {})
if obj.respond_to?(:to_ary)
serializer_opts[:each_serializer] = serializer
ActiveModel::ArraySerializer.new(obj.to_ary, serializer_opts).as_json
@@ -313,11 +313,11 @@ class ApplicationController < ActionController::Base
# 20% slower than calling MultiJSON.dump ourselves. I'm not sure why
# Rails doesn't call MultiJson.dump when you pass it json: obj but
# it seems we don't need whatever Rails is doing.
- def render_serialized(obj, serializer, opts=nil)
+ def render_serialized(obj, serializer, opts = nil)
render_json_dump(serialize_data(obj, serializer, opts), opts)
end
- def render_json_dump(obj, opts=nil)
+ def render_json_dump(obj, opts = nil)
opts ||= {}
if opts[:rest_serializer]
obj['__rest_serializer'] = "1"
@@ -341,7 +341,7 @@ class ApplicationController < ActionController::Base
Middleware::AnonymousCache.anon_cache(request.env, time_length)
end
- def fetch_user_from_params(opts=nil, eager_load = [])
+ def fetch_user_from_params(opts = nil, eager_load = [])
opts ||= {}
user = if params[:username]
username_lower = params[:username].downcase.chomp('.json')
@@ -361,9 +361,9 @@ class ApplicationController < ActionController::Base
end
def post_ids_including_replies
- post_ids = params[:post_ids].map {|p| p.to_i}
+ post_ids = params[:post_ids].map { |p| p.to_i }
if params[:reply_post_ids]
- post_ids |= PostReply.where(post_id: params[:reply_post_ids].map {|p| p.to_i}).pluck(:reply_id)
+ post_ids |= PostReply.where(post_id: params[:reply_post_ids].map { |p| p.to_i }).pluck(:reply_id)
end
post_ids
end
@@ -394,7 +394,6 @@ class ApplicationController < ActionController::Base
end
end
-
def secure_session
SecureSession.new(session["secure_session_id"] ||= SecureRandom.hex)
end
@@ -433,14 +432,16 @@ class ApplicationController < ActionController::Base
def custom_html_json
target = view_context.mobile_view? ? :mobile : :desktop
- data = if @theme_key
- {
- top: Theme.lookup_field(@theme_key, target, "after_header"),
- footer: Theme.lookup_field(@theme_key, target, "footer")
- }
- else
- {}
- end
+
+ data =
+ if @theme_key
+ {
+ top: Theme.lookup_field(@theme_key, target, "after_header"),
+ footer: Theme.lookup_field(@theme_key, target, "footer")
+ }
+ else
+ {}
+ end
if DiscoursePluginRegistry.custom_html
data.merge! DiscoursePluginRegistry.custom_html
@@ -480,7 +481,7 @@ class ApplicationController < ActionController::Base
# opts:
# type - a machine-readable description of the error
# status - HTTP status code to return
- def render_json_error(obj, opts={})
+ def render_json_error(obj, opts = {})
opts = { status: opts } if opts.is_a?(Integer)
render json: MultiJson.dump(create_errors_json(obj, opts[:type])), status: opts[:status] || 422
end
@@ -493,7 +494,7 @@ class ApplicationController < ActionController::Base
{ failed: 'FAILED' }
end
- def json_result(obj, opts={})
+ def json_result(obj, opts = {})
if yield(obj)
json = success_json
@@ -574,21 +575,20 @@ class ApplicationController < ActionController::Base
raise Discourse::ReadOnly.new if !(request.get? || request.head?) && Discourse.readonly_mode?
end
- def build_not_found_page(status=404, layout=false)
+ def build_not_found_page(status = 404, layout = false)
category_topic_ids = Category.pluck(:topic_id).compact
@container_class = "wrap not-found-container"
- @top_viewed = TopicQuery.new(nil, {except_topic_ids: category_topic_ids}).list_top_for("monthly").topics.first(10)
+ @top_viewed = TopicQuery.new(nil, except_topic_ids: category_topic_ids).list_top_for("monthly").topics.first(10)
@recent = Topic.where.not(id: category_topic_ids).recent(10)
@slug = params[:slug].class == String ? params[:slug] : ''
@slug = (params[:id].class == String ? params[:id] : '') if @slug.blank?
- @slug.tr!('-',' ')
+ @slug.tr!('-', ' ')
render_to_string status: status, layout: layout, formats: [:html], template: '/exceptions/not_found'
end
-
protected
- def render_post_json(post, add_raw=true)
+ def render_post_json(post, add_raw = true)
post_serializer = PostSerializer.new(post, scope: guardian, root: false)
post_serializer.add_raw = add_raw
diff --git a/app/controllers/badges_controller.rb b/app/controllers/badges_controller.rb
index 432489a3d43..6447558befe 100644
--- a/app/controllers/badges_controller.rb
+++ b/app/controllers/badges_controller.rb
@@ -14,7 +14,7 @@ class BadgesController < ApplicationController
if (params[:only_listable] == "true") || !request.xhr?
# NOTE: this is sorted client side if needed
badges = badges.includes(:badge_grouping)
- .where(enabled: true, listable: true)
+ .where(enabled: true, listable: true)
end
diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb
index c2da87bac4a..51e8e088528 100644
--- a/app/controllers/categories_controller.rb
+++ b/app/controllers/categories_controller.rb
@@ -218,7 +218,7 @@ class CategoriesController < ApplicationController
end
if p = params[:permissions]
- p.each do |k,v|
+ p.each do |k, v|
p[k] = v.to_i
end
end
@@ -250,10 +250,10 @@ class CategoriesController < ApplicationController
:default_view,
:subcategory_list_style,
:default_top_period,
- :custom_fields => [params[:custom_fields].try(:keys)],
- :permissions => [*p.try(:keys)],
- :allowed_tags => [],
- :allowed_tag_groups => [])
+ custom_fields: [params[:custom_fields].try(:keys)],
+ permissions: [*p.try(:keys)],
+ allowed_tags: [],
+ allowed_tag_groups: [])
end
end
@@ -265,7 +265,7 @@ class CategoriesController < ApplicationController
@staff_action_logger = StaffActionLogger.new(current_user)
end
- def include_topics(parent_category=nil)
+ def include_topics(parent_category = nil)
view_context.mobile_view? ||
params[:include_topics] ||
(parent_category && parent_category.subcategory_list_includes_topics?) ||
diff --git a/app/controllers/clicks_controller.rb b/app/controllers/clicks_controller.rb
index 4d7e186b0eb..23b1684f2b5 100644
--- a/app/controllers/clicks_controller.rb
+++ b/app/controllers/clicks_controller.rb
@@ -8,7 +8,7 @@ class ClicksController < ApplicationController
params = track_params.merge(ip: request.remote_ip)
if params[:topic_id].present? || params[:post_id].present?
- params.merge!({ user_id: current_user.id }) if current_user.present?
+ params.merge!(user_id: current_user.id) if current_user.present?
@redirect_url = TopicLinkClick.create_from(params)
end
diff --git a/app/controllers/composer_messages_controller.rb b/app/controllers/composer_messages_controller.rb
index ff1a51d2bd2..62f86b05835 100644
--- a/app/controllers/composer_messages_controller.rb
+++ b/app/controllers/composer_messages_controller.rb
@@ -11,7 +11,7 @@ class ComposerMessagesController < ApplicationController
if params[:topic_id].present?
topic = Topic.where(id: params[:topic_id]).first
if guardian.can_see?(topic)
- json[:extras] = {duplicate_lookup: TopicLink.duplicate_lookup(topic)}
+ json[:extras] = { duplicate_lookup: TopicLink.duplicate_lookup(topic) }
end
end
diff --git a/app/controllers/directory_items_controller.rb b/app/controllers/directory_items_controller.rb
index 6158534b400..22c723c1e7a 100644
--- a/app/controllers/directory_items_controller.rb
+++ b/app/controllers/directory_items_controller.rb
@@ -53,7 +53,7 @@ class DirectoryItemsController < ApplicationController
# Put yourself at the top of the first page
if result.present? && current_user.present? && page == 0
- position = result.index {|r| r.user_id == current_user.id }
+ position = result.index { |r| r.user_id == current_user.id }
# Don't show the record unless you're not in the top positions already
if (position || 10) >= 10
diff --git a/app/controllers/draft_controller.rb b/app/controllers/draft_controller.rb
index 7af211db564..4e7a0437479 100644
--- a/app/controllers/draft_controller.rb
+++ b/app/controllers/draft_controller.rb
@@ -5,7 +5,7 @@ class DraftController < ApplicationController
def show
seq = params[:sequence] || DraftSequence.current(current_user, params[:draft_key])
- render json: {draft: Draft.get(current_user, params[:draft_key], seq), draft_sequence: seq}
+ render json: { draft: Draft.get(current_user, params[:draft_key], seq), draft_sequence: seq }
end
def update
diff --git a/app/controllers/email_controller.rb b/app/controllers/email_controller.rb
index c7eace9c02f..771e6e1b37a 100644
--- a/app/controllers/email_controller.rb
+++ b/app/controllers/email_controller.rb
@@ -31,8 +31,8 @@ class EmailController < ApplicationController
if @topic.category_id
if CategoryUser.exists?(user_id: @user.id, notification_level: CategoryUser.watching_levels, category_id: @topic.category_id)
@watched_count = TopicUser.joins(:topic)
- .where(user: @user, notification_level: watching, "topics.category_id" => @topic.category_id)
- .count
+ .where(user: @user, notification_level: watching, "topics.category_id" => @topic.category_id)
+ .count
end
end
end
@@ -52,28 +52,28 @@ class EmailController < ApplicationController
if topic
if params["unwatch_topic"]
TopicUser.where(topic_id: topic.id, user_id: user.id)
- .update_all(notification_level: TopicUser.notification_levels[:tracking])
+ .update_all(notification_level: TopicUser.notification_levels[:tracking])
updated = true
end
if params["unwatch_category"] && topic.category_id
TopicUser.joins(:topic)
- .where(:user => user,
- :notification_level => TopicUser.notification_levels[:watching],
- "topics.category_id" => topic.category_id)
- .update_all(notification_level: TopicUser.notification_levels[:tracking])
+ .where(:user => user,
+ :notification_level => TopicUser.notification_levels[:watching],
+ "topics.category_id" => topic.category_id)
+ .update_all(notification_level: TopicUser.notification_levels[:tracking])
CategoryUser.where(user_id: user.id,
- category_id: topic.category_id,
- notification_level: CategoryUser.watching_levels
+ category_id: topic.category_id,
+ notification_level: CategoryUser.watching_levels
)
- .destroy_all
+ .destroy_all
updated = true
end
if params["mute_topic"]
TopicUser.where(topic_id: topic.id, user_id: user.id)
- .update_all(notification_level: TopicUser.notification_levels[:muted])
+ .update_all(notification_level: TopicUser.notification_levels[:muted])
updated = true
end
end
@@ -90,9 +90,9 @@ class EmailController < ApplicationController
if params["unsubscribe_all"]
user.user_option.update_columns(email_always: false,
- email_digests: false,
- email_direct: false,
- email_private_messages: false)
+ email_digests: false,
+ email_direct: false,
+ email_private_messages: false)
updated = true
end
diff --git a/app/controllers/embed_controller.rb b/app/controllers/embed_controller.rb
index f64cc8035c7..d7da707d98d 100644
--- a/app/controllers/embed_controller.rb
+++ b/app/controllers/embed_controller.rb
@@ -74,7 +74,7 @@ class EmbedController < ApplicationController
by_url = {}
if embed_urls.present?
- urls = embed_urls.map {|u| u.sub(/#discourse-comments$/, '').sub(/\/$/, '') }
+ urls = embed_urls.map { |u| u.sub(/#discourse-comments$/, '').sub(/\/$/, '') }
topic_embeds = TopicEmbed.where(embed_url: urls).includes(:topic).references(:topic)
topic_embeds.each do |te|
@@ -88,7 +88,7 @@ class EmbedController < ApplicationController
end
end
- render json: {counts: by_url}, callback: params[:callback]
+ render json: { counts: by_url }, callback: params[:callback]
end
private
@@ -96,7 +96,7 @@ class EmbedController < ApplicationController
def get_embeddable_css_class
@embeddable_css_class = ""
embeddable_host = EmbeddableHost.record_for_url(request.referer)
- @embeddable_css_class = " class=\"#{embeddable_host.class_name}\"" if embeddable_host.present? and embeddable_host.class_name.present?
+ @embeddable_css_class = " class=\"#{embeddable_host.class_name}\"" if embeddable_host.present? && embeddable_host.class_name.present?
end
def ensure_api_request
@@ -114,5 +114,4 @@ class EmbedController < ApplicationController
raise Discourse::InvalidAccess.new('invalid referer host')
end
-
end
diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb
index 46a69b6be4f..504dc251371 100644
--- a/app/controllers/groups_controller.rb
+++ b/app/controllers/groups_controller.rb
@@ -124,13 +124,13 @@ class GroupsController < ApplicationController
members = group.users
.order('NOT group_users.owner')
.order(order)
- .order(:username_lower => dir)
+ .order(username_lower: dir)
.limit(limit)
.offset(offset)
owners = group.users
.order(order)
- .order(:username_lower => dir)
+ .order(username_lower: dir)
.where('group_users.owner')
render json: {
@@ -274,8 +274,8 @@ class GroupsController < ApplicationController
end
GroupUser.where(group_id: group.id)
- .where(user_id: user_id)
- .update_all(notification_level: notification_level)
+ .where(user_id: user_id)
+ .update_all(notification_level: notification_level)
render json: success_json
end
diff --git a/app/controllers/highlight_js_controller.rb b/app/controllers/highlight_js_controller.rb
index 86137be56ea..19a83c4a766 100644
--- a/app/controllers/highlight_js_controller.rb
+++ b/app/controllers/highlight_js_controller.rb
@@ -26,4 +26,3 @@ class HighlightJsController < ApplicationController
end
end
end
-
diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb
index 42ab4ca712e..a892c50cfc4 100644
--- a/app/controllers/invites_controller.rb
+++ b/app/controllers/invites_controller.rb
@@ -16,11 +16,12 @@ class InvitesController < ApplicationController
invite = Invite.find_by(invite_key: params[:id])
if invite.present?
- store_preloaded("invite_info", MultiJson.dump({
+ store_preloaded("invite_info", MultiJson.dump(
invited_by: UserNameSerializer.new(invite.invited_by, scope: guardian, root: false),
email: invite.email,
- username: UserNameSuggester.suggest(invite.email)
- }))
+ username: UserNameSuggester.suggest(invite.email))
+ )
+
render layout: 'application'
else
flash.now[:error] = I18n.t('invite.not_found')
@@ -81,7 +82,7 @@ class InvitesController < ApplicationController
render json: failed_json, status: 422
end
rescue Invite::UserExists, ActiveRecord::RecordInvalid => e
- render json: {errors: [e.message]}, status: 422
+ render json: { errors: [e.message] }, status: 422
end
end
@@ -110,7 +111,7 @@ class InvitesController < ApplicationController
render json: failed_json, status: 422
end
rescue => e
- render json: {errors: [e.message]}, status: 422
+ render json: { errors: [e.message] }, status: 422
end
end
@@ -163,7 +164,7 @@ class InvitesController < ApplicationController
data = if extension.downcase == ".csv"
path = Invite.create_csv(file, name)
Jobs.enqueue(:bulk_invite, filename: "#{name}#{extension}", current_user_id: current_user.id)
- {url: path}
+ { url: path }
else
failed_json.merge(errors: [I18n.t("bulk_invite.file_should_be_csv")])
end
diff --git a/app/controllers/list_controller.rb b/app/controllers/list_controller.rb
index 66e59247f93..65635e54293 100644
--- a/app/controllers/list_controller.rb
+++ b/app/controllers/list_controller.rb
@@ -205,7 +205,7 @@ class ListController < ApplicationController
render 'list', formats: [:rss]
end
- def top(options=nil)
+ def top(options = nil)
options ||= {}
period = ListController.best_period_for(current_user.try(:previous_visit_at), options[:category])
send("top_#{period}", options)
@@ -308,7 +308,7 @@ class ListController < ApplicationController
parent_category_id = nil
if parent_slug_or_id.present?
parent_category_id = Category.query_parent_category(parent_slug_or_id)
- permalink_redirect_or_not_found and return if parent_category_id.blank? && !id
+ permalink_redirect_or_not_found && (return) if parent_category_id.blank? && !id
end
@category = Category.query_category(slug_or_id, parent_category_id)
@@ -319,7 +319,7 @@ class ListController < ApplicationController
(redirect_to category.url, status: 301) && return if category
end
- permalink_redirect_or_not_found and return if !@category
+ permalink_redirect_or_not_found && (return) if !@category
@description_meta = @category.description_text
raise Discourse::NotFound unless guardian.can_see?(@category)
@@ -362,23 +362,23 @@ class ListController < ApplicationController
else # :next
public_send(method, opts.merge(next_page_params(opts)))
end
- url.sub('.json?','?')
+ url.sub('.json?', '?')
end
- def get_excluded_category_ids(current_category=nil)
+ def get_excluded_category_ids(current_category = nil)
exclude_category_ids = Category.where(suppress_from_homepage: true)
exclude_category_ids = exclude_category_ids.where.not(id: current_category) if current_category
exclude_category_ids.pluck(:id)
end
- def self.best_period_for(previous_visit_at, category_id=nil)
+ def self.best_period_for(previous_visit_at, category_id = nil)
default_period = ((category_id && Category.where(id: category_id).pluck(:default_top_period).first) ||
SiteSetting.top_page_default_timeframe).to_sym
best_period_with_topics_for(previous_visit_at, category_id, default_period) || default_period
end
- def self.best_period_with_topics_for(previous_visit_at, category_id=nil, default_period=SiteSetting.top_page_default_timeframe)
+ def self.best_period_with_topics_for(previous_visit_at, category_id = nil, default_period = SiteSetting.top_page_default_timeframe)
best_periods_for(previous_visit_at, default_period.to_sym).each do |period|
top_topics = TopTopic.where("#{period}_score > 0")
top_topics = top_topics.joins(:topic).where("topics.category_id = ?", category_id) if category_id
@@ -389,12 +389,12 @@ class ListController < ApplicationController
false
end
- def self.best_periods_for(date, default_period=:all)
+ def self.best_periods_for(date, default_period = :all)
date ||= 1.year.ago
periods = []
periods << default_period if :all != default_period
- periods << :daily if :daily != default_period && date > 8.days.ago
- periods << :weekly if :weekly != default_period && date > 35.days.ago
+ periods << :daily if :daily != default_period && date > 8.days.ago
+ periods << :weekly if :weekly != default_period && date > 35.days.ago
periods << :monthly if :monthly != default_period && date > 180.days.ago
periods << :yearly if :yearly != default_period
periods
diff --git a/app/controllers/metadata_controller.rb b/app/controllers/metadata_controller.rb
index 04a5eaafd49..c297ed18bd7 100644
--- a/app/controllers/metadata_controller.rb
+++ b/app/controllers/metadata_controller.rb
@@ -31,7 +31,7 @@ class MetadataController < ApplicationController
}
if SiteSetting.native_app_install_banner
- manifest = manifest.merge({
+ manifest = manifest.merge(
prefer_related_applications: true,
related_applications: [
{
@@ -39,7 +39,7 @@ class MetadataController < ApplicationController
id: "com.discourse"
}
]
- })
+ )
end
manifest
diff --git a/app/controllers/notifications_controller.rb b/app/controllers/notifications_controller.rb
index 1415f78f573..7f6b95ca535 100644
--- a/app/controllers/notifications_controller.rb
+++ b/app/controllers/notifications_controller.rb
@@ -37,9 +37,9 @@ class NotificationsController < ApplicationController
offset = params[:offset].to_i
notifications = Notification.where(user_id: user.id)
- .visible
- .includes(:topic)
- .order(created_at: :desc)
+ .visible
+ .includes(:topic)
+ .order(created_at: :desc)
total_rows = notifications.dup.count
notifications = notifications.offset(offset).limit(60)
diff --git a/app/controllers/post_action_users_controller.rb b/app/controllers/post_action_users_controller.rb
index e9e6c054805..46b6328d612 100644
--- a/app/controllers/post_action_users_controller.rb
+++ b/app/controllers/post_action_users_controller.rb
@@ -12,10 +12,9 @@ class PostActionUsersController < ApplicationController
post = finder.first
guardian.ensure_can_see!(post)
-
post_actions = post.post_actions.where(post_action_type_id: post_action_type_id)
- .includes(:user)
- .order('post_actions.created_at asc')
+ .includes(:user)
+ .order('post_actions.created_at asc')
if !guardian.can_see_post_actors?(post.topic, post_action_type_id)
if !current_user
diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb
index 5e18b575203..1794ddded0b 100644
--- a/app/controllers/posts_controller.rb
+++ b/app/controllers/posts_controller.rb
@@ -41,23 +41,23 @@ class PostsController < ApplicationController
if params[:id] == "private_posts"
raise Discourse::NotFound if current_user.nil?
posts = Post.private_posts
- .order(created_at: :desc)
- .where('posts.id <= ?', last_post_id)
- .where('posts.id > ?', last_post_id - 50)
- .includes(topic: :category)
- .includes(user: :primary_group)
- .includes(:reply_to_user)
- .limit(50)
+ .order(created_at: :desc)
+ .where('posts.id <= ?', last_post_id)
+ .where('posts.id > ?', last_post_id - 50)
+ .includes(topic: :category)
+ .includes(user: :primary_group)
+ .includes(:reply_to_user)
+ .limit(50)
rss_description = I18n.t("rss_description.private_posts")
else
posts = Post.public_posts
- .order(created_at: :desc)
- .where('posts.id <= ?', last_post_id)
- .where('posts.id > ?', last_post_id - 50)
- .includes(topic: :category)
- .includes(user: :primary_group)
- .includes(:reply_to_user)
- .limit(50)
+ .order(created_at: :desc)
+ .where('posts.id <= ?', last_post_id)
+ .where('posts.id > ?', last_post_id - 50)
+ .includes(topic: :category)
+ .includes(user: :primary_group)
+ .includes(:reply_to_user)
+ .limit(50)
rss_description = I18n.t("rss_description.posts")
end
@@ -92,12 +92,12 @@ class PostsController < ApplicationController
user = fetch_user_from_params
posts = Post.public_posts
- .where(user_id: user.id)
- .where(post_type: Post.types[:regular])
- .order(created_at: :desc)
- .includes(:user)
- .includes(topic: :category)
- .limit(50)
+ .where(user_id: user.id)
+ .where(post_type: Post.types[:regular])
+ .order(created_at: :desc)
+ .includes(:user)
+ .includes(topic: :category)
+ .limit(50)
posts = posts.reject { |post| !guardian.can_see?(post) || post.topic.blank? }
@@ -230,20 +230,20 @@ class PostsController < ApplicationController
RateLimiter.new(current_user, "delete_post", 3, 1.minute).performed! unless current_user.staff?
if too_late_to(:delete_post, post)
- render json: {errors: [I18n.t('too_late_to_edit')]}, status: 422
+ render json: { errors: [I18n.t('too_late_to_edit')] }, status: 422
return
end
guardian.ensure_can_delete!(post)
- destroyer = PostDestroyer.new(current_user, post, { context: params[:context] })
+ destroyer = PostDestroyer.new(current_user, post, context: params[:context])
destroyer.destroy
render nothing: true
end
def expand_embed
- render json: {cooked: TopicEmbed.expanded_for(find_post_from_params) }
+ render json: { cooked: TopicEmbed.expanded_for(find_post_from_params) }
rescue
render_json_error I18n.t('errors.embed.load_from_remote')
end
@@ -266,10 +266,10 @@ class PostsController < ApplicationController
raise Discourse::InvalidParameters.new(:post_ids) if posts.blank?
# Make sure we can delete the posts
- posts.each {|p| guardian.ensure_can_delete!(p) }
+ posts.each { |p| guardian.ensure_can_delete!(p) }
Post.transaction do
- posts.each {|p| PostDestroyer.new(current_user, p).destroy }
+ posts.each { |p| PostDestroyer.new(current_user, p).destroy }
end
render nothing: true
@@ -399,7 +399,7 @@ class PostsController < ApplicationController
post = find_post_from_params
guardian.ensure_can_wiki!(post)
- post.revise(current_user, { wiki: params[:wiki] })
+ post.revise(current_user, wiki: params[:wiki])
render nothing: true
end
@@ -408,7 +408,7 @@ class PostsController < ApplicationController
guardian.ensure_can_change_post_type!
post = find_post_from_params
- post.revise(current_user, { post_type: params[:post_type].to_i })
+ post.revise(current_user, post_type: params[:post_type].to_i)
render nothing: true
end
@@ -441,7 +441,7 @@ class PostsController < ApplicationController
limit = [(params[:limit] || 60).to_i, 100].min
posts = user_posts(guardian, user.id, offset: offset, limit: limit)
- .where(id: PostAction.where(post_action_type_id: PostActionType.notify_flag_type_ids)
+ .where(id: PostAction.where(post_action_type_id: PostActionType.notify_flag_type_ids)
.where(disagreed_at: nil)
.select(:post_id))
@@ -479,7 +479,6 @@ class PostsController < ApplicationController
render json: json_obj, status: (!!success) ? 200 : 422
end
-
def find_post_revision_from_params
post_id = params[:id] || params[:post_id]
revision = params[:revision].to_i
@@ -529,9 +528,9 @@ class PostsController < ApplicationController
def user_posts(guardian, user_id, opts)
posts = Post.includes(:user, :topic, :deleted_by, :user_actions)
- .where(user_id: user_id)
- .with_deleted
- .order(created_at: :desc)
+ .where(user_id: user_id)
+ .with_deleted
+ .order(created_at: :desc)
if guardian.user.moderator?
@@ -545,7 +544,7 @@ class PostsController < ApplicationController
end
posts.offset(opts[:offset])
- .limit(opts[:limit])
+ .limit(opts[:limit])
end
def create_params
@@ -622,7 +621,7 @@ class PostsController < ApplicationController
"post##" << Digest::SHA1.hexdigest(args
.to_a
.concat([["user", current_user.id]])
- .sort{|x,y| x[0] <=> y[0]}.join do |x,y|
+ .sort { |x, y| x[0] <=> y[0] }.join do |x, y|
"#{x}:#{y}"
end)
end
diff --git a/app/controllers/queued_posts_controller.rb b/app/controllers/queued_posts_controller.rb
index 6b225b5e65c..888ef0ddc2a 100644
--- a/app/controllers/queued_posts_controller.rb
+++ b/app/controllers/queued_posts_controller.rb
@@ -41,18 +41,17 @@ class QueuedPostsController < ApplicationController
render_serialized(qp, QueuedPostSerializer, root: :queued_posts)
end
-
private
def user_deletion_opts
base = {
- context: I18n.t('queue.delete_reason', {performed_by: current_user.username}),
+ context: I18n.t('queue.delete_reason', performed_by: current_user.username),
delete_posts: true,
delete_as_spammer: true
}
if Rails.env.production? && ENV["Staging"].nil?
- base.merge!({block_email: true, block_ip: true})
+ base.merge!(block_email: true, block_ip: true)
end
base
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
index 60d63488aa0..a348ac7505b 100644
--- a/app/controllers/search_controller.rb
+++ b/app/controllers/search_controller.rb
@@ -98,7 +98,7 @@ class SearchController < ApplicationController
search_context = params[:search_context]
unless search_context
if (context = params[:context]) && (id = params[:context_id])
- search_context = {type: context, id: id}
+ search_context = { type: context, id: id }
end
end
@@ -108,7 +108,7 @@ class SearchController < ApplicationController
# A user is found by username
context_obj = nil
- if ['user','private_messages'].include? search_context[:type]
+ if ['user', 'private_messages'].include? search_context[:type]
context_obj = User.find_by(username_lower: search_context[:id].downcase)
elsif 'category' == search_context[:type]
context_obj = Category.find_by(id: search_context[:id].to_i)
diff --git a/app/controllers/session_controller.rb b/app/controllers/session_controller.rb
index 96259d430d4..60d30691512 100644
--- a/app/controllers/session_controller.rb
+++ b/app/controllers/session_controller.rb
@@ -9,7 +9,7 @@ class SessionController < ApplicationController
ACTIVATE_USER_KEY = "activate_user"
def csrf
- render json: {csrf: form_authenticity_token }
+ render json: { csrf: form_authenticity_token }
end
def sso
@@ -35,7 +35,7 @@ class SessionController < ApplicationController
end
end
- def sso_provider(payload=nil)
+ def sso_provider(payload = nil)
payload ||= request.query_string
if SiteSetting.enable_sso_provider
sso = SingleSignOn.parse(payload, SiteSetting.sso_secret)
@@ -112,7 +112,7 @@ class SessionController < ApplicationController
activation = UserActivator.new(user, request, session, cookies)
activation.finish
session["user_created_message"] = activation.message
- redirect_to users_account_created_path and return
+ redirect_to(users_account_created_path) && (return)
else
if SiteSetting.verbose_sso_logging
Rails.logger.warn("Verbose SSO log: User was logged on #{user.username}\n\n#{sso.diagnostics}")
@@ -292,11 +292,11 @@ class SessionController < ApplicationController
end
def invalid_credentials
- render json: {error: I18n.t("login.incorrect_username_email_or_password")}
+ render json: { error: I18n.t("login.incorrect_username_email_or_password") }
end
def login_not_approved
- render json: {error: I18n.t("login.not_approved")}
+ render json: { error: I18n.t("login.not_approved") }
end
def not_activated(user)
@@ -310,19 +310,19 @@ class SessionController < ApplicationController
end
def not_allowed_from_ip_address(user)
- render json: {error: I18n.t("login.not_allowed_from_ip_address", username: user.username)}
+ render json: { error: I18n.t("login.not_allowed_from_ip_address", username: user.username) }
end
def admin_not_allowed_from_ip_address(user)
- render json: {error: I18n.t("login.admin_not_allowed_from_ip_address", username: user.username)}
+ render json: { error: I18n.t("login.admin_not_allowed_from_ip_address", username: user.username) }
end
def failed_to_login(user)
message = user.suspend_reason ? "login.suspended_with_reason" : "login.suspended"
render json: {
- error: I18n.t(message, { date: I18n.l(user.suspended_till, format: :date_only),
- reason: Rack::Utils.escape_html(user.suspend_reason) }),
+ error: I18n.t(message, date: I18n.l(user.suspended_till, format: :date_only),
+ reason: Rack::Utils.escape_html(user.suspend_reason)),
reason: 'suspended'
}
end
@@ -337,7 +337,6 @@ class SessionController < ApplicationController
render_serialized(user, UserSerializer)
end
-
def render_sso_error(status:, text:)
@sso_error = text
render status: status, layout: 'no_ember'
diff --git a/app/controllers/similar_topics_controller.rb b/app/controllers/similar_topics_controller.rb
index 1f0a84d84f8..8070697e57c 100644
--- a/app/controllers/similar_topics_controller.rb
+++ b/app/controllers/similar_topics_controller.rb
@@ -26,7 +26,7 @@ class SimilarTopicsController < ApplicationController
return render json: [] if invalid_length || !Topic.count_exceeds_minimum?
topics = Topic.similar_to(title, raw, current_user).to_a
- topics.map! {|t| SimilarTopic.new(t) }
+ topics.map! { |t| SimilarTopic.new(t) }
render_serialized(topics, SimilarTopicSerializer, root: :similar_topics, rest_serializer: true)
end
diff --git a/app/controllers/static_controller.rb b/app/controllers/static_controller.rb
index 30c140304ee..b524b0dd8e7 100644
--- a/app/controllers/static_controller.rb
+++ b/app/controllers/static_controller.rb
@@ -13,9 +13,9 @@ class StaticController < ApplicationController
return redirect_to path('/login') if SiteSetting.login_required? && current_user.nil? && (params[:id] == 'faq' || params[:id] == 'guidelines')
map = {
- "faq" => {redirect: "faq_url", topic_id: "guidelines_topic_id"},
- "tos" => {redirect: "tos_url", topic_id: "tos_topic_id"},
- "privacy" => {redirect: "privacy_policy_url", topic_id: "privacy_topic_id"}
+ "faq" => { redirect: "faq_url", topic_id: "guidelines_topic_id" },
+ "tos" => { redirect: "tos_url", topic_id: "tos_topic_id" },
+ "privacy" => { redirect: "privacy_policy_url", topic_id: "privacy_topic_id" }
}
@page = params[:id]
@@ -100,7 +100,7 @@ class StaticController < ApplicationController
# a huge expiry, we also cache these assets in nginx so it bypassed if needed
def favicon
- data = DistributedMemoizer.memoize('favicon' + SiteSetting.favicon_url, 60*30) do
+ data = DistributedMemoizer.memoize('favicon' + SiteSetting.favicon_url, 60 * 30) do
begin
file = FileHelper.download(
SiteSetting.favicon_url,
@@ -137,21 +137,19 @@ class StaticController < ApplicationController
end
end
-
def cdn_asset
serve_asset
end
protected
- def serve_asset(suffix=nil)
+ def serve_asset(suffix = nil)
path = File.expand_path(Rails.root + "public/assets/#{params[:path]}#{suffix}")
# SECURITY what if path has /../
raise Discourse::NotFound unless path.start_with?(Rails.root.to_s + "/public/assets")
-
response.headers["Expires"] = 1.year.from_now.httpdate
response.headers["Access-Control-Allow-Origin"] = params[:origin] if params[:origin]
diff --git a/app/controllers/steps_controller.rb b/app/controllers/steps_controller.rb
index 005d2d7d781..c80bdffd2f9 100644
--- a/app/controllers/steps_controller.rb
+++ b/app/controllers/steps_controller.rb
@@ -20,7 +20,7 @@ class StepsController < ApplicationController
else
errors = []
updater.errors.messages.each do |field, msg|
- errors << {field: field, description: msg.join }
+ errors << { field: field, description: msg.join }
end
render json: { errors: errors }, status: 422
end
diff --git a/app/controllers/stylesheets_controller.rb b/app/controllers/stylesheets_controller.rb
index 8d1328e0f2b..d174f28faa6 100644
--- a/app/controllers/stylesheets_controller.rb
+++ b/app/controllers/stylesheets_controller.rb
@@ -19,17 +19,17 @@ class StylesheetsController < ApplicationController
no_cookies
- target,digest = params[:name].split(/_([a-f0-9]{40})/)
+ target, digest = params[:name].split(/_([a-f0-9]{40})/)
if !Rails.env.production?
# TODO add theme
# calling this method ensures we have a cache for said target
# we hold of re-compilation till someone asks for asset
if target.include?("theme")
- split_target,theme_id = target.split(/_(-?[0-9]+)/)
+ split_target, theme_id = target.split(/_(-?[0-9]+)/)
theme = Theme.find(theme_id) if theme_id
else
- split_target,color_scheme_id = target.split(/_(-?[0-9]+)/)
+ split_target, color_scheme_id = target.split(/_(-?[0-9]+)/)
theme = Theme.find_by(color_scheme_id: color_scheme_id)
end
Stylesheet::Manager.stylesheet_link_tag(split_target, nil, theme&.key)
@@ -59,7 +59,6 @@ class StylesheetsController < ApplicationController
return render nothing: true, status: 304
end
-
unless File.exist?(location)
if current = query.limit(1).pluck(source_map ? :source_map : :content).first
File.write(location, current)
diff --git a/app/controllers/tag_groups_controller.rb b/app/controllers/tag_groups_controller.rb
index 783839fd4d6..d29d3ba8d7b 100644
--- a/app/controllers/tag_groups_controller.rb
+++ b/app/controllers/tag_groups_controller.rb
@@ -69,7 +69,7 @@ class TagGroupsController < ApplicationController
end
def tag_groups_params
- result = params.permit(:id, :name, :one_per_topic, :tag_names => [], :parent_tag_name => [])
+ result = params.permit(:id, :name, :one_per_topic, tag_names: [], parent_tag_name: [])
result[:tag_names] ||= []
result[:parent_tag_name] ||= []
result[:one_per_topic] = (params[:one_per_topic] == "true")
diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb
index 0af8be70a63..21dd16c8188 100644
--- a/app/controllers/tags_controller.rb
+++ b/app/controllers/tags_controller.rb
@@ -14,18 +14,18 @@ class TagsController < ::ApplicationController
:tag_feed,
:search,
:check_hashtag,
- Discourse.anonymous_filters.map { |f| :"show_#{f}"}
+ Discourse.anonymous_filters.map { |f| :"show_#{f}" }
].flatten
before_filter :set_category_from_params, except: [:index, :update, :destroy, :tag_feed, :search, :notifications, :update_notifications]
def index
categories = Category.where("id in (select category_id from category_tags)")
- .where("id in (?)", guardian.allowed_category_ids)
- .preload(:tags)
+ .where("id in (?)", guardian.allowed_category_ids)
+ .preload(:tags)
category_tag_counts = categories.map do |c|
h = Tag.category_tags_by_count_query(c, limit: 300).count(Tag::COUNT_ARG)
- h.merge!(c.tags.where.not(name: h.keys).inject({}) { |sum,t| sum[t.name] = 0; sum }) # unused tags
- {id: c.id, tags: self.class.tag_counts_json(h)}
+ h.merge!(c.tags.where.not(name: h.keys).inject({}) { |sum, t| sum[t.name] = 0; sum }) # unused tags
+ { id: c.id, tags: self.class.tag_counts_json(h) }
end
tag_counts = self.class.tags_by_count(guardian, limit: 300).count(Tag::COUNT_ARG)
@@ -91,7 +91,7 @@ class TagsController < ::ApplicationController
tag.name = new_tag_name
if tag.save
StaffActionLogger.new(current_user).log_custom('renamed_tag', previous_value: params[:tag_id], new_value: new_tag_name)
- render json: { tag: { id: new_tag_name }}
+ render json: { tag: { id: new_tag_name } }
else
render_json_error tag.errors.full_messages
end
@@ -116,7 +116,7 @@ class TagsController < ::ApplicationController
@title = "#{SiteSetting.title} - #{@description}"
@atom_link = "#{Discourse.base_url}/tags/#{tag_id}.rss"
- query = TopicQuery.new(current_user, {tags: [tag_id]})
+ query = TopicQuery.new(current_user, tags: [tag_id])
latest_results = query.latest_results
@topic_list = query.create_list(:by_tag, {}, latest_results)
@@ -129,15 +129,13 @@ class TagsController < ::ApplicationController
tags_with_counts = DiscourseTagging.filter_allowed_tags(
Tag.tags_by_count_query(params.slice(:limit)),
guardian,
- {
- for_input: params[:filterForInput],
- term: params[:q],
- category: category,
- selected_tags: params[:selected_tags]
- }
+ for_input: params[:filterForInput],
+ term: params[:q],
+ category: category,
+ selected_tags: params[:selected_tags]
)
- tags = tags_with_counts.count(Tag::COUNT_ARG).map {|t, c| { id: t, text: t, count: c } }
+ tags = tags_with_counts.count(Tag::COUNT_ARG).map { |t, c| { id: t, text: t, count: c } }
json_response = { results: tags }
@@ -161,7 +159,7 @@ class TagsController < ::ApplicationController
raise Discourse::NotFound unless tag
level = params[:tag_notification][:notification_level].to_i
TagUser.change(current_user.id, tag.id, level)
- render json: {notification_level: level}
+ render json: { notification_level: level }
end
def check_hashtag
@@ -180,12 +178,12 @@ class TagsController < ::ApplicationController
raise Discourse::NotFound unless SiteSetting.tagging_enabled?
end
- def self.tags_by_count(guardian, opts={})
+ def self.tags_by_count(guardian, opts = {})
guardian.filter_allowed_categories(Tag.tags_by_count_query(opts))
end
def self.tag_counts_json(tag_counts)
- tag_counts.map {|t, c| { id: t, text: t, count: c } }
+ tag_counts.map { |t, c| { id: t, text: t, count: c } }
end
def set_category_from_params
@@ -201,13 +199,13 @@ class TagsController < ::ApplicationController
parent_category_id = nil
if parent_slug_or_id.present?
parent_category_id = Category.query_parent_category(parent_slug_or_id)
- category_redirect_or_not_found and return if parent_category_id.blank?
+ category_redirect_or_not_found && (return) if parent_category_id.blank?
end
@filter_on_category = Category.query_category(slug_or_id, parent_category_id)
end
- category_redirect_or_not_found and return if !@filter_on_category
+ category_redirect_or_not_found && (return) if !@filter_on_category
guardian.ensure_can_see!(@filter_on_category)
end
@@ -236,7 +234,7 @@ class TagsController < ::ApplicationController
end
end
- def url_method(opts={})
+ def url_method(opts = {})
if opts[:parent_category] && opts[:category]
"tag_parent_category_category_#{action_name}_path"
elsif opts[:category]
@@ -254,7 +252,7 @@ class TagsController < ::ApplicationController
else # :next
public_send(method, opts.merge(next_page_params(opts)))
end
- url.sub('.json?','?')
+ url.sub('.json?', '?')
end
def build_topic_list_options
diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb
index e35ca7391c4..27279d2dc3a 100644
--- a/app/controllers/topics_controller.rb
+++ b/app/controllers/topics_controller.rb
@@ -40,7 +40,7 @@ class TopicsController < ApplicationController
topic = Topic.find_by(slug: params[:slug].downcase)
guardian.ensure_can_see!(topic)
raise Discourse::NotFound unless topic
- render json: {slug: topic.slug, topic_id: topic.id, url: topic.url}
+ render json: { slug: topic.slug, topic_id: topic.id, url: topic.url }
end
def show
@@ -155,7 +155,6 @@ class TopicsController < ApplicationController
TopicUser.change(current_user.id, params[:topic_id].to_i, notification_level: TopicUser.notification_levels[:muted])
end
-
perform_show_response
end
@@ -164,7 +163,8 @@ class TopicsController < ApplicationController
params.require(:topic_id)
params.permit(:min_trust_level, :min_score, :min_replies, :bypass_trust_level_score, :only_moderator_liked)
- opts = { best: params[:best].to_i,
+ opts = {
+ best: params[:best].to_i,
min_trust_level: params[:min_trust_level] ? params[:min_trust_level].to_i : 1,
min_score: params[:min_score].to_i,
min_replies: params[:min_replies].to_i,
@@ -206,17 +206,16 @@ class TopicsController < ApplicationController
guardian.ensure_can_see!(@topic)
@posts = Post.where(hidden: false, deleted_at: nil, topic_id: @topic.id)
- .where('posts.id in (?)', post_ids)
- .joins("LEFT JOIN users u on u.id = posts.user_id")
- .pluck(:id, :cooked, :username)
- .map do |post_id, cooked, username|
- {
- post_id: post_id,
- username: username,
- excerpt: PrettyText.excerpt(cooked, 800, keep_emoji_images: true)
- }
- end
-
+ .where('posts.id in (?)', post_ids)
+ .joins("LEFT JOIN users u on u.id = posts.user_id")
+ .pluck(:id, :cooked, :username)
+ .map do |post_id, cooked, username|
+ {
+ post_id: post_id,
+ username: username,
+ excerpt: PrettyText.excerpt(cooked, 800, keep_emoji_images: true)
+ }
+ end
render json: @posts.to_json
end
@@ -266,7 +265,7 @@ class TopicsController < ApplicationController
params.require(:enabled)
params.permit(:until)
- status = params[:status]
+ status = params[:status]
topic_id = params[:topic_id].to_i
enabled = params[:enabled] == 'true'
@@ -319,13 +318,13 @@ class TopicsController < ApplicationController
)
if topic.save
- render json: success_json.merge!({
+ render json: success_json.merge!(
execute_at: topic_status_update&.execute_at,
duration: topic_status_update&.duration,
based_on_last_post: topic_status_update&.based_on_last_post,
closed: topic.closed,
category_id: topic_status_update&.category_id
- })
+ )
else
render_json_error(topic)
end
@@ -353,8 +352,8 @@ class TopicsController < ApplicationController
topic = Topic.find(params[:topic_id].to_i)
PostAction.joins(:post)
- .where(user_id: current_user.id)
- .where('topic_id = ?', topic.id).each do |pa|
+ .where(user_id: current_user.id)
+ .where('topic_id = ?', topic.id).each do |pa|
PostAction.remove_act(current_user, pa.post, PostActionType.types[:bookmark])
end
@@ -378,7 +377,7 @@ class TopicsController < ApplicationController
group_ids = current_user.groups.pluck(:id)
if group_ids.present?
allowed_groups = topic.allowed_groups
- .where('topic_allowed_groups.group_id IN (?)', group_ids).pluck(:id)
+ .where('topic_allowed_groups.group_id IN (?)', group_ids).pluck(:id)
allowed_groups.each do |id|
if archive
GroupArchivedMessage.archive!(id, topic.id)
@@ -421,7 +420,7 @@ class TopicsController < ApplicationController
guardian.ensure_can_delete!(topic)
first_post = topic.ordered_posts.first
- PostDestroyer.new(current_user, first_post, { context: params[:context] }).destroy
+ PostDestroyer.new(current_user, first_post, context: params[:context]).destroy
render nothing: true
end
@@ -484,7 +483,6 @@ class TopicsController < ApplicationController
topic = Topic.find_by(id: params[:topic_id])
-
groups = Group.lookup_groups(
group_ids: params[:group_ids],
group_names: params[:group_names]
@@ -505,7 +503,7 @@ class TopicsController < ApplicationController
render json: failed_json, status: 422
end
rescue Topic::UserExists => e
- render json: {errors: [e.message]}, status: 422
+ render json: { errors: [e.message] }, status: 422
end
end
@@ -547,10 +545,10 @@ class TopicsController < ApplicationController
guardian.ensure_can_change_post_owner!
begin
- PostOwnerChanger.new( post_ids: params[:post_ids].to_a,
- topic_id: params[:topic_id].to_i,
- new_owner: User.find_by(username: params[:username]),
- acting_user: current_user ).change_owner!
+ PostOwnerChanger.new(post_ids: params[:post_ids].to_a,
+ topic_id: params[:topic_id].to_i,
+ new_owner: User.find_by(username: params[:username]),
+ acting_user: current_user).change_owner!
render json: success_json
rescue ArgumentError
render json: failed_json, status: 422
@@ -594,8 +592,8 @@ class TopicsController < ApplicationController
current_user,
params[:topic_id].to_i,
params[:topic_time].to_i,
- (params[:timings] || []).map{|post_number, t| [post_number.to_i, t.to_i]},
- {mobile: view_context.mobile_view?}
+ (params[:timings] || []).map { |post_number, t| [post_number.to_i, t.to_i] },
+ mobile: view_context.mobile_view?
)
render nothing: true
end
@@ -608,7 +606,7 @@ class TopicsController < ApplicationController
def bulk
if params[:topic_ids].present?
- topic_ids = params[:topic_ids].map {|t| t.to_i}
+ topic_ids = params[:topic_ids].map { |t| t.to_i }
elsif params[:filter] == 'unread'
tq = TopicQuery.new(current_user)
topics = TopicQuery.unread_filter(tq.joined_topic_user, current_user.id, staff: guardian.is_staff?).listable_topics
@@ -664,7 +662,7 @@ class TopicsController < ApplicationController
params[:slug] && @topic_view.topic.slug != params[:slug]
end
- def redirect_to_correct_topic(topic, post_number=nil)
+ def redirect_to_correct_topic(topic, post_number = nil)
url = topic.relative_url
url << "/#{post_number}" if post_number.to_i > 0
url << ".json" if request.format.json?
@@ -728,9 +726,9 @@ class TopicsController < ApplicationController
def render_topic_changes(dest_topic)
if dest_topic.present?
- render json: {success: true, url: dest_topic.relative_url}
+ render json: { success: true, url: dest_topic.relative_url }
else
- render json: {success: false}
+ render json: { success: false }
end
end
diff --git a/app/controllers/user_api_keys_controller.rb b/app/controllers/user_api_keys_controller.rb
index 8d11d46c1e7..6fff6655c82 100644
--- a/app/controllers/user_api_keys_controller.rb
+++ b/app/controllers/user_api_keys_controller.rb
@@ -40,7 +40,7 @@ class UserApiKeysController < ApplicationController
@client_id = params[:client_id]
@auth_redirect = params[:auth_redirect]
@push_url = params[:push_url]
- @localized_scopes = params[:scopes].split(",").map{|s| I18n.t("user_api_key.scopes.#{s}")}
+ @localized_scopes = params[:scopes].split(",").map { |s| I18n.t("user_api_key.scopes.#{s}") }
@scopes = params[:scopes]
rescue Discourse::InvalidAccess
@@ -52,10 +52,10 @@ class UserApiKeysController < ApplicationController
require_params
unless SiteSetting.allowed_user_api_auth_redirects
- .split('|')
- .any?{|u| params[:auth_redirect] == u}
+ .split('|')
+ .any? { |u| params[:auth_redirect] == u }
- raise Discourse::InvalidAccess
+ raise Discourse::InvalidAccess
end
raise Discourse::InvalidAccess unless meets_tl?
@@ -126,7 +126,7 @@ class UserApiKeysController < ApplicationController
:client_id,
:auth_redirect,
:application_name
- ].each{|p| params.require(p)}
+ ].each { |p| params.require(p) }
end
def validate_params
diff --git a/app/controllers/user_avatars_controller.rb b/app/controllers/user_avatars_controller.rb
index 30a3709c60a..119266fd357 100644
--- a/app/controllers/user_avatars_controller.rb
+++ b/app/controllers/user_avatars_controller.rb
@@ -89,7 +89,7 @@ class UserAvatarsController < ApplicationController
return render_blank if size < 8 || size > 1000
if !Discourse.avatar_sizes.include?(size) && Discourse.store.external?
- closest = Discourse.avatar_sizes.to_a.min { |a,b| (size-a).abs <=> (size-b).abs }
+ closest = Discourse.avatar_sizes.to_a.min { |a, b| (size - a).abs <=> (size - b).abs }
avatar_url = UserAvatar.local_avatar_url(hostname, user.username_lower, upload_id, closest)
return redirect_to cdn_path(avatar_url)
end
diff --git a/app/controllers/user_badges_controller.rb b/app/controllers/user_badges_controller.rb
index 7c9cfb0bee7..d8f44a41ea2 100644
--- a/app/controllers/user_badges_controller.rb
+++ b/app/controllers/user_badges_controller.rb
@@ -33,12 +33,12 @@ class UserBadgesController < ApplicationController
if params[:grouped]
user_badges = user_badges.group(:badge_id)
- .select(UserBadge.attribute_names.map {|x| "MAX(#{x}) AS #{x}" }, 'COUNT(*) AS "count"')
+ .select(UserBadge.attribute_names.map { |x| "MAX(#{x}) AS #{x}" }, 'COUNT(*) AS "count"')
end
user_badges = user_badges.includes(badge: [:badge_grouping, :badge_type])
- .includes(post: :topic)
- .includes(:granted_by)
+ .includes(post: :topic)
+ .includes(:granted_by)
render_serialized(user_badges, DetailedUserBadgeSerializer, root: :user_badges)
end
@@ -104,6 +104,6 @@ class UserBadgesController < ApplicationController
def can_assign_badge_to_user?(user)
master_api_call = current_user.nil? && is_api?
- master_api_call or guardian.can_grant_badges?(user)
+ master_api_call || guardian.can_grant_badges?(user)
end
end
diff --git a/app/controllers/users/omniauth_callbacks_controller.rb b/app/controllers/users/omniauth_callbacks_controller.rb
index 6b0409e2a49..4908b527bb2 100644
--- a/app/controllers/users/omniauth_callbacks_controller.rb
+++ b/app/controllers/users/omniauth_callbacks_controller.rb
@@ -36,7 +36,7 @@ class Users::OmniauthCallbacksController < ApplicationController
auth[:session] = session
authenticator = self.class.find_authenticator(params[:provider])
- provider = Discourse.auth_providers && Discourse.auth_providers.find{|p| p.name == params[:provider]}
+ provider = Discourse.auth_providers && Discourse.auth_providers.find { |p| p.name == params[:provider] }
@auth_result = authenticator.after_authenticate(auth)
@@ -83,7 +83,6 @@ class Users::OmniauthCallbacksController < ApplicationController
render layout: 'no_ember'
end
-
def self.find_authenticator(name)
BUILTIN_AUTH.each do |authenticator|
if authenticator.name == name
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 69ad6520785..953353916e9 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -50,7 +50,7 @@ class UsersController < ApplicationController
topic_id = params[:include_post_count_for].to_i
if topic_id != 0
- user_serializer.topic_post_count = {topic_id => Post.where(topic_id: topic_id, user_id: @user.id).count }
+ user_serializer.topic_post_count = { topic_id => Post.where(topic_id: topic_id, user_id: @user.id).count }
end
if !params[:skip_track_visit] && (@user != current_user)
@@ -59,7 +59,7 @@ class UsersController < ApplicationController
# This is a hack to get around a Rails issue where values with periods aren't handled correctly
# when used as part of a route.
- if params[:external_id] and params[:external_id].ends_with? '.json'
+ if params[:external_id] && params[:external_id].ends_with?('.json')
return render_json_dump(user_serializer)
end
@@ -224,8 +224,8 @@ class UsersController < ApplicationController
pending_count = Invite.find_pending_invites_count(inviter)
redeemed_count = Invite.find_redeemed_invites_count(inviter)
- render json: {counts: { pending: pending_count, redeemed: redeemed_count,
- total: (pending_count.to_i + redeemed_count.to_i) } }
+ render json: { counts: { pending: pending_count, redeemed: redeemed_count,
+ total: (pending_count.to_i + redeemed_count.to_i) } }
end
def is_local_username
@@ -238,7 +238,7 @@ class UsersController < ApplicationController
Group.mentionable(current_user)
.where(name: usernames)
.pluck(:name, :user_count)
- .map{ |name,user_count| {name: name, user_count: user_count} }
+ .map { |name, user_count| { name: name, user_count: user_count } }
end
usernames -= groups
@@ -250,14 +250,14 @@ class UsersController < ApplicationController
topic_id = params[:topic_id]
unless topic_id.blank?
topic = Topic.find_by(id: topic_id)
- usernames.each{ |username| cannot_see.push(username) unless Guardian.new(User.find_by_username(username)).can_see?(topic) }
+ usernames.each { |username| cannot_see.push(username) unless Guardian.new(User.find_by_username(username)).can_see?(topic) }
end
result = User.where(staged: false)
- .where(username_lower: usernames)
- .pluck(:username_lower)
+ .where(username_lower: usernames)
+ .pluck(:username_lower)
- render json: {valid: result, valid_groups: groups, mentionable_groups: mentionable_groups, cannot_see: cannot_see}
+ render json: { valid: result, valid_groups: groups, mentionable_groups: mentionable_groups, cannot_see: cannot_see }
end
def render_available_true
@@ -265,7 +265,7 @@ class UsersController < ApplicationController
end
def changing_case_of_own_username(target_user, username)
- target_user and username.downcase == target_user.username.downcase
+ target_user && username.downcase == (target_user.username.downcase)
end
# Used for checking availability of a username and will return suggestions
@@ -385,7 +385,7 @@ class UsersController < ApplicationController
end
def get_honeypot_value
- render json: {value: honeypot_value, challenge: challenge_value}
+ render json: { value: honeypot_value, challenge: challenge_value }
end
def password_reset
@@ -433,7 +433,7 @@ class UsersController < ApplicationController
if @error
render layout: 'no_ember'
else
- store_preloaded("password_reset", MultiJson.dump({ is_developer: UsernameCheckerService.is_developer?(@user.email) }))
+ store_preloaded("password_reset", MultiJson.dump(is_developer: UsernameCheckerService.is_developer?(@user.email)))
end
return redirect_to(wizard_path) if request.put? && Wizard.user_requires_completion?(@user)
end
@@ -456,7 +456,7 @@ class UsersController < ApplicationController
}
end
else
- render json: {is_developer: UsernameCheckerService.is_developer?(@user.email)}
+ render json: { is_developer: UsernameCheckerService.is_developer?(@user.email) }
end
end
end
@@ -469,14 +469,15 @@ class UsersController < ApplicationController
end
def logon_after_password_reset
- message = if Guardian.new(@user).can_access_forum?
- # Log in the user
- log_on_user(@user)
- 'password_reset.success'
- else
- @requires_approval = true
- 'password_reset.success_unapproved'
- end
+ message =
+ if Guardian.new(@user).can_access_forum?
+ # Log in the user
+ log_on_user(@user)
+ 'password_reset.success'
+ else
+ @requires_approval = true
+ 'password_reset.success_unapproved'
+ end
@success = I18n.t(message)
end
@@ -606,7 +607,7 @@ class UsersController < ApplicationController
User.transaction do
@user.email = params[:email]
-
+
if @user.save
@user.email_tokens.create(email: @user.email)
enqueue_activation_email
@@ -662,7 +663,6 @@ class UsersController < ApplicationController
@group = Group.find_by(name: params[:group])
end
-
results = UserSearch.new(term,
topic_id: topic_id,
topic_allowed_users: topic_allowed_users,
@@ -683,8 +683,8 @@ class UsersController < ApplicationController
if params[:include_mentionable_groups] == "true" && current_user
to_render[:groups] = Group.mentionable(current_user)
- .where("name ILIKE :term_like", term_like: "#{term}%")
- .map do |m|
+ .where("name ILIKE :term_like", term_like: "#{term}%")
+ .map do |m|
{ name: m.name, full_name: m.full_name }
end
end
@@ -752,7 +752,7 @@ class UsersController < ApplicationController
@user = fetch_user_from_params
guardian.ensure_can_delete_user!(@user)
- UserDestroyer.new(current_user).destroy(@user, { delete_posts: true, context: params[:context] })
+ UserDestroyer.new(current_user).destroy(@user, delete_posts: true, context: params[:context])
render json: success_json
end
@@ -797,14 +797,14 @@ class UsersController < ApplicationController
private
def honeypot_value
- Digest::SHA1::hexdigest("#{Discourse.current_hostname}:#{GlobalSetting.safe_secret_key_base}")[0,15]
+ Digest::SHA1::hexdigest("#{Discourse.current_hostname}:#{GlobalSetting.safe_secret_key_base}")[0, 15]
end
def challenge_value
challenge = $redis.get('SECRET_CHALLENGE')
- unless challenge && challenge.length == 16*2
+ unless challenge && challenge.length == 16 * 2
challenge = SecureRandom.hex(16)
- $redis.set('SECRET_CHALLENGE',challenge)
+ $redis.set('SECRET_CHALLENGE', challenge)
end
challenge
@@ -833,9 +833,9 @@ class UsersController < ApplicationController
def user_params
result = params.permit(:name, :email, :password, :username, :date_of_birth)
- .merge(ip_address: request.remote_ip,
- registration_ip_address: request.remote_ip,
- locale: user_locale)
+ .merge(ip_address: request.remote_ip,
+ registration_ip_address: request.remote_ip,
+ locale: user_locale)
if !UsernameCheckerService.is_developer?(result['email']) &&
is_api? &&
@@ -845,7 +845,6 @@ class UsersController < ApplicationController
result.merge!(params.permit(:active, :staged))
end
-
result
end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 944ab7f8ef2..1d837bbf0b0 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -15,7 +15,7 @@ module ApplicationHelper
include ConfigurableUrls
include GlobalPath
- def google_universal_analytics_json(ua_domain_name=nil)
+ def google_universal_analytics_json(ua_domain_name = nil)
result = {}
if ua_domain_name
result[:cookieDomain] = ua_domain_name.gsub(/^http(s)?:\/\//, '')
@@ -55,7 +55,7 @@ module ApplicationHelper
GlobalSetting.cdn_url.start_with?("https") &&
ENV["COMPRESS_BROTLI"] == "1" &&
request.env["HTTP_ACCEPT_ENCODING"] =~ /br/
- path.gsub!("#{GlobalSetting.cdn_url}/assets/", "#{GlobalSetting.cdn_url}/brotli_asset/")
+ path.gsub!("#{GlobalSetting.cdn_url}/assets/", "#{GlobalSetting.cdn_url}/brotli_asset/")
end
"
".html_safe
@@ -158,7 +158,7 @@ module ApplicationHelper
end
# Creates open graph and twitter card meta data
- def crawlable_meta_data(opts=nil)
+ def crawlable_meta_data(opts = nil)
opts ||= {}
opts[:url] ||= "#{Discourse.base_url_no_prefix}#{request.fullpath}"
@@ -242,7 +242,7 @@ module ApplicationHelper
end
def mobile_view?
- MobileDetection.resolve_mobile_view!(request.user_agent,params,session)
+ MobileDetection.resolve_mobile_view!(request.user_agent, params, session)
end
def crawler_layout?
@@ -283,7 +283,7 @@ module ApplicationHelper
controller.class.name.split("::").first == "Admin"
end
- def category_badge(category, opts=nil)
+ def category_badge(category, opts = nil)
CategoryBadge.html_for(category, opts).html_safe
end
@@ -297,11 +297,11 @@ module ApplicationHelper
return "" if Rails.env.test?
matcher = Regexp.new("/connectors/#{name}/.*\.html\.erb$")
- erbs = ApplicationHelper.all_connectors.select {|c| c =~ matcher }
+ erbs = ApplicationHelper.all_connectors.select { |c| c =~ matcher }
return "" if erbs.blank?
result = ""
- erbs.each {|erb| result << render(file: erb) }
+ erbs.each { |erb| result << render(file: erb) }
result.html_safe
end
@@ -335,7 +335,7 @@ module ApplicationHelper
lookup.html_safe if lookup
end
- def discourse_stylesheet_link_tag(name, opts={})
+ def discourse_stylesheet_link_tag(name, opts = {})
if opts.key?(:theme_key)
key = opts[:theme_key] unless customization_disabled?
else
diff --git a/app/helpers/list_helper.rb b/app/helpers/list_helper.rb
index a7cf7766acb..9839401f9ec 100644
--- a/app/helpers/list_helper.rb
+++ b/app/helpers/list_helper.rb
@@ -6,7 +6,7 @@ module ListHelper
return if total_pages < 2
- page = [total_pages - (max_pages+1), 2].max
+ page = [total_pages - (max_pages + 1), 2].max
result = "("
while page <= total_pages
diff --git a/app/helpers/topics_helper.rb b/app/helpers/topics_helper.rb
index c3f0cb96459..b50b923bb87 100644
--- a/app/helpers/topics_helper.rb
+++ b/app/helpers/topics_helper.rb
@@ -2,7 +2,7 @@ module TopicsHelper
include ApplicationHelper
def render_topic_title(topic)
- link_to(Emoji.gsub_emoji_to_unicode(topic.title),topic.relative_url)
+ link_to(Emoji.gsub_emoji_to_unicode(topic.title), topic.relative_url)
end
def categories_breadcrumb(topic)
diff --git a/app/helpers/user_notifications_helper.rb b/app/helpers/user_notifications_helper.rb
index 044b4eb3128..2e18c702ee3 100644
--- a/app/helpers/user_notifications_helper.rb
+++ b/app/helpers/user_notifications_helper.rb
@@ -1,6 +1,6 @@
module UserNotificationsHelper
- def indent(text, by=2)
+ def indent(text, by = 2)
spacer = " " * by
result = ""
text.each_line do |line|
@@ -48,9 +48,9 @@ module UserNotificationsHelper
doc.css('div').first
end
- def email_excerpt(html_arg, posts_count=nil)
+ def email_excerpt(html_arg, posts_count = nil)
# only include 1st paragraph when more than 1 posts
- html = (posts_count.nil? || posts_count > 1) ? (first_paragraph_from(html_arg)||html_arg).to_s : html_arg
+ html = (posts_count.nil? || posts_count > 1) ? (first_paragraph_from(html_arg) || html_arg).to_s : html_arg
PrettyText.format_for_email(html).html_safe
end
diff --git a/app/jobs/base.rb b/app/jobs/base.rb
index 4445c78aa9d..9ce3b6e0766 100644
--- a/app/jobs/base.rb
+++ b/app/jobs/base.rb
@@ -71,11 +71,11 @@ module Jobs
ctx
end
- def self.delayed_perform(opts={})
+ def self.delayed_perform(opts = {})
self.new.perform(opts)
end
- def execute(opts={})
+ def execute(opts = {})
raise "Overwrite me!"
end
@@ -114,7 +114,6 @@ module Jobs
end
end
-
dbs =
if opts[:current_site_id]
[opts[:current_site_id]]
@@ -203,7 +202,7 @@ module Jobs
end
end
- def self.enqueue(job_name, opts={})
+ def self.enqueue(job_name, opts = {})
klass = "Jobs::#{job_name.to_s.camelcase}".constantize
# Unless we want to work on all sites
@@ -227,20 +226,20 @@ module Jobs
end
- def self.enqueue_in(secs, job_name, opts={})
+ def self.enqueue_in(secs, job_name, opts = {})
enqueue(job_name, opts.merge!(delay_for: secs))
end
- def self.enqueue_at(datetime, job_name, opts={})
+ def self.enqueue_at(datetime, job_name, opts = {})
secs = [(datetime - Time.zone.now).to_i, 0].max
enqueue_in(secs, job_name, opts)
end
- def self.cancel_scheduled_job(job_name, opts={})
+ def self.cancel_scheduled_job(job_name, opts = {})
scheduled_for(job_name, opts).each(&:delete)
end
- def self.scheduled_for(job_name, opts={})
+ def self.scheduled_for(job_name, opts = {})
opts = opts.with_indifferent_access
unless opts.delete(:all_sites)
opts[:current_site_id] ||= RailsMultisite::ConnectionManagement.current_db
@@ -265,6 +264,6 @@ module Jobs
end
end
-Dir["#{Rails.root}/app/jobs/onceoff/*.rb"].each {|file| require_dependency file }
-Dir["#{Rails.root}/app/jobs/regular/*.rb"].each {|file| require_dependency file }
-Dir["#{Rails.root}/app/jobs/scheduled/*.rb"].each {|file| require_dependency file }
+Dir["#{Rails.root}/app/jobs/onceoff/*.rb"].each { |file| require_dependency file }
+Dir["#{Rails.root}/app/jobs/regular/*.rb"].each { |file| require_dependency file }
+Dir["#{Rails.root}/app/jobs/scheduled/*.rb"].each { |file| require_dependency file }
diff --git a/app/jobs/onceoff/grant_emoji.rb b/app/jobs/onceoff/grant_emoji.rb
index 696fd1f9528..39d9ececf8d 100644
--- a/app/jobs/onceoff/grant_emoji.rb
+++ b/app/jobs/onceoff/grant_emoji.rb
@@ -6,11 +6,11 @@ module Jobs
to_award = {}
Post.secured(Guardian.new)
- .select(:id, :created_at, :cooked, :user_id)
- .visible
- .public_posts
- .where("cooked LIKE '%emoji%'")
- .find_in_batches do |group|
+ .select(:id, :created_at, :cooked, :user_id)
+ .visible
+ .public_posts
+ .where("cooked LIKE '%emoji%'")
+ .find_in_batches do |group|
group.each do |p|
doc = Nokogiri::HTML::fragment(p.cooked)
if (doc.css("img.emoji") - doc.css(".quote img")).size > 0
diff --git a/app/jobs/onceoff/grant_first_reply_by_email.rb b/app/jobs/onceoff/grant_first_reply_by_email.rb
index ae769f681c3..ef8bcc6469d 100644
--- a/app/jobs/onceoff/grant_first_reply_by_email.rb
+++ b/app/jobs/onceoff/grant_first_reply_by_email.rb
@@ -7,12 +7,12 @@ module Jobs
to_award = {}
Post.select(:id, :created_at, :user_id)
- .secured(Guardian.new)
- .visible
- .public_posts
- .where(via_email: true)
- .where("post_number > 1")
- .find_in_batches do |group|
+ .secured(Guardian.new)
+ .visible
+ .public_posts
+ .where(via_email: true)
+ .where("post_number > 1")
+ .find_in_batches do |group|
group.each do |p|
to_award[p.user_id] ||= { post_id: p.id, created_at: p.created_at }
end
diff --git a/app/jobs/onceoff/grant_onebox.rb b/app/jobs/onceoff/grant_onebox.rb
index 0c63e6b7b85..259dfe97021 100644
--- a/app/jobs/onceoff/grant_onebox.rb
+++ b/app/jobs/onceoff/grant_onebox.rb
@@ -8,11 +8,11 @@ module Jobs
to_award = {}
Post.secured(Guardian.new)
- .select(:id, :created_at, :raw, :user_id)
- .visible
- .public_posts
- .where("raw LIKE '%http%'")
- .find_in_batches do |group|
+ .select(:id, :created_at, :raw, :user_id)
+ .visible
+ .public_posts
+ .where("raw LIKE '%http%'")
+ .find_in_batches do |group|
group.each do |p|
begin
# Note we can't use `p.cooked` here because oneboxes have been cooked out
diff --git a/app/jobs/onceoff/migrate_tagging_plugin.rb b/app/jobs/onceoff/migrate_tagging_plugin.rb
index f0bb91e7e49..9d94b8e88f4 100644
--- a/app/jobs/onceoff/migrate_tagging_plugin.rb
+++ b/app/jobs/onceoff/migrate_tagging_plugin.rb
@@ -4,7 +4,7 @@ module Jobs
def execute_onceoff(args)
all_tags = TopicCustomField.where(name: "tags").select('DISTINCT value').all.map(&:value)
- tag_id_lookup = Tag.create(all_tags.map { |tag_name| {name: tag_name} }).inject({}) { |h,v| h[v.name] = v.id; h }
+ tag_id_lookup = Tag.create(all_tags.map { |tag_name| { name: tag_name } }).inject({}) { |h, v| h[v.name] = v.id; h }
TopicCustomField.where(name: "tags").find_each do |tcf|
TopicTag.create(topic_id: tcf.topic_id, tag_id: tag_id_lookup[tcf.value] || Tag.find_by_name(tcf.value).try(:id))
diff --git a/app/jobs/onceoff/retro_grant_anniversary.rb b/app/jobs/onceoff/retro_grant_anniversary.rb
index 2b338e6dcdc..9cbdddd8109 100644
--- a/app/jobs/onceoff/retro_grant_anniversary.rb
+++ b/app/jobs/onceoff/retro_grant_anniversary.rb
@@ -14,4 +14,3 @@ module Jobs
end
end
-
diff --git a/app/jobs/regular/automatic_group_membership.rb b/app/jobs/regular/automatic_group_membership.rb
index b2f12d15022..4e688d84000 100644
--- a/app/jobs/regular/automatic_group_membership.rb
+++ b/app/jobs/regular/automatic_group_membership.rb
@@ -14,11 +14,11 @@ module Jobs
domains = group.automatic_membership_email_domains.gsub('.', '\.')
User.joins(:user_emails)
- .where("user_emails.email ~* '@(#{domains})$'")
- .where("users.id NOT IN (SELECT user_id FROM group_users WHERE group_users.group_id = ?)", group_id)
- .activated
- .where(staged: false)
- .find_each do |user|
+ .where("user_emails.email ~* '@(#{domains})$'")
+ .where("users.id NOT IN (SELECT user_id FROM group_users WHERE group_users.group_id = ?)", group_id)
+ .activated
+ .where(staged: false)
+ .find_each do |user|
next unless user.email_confirmed?
group.add(user)
GroupActionLogger.new(Discourse.system_user, group).log_add_user_to_group(user)
diff --git a/app/jobs/regular/delete_topic.rb b/app/jobs/regular/delete_topic.rb
index e50cd9c2dae..bfb23f568cf 100644
--- a/app/jobs/regular/delete_topic.rb
+++ b/app/jobs/regular/delete_topic.rb
@@ -12,7 +12,7 @@ module Jobs
if Guardian.new(topic_timer.user).can_delete?(topic)
first_post = topic.ordered_posts.first
- PostDestroyer.new(topic_timer.user, first_post, { context: I18n.t("topic_statuses.auto_deleted_by_timer") }).destroy
+ PostDestroyer.new(topic_timer.user, first_post, context: I18n.t("topic_statuses.auto_deleted_by_timer")).destroy
topic_timer.trash!(Discourse.system_user)
end
end
diff --git a/app/jobs/regular/emit_web_hook_event.rb b/app/jobs/regular/emit_web_hook_event.rb
index 46ce3f43bd1..341702904a8 100644
--- a/app/jobs/regular/emit_web_hook_event.rb
+++ b/app/jobs/regular/emit_web_hook_event.rb
@@ -83,12 +83,13 @@ module Jobs
web_hook_event = WebHookEvent.create!(web_hook_id: web_hook.id)
begin
- content_type = case web_hook.content_type
- when WebHook.content_types['application/x-www-form-urlencoded']
- 'application/x-www-form-urlencoded'
- else
- 'application/json'
- end
+ content_type =
+ case web_hook.content_type
+ when WebHook.content_types['application/x-www-form-urlencoded']
+ 'application/x-www-form-urlencoded'
+ else
+ 'application/json'
+ end
headers = {
'Accept' => '*/*',
diff --git a/app/jobs/regular/export_csv_file.rb b/app/jobs/regular/export_csv_file.rb
index 336c0bfdcc6..69eeec72d49 100644
--- a/app/jobs/regular/export_csv_file.rb
+++ b/app/jobs/regular/export_csv_file.rb
@@ -8,18 +8,18 @@ module Jobs
sidekiq_options retry: false
- HEADER_ATTRS_FOR ||= HashWithIndifferentAccess.new({
- user_archive: ['topic_title','category','sub_category','is_pm','post','like_count','reply_count','url','created_at'],
- user_list: ['id','name','username','email','title','created_at','last_seen_at','last_posted_at','last_emailed_at','trust_level','approved','suspended_at','suspended_till','blocked','active','admin','moderator','ip_address'],
- user_stats: ['topics_entered','posts_read_count','time_read','topic_count','post_count','likes_given','likes_received'],
- user_profile: ['location','website','views'],
- user_sso: ['external_id','external_email', 'external_username', 'external_name', 'external_avatar_url'],
- staff_action: ['staff_user','action','subject','created_at','details', 'context'],
- screened_email: ['email','action','match_count','last_match_at','created_at','ip_address'],
- screened_ip: ['ip_address','action','match_count','last_match_at','created_at'],
- screened_url: ['domain','action','match_count','last_match_at','created_at'],
- report: ['date', 'value'],
- })
+ HEADER_ATTRS_FOR ||= HashWithIndifferentAccess.new(
+ user_archive: ['topic_title', 'category', 'sub_category', 'is_pm', 'post', 'like_count', 'reply_count', 'url', 'created_at'],
+ user_list: ['id', 'name', 'username', 'email', 'title', 'created_at', 'last_seen_at', 'last_posted_at', 'last_emailed_at', 'trust_level', 'approved', 'suspended_at', 'suspended_till', 'blocked', 'active', 'admin', 'moderator', 'ip_address'],
+ user_stats: ['topics_entered', 'posts_read_count', 'time_read', 'topic_count', 'post_count', 'likes_given', 'likes_received'],
+ user_profile: ['location', 'website', 'views'],
+ user_sso: ['external_id', 'external_email', 'external_username', 'external_name', 'external_avatar_url'],
+ staff_action: ['staff_user', 'action', 'subject', 'created_at', 'details', 'context'],
+ screened_email: ['email', 'action', 'match_count', 'last_match_at', 'created_at', 'ip_address'],
+ screened_ip: ['ip_address', 'action', 'match_count', 'last_match_at', 'created_at'],
+ screened_url: ['domain', 'action', 'match_count', 'last_match_at', 'created_at'],
+ report: ['date', 'value']
+ )
def execute(args)
@entity = args[:entity]
@@ -58,11 +58,11 @@ module Jobs
return enum_for(:user_archive_export) unless block_given?
Post.includes(topic: :category)
- .where(user_id: @current_user.id)
- .select(:topic_id, :post_number, :raw, :like_count, :reply_count, :created_at)
- .order(:created_at)
- .with_deleted
- .each do |user_archive|
+ .where(user_id: @current_user.id)
+ .select(:topic_id, :post_number, :raw, :like_count, :reply_count, :created_at)
+ .order(:created_at)
+ .with_deleted
+ .each do |user_archive|
yield get_user_archive_fields(user_archive)
end
end
@@ -132,9 +132,9 @@ module Jobs
return enum_for(:screened_url_export) unless block_given?
ScreenedUrl.select("domain, sum(match_count) as match_count, max(last_match_at) as last_match_at, min(created_at) as created_at")
- .group(:domain)
- .order('last_match_at DESC')
- .each do |screened_url|
+ .group(:domain)
+ .order('last_match_at DESC')
+ .each do |screened_url|
yield get_screened_url_fields(screened_url)
end
end
@@ -181,14 +181,14 @@ module Jobs
def get_base_user_array(user)
user_array = []
- user_array.push(user.id,escape_comma(user.name),user.username,user.email,escape_comma(user.title),user.created_at,user.last_seen_at,user.last_posted_at,user.last_emailed_at,user.trust_level,user.approved,user.suspended_at,user.suspended_till,user.blocked,user.active,user.admin,user.moderator,user.ip_address,user.user_stat.topics_entered,user.user_stat.posts_read_count,user.user_stat.time_read,user.user_stat.topic_count,user.user_stat.post_count,user.user_stat.likes_given,user.user_stat.likes_received,escape_comma(user.user_profile.location),user.user_profile.website,user.user_profile.views)
+ user_array.push(user.id, escape_comma(user.name), user.username, user.email, escape_comma(user.title), user.created_at, user.last_seen_at, user.last_posted_at, user.last_emailed_at, user.trust_level, user.approved, user.suspended_at, user.suspended_till, user.blocked, user.active, user.admin, user.moderator, user.ip_address, user.user_stat.topics_entered, user.user_stat.posts_read_count, user.user_stat.time_read, user.user_stat.topic_count, user.user_stat.post_count, user.user_stat.likes_given, user.user_stat.likes_received, escape_comma(user.user_profile.location), user.user_profile.website, user.user_profile.views)
end
def add_single_sign_on(user, user_info_array)
if user.single_sign_on_record
- user_info_array.push(user.single_sign_on_record.external_id,user.single_sign_on_record.external_email,user.single_sign_on_record.external_username,escape_comma(user.single_sign_on_record.external_name),user.single_sign_on_record.external_avatar_url)
+ user_info_array.push(user.single_sign_on_record.external_id, user.single_sign_on_record.external_email, user.single_sign_on_record.external_username, escape_comma(user.single_sign_on_record.external_name), user.single_sign_on_record.external_avatar_url)
else
- user_info_array.push(nil,nil,nil,nil,nil)
+ user_info_array.push(nil, nil, nil, nil, nil)
end
user_info_array
end
@@ -233,7 +233,7 @@ module Jobs
is_pm = topic_data.archetype == "private_message" ? I18n.t("csv_export.boolean_yes") : I18n.t("csv_export.boolean_no")
url = "#{Discourse.base_url}/t/#{topic_data.slug}/#{topic_data.id}/#{user_archive['post_number']}"
- topic_hash = {"post" => user_archive['raw'], "topic_title" => topic_data.title, "category" => category_name, "sub_category" => sub_category, "is_pm" => is_pm, "url" => url}
+ topic_hash = { "post" => user_archive['raw'], "topic_title" => topic_data.title, "category" => category_name, "sub_category" => sub_category, "is_pm" => is_pm, "url" => url }
user_archive.merge!(topic_hash)
HEADER_ATTRS_FOR['user_archive'].each do |attr|
diff --git a/app/jobs/regular/notify_mailing_list_subscribers.rb b/app/jobs/regular/notify_mailing_list_subscribers.rb
index 41773141824..6b8647a36bc 100644
--- a/app/jobs/regular/notify_mailing_list_subscribers.rb
+++ b/app/jobs/regular/notify_mailing_list_subscribers.rb
@@ -14,19 +14,19 @@ module Jobs
users =
User.activated.not_blocked.not_suspended.real
- .joins(:user_option)
- .where('user_options.mailing_list_mode AND user_options.mailing_list_mode_frequency > 0')
- .where('NOT EXISTS (
+ .joins(:user_option)
+ .where('user_options.mailing_list_mode AND user_options.mailing_list_mode_frequency > 0')
+ .where('NOT EXISTS (
SELECT 1
FROM muted_users mu
WHERE mu.muted_user_id = ? AND mu.user_id = users.id
)', post.user_id)
- .where('NOT EXISTS (
+ .where('NOT EXISTS (
SELECT 1
FROM topic_users tu
WHERE tu.topic_id = ? AND tu.user_id = users.id AND tu.notification_level = ?
)', post.topic_id, TopicUser.notification_levels[:muted])
- .where('NOT EXISTS (
+ .where('NOT EXISTS (
SELECT 1
FROM category_users cu
WHERE cu.category_id = ? AND cu.user_id = users.id AND cu.notification_level = ?
@@ -57,7 +57,7 @@ module Jobs
end
end
rescue => e
- Discourse.handle_job_exception(e, error_context(args, "Sending post to mailing list subscribers", { user_id: user.id, user_email: user.email }))
+ Discourse.handle_job_exception(e, error_context(args, "Sending post to mailing list subscribers", user_id: user.id, user_email: user.email))
end
end
end
diff --git a/app/jobs/regular/notify_moved_posts.rb b/app/jobs/regular/notify_moved_posts.rb
index da1300e86c1..9916bab8e77 100644
--- a/app/jobs/regular/notify_moved_posts.rb
+++ b/app/jobs/regular/notify_moved_posts.rb
@@ -17,8 +17,8 @@ module Jobs
p.user.notifications.create(notification_type: Notification.types[:moved_post],
topic_id: p.topic_id,
post_number: p.post_number,
- data: {topic_title: p.topic.title,
- display_username: moved_by.username}.to_json)
+ data: { topic_title: p.topic.title,
+ display_username: moved_by.username }.to_json)
users_notified << p.user_id
end
end
diff --git a/app/jobs/regular/push_notification.rb b/app/jobs/regular/push_notification.rb
index e07e5d59208..965acb963b3 100644
--- a/app/jobs/regular/push_notification.rb
+++ b/app/jobs/regular/push_notification.rb
@@ -13,11 +13,9 @@ module Jobs
}
clients = args["clients"]
- clients.group_by{|r| r[1]}.each do |push_url, group|
+ clients.group_by { |r| r[1] }.each do |push_url, group|
notifications = group.map do |client_id, _|
- notification.merge({
- client_id: client_id
- })
+ notification.merge(client_id: client_id)
end
result = Excon.post(push_url,
diff --git a/app/jobs/regular/retrieve_topic.rb b/app/jobs/regular/retrieve_topic.rb
index 2820f05e310..9d5d4e248cf 100644
--- a/app/jobs/regular/retrieve_topic.rb
+++ b/app/jobs/regular/retrieve_topic.rb
@@ -19,5 +19,3 @@ module Jobs
end
end
-
-
diff --git a/app/jobs/regular/user_email.rb b/app/jobs/regular/user_email.rb
index f9def1f4510..f28019b74c6 100644
--- a/app/jobs/regular/user_email.rb
+++ b/app/jobs/regular/user_email.rb
@@ -56,7 +56,7 @@ module Jobs
quoted
}
- def message_for_email(user, post, type, notification, notification_type=nil, notification_data_hash=nil, email_token=nil, to_address=nil)
+ def message_for_email(user, post, type, notification, notification_type = nil, notification_data_hash = nil, email_token = nil, to_address = nil)
set_skip_context(type, user.id, to_address || user.email, post.try(:id))
return skip_message(I18n.t("email_log.anonymous_user")) if user.anonymous?
@@ -90,8 +90,8 @@ module Jobs
user.user_option.mailing_list_mode_frequency > 0 && # don't catch notifications for users on daily mailing list mode
(!post.try(:topic).try(:private_message?)) &&
NOTIFICATIONS_SENT_BY_MAILING_LIST.include?(email_args[:notification_type])
- # no need to log a reason when the mail was already sent via the mailing list job
- return [nil, nil]
+ # no need to log a reason when the mail was already sent via the mailing list job
+ return [nil, nil]
end
unless user.user_option.email_always?
@@ -141,7 +141,7 @@ module Jobs
# extracted from sidekiq
def self.seconds_to_delay(count)
- (count ** 4) + 15 + (rand(30) * (count + 1))
+ (count**4) + 15 + (rand(30) * (count + 1))
end
private
diff --git a/app/jobs/scheduled/badge_grant.rb b/app/jobs/scheduled/badge_grant.rb
index dc5def06840..a9d9b915a78 100644
--- a/app/jobs/scheduled/badge_grant.rb
+++ b/app/jobs/scheduled/badge_grant.rb
@@ -15,7 +15,7 @@ module Jobs
BadgeGranter.backfill(b)
rescue => ex
# TODO - expose errors in UI
- Discourse.handle_job_exception(ex, error_context({}, code_desc: 'Exception granting badges', extra: {badge_id: b.id}))
+ Discourse.handle_job_exception(ex, error_context({}, code_desc: 'Exception granting badges', extra: { badge_id: b.id }))
end
end
diff --git a/app/jobs/scheduled/clean_up_email_logs.rb b/app/jobs/scheduled/clean_up_email_logs.rb
index 30305c4d9ac..48421c1cfa2 100644
--- a/app/jobs/scheduled/clean_up_email_logs.rb
+++ b/app/jobs/scheduled/clean_up_email_logs.rb
@@ -9,8 +9,8 @@ module Jobs
threshold = SiteSetting.delete_email_logs_after_days.days.ago
EmailLog.where(reply_key: nil)
- .where("created_at < ?", threshold)
- .delete_all
+ .where("created_at < ?", threshold)
+ .delete_all
end
end
diff --git a/app/jobs/scheduled/clean_up_unmatched_emails.rb b/app/jobs/scheduled/clean_up_unmatched_emails.rb
index 6ce62f3f235..4fff997ef81 100644
--- a/app/jobs/scheduled/clean_up_unmatched_emails.rb
+++ b/app/jobs/scheduled/clean_up_unmatched_emails.rb
@@ -7,8 +7,8 @@ module Jobs
last_match_threshold = SiteSetting.max_age_unmatched_emails.days.ago
ScreenedEmail.where(action_type: ScreenedEmail.actions[:block])
- .where("last_match_at < ?", last_match_threshold)
- .destroy_all
+ .where("last_match_at < ?", last_match_threshold)
+ .destroy_all
end
end
diff --git a/app/jobs/scheduled/clean_up_unmatched_ips.rb b/app/jobs/scheduled/clean_up_unmatched_ips.rb
index abd3cdc4421..a9b4e4d5d33 100644
--- a/app/jobs/scheduled/clean_up_unmatched_ips.rb
+++ b/app/jobs/scheduled/clean_up_unmatched_ips.rb
@@ -11,8 +11,8 @@ module Jobs
# remove old unmatched IP addresses
ScreenedIpAddress.where(action_type: ScreenedIpAddress.actions[:block])
- .where("last_match_at < ? OR (last_match_at IS NULL AND created_at < ?)", last_match_threshold, last_match_threshold)
- .destroy_all
+ .where("last_match_at < ? OR (last_match_at IS NULL AND created_at < ?)", last_match_threshold, last_match_threshold)
+ .destroy_all
end
end
diff --git a/app/jobs/scheduled/clean_up_unsubscribe_keys.rb b/app/jobs/scheduled/clean_up_unsubscribe_keys.rb
index 05358666712..606a13390ba 100644
--- a/app/jobs/scheduled/clean_up_unsubscribe_keys.rb
+++ b/app/jobs/scheduled/clean_up_unsubscribe_keys.rb
@@ -10,4 +10,3 @@ module Jobs
end
end
-
diff --git a/app/jobs/scheduled/create_missing_avatars.rb b/app/jobs/scheduled/create_missing_avatars.rb
index 2d4befe245f..d973e9a0be0 100644
--- a/app/jobs/scheduled/create_missing_avatars.rb
+++ b/app/jobs/scheduled/create_missing_avatars.rb
@@ -5,11 +5,11 @@ module Jobs
def execute(args)
# backfill in batches of 5000 an hour
UserAvatar.includes(:user)
- .joins(:user)
- .where(last_gravatar_download_attempt: nil)
- .order("users.last_posted_at DESC")
- .limit(5000)
- .each do |u|
+ .joins(:user)
+ .where(last_gravatar_download_attempt: nil)
+ .order("users.last_posted_at DESC")
+ .limit(5000)
+ .each do |u|
u.user.refresh_avatar
end
end
diff --git a/app/jobs/scheduled/dashboard_stats.rb b/app/jobs/scheduled/dashboard_stats.rb
index 2b35fc43809..75977e7acbd 100644
--- a/app/jobs/scheduled/dashboard_stats.rb
+++ b/app/jobs/scheduled/dashboard_stats.rb
@@ -7,7 +7,7 @@ module Jobs
if problems_started_at && problems_started_at < 2.days.ago
# If there have been problems reported on the dashboard for a while,
# send a message to admins no more often than once per week.
- GroupMessage.create(Group[:admins].name, :dashboard_problems, {limit_once_per: 7.days.to_i})
+ GroupMessage.create(Group[:admins].name, :dashboard_problems, limit_once_per: 7.days.to_i)
end
AdminDashboardData.refresh_stats
diff --git a/app/jobs/scheduled/directory_refresh_older.rb b/app/jobs/scheduled/directory_refresh_older.rb
index 3c25c8151fc..93147d6c88a 100644
--- a/app/jobs/scheduled/directory_refresh_older.rb
+++ b/app/jobs/scheduled/directory_refresh_older.rb
@@ -4,7 +4,7 @@ module Jobs
def execute(args)
periods = DirectoryItem.period_types.keys - [:daily]
- periods.each {|p| DirectoryItem.refresh_period!(p)}
+ periods.each { |p| DirectoryItem.refresh_period!(p) }
end
end
end
diff --git a/app/jobs/scheduled/enqueue_digest_emails.rb b/app/jobs/scheduled/enqueue_digest_emails.rb
index 1bd4ed4fdfb..23db70d4e52 100644
--- a/app/jobs/scheduled/enqueue_digest_emails.rb
+++ b/app/jobs/scheduled/enqueue_digest_emails.rb
@@ -14,15 +14,15 @@ module Jobs
def target_user_ids
# Users who want to receive digest email within their chosen digest email frequency
query = User.real
- .not_suspended
- .activated
- .where(staged: false)
- .joins(:user_option, :user_stat)
- .where("user_options.email_digests")
- .where("user_stats.bounce_score < #{SiteSetting.bounce_score_threshold}")
- .where("COALESCE(last_emailed_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 MINUTE'::INTERVAL * user_options.digest_after_minutes)")
- .where("COALESCE(last_seen_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 MINUTE'::INTERVAL * user_options.digest_after_minutes)")
- .where("COALESCE(last_seen_at, '2010-01-01') >= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * #{SiteSetting.suppress_digest_email_after_days})")
+ .not_suspended
+ .activated
+ .where(staged: false)
+ .joins(:user_option, :user_stat)
+ .where("user_options.email_digests")
+ .where("user_stats.bounce_score < #{SiteSetting.bounce_score_threshold}")
+ .where("COALESCE(last_emailed_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 MINUTE'::INTERVAL * user_options.digest_after_minutes)")
+ .where("COALESCE(last_seen_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 MINUTE'::INTERVAL * user_options.digest_after_minutes)")
+ .where("COALESCE(last_seen_at, '2010-01-01') >= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * #{SiteSetting.suppress_digest_email_after_days})")
# If the site requires approval, make sure the user is approved
query = query.where("approved OR moderator OR admin") if SiteSetting.must_approve_users?
diff --git a/app/jobs/scheduled/grant_new_user_of_the_month_badges.rb b/app/jobs/scheduled/grant_new_user_of_the_month_badges.rb
index c2190d16056..83e5b5cc728 100644
--- a/app/jobs/scheduled/grant_new_user_of_the_month_badges.rb
+++ b/app/jobs/scheduled/grant_new_user_of_the_month_badges.rb
@@ -8,7 +8,7 @@ module Jobs
def execute(args)
badge = Badge.find(Badge::NewUserOfTheMonth)
- return unless SiteSetting.enable_badges? and badge.enabled?
+ return unless SiteSetting.enable_badges? && badge.enabled?
# Don't award it if a month hasn't gone by
return if UserBadge.where("badge_id = ? AND granted_at >= ?",
@@ -22,9 +22,7 @@ module Jobs
user = User.find(user_id)
if user.badges.where(id: Badge::NewUserOfTheMonth).blank?
BadgeGranter.grant(badge, user)
- SystemMessage.new(user).create('new_user_of_the_month', {
- month_year: Time.now.strftime("%B %Y")
- })
+ SystemMessage.new(user).create('new_user_of_the_month', month_year: Time.now.strftime("%B %Y"))
end
end
end
@@ -75,10 +73,8 @@ module Jobs
LIMIT :max_awarded
SQL
- User.exec_sql(sql, {
- like: PostActionType.types[:like],
- max_awarded: MAX_AWARDED
- }).each do |row|
+ User.exec_sql(sql, like: PostActionType.types[:like],
+ max_awarded: MAX_AWARDED).each do |row|
scores[row['id'].to_i] = row['score'].to_f
end
scores
diff --git a/app/jobs/scheduled/migrate_upload_scheme.rb b/app/jobs/scheduled/migrate_upload_scheme.rb
index a5e21f3e0d4..6be51da6995 100644
--- a/app/jobs/scheduled/migrate_upload_scheme.rb
+++ b/app/jobs/scheduled/migrate_upload_scheme.rb
@@ -9,8 +9,8 @@ module Jobs
# clean up failed uploads
Upload.where("created_at < ?", 1.hour.ago)
- .where("LENGTH(COALESCE(url, '')) = 0")
- .destroy_all
+ .where("LENGTH(COALESCE(url, '')) = 0")
+ .destroy_all
# migrate uploads to new scheme
problems = Upload.migrate_to_new_scheme(50)
diff --git a/app/jobs/scheduled/pending_flags_reminder.rb b/app/jobs/scheduled/pending_flags_reminder.rb
index 2a33c517852..128a52187c6 100644
--- a/app/jobs/scheduled/pending_flags_reminder.rb
+++ b/app/jobs/scheduled/pending_flags_reminder.rb
@@ -25,8 +25,8 @@ module Jobs
target_group_names: Group[:moderators].name,
archetype: Archetype.private_message,
subtype: TopicSubtype.system_message,
- title: I18n.t('flags_reminder.subject_template', { count: flagged_posts_count }),
- raw: mentions + I18n.t('flags_reminder.flags_were_submitted', { count: SiteSetting.notify_about_flags_after })
+ title: I18n.t('flags_reminder.subject_template', count: flagged_posts_count),
+ raw: mentions + I18n.t('flags_reminder.flags_were_submitted', count: SiteSetting.notify_about_flags_after)
)
self.last_notified_id = flag_ids.max
@@ -54,10 +54,10 @@ module Jobs
def active_moderator_usernames
User.where(moderator: true)
- .human_users
- .order('last_seen_at DESC')
- .limit(3)
- .pluck(:username)
+ .human_users
+ .order('last_seen_at DESC')
+ .limit(3)
+ .pluck(:username)
end
end
diff --git a/app/jobs/scheduled/pending_users_reminder.rb b/app/jobs/scheduled/pending_users_reminder.rb
index c2e392d65a4..5c682bb4e35 100644
--- a/app/jobs/scheduled/pending_users_reminder.rb
+++ b/app/jobs/scheduled/pending_users_reminder.rb
@@ -7,7 +7,7 @@ module Jobs
def execute(args)
if SiteSetting.must_approve_users && SiteSetting.pending_users_reminder_delay >= 0
- query = AdminUserIndexQuery.new({query: 'pending', stats: false}).find_users_query # default order is: users.created_at DESC
+ query = AdminUserIndexQuery.new(query: 'pending', stats: false).find_users_query # default order is: users.created_at DESC
if SiteSetting.pending_users_reminder_delay > 0
query = query.where('users.created_at < ?', SiteSetting.pending_users_reminder_delay.hours.ago)
end
@@ -21,10 +21,10 @@ module Jobs
if count > 0
target_usernames = Group[:moderators].users.map do |u|
u.id > 0 && u.notifications.joins(:topic)
- .where("notifications.id > ?", u.seen_notification_id)
- .where("notifications.read = false")
- .where("topics.subtype = '#{TopicSubtype.pending_users_reminder}'")
- .count == 0 ? u.username : nil
+ .where("notifications.id > ?", u.seen_notification_id)
+ .where("notifications.read = false")
+ .where("topics.subtype = '#{TopicSubtype.pending_users_reminder}'")
+ .count == 0 ? u.username : nil
end.compact
unless target_usernames.empty?
@@ -33,8 +33,8 @@ module Jobs
target_usernames: target_usernames,
archetype: Archetype.private_message,
subtype: TopicSubtype.pending_users_reminder,
- title: I18n.t("system_messages.pending_users_reminder.subject_template", {count: count}),
- raw: I18n.t("system_messages.pending_users_reminder.text_body_template", {count: count, base_url: Discourse.base_url})
+ title: I18n.t("system_messages.pending_users_reminder.subject_template", count: count),
+ raw: I18n.t("system_messages.pending_users_reminder.text_body_template", count: count, base_url: Discourse.base_url)
)
self.previous_newest_username = newest_username
diff --git a/app/jobs/scheduled/periodical_updates.rb b/app/jobs/scheduled/periodical_updates.rb
index 98751dffc38..a1223434825 100644
--- a/app/jobs/scheduled/periodical_updates.rb
+++ b/app/jobs/scheduled/periodical_updates.rb
@@ -20,7 +20,7 @@ module Jobs
CategoryFeaturedTopic.feature_topics
# Update the scores of posts
- args = {min_topic_age: 1.day.ago}
+ args = { min_topic_age: 1.day.ago }
args[:max_topic_length] = 500 unless self.class.should_update_long_topics?
ScoreCalculator.new.calculate(args)
diff --git a/app/jobs/scheduled/purge_inactive.rb b/app/jobs/scheduled/purge_inactive.rb
index a6615f5fe25..21417bef216 100644
--- a/app/jobs/scheduled/purge_inactive.rb
+++ b/app/jobs/scheduled/purge_inactive.rb
@@ -7,4 +7,3 @@ module Jobs
end
end
end
-
diff --git a/app/jobs/scheduled/tl3_promotions.rb b/app/jobs/scheduled/tl3_promotions.rb
index 37acfcec154..a816d471c5a 100644
--- a/app/jobs/scheduled/tl3_promotions.rb
+++ b/app/jobs/scheduled/tl3_promotions.rb
@@ -19,7 +19,7 @@ module Jobs
# Promotions
User.real.where(trust_level: TrustLevel[2],
trust_level_locked: false)
- .where.not(id: demoted_user_ids).find_each do |u|
+ .where.not(id: demoted_user_ids).find_each do |u|
Promotion.new(u).review_tl2
end
end
diff --git a/app/jobs/scheduled/version_check.rb b/app/jobs/scheduled/version_check.rb
index 9fb39252ee4..51b08d379d9 100644
--- a/app/jobs/scheduled/version_check.rb
+++ b/app/jobs/scheduled/version_check.rb
@@ -6,7 +6,7 @@ module Jobs
every 1.day
def execute(args)
- if SiteSetting.version_checks? and (DiscourseUpdates.updated_at.nil? or DiscourseUpdates.updated_at < 1.minute.ago)
+ if SiteSetting.version_checks? && (DiscourseUpdates.updated_at.nil? || DiscourseUpdates.updated_at < (1.minute.ago))
begin
prev_missing_versions_count = DiscourseUpdates.missing_versions_count || 0
@@ -18,10 +18,10 @@ module Jobs
DiscourseUpdates.updated_at = Time.zone.now
DiscourseUpdates.missing_versions = json['versions']
- if GlobalSetting.new_version_emails and
- SiteSetting.new_version_emails and
- json['missingVersionsCount'] > 0 and
- prev_missing_versions_count < json['missingVersionsCount'].to_i
+ if GlobalSetting.new_version_emails &&
+ SiteSetting.new_version_emails &&
+ json['missingVersionsCount'] > (0) &&
+ prev_missing_versions_count < (json['missingVersionsCount'].to_i)
message = VersionMailer.send_notice
Email::Sender.new(message, :new_version).send
diff --git a/app/mailers/admin_confirmation_mailer.rb b/app/mailers/admin_confirmation_mailer.rb
index ea4d444ad8c..dc2d7df41de 100644
--- a/app/mailers/admin_confirmation_mailer.rb
+++ b/app/mailers/admin_confirmation_mailer.rb
@@ -12,4 +12,3 @@ class AdminConfirmationMailer < ActionMailer::Base
)
end
end
-
diff --git a/app/mailers/pending_flags_mailer.rb b/app/mailers/pending_flags_mailer.rb
index c0f67d2bf29..39fbbb0fd16 100644
--- a/app/mailers/pending_flags_mailer.rb
+++ b/app/mailers/pending_flags_mailer.rb
@@ -23,14 +23,14 @@ class PendingFlagsMailer < ActionMailer::Base
@hours = SiteSetting.notify_about_flags_after
- subject = "[#{SiteSetting.title}] " + I18n.t('flags_reminder.subject_template', { count: PostAction.flagged_posts_count })
+ subject = "[#{SiteSetting.title}] " + I18n.t('flags_reminder.subject_template', count: PostAction.flagged_posts_count)
build_email(SiteSetting.contact_email, subject: subject)
end
private
def flag_reason_counts(post)
- post[:post_actions].inject({}) do |h,v|
+ post[:post_actions].inject({}) do |h, v|
h[v[:name_key]] ||= 0
h[v[:name_key]] += 1
h
diff --git a/app/mailers/pending_queued_posts_mailer.rb b/app/mailers/pending_queued_posts_mailer.rb
index fec7c3ba729..525454b7d22 100644
--- a/app/mailers/pending_queued_posts_mailer.rb
+++ b/app/mailers/pending_queued_posts_mailer.rb
@@ -3,7 +3,7 @@ require_dependency 'email/message_builder'
class PendingQueuedPostsMailer < ActionMailer::Base
include Email::BuildEmailHelper
- def notify(opts={})
+ def notify(opts = {})
return unless SiteSetting.contact_email
build_email(SiteSetting.contact_email, template: 'queued_posts_reminder', count: opts[:count])
end
diff --git a/app/mailers/subscription_mailer.rb b/app/mailers/subscription_mailer.rb
index 51a66797a65..d8ea40d2fb7 100644
--- a/app/mailers/subscription_mailer.rb
+++ b/app/mailers/subscription_mailer.rb
@@ -3,7 +3,7 @@ require_dependency 'email/message_builder'
class SubscriptionMailer < ActionMailer::Base
include Email::BuildEmailHelper
- def confirm_unsubscribe(user, opts={})
+ def confirm_unsubscribe(user, opts = {})
unsubscribe_key = UnsubscribeKey.create_key_for(user, "all")
build_email user.email,
template: "unsubscribe_mailer",
diff --git a/app/mailers/user_notifications.rb b/app/mailers/user_notifications.rb
index c209a940d16..049e6658275 100644
--- a/app/mailers/user_notifications.rb
+++ b/app/mailers/user_notifications.rb
@@ -11,14 +11,14 @@ class UserNotifications < ActionMailer::Base
include Email::BuildEmailHelper
- def signup(user, opts={})
+ def signup(user, opts = {})
build_email(user.email,
template: "user_notifications.signup",
locale: user_locale(user),
email_token: opts[:email_token])
end
- def signup_after_approval(user, opts={})
+ def signup_after_approval(user, opts = {})
build_email(user.email,
template: 'user_notifications.signup_after_approval',
locale: user_locale(user),
@@ -26,42 +26,42 @@ class UserNotifications < ActionMailer::Base
new_user_tips: I18n.t('system_messages.usage_tips.text_body_template', base_url: Discourse.base_url, locale: locale))
end
- def notify_old_email(user, opts={})
+ def notify_old_email(user, opts = {})
build_email(user.email,
template: "user_notifications.notify_old_email",
locale: user_locale(user),
new_email: opts[:new_email])
end
- def confirm_old_email(user, opts={})
+ def confirm_old_email(user, opts = {})
build_email(user.email,
template: "user_notifications.confirm_old_email",
locale: user_locale(user),
email_token: opts[:email_token])
end
- def confirm_new_email(user, opts={})
+ def confirm_new_email(user, opts = {})
build_email(user.email,
template: "user_notifications.confirm_new_email",
locale: user_locale(user),
email_token: opts[:email_token])
end
- def forgot_password(user, opts={})
+ def forgot_password(user, opts = {})
build_email(user.email,
template: user.has_password? ? "user_notifications.forgot_password" : "user_notifications.set_password",
locale: user_locale(user),
email_token: opts[:email_token])
end
- def admin_login(user, opts={})
+ def admin_login(user, opts = {})
build_email(user.email,
template: "user_notifications.admin_login",
locale: user_locale(user),
email_token: opts[:email_token])
end
- def account_created(user, opts={})
+ def account_created(user, opts = {})
build_email(user.email,
template: "user_notifications.account_created",
locale: user_locale(user),
@@ -76,30 +76,30 @@ class UserNotifications < ActionMailer::Base
end
end
- def digest(user, opts={})
+ def digest(user, opts = {})
build_summary_for(user)
min_date = opts[:since] || user.last_emailed_at || user.last_seen_at || 1.month.ago
# Fetch some topics and posts to show
- digest_opts = {limit: SiteSetting.digest_topics + SiteSetting.digest_other_topics, top_order: true}
+ digest_opts = { limit: SiteSetting.digest_topics + SiteSetting.digest_other_topics, top_order: true }
topics_for_digest = Topic.for_digest(user, min_date, digest_opts).to_a
if topics_for_digest.empty? && !user.user_option.try(:include_tl0_in_digests)
# Find some topics from new users that are at least 24 hours old
topics_for_digest = Topic.for_digest(user, min_date, digest_opts.merge(include_tl0: true)).where('topics.created_at < ?', 24.hours.ago).to_a
end
- @popular_topics = topics_for_digest[0,SiteSetting.digest_topics]
+ @popular_topics = topics_for_digest[0, SiteSetting.digest_topics]
if @popular_topics.present?
@other_new_for_you = topics_for_digest.size > SiteSetting.digest_topics ? topics_for_digest[SiteSetting.digest_topics..-1] : []
@popular_posts = if SiteSetting.digest_posts > 0
Post.order("posts.score DESC")
- .for_mailing_list(user, min_date)
- .where('posts.post_type = ?', Post.types[:regular])
- .where('posts.deleted_at IS NULL AND posts.hidden = false AND posts.user_deleted = false')
- .where("posts.post_number > ? AND posts.score > ?", 1, ScoreCalculator.default_score_weights[:like_score] * 5.0)
- .limit(SiteSetting.digest_posts)
+ .for_mailing_list(user, min_date)
+ .where('posts.post_type = ?', Post.types[:regular])
+ .where('posts.deleted_at IS NULL AND posts.hidden = false AND posts.user_deleted = false')
+ .where("posts.post_number > ? AND posts.score > ?", 1, ScoreCalculator.default_score_weights[:like_score] * 5.0)
+ .limit(SiteSetting.digest_posts)
else
[]
end
@@ -117,19 +117,19 @@ class UserNotifications < ActionMailer::Base
# We used topics from new users instead, so count should match
new_topics_count = topics_for_digest.size
end
- @counts = [{label_key: 'user_notifications.digest.new_topics',
- value: new_topics_count,
- href: "#{Discourse.base_url}/new"}]
+ @counts = [{ label_key: 'user_notifications.digest.new_topics',
+ value: new_topics_count,
+ href: "#{Discourse.base_url}/new" }]
value = user.unread_notifications
- @counts << {label_key: 'user_notifications.digest.unread_notifications', value: value, href: "#{Discourse.base_url}/my/notifications"} if value > 0
+ @counts << { label_key: 'user_notifications.digest.unread_notifications', value: value, href: "#{Discourse.base_url}/my/notifications" } if value > 0
value = user.unread_private_messages
- @counts << {label_key: 'user_notifications.digest.unread_messages', value: value, href: "#{Discourse.base_url}/my/messages"} if value > 0
+ @counts << { label_key: 'user_notifications.digest.unread_messages', value: value, href: "#{Discourse.base_url}/my/messages" } if value > 0
if @counts.size < 3
value = user.unread_notifications_of_type(Notification.types[:liked])
- @counts << {label_key: 'user_notifications.digest.liked_received', value: value, href: "#{Discourse.base_url}/my/notifications"} if value > 0
+ @counts << { label_key: 'user_notifications.digest.liked_received', value: value, href: "#{Discourse.base_url}/my/notifications" } if value > 0
end
if @counts.size < 3
@@ -157,7 +157,6 @@ class UserNotifications < ActionMailer::Base
end
end
-
def user_replied(user, opts)
opts[:allow_reply_by_email] = true
opts[:use_site_subject] = true
@@ -252,7 +251,7 @@ class UserNotifications < ActionMailer::Base
(user.locale.present? && I18n.available_locales.include?(user.locale.to_sym)) ? user.locale : nil
end
- def email_post_markdown(post, add_posted_by=false)
+ def email_post_markdown(post, add_posted_by = false)
result = "#{post.raw}\n\n"
if add_posted_by
result << "#{I18n.t('user_notifications.posted_by', username: post.username, post_date: post.created_at.strftime("%m/%d/%Y"))}\n\n"
@@ -275,12 +274,12 @@ class UserNotifications < ActionMailer::Base
allowed_post_types << Post.types[:whisper] if topic_user.try(:user).try(:staff?)
context_posts = Post.where(topic_id: post.topic_id)
- .where("post_number < ?", post.post_number)
- .where(user_deleted: false)
- .where(hidden: false)
- .where(post_type: allowed_post_types)
- .order('created_at desc')
- .limit(SiteSetting.email_posts_context)
+ .where("post_number < ?", post.post_number)
+ .where(user_deleted: false)
+ .where(hidden: false)
+ .where(post_type: allowed_post_types)
+ .order('created_at desc')
+ .limit(SiteSetting.email_posts_context)
if topic_user && topic_user.last_emailed_post_number && user.user_option.email_previous_replies == UserOption.previous_replies_type[:unless_emailed]
context_posts = context_posts.where("post_number > ?", topic_user.last_emailed_post_number)
@@ -429,7 +428,7 @@ class UserNotifications < ActionMailer::Base
reached_limit = SiteSetting.max_emails_per_day_per_user > 0
reached_limit &&= (EmailLog.where(user_id: user.id, skipped: false)
.where('created_at > ?', 1.day.ago)
- .count) >= (SiteSetting.max_emails_per_day_per_user-1)
+ .count) >= (SiteSetting.max_emails_per_day_per_user - 1)
in_reply_to_post = post.reply_to_post if user.user_option.email_in_reply_to
if SiteSetting.private_email?
@@ -438,7 +437,6 @@ class UserNotifications < ActionMailer::Base
message = email_post_markdown(post) + (reached_limit ? "\n\n#{I18n.t "user_notifications.reached_limit", count: SiteSetting.max_emails_per_day_per_user}" : "");
end
-
unless translation_override_exists
html = UserNotificationRenderer.new(Rails.configuration.paths["app/views"]).render(
template: 'email/notification',
diff --git a/app/mailers/version_mailer.rb b/app/mailers/version_mailer.rb
index b39136933c6..dad4dbd448c 100644
--- a/app/mailers/version_mailer.rb
+++ b/app/mailers/version_mailer.rb
@@ -6,17 +6,17 @@ class VersionMailer < ActionMailer::Base
def send_notice
if SiteSetting.contact_email.present?
missing_versions = DiscourseUpdates.missing_versions
- if missing_versions.present? and missing_versions.first['notes'].present?
- build_email( SiteSetting.contact_email,
+ if missing_versions.present? && missing_versions.first['notes'].present?
+ build_email(SiteSetting.contact_email,
template: 'new_version_mailer_with_notes',
notes: missing_versions.first['notes'],
new_version: DiscourseUpdates.latest_version,
- installed_version: Discourse::VERSION::STRING )
+ installed_version: Discourse::VERSION::STRING)
else
- build_email( SiteSetting.contact_email,
+ build_email(SiteSetting.contact_email,
template: 'new_version_mailer',
new_version: DiscourseUpdates.latest_version,
- installed_version: Discourse::VERSION::STRING )
+ installed_version: Discourse::VERSION::STRING)
end
end
end
diff --git a/app/models/about.rb b/app/models/about.rb
index 0d670183ba7..8392df3c483 100644
--- a/app/models/about.rb
+++ b/app/models/about.rb
@@ -35,8 +35,8 @@ class About
def moderators
@moderators ||= User.where(moderator: true, admin: false)
- .human_users
- .order(:username_lower)
+ .human_users
+ .order(:username_lower)
end
def admins
diff --git a/app/models/admin_dashboard_data.rb b/app/models/admin_dashboard_data.rb
index b4113d609ea..20550a9fd0a 100644
--- a/app/models/admin_dashboard_data.rb
+++ b/app/models/admin_dashboard_data.rb
@@ -31,7 +31,7 @@ class AdminDashboardData
USER_REPORTS ||= ['users_by_trust_level']
- MOBILE_REPORTS ||= ['mobile_visits'] + ApplicationRequest.req_types.keys.select {|r| r =~ /mobile/}.map { |r| r + "_reqs" }
+ MOBILE_REPORTS ||= ['mobile_visits'] + ApplicationRequest.req_types.keys.select { |r| r =~ /mobile/ }.map { |r| r + "_reqs" }
def self.add_problem_check(*syms, &blk)
@problem_syms.push(*syms) if syms
@@ -120,7 +120,7 @@ class AdminDashboardData
$redis.get(problem_message_key(i18n_key)) ? I18n.t(i18n_key) : nil
end
- def self.add_problem_message(i18n_key, expire_seconds=nil)
+ def self.add_problem_message(i18n_key, expire_seconds = nil)
if expire_seconds.to_i > 0
$redis.setex problem_message_key(i18n_key), expire_seconds.to_i, 1
else
diff --git a/app/models/application_request.rb b/app/models/application_request.rb
index 8f146f10fd7..1f1f758d956 100644
--- a/app/models/application_request.rb
+++ b/app/models/application_request.rb
@@ -19,7 +19,7 @@ class ApplicationRequest < ActiveRecord::Base
self.autoflush_seconds = 5.minutes
self.last_flush = Time.now.utc
- def self.increment!(type, opts=nil)
+ def self.increment!(type, opts = nil)
key = redis_key(type)
val = $redis.incr(key).to_i
# 3.days, see: https://github.com/rails/rails/issues/21296
@@ -36,7 +36,7 @@ class ApplicationRequest < ActiveRecord::Base
end
end
- def self.write_cache!(date=nil)
+ def self.write_cache!(date = nil)
if date.nil?
write_cache!(Time.now.utc)
write_cache!(Time.now.utc.yesterday)
@@ -49,8 +49,8 @@ class ApplicationRequest < ActiveRecord::Base
# this may seem a bit fancy but in so it allows
# for concurrent calls without double counting
- req_types.each do |req_type,_|
- key = redis_key(req_type,date)
+ req_types.each do |req_type, _|
+ key = redis_key(req_type, date)
val = $redis.get(key).to_i
next if val == 0
@@ -63,28 +63,28 @@ class ApplicationRequest < ActiveRecord::Base
next
end
- id = req_id(date,req_type)
+ id = req_id(date, req_type)
where(id: id).update_all(["count = count + ?", val])
end
end
- def self.clear_cache!(date=nil)
+ def self.clear_cache!(date = nil)
if date.nil?
clear_cache!(Time.now.utc)
clear_cache!(Time.now.utc.yesterday)
return
end
- req_types.each do |req_type,_|
- key = redis_key(req_type,date)
+ req_types.each do |req_type, _|
+ key = redis_key(req_type, date)
$redis.del key
end
end
protected
- def self.req_id(date,req_type,retries=0)
+ def self.req_id(date, req_type, retries = 0)
req_type_id = req_types[req_type]
@@ -94,13 +94,13 @@ class ApplicationRequest < ActiveRecord::Base
rescue # primary key violation
if retries == 0
- req_id(date,req_type,1)
+ req_id(date, req_type, 1)
else
raise
end
end
- def self.redis_key(req_type, time=Time.now.utc)
+ def self.redis_key(req_type, time = Time.now.utc)
"app_req_#{req_type}#{time.strftime('%Y%m%d')}"
end
diff --git a/app/models/backup.rb b/app/models/backup.rb
index d23d459d008..72a619a06c8 100644
--- a/app/models/backup.rb
+++ b/app/models/backup.rb
@@ -10,9 +10,9 @@ class Backup
def self.all
Dir.glob(File.join(Backup.base_directory, "*.{gz,tgz}"))
- .sort_by { |file| File.mtime(file) }
- .reverse
- .map { |backup| Backup.create_from_filename(File.basename(backup)) }
+ .sort_by { |file| File.mtime(file) }
+ .reverse
+ .map { |backup| Backup.create_from_filename(File.basename(backup)) }
end
def self.[](filename)
diff --git a/app/models/badge.rb b/app/models/badge.rb
index ac1b3a4d493..46502613f58 100644
--- a/app/models/badge.rb
+++ b/app/models/badge.rb
@@ -63,7 +63,7 @@ class Badge < ActiveRecord::Base
def self.trigger_hash
Hash[*(
- Badge::Trigger.constants.map{|k|
+ Badge::Trigger.constants.map { |k|
[k.to_s.underscore, Badge::Trigger.const_get(k)]
}.flatten
)]
@@ -100,7 +100,7 @@ class Badge < ActiveRecord::Base
validates :allow_title, inclusion: [true, false]
validates :multiple_grant, inclusion: [true, false]
- scope :enabled, ->{ where(enabled: true) }
+ scope :enabled, -> { where(enabled: true) }
before_create :ensure_not_system
@@ -208,7 +208,6 @@ class Badge < ActiveRecord::Base
val
end
-
def slug
Slug.for(self.display_name, '-')
end
diff --git a/app/models/badge_type.rb b/app/models/badge_type.rb
index 11d4a4b655b..b1d6e91edd9 100644
--- a/app/models/badge_type.rb
+++ b/app/models/badge_type.rb
@@ -3,7 +3,6 @@ class BadgeType < ActiveRecord::Base
Silver = 2
Bronze = 3
-
has_many :badges
validates :name, presence: true, uniqueness: true
end
diff --git a/app/models/category.rb b/app/models/category.rb
index 02956b4eef2..7939103cd0c 100644
--- a/app/models/category.rb
+++ b/app/models/category.rb
@@ -72,7 +72,6 @@ class Category < ActiveRecord::Base
has_many :category_tag_groups, dependent: :destroy
has_many :tag_groups, through: :category_tag_groups
-
scope :latest, -> { order('topic_count DESC') }
scope :secured, -> (guardian = nil) {
@@ -141,10 +140,10 @@ class Category < ActiveRecord::Base
def self.update_stats
topics_with_post_count = Topic
- .select("topics.category_id, COUNT(*) topic_count, SUM(topics.posts_count) post_count")
- .where("topics.id NOT IN (select cc.topic_id from categories cc WHERE topic_id IS NOT NULL)")
- .group("topics.category_id")
- .visible.to_sql
+ .select("topics.category_id, COUNT(*) topic_count, SUM(topics.posts_count) post_count")
+ .where("topics.id NOT IN (select cc.topic_id from categories cc WHERE topic_id IS NOT NULL)")
+ .group("topics.category_id")
+ .visible.to_sql
Category.exec_sql <<-SQL
UPDATE categories c
@@ -183,13 +182,12 @@ SQL
end
end
-
def visible_posts
query = Post.joins(:topic)
- .where(['topics.category_id = ?', self.id])
- .where('topics.visible = true')
- .where('posts.deleted_at IS NULL')
- .where('posts.user_deleted = false')
+ .where(['topics.category_id = ?', self.id])
+ .where('topics.visible = true')
+ .where('posts.deleted_at IS NULL')
+ .where('posts.user_deleted = false')
self.topic_id ? query.where(['topics.id <> ?', self.topic_id]) : query
end
@@ -256,11 +254,11 @@ SQL
def publish_category
group_ids = self.groups.pluck(:id) if self.read_restricted
- MessageBus.publish('/categories', {categories: ActiveModel::ArraySerializer.new([self]).as_json}, group_ids: group_ids)
+ MessageBus.publish('/categories', { categories: ActiveModel::ArraySerializer.new([self]).as_json }, group_ids: group_ids)
end
def publish_category_deletion
- MessageBus.publish('/categories', {deleted_categories: [self.id]})
+ MessageBus.publish('/categories', deleted_categories: [self.id])
end
def parent_category_validator
@@ -321,7 +319,7 @@ SQL
end
def allowed_tags=(tag_names_arg)
- DiscourseTagging.add_or_create_tags_by_name(self, tag_names_arg, {unlimited: true})
+ DiscourseTagging.add_or_create_tags_by_name(self, tag_names_arg, unlimited: true)
end
def allowed_tag_groups=(group_names)
@@ -359,21 +357,21 @@ SQL
def update_latest
latest_post_id = Post
- .order("posts.created_at desc")
- .where("NOT hidden")
- .joins("join topics on topics.id = topic_id")
- .where("topics.category_id = :id", id: self.id)
- .limit(1)
- .pluck("posts.id")
- .first
+ .order("posts.created_at desc")
+ .where("NOT hidden")
+ .joins("join topics on topics.id = topic_id")
+ .where("topics.category_id = :id", id: self.id)
+ .limit(1)
+ .pluck("posts.id")
+ .first
latest_topic_id = Topic
- .order("topics.created_at desc")
- .where("visible")
- .where("topics.category_id = :id", id: self.id)
- .limit(1)
- .pluck("topics.id")
- .first
+ .order("topics.created_at desc")
+ .where("visible")
+ .where("topics.category_id = :id", id: self.id)
+ .limit(1)
+ .pluck("topics.id")
+ .first
self.update_attributes(latest_topic_id: latest_topic_id, latest_post_id: latest_post_id)
end
@@ -384,7 +382,7 @@ SQL
everyone = Group::AUTO_GROUPS[:everyone]
full = CategoryGroup.permission_types[:full]
- mapped = permissions.map do |group,permission|
+ mapped = permissions.map do |group, permission|
group = group.id if group.is_a?(Group)
# subtle, using Group[] ensures the group exists in the DB
@@ -498,7 +496,7 @@ SQL
SearchIndexer.index(self)
end
- def self.find_by_slug(category_slug, parent_category_slug=nil)
+ def self.find_by_slug(category_slug, parent_category_slug = nil)
if parent_category_slug
parent_category_id = self.where(slug: parent_category_slug, parent_category_id: nil).pluck(:id).first
self.where(slug: category_slug, parent_category_id: parent_category_id).first
diff --git a/app/models/category_featured_topic.rb b/app/models/category_featured_topic.rb
index 78331574db3..22d948dd598 100644
--- a/app/models/category_featured_topic.rb
+++ b/app/models/category_featured_topic.rb
@@ -13,7 +13,7 @@ class CategoryFeaturedTopic < ActiveRecord::Base
end
end
- def self.feature_topics_for(c, existing=nil)
+ def self.feature_topics_for(c, existing = nil)
return if c.blank?
query_opts = {
@@ -28,7 +28,7 @@ class CategoryFeaturedTopic < ActiveRecord::Base
results = query.list_category_topic_ids(c).uniq
# Add some topics that are visible to everyone:
- anon_query = TopicQuery.new(nil, query_opts.merge({except_topic_ids: [c.topic_id] + results}))
+ anon_query = TopicQuery.new(nil, query_opts.merge(except_topic_ids: [c.topic_id] + results))
results += anon_query.list_category_topic_ids(c).uniq
return if results == existing
diff --git a/app/models/category_featured_user.rb b/app/models/category_featured_user.rb
index fb75cca87b5..73ac6b1516f 100644
--- a/app/models/category_featured_user.rb
+++ b/app/models/category_featured_user.rb
@@ -30,7 +30,7 @@ class CategoryFeaturedUser < ActiveRecord::Base
LIMIT :max_featured_users;
", category_id: category_id, max_featured_users: max_featured_users
- user_ids = most_recent_user_ids.map{|uc| uc['user_id'].to_i}
+ user_ids = most_recent_user_ids.map { |uc| uc['user_id'].to_i }
current = CategoryFeaturedUser.where(category_id: category_id).order(:id).pluck(:user_id)
return if current == user_ids
diff --git a/app/models/category_list.rb b/app/models/category_list.rb
index 39507a2a8aa..ddf9ab5880b 100644
--- a/app/models/category_list.rb
+++ b/app/models/category_list.rb
@@ -9,7 +9,7 @@ class CategoryList
:draft_key,
:draft_sequence
- def initialize(guardian=nil, options={})
+ def initialize(guardian = nil, options = {})
@guardian = guardian || Guardian.new
@options = options
@@ -63,9 +63,9 @@ class CategoryList
@categories = @categories.order(:position, :id)
else
@categories = @categories.order('COALESCE(categories.posts_week, 0) DESC')
- .order('COALESCE(categories.posts_month, 0) DESC')
- .order('COALESCE(categories.posts_year, 0) DESC')
- .order('id ASC')
+ .order('COALESCE(categories.posts_month, 0) DESC')
+ .order('COALESCE(categories.posts_year, 0) DESC')
+ .order('id ASC')
end
@categories = @categories.to_a
diff --git a/app/models/category_user.rb b/app/models/category_user.rb
index 1cb6f502b3e..8d0cf159127 100644
--- a/app/models/category_user.rb
+++ b/app/models/category_user.rb
@@ -62,7 +62,7 @@ class CategoryUser < ActiveRecord::Base
auto_track(user_id: user.id)
end
- def self.auto_track(opts={})
+ def self.auto_track(opts = {})
builder = SqlBuilder.new < "#{name}CustomField"
+ has_many :_custom_fields, dependent: :destroy, class_name: "#{name}CustomField"
after_save :save_custom_fields
attr_accessor :preloaded_custom_fields
@@ -58,7 +58,7 @@ module HasCustomFields
return result if whitelisted_fields.blank?
klass.where(foreign_key => ids, :name => whitelisted_fields)
- .pluck(foreign_key, :name, :value).each do |cf|
+ .pluck(foreign_key, :name, :value).each do |cf|
result[cf[0]] ||= {}
append_custom_field(result[cf[0]], cf[1], cf[2])
end
@@ -96,7 +96,7 @@ module HasCustomFields
.where("name in (?)", fields)
.pluck(fk, :name, :value).each do |id, name, value|
- preloaded = map[id].preloaded_custom_fields
+ preloaded = map[id].preloaded_custom_fields
if preloaded[name].nil?
preloaded.delete(name)
@@ -156,7 +156,7 @@ module HasCustomFields
!@custom_fields || @custom_fields_orig == @custom_fields
end
- def save_custom_fields(force=false)
+ def save_custom_fields(force = false)
if force || !custom_fields_clean?
dup = @custom_fields.dup
@@ -194,7 +194,7 @@ module HasCustomFields
end
end
- dup.each do |k,v|
+ dup.each do |k, v|
if v.is_a? Array
v.each { |subv| _custom_fields.create(name: k, value: subv) }
elsif v.is_a? Hash
@@ -212,7 +212,7 @@ module HasCustomFields
def refresh_custom_fields_from_db
target = Hash.new
- _custom_fields.pluck(:name,:value).each do |key, value|
+ _custom_fields.pluck(:name, :value).each do |key, value|
self.class.append_custom_field(target, key, value)
end
@custom_fields_orig = target
diff --git a/app/models/concerns/positionable.rb b/app/models/concerns/positionable.rb
index 335b8ce0acb..68e71f1b145 100644
--- a/app/models/concerns/positionable.rb
+++ b/app/models/concerns/positionable.rb
@@ -11,18 +11,18 @@ module Positionable
position = [[position_arg, 0].max, self.class.count - 1].min
- if self.position.nil? or position > self.position
+ if self.position.nil? || position > (self.position)
self.exec_sql "
UPDATE #{self.class.table_name}
SET position = position - 1
WHERE position > :current_position and position <= :new_position",
- {current_position: self.position, new_position: position}
+ current_position: self.position, new_position: position
elsif position < self.position
self.exec_sql "
UPDATE #{self.class.table_name}
SET position = position + 1
WHERE position >= :new_position and position < :current_position",
- {current_position: self.position, new_position: position}
+ current_position: self.position, new_position: position
else
# Not moving to a new position
return
@@ -31,6 +31,6 @@ module Positionable
self.exec_sql "
UPDATE #{self.class.table_name}
SET position = :position
- WHERE id = :id", {id: id, position: position}
+ WHERE id = :id", id: id, position: position
end
end
diff --git a/app/models/concerns/trashable.rb b/app/models/concerns/trashable.rb
index 9325f6849e1..b758df0027e 100644
--- a/app/models/concerns/trashable.rb
+++ b/app/models/concerns/trashable.rb
@@ -8,7 +8,6 @@ module Trashable
belongs_to :deleted_by, class_name: 'User'
end
-
module ClassMethods
def with_deleted
# lifted from acts_as_paranoid, works around https://github.com/rails/rails/issues/4306
@@ -30,7 +29,7 @@ module Trashable
deleted_at.present?
end
- def trash!(trashed_by=nil)
+ def trash!(trashed_by = nil)
# note, an argument could be made that the column should probably called trashed_at
# however, deleted_at is the terminology used in the UI
#
@@ -44,7 +43,6 @@ module Trashable
trash_update(nil, nil)
end
-
private
def trash_update(deleted_at, deleted_by_id)
diff --git a/app/models/directory_item.rb b/app/models/directory_item.rb
index 9bdcdf50acb..b877705d70b 100644
--- a/app/models/directory_item.rb
+++ b/app/models/directory_item.rb
@@ -22,7 +22,7 @@ class DirectoryItem < ActiveRecord::Base
end
def self.refresh!
- period_types.each_key {|p| refresh_period!(p)}
+ period_types.each_key { |p| refresh_period!(p) }
end
def self.refresh_period!(period_type)
@@ -30,14 +30,15 @@ class DirectoryItem < ActiveRecord::Base
# Don't calculate it if the user directory is disabled
return unless SiteSetting.enable_user_directory?
- since = case period_type
- when :daily then 1.day.ago
- when :weekly then 1.week.ago
- when :monthly then 1.month.ago
- when :quarterly then 3.months.ago
- when :yearly then 1.year.ago
- else 1000.years.ago
- end
+ since =
+ case period_type
+ when :daily then 1.day.ago
+ when :weekly then 1.week.ago
+ when :monthly then 1.month.ago
+ when :quarterly then 3.months.ago
+ when :yearly then 1.year.ago
+ else 1000.years.ago
+ end
ActiveRecord::Base.transaction do
exec_sql "DELETE FROM directory_items
@@ -47,7 +48,6 @@ class DirectoryItem < ActiveRecord::Base
u.id IS NULL AND
di.period_type = :period_type", period_type: period_types[period_type]
-
exec_sql "INSERT INTO directory_items(period_type, user_id, likes_received, likes_given, topics_entered, days_visited, posts_read, topic_count, post_count)
SELECT
:period_type,
@@ -117,7 +117,6 @@ class DirectoryItem < ActiveRecord::Base
reply_type: UserAction::REPLY,
regular_post_type: Post.types[:regular]
-
if period_type == :all
exec_sql < 0
GroupUser
- .where(user_id: user.id)
- .where('group_id IN (SELECT id FROM groups WHERE name in (?))',split)
- .destroy_all
+ .where(user_id: user.id)
+ .where('group_id IN (SELECT id FROM groups WHERE name in (?))', split)
+ .destroy_all
end
end
end
diff --git a/app/models/draft.rb b/app/models/draft.rb
index 437ad298fe3..be412cc72a3 100644
--- a/app/models/draft.rb
+++ b/app/models/draft.rb
@@ -4,7 +4,7 @@ class Draft < ActiveRecord::Base
EXISTING_TOPIC = 'topic_'
def self.set(user, key, sequence, data)
- d = find_draft(user,key)
+ d = find_draft(user, key)
if d
return if d.sequence > sequence
exec_sql("UPDATE drafts
@@ -18,14 +18,14 @@ class Draft < ActiveRecord::Base
end
def self.get(user, key, sequence)
- d = find_draft(user,key)
+ d = find_draft(user, key)
if d && d.sequence == sequence
d.data
end
end
def self.clear(user, key, sequence)
- d = find_draft(user,key)
+ d = find_draft(user, key)
if d && d.sequence <= sequence
d.destroy
end
diff --git a/app/models/draft_sequence.rb b/app/models/draft_sequence.rb
index af4eb647c93..2e8eeb98c82 100644
--- a/app/models/draft_sequence.rb
+++ b/app/models/draft_sequence.rb
@@ -1,5 +1,5 @@
class DraftSequence < ActiveRecord::Base
- def self.next!(user,key)
+ def self.next!(user, key)
user_id = user
user_id = user.id unless user.is_a?(Integer)
diff --git a/app/models/email_log.rb b/app/models/email_log.rb
index d17ec8c3a69..3add7e1c355 100644
--- a/app/models/email_log.rb
+++ b/app/models/email_log.rb
@@ -39,21 +39,21 @@ class EmailLog < ActiveRecord::Base
end
end
- def self.reached_max_emails?(user, email_type=nil)
+ def self.reached_max_emails?(user, email_type = nil)
return false if SiteSetting.max_emails_per_day_per_user == 0 || CRITICAL_EMAIL_TYPES.include?(email_type)
count = sent.where('created_at > ?', 1.day.ago)
- .where(user_id: user.id)
- .count
+ .where(user_id: user.id)
+ .count
count >= SiteSetting.max_emails_per_day_per_user
end
def self.count_per_day(start_date, end_date)
sent.where("created_at BETWEEN ? AND ?", start_date, end_date)
- .group("DATE(created_at)")
- .order("DATE(created_at)")
- .count
+ .group("DATE(created_at)")
+ .order("DATE(created_at)")
+ .count
end
def self.for(reply_key)
@@ -62,9 +62,9 @@ class EmailLog < ActiveRecord::Base
def self.last_sent_email_address
self.where(email_type: "signup")
- .order(created_at: :desc)
- .first
- .try(:to_address)
+ .order(created_at: :desc)
+ .first
+ .try(:to_address)
end
end
diff --git a/app/models/email_token.rb b/app/models/email_token.rb
index cff339a08eb..2a10dd4e234 100644
--- a/app/models/email_token.rb
+++ b/app/models/email_token.rb
@@ -11,8 +11,8 @@ class EmailToken < ActiveRecord::Base
after_create do
# Expire the previous tokens
EmailToken.where(user_id: self.user_id)
- .where("id != ?", self.id)
- .update_all(expired: true)
+ .where("id != ?", self.id)
+ .update_all(expired: true)
end
def self.token_length
@@ -36,7 +36,7 @@ class EmailToken < ActiveRecord::Base
end
def self.valid_token_format?(token)
- token.present? && token =~ /\h{#{token.length/2}}/i
+ token.present? && token =~ /\h{#{token.length / 2}}/i
end
def self.atomic_confirm(token)
@@ -81,10 +81,10 @@ class EmailToken < ActiveRecord::Base
def self.confirmable(token)
EmailToken.where(token: token)
- .where(expired: false, confirmed: false)
- .where("created_at >= ?", EmailToken.valid_after)
- .includes(:user)
- .first
+ .where(expired: false, confirmed: false)
+ .where("created_at >= ?", EmailToken.valid_after)
+ .includes(:user)
+ .first
end
end
diff --git a/app/models/embedding.rb b/app/models/embedding.rb
index f11de96f4f3..a0be5ceea80 100644
--- a/app/models/embedding.rb
+++ b/app/models/embedding.rb
@@ -38,7 +38,7 @@ class Embedding < OpenStruct
def self.find
embedding_args = { id: 'default' }
- Embedding.settings.each {|s| embedding_args[s] = SiteSetting.send(s) }
+ Embedding.settings.each { |s| embedding_args[s] = SiteSetting.send(s) }
Embedding.new(embedding_args)
end
end
diff --git a/app/models/emoji.rb b/app/models/emoji.rb
index 513ad8478ff..c6f2e490cfc 100644
--- a/app/models/emoji.rb
+++ b/app/models/emoji.rb
@@ -78,7 +78,7 @@ class Emoji
end
def self.load_standard
- db['emojis'].map {|e| Emoji.create_from_db_item(e) }
+ db['emojis'].map { |e| Emoji.create_from_db_item(e) }
end
def self.load_custom
@@ -135,7 +135,7 @@ class Emoji
if is_tonable_emojis.include?(name)
fitzpatrick_scales.each_with_index do |scale, index|
toned_code = code.codepoints.insert(1, scale).pack("U*".freeze)
- @unicode_replacements[toned_code] = "#{name}:t#{index+2}"
+ @unicode_replacements[toned_code] = "#{name}:t#{index + 2}"
end
end
end
@@ -180,7 +180,7 @@ class Emoji
if is_tonable_emojis.include?(e['name'])
FITZPATRICK_SCALE.each_with_index do |scale, index|
toned_code = (code.codepoints.insert(1, scale.to_i(16))).pack("U*")
- map["#{e['name']}:t#{index+2}"] = toned_code
+ map["#{e['name']}:t#{index + 2}"] = toned_code
end
end
end
diff --git a/app/models/given_daily_like.rb b/app/models/given_daily_like.rb
index 87da4194537..ccc29742377 100644
--- a/app/models/given_daily_like.rb
+++ b/app/models/given_daily_like.rb
@@ -16,8 +16,8 @@ class GivenDailyLike < ActiveRecord::Base
create(user_id: user_id, given_date: given_date, likes_given: 1)
else
find_for(user_id, given_date)
- .where('limit_reached = false AND likes_given >= :limit', limit: SiteSetting.max_likes_per_day)
- .update_all(limit_reached: true)
+ .where('limit_reached = false AND likes_given >= :limit', limit: SiteSetting.max_likes_per_day)
+ .update_all(limit_reached: true)
end
end
@@ -28,8 +28,8 @@ class GivenDailyLike < ActiveRecord::Base
find_for(user_id, given_date).update_all('likes_given = likes_given - 1')
find_for(user_id, given_date)
- .where('limit_reached = true AND likes_given < :limit', limit: SiteSetting.max_likes_per_day)
- .update_all(limit_reached: false)
+ .where('limit_reached = true AND likes_given < :limit', limit: SiteSetting.max_likes_per_day)
+ .update_all(limit_reached: false)
end
end
diff --git a/app/models/global_setting.rb b/app/models/global_setting.rb
index 2ee90b7bc1f..84750ecc695 100644
--- a/app/models/global_setting.rb
+++ b/app/models/global_setting.rb
@@ -40,7 +40,7 @@ class GlobalSetting
token = $redis.without_namespace.get(REDIS_SECRET_KEY)
unless token && token =~ VALID_SECRET_KEY
token = SecureRandom.hex(64)
- $redis.without_namespace.set(REDIS_SECRET_KEY,token)
+ $redis.without_namespace.set(REDIS_SECRET_KEY, token)
end
end
if !secret_key_base.blank? && token != secret_key_base
@@ -74,7 +74,7 @@ class GlobalSetting
end
def self.database_config
- hash = {"adapter" => "postgresql"}
+ hash = { "adapter" => "postgresql" }
%w{pool timeout socket host port username password replica_host replica_port}.each do |s|
if val = self.send("db_#{s}")
hash[s] = val
@@ -91,7 +91,7 @@ class GlobalSetting
hash["prepared_statements"] = !!self.db_prepared_statements
- {"production" => hash}
+ { "production" => hash }
end
# For testing purposes
@@ -118,8 +118,8 @@ class GlobalSetting
if redis_sentinels.present?
c[:sentinels] = redis_sentinels.split(",").map do |address|
- host,port = address.split(":")
- {host: host, port: port}
+ host, port = address.split(":")
+ { host: host, port: port }
end.to_a
end
@@ -134,7 +134,6 @@ class GlobalSetting
setting
end
-
def resolve(current, default)
BaseProvider.coerce(
if current.present?
@@ -167,8 +166,7 @@ class GlobalSetting
end
end
-
- def lookup(key,default)
+ def lookup(key, default)
var = @data[key]
resolve(var, var.nil? ? default : "")
end
@@ -193,7 +191,7 @@ class GlobalSetting
end
def keys
- ENV.keys.select{|k| k =~ /^DISCOURSE_/}.map{|k| k[10..-1].downcase.to_sym}
+ ENV.keys.select { |k| k =~ /^DISCOURSE_/ }.map { |k| k[10..-1].downcase.to_sym }
end
end
@@ -207,7 +205,6 @@ class GlobalSetting
end
end
-
class << self
attr_accessor :provider
end
diff --git a/app/models/group.rb b/app/models/group.rb
index 517247beb6d..f7f37ab4105 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -41,29 +41,29 @@ class Group < ActiveRecord::Base
validate :automatic_membership_email_domains_format_validator
validate :incoming_email_validator
validate :can_allow_membership_requests, if: :allow_membership_requests
- validates :flair_url, url: true, if: Proc.new { |g| g.flair_url && g.flair_url[0,3] != 'fa-' }
+ validates :flair_url, url: true, if: Proc.new { |g| g.flair_url && g.flair_url[0, 3] != 'fa-' }
AUTO_GROUPS = {
- :everyone => 0,
- :admins => 1,
- :moderators => 2,
- :staff => 3,
- :trust_level_0 => 10,
- :trust_level_1 => 11,
- :trust_level_2 => 12,
- :trust_level_3 => 13,
- :trust_level_4 => 14
+ everyone: 0,
+ admins: 1,
+ moderators: 2,
+ staff: 3,
+ trust_level_0: 10,
+ trust_level_1: 11,
+ trust_level_2: 12,
+ trust_level_3: 13,
+ trust_level_4: 14
}
AUTO_GROUP_IDS = Hash[*AUTO_GROUPS.to_a.flatten.reverse]
STAFF_GROUPS = [:admins, :moderators, :staff]
ALIAS_LEVELS = {
- :nobody => 0,
- :only_admins => 1,
- :mods_and_admins => 2,
- :members_mods_and_admins => 3,
- :everyone => 99
+ nobody: 0,
+ only_admins: 1,
+ mods_and_admins: 2,
+ members_mods_and_admins: 3,
+ everyone: 99
}
def self.visibility_levels
@@ -75,13 +75,13 @@ class Group < ActiveRecord::Base
)
end
- validates :alias_level, inclusion: { in: ALIAS_LEVELS.values}
+ validates :alias_level, inclusion: { in: ALIAS_LEVELS.values }
scope :visible_groups, ->(user) {
groups = Group.order(name: :asc).where("groups.id > 0")
unless user&.admin
- sql = <<~SQL
+ sql = <<~SQL
groups.id IN (
SELECT g.id FROM groups g WHERE g.visibility_level = :public
@@ -121,7 +121,7 @@ class Group < ActiveRecord::Base
groups
}
- scope :mentionable, lambda {|user|
+ scope :mentionable, lambda { |user|
levels = [ALIAS_LEVELS[:everyone]]
@@ -140,7 +140,7 @@ class Group < ActiveRecord::Base
(
alias_level = #{ALIAS_LEVELS[:members_mods_and_admins]} AND id in (
SELECT group_id FROM group_users WHERE user_id = :user_id)
- )", levels: levels, user_id: user && user.id )
+ )", levels: levels, user_id: user && user.id)
}
def downcase_incoming_email
@@ -168,38 +168,38 @@ class Group < ActiveRecord::Base
end
end
- def posts_for(guardian, before_post_id=nil)
+ def posts_for(guardian, before_post_id = nil)
user_ids = group_users.map { |gu| gu.user_id }
result = Post.includes(:user, :topic, topic: :category)
- .references(:posts, :topics, :category)
- .where(user_id: user_ids)
- .where('topics.archetype <> ?', Archetype.private_message)
- .where(post_type: Post.types[:regular])
+ .references(:posts, :topics, :category)
+ .where(user_id: user_ids)
+ .where('topics.archetype <> ?', Archetype.private_message)
+ .where(post_type: Post.types[:regular])
result = guardian.filter_allowed_categories(result)
result = result.where('posts.id < ?', before_post_id) if before_post_id
result.order('posts.created_at desc')
end
- def messages_for(guardian, before_post_id=nil)
+ def messages_for(guardian, before_post_id = nil)
result = Post.includes(:user, :topic, topic: :category)
- .references(:posts, :topics, :category)
- .where('topics.archetype = ?', Archetype.private_message)
- .where(post_type: Post.types[:regular])
- .where('topics.id IN (SELECT topic_id FROM topic_allowed_groups WHERE group_id = ?)', self.id)
+ .references(:posts, :topics, :category)
+ .where('topics.archetype = ?', Archetype.private_message)
+ .where(post_type: Post.types[:regular])
+ .where('topics.id IN (SELECT topic_id FROM topic_allowed_groups WHERE group_id = ?)', self.id)
result = guardian.filter_allowed_categories(result)
result = result.where('posts.id < ?', before_post_id) if before_post_id
result.order('posts.created_at desc')
end
- def mentioned_posts_for(guardian, before_post_id=nil)
+ def mentioned_posts_for(guardian, before_post_id = nil)
result = Post.joins(:group_mentions)
- .includes(:user, :topic, topic: :category)
- .references(:posts, :topics, :category)
- .where('topics.archetype <> ?', Archetype.private_message)
- .where(post_type: Post.types[:regular])
- .where('group_mentions.group_id = ?', self.id)
+ .includes(:user, :topic, topic: :category)
+ .references(:posts, :topics, :category)
+ .where('topics.archetype <> ?', Archetype.private_message)
+ .where(post_type: Post.types[:regular])
+ .where('group_mentions.group_id = ?', self.id)
result = guardian.filter_allowed_categories(result)
result = result.where('posts.id < ?', before_post_id) if before_post_id
@@ -237,16 +237,17 @@ class Group < ActiveRecord::Base
end
# Remove people from groups they don't belong in.
- remove_subquery = case name
- when :admins
- "SELECT id FROM users WHERE NOT admin"
- when :moderators
- "SELECT id FROM users WHERE NOT moderator"
- when :staff
- "SELECT id FROM users WHERE NOT admin AND NOT moderator"
- when :trust_level_0, :trust_level_1, :trust_level_2, :trust_level_3, :trust_level_4
- "SELECT id FROM users WHERE trust_level < #{id - 10}"
- end
+ remove_subquery =
+ case name
+ when :admins
+ "SELECT id FROM users WHERE NOT admin"
+ when :moderators
+ "SELECT id FROM users WHERE NOT moderator"
+ when :staff
+ "SELECT id FROM users WHERE NOT admin AND NOT moderator"
+ when :trust_level_0, :trust_level_1, :trust_level_2, :trust_level_3, :trust_level_4
+ "SELECT id FROM users WHERE trust_level < #{id - 10}"
+ end
exec_sql <<-SQL
DELETE FROM group_users
@@ -256,18 +257,19 @@ class Group < ActiveRecord::Base
SQL
# Add people to groups
- insert_subquery = case name
- when :admins
- "SELECT id FROM users WHERE admin"
- when :moderators
- "SELECT id FROM users WHERE moderator"
- when :staff
- "SELECT id FROM users WHERE moderator OR admin"
- when :trust_level_1, :trust_level_2, :trust_level_3, :trust_level_4
- "SELECT id FROM users WHERE trust_level >= #{id - 10}"
- when :trust_level_0
- "SELECT id FROM users"
- end
+ insert_subquery =
+ case name
+ when :admins
+ "SELECT id FROM users WHERE admin"
+ when :moderators
+ "SELECT id FROM users WHERE moderator"
+ when :staff
+ "SELECT id FROM users WHERE moderator OR admin"
+ when :trust_level_1, :trust_level_2, :trust_level_3, :trust_level_4
+ "SELECT id FROM users WHERE trust_level >= #{id - 10}"
+ when :trust_level_0
+ "SELECT id FROM users"
+ end
exec_sql <<-SQL
INSERT INTO group_users (group_id, user_id, created_at, updated_at)
@@ -388,11 +390,11 @@ class Group < ActiveRecord::Base
additions = expected - current
deletions = current - expected
- map = Hash[*User.where(username: additions+deletions)
- .select('id,username')
- .map{|u| [u.username,u.id]}.flatten]
+ map = Hash[*User.where(username: additions + deletions)
+ .select('id,username')
+ .map { |u| [u.username, u.id] }.flatten]
- deletions = Set.new(deletions.map{|d| map[d]})
+ deletions = Set.new(deletions.map { |d| map[d] })
@deletions = []
group_users.each do |gu|
diff --git a/app/models/group_archived_message.rb b/app/models/group_archived_message.rb
index 190dce298c7..91d2062cae5 100644
--- a/app/models/group_archived_message.rb
+++ b/app/models/group_archived_message.rb
@@ -5,22 +5,21 @@ class GroupArchivedMessage < ActiveRecord::Base
def self.move_to_inbox!(group_id, topic_id)
GroupArchivedMessage.where(group_id: group_id, topic_id: topic_id).destroy_all
trigger(:move_to_inbox, group_id, topic_id)
- MessageBus.publish("/topic/#{topic_id}", {type: "move_to_inbox"}, group_ids: [group_id])
+ MessageBus.publish("/topic/#{topic_id}", { type: "move_to_inbox" }, group_ids: [group_id])
end
def self.archive!(group_id, topic_id)
GroupArchivedMessage.where(group_id: group_id, topic_id: topic_id).destroy_all
GroupArchivedMessage.create!(group_id: group_id, topic_id: topic_id)
trigger(:archive_message, group_id, topic_id)
- MessageBus.publish("/topic/#{topic_id}", {type: "archived"}, group_ids: [group_id])
+ MessageBus.publish("/topic/#{topic_id}", { type: "archived" }, group_ids: [group_id])
end
-
def self.trigger(event, group_id, topic_id)
group = Group.find_by(id: group_id)
topic = Topic.find_by(id: topic_id)
if group && topic
- DiscourseEvent.trigger(event, {group: group, topic: topic})
+ DiscourseEvent.trigger(event, group: group, topic: topic)
end
end
diff --git a/app/models/group_user.rb b/app/models/group_user.rb
index b5595803901..3c40b079285 100644
--- a/app/models/group_user.rb
+++ b/app/models/group_user.rb
@@ -25,36 +25,41 @@ class GroupUser < ActiveRecord::Base
def set_primary_group
if group.primary_group
- self.class.exec_sql("UPDATE users
- SET primary_group_id = :id
- WHERE id = :user_id",
- id: group.id, user_id: user_id)
+ self.class.exec_sql("
+ UPDATE users
+ SET primary_group_id = :id
+ WHERE id = :user_id",
+ id: group.id, user_id: user_id
+ )
end
end
def remove_primary_group
- self.class.exec_sql("UPDATE users
- SET primary_group_id = NULL
- WHERE id = :user_id AND primary_group_id = :id",
- id: group.id, user_id: user_id)
-
+ self.class.exec_sql("
+ UPDATE users
+ SET primary_group_id = NULL
+ WHERE id = :user_id AND primary_group_id = :id",
+ id: group.id, user_id: user_id
+ )
end
def remove_title
if group.title.present?
- self.class.exec_sql("UPDATE users SET title = NULL
- WHERE title = :title AND id = :id",
- id: user_id,
- title: group.title)
+ self.class.exec_sql("
+ UPDATE users SET title = NULL
+ WHERE title = :title AND id = :id",
+ id: user_id, title: group.title
+ )
end
end
def update_title
if group.title.present?
- self.class.exec_sql("UPDATE users SET title = :title
- WHERE (title IS NULL OR title = '') AND id = :id",
- id: user_id,
- title: group.title)
+ self.class.exec_sql("
+ UPDATE users SET title = :title
+ WHERE (title IS NULL OR title = '') AND id = :id",
+ id: user_id, title: group.title
+ )
end
end
diff --git a/app/models/incoming_link.rb b/app/models/incoming_link.rb
index fd3e9e8e8d9..e7992e2c729 100644
--- a/app/models/incoming_link.rb
+++ b/app/models/incoming_link.rb
@@ -35,11 +35,10 @@ class IncomingLink < ActiveRecord::Base
post_id = opts[:post_id]
post_id ||= Post.where(topic_id: opts[:topic_id],
post_number: opts[:post_number] || 1)
- .pluck(:id).first
+ .pluck(:id).first
cid = current_user ? (current_user.id) : (nil)
-
unless cid && cid == user_id
create(referer: referer,
@@ -53,7 +52,6 @@ class IncomingLink < ActiveRecord::Base
end
-
def referer=(referer)
self.incoming_referer_id = nil
@@ -87,7 +85,6 @@ class IncomingLink < ActiveRecord::Base
end
end
-
# Internal: Update appropriate link counts.
def update_link_counts
exec_sql("UPDATE topics
diff --git a/app/models/incoming_links_report.rb b/app/models/incoming_links_report.rb
index 388ea57cc9c..cf28011b8d4 100644
--- a/app/models/incoming_links_report.rb
+++ b/app/models/incoming_links_report.rb
@@ -30,24 +30,24 @@ class IncomingLinksReport
# Return top 10 users who brought traffic to the site within the last 30 days
def self.report_top_referrers(report)
- report.y_titles[:num_clicks] = I18n.t("reports.#{report.type}.num_clicks")
+ report.y_titles[:num_clicks] = I18n.t("reports.#{report.type}.num_clicks")
report.y_titles[:num_topics] = I18n.t("reports.#{report.type}.num_topics")
- num_clicks = link_count_per_user
+ num_clicks = link_count_per_user
num_topics = topic_count_per_user
- user_id_lookup = User.where(username: num_clicks.keys).select(:id, :username).inject({}) {|sum,v| sum[v.username] = v.id; sum;}
+ user_id_lookup = User.where(username: num_clicks.keys).select(:id, :username).inject({}) { |sum, v| sum[v.username] = v.id; sum; }
report.data = []
num_clicks.each_key do |username|
- report.data << {username: username, user_id: user_id_lookup[username], num_clicks: num_clicks[username], num_topics: num_topics[username]}
+ report.data << { username: username, user_id: user_id_lookup[username], num_clicks: num_clicks[username], num_topics: num_topics[username] }
end
- report.data = report.data.sort_by {|x| x[:num_clicks]}.reverse[0,10]
+ report.data = report.data.sort_by { |x| x[:num_clicks] }.reverse[0, 10]
end
def self.per_user
@per_user_query ||= IncomingLink
- .where('incoming_links.created_at > ? AND incoming_links.user_id IS NOT NULL', 30.days.ago)
- .joins(:user)
- .group('users.username')
+ .where('incoming_links.created_at > ? AND incoming_links.user_id IS NOT NULL', 30.days.ago)
+ .joins(:user)
+ .group('users.username')
end
def self.link_count_per_user
@@ -58,35 +58,34 @@ class IncomingLinksReport
per_user.joins(:post).count("DISTINCT posts.topic_id")
end
-
# Return top 10 domains that brought traffic to the site within the last 30 days
def self.report_top_traffic_sources(report)
- report.y_titles[:num_clicks] = I18n.t("reports.#{report.type}.num_clicks")
+ report.y_titles[:num_clicks] = I18n.t("reports.#{report.type}.num_clicks")
report.y_titles[:num_topics] = I18n.t("reports.#{report.type}.num_topics")
report.y_titles[:num_users] = I18n.t("reports.#{report.type}.num_users")
- num_clicks = link_count_per_domain
+ num_clicks = link_count_per_domain
num_topics = topic_count_per_domain(num_clicks.keys)
report.data = []
num_clicks.each_key do |domain|
- report.data << {domain: domain, num_clicks: num_clicks[domain], num_topics: num_topics[domain]}
+ report.data << { domain: domain, num_clicks: num_clicks[domain], num_topics: num_topics[domain] }
end
- report.data = report.data.sort_by {|x| x[:num_clicks]}.reverse[0,10]
+ report.data = report.data.sort_by { |x| x[:num_clicks] }.reverse[0, 10]
end
- def self.link_count_per_domain(limit=10)
+ def self.link_count_per_domain(limit = 10)
IncomingLink.where('incoming_links.created_at > ?', 30.days.ago)
- .joins(:incoming_referer => :incoming_domain)
- .group('incoming_domains.name')
- .order('count_all DESC')
- .limit(limit).count
+ .joins(incoming_referer: :incoming_domain)
+ .group('incoming_domains.name')
+ .order('count_all DESC')
+ .limit(limit).count
end
def self.per_domain(domains)
IncomingLink
- .joins(:incoming_referer => :incoming_domain)
- .where('incoming_links.created_at > ? AND incoming_domains.name IN (?)', 30.days.ago, domains)
- .group('incoming_domains.name')
+ .joins(incoming_referer: :incoming_domain)
+ .where('incoming_links.created_at > ? AND incoming_domains.name IN (?)', 30.days.ago, domains)
+ .group('incoming_domains.name')
end
def self.topic_count_per_domain(domains)
@@ -94,17 +93,16 @@ class IncomingLinksReport
per_domain(domains).joins(:post).count("DISTINCT posts.topic_id")
end
-
def self.report_top_referred_topics(report)
- report.y_titles[:num_clicks] = I18n.t("reports.#{report.type}.num_clicks")
- num_clicks = link_count_per_topic
- num_clicks = num_clicks.to_a.sort_by {|x| x[1]}.last(10).reverse # take the top 10
+ report.y_titles[:num_clicks] = I18n.t("reports.#{report.type}.num_clicks")
+ num_clicks = link_count_per_topic
+ num_clicks = num_clicks.to_a.sort_by { |x| x[1] }.last(10).reverse # take the top 10
report.data = []
- topics = Topic.select('id, slug, title').where('id in (?)', num_clicks.map {|z| z[0]})
+ topics = Topic.select('id, slug, title').where('id in (?)', num_clicks.map { |z| z[0] })
num_clicks.each do |topic_id, num_clicks_element|
- topic = topics.find {|t| t.id == topic_id}
+ topic = topics.find { |t| t.id == topic_id }
if topic
- report.data << {topic_id: topic_id, topic_title: topic.title, topic_slug: topic.slug, num_clicks: num_clicks_element}
+ report.data << { topic_id: topic_id, topic_title: topic.title, topic_slug: topic.slug, num_clicks: num_clicks_element }
end
end
report.data
@@ -112,8 +110,8 @@ class IncomingLinksReport
def self.link_count_per_topic
IncomingLink.joins(:post)
- .where('incoming_links.created_at > ? AND topic_id IS NOT NULL', 30.days.ago)
- .group('topic_id')
- .count
+ .where('incoming_links.created_at > ? AND topic_id IS NOT NULL', 30.days.ago)
+ .group('topic_id')
+ .count
end
end
diff --git a/app/models/invite.rb b/app/models/invite.rb
index 01b6e970f1d..1955654c2dd 100644
--- a/app/models/invite.rb
+++ b/app/models/invite.rb
@@ -70,29 +70,30 @@ class Invite < ActiveRecord::Base
end
end
- def self.invite_by_email(email, invited_by, topic=nil, group_ids=nil, custom_message=nil)
- create_invite_by_email(email, invited_by, {
+ def self.invite_by_email(email, invited_by, topic = nil, group_ids = nil, custom_message = nil)
+ create_invite_by_email(email, invited_by,
topic: topic,
group_ids: group_ids,
custom_message: custom_message,
send_email: true
- })
+ )
end
# generate invite link
- def self.generate_invite_link(email, invited_by, topic=nil, group_ids=nil)
- invite = create_invite_by_email(email, invited_by, {
+ def self.generate_invite_link(email, invited_by, topic = nil, group_ids = nil)
+ invite = create_invite_by_email(email, invited_by,
topic: topic,
group_ids: group_ids,
send_email: false
- })
- return "#{Discourse.base_url}/invites/#{invite.invite_key}" if invite
+ )
+
+ "#{Discourse.base_url}/invites/#{invite.invite_key}" if invite
end
# Create an invite for a user, supplying an optional topic
#
# Return the previously existing invite if already exists. Returns nil if the invite can't be created.
- def self.create_invite_by_email(email, invited_by, opts=nil)
+ def self.create_invite_by_email(email, invited_by, opts = nil)
opts ||= {}
topic = opts[:topic]
@@ -107,9 +108,9 @@ class Invite < ActiveRecord::Base
end
invite = Invite.with_deleted
- .where(email: lower_email, invited_by_id: invited_by.id)
- .order('created_at DESC')
- .first
+ .where(email: lower_email, invited_by_id: invited_by.id)
+ .order('created_at DESC')
+ .first
if invite && (invite.expired? || invite.deleted_at)
invite.destroy
@@ -161,23 +162,23 @@ class Invite < ActiveRecord::Base
group_ids
end
- def self.find_all_invites_from(inviter, offset=0, limit=SiteSetting.invites_per_page)
+ def self.find_all_invites_from(inviter, offset = 0, limit = SiteSetting.invites_per_page)
Invite.where(invited_by_id: inviter.id)
- .where('invites.email IS NOT NULL')
- .includes(:user => :user_stat)
- .order('CASE WHEN invites.user_id IS NOT NULL THEN 0 ELSE 1 END',
+ .where('invites.email IS NOT NULL')
+ .includes(user: :user_stat)
+ .order('CASE WHEN invites.user_id IS NOT NULL THEN 0 ELSE 1 END',
'user_stats.time_read DESC',
'invites.redeemed_at DESC')
- .limit(limit)
- .offset(offset)
- .references('user_stats')
+ .limit(limit)
+ .offset(offset)
+ .references('user_stats')
end
- def self.find_pending_invites_from(inviter, offset=0)
+ def self.find_pending_invites_from(inviter, offset = 0)
find_all_invites_from(inviter, offset).where('invites.user_id IS NULL').order('invites.created_at DESC')
end
- def self.find_redeemed_invites_from(inviter, offset=0)
+ def self.find_redeemed_invites_from(inviter, offset = 0)
find_all_invites_from(inviter, offset).where('invites.user_id IS NOT NULL').order('invites.redeemed_at DESC')
end
diff --git a/app/models/invite_redeemer.rb b/app/models/invite_redeemer.rb
index 5de389af3b7..9b68b8b03ad 100644
--- a/app/models/invite_redeemer.rb
+++ b/app/models/invite_redeemer.rb
@@ -18,7 +18,7 @@ InviteRedeemer = Struct.new(:invite, :username, :name, :password, :user_custom_f
end
# extracted from User cause it is very specific to invites
- def self.create_user_from_invite(invite, username, name, password=nil, user_custom_fields=nil)
+ def self.create_user_from_invite(invite, username, name, password = nil, user_custom_fields = nil)
if username && UsernameValidator.new(username).valid_format? && User.username_available?(username)
available_username = username
else
@@ -94,7 +94,6 @@ InviteRedeemer = Struct.new(:invite, :username, :name, :password, :user_custom_f
User.where(admin: false).find_by_email(invite.email)
end
-
def add_to_private_topics_if_invited
invite.topics.private_messages.each do |t|
t.topic_allowed_users.create(user_id: invited_user.id)
@@ -102,7 +101,7 @@ InviteRedeemer = Struct.new(:invite, :username, :name, :password, :user_custom_f
end
def add_user_to_invited_topics
- Invite.where('invites.email = ? and invites.id != ?', invite.email, invite.id).includes(:topics).where(topics: {archetype: Archetype::private_message}).each do |i|
+ Invite.where('invites.email = ? and invites.id != ?', invite.email, invite.id).includes(:topics).where(topics: { archetype: Archetype::private_message }).each do |i|
i.topics.each do |t|
t.topic_allowed_users.create(user_id: invited_user.id)
end
@@ -130,8 +129,8 @@ InviteRedeemer = Struct.new(:invite, :username, :name, :password, :user_custom_f
def notify_invitee
if inviter = invite.invited_by
- inviter.notifications.create(notification_type: Notification.types[:invitee_accepted],
- data: {display_username: invited_user.username}.to_json)
+ inviter.notifications.create(notification_type: Notification.types[:invitee_accepted],
+ data: { display_username: invited_user.username }.to_json)
end
end
diff --git a/app/models/locale_site_setting.rb b/app/models/locale_site_setting.rb
index 1cd9246418e..607a8e7cddd 100644
--- a/app/models/locale_site_setting.rb
+++ b/app/models/locale_site_setting.rb
@@ -9,7 +9,7 @@ class LocaleSiteSetting < EnumSiteSetting
def self.values
supported_locales.map do |l|
lang = language_names[l] || language_names[l[0..1]]
- {name: lang ? lang['nativeName'] : l, value: l}
+ { name: lang ? lang['nativeName'] : l, value: l }
end
end
@@ -25,7 +25,7 @@ class LocaleSiteSetting < EnumSiteSetting
def self.supported_locales
@lock.synchronize do
- @supported_locales ||= Dir.glob( File.join(Rails.root, 'config', 'locales', 'client.*.yml') ).map {|x| x.split('.')[-2]}.sort
+ @supported_locales ||= Dir.glob(File.join(Rails.root, 'config', 'locales', 'client.*.yml')).map { |x| x.split('.')[-2] }.sort
end
end
diff --git a/app/models/notification.rb b/app/models/notification.rb
index 7db7a5b8bd3..e238bd1f6ea 100644
--- a/app/models/notification.rb
+++ b/app/models/notification.rb
@@ -8,9 +8,9 @@ class Notification < ActiveRecord::Base
validates_presence_of :notification_type
scope :unread, lambda { where(read: false) }
- scope :recent, lambda { |n=nil| n ||= 10; order('notifications.created_at desc').limit(n) }
+ scope :recent, lambda { |n = nil| n ||= 10; order('notifications.created_at desc').limit(n) }
scope :visible , lambda { joins('LEFT JOIN topics ON notifications.topic_id = topics.id')
- .where('topics.id IS NULL OR topics.deleted_at IS NULL') }
+ .where('topics.id IS NULL OR topics.deleted_at IS NULL') }
attr_accessor :skip_send_email
@@ -76,20 +76,20 @@ class Notification < ActiveRecord::Base
def self.read(user, notification_ids)
count = Notification.where(user_id: user.id)
- .where(id: notification_ids)
- .where(read: false)
- .update_all(read: true)
+ .where(id: notification_ids)
+ .where(read: false)
+ .update_all(read: true)
user.publish_notifications_state if count > 0
end
def self.interesting_after(min_date)
- result = where("created_at > ?", min_date)
- .includes(:topic)
- .visible
- .unread
- .limit(20)
- .order("CASE WHEN notification_type = #{Notification.types[:replied]} THEN 1
+ result = where("created_at > ?", min_date)
+ .includes(:topic)
+ .visible
+ .unread
+ .limit(20)
+ .order("CASE WHEN notification_type = #{Notification.types[:replied]} THEN 1
WHEN notification_type = #{Notification.types[:mentioned]} THEN 2
ELSE 3
END, created_at DESC").to_a
@@ -107,7 +107,7 @@ class Notification < ActiveRecord::Base
seen[r.notification_type] << r.topic_id
end
end
- result.reject! {|r| to_remove.include?(r.id) }
+ result.reject! { |r| to_remove.include?(r.id) }
end
result
@@ -145,9 +145,9 @@ class Notification < ActiveRecord::Base
count ||= 10
notifications = user.notifications
- .visible
- .recent(count)
- .includes(:topic)
+ .visible
+ .recent(count)
+ .includes(:topic)
if user.user_option.like_notification_frequency == UserOption.like_notification_frequency_type[:never]
notifications = notifications.where('notification_type <> ?', Notification.types[:liked])
@@ -165,7 +165,7 @@ class Notification < ActiveRecord::Base
NOT read
ORDER BY n.id ASC
LIMIT #{count.to_i}
- ").values.map do |x,_|
+ ").values.map do |x, _|
x.to_i
end
@@ -178,7 +178,7 @@ class Notification < ActiveRecord::Base
.limit(count)
end
- notifications.uniq(&:id).sort do |x,y|
+ notifications.uniq(&:id).sort do |x, y|
if x.unread_pm? && !y.unread_pm?
-1
elsif y.unread_pm? && !x.unread_pm?
diff --git a/app/models/optimized_image.rb b/app/models/optimized_image.rb
index e665a8f89d3..c290f93aca5 100644
--- a/app/models/optimized_image.rb
+++ b/app/models/optimized_image.rb
@@ -9,7 +9,7 @@ class OptimizedImage < ActiveRecord::Base
# BUMP UP if optimized image algorithm changes
VERSION = 1
- def self.create_for(upload, width, height, opts={})
+ def self.create_for(upload, width, height, opts = {})
return unless width > 0 && height > 0
return if upload.try(:sha1).blank?
@@ -90,7 +90,7 @@ class OptimizedImage < ActiveRecord::Base
end
def local?
- !(url =~ /^(https?:)?\/\//)
+ !(url =~ /^(https?:)?\/\//)
end
def self.safe_path?(path)
@@ -111,7 +111,7 @@ class OptimizedImage < ActiveRecord::Base
SiteSetting.strip_image_metadata ? "thumbnail" : "resize"
end
- def self.resize_instructions(from, to, dimensions, opts={})
+ def self.resize_instructions(from, to, dimensions, opts = {})
ensure_safe_paths!(from, to)
# NOTE: ORDER is important!
@@ -132,7 +132,7 @@ class OptimizedImage < ActiveRecord::Base
}
end
- def self.resize_instructions_animated(from, to, dimensions, opts={})
+ def self.resize_instructions_animated(from, to, dimensions, opts = {})
ensure_safe_paths!(from, to)
%W{
@@ -145,7 +145,7 @@ class OptimizedImage < ActiveRecord::Base
}
end
- def self.crop_instructions(from, to, dimensions, opts={})
+ def self.crop_instructions(from, to, dimensions, opts = {})
ensure_safe_paths!(from, to)
%W{
@@ -164,7 +164,7 @@ class OptimizedImage < ActiveRecord::Base
}
end
- def self.crop_instructions_animated(from, to, dimensions, opts={})
+ def self.crop_instructions_animated(from, to, dimensions, opts = {})
ensure_safe_paths!(from, to)
%W{
@@ -177,7 +177,7 @@ class OptimizedImage < ActiveRecord::Base
}
end
- def self.downsize_instructions(from, to, dimensions, opts={})
+ def self.downsize_instructions(from, to, dimensions, opts = {})
ensure_safe_paths!(from, to)
%W{
@@ -193,24 +193,24 @@ class OptimizedImage < ActiveRecord::Base
}
end
- def self.downsize_instructions_animated(from, to, dimensions, opts={})
+ def self.downsize_instructions_animated(from, to, dimensions, opts = {})
resize_instructions_animated(from, to, dimensions, opts)
end
- def self.resize(from, to, width, height, opts={})
+ def self.resize(from, to, width, height, opts = {})
optimize("resize", from, to, "#{width}x#{height}", opts)
end
- def self.crop(from, to, width, height, opts={})
+ def self.crop(from, to, width, height, opts = {})
opts[:width] = width
optimize("crop", from, to, "#{width}x#{height}", opts)
end
- def self.downsize(from, to, dimensions, opts={})
+ def self.downsize(from, to, dimensions, opts = {})
optimize("downsize", from, to, dimensions, opts)
end
- def self.optimize(operation, from, to, dimensions, opts={})
+ def self.optimize(operation, from, to, dimensions, opts = {})
method_name = "#{operation}_instructions"
if !!opts[:allow_animation] && (from =~ /\.GIF$/i || opts[:filename] =~ /\.GIF$/i)
method_name += "_animated"
@@ -233,7 +233,7 @@ class OptimizedImage < ActiveRecord::Base
false
end
- def self.migrate_to_new_scheme(limit=nil)
+ def self.migrate_to_new_scheme(limit = nil)
problems = []
if SiteSetting.migrate_to_new_scheme
diff --git a/app/models/permalink.rb b/app/models/permalink.rb
index e7427d20bad..4bfaa5a9cd5 100644
--- a/app/models/permalink.rb
+++ b/app/models/permalink.rb
@@ -44,8 +44,8 @@ class Permalink < ActiveRecord::Base
def normalize(url)
return url unless @rules
- @rules.each do |(regex,sub)|
- url = url.sub(regex,sub)
+ @rules.each do |(regex, sub)|
+ url = url.sub(regex, sub)
end
url
@@ -56,10 +56,10 @@ class Permalink < ActiveRecord::Base
def self.normalize_url(url)
if url
url = url.strip
- url = url[1..-1] if url[0,1] == '/'
+ url = url[1..-1] if url[0, 1] == '/'
end
- normalizations = SiteSetting.permalink_normalizations
+ normalizations = SiteSetting.permalink_normalizations
@normalizer = Normalizer.new(normalizations) unless @normalizer && @normalizer.source == normalizations
@normalizer.normalize(url)
@@ -81,10 +81,10 @@ class Permalink < ActiveRecord::Base
nil
end
- def self.filter_by(url=nil)
+ def self.filter_by(url = nil)
permalinks = Permalink
- .includes(:topic, :post, :category)
- .order('permalinks.created_at desc')
+ .includes(:topic, :post, :category)
+ .order('permalinks.created_at desc')
permalinks.where!('url ILIKE :url OR external_url ILIKE :url', url: "%#{url}%") if url.present?
permalinks.limit!(100)
diff --git a/app/models/plugin_store.rb b/app/models/plugin_store.rb
index 5a7675344ec..aebf7f3217e 100644
--- a/app/models/plugin_store.rb
+++ b/app/models/plugin_store.rb
@@ -7,7 +7,7 @@ class PluginStore
end
def self.set(plugin_name, key, value)
- hash = {plugin_name: plugin_name, key: key}
+ hash = { plugin_name: plugin_name, key: key }
row = PluginStoreRow.find_by(hash) || PluginStoreRow.new(hash)
row.type_name = determine_type(value)
@@ -34,7 +34,7 @@ class PluginStore
if item.is_a? Hash
ActiveSupport::HashWithIndifferentAccess.new item
elsif item.is_a? Array
- item.map { |subitem| map_json subitem}
+ item.map { |subitem| map_json subitem }
else
item
end
diff --git a/app/models/post.rb b/app/models/post.rb
index ad2b98e2f45..a4df5df7787 100644
--- a/app/models/post.rb
+++ b/app/models/post.rb
@@ -79,7 +79,7 @@ class Post < ActiveRecord::Base
scope :private_posts, -> { joins(:topic).where('topics.archetype = ?', Archetype.private_message) }
scope :with_topic_subtype, ->(subtype) { joins(:topic).where('topics.subtype = ?', subtype) }
scope :visible, -> { joins(:topic).where('topics.visible = true').where(hidden: false) }
- scope :secured, lambda { |guardian| where('posts.post_type in (?)', Topic.visible_post_types(guardian && guardian.user))}
+ scope :secured, lambda { |guardian| where('posts.post_type in (?)', Topic.visible_post_types(guardian && guardian.user)) }
scope :for_mailing_list, ->(user, since) {
q = created_since(since)
.joins(:topic)
@@ -154,7 +154,7 @@ class Post < ActiveRecord::Base
end
end
- def trash!(trashed_by=nil)
+ def trash!(trashed_by = nil)
self.topic_links.each(&:destroy)
super(trashed_by)
end
@@ -182,7 +182,7 @@ class Post < ActiveRecord::Base
def matches_recent_post?
post_id = $redis.get(unique_post_key)
- post_id != nil and post_id.to_i != id
+ post_id != (nil) && post_id.to_i != (id)
end
def raw_hash
@@ -218,24 +218,24 @@ class Post < ActiveRecord::Base
# case we can skip the rendering pipeline.
return raw if cook_method == Post.cook_methods[:raw_html]
- cooked = nil
- if cook_method == Post.cook_methods[:email]
- cooked = EmailCook.new(raw).cook
- else
- cloned = args.dup
- cloned[1] ||= {}
+ cooked =
+ if cook_method == Post.cook_methods[:email]
+ EmailCook.new(raw).cook
+ else
+ cloned = args.dup
+ cloned[1] ||= {}
- post_user = self.user
- cloned[1][:user_id] = post_user.id if post_user
+ post_user = self.user
+ cloned[1][:user_id] = post_user.id if post_user
- cooked = if add_nofollow?
- post_analyzer.cook(*args)
- else
- # At trust level 3, we don't apply nofollow to links
- cloned[1][:omit_nofollow] = true
- post_analyzer.cook(*cloned)
- end
- end
+ if add_nofollow?
+ post_analyzer.cook(*args)
+ else
+ # At trust level 3, we don't apply nofollow to links
+ cloned[1][:omit_nofollow] = true
+ post_analyzer.cook(*cloned)
+ end
+ end
new_cooked = Plugin::Filter.apply(:after_post_cook, self, cooked)
@@ -267,10 +267,10 @@ class Post < ActiveRecord::Base
def whitelisted_spam_hosts
hosts = SiteSetting
- .white_listed_spam_host_domains
- .split('|')
- .map{|h| h.strip}
- .reject{|h| !h.include?('.')}
+ .white_listed_spam_host_domains
+ .split('|')
+ .map { |h| h.strip }
+ .reject { |h| !h.include?('.') }
hosts << GlobalSetting.hostname
hosts << RailsMultisite::ConnectionManagement.current_hostname
@@ -290,9 +290,9 @@ class Post < ActiveRecord::Base
return hosts if hosts.length == 0
TopicLink.where(domain: hosts.keys, user_id: acting_user.id)
- .group(:domain, :post_id)
- .count
- .each_key do |tuple|
+ .group(:domain, :post_id)
+ .count
+ .each_key do |tuple|
domain = tuple[0]
hosts[domain] = (hosts[domain] || 0) + 1
end
@@ -319,7 +319,7 @@ class Post < ActiveRecord::Base
order('sort_order desc, post_number desc')
end
- def self.summary(topic_id=nil)
+ def self.summary(topic_id = nil)
# PERF: if you pass in nil it is WAY slower
# pg chokes getting a reasonable plan
topic_id = topic_id ? topic_id.to_i : "posts.topic_id"
@@ -410,7 +410,7 @@ class Post < ActiveRecord::Base
"#{Discourse.base_url}#{url}"
end
- def url(opts=nil)
+ def url(opts = nil)
opts ||= {}
if topic
@@ -424,7 +424,7 @@ class Post < ActiveRecord::Base
"#{Discourse.base_url}/email/unsubscribe/#{UnsubscribeKey.create_key_for(user, self)}"
end
- def self.url(slug, topic_id, post_number, opts=nil)
+ def self.url(slug, topic_id, post_number, opts = nil)
opts ||= {}
result = "/t/"
@@ -434,12 +434,12 @@ class Post < ActiveRecord::Base
end
def self.urls(post_ids)
- ids = post_ids.map{|u| u}
+ ids = post_ids.map { |u| u }
if ids.length > 0
urls = {}
Topic.joins(:posts).where('posts.id' => ids).
- select(['posts.id as post_id','post_number', 'topics.slug', 'topics.title', 'topics.id']).
- each do |t|
+ select(['posts.id as post_id', 'post_number', 'topics.slug', 'topics.title', 'topics.id']).
+ each do |t|
urls[t.post_id.to_i] = url(t.slug, t.id, t.post_number)
end
urls
@@ -448,24 +448,24 @@ class Post < ActiveRecord::Base
end
end
- def revise(updated_by, changes={}, opts={})
+ def revise(updated_by, changes = {}, opts = {})
PostRevisor.new(self).revise!(updated_by, changes, opts)
end
def self.rebake_old(limit)
problems = []
Post.where('baked_version IS NULL OR baked_version < ?', BAKED_VERSION)
- .limit(limit).each do |p|
+ .limit(limit).each do |p|
begin
p.rebake!
rescue => e
- problems << {post: p, ex: e}
+ problems << { post: p, ex: e }
end
end
problems
end
- def rebake!(opts=nil)
+ def rebake!(opts = nil)
opts ||= {}
new_cooked = cook(raw, topic_id: topic_id, invalidate_oneboxes: opts.fetch(:invalidate_oneboxes, false))
@@ -485,14 +485,14 @@ class Post < ActiveRecord::Base
new_cooked != old_cooked
end
- def set_owner(new_user, actor, skip_revision=false)
+ def set_owner(new_user, actor, skip_revision = false)
return if user_id == new_user.id
edit_reason = I18n.t('change_owner.post_revision_text',
old_user: (self.user.username_lower rescue nil) || I18n.t('change_owner.deleted_user'),
new_user: new_user.username_lower
)
- revise(actor, {raw: self.raw, user_id: new_user.id, edit_reason: edit_reason}, {bypass_bump: true, skip_revision: skip_revision})
+ revise(actor, { raw: self.raw, user_id: new_user.id, edit_reason: edit_reason }, bypass_bump: true, skip_revision: skip_revision)
if post_number == topic.highest_post_number
topic.update_columns(last_post_user_id: new_user.id)
@@ -516,7 +516,7 @@ class Post < ActiveRecord::Base
# This calculates the geometric mean of the post timings and stores it along with
# each post.
- def self.calculate_avg_time(min_topic_age=nil)
+ def self.calculate_avg_time(min_topic_age = nil)
retry_lock_error do
builder = SqlBuilder.new("UPDATE posts
SET avg_time = (x.gmean / 1000)
@@ -577,7 +577,6 @@ class Post < ActiveRecord::Base
self.quote_count = temp_collector.size
end
-
def save_reply_relationships
add_to_quoted_post_numbers(reply_to_post_number)
return if self.quoted_post_numbers.blank?
@@ -602,7 +601,7 @@ class Post < ActiveRecord::Base
DiscourseEvent.trigger(:after_trigger_post_process, self)
end
- def self.public_posts_count_per_day(start_date, end_date, category_id=nil)
+ def self.public_posts_count_per_day(start_date, end_date, category_id = nil)
result = public_posts.where('posts.created_at >= ? AND posts.created_at <= ?', start_date, end_date)
result = result.where('topics.category_id = ?', category_id) if category_id
result.group('date(posts.created_at)').order('date(posts.created_at)').count
@@ -612,7 +611,7 @@ class Post < ActiveRecord::Base
private_posts.with_topic_subtype(topic_subtype).where('posts.created_at >= ? AND posts.created_at <= ?', start_date, end_date).group('date(posts.created_at)').order('date(posts.created_at)').count
end
- def reply_history(max_replies=100, guardian=nil)
+ def reply_history(max_replies = 100, guardian = nil)
post_ids = Post.exec_sql("WITH RECURSIVE breadcrumb(id, reply_to_post_number) AS (
SELECT p.id, p.reply_to_post_number FROM posts AS p
WHERE p.id = :post_id
@@ -622,11 +621,11 @@ class Post < ActiveRecord::Base
AND p.topic_id = :topic_id
) SELECT id from breadcrumb ORDER by id", post_id: id, topic_id: topic_id).to_a
- post_ids.map! {|r| r['id'].to_i }
- .reject! {|post_id| post_id == id}
+ post_ids.map! { |r| r['id'].to_i }
+ .reject! { |post_id| post_id == id }
# [1,2,3][-10,-1] => nil
- post_ids = (post_ids[(0-max_replies)..-1] || post_ids)
+ post_ids = (post_ids[(0 - max_replies)..-1] || post_ids)
Post.secured(guardian).where(id: post_ids).includes(:user, :topic).order(:id).to_a
end
diff --git a/app/models/post_action.rb b/app/models/post_action.rb
index 73fcf5ed37c..73a7e583ff8 100644
--- a/app/models/post_action.rb
+++ b/app/models/post_action.rb
@@ -42,27 +42,27 @@ class PostAction < ActiveRecord::Base
nil
end
- def self.flag_count_by_date(start_date, end_date, category_id=nil)
+ def self.flag_count_by_date(start_date, end_date, category_id = nil)
result = where('post_actions.created_at >= ? AND post_actions.created_at <= ?', start_date, end_date)
result = result.where(post_action_type_id: PostActionType.flag_types.values)
result = result.joins(post: :topic).where("topics.category_id = ?", category_id) if category_id
result.group('date(post_actions.created_at)')
- .order('date(post_actions.created_at)')
- .count
+ .order('date(post_actions.created_at)')
+ .count
end
def self.update_flagged_posts_count
posts_flagged_count = PostAction.active
- .flags
- .joins(post: :topic)
- .where('posts.deleted_at' => nil)
- .where('topics.deleted_at' => nil)
- .where('posts.user_id > 0')
- .count('DISTINCT posts.id')
+ .flags
+ .joins(post: :topic)
+ .where('posts.deleted_at' => nil)
+ .where('topics.deleted_at' => nil)
+ .where('posts.user_id > 0')
+ .count('DISTINCT posts.id')
$redis.set('posts_flagged_count', posts_flagged_count)
user_ids = User.staff.pluck(:id)
- MessageBus.publish('/flagged_counts', { total: posts_flagged_count }, { user_ids: user_ids })
+ MessageBus.publish('/flagged_counts', { total: posts_flagged_count }, user_ids: user_ids)
end
def self.flagged_posts_count
@@ -107,7 +107,6 @@ SQL
(map[row.topic_id] ||= []) << row.post_number
end
-
map
end
@@ -128,21 +127,21 @@ SQL
user_actions
end
- def self.count_per_day_for_type(post_action_type, opts=nil)
+ def self.count_per_day_for_type(post_action_type, opts = nil)
opts ||= {}
result = unscoped.where(post_action_type_id: post_action_type)
result = result.where('post_actions.created_at >= ?', opts[:start_date] || (opts[:since_days_ago] || 30).days.ago)
result = result.where('post_actions.created_at <= ?', opts[:end_date]) if opts[:end_date]
result = result.joins(post: :topic).where('topics.category_id = ?', opts[:category_id]) if opts[:category_id]
result.group('date(post_actions.created_at)')
- .order('date(post_actions.created_at)')
- .count
+ .order('date(post_actions.created_at)')
+ .count
end
- def self.agree_flags!(post, moderator, delete_post=false)
+ def self.agree_flags!(post, moderator, delete_post = false)
actions = PostAction.active
- .where(post_id: post.id)
- .where(post_action_type_id: PostActionType.flag_types.values)
+ .where(post_id: post.id)
+ .where(post_action_type_id: PostActionType.flag_types.values)
trigger_spam = false
actions.each do |action|
@@ -169,7 +168,7 @@ SQL
end
actions = PostAction.where(post_id: post.id)
- .where(post_action_type_id: action_type_ids)
+ .where(post_action_type_id: action_type_ids)
actions.each do |action|
action.disagreed_at = Time.zone.now
@@ -186,10 +185,10 @@ SQL
update_flagged_posts_count
end
- def self.defer_flags!(post, moderator, delete_post=false)
+ def self.defer_flags!(post, moderator, delete_post = false)
actions = PostAction.active
- .where(post_id: post.id)
- .where(post_action_type_id: PostActionType.flag_types.values)
+ .where(post_id: post.id)
+ .where(post_action_type_id: PostActionType.flag_types.values)
actions.each do |action|
action.deferred_at = Time.zone.now
@@ -202,7 +201,7 @@ SQL
update_flagged_posts_count
end
- def add_moderator_post_if_needed(moderator, disposition, delete_post=false)
+ def add_moderator_post_if_needed(moderator, disposition, delete_post = false)
return if !SiteSetting.auto_respond_to_flag_actions
return if related_post.nil? || related_post.topic.nil?
return if staff_already_replied?(related_post.topic)
@@ -237,33 +236,35 @@ SQL
opts[:target_group_names] = target_moderators
else
opts[:subtype] = TopicSubtype.notify_user
- opts[:target_usernames] = if post_action_type == :notify_user
- post.user.username
- elsif post_action_type != :notify_moderators
- # this is a hack to allow a PM with no recipients, we should think through
- # a cleaner technique, a PM with myself is valid for flagging
- 'x'
- end
+
+ opts[:target_usernames] =
+ if post_action_type == :notify_user
+ post.user.username
+ elsif post_action_type != :notify_moderators
+ # this is a hack to allow a PM with no recipients, we should think through
+ # a cleaner technique, a PM with myself is valid for flagging
+ 'x'
+ end
end
PostCreator.new(user, opts).create.try(:id)
end
- def self.limit_action!(user,post,post_action_type_id)
+ def self.limit_action!(user, post, post_action_type_id)
RateLimiter.new(user, "post_action-#{post.id}_#{post_action_type_id}", 4, 1.minute).performed!
end
def self.act(user, post, post_action_type_id, opts = {})
- limit_action!(user,post,post_action_type_id)
+ limit_action!(user, post, post_action_type_id)
related_post_id = create_message_for_post_action(user, post, post_action_type_id, opts)
staff_took_action = opts[:take_action] || false
- targets_topic = if opts[:flag_topic] && post.topic
- post.topic.reload
- post.topic.posts_count != 1
- end
+ targets_topic =
+ if opts[:flag_topic] && post.topic
+ post.topic.reload.posts_count != 1
+ end
where_attrs = {
post_id: post.id,
@@ -279,9 +280,9 @@ SQL
# First try to revive a trashed record
post_action = PostAction.where(where_attrs)
- .with_deleted
- .where("deleted_at IS NOT NULL")
- .first
+ .with_deleted
+ .where("deleted_at IS NOT NULL")
+ .first
if post_action
post_action.recover!
@@ -324,7 +325,7 @@ SQL
def self.remove_act(user, post, post_action_type_id)
- limit_action!(user,post,post_action_type_id)
+ limit_action!(user, post, post_action_type_id)
finder = PostAction.where(post_id: post.id, user_id: user.id, post_action_type_id: post_action_type_id)
finder = finder.with_deleted.includes(:post) if user.try(:staff?)
@@ -374,10 +375,10 @@ SQL
multiplier = SiteSetting.send("tl#{user.trust_level}_additional_likes_per_day_multiplier").to_f
multiplier = 1.0 if multiplier < 1.0
- limit = (limit * multiplier ).to_i
+ limit = (limit * multiplier).to_i
end
- @rate_limiter = RateLimiter.new(user, "create_#{type}",limit, 1.day.to_i)
+ @rate_limiter = RateLimiter.new(user, "create_#{type}", limit, 1.day.to_i)
return @rate_limiter
end
end
@@ -386,12 +387,12 @@ SQL
before_create do
post_action_type_ids = is_flag? ? PostActionType.flag_types.values : post_action_type_id
raise AlreadyActed if PostAction.where(user_id: user_id)
- .where(post_id: post_id)
- .where(post_action_type_id: post_action_type_ids)
- .where(deleted_at: nil)
- .where(disagreed_at: nil)
- .where(targets_topic: targets_topic)
- .exists?
+ .where(post_id: post_id)
+ .where(post_action_type_id: post_action_type_ids)
+ .where(deleted_at: nil)
+ .where(disagreed_at: nil)
+ .where(targets_topic: targets_topic)
+ .exists?
end
# Returns the flag counts for a post, taking into account that some users
@@ -427,8 +428,8 @@ SQL
# Update denormalized counts
column = "#{post_action_type_key}_count"
count = PostAction.where(post_id: post_id)
- .where(post_action_type_id: post_action_type_id)
- .count
+ .where(post_action_type_id: post_action_type_id)
+ .count
# We probably want to refactor this method to something cleaner.
case post_action_type_key
@@ -438,18 +439,17 @@ SQL
when :like
# 'like_score' is weighted higher for staff accounts
score = PostAction.joins(:user)
- .where(post_id: post_id)
- .sum("CASE WHEN users.moderator OR users.admin THEN #{SiteSetting.staff_like_weight} ELSE 1 END")
+ .where(post_id: post_id)
+ .sum("CASE WHEN users.moderator OR users.admin THEN #{SiteSetting.staff_like_weight} ELSE 1 END")
Post.where(id: post_id).update_all ["like_count = :count, like_score = :score", count: count, score: score]
else
Post.where(id: post_id).update_all ["#{column} = ?", count]
end
-
topic_id = Post.with_deleted.where(id: post_id).pluck(:topic_id).first
# topic_user
- if [:like,:bookmark].include? post_action_type_key
+ if [:like, :bookmark].include? post_action_type_key
TopicUser.update_post_action_cache(user_id: user_id,
topic_id: topic_id,
post_action_type: post_action_type_key)
@@ -501,12 +501,12 @@ SQL
return if topic.nil? || topic.closed?
flags = PostAction.active
- .flags
- .joins(:post)
- .where("posts.topic_id = ?", topic.id)
- .where("post_actions.user_id > 0")
- .group("post_actions.user_id")
- .pluck("post_actions.user_id, COUNT(post_id)")
+ .flags
+ .joins(:post)
+ .where("posts.topic_id = ?", topic.id)
+ .where("post_actions.user_id > 0")
+ .group("post_actions.user_id")
+ .pluck("post_actions.user_id, COUNT(post_id)")
# we need a minimum number of unique flaggers
return if flags.count < SiteSetting.num_flaggers_to_close_topic
@@ -535,7 +535,7 @@ SQL
acting_user.has_trust_level?(TrustLevel[3]) &&
post.user.trust_level == TrustLevel[0]
- hide_post!(post, post_action_type, Post.hidden_reasons[:flagged_by_tl3_user])
+ hide_post!(post, post_action_type, Post.hidden_reasons[:flagged_by_tl3_user])
elsif PostActionType.auto_action_flag_types.include?(post_action_type) &&
SiteSetting.flags_required_to_hide_post > 0
@@ -548,7 +548,7 @@ SQL
end
end
- def self.hide_post!(post, post_action_type, reason=nil)
+ def self.hide_post!(post, post_action_type, reason = nil)
return if post.hidden
unless reason
diff --git a/app/models/post_analyzer.rb b/app/models/post_analyzer.rb
index 53296c8e596..e0105cce4eb 100644
--- a/app/models/post_analyzer.rb
+++ b/app/models/post_analyzer.rb
@@ -3,7 +3,7 @@ require_dependency 'oneboxer'
class PostAnalyzer
def initialize(raw, topic_id)
- @raw = raw
+ @raw = raw
@topic_id = topic_id
@found_oneboxes = false
end
@@ -51,11 +51,11 @@ class PostAnalyzer
return @raw_mentions if @raw_mentions.present?
raw_mentions = cooked_stripped.css('.mention, .mention-group').map do |e|
- if name = e.inner_text
- name = name[1..-1]
- name.downcase! if name
- name
- end
+ if name = e.inner_text
+ name = name[1..-1]
+ name.downcase! if name
+ name
+ end
end
raw_mentions.compact!
diff --git a/app/models/post_mover.rb b/app/models/post_mover.rb
index 1d70519eaf6..06ac7b5ebcf 100644
--- a/app/models/post_mover.rb
+++ b/app/models/post_mover.rb
@@ -19,7 +19,7 @@ class PostMover
end
end
- def to_new_topic(title, category_id=nil)
+ def to_new_topic(title, category_id = nil)
@move_type = PostMover.move_types[:new_topic]
post = Post.find_by(id: post_ids.first)
diff --git a/app/models/post_timing.rb b/app/models/post_timing.rb
index 8f682090204..c006d29508e 100644
--- a/app/models/post_timing.rb
+++ b/app/models/post_timing.rb
@@ -5,7 +5,6 @@ class PostTiming < ActiveRecord::Base
validates_presence_of :post_number
validates_presence_of :msecs
-
def self.pretend_read(topic_id, actual_read_post_number, pretend_read_post_number)
# This is done in SQL cause the logic is quite tricky and we want to do this in one db hit
#
@@ -39,9 +38,9 @@ class PostTiming < ActiveRecord::Base
AND post_number = :post_number)",
args)
rescue PG::UniqueViolation
- # concurrency is hard, we are not running serialized so this can possibly
- # still happen, if it happens we just don't care, its an invalid record anyway
- return
+ # concurrency is hard, we are not running serialized so this can possibly
+ # still happen, if it happens we just don't care, its an invalid record anyway
+ return
end
Post.where(['topic_id = :topic_id and post_number = :post_number', args]).update_all 'reads = reads + 1'
@@ -60,7 +59,6 @@ class PostTiming < ActiveRecord::Base
record_new_timing(args) if rows == 0
end
-
def self.destroy_for(user_id, topic_ids)
PostTiming.transaction do
PostTiming.delete_all(['user_id = ? and topic_id in (?)', user_id, topic_ids])
@@ -68,9 +66,9 @@ class PostTiming < ActiveRecord::Base
end
end
- MAX_READ_TIME_PER_BATCH = 60*1000.0
+ MAX_READ_TIME_PER_BATCH = 60 * 1000.0
- def self.process_timings(current_user, topic_id, topic_time, timings, opts={})
+ def self.process_timings(current_user, topic_id, topic_time, timings, opts = {})
current_user.user_stat.update_time_read!
max_time_per_post = ((Time.now - current_user.created_at) * 1000.0)
@@ -89,9 +87,8 @@ class PostTiming < ActiveRecord::Base
timings.each_with_index do |(post_number, time), index|
- join_table << "SELECT #{topic_id.to_i} topic_id, #{post_number.to_i} post_number,
- #{current_user.id.to_i} user_id, #{time.to_i} msecs, #{index} idx"
-
+ join_table << "SELECT #{topic_id.to_i} topic_id, #{post_number.to_i} post_number,
+ #{current_user.id.to_i} user_id, #{time.to_i} msecs, #{index} idx"
highest_seen = post_number.to_i > highest_seen ?
post_number.to_i : highest_seen
@@ -113,19 +110,19 @@ SQL
result.type_map = SqlBuilder.pg_type_map
existing = Set.new(result.column_values(0))
- timings.each_with_index do |(post_number, time),index|
+ timings.each_with_index do |(post_number, time), index|
unless existing.include?(index)
PostTiming.record_new_timing(topic_id: topic_id,
- post_number: post_number,
- user_id: current_user.id,
- msecs: time)
+ post_number: post_number,
+ user_id: current_user.id,
+ msecs: time)
end
end
end
total_changed = 0
if timings.length > 0
- total_changed = Notification.mark_posts_read(current_user, topic_id, timings.map{|t| t[0]})
+ total_changed = Notification.mark_posts_read(current_user, topic_id, timings.map { |t| t[0] })
end
topic_time = max_time_per_post if topic_time > max_time_per_post
diff --git a/app/models/queued_post.rb b/app/models/queued_post.rb
index e1736c85488..f7b3147e8be 100644
--- a/app/models/queued_post.rb
+++ b/app/models/queued_post.rb
@@ -51,7 +51,7 @@ class QueuedPost < ActiveRecord::Base
end
def create_options
- opts = {raw: raw}
+ opts = { raw: raw }
opts.merge!(post_options.symbolize_keys)
opts[:cooking_options].symbolize_keys! if opts[:cooking_options]
@@ -102,7 +102,7 @@ class QueuedPost < ActiveRecord::Base
end
# Update the record in memory too, and clear the dirty flag
- updates.each {|k, v| send("#{k}=", v) }
+ updates.each { |k, v| send("#{k}=", v) }
changes_applied
QueuedPost.broadcast_new! if visible?
diff --git a/app/models/quoted_post.rb b/app/models/quoted_post.rb
index 2bd06fce81c..ecfe19e73d3 100644
--- a/app/models/quoted_post.rb
+++ b/app/models/quoted_post.rb
@@ -17,8 +17,8 @@ class QuotedPost < ActiveRecord::Base
post_number = a['data-post'].to_i
next if topic_id == 0 || post_number == 0
- next if uniq[[topic_id,post_number]]
- uniq[[topic_id,post_number]] = true
+ next if uniq[[topic_id, post_number]]
+ uniq[[topic_id, post_number]] = true
begin
# It would be so much nicer if we used post_id in quotes
diff --git a/app/models/remote_theme.rb b/app/models/remote_theme.rb
index b426030dbea..3030b4aa22d 100644
--- a/app/models/remote_theme.rb
+++ b/app/models/remote_theme.rb
@@ -7,7 +7,7 @@ class RemoteTheme < ActiveRecord::Base
has_one :theme
- def self.import_theme(url, user=Discourse.system_user)
+ def self.import_theme(url, user = Discourse.system_user)
importer = GitImporter.new(url)
importer.import!
@@ -37,7 +37,7 @@ class RemoteTheme < ActiveRecord::Base
self.remote_version, self.commits_behind = importer.commits_since(remote_version)
end
- def update_from_remote(importer=nil)
+ def update_from_remote(importer = nil)
return unless remote_url
cleanup = false
@@ -70,9 +70,9 @@ class RemoteTheme < ActiveRecord::Base
end
theme.set_field(target: info["target"] || :common,
- name: name,
- value: info["value"],
- type: info["type"] || :theme_var)
+ name: name,
+ value: info["value"],
+ type: info["type"] || :theme_var)
end
Theme.targets.keys.each do |target|
diff --git a/app/models/report.rb b/app/models/report.rb
index 76c162ffb17..8144df648b9 100644
--- a/app/models/report.rb
+++ b/app/models/report.rb
@@ -14,7 +14,7 @@ class Report
@end_date ||= Time.zone.now.end_of_day
end
- def as_json(options=nil)
+ def as_json(options = nil)
{
type: type,
title: I18n.t("reports.#{type}.title"),
@@ -34,7 +34,7 @@ class Report
singleton_class.instance_eval { define_method("report_#{name}", &block) }
end
- def self.find(type, opts=nil)
+ def self.find(type, opts = nil)
opts ||= {}
# Load the report
@@ -56,11 +56,11 @@ class Report
report
end
- def self.req_report(report, filter=nil)
+ def self.req_report(report, filter = nil)
data =
if filter == :page_view_total
ApplicationRequest.where(req_type: [
- ApplicationRequest.req_types.reject{|k,v| k =~ /mobile/}.map{|k,v| v if k =~ /page_view/}.compact
+ ApplicationRequest.req_types.reject { |k, v| k =~ /mobile/ }.map { |k, v| v if k =~ /page_view/ }.compact
].flatten)
else
ApplicationRequest.where(req_type: ApplicationRequest.req_types[filter])
@@ -68,18 +68,18 @@ class Report
report.data = []
data.where('date >= ? AND date <= ?', report.start_date.to_date, report.end_date.to_date)
- .order(date: :asc)
- .group(:date)
- .sum(:count)
- .each do |date, count|
+ .order(date: :asc)
+ .group(:date)
+ .sum(:count)
+ .each do |date, count|
report.data << { x: date, y: count }
end
report.total = data.sum(:count)
report.prev30Days = data.where('date >= ? AND date <= ?',
(report.start_date - 31.days).to_date,
- (report.end_date - 31.days).to_date )
- .sum(:count)
+ (report.end_date - 31.days).to_date)
+ .sum(:count)
end
def self.report_visits(report)
@@ -128,7 +128,7 @@ class Report
def self.report_time_to_first_response(report)
report.data = []
- Topic.time_to_first_response_per_day(report.start_date, report.end_date, {category_id: report.category_id}).each do |r|
+ Topic.time_to_first_response_per_day(report.start_date, report.end_date, category_id: report.category_id).each do |r|
report.data << { x: Date.parse(r["date"]), y: r["hours"].to_f.round(2) }
end
report.total = Topic.time_to_first_response_total(category_id: report.category_id)
diff --git a/app/models/screened_email.rb b/app/models/screened_email.rb
index ee8b005728e..a0dec7f12f1 100644
--- a/app/models/screened_email.rb
+++ b/app/models/screened_email.rb
@@ -18,8 +18,8 @@ class ScreenedEmail < ActiveRecord::Base
self.email = email.downcase
end
- def self.block(email, opts={})
- find_by_email(Email.downcase(email)) || create(opts.slice(:action_type, :ip_address).merge({email: email}))
+ def self.block(email, opts = {})
+ find_by_email(Email.downcase(email)) || create(opts.slice(:action_type, :ip_address).merge(email: email))
end
def self.should_block?(email)
@@ -30,8 +30,8 @@ class ScreenedEmail < ActiveRecord::Base
max_distance = SiteSetting.levenshtein_distance_spammer_emails
screened_email = screened_emails.select { |se| distances[se.email] <= max_distance }
- .sort { |se| distances[se.email] }
- .first
+ .sort { |se| distances[se.email] }
+ .first
screened_email.record_match! if screened_email
@@ -46,13 +46,13 @@ class ScreenedEmail < ActiveRecord::Base
(1..second.length).each do |i|
(1..first.length).each do |j|
- if first[j-1] == second[i-1]
- matrix[i][j] = matrix[i-1][j-1]
+ if first[j - 1] == second[i - 1]
+ matrix[i][j] = matrix[i - 1][j - 1]
else
matrix[i][j] = [
- matrix[i-1][j],
- matrix[i][j-1],
- matrix[i-1][j-1],
+ matrix[i - 1][j],
+ matrix[i][j - 1],
+ matrix[i - 1][j - 1],
].min + 1
end
end
diff --git a/app/models/screened_ip_address.rb b/app/models/screened_ip_address.rb
index 248ad97703c..f0e51ab0456 100644
--- a/app/models/screened_ip_address.rb
+++ b/app/models/screened_ip_address.rb
@@ -11,7 +11,7 @@ class ScreenedIpAddress < ActiveRecord::Base
validates :ip_address, ip_address_format: true, presence: true
- def self.watch(ip_address, opts={})
+ def self.watch(ip_address, opts = {})
match_for_ip_address(ip_address) || create(opts.slice(:action_type).merge(ip_address: ip_address))
end
@@ -67,10 +67,10 @@ class ScreenedIpAddress < ActiveRecord::Base
exists_for_ip_address_and_action?(ip_address, actions[:do_nothing])
end
- def self.exists_for_ip_address_and_action?(ip_address, action_type, opts={})
+ def self.exists_for_ip_address_and_action?(ip_address, action_type, opts = {})
b = match_for_ip_address(ip_address)
- found = (!!b and b.action_type == action_type)
- b.record_match! if found and opts[:record_match] != false
+ found = (!!b && b.action_type == (action_type))
+ b.record_match! if found && opts[:record_match] != (false)
found
end
@@ -125,7 +125,7 @@ class ScreenedIpAddress < ActiveRecord::Base
ScreenedIpAddress.exec_sql(star_star_subnets_query, min_count: 10, roll_up_weight: weight).values.flatten
end
- def self.roll_up(current_user=Discourse.system_user)
+ def self.roll_up(current_user = Discourse.system_user)
# 1 - retrieve all subnets that needs roll up
subnets = [star_subnets, star_star_subnets].flatten
@@ -158,9 +158,9 @@ class ScreenedIpAddress < ActiveRecord::Base
# 5 - remove old matches
ScreenedIpAddress.where(action_type: ScreenedIpAddress.actions[:block])
- .where("family(ip_address) = 4")
- .where("ip_address << ?", subnet)
- .delete_all
+ .where("family(ip_address) = 4")
+ .where("ip_address << ?", subnet)
+ .delete_all
end
# return the subnets
diff --git a/app/models/screened_url.rb b/app/models/screened_url.rb
index 3bd7cc1b897..47e6e949db6 100644
--- a/app/models/screened_url.rb
+++ b/app/models/screened_url.rb
@@ -21,7 +21,7 @@ class ScreenedUrl < ActiveRecord::Base
self.domain = self.domain.downcase.sub(/^www\./, '') if self.domain
end
- def self.watch(url, domain, opts={})
+ def self.watch(url, domain, opts = {})
find_match(url) || create(opts.slice(:action_type, :ip_address).merge(url: url, domain: domain))
end
diff --git a/app/models/search_log.rb b/app/models/search_log.rb
index 35a427d7185..acaf269c563 100644
--- a/app/models/search_log.rb
+++ b/app/models/search_log.rb
@@ -10,7 +10,7 @@ class SearchLog < ActiveRecord::Base
)
end
- def self.log(term:, search_type:, ip_address:, user_id:nil)
+ def self.log(term:, search_type:, ip_address:, user_id: nil)
search_type = search_types[search_type]
return [:error] unless search_type.present? && ip_address.present?
diff --git a/app/models/site.rb b/app/models/site.rb
index 37312625ba2..9d90b2c1bc3 100644
--- a/app/models/site.rb
+++ b/app/models/site.rb
@@ -121,7 +121,7 @@ class Site
def self.clear_anon_cache!
# publishing forces the sequence up
# the cache is validated based on the sequence
- MessageBus.publish('/site_json','')
+ MessageBus.publish('/site_json', '')
end
end
diff --git a/app/models/site_setting.rb b/app/models/site_setting.rb
index ef88e14516d..2e4fa838f34 100644
--- a/app/models/site_setting.rb
+++ b/app/models/site_setting.rb
@@ -34,7 +34,7 @@ class SiteSetting < ActiveRecord::Base
client_settings << :available_locales
def self.available_locales
- LocaleSiteSetting.values.map{ |e| e[:value] }.join('|')
+ LocaleSiteSetting.values.map { |e| e[:value] }.join('|')
end
def self.topic_title_length
@@ -71,8 +71,8 @@ class SiteSetting < ActiveRecord::Base
def self.anonymous_homepage
top_menu_items.map { |item| item.name }
- .select { |item| anonymous_menu_items.include?(item) }
- .first
+ .select { |item| anonymous_menu_items.include?(item) }
+ .first
end
def self.should_download_images?(src)
diff --git a/app/models/slug_setting.rb b/app/models/slug_setting.rb
index b2be27fcbd3..86dc666d918 100644
--- a/app/models/slug_setting.rb
+++ b/app/models/slug_setting.rb
@@ -10,7 +10,7 @@ class SlugSetting < EnumSiteSetting
def self.values
VALUES.map do |l|
- {name: l, value: l}
+ { name: l, value: l }
end
end
diff --git a/app/models/stylesheet_cache.rb b/app/models/stylesheet_cache.rb
index 2c568072cbf..b421c0df7ad 100644
--- a/app/models/stylesheet_cache.rb
+++ b/app/models/stylesheet_cache.rb
@@ -3,7 +3,7 @@ class StylesheetCache < ActiveRecord::Base
MAX_TO_KEEP = 50
- def self.add(target,digest,content,source_map)
+ def self.add(target, digest, content, source_map)
return false if where(target: target, digest: digest).exists?
@@ -13,11 +13,11 @@ class StylesheetCache < ActiveRecord::Base
if count > MAX_TO_KEEP
remove_lower = StylesheetCache
- .where(target: target)
- .limit(MAX_TO_KEEP)
- .order('id desc')
- .pluck(:id)
- .last
+ .where(target: target)
+ .limit(MAX_TO_KEEP)
+ .order('id desc')
+ .pluck(:id)
+ .last
exec_sql("DELETE FROM stylesheet_cache where id < :id", id: remove_lower)
end
diff --git a/app/models/tag.rb b/app/models/tag.rb
index 95a944776c4..a9223b670ac 100644
--- a/app/models/tag.rb
+++ b/app/models/tag.rb
@@ -18,23 +18,23 @@ class Tag < ActiveRecord::Base
# fetch the result with .count(Tag::COUNT_ARG).
#
# e.g., Tag.tags_by_count_query.where("topics.category_id = ?", category.id).count(Tag::COUNT_ARG)
- def self.tags_by_count_query(opts={})
+ def self.tags_by_count_query(opts = {})
q = Tag.joins("LEFT JOIN topic_tags ON tags.id = topic_tags.tag_id")
- .joins("LEFT JOIN topics ON topics.id = topic_tags.topic_id")
- .group("tags.id, tags.name")
- .order('count_topic_tags_id DESC')
+ .joins("LEFT JOIN topics ON topics.id = topic_tags.topic_id")
+ .group("tags.id, tags.name")
+ .order('count_topic_tags_id DESC')
q = q.limit(opts[:limit]) if opts[:limit]
q
end
- def self.category_tags_by_count_query(category, opts={})
+ def self.category_tags_by_count_query(category, opts = {})
tags_by_count_query(opts).where("tags.id in (select tag_id from category_tags where category_id = ?)", category.id)
- .where("topics.category_id = ?", category.id)
+ .where("topics.category_id = ?", category.id)
end
def self.top_tags(limit_arg: nil, category: nil, guardian: nil)
limit = limit_arg || SiteSetting.max_tags_in_filter_list
- scope_category_ids = (guardian||Guardian.new).allowed_category_ids
+ scope_category_ids = (guardian || Guardian.new).allowed_category_ids
if category
scope_category_ids &= ([category.id] + category.subcategories.pluck(:id))
@@ -46,7 +46,7 @@ class Tag < ActiveRecord::Base
category: category
)
- tags.count(COUNT_ARG).map {|name, _| name}
+ tags.count(COUNT_ARG).map { |name, _| name }
end
def self.include_tags?
diff --git a/app/models/theme.rb b/app/models/theme.rb
index ab1fceb91f2..f38668e1fa6 100644
--- a/app/models/theme.rb
+++ b/app/models/theme.rb
@@ -50,7 +50,7 @@ class Theme < ActiveRecord::Base
ColorScheme
.where(theme_id: self.id)
.where("id NOT IN (SELECT color_scheme_id FROM themes where color_scheme_id IS NOT NULL)")
- .destroy_all
+ .destroy_all
ColorScheme
.where(theme_id: self.id)
@@ -114,7 +114,7 @@ class Theme < ActiveRecord::Base
(@cache[cache_key] = val || "").html_safe
end
- def self.remove_from_cache!(themes=nil)
+ def self.remove_from_cache!(themes = nil)
clear_cache!
end
@@ -122,13 +122,11 @@ class Theme < ActiveRecord::Base
@cache.clear
end
-
def self.targets
@targets ||= Enum.new(common: 0, desktop: 1, mobile: 2)
end
-
- def notify_scheme_change(clear_manager_cache=true)
+ def notify_scheme_change(clear_manager_cache = true)
Stylesheet::Manager.cache.clear if clear_manager_cache
message = refresh_message_for_targets(["desktop", "mobile", "admin"], self)
MessageBus.publish('/file-change', message)
@@ -140,7 +138,7 @@ class Theme < ActiveRecord::Base
themes = [self] + dependant_themes
message = themes.map do |theme|
- refresh_message_for_targets([:mobile_theme,:desktop_theme], theme)
+ refresh_message_for_targets([:mobile_theme, :desktop_theme], theme)
end.compact.flatten
MessageBus.publish('/file-change', message)
end
@@ -168,7 +166,7 @@ class Theme < ActiveRecord::Base
def resolve_dependant_themes(direction)
- select_field,where_field=nil
+ select_field, where_field = nil
if direction == :up
select_field = "parent_theme_id"
@@ -212,7 +210,7 @@ class Theme < ActiveRecord::Base
end
def resolve_baked_field(target, name)
- list_baked_fields(target,name).map{|f| f.value_baked || f.value}.join("\n")
+ list_baked_fields(target, name).map { |f| f.value_baked || f.value }.join("\n")
end
def list_baked_fields(target, name)
@@ -221,12 +219,15 @@ class Theme < ActiveRecord::Base
theme_ids = [self.id] + (included_themes.map(&:id) || [])
fields = ThemeField.where(target_id: [Theme.targets[target], Theme.targets[:common]])
- .where(name: name.to_s)
- .includes(:theme)
- .joins("JOIN (
- SELECT #{theme_ids.map.with_index{|id,idx| "#{id} AS theme_id, #{idx} AS sort_column"}.join(" UNION ALL SELECT ")}
- ) as X ON X.theme_id = theme_fields.theme_id")
- .order('sort_column, target_id')
+ .where(name: name.to_s)
+ .includes(:theme)
+ .joins("
+ JOIN (
+ SELECT #{theme_ids.map.with_index { |id, idx| "#{id} AS theme_id, #{idx} AS sort_column" }.join(" UNION ALL SELECT ")}
+ ) as X ON X.theme_id = theme_fields.theme_id"
+ )
+ .order('sort_column, target_id')
+
fields.each(&:ensure_baked!)
fields
end
@@ -254,7 +255,7 @@ class Theme < ActiveRecord::Base
value ||= ""
- field = theme_fields.find{|f| f.name==name && f.target_id == target_id && f.type_id == type_id}
+ field = theme_fields.find { |f| f.name == name && f.target_id == target_id && f.type_id == type_id }
if field
if value.blank? && !upload_id
theme_fields.delete field.destroy
diff --git a/app/models/theme_field.rb b/app/models/theme_field.rb
index 34d09eb1898..26e67329ee0 100644
--- a/app/models/theme_field.rb
+++ b/app/models/theme_field.rb
@@ -11,7 +11,7 @@ class ThemeField < ActiveRecord::Base
end
def self.theme_var_type_ids
- @theme_var_type_ids ||= [2,3,4]
+ @theme_var_type_ids ||= [2, 3, 4]
end
COMPILER_VERSION = 5
@@ -19,7 +19,7 @@ class ThemeField < ActiveRecord::Base
belongs_to :theme
def transpile(es6_source, version)
- template = Tilt::ES6ModuleTranspilerTemplate.new {}
+ template = Tilt::ES6ModuleTranspilerTemplate.new {}
wrapped = < {
#{es6_source}
@@ -90,7 +90,6 @@ COMPILED
@scss_fields ||= %w(scss embedded_scss)
end
-
def ensure_baked!
if ThemeField.html_fields.include?(self.name)
if !self.value_baked || compiler_version != COMPILER_VERSION
diff --git a/app/models/top_topic.rb b/app/models/top_topic.rb
index 6172f7cf0a0..709148167c4 100644
--- a/app/models/top_topic.rb
+++ b/app/models/top_topic.rb
@@ -16,7 +16,7 @@ class TopTopic < ActiveRecord::Base
# We don't have to refresh these as often
def self.refresh_older!
- older_periods = periods - [:daily,:all]
+ older_periods = periods - [:daily, :all]
transaction do
older_periods.each do |period|
@@ -32,7 +32,6 @@ class TopTopic < ActiveRecord::Base
refresh_older!
end
-
def self.periods
@@periods ||= [:all, :yearly, :quarterly, :monthly, :weekly, :daily].freeze
end
@@ -203,11 +202,11 @@ class TopTopic < ActiveRecord::Base
def self.start_of(period)
case period
- when :yearly then 1.year.ago
- when :monthly then 1.month.ago
- when :quarterly then 3.months.ago
- when :weekly then 1.week.ago
- when :daily then 1.day.ago
+ when :yearly then 1.year.ago
+ when :monthly then 1.month.ago
+ when :quarterly then 3.months.ago
+ when :weekly then 1.week.ago
+ when :daily then 1.day.ago
end
end
diff --git a/app/models/topic.rb b/app/models/topic.rb
index 9b3e0b0f2fa..b076191a8d3 100644
--- a/app/models/topic.rb
+++ b/app/models/topic.rb
@@ -30,14 +30,14 @@ class Topic < ActiveRecord::Base
attr_accessor :allowed_user_ids, :tags_changed
def self.max_sort_order
- @max_sort_order ||= (2 ** 31) - 1
+ @max_sort_order ||= (2**31) - 1
end
def featured_users
@featured_users ||= TopicFeaturedUsers.new(self)
end
- def trash!(trashed_by=nil)
+ def trash!(trashed_by = nil)
update_category_topic_count_by(-1) if deleted_at.nil?
super(trashed_by)
update_flagged_posts_count
@@ -57,27 +57,27 @@ class Topic < ActiveRecord::Base
rate_limit :limit_topics_per_day
rate_limit :limit_private_messages_per_day
- validates :title, :if => Proc.new { |t| t.new_record? || t.title_changed? },
- :presence => true,
- :topic_title_length => true,
- :censored_words => true,
- :quality_title => { :unless => :private_message? },
- :unique_among => { :unless => Proc.new { |t| (SiteSetting.allow_duplicate_topic_titles? || t.private_message?) },
- :message => :has_already_been_used,
- :allow_blank => true,
- :case_sensitive => false,
- :collection => Proc.new{ Topic.listable_topics } }
+ validates :title, if: Proc.new { |t| t.new_record? || t.title_changed? },
+ presence: true,
+ topic_title_length: true,
+ censored_words: true,
+ quality_title: { unless: :private_message? },
+ unique_among: { unless: Proc.new { |t| (SiteSetting.allow_duplicate_topic_titles? || t.private_message?) },
+ message: :has_already_been_used,
+ allow_blank: true,
+ case_sensitive: false,
+ collection: Proc.new { Topic.listable_topics } }
validates :category_id,
- :presence => true,
- :exclusion => {
- :in => Proc.new{[SiteSetting.uncategorized_category_id]}
+ presence: true,
+ exclusion: {
+ in: Proc.new { [SiteSetting.uncategorized_category_id] }
},
- :if => Proc.new { |t|
- (t.new_record? || t.category_id_changed?) &&
- !SiteSetting.allow_uncategorized_topics &&
- (t.archetype.nil? || t.archetype == Archetype.default) &&
- (!t.user_id || !t.user.staff?)
+ if: Proc.new { |t|
+ (t.new_record? || t.category_id_changed?) &&
+ !SiteSetting.allow_uncategorized_topics &&
+ (t.archetype.nil? || t.archetype == Archetype.default) &&
+ (!t.user_id || !t.user.staff?)
}
validates :featured_link, allow_nil: true, format: URI::regexp(%w(http https))
@@ -124,7 +124,7 @@ class Topic < ActiveRecord::Base
has_many :topic_timers, dependent: :destroy
has_one :user_warning
- has_one :first_post, -> {where post_number: 1}, class_name: Post
+ has_one :first_post, -> { where post_number: 1 }, class_name: Post
has_one :topic_embed, dependent: :destroy
@@ -152,7 +152,7 @@ class Topic < ActiveRecord::Base
scope :created_since, lambda { |time_ago| where('topics.created_at > ?', time_ago) }
- scope :secured, lambda { |guardian=nil|
+ scope :secured, lambda { |guardian = nil|
ids = guardian.secure_category_ids if guardian
# Query conditions
@@ -242,7 +242,7 @@ class Topic < ActiveRecord::Base
end
end
- def self.visible_post_types(viewed_by=nil)
+ def self.visible_post_types(viewed_by = nil)
types = Post.types
result = [types[:regular], types[:moderator_action], types[:small_action]]
result << types[:whisper] if viewed_by.try(:staff?)
@@ -267,8 +267,8 @@ class Topic < ActiveRecord::Base
def has_flags?
FlagQuery.flagged_post_actions("active")
- .where("topics.id" => id)
- .exists?
+ .where("topics.id" => id)
+ .exists?
end
def is_official_warning?
@@ -324,21 +324,21 @@ class Topic < ActiveRecord::Base
end
# Returns hot topics since a date for display in email digest.
- def self.for_digest(user, since, opts=nil)
+ def self.for_digest(user, since, opts = nil)
opts = opts || {}
score = "#{ListController.best_period_for(since)}_score"
topics = Topic
- .visible
- .secured(Guardian.new(user))
- .joins("LEFT OUTER JOIN topic_users ON topic_users.topic_id = topics.id AND topic_users.user_id = #{user.id.to_i}")
- .joins("LEFT OUTER JOIN category_users ON category_users.category_id = topics.category_id AND category_users.user_id = #{user.id.to_i}")
- .joins("LEFT OUTER JOIN users ON users.id = topics.user_id")
- .where(closed: false, archived: false)
- .where("COALESCE(topic_users.notification_level, 1) <> ?", TopicUser.notification_levels[:muted])
- .created_since(since)
- .listable_topics
- .includes(:category)
+ .visible
+ .secured(Guardian.new(user))
+ .joins("LEFT OUTER JOIN topic_users ON topic_users.topic_id = topics.id AND topic_users.user_id = #{user.id.to_i}")
+ .joins("LEFT OUTER JOIN category_users ON category_users.category_id = topics.category_id AND category_users.user_id = #{user.id.to_i}")
+ .joins("LEFT OUTER JOIN users ON users.id = topics.user_id")
+ .where(closed: false, archived: false)
+ .where("COALESCE(topic_users.notification_level, 1) <> ?", TopicUser.notification_levels[:muted])
+ .created_since(since)
+ .listable_topics
+ .includes(:category)
unless opts[:include_tl0] || user.user_option.try(:include_tl0_in_digests)
topics = topics.where("COALESCE(users.trust_level, 0) > 0")
@@ -346,7 +346,7 @@ class Topic < ActiveRecord::Base
if !!opts[:top_order]
topics = topics.joins("LEFT OUTER JOIN top_topics ON top_topics.topic_id = topics.id")
- .order(TopicQuerySQL.order_top_with_notification_levels(score))
+ .order(TopicQuerySQL.order_top_with_notification_levels(score))
end
if opts[:limit]
@@ -383,7 +383,7 @@ class Topic < ActiveRecord::Base
end
# Using the digest query, figure out what's new for a user since last seen
- def self.new_since_last_seen(user, since, featured_topic_ids=nil)
+ def self.new_since_last_seen(user, since, featured_topic_ids = nil)
topics = Topic.for_digest(user, since)
featured_topic_ids ? topics.where("topics.id NOT IN (?)", featured_topic_ids) : topics
end
@@ -401,7 +401,7 @@ class Topic < ActiveRecord::Base
save
end
- def reload(options=nil)
+ def reload(options = nil)
@post_numbers = nil
@public_topic_timer = nil
super(options)
@@ -423,7 +423,7 @@ class Topic < ActiveRecord::Base
custom_fields[key.to_s]
end
- def self.listable_count_per_day(start_date, end_date, category_id=nil)
+ def self.listable_count_per_day(start_date, end_date, category_id = nil)
result = listable_topics.where('created_at >= ? and created_at <= ?', start_date, end_date)
result = result.where(category_id: category_id) if category_id
result.group('date(created_at)').order('date(created_at)').count
@@ -435,7 +435,7 @@ class Topic < ActiveRecord::Base
MAX_SIMILAR_BODY_LENGTH = 200
# Search for similar topics
- def self.similar_to(title, raw, user=nil)
+ def self.similar_to(title, raw, user = nil)
return [] unless title.present?
return [] unless raw.present?
@@ -445,12 +445,12 @@ class Topic < ActiveRecord::Base
# Exclude category definitions from similar topic suggestions
candidates = Topic.visible
- .secured(Guardian.new(user))
- .listable_topics
- .joins('JOIN topic_search_data s ON topics.id = s.topic_id')
- .where("search_data @@ #{ts_query}")
- .order("ts_rank(search_data, #{ts_query}) DESC")
- .limit(SiteSetting.max_similar_results * 3)
+ .secured(Guardian.new(user))
+ .listable_topics
+ .joins('JOIN topic_search_data s ON topics.id = s.topic_id')
+ .where("search_data @@ #{ts_query}")
+ .order("ts_rank(search_data, #{ts_query}) DESC")
+ .limit(SiteSetting.max_similar_results * 3)
exclude_topic_ids = Category.pluck(:topic_id).compact!
if exclude_topic_ids.present?
@@ -462,16 +462,16 @@ class Topic < ActiveRecord::Base
return [] unless candidate_ids.present?
similar = Topic.select(sanitize_sql_array(["topics.*, similarity(topics.title, :title) + similarity(topics.title, :raw) AS similarity, p.cooked as blurb", title: title, raw: raw]))
- .joins("JOIN posts AS p ON p.topic_id = topics.id AND p.post_number = 1")
- .limit(SiteSetting.max_similar_results)
- .where("topics.id IN (?)", candidate_ids)
- .where("similarity(topics.title, :title) + similarity(topics.title, :raw) > 0.2", raw: raw, title: title)
- .order('similarity desc')
+ .joins("JOIN posts AS p ON p.topic_id = topics.id AND p.post_number = 1")
+ .limit(SiteSetting.max_similar_results)
+ .where("topics.id IN (?)", candidate_ids)
+ .where("similarity(topics.title, :title) + similarity(topics.title, :raw) > 0.2", raw: raw, title: title)
+ .order('similarity desc')
similar
end
- def update_status(status, enabled, user, opts={})
+ def update_status(status, enabled, user, opts = {})
TopicStatusUpdater.new(self, user).update!(status, enabled, opts)
DiscourseEvent.trigger(:topic_status_updated, self.id, status, enabled)
end
@@ -504,7 +504,6 @@ class Topic < ActiveRecord::Base
end
end
-
def self.reset_all_highest!
exec_sql < 1
url
@@ -927,7 +925,7 @@ SQL
self.class.url id, slug, post_number
end
- def self.relative_url(id, slug, post_number=nil)
+ def self.relative_url(id, slug, post_number = nil)
url = "#{Discourse.base_uri}/t/"
url << "#{slug}/" if slug.present?
url << id.to_s
@@ -935,11 +933,11 @@ SQL
url
end
- def slugless_url(post_number=nil)
+ def slugless_url(post_number = nil)
Topic.relative_url(id, nil, post_number)
end
- def relative_url(post_number=nil)
+ def relative_url(post_number = nil)
Topic.relative_url(id, slug, post_number)
end
@@ -957,7 +955,7 @@ SQL
TopicUser.change(user.id, id, cleared_pinned_at: nil)
end
- def update_pinned(status, global=false, pinned_until=nil)
+ def update_pinned(status, global = false, pinned_until = nil)
pinned_until = Time.parse(pinned_until) rescue nil
update_columns(
@@ -1136,7 +1134,7 @@ SQL
) t
SQL
- def self.time_to_first_response(sql, opts=nil)
+ def self.time_to_first_response(sql, opts = nil)
opts ||= {}
builder = SqlBuilder.new(sql)
builder.where("t.created_at >= :start_date", start_date: opts[:start_date]) if opts[:start_date]
@@ -1147,17 +1145,17 @@ SQL
builder.where("p.deleted_at IS NULL")
builder.where("p.post_number > 1")
builder.where("p.user_id != t.user_id")
- builder.where("p.user_id in (:user_ids)", {user_ids: opts[:user_ids]}) if opts[:user_ids]
+ builder.where("p.user_id in (:user_ids)", user_ids: opts[:user_ids]) if opts[:user_ids]
builder.where("p.post_type = :post_type", post_type: Post.types[:regular])
builder.where("EXTRACT(EPOCH FROM p.created_at - t.created_at) > 0")
builder.exec
end
- def self.time_to_first_response_per_day(start_date, end_date, opts={})
- time_to_first_response(TIME_TO_FIRST_RESPONSE_SQL, opts.merge({start_date: start_date, end_date: end_date}))
+ def self.time_to_first_response_per_day(start_date, end_date, opts = {})
+ time_to_first_response(TIME_TO_FIRST_RESPONSE_SQL, opts.merge(start_date: start_date, end_date: end_date))
end
- def self.time_to_first_response_total(opts=nil)
+ def self.time_to_first_response_total(opts = nil)
total = time_to_first_response(TIME_TO_FIRST_RESPONSE_TOTAL_SQL, opts)
total.first["hours"].to_f.round(2)
end
@@ -1176,7 +1174,7 @@ SQL
ORDER BY tt.created_at
SQL
- def self.with_no_response_per_day(start_date, end_date, category_id=nil)
+ def self.with_no_response_per_day(start_date, end_date, category_id = nil)
builder = SqlBuilder.new(WITH_NO_RESPONSE_SQL)
builder.where("t.created_at >= :start_date", start_date: start_date) if start_date
builder.where("t.created_at < :end_date", end_date: end_date) if end_date
@@ -1198,7 +1196,7 @@ SQL
WHERE tt.first_reply IS NULL OR tt.first_reply < 2
SQL
- def self.with_no_response_total(opts={})
+ def self.with_no_response_total(opts = {})
builder = SqlBuilder.new(WITH_NO_RESPONSE_TOTAL_SQL)
builder.where("t.category_id = :category_id", category_id: opts[:category_id]) if opts[:category_id]
builder.where("t.archetype <> '#{Archetype.private_message}'")
@@ -1245,7 +1243,6 @@ SQL
end
-
# == Schema Information
#
# Table name: topics
diff --git a/app/models/topic_embed.rb b/app/models/topic_embed.rb
index 0f1cc78f7d1..9904b05c989 100644
--- a/app/models/topic_embed.rb
+++ b/app/models/topic_embed.rb
@@ -113,7 +113,7 @@ class TopicEmbed < ActiveRecord::Base
response.title = title
doc = Nokogiri::HTML(read_doc.content)
- tags = {'img' => 'src', 'script' => 'src', 'a' => 'href'}
+ tags = { 'img' => 'src', 'script' => 'src', 'a' => 'href' }
doc.search(tags.keys.join(',')).each do |node|
url_param = tags[node.name]
src = node[url_param]
@@ -132,7 +132,7 @@ class TopicEmbed < ActiveRecord::Base
# only allow classes in the whitelist
allowed_classes = if embed_classname_whitelist.blank? then [] else embed_classname_whitelist.split(/[ ,]+/i) end
doc.search('[class]:not([class=""])').each do |classnode|
- classes = classnode[:class].split(' ').select{ |classname| allowed_classes.include?(classname) }
+ classes = classnode[:class].split(' ').select { |classname| allowed_classes.include?(classname) }
if classes.length === 0
classnode.delete('class')
else
@@ -145,7 +145,7 @@ class TopicEmbed < ActiveRecord::Base
response
end
- def self.import_remote(import_user, url, opts=nil)
+ def self.import_remote(import_user, url, opts = nil)
opts = opts || {}
response = find_remote(url)
response.title = opts[:title] if opts[:title].present?
diff --git a/app/models/topic_featured_users.rb b/app/models/topic_featured_users.rb
index f28c555b4ce..d3f705149be 100644
--- a/app/models/topic_featured_users.rb
+++ b/app/models/topic_featured_users.rb
@@ -10,7 +10,7 @@ class TopicFeaturedUsers
end
# Chooses which topic users to feature
- def choose(args={})
+ def choose(args = {})
self.class.ensure_consistency!(topic.id.to_i)
update_participant_count
end
@@ -22,7 +22,7 @@ class TopicFeaturedUsers
topic.featured_user4_id].uniq.compact
end
- def self.ensure_consistency!(topic_id=nil)
+ def self.ensure_consistency!(topic_id = nil)
filter = "#{"AND t.id = #{topic_id.to_i}" if topic_id}"
filter2 = "#{"AND tt.id = #{topic_id.to_i}" if topic_id}"
diff --git a/app/models/topic_link.rb b/app/models/topic_link.rb
index d7691db82d2..f5925960a27 100644
--- a/app/models/topic_link.rb
+++ b/app/models/topic_link.rb
@@ -67,7 +67,7 @@ SQL
end
- def self.counts_for(guardian,topic, posts)
+ def self.counts_for(guardian, topic, posts)
return {} if posts.blank?
# Sam: I don't know how to write this cleanly in AR,
@@ -93,13 +93,13 @@ SQL
builder.where('l.post_id IN (:post_ids)', post_ids: posts.map(&:id))
builder.secure_category(guardian.secure_category_ids)
- builder.map_exec(OpenStruct).each_with_object({}) do |l,result|
+ builder.map_exec(OpenStruct).each_with_object({}) do |l, result|
result[l.post_id] ||= []
- result[l.post_id] << {url: l.url,
- clicks: l.clicks,
- title: l.title,
- internal: l.internal,
- reflection: l.reflection}
+ result[l.post_id] << { url: l.url,
+ clicks: l.clicks,
+ title: l.title,
+ internal: l.internal,
+ reflection: l.reflection }
end
end
@@ -189,14 +189,14 @@ SQL
unless tl
tl = TopicLink.create(user_id: post.user_id,
- topic_id: topic_id,
- post_id: reflected_post.try(:id),
- url: reflected_url,
- domain: Discourse.current_hostname,
- reflection: true,
- internal: true,
- link_topic_id: post.topic_id,
- link_post_id: post.id)
+ topic_id: topic_id,
+ post_id: reflected_post.try(:id),
+ url: reflected_url,
+ domain: Discourse.current_hostname,
+ reflection: true,
+ internal: true,
+ link_topic_id: post.topic_id,
+ link_post_id: post.id)
end
@@ -235,11 +235,11 @@ SQL
def self.duplicate_lookup(topic)
results = TopicLink
- .includes(:post, :user)
- .joins(:post, :user)
- .where("posts.id IS NOT NULL AND users.id IS NOT NULL")
- .where(topic_id: topic.id, reflection: false)
- .last(200)
+ .includes(:post, :user)
+ .joins(:post, :user)
+ .where("posts.id IS NOT NULL AND users.id IS NOT NULL")
+ .where(topic_id: topic.id, reflection: false)
+ .last(200)
lookup = {}
results.each do |tl|
diff --git a/app/models/topic_link_click.rb b/app/models/topic_link_click.rb
index 6bd932c796f..825067384fa 100644
--- a/app/models/topic_link_click.rb
+++ b/app/models/topic_link_click.rb
@@ -12,7 +12,7 @@ class TopicLinkClick < ActiveRecord::Base
WHITELISTED_REDIRECT_HOSTNAMES = Set.new(%W{www.youtube.com youtu.be})
# Create a click from a URL and post_id
- def self.create_from(args={})
+ def self.create_from(args = {})
url = args[:url][0...TopicLink.max_url_length]
return nil if url.blank?
@@ -31,7 +31,7 @@ class TopicLinkClick < ActiveRecord::Base
query = url.index('?')
unless query.nil?
endpos = url.index('#') || url.size
- urls << url[0..query-1] + url[endpos..-1]
+ urls << url[0..query - 1] + url[endpos..-1]
end
# add a cdn link
diff --git a/app/models/topic_list.rb b/app/models/topic_list.rb
index efa8089202b..375659dc5c8 100644
--- a/app/models/topic_list.rb
+++ b/app/models/topic_list.rb
@@ -22,7 +22,7 @@ class TopicList
def self.preload(topics, object)
if @preload
- @preload.each{|preload| preload.call(topics, object)}
+ @preload.each { |preload| preload.call(topics, object) }
end
end
@@ -37,7 +37,7 @@ class TopicList
:tags,
:current_user
- def initialize(filter, current_user, topics, opts=nil)
+ def initialize(filter, current_user, topics, opts = nil)
@filter = filter
@current_user = current_user
@topics_input = topics
@@ -86,7 +86,7 @@ class TopicList
# Include bookmarks if you have bookmarked topics
if @current_user && !post_action_type
- post_action_type = PostActionType.types[:bookmark] if @topic_lookup.any?{|_,tu| tu && tu.bookmarked}
+ post_action_type = PostActionType.types[:bookmark] if @topic_lookup.any? { |_, tu| tu && tu.bookmarked }
end
# Data for bookmarks or likes
@@ -105,7 +105,7 @@ class TopicList
ft.user_data = @topic_lookup[ft.id] if @topic_lookup.present?
if ft.user_data && post_action_lookup && actions = post_action_lookup[ft.id]
- ft.user_data.post_action_data = {post_action_type => actions}
+ ft.user_data.post_action_data = { post_action_type => actions }
end
ft.posters = ft.posters_summary(
@@ -127,6 +127,6 @@ class TopicList
end
def attributes
- {'more_topics_url' => page}
+ { 'more_topics_url' => page }
end
end
diff --git a/app/models/topic_notifier.rb b/app/models/topic_notifier.rb
index db30a8e471b..46d43c3755b 100644
--- a/app/models/topic_notifier.rb
+++ b/app/models/topic_notifier.rb
@@ -3,10 +3,10 @@ class TopicNotifier
@topic = topic
end
- { :watch! => :watching,
- :track! => :tracking,
- :regular! => :regular,
- :mute! => :muted }.each_pair do |method_name, level|
+ { watch!: :watching,
+ track!: :tracking,
+ regular!: :regular,
+ mute!: :muted }.each_pair do |method_name, level|
define_method method_name do |user_id|
change_level user_id, level
@@ -34,8 +34,8 @@ class TopicNotifier
@notification_levels ||= TopicUser.notification_levels
end
- def change_level(user_id, level, reason=nil)
- attrs = {notification_level: levels[level]}
+ def change_level(user_id, level, reason = nil)
+ attrs = { notification_level: levels[level] }
attrs.merge!(notifications_reason_id: TopicUser.notification_reasons[reason]) if reason
TopicUser.change(user_id, @topic.id, attrs)
end
diff --git a/app/models/topic_posters_summary.rb b/app/models/topic_posters_summary.rb
index 7723bf338cd..c6cf8255d57 100644
--- a/app/models/topic_posters_summary.rb
+++ b/app/models/topic_posters_summary.rb
@@ -40,7 +40,7 @@ class TopicPostersSummary
def shuffle_last_poster_to_back_in(summary)
unless last_poster_is_topic_creator?
- summary.reject!{ |u| u.id == topic.last_post_user_id }
+ summary.reject! { |u| u.id == topic.last_post_user_id }
summary << avatar_lookup[topic.last_post_user_id]
end
summary
diff --git a/app/models/topic_tracking_state.rb b/app/models/topic_tracking_state.rb
index ff30630353b..3c104f4fdb7 100644
--- a/app/models/topic_tracking_state.rb
+++ b/app/models/topic_tracking_state.rb
@@ -38,7 +38,7 @@ class TopicTrackingState
publish_read(topic.id, 1, topic.user_id)
end
- def self.publish_latest(topic, staff_only=false)
+ def self.publish_latest(topic, staff_only = false)
return unless topic.archetype == "regular"
message = {
@@ -73,9 +73,9 @@ class TopicTrackingState
end
TopicUser
- .tracking(post.topic_id)
- .select([:user_id,:last_read_post_number, :notification_level])
- .each do |tu|
+ .tracking(post.topic_id)
+ .select([:user_id, :last_read_post_number, :notification_level])
+ .each do |tu|
message = {
topic_id: post.topic_id,
@@ -125,7 +125,7 @@ class TopicTrackingState
MessageBus.publish("/delete", message.as_json, group_ids: group_ids)
end
- def self.publish_read(topic_id, last_read_post_number, user_id, notification_level=nil)
+ def self.publish_read(topic_id, last_read_post_number, user_id, notification_level = nil)
highest_post_number = Topic.where(id: topic_id).pluck(:highest_post_number).first
@@ -179,8 +179,7 @@ class TopicTrackingState
end
-
- def self.report_raw_sql(opts=nil)
+ def self.report_raw_sql(opts = nil)
unread =
if opts && opts[:skip_unread]
@@ -205,7 +204,6 @@ class TopicTrackingState
c.id AS category_id,
tu.notification_level"
-
sql = <= :tracking",
+ .where("COALESCE(topic_users.notification_level, :regular) >= :tracking",
regular: TopicUser.notification_levels[:regular],
tracking: TopicUser.notification_levels[:tracking])
}
@@ -159,22 +159,22 @@ SQL
unless attrs[:notification_level]
category_notification_level = CategoryUser.where(user_id: user_id)
- .where("category_id IN (SELECT category_id FROM topics WHERE id = :id)", id: topic_id)
- .where("notification_level IN (:levels)", levels: [CategoryUser.notification_levels[:watching],
+ .where("category_id IN (SELECT category_id FROM topics WHERE id = :id)", id: topic_id)
+ .where("notification_level IN (:levels)", levels: [CategoryUser.notification_levels[:watching],
CategoryUser.notification_levels[:tracking]])
- .order("notification_level DESC")
- .limit(1)
- .pluck(:notification_level)
- .first
+ .order("notification_level DESC")
+ .limit(1)
+ .pluck(:notification_level)
+ .first
tag_notification_level = TagUser.where(user_id: user_id)
- .where("tag_id IN (SELECT tag_id FROM topic_tags WHERE topic_id = :id)", id: topic_id)
- .where("notification_level IN (:levels)", levels: [CategoryUser.notification_levels[:watching],
+ .where("tag_id IN (SELECT tag_id FROM topic_tags WHERE topic_id = :id)", id: topic_id)
+ .where("notification_level IN (:levels)", levels: [CategoryUser.notification_levels[:watching],
CategoryUser.notification_levels[:tracking]])
- .order("notification_level DESC")
- .limit(1)
- .pluck(:notification_level)
- .first
+ .order("notification_level DESC")
+ .limit(1)
+ .pluck(:notification_level)
+ .first
if category_notification_level && !(tag_notification_level && (tag_notification_level > category_notification_level))
attrs[:notification_level] = category_notification_level
@@ -191,7 +191,6 @@ SQL
TopicUser.notification_reasons[:auto_track_tag]
end
-
end
unless attrs[:notification_level]
@@ -203,7 +202,7 @@ SQL
end
end
- TopicUser.create(attrs.merge!(user_id: user_id, topic_id: topic_id, first_visited_at: now ,last_visited_at: now))
+ TopicUser.create(attrs.merge!(user_id: user_id, topic_id: topic_id, first_visited_at: now , last_visited_at: now))
end
def track_visit!(topic_id, user_id)
@@ -256,7 +255,7 @@ SQL
INSERT_TOPIC_USER_SQL_STAFF = INSERT_TOPIC_USER_SQL.gsub("highest_post_number", "highest_staff_post_number")
- def update_last_read(user, topic_id, post_number, msecs, opts={})
+ def update_last_read(user, topic_id, post_number, msecs, opts = {})
return if post_number.blank?
msecs = 0 if msecs.to_i < 0
@@ -276,11 +275,12 @@ SQL
# ... user visited the topic but did not read the posts
#
# 86400000 = 1 day
- rows = if user.staff?
- exec_sql(UPDATE_TOPIC_USER_SQL_STAFF,args).values
- else
- exec_sql(UPDATE_TOPIC_USER_SQL,args).values
- end
+ rows =
+ if user.staff?
+ exec_sql(UPDATE_TOPIC_USER_SQL_STAFF, args).values
+ else
+ exec_sql(UPDATE_TOPIC_USER_SQL, args).values
+ end
if rows.length == 1
before = rows[0][1].to_i
@@ -332,7 +332,7 @@ SQL
end
- def self.update_post_action_cache(opts={})
+ def self.update_post_action_cache(opts = {})
user_id = opts[:user_id]
post_id = opts[:post_id]
topic_id = opts[:topic_id]
@@ -412,7 +412,7 @@ SQL
TopicUser.exec_sql(sql, user_id: user_id, count: count)
end
- def self.ensure_consistency!(topic_id=nil)
+ def self.ensure_consistency!(topic_id = nil)
update_post_action_cache(topic_id: topic_id)
# TODO this needs some reworking, when we mark stuff skipped
diff --git a/app/models/topic_view_item.rb b/app/models/topic_view_item.rb
index 2b6fa6b49ce..04b231fa9bf 100644
--- a/app/models/topic_view_item.rb
+++ b/app/models/topic_view_item.rb
@@ -6,7 +6,7 @@ class TopicViewItem < ActiveRecord::Base
belongs_to :user
validates_presence_of :topic_id, :ip_address, :viewed_at
- def self.add(topic_id, ip, user_id=nil, at=nil, skip_redis=false)
+ def self.add(topic_id, ip, user_id = nil, at = nil, skip_redis = false)
# Only store a view once per day per thing per user per ip
at ||= Date.today
redis_key = "view:#{topic_id}:#{at}"
@@ -28,7 +28,6 @@ class TopicViewItem < ActiveRecord::Base
/*where*/
)"
-
builder = SqlBuilder.new(sql)
if !user_id
diff --git a/app/models/translation_override.rb b/app/models/translation_override.rb
index 6e73686f9b9..3cdff253b53 100644
--- a/app/models/translation_override.rb
+++ b/app/models/translation_override.rb
@@ -30,7 +30,7 @@ class TranslationOverride < ActiveRecord::Base
def self.i18n_changed
I18n.reload!
- MessageBus.publish('/i18n-flush', { refresh: true })
+ MessageBus.publish('/i18n-flush', refresh: true)
end
def check_interpolation_keys
diff --git a/app/models/trust_level3_requirements.rb b/app/models/trust_level3_requirements.rb
index 2579216f867..448f94e6729 100644
--- a/app/models/trust_level3_requirements.rb
+++ b/app/models/trust_level3_requirements.rb
@@ -130,11 +130,11 @@ class TrustLevel3Requirements
def num_flagged_posts
PostAction.with_deleted
- .where(post_id: flagged_post_ids)
- .where.not(user_id: @user.id)
- .where.not(agreed_at: nil)
- .pluck(:post_id)
- .uniq.count
+ .where(post_id: flagged_post_ids)
+ .where.not(user_id: @user.id)
+ .where.not(agreed_at: nil)
+ .pluck(:post_id)
+ .uniq.count
end
def max_flagged_posts
@@ -143,11 +143,11 @@ class TrustLevel3Requirements
def num_flagged_by_users
@_num_flagged_by_users ||= PostAction.with_deleted
- .where(post_id: flagged_post_ids)
- .where.not(user_id: @user.id)
- .where.not(agreed_at: nil)
- .pluck(:user_id)
- .uniq.count
+ .where(post_id: flagged_post_ids)
+ .where.not(user_id: @user.id)
+ .where.not(agreed_at: nil)
+ .pluck(:user_id)
+ .uniq.count
end
def max_flagged_by_users
@@ -194,13 +194,11 @@ class TrustLevel3Requirements
(min_likes_received.to_f / 4.0).ceil
end
-
def self.clear_cache
$redis.del NUM_TOPICS_KEY
$redis.del NUM_POSTS_KEY
end
-
CACHE_DURATION = 1.day.seconds - 60
NUM_TOPICS_KEY = "tl3_num_topics"
NUM_POSTS_KEY = "tl3_num_posts"
@@ -223,8 +221,8 @@ class TrustLevel3Requirements
def flagged_post_ids
@_flagged_post_ids ||= @user.posts
- .with_deleted
- .where('created_at > ? AND (spam_count > 0 OR inappropriate_count > 0)', time_period.days.ago)
- .pluck(:id)
+ .with_deleted
+ .where('created_at > ? AND (spam_count > 0 OR inappropriate_count > 0)', time_period.days.ago)
+ .pluck(:id)
end
end
diff --git a/app/models/upload.rb b/app/models/upload.rb
index 5e272846402..514748f2d7e 100644
--- a/app/models/upload.rb
+++ b/app/models/upload.rb
@@ -30,7 +30,7 @@ class Upload < ActiveRecord::Base
thumbnail(width, height).present?
end
- def create_thumbnail!(width, height, crop=false)
+ def create_thumbnail!(width, height, crop = false)
return unless SiteSetting.create_thumbnails?
opts = {
@@ -75,7 +75,7 @@ class Upload < ActiveRecord::Base
Upload.find_by(url: url)
end
- def self.migrate_to_new_scheme(limit=nil)
+ def self.migrate_to_new_scheme(limit = nil)
problems = []
if SiteSetting.migrate_to_new_scheme
diff --git a/app/models/user.rb b/app/models/user.rb
index f6af5defef8..61c7799127b 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -74,13 +74,13 @@ class User < ActiveRecord::Base
has_many :acting_group_histories, dependent: :destroy, foreign_key: :acting_user_id, class_name: GroupHistory
has_many :targeted_group_histories, dependent: :destroy, foreign_key: :target_user_id, class_name: GroupHistory
- delegate :last_sent_email_address, :to => :email_logs
+ delegate :last_sent_email_address, to: :email_logs
validates_presence_of :username
validate :username_validator, if: :username_changed?
validate :password_validator
validates :name, user_full_name: true, if: :name_changed?, length: { maximum: 255 }
- validates :ip_address, allowed_ip_address: {on: :create, message: :signup_not_allowed}
+ validates :ip_address, allowed_ip_address: { on: :create, message: :signup_not_allowed }
validates :primary_email, presence: true, if: :should_validate_primary_email?
validates_associated :primary_email, if: :should_validate_primary_email?
@@ -240,13 +240,12 @@ class User < ActiveRecord::Base
find_by(username_lower: username.downcase)
end
-
def enqueue_welcome_message(message_type)
return unless SiteSetting.send_welcome_message?
Jobs.enqueue(:send_system_message, user_id: id, message_type: message_type)
end
- def change_username(new_username, actor=nil)
+ def change_username(new_username, actor = nil)
UsernameChanger.change(self, new_username, actor)
end
@@ -273,7 +272,7 @@ class User < ActiveRecord::Base
end
# Approve this user
- def approve(approved_by, send_mail=true)
+ def approve(approved_by, send_mail = true)
self.approved = true
if approved_by.is_a?(Integer)
@@ -318,7 +317,7 @@ class User < ActiveRecord::Base
n.user_id = :user_id AND
NOT read"
- User.exec_sql(sql, user_id: id, type: notification_type).getvalue(0,0).to_i
+ User.exec_sql(sql, user_id: id, type: notification_type).getvalue(0, 0).to_i
end
def unread_private_messages
@@ -342,7 +341,7 @@ class User < ActiveRecord::Base
User.exec_sql(sql, user_id: id,
seen_notification_id: seen_notification_id,
pm: Notification.types[:private_message])
- .getvalue(0,0).to_i
+ .getvalue(0, 0).to_i
end
end
@@ -377,7 +376,6 @@ class User < ActiveRecord::Base
notification = notifications.visible.order('notifications.id desc').first
json = NotificationSerializer.new(notification).as_json if notification
-
sql = "
SELECT * FROM (
SELECT n.id, n.read FROM notifications n
@@ -404,18 +402,18 @@ class User < ActiveRecord::Base
"
recent = User.exec_sql(sql, user_id: id,
- type: Notification.types[:private_message]).values.map do |id, read|
+ type: Notification.types[:private_message]).values.map do |id, read|
[id.to_i, read == 't'.freeze]
end
MessageBus.publish("/notification/#{id}",
- {unread_notifications: unread_notifications,
- unread_private_messages: unread_private_messages,
- total_unread_notifications: total_unread_notifications,
- read_first_notification: read_first_notification?,
- last_notification: json,
- recent: recent,
- seen_notification_id: seen_notification_id
+ { unread_notifications: unread_notifications,
+ unread_private_messages: unread_private_messages,
+ total_unread_notifications: total_unread_notifications,
+ read_first_notification: read_first_notification?,
+ last_notification: json,
+ recent: recent,
+ seen_notification_id: seen_notification_id
},
user_ids: [id] # only publish the notification to this user
)
@@ -475,7 +473,7 @@ class User < ActiveRecord::Base
last_seen_at.present?
end
- def create_visit_record!(date, opts={})
+ def create_visit_record!(date, opts = {})
user_stat.update_column(:days_visited, user_stat.days_visited + 1)
user_visits.create!(visited_at: date, posts_read: opts[:posts_read] || 0, mobile: opts[:mobile] || false)
end
@@ -488,7 +486,7 @@ class User < ActiveRecord::Base
create_visit_record!(date) unless visit_record_for(date)
end
- def update_posts_read!(num_posts, opts={})
+ def update_posts_read!(num_posts, opts = {})
now = opts[:at] || Time.zone.now
_retry = opts[:retry] || false
@@ -502,7 +500,7 @@ class User < ActiveRecord::Base
create_visit_record!(now.to_date, posts_read: num_posts, mobile: opts.fetch(:mobile, false))
rescue ActiveRecord::RecordNotUnique
if !_retry
- update_posts_read!(num_posts, opts.merge( retry: true ))
+ update_posts_read!(num_posts, opts.merge(retry: true))
else
raise
end
@@ -516,7 +514,7 @@ class User < ActiveRecord::Base
end
end
- def update_last_seen!(now=Time.zone.now)
+ def update_last_seen!(now = Time.zone.now)
now_date = now.to_date
# Only update last seen once every minute
redis_key = "user:#{id}:#{now_date}"
@@ -703,7 +701,7 @@ class User < ActiveRecord::Base
save
end
- def change_trust_level!(level, opts=nil)
+ def change_trust_level!(level, opts = nil)
Promotion.new(self).change_trust_level!(level, opts)
end
@@ -716,26 +714,26 @@ class User < ActiveRecord::Base
user_badges.select('distinct badge_id').count
end
- def featured_user_badges(limit=3)
+ def featured_user_badges(limit = 3)
tl_badge_ids = Badge.trust_level_badge_ids
query = user_badges
- .group(:badge_id)
- .select(UserBadge.attribute_names.map { |x| "MAX(user_badges.#{x}) AS #{x}" },
+ .group(:badge_id)
+ .select(UserBadge.attribute_names.map { |x| "MAX(user_badges.#{x}) AS #{x}" },
'COUNT(*) AS "count"',
'MAX(badges.badge_type_id) AS badges_badge_type_id',
'MAX(badges.grant_count) AS badges_grant_count')
- .joins(:badge)
- .order('badges_badge_type_id ASC, badges_grant_count ASC, badge_id DESC')
- .includes(:user, :granted_by, { badge: :badge_type }, { post: :topic })
+ .joins(:badge)
+ .order('badges_badge_type_id ASC, badges_grant_count ASC, badge_id DESC')
+ .includes(:user, :granted_by, { badge: :badge_type }, post: :topic)
tl_badge = query.where("user_badges.badge_id IN (:tl_badge_ids)",
tl_badge_ids: tl_badge_ids)
- .limit(1)
+ .limit(1)
other_badges = query.where("user_badges.badge_id NOT IN (:tl_badge_ids)",
tl_badge_ids: tl_badge_ids)
- .limit(limit)
+ .limit(limit)
(tl_badge + other_badges).take(limit)
end
@@ -750,7 +748,6 @@ class User < ActiveRecord::Base
result.group('date(users.created_at)').order('date(users.created_at)').count
end
-
def secure_category_ids
cats = self.admin? ? Category.where(read_restricted: true) : secure_categories.references(:categories)
cats.pluck('categories.id').sort
@@ -760,16 +757,15 @@ class User < ActiveRecord::Base
Category.topic_create_allowed(self.id).select(:id)
end
-
# Flag all posts from a user as spam
def flag_linked_posts_as_spam
disagreed_flag_post_ids = PostAction.where(post_action_type_id: PostActionType.types[:spam])
- .where.not(disagreed_at: nil)
- .pluck(:post_id)
+ .where.not(disagreed_at: nil)
+ .pluck(:post_id)
topic_links.includes(:post)
- .where.not(post_id: disagreed_flag_post_ids)
- .each do |tl|
+ .where.not(post_id: disagreed_flag_post_ids)
+ .each do |tl|
begin
message = I18n.t('flag_reason.spam_hosts', domain: tl.domain)
PostAction.act(Discourse.system_user, tl.post, PostActionType.types[:spam], message: message)
@@ -812,7 +808,6 @@ class User < ActiveRecord::Base
.exists?
end
-
def refresh_avatar
return if @import_mode
@@ -868,25 +863,25 @@ class User < ActiveRecord::Base
def number_of_deleted_posts
Post.with_deleted
- .where(user_id: self.id)
- .where.not(deleted_at: nil)
- .count
+ .where(user_id: self.id)
+ .where.not(deleted_at: nil)
+ .count
end
def number_of_flagged_posts
Post.with_deleted
- .where(user_id: self.id)
- .where(id: PostAction.where(post_action_type_id: PostActionType.notify_flag_type_ids)
+ .where(user_id: self.id)
+ .where(id: PostAction.where(post_action_type_id: PostActionType.notify_flag_type_ids)
.where(disagreed_at: nil)
.select(:post_id))
- .count
+ .count
end
def number_of_flags_given
PostAction.where(user_id: self.id)
- .where(disagreed_at: nil)
- .where(post_action_type_id: PostActionType.notify_flag_type_ids)
- .count
+ .where(disagreed_at: nil)
+ .where(post_action_type_id: PostActionType.notify_flag_type_ids)
+ .count
end
def number_of_suspensions
@@ -924,8 +919,8 @@ class User < ActiveRecord::Base
return unless active && email_confirmed? && !staged
Group.where(automatic: false)
- .where("LENGTH(COALESCE(automatic_membership_email_domains, '')) > 0")
- .each do |group|
+ .where("LENGTH(COALESCE(automatic_membership_email_domains, '')) > 0")
+ .each do |group|
domains = group.automatic_membership_email_domains.gsub('.', '\.')
@@ -1064,10 +1059,10 @@ class User < ActiveRecord::Base
# Delete unactivated accounts (without verified email) that are over a week old
def self.purge_unactivated
to_destroy = User.where(active: false)
- .joins('INNER JOIN user_stats AS us ON us.user_id = users.id')
- .where("created_at < ?", SiteSetting.purge_unactivated_users_grace_period_days.days.ago)
- .where('NOT admin AND NOT moderator')
- .limit(200)
+ .joins('INNER JOIN user_stats AS us ON us.user_id = users.id')
+ .where("created_at < ?", SiteSetting.purge_unactivated_users_grace_period_days.days.ago)
+ .where('NOT admin AND NOT moderator')
+ .limit(200)
destroyer = UserDestroyer.new(Discourse.system_user)
to_destroy.each do |u|
diff --git a/app/models/user_action.rb b/app/models/user_action.rb
index 5e3599a381b..b65f207af36 100644
--- a/app/models/user_action.rb
+++ b/app/models/user_action.rb
@@ -11,7 +11,7 @@ class UserAction < ActiveRecord::Base
BOOKMARK = 3
NEW_TOPIC = 4
REPLY = 5
- RESPONSE= 6
+ RESPONSE = 6
MENTION = 7
QUOTE = 9
EDIT = 11
@@ -75,7 +75,7 @@ SQL
apply_common_filters(builder, user_id, guardian)
results = builder.exec.to_a
- results.sort! { |a,b| ORDER[a.action_type] <=> ORDER[b.action_type] }
+ results.sort! { |a, b| ORDER[a.action_type] <=> ORDER[b.action_type] }
results
end
@@ -109,10 +109,10 @@ SQL
GROUP BY g.name
SQL
- result = { all: all, mine: mine, unread: unread}
+ result = { all: all, mine: mine, unread: unread }
exec_sql(sql, user_id: user_id).each do |row|
- (result[:groups] ||= []) << {name: row["name"], count: row["count"].to_i}
+ (result[:groups] ||= []) << { name: row["name"], count: row["count"].to_i }
end
result
@@ -123,7 +123,7 @@ SQL
stream(action_id: action_id, guardian: guardian).first
end
- def self.stream_queued(opts=nil)
+ def self.stream_queued(opts = nil)
opts ||= {}
offset = opts[:offset] || 0
@@ -156,7 +156,7 @@ SQL
.map_exec(UserActionRow)
end
- def self.stream(opts=nil)
+ def self.stream(opts = nil)
opts ||= {}
action_types = opts[:action_types]
@@ -276,7 +276,7 @@ SQL
require_parameters(hash, :action_type, :user_id, :acting_user_id, :target_topic_id, :target_post_id)
if action = UserAction.find_by(hash.except(:created_at))
action.destroy
- MessageBus.publish("/user/#{hash[:user_id]}", {user_action_id: action.id, remove: true})
+ MessageBus.publish("/user/#{hash[:user_id]}", user_action_id: action.id, remove: true)
end
if !Topic.where(id: hash[:target_topic_id], archetype: Archetype.private_message).exists?
@@ -331,7 +331,7 @@ SQL
end
end
- def self.apply_common_filters(builder,user_id,guardian,ignore_private_messages=false)
+ def self.apply_common_filters(builder, user_id, guardian, ignore_private_messages = false)
# We never return deleted topics in activity
builder.where("t.deleted_at is null")
@@ -341,7 +341,7 @@ SQL
current_user_id = -2
current_user_id = guardian.user.id if guardian.user
- builder.where("NOT COALESCE(p.hidden, false) OR p.user_id = :current_user_id", current_user_id: current_user_id )
+ builder.where("NOT COALESCE(p.hidden, false) OR p.user_id = :current_user_id", current_user_id: current_user_id)
end
visible_post_types = Topic.visible_post_types(guardian.user)
@@ -381,7 +381,7 @@ SQL
if allowed.present?
builder.where("( c.read_restricted IS NULL OR
NOT c.read_restricted OR
- (c.read_restricted and c.id in (:cats)) )", cats: guardian.secure_category_ids )
+ (c.read_restricted and c.id in (:cats)) )", cats: guardian.secure_category_ids)
else
builder.where("(c.read_restricted IS NULL OR NOT c.read_restricted)")
end
diff --git a/app/models/user_api_key.rb b/app/models/user_api_key.rb
index be0e85b7f8a..39f8d4a80f9 100644
--- a/app/models/user_api_key.rb
+++ b/app/models/user_api_key.rb
@@ -30,7 +30,7 @@ class UserApiKey < ActiveRecord::Base
# not a rails route, special handling
return true if action == "message_bus" && env["PATH_INFO"] =~ /^\/message-bus\/.*\/poll/
- params = env['action_dispatch.request.path_parameters']
+ params = env['action_dispatch.request.path_parameters']
return false unless params
diff --git a/app/models/user_archived_message.rb b/app/models/user_archived_message.rb
index 1cb45c81654..36c3ccd1ac4 100644
--- a/app/models/user_archived_message.rb
+++ b/app/models/user_archived_message.rb
@@ -11,21 +11,21 @@ class UserArchivedMessage < ActiveRecord::Base
UserArchivedMessage.where(user_id: user_id, topic_id: topic_id).destroy_all
trigger(:move_to_inbox, user_id, topic_id)
- MessageBus.publish("/topic/#{topic_id}", {type: "move_to_inbox"}, user_ids: [user_id])
+ MessageBus.publish("/topic/#{topic_id}", { type: "move_to_inbox" }, user_ids: [user_id])
end
def self.archive!(user_id, topic_id)
UserArchivedMessage.where(user_id: user_id, topic_id: topic_id).destroy_all
UserArchivedMessage.create!(user_id: user_id, topic_id: topic_id)
trigger(:archive_message, user_id, topic_id)
- MessageBus.publish("/topic/#{topic_id}", {type: "archived"}, user_ids: [user_id])
+ MessageBus.publish("/topic/#{topic_id}", { type: "archived" }, user_ids: [user_id])
end
def self.trigger(event, user_id, topic_id)
user = User.find_by(id: user_id)
topic = Topic.find_by(id: topic_id)
if user && topic
- DiscourseEvent.trigger(event, {user: user, topic: topic})
+ DiscourseEvent.trigger(event, user: user, topic: topic)
end
end
end
diff --git a/app/models/user_auth_token.rb b/app/models/user_auth_token.rb
index 7a22ea5931c..5597d523679 100644
--- a/app/models/user_auth_token.rb
+++ b/app/models/user_auth_token.rb
@@ -40,7 +40,7 @@ class UserAuthToken < ActiveRecord::Base
user_auth_token
end
- def self.lookup(unhashed_token, opts=nil)
+ def self.lookup(unhashed_token, opts = nil)
mark_seen = opts && opts[:seen]
@@ -123,7 +123,7 @@ class UserAuthToken < ActiveRecord::Base
end
- def rotate!(info=nil)
+ def rotate!(info = nil)
user_agent = (info && info[:user_agent] || self.user_agent)
client_ip = (info && info[:client_ip] || self.client_ip)
diff --git a/app/models/user_avatar.rb b/app/models/user_avatar.rb
index 0c49693ddbf..8e9de17baf1 100644
--- a/app/models/user_avatar.rb
+++ b/app/models/user_avatar.rb
@@ -67,7 +67,7 @@ class UserAvatar < ActiveRecord::Base
"#{upload_id}_#{OptimizedImage::VERSION}"
end
- def self.import_url_for_user(avatar_url, user, options=nil)
+ def self.import_url_for_user(avatar_url, user, options = nil)
tempfile = FileHelper.download(
avatar_url,
max_file_size: SiteSetting.max_image_size_kb.kilobytes,
diff --git a/app/models/user_badge.rb b/app/models/user_badge.rb
index a50bf1be726..f7b8b55569c 100644
--- a/app/models/user_badge.rb
+++ b/app/models/user_badge.rb
@@ -5,7 +5,7 @@ class UserBadge < ActiveRecord::Base
belongs_to :notification, dependent: :destroy
belongs_to :post
- validates :badge_id, presence: true, uniqueness: {scope: :user_id}, if: 'badge.single_grant?'
+ validates :badge_id, presence: true, uniqueness: { scope: :user_id }, if: 'badge.single_grant?'
validates :user_id, presence: true
validates :granted_at, presence: true
validates :granted_by, presence: true
diff --git a/app/models/user_badges.rb b/app/models/user_badges.rb
index 187ee1bc9f8..bd68c4c037b 100644
--- a/app/models/user_badges.rb
+++ b/app/models/user_badges.rb
@@ -4,7 +4,7 @@ class UserBadges
attr_accessor :user_badges, :username, :grant_count
- def initialize(opts={})
+ def initialize(opts = {})
@user_badges = opts[:user_badges]
@username = opts[:username]
@grant_count = opts[:grant_count]
diff --git a/app/models/user_email.rb b/app/models/user_email.rb
index d97077c20a9..b67a6cd3ca9 100644
--- a/app/models/user_email.rb
+++ b/app/models/user_email.rb
@@ -8,7 +8,7 @@ class UserEmail < ActiveRecord::Base
validates :email, presence: true, uniqueness: true
validates :email, email: true, format: { with: EmailValidator.email_regex },
- if: :skip_email_validation?
+ if: :skip_email_validation?
validates :primary, uniqueness: { scope: [:user_id] }
diff --git a/app/models/user_history.rb b/app/models/user_history.rb
index e177cd8de4a..c1665874684 100644
--- a/app/models/user_history.rb
+++ b/app/models/user_history.rb
@@ -11,7 +11,7 @@ class UserHistory < ActiveRecord::Base
validates_presence_of :action
- scope :only_staff_actions, ->{ where("action IN (?)", UserHistory.staff_action_ids) }
+ scope :only_staff_actions, -> { where("action IN (?)", UserHistory.staff_action_ids) }
before_save :set_admin_only
@@ -121,7 +121,7 @@ class UserHistory < ActiveRecord::Base
query = query.where(custom_type: filters[:custom_type]) if filters[:custom_type].present?
[:acting_user, :target_user].each do |key|
- if filters[key] and obj_id = User.where(username_lower: filters[key].downcase).pluck(:id)
+ if filters[key] && (obj_id = User.where(username_lower: filters[key].downcase).pluck(:id))
query = query.where("#{key}_id = ?", obj_id)
end
end
@@ -133,7 +133,7 @@ class UserHistory < ActiveRecord::Base
self.where(target_user_id: user.id, action: UserHistory.actions[action_type])
end
- def self.exists_for_user?(user, action_type, opts=nil)
+ def self.exists_for_user?(user, action_type, opts = nil)
opts = opts || {}
result = self.where(target_user_id: user.id, action: UserHistory.actions[action_type])
result = result.where(topic_id: opts[:topic_id]) if opts[:topic_id]
@@ -144,14 +144,13 @@ class UserHistory < ActiveRecord::Base
[:action_id, :custom_type, :acting_user, :target_user, :subject]
end
- def self.staff_action_records(viewer, opts=nil)
+ def self.staff_action_records(viewer, opts = nil)
opts ||= {}
query = self.with_filters(opts.slice(*staff_filters)).only_staff_actions.limit(200).order('id DESC').includes(:acting_user, :target_user)
query = query.where(admin_only: false) unless viewer && viewer.admin?
query
end
-
def set_admin_only
self.admin_only = UserHistory.admin_only_action_ids.include?(self.action)
self
diff --git a/app/models/user_option.rb b/app/models/user_option.rb
index 551380335dd..ee46d5b77e1 100644
--- a/app/models/user_option.rb
+++ b/app/models/user_option.rb
@@ -8,7 +8,7 @@ class UserOption < ActiveRecord::Base
def self.ensure_consistency!
exec_sql("SELECT u.id FROM users u
LEFT JOIN user_options o ON o.user_id = u.id
- WHERE o.user_id IS NULL").values.each do |id,_|
+ WHERE o.user_id IS NULL").values.each do |id, _|
UserOption.create(user_id: id.to_i)
end
end
@@ -94,7 +94,6 @@ class UserOption < ActiveRecord::Base
# top must be in the top_menu
return unless SiteSetting.top_menu =~ /(^|\|)top(\||$)/i
-
# not enough topics
return unless period = SiteSetting.min_redirected_to_top_period(1.days.ago)
@@ -118,14 +117,18 @@ class UserOption < ActiveRecord::Base
def treat_as_new_topic_start_date
duration = new_topic_duration_minutes || SiteSetting.default_other_new_topic_duration_minutes.to_i
- times = [case duration
+ times = [
+ case duration
when User::NewTopicDuration::ALWAYS
user.created_at
when User::NewTopicDuration::LAST_VISIT
user.previous_visit_at || user.user_stat.new_since
else
duration.minutes.ago
- end, user.user_stat.new_since, Time.at(SiteSetting.min_new_topics_time).to_datetime]
+ end,
+ user.user_stat.new_since,
+ Time.at(SiteSetting.min_new_topics_time).to_datetime
+ ]
times.max
end
diff --git a/app/models/user_profile.rb b/app/models/user_profile.rb
index a6ceec48584..8ce2d186d4a 100644
--- a/app/models/user_profile.rb
+++ b/app/models/user_profile.rb
@@ -19,7 +19,7 @@ class UserProfile < ActiveRecord::Base
BAKED_VERSION = 1
- def bio_excerpt(length=350, opts={})
+ def bio_excerpt(length = 350, opts = {})
excerpt = PrettyText.excerpt(bio_cooked, length, opts).sub(/ $/, '')
return excerpt if excerpt.blank? || (user.has_trust_level?(TrustLevel[1]) && !user.suspended?)
PrettyText.strip_links(excerpt)
@@ -63,11 +63,11 @@ class UserProfile < ActiveRecord::Base
def self.rebake_old(limit)
problems = []
UserProfile.where('bio_cooked_version IS NULL OR bio_cooked_version < ?', BAKED_VERSION)
- .limit(limit).each do |p|
+ .limit(limit).each do |p|
begin
p.rebake!
rescue => e
- problems << {profile: p, ex: e}
+ problems << { profile: p, ex: e }
end
end
problems
diff --git a/app/models/user_profile_view.rb b/app/models/user_profile_view.rb
index efe43cd42e1..716b26c07c3 100644
--- a/app/models/user_profile_view.rb
+++ b/app/models/user_profile_view.rb
@@ -3,7 +3,7 @@ class UserProfileView < ActiveRecord::Base
belongs_to :user_profile
- def self.add(user_profile_id, ip, user_id=nil, at=nil, skip_redis=false)
+ def self.add(user_profile_id, ip, user_id = nil, at = nil, skip_redis = false)
at ||= Time.zone.now
redis_key = "user-profile-view:#{user_profile_id}:#{at.to_date}"
if user_id
@@ -41,7 +41,7 @@ class UserProfileView < ActiveRecord::Base
end
end
- def self.profile_views_by_day(start_date, end_date, group_id=nil)
+ def self.profile_views_by_day(start_date, end_date, group_id = nil)
profile_views = self.where("viewed_at >= ? AND viewed_at < ?", start_date, end_date + 1.day)
if group_id
profile_views = profile_views.joins("INNER JOIN users ON users.id = user_profile_views.user_id")
diff --git a/app/models/user_search.rb b/app/models/user_search.rb
index 9b6c02c6ac8..6fe2db9b22c 100644
--- a/app/models/user_search.rb
+++ b/app/models/user_search.rb
@@ -3,7 +3,7 @@ require_dependency 'search'
class UserSearch
- def initialize(term, opts={})
+ def initialize(term, opts = {})
@term = term
@term_like = "#{term.downcase.gsub("_", "\\_")}%"
@topic_id = opts[:topic_id]
@@ -34,8 +34,8 @@ class UserSearch
if topic.category && topic.category.read_restricted
users = users.includes(:secure_categories)
- .where("users.admin = TRUE OR categories.id = ?", topic.category.id)
- .references(:categories)
+ .where("users.admin = TRUE OR categories.id = ?", topic.category.id)
+ .references(:categories)
end
end
@@ -50,9 +50,9 @@ class UserSearch
query = Search.ts_query(@term, "simple")
users = users.includes(:user_search_data)
- .references(:user_search_data)
- .where("user_search_data.search_data @@ #{query}")
- .order(User.sql_fragment("CASE WHEN username_lower LIKE ? THEN 0 ELSE 1 END ASC", @term_like))
+ .references(:user_search_data)
+ .where("user_search_data.search_data @@ #{query}")
+ .order(User.sql_fragment("CASE WHEN username_lower LIKE ? THEN 0 ELSE 1 END ASC", @term_like))
else
users = users.where("username_lower LIKE :term_like", term_like: @term_like)
@@ -68,9 +68,9 @@ class UserSearch
# 1. exact username matches
if @term.present?
scoped_users.where(username_lower: @term.downcase)
- .limit(@limit)
- .pluck(:id)
- .each { |id| users << id }
+ .limit(@limit)
+ .pluck(:id)
+ .each { |id| users << id }
end
@@ -79,19 +79,19 @@ class UserSearch
# 2. in topic
if @topic_id
filtered_by_term_users.where('users.id IN (SELECT p.user_id FROM posts p WHERE topic_id = ?)', @topic_id)
- .order('last_seen_at DESC')
- .limit(@limit - users.length)
- .pluck(:id)
- .each { |id| users << id }
+ .order('last_seen_at DESC')
+ .limit(@limit - users.length)
+ .pluck(:id)
+ .each { |id| users << id }
end
return users.to_a if users.length >= @limit
# 3. global matches
filtered_by_term_users.order('last_seen_at DESC')
- .limit(@limit - users.length)
- .pluck(:id)
- .each { |id| users << id }
+ .limit(@limit - users.length)
+ .pluck(:id)
+ .each { |id| users << id }
users.to_a
end
@@ -103,7 +103,7 @@ class UserSearch
User.joins("JOIN (SELECT unnest uid, row_number() OVER () AS rn
FROM unnest('{#{ids.join(",")}}'::int[])
) x on uid = users.id")
- .order("rn")
+ .order("rn")
end
end
diff --git a/app/models/user_stat.rb b/app/models/user_stat.rb
index 50761737e3f..51ca626c3ae 100644
--- a/app/models/user_stat.rb
+++ b/app/models/user_stat.rb
@@ -10,8 +10,8 @@ class UserStat < ActiveRecord::Base
def self.reset_bounce_scores
UserStat.where("reset_bounce_score_after < now()")
- .where("bounce_score > 0")
- .update_all(bounce_score: 0)
+ .where("bounce_score > 0")
+ .update_all(bounce_score: 0)
end
# Updates the denormalized view counts for all users
@@ -55,14 +55,14 @@ class UserStat < ActiveRecord::Base
def update_topic_reply_count
self.topic_reply_count =
Topic
- .where(['id in (
+ .where(['id in (
SELECT topic_id FROM posts p
JOIN topics t2 ON t2.id = p.topic_id
WHERE p.deleted_at IS NULL AND
t2.user_id <> p.user_id AND
p.user_id = ?
)', self.user_id])
- .count
+ .count
end
MAX_TIME_READ_DIFF = 100
diff --git a/app/models/user_summary.rb b/app/models/user_summary.rb
index abfc9b8f514..0cf714cfac0 100644
--- a/app/models/user_summary.rb
+++ b/app/models/user_summary.rb
@@ -53,18 +53,18 @@ class UserSummary
def most_liked_by_users
likers = {}
UserAction.joins(:target_topic, :target_post)
- .merge(Topic.listable_topics.visible.secured(@guardian))
- .where(user: @user)
- .where(action_type: UserAction::WAS_LIKED)
- .group(:acting_user_id)
- .order('COUNT(*) DESC')
- .limit(MAX_SUMMARY_RESULTS)
- .pluck('acting_user_id, COUNT(*)')
- .each { |l| likers[l[0].to_s] = l[1] }
+ .merge(Topic.listable_topics.visible.secured(@guardian))
+ .where(user: @user)
+ .where(action_type: UserAction::WAS_LIKED)
+ .group(:acting_user_id)
+ .order('COUNT(*) DESC')
+ .limit(MAX_SUMMARY_RESULTS)
+ .pluck('acting_user_id, COUNT(*)')
+ .each { |l| likers[l[0].to_s] = l[1] }
User.where(id: likers.keys)
- .pluck(:id, :username, :name, :uploaded_avatar_id)
- .map do |u|
+ .pluck(:id, :username, :name, :uploaded_avatar_id)
+ .map do |u|
UserWithCount.new(
id: u[0],
username: u[1],
@@ -78,18 +78,18 @@ class UserSummary
def most_liked_users
liked_users = {}
UserAction.joins(:target_topic, :target_post)
- .merge(Topic.listable_topics.visible.secured(@guardian))
- .where(action_type: UserAction::WAS_LIKED)
- .where(acting_user_id: @user.id)
- .group(:user_id)
- .order('COUNT(*) DESC')
- .limit(MAX_SUMMARY_RESULTS)
- .pluck('user_actions.user_id, COUNT(*)')
- .each { |l| liked_users[l[0].to_s] = l[1] }
+ .merge(Topic.listable_topics.visible.secured(@guardian))
+ .where(action_type: UserAction::WAS_LIKED)
+ .where(acting_user_id: @user.id)
+ .group(:user_id)
+ .order('COUNT(*) DESC')
+ .limit(MAX_SUMMARY_RESULTS)
+ .pluck('user_actions.user_id, COUNT(*)')
+ .each { |l| liked_users[l[0].to_s] = l[1] }
User.where(id: liked_users.keys)
- .pluck(:id, :username, :name, :uploaded_avatar_id)
- .map do |u|
+ .pluck(:id, :username, :name, :uploaded_avatar_id)
+ .map do |u|
UserWithCount.new(
id: u[0],
username: u[1],
@@ -120,8 +120,8 @@ class UserSummary
.each { |r| replied_users[r[0].to_s] = r[1] }
User.where(id: replied_users.keys)
- .pluck(:id, :username, :name, :uploaded_avatar_id)
- .map do |u|
+ .pluck(:id, :username, :name, :uploaded_avatar_id)
+ .map do |u|
UserWithCount.new(
id: u[0],
username: u[1],
diff --git a/app/models/user_visit.rb b/app/models/user_visit.rb
index 5ebe059167b..63734ef207b 100644
--- a/app/models/user_visit.rb
+++ b/app/models/user_visit.rb
@@ -1,6 +1,6 @@
class UserVisit < ActiveRecord::Base
- def self.counts_by_day_query(start_date, end_date, group_id=nil)
+ def self.counts_by_day_query(start_date, end_date, group_id = nil)
result = where('visited_at >= ? and visited_at <= ?', start_date.to_date, end_date.to_date)
if group_id
@@ -12,11 +12,11 @@ class UserVisit < ActiveRecord::Base
end
# A count of visits in a date range by day
- def self.by_day(start_date, end_date, group_id=nil)
+ def self.by_day(start_date, end_date, group_id = nil)
counts_by_day_query(start_date, end_date, group_id).count
end
- def self.mobile_by_day(start_date, end_date, group_id=nil)
+ def self.mobile_by_day(start_date, end_date, group_id = nil)
counts_by_day_query(start_date, end_date, group_id).where(mobile: true).count
end
diff --git a/app/models/watched_word.rb b/app/models/watched_word.rb
index d9cbd4edc19..a0cc43e867a 100644
--- a/app/models/watched_word.rb
+++ b/app/models/watched_word.rb
@@ -30,7 +30,6 @@ class WatchedWord < ActiveRecord::Base
scope :by_action, -> { order("action ASC, word ASC") }
-
def self.normalize_word(w)
w.strip.downcase.squeeze('*')
end
diff --git a/app/models/web_hook.rb b/app/models/web_hook.rb
index 40fed09de63..e3335e02043 100644
--- a/app/models/web_hook.rb
+++ b/app/models/web_hook.rb
@@ -30,8 +30,8 @@ class WebHook < ActiveRecord::Base
def self.find_by_type(type)
WebHook.where(active: true)
- .joins(:web_hook_event_types)
- .where("web_hooks.wildcard_web_hook = ? OR web_hook_event_types.name = ?", true, type.to_s)
+ .joins(:web_hook_event_types)
+ .where("web_hooks.wildcard_web_hook = ? OR web_hook_event_types.name = ?", true, type.to_s)
end
def self.enqueue_hooks(type, opts = {})
@@ -40,11 +40,11 @@ class WebHook < ActiveRecord::Base
end
end
- def self.enqueue_topic_hooks(event, topic, user=nil)
+ def self.enqueue_topic_hooks(event, topic, user = nil)
WebHook.enqueue_hooks(:topic, topic_id: topic.id, category_id: topic&.category_id, event_name: event.to_s)
end
- def self.enqueue_post_hooks(event, post, user=nil)
+ def self.enqueue_post_hooks(event, post, user = nil)
WebHook.enqueue_hooks(:post, post_id: post.id, category_id: post&.topic&.category_id, event_name: event.to_s)
end
end
diff --git a/app/models/web_hook_event.rb b/app/models/web_hook_event.rb
index f10b5cde316..0626c7fecc5 100644
--- a/app/models/web_hook_event.rb
+++ b/app/models/web_hook_event.rb
@@ -6,12 +6,14 @@ class WebHookEvent < ActiveRecord::Base
default_scope { order('created_at DESC') }
def update_web_hook_delivery_status
- web_hook.last_delivery_status = case status
- when 200..299
- WebHook.last_delivery_statuses[:successful]
- else
- WebHook.last_delivery_statuses[:failed]
- end
+ web_hook.last_delivery_status =
+ case status
+ when 200..299
+ WebHook.last_delivery_statuses[:successful]
+ else
+ WebHook.last_delivery_statuses[:failed]
+ end
+
web_hook.save!
end
end
diff --git a/app/serializers/admin_badge_serializer.rb b/app/serializers/admin_badge_serializer.rb
index 535d27d1bdf..4f57896d90e 100644
--- a/app/serializers/admin_badge_serializer.rb
+++ b/app/serializers/admin_badge_serializer.rb
@@ -2,6 +2,6 @@ class AdminBadgeSerializer < BadgeSerializer
attributes :query, :trigger, :target_posts, :auto_revoke, :show_posts
def include_long_description?
- true
+ true
end
end
diff --git a/app/serializers/admin_user_action_serializer.rb b/app/serializers/admin_user_action_serializer.rb
index 0cc58aa27a6..dfe2cbc6314 100644
--- a/app/serializers/admin_user_action_serializer.rb
+++ b/app/serializers/admin_user_action_serializer.rb
@@ -75,8 +75,8 @@ class AdminUserActionSerializer < ApplicationSerializer
def action_type
object.user_actions.select { |ua| ua.user_id = object.user_id }
- .select { |ua| [UserAction::REPLY, UserAction::RESPONSE].include? ua.action_type }
- .first.try(:action_type)
+ .select { |ua| [UserAction::REPLY, UserAction::RESPONSE].include? ua.action_type }
+ .first.try(:action_type)
end
private
diff --git a/app/serializers/category_and_topic_lists_serializer.rb b/app/serializers/category_and_topic_lists_serializer.rb
index 239bc079819..173b417d463 100644
--- a/app/serializers/category_and_topic_lists_serializer.rb
+++ b/app/serializers/category_and_topic_lists_serializer.rb
@@ -5,7 +5,7 @@ class CategoryAndTopicListsSerializer < ApplicationSerializer
def users
users = object.topic_list.topics.map do |t|
- t.posters.map{|poster| poster.try(:user)}
+ t.posters.map { |poster| poster.try(:user) }
end
users.flatten!
users.compact!
diff --git a/app/serializers/category_serializer.rb b/app/serializers/category_serializer.rb
index f482dd7e13d..dae914fc6dc 100644
--- a/app/serializers/category_serializer.rb
+++ b/app/serializers/category_serializer.rb
@@ -35,7 +35,7 @@ class CategorySerializer < BasicCategorySerializer
end
def available_groups
- Group.order(:name).pluck(:name) - group_permissions.map{|g| g[:group_name]}
+ Group.order(:name).pluck(:name) - group_permissions.map { |g| g[:group_name] }
end
def can_delete
@@ -44,7 +44,7 @@ class CategorySerializer < BasicCategorySerializer
def include_is_special?
[SiteSetting.meta_category_id, SiteSetting.staff_category_id, SiteSetting.uncategorized_category_id]
- .include? object.id
+ .include? object.id
end
def is_special
@@ -76,7 +76,7 @@ class CategorySerializer < BasicCategorySerializer
end
def notification_level
- user = scope && scope.user
+ user = scope && scope.user
object.notification_level ||
(user && CategoryUser.where(user: user, category: object).first.try(:notification_level))
end
diff --git a/app/serializers/current_user_serializer.rb b/app/serializers/current_user_serializer.rb
index 80de2e205c7..a02c99d02b5 100644
--- a/app/serializers/current_user_serializer.rb
+++ b/app/serializers/current_user_serializer.rb
@@ -137,7 +137,7 @@ class CurrentUserSerializer < BasicUserSerializer
def muted_category_ids
@muted_category_ids ||= CategoryUser.where(user_id: object.id,
notification_level: TopicUser.notification_levels[:muted])
- .pluck(:category_id)
+ .pluck(:category_id)
end
def dismissed_banner_key
diff --git a/app/serializers/detailed_user_badge_serializer.rb b/app/serializers/detailed_user_badge_serializer.rb
index 1fa408844df..b32f72b6b85 100644
--- a/app/serializers/detailed_user_badge_serializer.rb
+++ b/app/serializers/detailed_user_badge_serializer.rb
@@ -10,7 +10,6 @@ class DetailedUserBadgeSerializer < BasicUserBadgeSerializer
alias :include_topic_id? :include_post_number?
alias :include_topic_title? :include_post_number?
-
def post_number
object.post.post_number if object.post
end
diff --git a/app/serializers/post_action_type_serializer.rb b/app/serializers/post_action_type_serializer.rb
index 4e66641105d..e0bf6f7c971 100644
--- a/app/serializers/post_action_type_serializer.rb
+++ b/app/serializers/post_action_type_serializer.rb
@@ -8,7 +8,7 @@ class PostActionTypeSerializer < ApplicationSerializer
def is_custom_flag
object.id == PostActionType.types[:notify_user] ||
- object.id == PostActionType.types[:notify_moderators]
+ object.id == PostActionType.types[:notify_moderators]
end
def name
@@ -20,16 +20,16 @@ class PostActionTypeSerializer < ApplicationSerializer
end
def description
- i18n('description', {tos_url: tos_path})
+ i18n('description', tos_url: tos_path)
end
def short_description
- i18n('short_description', {tos_url: tos_path})
+ i18n('short_description', tos_url: tos_path)
end
protected
- def i18n(field, vars=nil)
+ def i18n(field, vars = nil)
key = "post_action_types.#{object.name_key}.#{field}"
vars ? I18n.t(key, vars) : I18n.t(key)
end
diff --git a/app/serializers/post_item_excerpt.rb b/app/serializers/post_item_excerpt.rb
index be74db9bdf9..7f0cc6322b2 100644
--- a/app/serializers/post_item_excerpt.rb
+++ b/app/serializers/post_item_excerpt.rb
@@ -22,4 +22,3 @@ module PostItemExcerpt
end
end
-
diff --git a/app/serializers/post_revision_serializer.rb b/app/serializers/post_revision_serializer.rb
index 5c1a05f603e..11b13677f4e 100644
--- a/app/serializers/post_revision_serializer.rb
+++ b/app/serializers/post_revision_serializer.rb
@@ -27,7 +27,6 @@ class PostRevisionSerializer < ApplicationSerializer
:wiki,
:can_edit
-
# Creates a field called field_name_changes with previous and
# current members if a field has changed in this revision
def self.add_compared_field(field)
@@ -59,8 +58,8 @@ class PostRevisionSerializer < ApplicationSerializer
def previous_revision
@previous_revision ||= revisions.select { |r| r["revision"] >= first_revision }
- .select { |r| r["revision"] < current_revision }
- .last.try(:[], "revision")
+ .select { |r| r["revision"] < current_revision }
+ .last.try(:[], "revision")
end
def current_revision
@@ -69,8 +68,8 @@ class PostRevisionSerializer < ApplicationSerializer
def next_revision
@next_revision ||= revisions.select { |r| r["revision"] <= last_revision }
- .select { |r| r["revision"] > current_revision }
- .first.try(:[], "revision")
+ .select { |r| r["revision"] > current_revision }
+ .first.try(:[], "revision")
end
def last_revision
diff --git a/app/serializers/site_serializer.rb b/app/serializers/site_serializer.rb
index 1b474185336..ecd93e02ae9 100644
--- a/app/serializers/site_serializer.rb
+++ b/app/serializers/site_serializer.rb
@@ -37,16 +37,16 @@ class SiteSerializer < ApplicationSerializer
cache_fragment("user_themes") do
Theme.where('key = :default OR user_selectable',
default: SiteSetting.default_theme_key)
- .order(:name)
- .pluck(:key, :name)
- .map{|k,n| {theme_key: k, name: n, default: k == SiteSetting.default_theme_key}}
- .as_json
+ .order(:name)
+ .pluck(:key, :name)
+ .map { |k, n| { theme_key: k, name: n, default: k == SiteSetting.default_theme_key } }
+ .as_json
end
end
def groups
cache_fragment("group_names") do
- Group.order(:name).pluck(:id,:name).map { |id,name| { id: id, name: name } }.as_json
+ Group.order(:name).pluck(:id, :name).map { |id, name| { id: id, name: name } }.as_json
end
end
diff --git a/app/serializers/site_text_serializer.rb b/app/serializers/site_text_serializer.rb
index c686a080087..f0e3c1e4c3e 100644
--- a/app/serializers/site_text_serializer.rb
+++ b/app/serializers/site_text_serializer.rb
@@ -19,4 +19,3 @@ class SiteTextSerializer < ApplicationSerializer
alias_method :can_revert?, :overridden?
end
-
diff --git a/app/serializers/topic_flag_type_serializer.rb b/app/serializers/topic_flag_type_serializer.rb
index a764d1a8209..ee81618448b 100644
--- a/app/serializers/topic_flag_type_serializer.rb
+++ b/app/serializers/topic_flag_type_serializer.rb
@@ -2,9 +2,9 @@ class TopicFlagTypeSerializer < PostActionTypeSerializer
protected
- def i18n(field, vars=nil)
+ def i18n(field, vars = nil)
key = "topic_flag_types.#{object.name_key}.#{field}"
- vars ? I18n.t(key,vars) : I18n.t(key)
+ vars ? I18n.t(key, vars) : I18n.t(key)
end
end
diff --git a/app/serializers/topic_view_serializer.rb b/app/serializers/topic_view_serializer.rb
index 23682bd629c..49be96b8c7e 100644
--- a/app/serializers/topic_view_serializer.rb
+++ b/app/serializers/topic_view_serializer.rb
@@ -90,7 +90,7 @@ class TopicViewSerializer < ApplicationSerializer
if object.post_counts_by_user.present?
result[:participants] = object.post_counts_by_user.map do |pc|
- TopicPostCountSerializer.new({user: object.participants[pc[0]], post_count: pc[1]}, scope: scope, root: false)
+ TopicPostCountSerializer.new({ user: object.participants[pc[0]], post_count: pc[1] }, scope: scope, root: false)
end
end
@@ -220,7 +220,7 @@ class TopicViewSerializer < ApplicationSerializer
result << { id: id,
count: 0,
hidden: false,
- can_act: scope.post_can_act?(post, sym)}
+ can_act: scope.post_can_act?(post, sym) }
# TODO: other keys? :can_defer_flags, :acted, :can_undo
end
result
diff --git a/app/serializers/user_action_serializer.rb b/app/serializers/user_action_serializer.rb
index 81b2cb2fe60..c6abea6a5ce 100644
--- a/app/serializers/user_action_serializer.rb
+++ b/app/serializers/user_action_serializer.rb
@@ -31,7 +31,6 @@ class UserActionSerializer < ApplicationSerializer
:closed,
:archived
-
def avatar_template
User.avatar_template(object.username, object.uploaded_avatar_id)
end
diff --git a/app/serializers/user_option_serializer.rb b/app/serializers/user_option_serializer.rb
index a6a7caeb236..b8253b40d78 100644
--- a/app/serializers/user_option_serializer.rb
+++ b/app/serializers/user_option_serializer.rb
@@ -22,7 +22,6 @@ class UserOptionSerializer < ApplicationSerializer
:theme_key,
:theme_key_seq
-
def auto_track_topics_after_msecs
object.auto_track_topics_after_msecs || SiteSetting.default_other_auto_track_topics_after_msecs
end
diff --git a/app/serializers/user_serializer.rb b/app/serializers/user_serializer.rb
index 0e75983daf4..f41f7629488 100644
--- a/app/serializers/user_serializer.rb
+++ b/app/serializers/user_serializer.rb
@@ -125,12 +125,12 @@ class UserSerializer < BasicUserSerializer
def mailing_list_posts_per_day
val = Post.estimate_posts_per_day
- [val,SiteSetting.max_emails_per_day_per_user].min
+ [val, SiteSetting.max_emails_per_day_per_user].min
end
def groups
object.groups.order(:id)
- .visible_groups(scope.user)
+ .visible_groups(scope.user)
end
def group_users
@@ -145,13 +145,12 @@ class UserSerializer < BasicUserSerializer
!(SiteSetting.enable_sso && SiteSetting.sso_overrides_bio)
end
-
def user_api_keys
keys = object.user_api_keys.where(revoked_at: nil).map do |k|
{
id: k.id,
application_name: k.application_name,
- scopes: k.scopes.map{|s| I18n.t("user_api_key.scopes.#{s}")},
+ scopes: k.scopes.map { |s| I18n.t("user_api_key.scopes.#{s}") },
created_at: k.created_at
}
end
@@ -178,7 +177,7 @@ class UserSerializer < BasicUserSerializer
def website_name
uri = URI(website.to_s) rescue nil
return if uri.nil? || uri.host.nil?
- uri.host.sub(/^www\./,'') + uri.path
+ uri.host.sub(/^www\./, '') + uri.path
end
def include_website_name
@@ -248,7 +247,7 @@ class UserSerializer < BasicUserSerializer
end
def bio_excerpt
- object.user_profile.bio_excerpt(350 , { keep_newlines: true, keep_emoji_images: true })
+ object.user_profile.bio_excerpt(350 , keep_newlines: true, keep_emoji_images: true)
end
def include_suspend_reason?
diff --git a/app/services/badge_granter.rb b/app/services/badge_granter.rb
index cfde16aa135..f76ab063e8e 100644
--- a/app/services/badge_granter.rb
+++ b/app/services/badge_granter.rb
@@ -1,17 +1,17 @@
class BadgeGranter
- def initialize(badge, user, opts={})
+ def initialize(badge, user, opts = {})
@badge, @user, @opts = badge, user, opts
@granted_by = opts[:granted_by] || Discourse.system_user
@post_id = opts[:post_id]
end
- def self.grant(badge, user, opts={})
+ def self.grant(badge, user, opts = {})
BadgeGranter.new(badge, user, opts).grant
end
def grant
- return if @granted_by and !Guardian.new(@granted_by).can_grant_badges?(@user)
+ return if @granted_by && !Guardian.new(@granted_by).can_grant_badges?(@user)
return unless @badge.enabled?
find_by = { badge_id: @badge.id, user_id: @user.id }
@@ -51,7 +51,7 @@ class BadgeGranter
data: { badge_id: @badge.id,
badge_name: @badge.display_name,
badge_slug: @badge.slug,
- username: @user.username}.to_json
+ username: @user.username }.to_json
)
user_badge.update_attributes notification_id: notification.id
end
@@ -63,7 +63,7 @@ class BadgeGranter
user_badge
end
- def self.revoke(user_badge, options={})
+ def self.revoke(user_badge, options = {})
UserBadge.transaction do
user_badge.destroy!
if options[:revoked_by]
@@ -178,7 +178,7 @@ class BadgeGranter
# :trigger - the Badge::Trigger id
# :explain - return the EXPLAIN query
def self.preview(sql, opts = {})
- params = {user_ids: [], post_ids: [], backfill: true}
+ params = { user_ids: [], post_ids: [], backfill: true }
BadgeGranter.contract_checks!(sql, opts)
@@ -188,19 +188,19 @@ class BadgeGranter
grants_sql =
if opts[:target_posts]
- "SELECT u.id, u.username, q.post_id, t.title, q.granted_at
- FROM(#{sql}) q
- JOIN users u on u.id = q.user_id
- LEFT JOIN badge_posts p on p.id = q.post_id
- LEFT JOIN topics t on t.id = p.topic_id
- WHERE :backfill = :backfill
- LIMIT 10"
+ "SELECT u.id, u.username, q.post_id, t.title, q.granted_at
+ FROM(#{sql}) q
+ JOIN users u on u.id = q.user_id
+ LEFT JOIN badge_posts p on p.id = q.post_id
+ LEFT JOIN topics t on t.id = p.topic_id
+ WHERE :backfill = :backfill
+ LIMIT 10"
else
- "SELECT u.id, u.username, q.granted_at
- FROM(#{sql}) q
- JOIN users u on u.id = q.user_id
- WHERE :backfill = :backfill
- LIMIT 10"
+ "SELECT u.id, u.username, q.granted_at
+ FROM(#{sql}) q
+ JOIN users u on u.id = q.user_id
+ WHERE :backfill = :backfill
+ LIMIT 10"
end
query_plan = nil
@@ -218,13 +218,13 @@ class BadgeGranter
end
end
- {grant_count: grant_count, sample: sample, query_plan: query_plan}
+ { grant_count: grant_count, sample: sample, query_plan: query_plan }
rescue => e
- {errors: e.message}
+ { errors: e.message }
end
MAX_ITEMS_FOR_DELTA ||= 200
- def self.backfill(badge, opts=nil)
+ def self.backfill(badge, opts = nil)
return unless SiteSetting.enable_badges
return unless badge.enabled
return unless badge.query.present?
@@ -304,14 +304,15 @@ class BadgeGranter
user_ids: user_ids || [-2]).each do |row|
# old bronze badges do not matter
- next if badge.badge_type_id == BadgeType::Bronze and row.granted_at < 2.days.ago
+ next if badge.badge_type_id == (BadgeType::Bronze) && row.granted_at < (2.days.ago)
# Try to use user locale in the badge notification if possible without too much resources
- notification_locale = if SiteSetting.allow_user_locale && row.locale.present?
- row.locale
- else
- SiteSetting.default_locale
- end
+ notification_locale =
+ if SiteSetting.allow_user_locale && row.locale.present?
+ row.locale
+ else
+ SiteSetting.default_locale
+ end
# Make this variable in this scope
notification = nil
@@ -327,7 +328,7 @@ class BadgeGranter
badge_name: badge.display_name,
badge_slug: badge.slug,
username: row.username
- }.to_json )
+ }.to_json)
end
Badge.exec_sql("UPDATE user_badges SET notification_id = :notification_id WHERE id = :id",
diff --git a/app/services/color_scheme_revisor.rb b/app/services/color_scheme_revisor.rb
index ce66c37332d..1fec2875f50 100644
--- a/app/services/color_scheme_revisor.rb
+++ b/app/services/color_scheme_revisor.rb
@@ -1,6 +1,6 @@
class ColorSchemeRevisor
- def initialize(color_scheme, params={})
+ def initialize(color_scheme, params = {})
@color_scheme = color_scheme
@params = params
end
@@ -12,7 +12,7 @@ class ColorSchemeRevisor
def revise
ColorScheme.transaction do
- @color_scheme.name = @params[:name] if @params.has_key?(:name)
+ @color_scheme.name = @params[:name] if @params.has_key?(:name)
@color_scheme.base_scheme_id = @params[:base_scheme_id] if @params.has_key?(:base_scheme_id)
has_colors = @params[:colors]
diff --git a/app/services/group_message.rb b/app/services/group_message.rb
index 16e18ddbb87..4e5a55f99a4 100644
--- a/app/services/group_message.rb
+++ b/app/services/group_message.rb
@@ -16,11 +16,11 @@ class GroupMessage
include Rails.application.routes.url_helpers
- def self.create(group_name, message_type, opts={})
+ def self.create(group_name, message_type, opts = {})
GroupMessage.new(group_name, message_type, opts).create
end
- def initialize(group_name, message_type, opts={})
+ def initialize(group_name, message_type, opts = {})
@group_name = group_name
@message_type = message_type
@opts = opts
@@ -47,10 +47,8 @@ class GroupMessage
@message_params ||= begin
h = { base_url: Discourse.base_url }.merge(@opts[:message_params] || {})
if @opts[:user]
- h.merge!({
- username: @opts[:user].username,
- user_url: user_path(@opts[:user].username)
- })
+ h.merge!(username: @opts[:user].username,
+ user_url: user_path(@opts[:user].username))
end
h
end
diff --git a/app/services/handle_chunk_upload.rb b/app/services/handle_chunk_upload.rb
index c71a656dad8..de5bf7837de 100644
--- a/app/services/handle_chunk_upload.rb
+++ b/app/services/handle_chunk_upload.rb
@@ -1,6 +1,6 @@
class HandleChunkUpload
- def initialize(chunk, params={})
+ def initialize(chunk, params = {})
@chunk = chunk
@params = params
end
diff --git a/app/services/notification_emailer.rb b/app/services/notification_emailer.rb
index 534d4037a13..bdbc5d7d35e 100644
--- a/app/services/notification_emailer.rb
+++ b/app/services/notification_emailer.rb
@@ -66,12 +66,12 @@ class NotificationEmailer
EMAILABLE_POST_TYPES ||= Set.new [Post.types[:regular], Post.types[:whisper]]
- def enqueue(type, delay=default_delay)
+ def enqueue(type, delay = default_delay)
return unless notification.user.user_option.email_direct?
perform_enqueue(type, delay)
end
- def enqueue_private(type, delay=private_delay)
+ def enqueue_private(type, delay = private_delay)
return unless notification.user.user_option.email_private_messages?
perform_enqueue(type, delay)
end
diff --git a/app/services/post_alerter.rb b/app/services/post_alerter.rb
index e43ea3ed9d1..130eec12850 100644
--- a/app/services/post_alerter.rb
+++ b/app/services/post_alerter.rb
@@ -48,11 +48,11 @@ class PostAlerter
if post.last_editor_id != post.user_id
# Mention comes from an edit by someone else, so notification should say who added the mention.
editor = post.last_editor
- mentioned_opts = {user_id: editor.id, original_username: editor.username, display_username: editor.username}
+ mentioned_opts = { user_id: editor.id, original_username: editor.username, display_username: editor.username }
end
expand_group_mentions(mentioned_groups, post) do |group, users|
- notify_non_pm_users(users - notified, :group_mentioned, post, mentioned_opts.merge({group: group}))
+ notify_non_pm_users(users - notified, :group_mentioned, post, mentioned_opts.merge(group: group))
notified += users
end
@@ -122,17 +122,17 @@ class PostAlerter
if topic.present?
cat_watchers = topic.category_users
- .where(notification_level: CategoryUser.notification_levels[:watching_first_post])
- .pluck(:user_id)
+ .where(notification_level: CategoryUser.notification_levels[:watching_first_post])
+ .pluck(:user_id)
tag_watchers = topic.tag_users
- .where(notification_level: TagUser.notification_levels[:watching_first_post])
- .pluck(:user_id)
+ .where(notification_level: TagUser.notification_levels[:watching_first_post])
+ .pluck(:user_id)
group_ids = topic.allowed_groups.pluck(:group_id)
group_watchers = GroupUser.where(group_id: group_ids,
notification_level: GroupUser.notification_levels[:watching_first_post])
- .pluck(:user_id)
+ .pluck(:user_id)
watchers = [cat_watchers, tag_watchers, group_watchers].flatten
@@ -167,17 +167,17 @@ class PostAlerter
def unread_posts(user, topic)
Post.secured(Guardian.new(user))
- .where('post_number > COALESCE((
+ .where('post_number > COALESCE((
SELECT last_read_post_number FROM topic_users tu
WHERE tu.user_id = ? AND tu.topic_id = ? ),0)',
user.id, topic.id)
- .where('reply_to_user_id = ? OR exists(
+ .where('reply_to_user_id = ? OR exists(
SELECT 1 from topic_users tu
WHERE tu.user_id = ? AND
tu.topic_id = ? AND
notification_level = ?
)', user.id, user.id, topic.id, TopicUser.notification_levels[:watching])
- .where(topic_id: topic.id)
+ .where(topic_id: topic.id)
end
def first_unread_post(user, topic)
@@ -198,7 +198,7 @@ class PostAlerter
user.reload
end
- NOTIFIABLE_TYPES = [:mentioned, :replied, :quoted, :posted, :linked, :private_message, :group_mentioned].map{ |t|
+ NOTIFIABLE_TYPES = [:mentioned, :replied, :quoted, :posted, :linked, :private_message, :group_mentioned].map { |t|
Notification.types[t]
}
@@ -217,18 +217,18 @@ class PostAlerter
end
end
- def notify_group_summary(user,post)
+ def notify_group_summary(user, post)
@group_stats ||= {}
stats = (@group_stats[post.topic_id] ||= group_stats(post.topic))
return unless stats
group_id = post.topic
- .topic_allowed_groups
- .where(group_id: user.groups.pluck(:id))
- .pluck(:group_id).first
+ .topic_allowed_groups
+ .where(group_id: user.groups.pluck(:id))
+ .pluck(:group_id).first
- stat = stats.find{|s| s[:group_id] == group_id}
+ stat = stats.find { |s| s[:group_id] == group_id }
return unless stat && stat[:inbox_count] > 0
notification_type = Notification.types[:group_message_summary]
@@ -297,9 +297,9 @@ class PostAlerter
# apply muting here
return if notifier_id && MutedUser.where(user_id: user.id, muted_user_id: notifier_id)
- .joins(:muted_user)
- .where('NOT admin AND NOT moderator')
- .exists?
+ .joins(:muted_user)
+ .where('NOT admin AND NOT moderator')
+ .exists?
# skip if muted on the topic
return if TopicUser.where(
@@ -319,10 +319,10 @@ class PostAlerter
# Don't notify the same user about the same notification on the same post
existing_notification = user.notifications
- .order("notifications.id DESC")
- .find_by(topic_id: post.topic_id,
- post_number: post.post_number,
- notification_type: type)
+ .order("notifications.id DESC")
+ .find_by(topic_id: post.topic_id,
+ post_number: post.post_number,
+ notification_type: type)
return if existing_notification && !should_notify_previous?(user, existing_notification, opts)
@@ -376,13 +376,11 @@ class PostAlerter
end
end
- notification_data.merge!({
- topic_title: topic_title,
- original_post_id: original_post.id,
- original_post_type: original_post.post_type,
- original_username: original_username,
- display_username: opts[:display_username] || post.user.username
- })
+ notification_data.merge!(topic_title: topic_title,
+ original_post_id: original_post.id,
+ original_post_type: original_post.post_type,
+ original_username: original_username,
+ display_username: opts[:display_username] || post.user.username)
if group = opts[:group]
notification_data[:group_id] = group.id
@@ -401,15 +399,15 @@ class PostAlerter
# we may have an invalid post somehow, dont blow up
post_url = original_post.url rescue nil
if post_url
- payload = {
- notification_type: type,
- post_number: original_post.post_number,
- topic_title: original_post.topic.title,
- topic_id: original_post.topic.id,
- excerpt: original_post.excerpt(400, text_entities: true, strip_links: true, remap_emoji: true),
- username: original_username,
- post_url: post_url
- }
+ payload = {
+ notification_type: type,
+ post_number: original_post.post_number,
+ topic_title: original_post.topic.title,
+ topic_id: original_post.topic.id,
+ excerpt: original_post.excerpt(400, text_entities: true, strip_links: true, remap_emoji: true),
+ username: original_username,
+ post_url: post_url
+ }
MessageBus.publish("/notification-alert/#{user.id}", payload, user_ids: [user.id])
push_notification(user, payload)
@@ -422,9 +420,9 @@ class PostAlerter
def push_notification(user, payload)
if SiteSetting.allow_user_api_key_scopes.split("|").include?("push") && SiteSetting.allowed_user_api_push_urls.present?
clients = user.user_api_keys
- .where("('push' = ANY(scopes) OR 'notifications' = ANY(scopes)) AND push_url IS NOT NULL AND position(push_url in ?) > 0 AND revoked_at IS NULL",
+ .where("('push' = ANY(scopes) OR 'notifications' = ANY(scopes)) AND push_url IS NOT NULL AND position(push_url in ?) > 0 AND revoked_at IS NULL",
SiteSetting.allowed_user_api_push_urls)
- .pluck(:client_id, :push_url)
+ .pluck(:client_id, :push_url)
if clients.length > 0
Jobs.enqueue(:push_notification, clients: clients, payload: payload, user_id: user.id)
@@ -458,7 +456,6 @@ class PostAlerter
[groups, users]
end
-
# TODO: Move to post-analyzer?
# Returns a list of users who were quoted in the post
def extract_quoted_users(post)
@@ -530,7 +527,6 @@ SQL
exclude_user_ids = notified.map(&:id)
notify = notify.where("id NOT IN (?)", exclude_user_ids) if exclude_user_ids.present?
-
DiscourseEvent.trigger(:before_create_notifications_for_users, notify, post)
notify.each do |user|
create_notification(user, Notification.types[:posted], post)
diff --git a/app/services/random_topic_selector.rb b/app/services/random_topic_selector.rb
index 9446c4fcbb3..f19b1a17187 100644
--- a/app/services/random_topic_selector.rb
+++ b/app/services/random_topic_selector.rb
@@ -3,7 +3,7 @@ class RandomTopicSelector
BACKFILL_SIZE = 3000
BACKFILL_LOW_WATER_MARK = 500
- def self.backfill(category=nil)
+ def self.backfill(category = nil)
exclude = category.try(:topic_id)
# don't leak private categories into the "everything" group
@@ -20,13 +20,12 @@ class RandomTopicSelector
query = TopicQuery.new(user, options)
-
results = query.latest_results.order('RANDOM()')
- .where(closed: false, archived: false)
- .where("topics.created_at > ?", SiteSetting.suggested_topics_max_days_old.days.ago)
- .limit(BACKFILL_SIZE)
- .reorder('RANDOM()')
- .pluck(:id)
+ .where(closed: false, archived: false)
+ .where("topics.created_at > ?", SiteSetting.suggested_topics_max_days_old.days.ago)
+ .limit(BACKFILL_SIZE)
+ .reorder('RANDOM()')
+ .pluck(:id)
key = cache_key(category)
results.each do |id|
@@ -37,7 +36,7 @@ class RandomTopicSelector
results
end
- def self.next(count, category=nil)
+ def self.next(count, category = nil)
key = cache_key(category)
results = []
@@ -45,12 +44,12 @@ class RandomTopicSelector
return results if count < 1
results = $redis.multi do
- $redis.lrange(key, 0, count-1)
+ $redis.lrange(key, 0, count - 1)
$redis.ltrim(key, count, -1)
end
if !results.is_a?(Array) # Redis is in readonly mode
- results = $redis.lrange(key, 0, count-1)
+ results = $redis.lrange(key, 0, count - 1)
else
results = results[0]
end
@@ -77,7 +76,7 @@ class RandomTopicSelector
results
end
- def self.cache_key(category=nil)
+ def self.cache_key(category = nil)
"random_topic_cache_#{category.try(:id)}"
end
diff --git a/app/services/search_indexer.rb b/app/services/search_indexer.rb
index 72e526a301e..6eb92412863 100644
--- a/app/services/search_indexer.rb
+++ b/app/services/search_indexer.rb
@@ -110,7 +110,6 @@ class SearchIndexer
end
end
-
class HtmlScrubber < Nokogiri::XML::SAX::Document
attr_reader :scrubbed
@@ -130,7 +129,7 @@ class SearchIndexer
me.scrubbed
end
- def start_element(name, attributes=[])
+ def start_element(name, attributes = [])
attributes = Hash[*attributes.flatten]
if attributes["alt"]
scrubbed << " "
diff --git a/app/services/spam_rule/auto_block.rb b/app/services/spam_rule/auto_block.rb
index a44ac9a115a..03bb1bf67c3 100644
--- a/app/services/spam_rule/auto_block.rb
+++ b/app/services/spam_rule/auto_block.rb
@@ -21,17 +21,17 @@ class SpamRule::AutoBlock
return false if @user.staged?
return false if @user.has_trust_level?(TrustLevel[1])
- if SiteSetting.num_spam_flags_to_block_new_user > 0 and
- SiteSetting.num_users_to_block_new_user > 0 and
- num_spam_flags_against_user >= SiteSetting.num_spam_flags_to_block_new_user and
- num_users_who_flagged_spam_against_user >= SiteSetting.num_users_to_block_new_user
+ if SiteSetting.num_spam_flags_to_block_new_user > (0) &&
+ SiteSetting.num_users_to_block_new_user > (0) &&
+ num_spam_flags_against_user >= (SiteSetting.num_spam_flags_to_block_new_user) &&
+ num_users_who_flagged_spam_against_user >= (SiteSetting.num_users_to_block_new_user)
return true
end
- if SiteSetting.num_tl3_flags_to_block_new_user > 0 and
- SiteSetting.num_tl3_users_to_block_new_user > 0 and
- num_tl3_flags_against_user >= SiteSetting.num_tl3_flags_to_block_new_user and
- num_tl3_users_who_flagged >= SiteSetting.num_tl3_users_to_block_new_user
+ if SiteSetting.num_tl3_flags_to_block_new_user > (0) &&
+ SiteSetting.num_tl3_users_to_block_new_user > (0) &&
+ num_tl3_flags_against_user >= (SiteSetting.num_tl3_flags_to_block_new_user) &&
+ num_tl3_users_who_flagged >= (SiteSetting.num_tl3_users_to_block_new_user)
return true
end
@@ -66,14 +66,14 @@ class SpamRule::AutoBlock
def flagged_post_ids
Post.where(user_id: @user.id)
- .where('spam_count > ? OR off_topic_count > ? OR inappropriate_count > ?', 0, 0, 0)
- .pluck(:id)
+ .where('spam_count > ? OR off_topic_count > ? OR inappropriate_count > ?', 0, 0, 0)
+ .pluck(:id)
end
def block_user
Post.transaction do
if UserBlocker.block(@user, Discourse.system_user, message: :too_many_spam_flags) && SiteSetting.notify_mods_when_user_blocked
- GroupMessage.create(Group[:moderators].name, :user_automatically_blocked, {user: @user, limit_once_per: false})
+ GroupMessage.create(Group[:moderators].name, :user_automatically_blocked, user: @user, limit_once_per: false)
end
end
end
diff --git a/app/services/staff_action_logger.rb b/app/services/staff_action_logger.rb
index 1cd09176af4..b58ff9093ed 100644
--- a/app/services/staff_action_logger.rb
+++ b/app/services/staff_action_logger.rb
@@ -10,16 +10,14 @@ class StaffActionLogger
raise Discourse::InvalidParameters.new(:admin) unless @admin && @admin.is_a?(User)
end
- def log_user_deletion(deleted_user, opts={})
+ def log_user_deletion(deleted_user, opts = {})
raise Discourse::InvalidParameters.new(:deleted_user) unless deleted_user && deleted_user.is_a?(User)
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:delete_user],
- ip_address: deleted_user.ip_address.to_s,
- details: [:id, :username, :name, :created_at, :trust_level, :last_seen_at, :last_emailed_at].map { |x| "#{x}: #{deleted_user.send(x)}" }.join("\n")
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:delete_user],
+ ip_address: deleted_user.ip_address.to_s,
+ details: [:id, :username, :name, :created_at, :trust_level, :last_seen_at, :last_emailed_at].map { |x| "#{x}: #{deleted_user.send(x)}" }.join("\n")))
end
- def log_custom(custom_type, details=nil)
+ def log_custom(custom_type, details = nil)
raise Discourse::InvalidParameters.new(:custom_type) unless custom_type
details ||= {}
@@ -28,7 +26,7 @@ class StaffActionLogger
StaffActionLogger.base_attrs.each do |attr|
attrs[attr] = details.delete(attr) if details.has_key?(attr)
end
- attrs[:details] = details.map {|r| "#{r[0]}: #{r[1]}"}.join("\n")
+ attrs[:details] = details.map { |r| "#{r[0]}: #{r[1]}" }.join("\n")
attrs[:acting_user_id] = @admin.id
attrs[:action] = UserHistory.actions[:custom_staff]
attrs[:custom_type] = custom_type
@@ -36,7 +34,7 @@ class StaffActionLogger
UserHistory.create(attrs)
end
- def log_post_deletion(deleted_post, opts={})
+ def log_post_deletion(deleted_post, opts = {})
raise Discourse::InvalidParameters.new(:deleted_post) unless deleted_post && deleted_post.is_a?(Post)
topic = deleted_post.topic || Topic.with_deleted.find_by(id: deleted_post.topic_id)
@@ -54,14 +52,12 @@ class StaffActionLogger
"raw: #{deleted_post.raw}"
]
- UserHistory.create(params(opts).merge({
- action: UserHistory.actions[:delete_post],
- post_id: deleted_post.id,
- details: details.join("\n")
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:delete_post],
+ post_id: deleted_post.id,
+ details: details.join("\n")))
end
- def log_topic_deletion(deleted_topic, opts={})
+ def log_topic_deletion(deleted_topic, opts = {})
raise Discourse::InvalidParameters.new(:deleted_topic) unless deleted_topic && deleted_topic.is_a?(Topic)
user = deleted_topic.user ? "#{deleted_topic.user.username} (#{deleted_topic.user.name})" : "(deleted user)"
@@ -77,48 +73,40 @@ class StaffActionLogger
details << "raw: #{first_post.raw}"
end
- UserHistory.create(params(opts).merge({
- action: UserHistory.actions[:delete_topic],
- topic_id: deleted_topic.id,
- details: details.join("\n")
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:delete_topic],
+ topic_id: deleted_topic.id,
+ details: details.join("\n")))
end
- def log_trust_level_change(user, old_trust_level, new_trust_level, opts={})
+ def log_trust_level_change(user, old_trust_level, new_trust_level, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user && user.is_a?(User)
raise Discourse::InvalidParameters.new(:old_trust_level) unless TrustLevel.valid? old_trust_level
raise Discourse::InvalidParameters.new(:new_trust_level) unless TrustLevel.valid? new_trust_level
- UserHistory.create!( params(opts).merge({
- action: UserHistory.actions[:change_trust_level],
- target_user_id: user.id,
- details: "old trust level: #{old_trust_level}\nnew trust level: #{new_trust_level}"
- }))
+ UserHistory.create!(params(opts).merge(action: UserHistory.actions[:change_trust_level],
+ target_user_id: user.id,
+ details: "old trust level: #{old_trust_level}\nnew trust level: #{new_trust_level}"))
end
- def log_lock_trust_level(user, opts={})
+ def log_lock_trust_level(user, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user && user.is_a?(User)
- UserHistory.create!( params(opts).merge({
- action: UserHistory.actions[user.trust_level_locked ? :lock_trust_level : :unlock_trust_level],
- target_user_id: user.id
- }))
+ UserHistory.create!(params(opts).merge(action: UserHistory.actions[user.trust_level_locked ? :lock_trust_level : :unlock_trust_level],
+ target_user_id: user.id))
end
- def log_site_setting_change(setting_name, previous_value, new_value, opts={})
+ def log_site_setting_change(setting_name, previous_value, new_value, opts = {})
raise Discourse::InvalidParameters.new(:setting_name) unless setting_name.present? && SiteSetting.respond_to?(setting_name)
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:change_site_setting],
- subject: setting_name,
- previous_value: previous_value,
- new_value: new_value
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:change_site_setting],
+ subject: setting_name,
+ previous_value: previous_value,
+ new_value: new_value))
end
def theme_json(theme)
- ThemeSerializer.new(theme, root:false).to_json
+ ThemeSerializer.new(theme, root: false).to_json
end
- def strip_duplicates(old,cur)
- return [old,cur] unless old && cur
+ def strip_duplicates(old, cur)
+ return [old, cur] unless old && cur
old = JSON.parse(old)
cur = JSON.parse(cur)
@@ -135,144 +123,116 @@ class StaffActionLogger
[old.to_json, cur.to_json]
end
- def log_theme_change(old_json, new_theme, opts={})
+ def log_theme_change(old_json, new_theme, opts = {})
raise Discourse::InvalidParameters.new(:new_theme) unless new_theme
new_json = theme_json(new_theme)
- old_json,new_json = strip_duplicates(old_json,new_json)
+ old_json, new_json = strip_duplicates(old_json, new_json)
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:change_theme],
- subject: new_theme.name,
- previous_value: old_json,
- new_value: new_json
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:change_theme],
+ subject: new_theme.name,
+ previous_value: old_json,
+ new_value: new_json))
end
- def log_theme_destroy(theme, opts={})
+ def log_theme_destroy(theme, opts = {})
raise Discourse::InvalidParameters.new(:theme) unless theme
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:delete_theme],
- subject: theme.name,
- previous_value: theme_json(theme)
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:delete_theme],
+ subject: theme.name,
+ previous_value: theme_json(theme)))
end
- def log_site_text_change(subject, new_text=nil, old_text=nil, opts={})
+ def log_site_text_change(subject, new_text = nil, old_text = nil, opts = {})
raise Discourse::InvalidParameters.new(:subject) unless subject.present?
- UserHistory.create!( params(opts).merge({
- action: UserHistory.actions[:change_site_text],
- subject: subject,
- previous_value: old_text,
- new_value: new_text
- }))
+ UserHistory.create!(params(opts).merge(action: UserHistory.actions[:change_site_text],
+ subject: subject,
+ previous_value: old_text,
+ new_value: new_text))
end
- def log_username_change(user, old_username, new_username, opts={})
+ def log_username_change(user, old_username, new_username, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:change_username],
- target_user_id: user.id,
- previous_value: old_username,
- new_value: new_username
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:change_username],
+ target_user_id: user.id,
+ previous_value: old_username,
+ new_value: new_username))
end
- def log_name_change(user_id, old_name, new_name, opts={})
+ def log_name_change(user_id, old_name, new_name, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user_id
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:change_name],
- target_user_id: user_id,
- previous_value: old_name,
- new_value: new_name
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:change_name],
+ target_user_id: user_id,
+ previous_value: old_name,
+ new_value: new_name))
end
- def log_user_suspend(user, reason, opts={})
+ def log_user_suspend(user, reason, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:suspend_user],
- target_user_id: user.id,
- details: reason
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:suspend_user],
+ target_user_id: user.id,
+ details: reason))
end
- def log_user_unsuspend(user, opts={})
+ def log_user_unsuspend(user, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:unsuspend_user],
- target_user_id: user.id
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:unsuspend_user],
+ target_user_id: user.id))
end
- def log_badge_grant(user_badge, opts={})
+ def log_badge_grant(user_badge, opts = {})
raise Discourse::InvalidParameters.new(:user_badge) unless user_badge
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:grant_badge],
- target_user_id: user_badge.user_id,
- details: user_badge.badge.name
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:grant_badge],
+ target_user_id: user_badge.user_id,
+ details: user_badge.badge.name))
end
- def log_badge_revoke(user_badge, opts={})
+ def log_badge_revoke(user_badge, opts = {})
raise Discourse::InvalidParameters.new(:user_badge) unless user_badge
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:revoke_badge],
- target_user_id: user_badge.user_id,
- details: user_badge.badge.name
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:revoke_badge],
+ target_user_id: user_badge.user_id,
+ details: user_badge.badge.name))
end
- def log_check_email(user, opts={})
+ def log_check_email(user, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user
- UserHistory.create(params(opts).merge({
- action: UserHistory.actions[:check_email],
- target_user_id: user.id
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:check_email],
+ target_user_id: user.id))
end
- def log_show_emails(users, opts={})
+ def log_show_emails(users, opts = {})
return if users.blank?
- UserHistory.create(params(opts).merge({
- action: UserHistory.actions[:check_email],
- details: users.map { |u| "[#{u.id}] #{u.username}"}.join("\n")
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:check_email],
+ details: users.map { |u| "[#{u.id}] #{u.username}" }.join("\n")))
end
- def log_impersonate(user, opts={})
+ def log_impersonate(user, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user
- UserHistory.create(params(opts).merge({
- action: UserHistory.actions[:impersonate],
- target_user_id: user.id
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:impersonate],
+ target_user_id: user.id))
end
- def log_roll_up(subnets, opts={})
- UserHistory.create(params(opts).merge({
- action: UserHistory.actions[:roll_up],
- details: subnets.join(", ")
- }))
+ def log_roll_up(subnets, opts = {})
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:roll_up],
+ details: subnets.join(", ")))
end
- def log_category_settings_change(category, category_params, old_permissions=nil)
+ def log_category_settings_change(category, category_params, old_permissions = nil)
validate_category(category)
changed_attributes = category.previous_changes.slice(*category_params.keys)
if !old_permissions.empty? && (old_permissions != category_params[:permissions])
- changed_attributes.merge!({ permissions: [old_permissions.to_json, category_params[:permissions].to_json] })
+ changed_attributes.merge!(permissions: [old_permissions.to_json, category_params[:permissions].to_json])
end
changed_attributes.each do |key, value|
- UserHistory.create(params.merge({
- action: UserHistory.actions[:change_category_settings],
- category_id: category.id,
- context: category.url,
- subject: key,
- previous_value: value[0],
- new_value: value[1]
- }))
+ UserHistory.create(params.merge(action: UserHistory.actions[:change_category_settings],
+ category_id: category.id,
+ context: category.url,
+ subject: key,
+ previous_value: value[0],
+ new_value: value[1]))
end
end
@@ -289,12 +249,10 @@ class StaffActionLogger
details << "parent_category: #{parent_category.name}"
end
- UserHistory.create(params.merge({
- action: UserHistory.actions[:delete_category],
- category_id: category.id,
- details: details.join("\n"),
- context: category.url
- }))
+ UserHistory.create(params.merge(action: UserHistory.actions[:delete_category],
+ category_id: category.id,
+ details: details.join("\n"),
+ context: category.url))
end
def log_category_creation(category)
@@ -305,132 +263,102 @@ class StaffActionLogger
"name: #{category.name}"
]
- UserHistory.create(params.merge({
- action: UserHistory.actions[:create_category],
- details: details.join("\n"),
- category_id: category.id,
- context: category.url
- }))
+ UserHistory.create(params.merge(action: UserHistory.actions[:create_category],
+ details: details.join("\n"),
+ category_id: category.id,
+ context: category.url))
end
- def log_block_user(user, opts={})
+ def log_block_user(user, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:block_user],
- target_user_id: user.id
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:block_user],
+ target_user_id: user.id))
end
- def log_unblock_user(user, opts={})
+ def log_unblock_user(user, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:unblock_user],
- target_user_id: user.id
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:unblock_user],
+ target_user_id: user.id))
end
- def log_grant_admin(user, opts={})
+ def log_grant_admin(user, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:grant_admin],
- target_user_id: user.id
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:grant_admin],
+ target_user_id: user.id))
end
- def log_revoke_admin(user, opts={})
+ def log_revoke_admin(user, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:revoke_admin],
- target_user_id: user.id
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:revoke_admin],
+ target_user_id: user.id))
end
- def log_grant_moderation(user, opts={})
+ def log_grant_moderation(user, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:grant_moderation],
- target_user_id: user.id
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:grant_moderation],
+ target_user_id: user.id))
end
- def log_revoke_moderation(user, opts={})
+ def log_revoke_moderation(user, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user
- UserHistory.create( params(opts).merge({
- action: UserHistory.actions[:revoke_moderation],
- target_user_id: user.id
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:revoke_moderation],
+ target_user_id: user.id))
end
- def log_backup_create(opts={})
- UserHistory.create(params(opts).merge({
- action: UserHistory.actions[:backup_create],
- ip_address: @admin.ip_address.to_s
- }))
+ def log_backup_create(opts = {})
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:backup_create],
+ ip_address: @admin.ip_address.to_s))
end
- def log_backup_download(backup, opts={})
+ def log_backup_download(backup, opts = {})
raise Discourse::InvalidParameters.new(:backup) unless backup
- UserHistory.create(params(opts).merge({
- action: UserHistory.actions[:backup_download],
- ip_address: @admin.ip_address.to_s,
- details: backup.filename
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:backup_download],
+ ip_address: @admin.ip_address.to_s,
+ details: backup.filename))
end
- def log_backup_destroy(backup, opts={})
+ def log_backup_destroy(backup, opts = {})
raise Discourse::InvalidParameters.new(:backup) unless backup
- UserHistory.create(params(opts).merge({
- action: UserHistory.actions[:backup_destroy],
- ip_address: @admin.ip_address.to_s,
- details: backup.filename
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:backup_destroy],
+ ip_address: @admin.ip_address.to_s,
+ details: backup.filename))
end
- def log_revoke_email(user, reason, opts={})
- UserHistory.create(params(opts).merge({
- action: UserHistory.actions[:revoke_email],
- target_user_id: user.id,
- details: reason
- }))
+ def log_revoke_email(user, reason, opts = {})
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:revoke_email],
+ target_user_id: user.id,
+ details: reason))
end
- def log_user_deactivate(user, reason, opts={})
+ def log_user_deactivate(user, reason, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user
- UserHistory.create(params(opts).merge({
- action: UserHistory.actions[:deactivate_user],
- target_user_id: user.id,
- details: reason
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:deactivate_user],
+ target_user_id: user.id,
+ details: reason))
end
- def log_user_activate(user, reason, opts={})
+ def log_user_activate(user, reason, opts = {})
raise Discourse::InvalidParameters.new(:user) unless user
- UserHistory.create(params(opts).merge({
- action: UserHistory.actions[:activate_user],
- target_user_id: user.id,
- details: reason
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:activate_user],
+ target_user_id: user.id,
+ details: reason))
end
- def log_wizard_step(step, opts={})
+ def log_wizard_step(step, opts = {})
raise Discourse::InvalidParameters.new(:step) unless step
- UserHistory.create(params(opts).merge({
- action: UserHistory.actions[:wizard_step],
- context: step.id
- }))
+ UserHistory.create(params(opts).merge(action: UserHistory.actions[:wizard_step],
+ context: step.id))
end
def log_change_readonly_mode(state)
- UserHistory.create(params.merge({
- action: UserHistory.actions[:change_readonly_mode],
- previous_value: !state,
- new_value: state
- }))
+ UserHistory.create(params.merge(action: UserHistory.actions[:change_readonly_mode],
+ previous_value: !state,
+ new_value: state))
end
private
- def params(opts=nil)
+ def params(opts = nil)
opts ||= {}
{ acting_user_id: @admin.id, context: opts[:context] }
end
diff --git a/app/services/topic_status_updater.rb b/app/services/topic_status_updater.rb
index a2fc8f4dd63..80b5781ea73 100644
--- a/app/services/topic_status_updater.rb
+++ b/app/services/topic_status_updater.rb
@@ -1,5 +1,5 @@
TopicStatusUpdater = Struct.new(:topic, :user) do
- def update!(status, enabled, opts={})
+ def update!(status, enabled, opts = {})
status = Status.new(status, enabled)
@topic_status_update = topic.public_topic_timer
@@ -19,7 +19,7 @@ TopicStatusUpdater = Struct.new(:topic, :user) do
private
- def change(status, opts={})
+ def change(status, opts = {})
result = true
if status.pinned? || status.pinned_globally?
@@ -30,7 +30,7 @@ TopicStatusUpdater = Struct.new(:topic, :user) do
result = false if rc == 0
else
rc = Topic.where(:id => topic.id, status.name => !status.enabled)
- .update_all(status.name => status.enabled?)
+ .update_all(status.name => status.enabled?)
topic.send("#{status.name}=", status.enabled?)
result = false if rc == 0
@@ -55,7 +55,7 @@ TopicStatusUpdater = Struct.new(:topic, :user) do
result
end
- def create_moderator_post_for(status, message=nil)
+ def create_moderator_post_for(status, message = nil)
topic.add_moderator_post(user, message || message_for(status), options_for(status))
topic.reload
end
diff --git a/app/services/tracked_topics_updater.rb b/app/services/tracked_topics_updater.rb
index 2222fc4c637..0ffb32e7e79 100644
--- a/app/services/tracked_topics_updater.rb
+++ b/app/services/tracked_topics_updater.rb
@@ -8,11 +8,10 @@ class TrackedTopicsUpdater
def call
topic_users = TopicUser.where(notifications_reason_id: nil, user_id: @id)
if @threshold < 0
- topic_users.update_all({notification_level: TopicUser.notification_levels[:regular]})
+ topic_users.update_all(notification_level: TopicUser.notification_levels[:regular])
else
topic_users.update_all(["notification_level = CASE WHEN total_msecs_viewed < ? THEN ? ELSE ? END",
@threshold, TopicUser.notification_levels[:regular], TopicUser.notification_levels[:tracking]])
end
end
end
-
diff --git a/app/services/user_action_creator.rb b/app/services/user_action_creator.rb
index bbf21f9fb9d..68a5d0847d2 100644
--- a/app/services/user_action_creator.rb
+++ b/app/services/user_action_creator.rb
@@ -7,19 +7,19 @@ class UserActionCreator
@disabled = false
end
- def self.log_notification(post, user, notification_type, acting_user_id=nil)
+ def self.log_notification(post, user, notification_type, acting_user_id = nil)
return if @disabled
action =
case notification_type
- when Notification.types[:quoted]
- UserAction::QUOTE
- when Notification.types[:replied]
- UserAction::RESPONSE
- when Notification.types[:mentioned]
- UserAction::MENTION
- when Notification.types[:edited]
- UserAction::EDIT
+ when Notification.types[:quoted]
+ UserAction::QUOTE
+ when Notification.types[:replied]
+ UserAction::RESPONSE
+ when Notification.types[:mentioned]
+ UserAction::MENTION
+ when Notification.types[:edited]
+ UserAction::EDIT
end
# skip any invalid items, eg failed to save post and so on
diff --git a/app/services/user_anonymizer.rb b/app/services/user_anonymizer.rb
index ac692d28d76..dbd58624bff 100644
--- a/app/services/user_anonymizer.rb
+++ b/app/services/user_anonymizer.rb
@@ -1,10 +1,10 @@
class UserAnonymizer
- def initialize(user, actor=nil)
+ def initialize(user, actor = nil)
@user = user
@actor = actor
end
- def self.make_anonymous(user, actor=nil)
+ def self.make_anonymous(user, actor = nil)
self.new(user, actor).make_anonymous
end
@@ -48,11 +48,11 @@ class UserAnonymizer
@user.user_open_ids.find_each { |x| x.destroy }
@user.api_key.try(:destroy)
- UserHistory.create( action: UserHistory.actions[:anonymize_user],
- target_user_id: @user.id,
- acting_user_id: @actor ? @actor.id : @user.id,
- email: prev_email,
- details: "username: #{prev_username}" )
+ UserHistory.create(action: UserHistory.actions[:anonymize_user],
+ target_user_id: @user.id,
+ acting_user_id: @actor ? @actor.id : @user.id,
+ email: prev_email,
+ details: "username: #{prev_username}")
end
@user
end
diff --git a/app/services/user_blocker.rb b/app/services/user_blocker.rb
index fe0091425e9..8a35c5f2390 100644
--- a/app/services/user_blocker.rb
+++ b/app/services/user_blocker.rb
@@ -1,14 +1,14 @@
class UserBlocker
- def initialize(user, by_user=nil, opts={})
+ def initialize(user, by_user = nil, opts = {})
@user, @by_user, @opts = user, by_user, opts
end
- def self.block(user, by_user=nil, opts={})
+ def self.block(user, by_user = nil, opts = {})
UserBlocker.new(user, by_user, opts).block
end
- def self.unblock(user, by_user=nil, opts={})
+ def self.unblock(user, by_user = nil, opts = {})
UserBlocker.new(user, by_user, opts).unblock
end
@@ -20,7 +20,7 @@ class UserBlocker
message_type = @opts[:message] || :blocked_by_staff
post = SystemMessage.create(@user, message_type)
if post && @by_user
- StaffActionLogger.new(@by_user).log_block_user(@user, {context: "#{message_type}: '#{post.topic&.title rescue ''}' #{@opts[:reason]}"})
+ StaffActionLogger.new(@by_user).log_block_user(@user, context: "#{message_type}: '#{post.topic&.title rescue ''}' #{@opts[:reason]}")
end
end
else
diff --git a/app/services/user_destroyer.rb b/app/services/user_destroyer.rb
index 838c2ba59e4..e95d4ca60dd 100644
--- a/app/services/user_destroyer.rb
+++ b/app/services/user_destroyer.rb
@@ -7,14 +7,14 @@ class UserDestroyer
def initialize(actor)
@actor = actor
- raise Discourse::InvalidParameters.new('acting user is nil') unless @actor and @actor.is_a?(User)
+ raise Discourse::InvalidParameters.new('acting user is nil') unless @actor && @actor.is_a?(User)
@guardian = Guardian.new(actor)
end
# Returns false if the user failed to be deleted.
# Returns a frozen instance of the User if the delete succeeded.
- def destroy(user, opts={})
- raise Discourse::InvalidParameters.new('user is nil') unless user and user.is_a?(User)
+ def destroy(user, opts = {})
+ raise Discourse::InvalidParameters.new('user is nil') unless user && user.is_a?(User)
raise PostsExistError if !opts[:delete_posts] && user.posts.count != 0
@guardian.ensure_can_delete_user!(user)
diff --git a/app/services/username_changer.rb b/app/services/username_changer.rb
index 990534e2822..a81f089415c 100644
--- a/app/services/username_changer.rb
+++ b/app/services/username_changer.rb
@@ -1,12 +1,12 @@
class UsernameChanger
- def initialize(user, new_username, actor=nil)
+ def initialize(user, new_username, actor = nil)
@user = user
@new_username = new_username
@actor = actor
end
- def self.change(user, new_username, actor=nil)
+ def self.change(user, new_username, actor = nil)
self.new(user, new_username, actor).change
end
diff --git a/app/services/username_checker_service.rb b/app/services/username_checker_service.rb
index 91bfe42de93..0f8d7a62510 100644
--- a/app/services/username_checker_service.rb
+++ b/app/services/username_checker_service.rb
@@ -4,7 +4,7 @@ class UsernameCheckerService
if username && username.length > 0
validator = UsernameValidator.new(username)
if !validator.valid_format?
- {errors: validator.errors}
+ { errors: validator.errors }
else
check_username_availability(username, email)
end
@@ -23,7 +23,6 @@ class UsernameCheckerService
Rails.configuration.respond_to?(:developer_emails) && Rails.configuration.developer_emails.include?(value)
end
-
def self.is_developer?(email)
UsernameCheckerService.new.is_developer?(email)
end
diff --git a/app/services/word_watcher.rb b/app/services/word_watcher.rb
index 625e51e999d..11d61f0f522 100644
--- a/app/services/word_watcher.rb
+++ b/app/services/word_watcher.rb
@@ -26,7 +26,7 @@ class WordWatcher
end
def self.clear_cache!
- WatchedWord.actions.sum do |a,i|
+ WatchedWord.actions.sum do |a, i|
Discourse.cache.delete word_matcher_regexp_key(a)
end
end
diff --git a/bin/puma b/bin/puma
index 26523fced37..3249ddee001 100755
--- a/bin/puma
+++ b/bin/puma
@@ -12,7 +12,7 @@ if ARGV[0] == '--kill-existing'
pids = `ps aux | grep puma | grep discourse | grep -v grep | awk '{print $2;}'`.strip
.split("\n")
.map(&:to_i)
- .reject{|pid| pid == Process.pid}
+ .reject { |pid| pid == Process.pid }
if pids.length > 0
STDERR.puts "Terminating old version of puma at pid #{pids[0]}"
diff --git a/config.ru b/config.ru
index c74954f4f4b..9a0cd31d678 100644
--- a/config.ru
+++ b/config.ru
@@ -3,4 +3,3 @@ require ::File.expand_path('../config/environment', __FILE__)
map ActionController::Base.config.try(:relative_url_root) || "/" do
run Discourse::Application
end
-
diff --git a/config/application.rb b/config/application.rb
index 153ef545cd7..a0a9920d48f 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -22,7 +22,6 @@ if defined?(Bundler)
Bundler.require(*Rails.groups(assets: %w(development test profile)))
end
-
module Discourse
class Application < Rails::Application
@@ -169,7 +168,7 @@ module Discourse
# we configure rack cache on demand in an initializer
# our setup does not use rack cache and instead defers to nginx
- config.action_dispatch.rack_cache = nil
+ config.action_dispatch.rack_cache = nil
# ember stuff only used for asset precompliation, production variant plays up
config.ember.variant = :development
@@ -177,7 +176,7 @@ module Discourse
config.ember.handlebars_location = "#{Rails.root}/vendor/assets/javascripts/handlebars.js"
require 'auth'
- Discourse.activate_plugins! unless Rails.env.test? and ENV['LOAD_PLUGINS'] != "1"
+ Discourse.activate_plugins! unless Rails.env.test? && ENV['LOAD_PLUGINS'] != ("1")
if GlobalSetting.relative_url_root.present?
config.relative_url_root = GlobalSetting.relative_url_root
@@ -207,7 +206,7 @@ module Discourse
# So open id logs somewhere sane
OpenID::Util.logger = Rails.logger
if plugins = Discourse.plugins
- plugins.each{|plugin| plugin.notify_after_initialize}
+ plugins.each { |plugin| plugin.notify_after_initialize }
end
# This nasty hack is required for not precompiling QUnit assets
diff --git a/config/boot.rb b/config/boot.rb
index 7180eb1fbbc..929f1a62fe0 100644
--- a/config/boot.rb
+++ b/config/boot.rb
@@ -10,7 +10,6 @@ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
-
if ENV['RAILS_ENV'] != 'production'
require 'bootsnap'
diff --git a/config/cloud/cloud66/files/production.rb b/config/cloud/cloud66/files/production.rb
index db662574bee..42d9caa9fc2 100644
--- a/config/cloud/cloud66/files/production.rb
+++ b/config/cloud/cloud66/files/production.rb
@@ -27,13 +27,13 @@ Discourse::Application.configure do
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
- :address => ENV['SMTP_ADDRESS'],
- :port => ENV['SMTP_PORT'],
- :domain => ENV['SMTP_DOMAIN'],
- :user_name => ENV['SMTP_USERNAME'],
- :password => ENV['SMTP_PASSWORD'],
- :authentication => 'plain',
- :enable_starttls_auto => true }
+ address: ENV['SMTP_ADDRESS'],
+ port: ENV['SMTP_PORT'],
+ domain: ENV['SMTP_DOMAIN'],
+ user_name: ENV['SMTP_USERNAME'],
+ password: ENV['SMTP_PASSWORD'],
+ authentication: 'plain',
+ enable_starttls_auto: true }
#config.action_mailer.delivery_method = :sendmail
#config.action_mailer.sendmail_settings = {arguments: '-i'}
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 560d5601301..d9c10db2e8a 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -48,8 +48,6 @@ Discourse::Application.configure do
config.enable_anon_caching = false
require 'rbtrace'
-
-
if emails = GlobalSetting.developer_emails
config.developer_emails = emails.split(",").map(&:downcase).map(&:strip)
end
diff --git a/config/environments/production.rb b/config/environments/production.rb
index b4331f15ac6..6489a1777e2 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -35,10 +35,10 @@ Discourse::Application.configure do
settings[:openssl_verify_mode] = GlobalSetting.smtp_openssl_verify_mode if GlobalSetting.smtp_openssl_verify_mode
- config.action_mailer.smtp_settings = settings.reject{|_, y| y.nil?}
+ config.action_mailer.smtp_settings = settings.reject { |_, y| y.nil? }
else
config.action_mailer.delivery_method = :sendmail
- config.action_mailer.sendmail_settings = {arguments: '-i'}
+ config.action_mailer.sendmail_settings = { arguments: '-i' }
end
# Send deprecation notices to registered listeners
diff --git a/config/environments/test.rb b/config/environments/test.rb
index af2eedae623..5cd785ce22c 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -18,7 +18,7 @@ Discourse::Application.configure do
config.action_dispatch.show_exceptions = false
# Disable request forgery protection in test environment
- config.action_controller.allow_forgery_protection = false
+ config.action_controller.allow_forgery_protection = false
# Tell Action Mailer not to deliver emails to the real world.
# The :test delivery method accumulates sent emails in the
diff --git a/config/initializers/001-redis.rb b/config/initializers/001-redis.rb
index 73340cc49da..af3e829842c 100644
--- a/config/initializers/001-redis.rb
+++ b/config/initializers/001-redis.rb
@@ -4,12 +4,11 @@ if Rails.env.development? && ENV['DISCOURSE_FLUSH_REDIS']
end
if defined?(PhusionPassenger)
- PhusionPassenger.on_event(:starting_worker_process) do |forked|
- if forked
- Discourse.after_fork
- else
- # We're in conservative spawning mode. We don't need to do anything.
- end
+ PhusionPassenger.on_event(:starting_worker_process) do |forked|
+ if forked
+ Discourse.after_fork
+ else
+ # We're in conservative spawning mode. We don't need to do anything.
end
+ end
end
-
diff --git a/config/initializers/004-message_bus.rb b/config/initializers/004-message_bus.rb
index 5faf89f9e8b..fabada48a02 100644
--- a/config/initializers/004-message_bus.rb
+++ b/config/initializers/004-message_bus.rb
@@ -1,4 +1,4 @@
-MessageBus.site_id_lookup do |env=nil|
+MessageBus.site_id_lookup do |env = nil|
if env
setup_message_bus_env(env)
env["__mb"][:site_id]
diff --git a/config/initializers/006-ensure_login_hint.rb b/config/initializers/006-ensure_login_hint.rb
index e177601737b..1cc7b514291 100644
--- a/config/initializers/006-ensure_login_hint.rb
+++ b/config/initializers/006-ensure_login_hint.rb
@@ -18,5 +18,5 @@ if User.limit(20).count < 20 && User.where(admin: true).human_users.count == 0
SiteSetting.has_login_hint = true
end
-# we may be booting with no User table eg: first migration, just skip
+ # we may be booting with no User table eg: first migration, just skip
end rescue nil
diff --git a/config/initializers/006-mini_profiler.rb b/config/initializers/006-mini_profiler.rb
index e39b1a33dee..a04c888fceb 100644
--- a/config/initializers/006-mini_profiler.rb
+++ b/config/initializers/006-mini_profiler.rb
@@ -6,7 +6,7 @@ if Rails.configuration.respond_to?(:load_mini_profiler) && Rails.configuration.l
begin
require 'memory_profiler'
rescue => e
- STDERR.put "#{e} failed to require mini profiler"
+ STDERR.put "#{e} failed to require mini profiler"
end
# initialization is skipped so trigger it
@@ -48,7 +48,7 @@ if defined?(Rack::MiniProfiler)
path = env['PATH_INFO']
(env['HTTP_USER_AGENT'] !~ /iPad|iPhone|Android/) &&
- !skip.any?{|re| re =~ path}
+ !skip.any? { |re| re =~ path }
end
# without a user provider our results will use the ip address for namespacing
@@ -68,7 +68,6 @@ if defined?(Rack::MiniProfiler)
Rack::MiniProfiler.config.backtrace_ignores << /config\/initializers\/silence_logger/
Rack::MiniProfiler.config.backtrace_ignores << /config\/initializers\/quiet_logger/
-
# Rack::MiniProfiler.counter_method(ActiveRecord::QueryMethods, 'build_arel')
# Rack::MiniProfiler.counter_method(Array, 'uniq')
# require "#{Rails.root}/vendor/backports/notification"
@@ -97,9 +96,8 @@ if defined?(Rack::MiniProfiler)
# Rack::MiniProfiler.profile_method ActionView::PathResolver, 'find_templates'
end
-
if ENV["PRINT_EXCEPTIONS"]
- trace = TracePoint.new(:raise) do |tp|
+ trace = TracePoint.new(:raise) do |tp|
puts tp.raised_exception
puts tp.raised_exception.backtrace.join("\n")
puts
diff --git a/config/initializers/008-rack-cors.rb b/config/initializers/008-rack-cors.rb
index 4864b961f67..2ba7b01fb3f 100644
--- a/config/initializers/008-rack-cors.rb
+++ b/config/initializers/008-rack-cors.rb
@@ -8,7 +8,7 @@ if GlobalSetting.enable_cors
end
def call(env)
- if env['REQUEST_METHOD'] == 'OPTIONS' and env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']
+ if env['REQUEST_METHOD'] == ('OPTIONS') && env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']
return [200, apply_headers(env), []]
end
@@ -16,7 +16,7 @@ if GlobalSetting.enable_cors
[status, apply_headers(env, headers), body]
end
- def apply_headers(env, headers=nil)
+ def apply_headers(env, headers = nil)
headers ||= {}
origin = nil
diff --git a/config/initializers/050-force_https.rb b/config/initializers/050-force_https.rb
index 7ac71e11351..0185fbd7426 100644
--- a/config/initializers/050-force_https.rb
+++ b/config/initializers/050-force_https.rb
@@ -1,7 +1,7 @@
# tiny middleware to force https if needed
class Discourse::ForceHttpsMiddleware
- def initialize(app, config={})
+ def initialize(app, config = {})
@app = app
end
@@ -11,4 +11,3 @@ class Discourse::ForceHttpsMiddleware
end
end
-
diff --git a/config/initializers/099-anon-cache.rb b/config/initializers/099-anon-cache.rb
index d2c90beee87..e0a90c71f17 100644
--- a/config/initializers/099-anon-cache.rb
+++ b/config/initializers/099-anon-cache.rb
@@ -1,13 +1,13 @@
require_dependency "middleware/anonymous_cache"
-enabled = if Rails.configuration.respond_to?(:enable_anon_caching)
- Rails.configuration.enable_anon_caching
- else
- Rails.env.production?
- end
+enabled =
+ if Rails.configuration.respond_to?(:enable_anon_caching)
+ Rails.configuration.enable_anon_caching
+ else
+ Rails.env.production?
+ end
if !ENV['DISCOURSE_DISABLE_ANON_CACHE'] && enabled
# in an ideal world this is position 0, but mobile detection uses ... session and request and params
Rails.configuration.middleware.insert_after ActionDispatch::ParamsParser, Middleware::AnonymousCache
end
-
diff --git a/config/initializers/100-logster.rb b/config/initializers/100-logster.rb
index d913051336c..c7277684c69 100644
--- a/config/initializers/100-logster.rb
+++ b/config/initializers/100-logster.rb
@@ -44,12 +44,12 @@ end
# middleware that logs errors sits before multisite
# we need to establish a connection so redis connection is good
# and db connection is good
-Logster.config.current_context = lambda{|env,&blk|
+Logster.config.current_context = lambda { |env, &blk|
begin
if Rails.configuration.multisite
request = Rack::Request.new(env)
ActiveRecord::Base.connection_handler.clear_active_connections!
- RailsMultisite::ConnectionManagement.establish_connection(:host => request['__ws'] || request.host)
+ RailsMultisite::ConnectionManagement.establish_connection(host: request['__ws'] || request.host)
end
blk.call
ensure
@@ -73,7 +73,7 @@ RailsMultisite::ConnectionManagement.each_connection do
if (error_rate_per_minute || 0) > 0
store.register_rate_limit_per_minute(severities, error_rate_per_minute) do |rate|
- MessageBus.publish("/logs_error_rate_exceeded", { rate: rate, duration: 'minute', publish_at: Time.current.to_i })
+ MessageBus.publish("/logs_error_rate_exceeded", rate: rate, duration: 'minute', publish_at: Time.current.to_i)
end
end
@@ -81,7 +81,7 @@ RailsMultisite::ConnectionManagement.each_connection do
if (error_rate_per_hour || 0) > 0
store.register_rate_limit_per_hour(severities, error_rate_per_hour) do |rate|
- MessageBus.publish("/logs_error_rate_exceeded", { rate: rate, duration: 'hour', publish_at: Time.current.to_i })
+ MessageBus.publish("/logs_error_rate_exceeded", rate: rate, duration: 'hour', publish_at: Time.current.to_i)
end
end
end
diff --git a/config/initializers/100-quiet_logger.rb b/config/initializers/100-quiet_logger.rb
index 55c0dfcb4ce..908b0c2cfdd 100644
--- a/config/initializers/100-quiet_logger.rb
+++ b/config/initializers/100-quiet_logger.rb
@@ -6,7 +6,7 @@ Rails::Rack::Logger.class_eval do
def call_with_quiet_assets(env)
override = false
- if (env['PATH_INFO'].index("/assets/") == 0) or
+ if (env['PATH_INFO'].index("/assets/") == 0) ||
(env['PATH_INFO'].index("mini-profiler-resources") == 0)
if ::Logster::Logger === Rails.logger
override = true
diff --git a/config/initializers/100-sidekiq.rb b/config/initializers/100-sidekiq.rb
index a155c113cb3..efde7360128 100644
--- a/config/initializers/100-sidekiq.rb
+++ b/config/initializers/100-sidekiq.rb
@@ -35,7 +35,7 @@ if Sidekiq.server?
manager.tick
rescue => e
# the show must go on
- Discourse.handle_job_exception(e, {message: "While ticking scheduling manager"})
+ Discourse.handle_job_exception(e, message: "While ticking scheduling manager")
end
sleep 1
end
diff --git a/config/initializers/100-verify_config.rb b/config/initializers/100-verify_config.rb
index c0c0a8965a5..2d91431db64 100644
--- a/config/initializers/100-verify_config.rb
+++ b/config/initializers/100-verify_config.rb
@@ -1,6 +1,6 @@
# Check that the app is configured correctly. Raise some helpful errors if something is wrong.
-if defined?(Rails::Server) and Rails.env.production? # Only run these checks when starting up a production server
+if defined?(Rails::Server) && Rails.env.production? # Only run these checks when starting up a production server
if ['localhost', 'production.localhost'].include?(Discourse.current_hostname)
puts < { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :am => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
- :ar => { :i18n => { :plural => { :keys => [:zero, :one, :two, :few, :many, :other], :rule => lambda { |n| n == 0 ? :zero : n == 1 ? :one : n == 2 ? :two : [3, 4, 5, 6, 7, 8, 9, 10].include?(n % 100) ? :few : [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99].include?(n % 100) ? :many : :other } } } },
- :az => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :be => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
- :bg => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :bh => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
- :bn => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :bo => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :bs => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
- :ca => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :cs => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n) ? :few : :other } } } },
- :cy => { :i18n => { :plural => { :keys => [:one, :two, :many, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : n == 8 || n == 11 ? :many : :other } } } },
- :da => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :de => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :dz => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :el => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :en => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :eo => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :es => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :et => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :eu => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :fa_IR => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :fi => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :fil => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
- :fo => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :fr => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n.between?(0, 2) && n != 2 ? :one : :other } } } },
- :fur => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :fy => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :ga => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
- :gl => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :gu => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :guw => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
- :ha => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :he => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :hi => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
- :hr => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
- :hu => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :id => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :is => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :it => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :iw => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :ja => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :jv => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :ka => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :km => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :kn => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :ko => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :ku => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :lb => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :ln => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
- :lt => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n % 10 == 1 && ![11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :one : [2, 3, 4, 5, 6, 7, 8, 9].include?(n % 10) && ![11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :few : :other } } } },
- :lv => { :i18n => { :plural => { :keys => [:zero, :one, :other], :rule => lambda { |n| n == 0 ? :zero : n % 10 == 1 && n % 100 != 11 ? :one : :other } } } },
- :mg => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
- :mk => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n % 10 == 1 ? :one : :other } } } },
- :ml => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :mn => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :mo => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : n == 0 ? :few : :other } } } },
- :mr => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :ms => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :mt => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n == 1 ? :one : n == 0 || [2, 3, 4, 5, 6, 7, 8, 9, 10].include?(n % 100) ? :few : [11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :many : :other } } } },
- :my => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :nah => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :nb_NO => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :ne => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :nl => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :nn => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :no => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :nso => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
- :om => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :or => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :pa => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :pap => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :pl_PL => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : :other } } } },
- :ps => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :pt => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
- :pt_BR => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :ro => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : n == 0 || ((n % 100) >= 1 && (n % 100) <= 19) ? :few : :other } } } },
- :ru => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : :other } } } },
- :se => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
- :sh => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
- :sk => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n) ? :few : :other } } } },
- :sl => { :i18n => { :plural => { :keys => [:one, :two, :few, :other], :rule => lambda { |n| n % 100 == 1 ? :one : n % 100 == 2 ? :two : [3, 4].include?(n % 100) ? :few : :other } } } },
- :sma => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
- :smi => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
- :smj => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
- :smn => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
- :sms => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
- :so => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :sq => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :sr => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
- :sv => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :sw => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :ta => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :te => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :th => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :ti => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
- :tk => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :tl => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
- :to => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :tr_TR => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
+ af: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ am: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
+ ar: { i18n: { plural: { keys: [:zero, :one, :two, :few, :many, :other], rule: lambda { |n| n == 0 ? :zero : n == 1 ? :one : n == 2 ? :two : [3, 4, 5, 6, 7, 8, 9, 10].include?(n % 100) ? :few : [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99].include?(n % 100) ? :many : :other } } } },
+ az: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ be: { i18n: { plural: { keys: [:one, :few, :many, :other], rule: lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
+ bg: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ bh: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
+ bn: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ bo: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ bs: { i18n: { plural: { keys: [:one, :few, :many, :other], rule: lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
+ ca: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ cs: { i18n: { plural: { keys: [:one, :few, :other], rule: lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n) ? :few : :other } } } },
+ cy: { i18n: { plural: { keys: [:one, :two, :many, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : n == 8 || n == 11 ? :many : :other } } } },
+ da: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ de: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ dz: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ el: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ en: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ eo: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ es: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ et: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ eu: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ fa_IR: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ fi: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ fil: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
+ fo: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ fr: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n.between?(0, 2) && n != 2 ? :one : :other } } } },
+ fur: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ fy: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ ga: { i18n: { plural: { keys: [:one, :two, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
+ gl: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ gu: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ guw: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
+ ha: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ he: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ hi: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
+ hr: { i18n: { plural: { keys: [:one, :few, :many, :other], rule: lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
+ hu: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ id: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ is: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ it: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ iw: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ ja: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ jv: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ ka: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ km: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ kn: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ ko: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ ku: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ lb: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ ln: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
+ lt: { i18n: { plural: { keys: [:one, :few, :other], rule: lambda { |n| n % 10 == 1 && ![11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :one : [2, 3, 4, 5, 6, 7, 8, 9].include?(n % 10) && ![11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :few : :other } } } },
+ lv: { i18n: { plural: { keys: [:zero, :one, :other], rule: lambda { |n| n == 0 ? :zero : n % 10 == 1 && n % 100 != 11 ? :one : :other } } } },
+ mg: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
+ mk: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n % 10 == 1 ? :one : :other } } } },
+ ml: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ mn: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ mo: { i18n: { plural: { keys: [:one, :few, :other], rule: lambda { |n| n == 1 ? :one : n == 0 ? :few : :other } } } },
+ mr: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ ms: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ mt: { i18n: { plural: { keys: [:one, :few, :many, :other], rule: lambda { |n| n == 1 ? :one : n == 0 || [2, 3, 4, 5, 6, 7, 8, 9, 10].include?(n % 100) ? :few : [11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :many : :other } } } },
+ my: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ nah: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ nb_NO: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ ne: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ nl: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ nn: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ no: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ nso: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
+ om: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ or: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ pa: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ pap: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ pl_PL: { i18n: { plural: { keys: [:one, :few, :other], rule: lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : :other } } } },
+ ps: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ pt: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
+ pt_BR: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ ro: { i18n: { plural: { keys: [:one, :few, :other], rule: lambda { |n| n == 1 ? :one : n == 0 || ((n % 100) >= 1 && (n % 100) <= 19) ? :few : :other } } } },
+ ru: { i18n: { plural: { keys: [:one, :few, :other], rule: lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : :other } } } },
+ se: { i18n: { plural: { keys: [:one, :two, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
+ sh: { i18n: { plural: { keys: [:one, :few, :many, :other], rule: lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
+ sk: { i18n: { plural: { keys: [:one, :few, :other], rule: lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n) ? :few : :other } } } },
+ sl: { i18n: { plural: { keys: [:one, :two, :few, :other], rule: lambda { |n| n % 100 == 1 ? :one : n % 100 == 2 ? :two : [3, 4].include?(n % 100) ? :few : :other } } } },
+ sma: { i18n: { plural: { keys: [:one, :two, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
+ smi: { i18n: { plural: { keys: [:one, :two, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
+ smj: { i18n: { plural: { keys: [:one, :two, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
+ smn: { i18n: { plural: { keys: [:one, :two, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
+ sms: { i18n: { plural: { keys: [:one, :two, :other], rule: lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } },
+ so: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ sq: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ sr: { i18n: { plural: { keys: [:one, :few, :many, :other], rule: lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
+ sv: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ sw: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ ta: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ te: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ th: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ ti: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
+ tk: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ tl: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
+ to: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ tr_TR: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
# TODO put this back when translations are correct: :uk => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } },
- :uk => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :other : :other } } } },
- :ur => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } },
- :vi => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :wa => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
- :yo => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :zh => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :zh_CN => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :zh_TW => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } },
- :zu => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }
+ uk: { i18n: { plural: { keys: [:one, :few, :other], rule: lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :other : :other } } } },
+ ur: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } },
+ vi: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ wa: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } },
+ yo: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ zh: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ zh_CN: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ zh_TW: { i18n: { plural: { keys: [:other], rule: lambda { |n| :other } } } },
+ zu: { i18n: { plural: { keys: [:one, :other], rule: lambda { |n| n == 1 ? :one : :other } } } }
}
diff --git a/config/puma.rb b/config/puma.rb
index d472c7278f9..85f38250eca 100644
--- a/config/puma.rb
+++ b/config/puma.rb
@@ -1,4 +1,4 @@
-if ENV['RAILS_ENV']=='production'
+if ENV['RAILS_ENV'] == 'production'
# First, you need to change these below to your situation.
APP_ROOT = '/home/discourse/discourse'
@@ -6,11 +6,11 @@ if ENV['RAILS_ENV']=='production'
# Second, you can choose how many threads that you are going to run at same time.
workers "#{num_workers}"
- threads 8,32
+ threads 8, 32
# Unless you know what you are changing, do not change them.
- bind "unix://#{APP_ROOT}/tmp/sockets/puma.sock"
- stdout_redirect "#{APP_ROOT}/log/puma.log","#{APP_ROOT}/log/puma.err.log"
+ bind "unix://#{APP_ROOT}/tmp/sockets/puma.sock"
+ stdout_redirect "#{APP_ROOT}/log/puma.log", "#{APP_ROOT}/log/puma.err.log"
pidfile "#{APP_ROOT}/tmp/pids/puma.pid"
state_path "#{APP_ROOT}/tmp/pids/puma.state"
daemonize true
diff --git a/config/routes.rb b/config/routes.rb
index b95fff1a39d..1aa2b5fd075 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -130,12 +130,11 @@ Discourse::Application.routes.draw do
put "anonymize"
post "reset_bounce_score"
end
- get "users/:id.json" => 'users#show', defaults: {format: 'json'}
- get 'users/:id/:username' => 'users#show', constraints: {username: USERNAME_ROUTE_FORMAT}
+ get "users/:id.json" => 'users#show', defaults: { format: 'json' }
+ get 'users/:id/:username' => 'users#show', constraints: { username: USERNAME_ROUTE_FORMAT }
get 'users/:id/:username/badges' => 'users#show'
get 'users/:id/:username/tl3_requirements' => 'users#show'
-
post "users/sync_sso" => "users#sync_sso", constraints: AdminConstraint.new
post "users/invite_admin" => "users#invite_admin", constraints: AdminConstraint.new
@@ -266,9 +265,9 @@ Discourse::Application.routes.draw do
end
end
- get "memory_stats"=> "diagnostics#memory_stats", constraints: AdminConstraint.new
- get "dump_heap"=> "diagnostics#dump_heap", constraints: AdminConstraint.new
- get "dump_statement_cache"=> "diagnostics#dump_statement_cache", constraints: AdminConstraint.new
+ get "memory_stats" => "diagnostics#memory_stats", constraints: AdminConstraint.new
+ get "dump_heap" => "diagnostics#dump_heap", constraints: AdminConstraint.new
+ get "dump_statement_cache" => "diagnostics#dump_statement_cache", constraints: AdminConstraint.new
resources :watched_words, only: [:index, :create, :update, :destroy], constraints: AdminConstraint.new do
collection do
@@ -333,7 +332,7 @@ Discourse::Application.routes.draw do
post "#{root_path}/read-faq" => "users#read_faq"
get "#{root_path}/search/users" => "users#search_users"
- get({ "#{root_path}/account-created/" => "users#account_created" }.merge(index == 1 ? { as: :users_account_created } : {as: :old_account_created}))
+ get({ "#{root_path}/account-created/" => "users#account_created" }.merge(index == 1 ? { as: :users_account_created } : { as: :old_account_created }))
get "#{root_path}/account-created/resent" => "users#account_created"
get "#{root_path}/account-created/edit-email" => "users#account_created"
@@ -348,63 +347,63 @@ Discourse::Application.routes.draw do
constraints: { token: /[0-9a-f]+/ }
}.merge(index == 1 ? { as: 'confirm_admin' } : {}))
post "#{root_path}/confirm-admin/:token" => "users#confirm_admin", constraints: { token: /[0-9a-f]+/ }
- get "#{root_path}/:username/private-messages" => "user_actions#private_messages", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/private-messages/:filter" => "user_actions#private_messages", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/messages" => "user_actions#private_messages", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/messages/:filter" => "user_actions#private_messages", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/messages/group/:group_name" => "user_actions#private_messages", constraints: {username: USERNAME_ROUTE_FORMAT, group_name: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/messages/group/:group_name/archive" => "user_actions#private_messages", constraints: {username: USERNAME_ROUTE_FORMAT, group_name: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username.json" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT}, defaults: {format: :json}
+ get "#{root_path}/:username/private-messages" => "user_actions#private_messages", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/private-messages/:filter" => "user_actions#private_messages", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/messages" => "user_actions#private_messages", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/messages/:filter" => "user_actions#private_messages", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/messages/group/:group_name" => "user_actions#private_messages", constraints: { username: USERNAME_ROUTE_FORMAT, group_name: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/messages/group/:group_name/archive" => "user_actions#private_messages", constraints: { username: USERNAME_ROUTE_FORMAT, group_name: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username.json" => "users#show", constraints: { username: USERNAME_ROUTE_FORMAT }, defaults: { format: :json }
get({ "#{root_path}/:username" => "users#show", constraints: { username: USERNAME_ROUTE_FORMAT, format: /(json|html)/ } }.merge(index == 1 ? { as: 'user' } : {}))
- put "#{root_path}/:username" => "users#update", constraints: {username: USERNAME_ROUTE_FORMAT}, defaults: { format: :json }
- get "#{root_path}/:username/emails" => "users#check_emails", constraints: {username: USERNAME_ROUTE_FORMAT}
+ put "#{root_path}/:username" => "users#update", constraints: { username: USERNAME_ROUTE_FORMAT }, defaults: { format: :json }
+ get "#{root_path}/:username/emails" => "users#check_emails", constraints: { username: USERNAME_ROUTE_FORMAT }
get({ "#{root_path}/:username/preferences" => "users#preferences", constraints: { username: USERNAME_ROUTE_FORMAT } }.merge(index == 1 ? { as: :email_preferences } : {}))
- get "#{root_path}/:username/preferences/email" => "users_email#index", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/preferences/account" => "users#preferences", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/preferences/profile" => "users#preferences", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/preferences/emails" => "users#preferences", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/preferences/notifications" => "users#preferences", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/preferences/categories" => "users#preferences", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/preferences/tags" => "users#preferences", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/preferences/interface" => "users#preferences", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/preferences/apps" => "users#preferences", constraints: {username: USERNAME_ROUTE_FORMAT}
- put "#{root_path}/:username/preferences/email" => "users_email#update", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/preferences/about-me" => "users#preferences", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/preferences/badge_title" => "users#preferences", constraints: {username: USERNAME_ROUTE_FORMAT}
- put "#{root_path}/:username/preferences/badge_title" => "users#badge_title", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/preferences/username" => "users#preferences", constraints: {username: USERNAME_ROUTE_FORMAT}
- put "#{root_path}/:username/preferences/username" => "users#username", constraints: {username: USERNAME_ROUTE_FORMAT}
- delete "#{root_path}/:username/preferences/user_image" => "users#destroy_user_image", constraints: {username: USERNAME_ROUTE_FORMAT}
- put "#{root_path}/:username/preferences/avatar/pick" => "users#pick_avatar", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/preferences/card-badge" => "users#card_badge", constraints: {username: USERNAME_ROUTE_FORMAT}
- put "#{root_path}/:username/preferences/card-badge" => "users#update_card_badge", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/staff-info" => "users#staff_info", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/summary" => "users#summary", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/invited" => "users#invited", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/invited_count" => "users#invited_count", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/invited/:filter" => "users#invited", constraints: {username: USERNAME_ROUTE_FORMAT}
+ get "#{root_path}/:username/preferences/email" => "users_email#index", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/preferences/account" => "users#preferences", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/preferences/profile" => "users#preferences", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/preferences/emails" => "users#preferences", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/preferences/notifications" => "users#preferences", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/preferences/categories" => "users#preferences", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/preferences/tags" => "users#preferences", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/preferences/interface" => "users#preferences", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/preferences/apps" => "users#preferences", constraints: { username: USERNAME_ROUTE_FORMAT }
+ put "#{root_path}/:username/preferences/email" => "users_email#update", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/preferences/about-me" => "users#preferences", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/preferences/badge_title" => "users#preferences", constraints: { username: USERNAME_ROUTE_FORMAT }
+ put "#{root_path}/:username/preferences/badge_title" => "users#badge_title", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/preferences/username" => "users#preferences", constraints: { username: USERNAME_ROUTE_FORMAT }
+ put "#{root_path}/:username/preferences/username" => "users#username", constraints: { username: USERNAME_ROUTE_FORMAT }
+ delete "#{root_path}/:username/preferences/user_image" => "users#destroy_user_image", constraints: { username: USERNAME_ROUTE_FORMAT }
+ put "#{root_path}/:username/preferences/avatar/pick" => "users#pick_avatar", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/preferences/card-badge" => "users#card_badge", constraints: { username: USERNAME_ROUTE_FORMAT }
+ put "#{root_path}/:username/preferences/card-badge" => "users#update_card_badge", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/staff-info" => "users#staff_info", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/summary" => "users#summary", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/invited" => "users#invited", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/invited_count" => "users#invited_count", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/invited/:filter" => "users#invited", constraints: { username: USERNAME_ROUTE_FORMAT }
post "#{root_path}/action/send_activation_email" => "users#send_activation_email"
- get "#{root_path}/:username/summary" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/activity/topics.rss" => "list#user_topics_feed", format: :rss, constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/activity.rss" => "posts#user_posts_feed", format: :rss, constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/activity" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/activity/:filter" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/badges" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/notifications" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/notifications/:filter" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/activity/pending" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT}
- delete "#{root_path}/:username" => "users#destroy", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/by-external/:external_id" => "users#show", constraints: {external_id: /[^\/]+/}
- get "#{root_path}/:username/flagged-posts" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/deleted-posts" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "#{root_path}/:username/topic-tracking-state" => "users#topic_tracking_state", constraints: {username: USERNAME_ROUTE_FORMAT}
+ get "#{root_path}/:username/summary" => "users#show", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/activity/topics.rss" => "list#user_topics_feed", format: :rss, constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/activity.rss" => "posts#user_posts_feed", format: :rss, constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/activity" => "users#show", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/activity/:filter" => "users#show", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/badges" => "users#show", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/notifications" => "users#show", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/notifications/:filter" => "users#show", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/activity/pending" => "users#show", constraints: { username: USERNAME_ROUTE_FORMAT }
+ delete "#{root_path}/:username" => "users#destroy", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/by-external/:external_id" => "users#show", constraints: { external_id: /[^\/]+/ }
+ get "#{root_path}/:username/flagged-posts" => "users#show", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/deleted-posts" => "users#show", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "#{root_path}/:username/topic-tracking-state" => "users#topic_tracking_state", constraints: { username: USERNAME_ROUTE_FORMAT }
end
- get "user-badges/:username.json" => "user_badges#username", constraints: {username: USERNAME_ROUTE_FORMAT}, defaults: {format: :json}
- get "user-badges/:username" => "user_badges#username", constraints: {username: USERNAME_ROUTE_FORMAT}
+ get "user-badges/:username.json" => "user_badges#username", constraints: { username: USERNAME_ROUTE_FORMAT }, defaults: { format: :json }
+ get "user-badges/:username" => "user_badges#username", constraints: { username: USERNAME_ROUTE_FORMAT }
- post "user_avatar/:username/refresh_gravatar" => "user_avatars#refresh_gravatar", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "letter_avatar/:username/:size/:version.png" => "user_avatars#show_letter", format: false, constraints: { hostname: /[\w\.-]+/, size: /\d+/, username: USERNAME_ROUTE_FORMAT}
+ post "user_avatar/:username/refresh_gravatar" => "user_avatars#refresh_gravatar", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "letter_avatar/:username/:size/:version.png" => "user_avatars#show_letter", format: false, constraints: { hostname: /[\w\.-]+/, size: /\d+/, username: USERNAME_ROUTE_FORMAT }
get "user_avatar/:hostname/:username/:size/:version.png" => "user_avatars#show", format: false, constraints: { hostname: /[\w\.-]+/, size: /\d+/, username: USERNAME_ROUTE_FORMAT }
# in most production settings this is bypassed
@@ -428,8 +427,8 @@ Discourse::Application.routes.draw do
get "private-posts" => "posts#latest", id: "private_posts"
get "posts/by_number/:topic_id/:post_number" => "posts#by_number"
get "posts/:id/reply-history" => "posts#reply_history"
- get "posts/:username/deleted" => "posts#deleted_posts", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "posts/:username/flagged" => "posts#flagged_posts", constraints: {username: USERNAME_ROUTE_FORMAT}
+ get "posts/:username/deleted" => "posts#deleted_posts", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "posts/:username/flagged" => "posts#flagged_posts", constraints: { username: USERNAME_ROUTE_FORMAT }
resources :groups, id: USERNAME_ROUTE_FORMAT do
get "posts.rss" => "groups#posts_feed", format: :rss
@@ -511,10 +510,9 @@ Discourse::Application.routes.draw do
get "/badges/:id(/:slug)" => "badges#show"
resources :user_badges, only: [:index, :create, :destroy]
-
get '/c', to: redirect('/categories')
- resources :categories, :except => :show
+ resources :categories, except: :show
post "category/:category_id/move" => "categories#move"
post "categories/reorder" => "categories#reorder"
post "category/:category_id/notifications" => "categories#set_notifications"
@@ -577,11 +575,11 @@ Discourse::Application.routes.draw do
resources :similar_topics
get "topics/feature_stats"
- get "topics/created-by/:username" => "list#topics_by", as: "topics_by", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "topics/private-messages/:username" => "list#private_messages", as: "topics_private_messages", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "topics/private-messages-sent/:username" => "list#private_messages_sent", as: "topics_private_messages_sent", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "topics/private-messages-archive/:username" => "list#private_messages_archive", as: "topics_private_messages_archive", constraints: {username: USERNAME_ROUTE_FORMAT}
- get "topics/private-messages-unread/:username" => "list#private_messages_unread", as: "topics_private_messages_unread", constraints: {username: USERNAME_ROUTE_FORMAT}
+ get "topics/created-by/:username" => "list#topics_by", as: "topics_by", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "topics/private-messages/:username" => "list#private_messages", as: "topics_private_messages", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "topics/private-messages-sent/:username" => "list#private_messages_sent", as: "topics_private_messages_sent", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "topics/private-messages-archive/:username" => "list#private_messages_archive", as: "topics_private_messages_archive", constraints: { username: USERNAME_ROUTE_FORMAT }
+ get "topics/private-messages-unread/:username" => "list#private_messages_unread", as: "topics_private_messages_unread", constraints: { username: USERNAME_ROUTE_FORMAT }
get "topics/private-messages-group/:username/:group_name.json" => "list#private_messages_group", as: "topics_private_messages_group", constraints: {
username: USERNAME_ROUTE_FORMAT,
group_name: USERNAME_ROUTE_FORMAT
@@ -601,49 +599,49 @@ Discourse::Application.routes.draw do
# Topic routes
get "t/id_for/:slug" => "topics#id_for_slug"
- get "t/:slug/:topic_id/print" => "topics#show", format: :html, print: true, constraints: {topic_id: /\d+/}
- get "t/:slug/:topic_id/wordpress" => "topics#wordpress", constraints: {topic_id: /\d+/}
- get "t/:topic_id/wordpress" => "topics#wordpress", constraints: {topic_id: /\d+/}
- get "t/:slug/:topic_id/moderator-liked" => "topics#moderator_liked", constraints: {topic_id: /\d+/}
- get "t/:slug/:topic_id/summary" => "topics#show", defaults: {summary: true}, constraints: {topic_id: /\d+/}
- get "t/:slug/:topic_id/unsubscribe" => "topics#unsubscribe", constraints: {topic_id: /\d+/}
- get "t/:topic_id/unsubscribe" => "topics#unsubscribe", constraints: {topic_id: /\d+/}
- get "t/:topic_id/summary" => "topics#show", constraints: {topic_id: /\d+/}
- put "t/:slug/:topic_id" => "topics#update", constraints: {topic_id: /\d+/}
- put "t/:slug/:topic_id/star" => "topics#star", constraints: {topic_id: /\d+/}
- put "t/:topic_id/star" => "topics#star", constraints: {topic_id: /\d+/}
- put "t/:slug/:topic_id/status" => "topics#status", constraints: {topic_id: /\d+/}
- put "t/:topic_id/status" => "topics#status", constraints: {topic_id: /\d+/}
- put "t/:topic_id/clear-pin" => "topics#clear_pin", constraints: {topic_id: /\d+/}
- put "t/:topic_id/re-pin" => "topics#re_pin", constraints: {topic_id: /\d+/}
- put "t/:topic_id/mute" => "topics#mute", constraints: {topic_id: /\d+/}
- put "t/:topic_id/unmute" => "topics#unmute", constraints: {topic_id: /\d+/}
- post "t/:topic_id/timer" => "topics#timer", constraints: {topic_id: /\d+/}
- put "t/:topic_id/make-banner" => "topics#make_banner", constraints: {topic_id: /\d+/}
- put "t/:topic_id/remove-banner" => "topics#remove_banner", constraints: {topic_id: /\d+/}
- put "t/:topic_id/remove-allowed-user" => "topics#remove_allowed_user", constraints: {topic_id: /\d+/}
- put "t/:topic_id/remove-allowed-group" => "topics#remove_allowed_group", constraints: {topic_id: /\d+/}
- put "t/:topic_id/recover" => "topics#recover", constraints: {topic_id: /\d+/}
- get "t/:topic_id/:post_number" => "topics#show", constraints: {topic_id: /\d+/, post_number: /\d+/}
- get "t/:topic_id/last" => "topics#show", post_number: 99999999, constraints: {topic_id: /\d+/}
- get "t/:slug/:topic_id.rss" => "topics#feed", format: :rss, constraints: {topic_id: /\d+/}
- get "t/:slug/:topic_id" => "topics#show", constraints: {topic_id: /\d+/}
- get "t/:slug/:topic_id/:post_number" => "topics#show", constraints: {topic_id: /\d+/, post_number: /\d+/}
- get "t/:slug/:topic_id/last" => "topics#show", post_number: 99999999, constraints: {topic_id: /\d+/}
- get "t/:topic_id/posts" => "topics#posts", constraints: {topic_id: /\d+/}, format: :json
- get "t/:topic_id/excerpts" => "topics#excerpts", constraints: {topic_id: /\d+/}, format: :json
- post "t/:topic_id/timings" => "topics#timings", constraints: {topic_id: /\d+/}
- post "t/:topic_id/invite" => "topics#invite", constraints: {topic_id: /\d+/}
- post "t/:topic_id/invite-group" => "topics#invite_group", constraints: {topic_id: /\d+/}
- post "t/:topic_id/move-posts" => "topics#move_posts", constraints: {topic_id: /\d+/}
- post "t/:topic_id/merge-topic" => "topics#merge_topic", constraints: {topic_id: /\d+/}
- post "t/:topic_id/change-owner" => "topics#change_post_owners", constraints: {topic_id: /\d+/}
- put "t/:topic_id/change-timestamp" => "topics#change_timestamps", constraints: {topic_id: /\d+/}
- delete "t/:topic_id/timings" => "topics#destroy_timings", constraints: {topic_id: /\d+/}
- put "t/:topic_id/bookmark" => "topics#bookmark", constraints: {topic_id: /\d+/}
- put "t/:topic_id/remove_bookmarks" => "topics#remove_bookmarks", constraints: {topic_id: /\d+/}
+ get "t/:slug/:topic_id/print" => "topics#show", format: :html, print: true, constraints: { topic_id: /\d+/ }
+ get "t/:slug/:topic_id/wordpress" => "topics#wordpress", constraints: { topic_id: /\d+/ }
+ get "t/:topic_id/wordpress" => "topics#wordpress", constraints: { topic_id: /\d+/ }
+ get "t/:slug/:topic_id/moderator-liked" => "topics#moderator_liked", constraints: { topic_id: /\d+/ }
+ get "t/:slug/:topic_id/summary" => "topics#show", defaults: { summary: true }, constraints: { topic_id: /\d+/ }
+ get "t/:slug/:topic_id/unsubscribe" => "topics#unsubscribe", constraints: { topic_id: /\d+/ }
+ get "t/:topic_id/unsubscribe" => "topics#unsubscribe", constraints: { topic_id: /\d+/ }
+ get "t/:topic_id/summary" => "topics#show", constraints: { topic_id: /\d+/ }
+ put "t/:slug/:topic_id" => "topics#update", constraints: { topic_id: /\d+/ }
+ put "t/:slug/:topic_id/star" => "topics#star", constraints: { topic_id: /\d+/ }
+ put "t/:topic_id/star" => "topics#star", constraints: { topic_id: /\d+/ }
+ put "t/:slug/:topic_id/status" => "topics#status", constraints: { topic_id: /\d+/ }
+ put "t/:topic_id/status" => "topics#status", constraints: { topic_id: /\d+/ }
+ put "t/:topic_id/clear-pin" => "topics#clear_pin", constraints: { topic_id: /\d+/ }
+ put "t/:topic_id/re-pin" => "topics#re_pin", constraints: { topic_id: /\d+/ }
+ put "t/:topic_id/mute" => "topics#mute", constraints: { topic_id: /\d+/ }
+ put "t/:topic_id/unmute" => "topics#unmute", constraints: { topic_id: /\d+/ }
+ post "t/:topic_id/timer" => "topics#timer", constraints: { topic_id: /\d+/ }
+ put "t/:topic_id/make-banner" => "topics#make_banner", constraints: { topic_id: /\d+/ }
+ put "t/:topic_id/remove-banner" => "topics#remove_banner", constraints: { topic_id: /\d+/ }
+ put "t/:topic_id/remove-allowed-user" => "topics#remove_allowed_user", constraints: { topic_id: /\d+/ }
+ put "t/:topic_id/remove-allowed-group" => "topics#remove_allowed_group", constraints: { topic_id: /\d+/ }
+ put "t/:topic_id/recover" => "topics#recover", constraints: { topic_id: /\d+/ }
+ get "t/:topic_id/:post_number" => "topics#show", constraints: { topic_id: /\d+/, post_number: /\d+/ }
+ get "t/:topic_id/last" => "topics#show", post_number: 99999999, constraints: { topic_id: /\d+/ }
+ get "t/:slug/:topic_id.rss" => "topics#feed", format: :rss, constraints: { topic_id: /\d+/ }
+ get "t/:slug/:topic_id" => "topics#show", constraints: { topic_id: /\d+/ }
+ get "t/:slug/:topic_id/:post_number" => "topics#show", constraints: { topic_id: /\d+/, post_number: /\d+/ }
+ get "t/:slug/:topic_id/last" => "topics#show", post_number: 99999999, constraints: { topic_id: /\d+/ }
+ get "t/:topic_id/posts" => "topics#posts", constraints: { topic_id: /\d+/ }, format: :json
+ get "t/:topic_id/excerpts" => "topics#excerpts", constraints: { topic_id: /\d+/ }, format: :json
+ post "t/:topic_id/timings" => "topics#timings", constraints: { topic_id: /\d+/ }
+ post "t/:topic_id/invite" => "topics#invite", constraints: { topic_id: /\d+/ }
+ post "t/:topic_id/invite-group" => "topics#invite_group", constraints: { topic_id: /\d+/ }
+ post "t/:topic_id/move-posts" => "topics#move_posts", constraints: { topic_id: /\d+/ }
+ post "t/:topic_id/merge-topic" => "topics#merge_topic", constraints: { topic_id: /\d+/ }
+ post "t/:topic_id/change-owner" => "topics#change_post_owners", constraints: { topic_id: /\d+/ }
+ put "t/:topic_id/change-timestamp" => "topics#change_timestamps", constraints: { topic_id: /\d+/ }
+ delete "t/:topic_id/timings" => "topics#destroy_timings", constraints: { topic_id: /\d+/ }
+ put "t/:topic_id/bookmark" => "topics#bookmark", constraints: { topic_id: /\d+/ }
+ put "t/:topic_id/remove_bookmarks" => "topics#remove_bookmarks", constraints: { topic_id: /\d+/ }
- post "t/:topic_id/notifications" => "topics#set_notifications" , constraints: {topic_id: /\d+/}
+ post "t/:topic_id/notifications" => "topics#set_notifications" , constraints: { topic_id: /\d+/ }
get "p/:post_id(/:user_id)" => "posts#short_link"
get "/posts/:id/cooked" => "posts#cooked"
@@ -724,12 +722,12 @@ Discourse::Application.routes.draw do
end
Discourse.filters.each do |filter|
- root to: "list##{filter}", constraints: HomePageConstraint.new("#{filter}"), :as => "list_#{filter}"
+ root to: "list##{filter}", constraints: HomePageConstraint.new("#{filter}"), as: "list_#{filter}"
end
# special case for categories
- root to: "categories#index", constraints: HomePageConstraint.new("categories"), :as => "categories_index"
+ root to: "categories#index", constraints: HomePageConstraint.new("categories"), as: "categories_index"
# special case for top
- root to: "list#top", constraints: HomePageConstraint.new("top"), :as => "top_lists"
+ root to: "list#top", constraints: HomePageConstraint.new("top"), as: "top_lists"
root to: 'finish_installation#index', constraints: HomePageConstraint.new("finish_installation"), as: 'installation_redirect'
diff --git a/config/unicorn.conf.rb b/config/unicorn.conf.rb
index 716c96cc984..e0d0894cec6 100644
--- a/config/unicorn.conf.rb
+++ b/config/unicorn.conf.rb
@@ -126,9 +126,9 @@ before_fork do |server, worker|
def max_rss
rss = `ps -eo rss,args | grep sidekiq | grep -v grep | awk '{print $1}'`
- .split("\n")
- .map(&:to_i)
- .max
+ .split("\n")
+ .map(&:to_i)
+ .max
rss ||= 0
@@ -146,9 +146,9 @@ before_fork do |server, worker|
def force_kill_rogue_sidekiq
info = `ps -eo pid,rss,args | grep sidekiq | grep -v grep | awk '{print $1,$2}'`
info.split("\n").each do |row|
- pid,mem = row.split(" ").map(&:to_i)
- if pid > 0 && (mem*1024) > max_allowed_size
- Rails.logger.warn "Detected rogue Sidekiq pid #{pid} mem #{mem*1024}, killing"
+ pid, mem = row.split(" ").map(&:to_i)
+ if pid > 0 && (mem * 1024) > max_allowed_size
+ Rails.logger.warn "Detected rogue Sidekiq pid #{pid} mem #{mem * 1024}, killing"
Process.kill("KILL", pid) rescue nil
end
end
@@ -199,7 +199,6 @@ before_fork do |server, worker|
ActiveRecord::Base.connection.disconnect!
$redis.client.disconnect
-
# Throttle the master from forking too quickly by sleeping. Due
# to the implementation of standard Unix signal handlers, this
# helps (but does not completely) prevent identical, repeated signals
diff --git a/db/fixtures/001_categories.rb b/db/fixtures/001_categories.rb
index 1a0282b84e9..4dc13268ac5 100644
--- a/db/fixtures/001_categories.rb
+++ b/db/fixtures/001_categories.rb
@@ -30,7 +30,7 @@ ColumnDropper.drop(
table: 'categories',
after_migration: 'AddUploadsToCategories',
columns: ['logo_url', 'background_url'],
- on_drop: ->(){
+ on_drop: ->() {
STDERR.puts 'Removing superflous categories columns!'
}
)
diff --git a/db/fixtures/002_groups.rb b/db/fixtures/002_groups.rb
index 68912df848c..487263f6abe 100644
--- a/db/fixtures/002_groups.rb
+++ b/db/fixtures/002_groups.rb
@@ -9,7 +9,7 @@ ColumnDropper.drop(
table: 'groups',
after_migration: 'AddVisibleBackToGroups',
columns: %w[visible],
- on_drop: ->(){
+ on_drop: ->() {
STDERR.puts 'Removing superflous visible group column!'
}
)
diff --git a/db/fixtures/006_badges.rb b/db/fixtures/006_badges.rb
index a8f55dd6f83..22cf2c77147 100644
--- a/db/fixtures/006_badges.rb
+++ b/db/fixtures/006_badges.rb
@@ -142,9 +142,9 @@ Badge.seed do |b|
end
[
- [Badge::Promoter,"Promoter",BadgeType::Bronze,1,0],
- [Badge::Campaigner,"Campaigner",BadgeType::Silver,3,1],
- [Badge::Champion,"Champion",BadgeType::Gold,5,2],
+ [Badge::Promoter, "Promoter", BadgeType::Bronze, 1, 0],
+ [Badge::Campaigner, "Campaigner", BadgeType::Silver, 3, 1],
+ [Badge::Champion, "Champion", BadgeType::Gold, 5, 2],
].each do |id, name, type, count, trust_level|
Badge.seed do |b|
b.id = id
@@ -154,7 +154,7 @@ end
b.multiple_grant = false
b.target_posts = false
b.show_posts = false
- b.query = BadgeQueries.invite_badge(count,trust_level)
+ b.query = BadgeQueries.invite_badge(count, trust_level)
b.default_badge_grouping_id = BadgeGrouping::Community
# daily is good enough
b.trigger = Badge::Trigger::None
@@ -307,7 +307,6 @@ end
end
end
-
[
[Badge::ThankYou, "Thank You", BadgeType::Bronze, 20, 10],
[Badge::GivesBack, "Gives Back", BadgeType::Silver, 100, 100],
diff --git a/db/fixtures/009_users.rb b/db/fixtures/009_users.rb
index 8d84fad2dad..937faa20cf7 100644
--- a/db/fixtures/009_users.rb
+++ b/db/fixtures/009_users.rb
@@ -33,7 +33,6 @@ UserOption.where(user_id: -1).update_all(
Group.user_trust_level_change!(-1, TrustLevel[4])
-
ColumnDropper.drop(
table: 'users',
after_migration: 'AddUserAuthTokens',
@@ -55,7 +54,7 @@ ColumnDropper.drop(
last_redirected_to_top_at
auth_token
auth_token_updated_at ],
- on_drop: ->(){
+ on_drop: ->() {
STDERR.puts 'Removing superflous users columns!'
}
)
diff --git a/db/fixtures/501_meta_category.rb b/db/fixtures/501_meta_category.rb
index 9996b2abc81..38ed96aaea0 100644
--- a/db/fixtures/501_meta_category.rb
+++ b/db/fixtures/501_meta_category.rb
@@ -17,7 +17,7 @@ unless Rails.env.test?
raise "Failed meta topic"
end
- meta.set_permissions(:everyone => :full)
+ meta.set_permissions(everyone: :full)
meta.topic_id = post.topic.id
unless meta.save
puts meta.errors.full_messages
diff --git a/db/fixtures/502_staff_category.rb b/db/fixtures/502_staff_category.rb
index f1b62c1bf2c..54faa6385bf 100644
--- a/db/fixtures/502_staff_category.rb
+++ b/db/fixtures/502_staff_category.rb
@@ -1,6 +1,6 @@
unless Rails.env.test?
staff = Category.find_by(id: SiteSetting.staff_category_id)
- if staff and !staff.group_ids.include?(Group[:staff].id)
+ if staff && !staff.group_ids.include?(Group[:staff].id)
# Add permissions and a description to the Staff category.
diff --git a/db/fixtures/600_themes.rb b/db/fixtures/600_themes.rb
index 0ec6e274d28..5b141c57ad7 100644
--- a/db/fixtures/600_themes.rb
+++ b/db/fixtures/600_themes.rb
@@ -7,13 +7,13 @@ if !Theme.exists?
dark_scheme ||= ColorScheme.create_from_base(name: name, via_wizard: true, base_scheme_id: "dark")
name = I18n.t('color_schemes.dark_theme_name')
- _dark_theme = Theme.create(name: name, user_id: -1,
- color_scheme_id: dark_scheme.id,
- user_selectable: true)
+ _dark_theme = Theme.create(name: name, user_id: -1,
+ color_scheme_id: dark_scheme.id,
+ user_selectable: true)
name = I18n.t('color_schemes.default_theme_name')
- default_theme = Theme.create(name: name, user_id: -1,
- user_selectable: true)
+ default_theme = Theme.create(name: name, user_id: -1,
+ user_selectable: true)
default_theme.set_default!
end
@@ -22,7 +22,7 @@ ColumnDropper.drop(
table: 'theme_fields',
after_migration: 'AddUploadIdToThemeFields',
columns: ['target'],
- on_drop: ->(){
+ on_drop: ->() {
STDERR.puts 'Removing superflous theme_fields target column!'
}
)
diff --git a/db/fixtures/999_delayed.rb b/db/fixtures/999_delayed.rb
index 1141e13e64a..4d69a58267d 100644
--- a/db/fixtures/999_delayed.rb
+++ b/db/fixtures/999_delayed.rb
@@ -6,7 +6,7 @@ TableMigrationHelper.delayed_drop(
old_name: 'topic_status_updates',
new_name: 'topic_timers',
after_migration: 'RenameTopicStatusUpdatesToTopicTimers',
- on_drop: ->(){
+ on_drop: ->() {
STDERR.puts "Dropping topic_status_updates. It was moved to topic_timers."
}
)
diff --git a/db/fixtures/999_topics.rb b/db/fixtures/999_topics.rb
index 541cacad12c..25958a8c694 100644
--- a/db/fixtures/999_topics.rb
+++ b/db/fixtures/999_topics.rb
@@ -6,9 +6,9 @@ staff = Category.find_by(id: SiteSetting.staff_category_id)
seed_welcome_topics = (Topic.where('id NOT IN (SELECT topic_id from categories where topic_id is not null)').count == 0 && !Rails.env.test?)
unless Rails.env.test?
- def create_static_page_topic(site_setting_key, title_key, body_key, body_override, category, description, params={})
+ def create_static_page_topic(site_setting_key, title_key, body_key, body_override, category, description, params = {})
unless SiteSetting.send(site_setting_key) > 0
- creator = PostCreator.new( Discourse.system_user,
+ creator = PostCreator.new(Discourse.system_user,
title: I18n.t(title_key, default: I18n.t(title_key, locale: :en)),
raw: body_override.present? ? body_override : I18n.t(body_key, params.merge(default: I18n.t(body_key, params.merge(locale: :en)))),
skip_validations: true,
@@ -19,18 +19,16 @@ unless Rails.env.test?
SiteSetting.send("#{site_setting_key}=", post.topic_id)
- _reply = PostCreator.create( Discourse.system_user,
+ _reply = PostCreator.create(Discourse.system_user,
raw: I18n.t('static_topic_first_reply', page_name: I18n.t(title_key, default: I18n.t(title_key, locale: :en))),
skip_validations: true,
- topic_id: post.topic_id )
+ topic_id: post.topic_id)
end
end
- create_static_page_topic('tos_topic_id', 'tos_topic.title', "tos_topic.body", nil, staff, "terms of service", {
- company_domain: "company_domain",
- company_full_name: "company_full_name",
- company_name: "company_short_name"
- })
+ create_static_page_topic('tos_topic_id', 'tos_topic.title', "tos_topic.body", nil, staff, "terms of service", company_domain: "company_domain",
+ company_full_name: "company_full_name",
+ company_name: "company_short_name")
create_static_page_topic('guidelines_topic_id', 'guidelines_topic.title', "guidelines_topic.body", nil, staff, "guidelines")
@@ -57,15 +55,13 @@ if seed_welcome_topics
end
welcome = File.read(filename)
- PostCreator.create( Discourse.system_user,
+ PostCreator.create(Discourse.system_user,
raw: welcome,
title: DiscoursePluginRegistry.seed_data["admin_quick_start_title"] || "READ ME FIRST: Admin Quick Start Guide",
skip_validations: true,
category: staff ? staff.name : nil)
end
-
-
# run this later, cause we need to make sure new application controller resilience is in place first
ColumnDropper.drop(
@@ -74,7 +70,7 @@ ColumnDropper.drop(
columns: %w{
first_topic_unread_at
},
- on_drop: ->(){
+ on_drop: ->() {
STDERR.puts "Removing superflous user stats columns!"
ActiveRecord::Base.exec_sql "DROP FUNCTION IF EXISTS first_unread_topic_for(int)"
}
@@ -91,7 +87,7 @@ ColumnDropper.drop(
notify_user_count
last_unread_at
},
- on_drop: ->(){
+ on_drop: ->() {
STDERR.puts "Removing superflous topic columns!"
}
)
@@ -106,7 +102,7 @@ ColumnDropper.drop(
auto_close_based_on_last_post
auto_close_hours
},
- on_drop: ->(){
+ on_drop: ->() {
STDERR.puts "Removing superflous topic columns!"
},
delay: 3600
diff --git a/db/migrate/20120502192121_add_last_post_user_id_to_forum_threads.rb b/db/migrate/20120502192121_add_last_post_user_id_to_forum_threads.rb
index 9f7daa2742e..28e3371745c 100644
--- a/db/migrate/20120502192121_add_last_post_user_id_to_forum_threads.rb
+++ b/db/migrate/20120502192121_add_last_post_user_id_to_forum_threads.rb
@@ -3,7 +3,6 @@ class AddLastPostUserIdToForumThreads < ActiveRecord::Migration
def up
add_column :forum_threads, :last_post_user_id, :integer
-
execute "update forum_threads t
set last_post_user_id = (select user_id from posts where forum_thread_id = t.Id order by post_number desc limit 1)"
diff --git a/db/migrate/20120629150253_denormalize_expressions.rb b/db/migrate/20120629150253_denormalize_expressions.rb
index 1b8a659db4c..8a386648852 100644
--- a/db/migrate/20120629150253_denormalize_expressions.rb
+++ b/db/migrate/20120629150253_denormalize_expressions.rb
@@ -15,7 +15,6 @@ class DenormalizeExpressions < ActiveRecord::Migration
add_column :forum_threads, :expression4_count, :integer, null: false, default: 0
add_column :forum_threads, :expression5_count, :integer, null: false, default: 0
-
(1..5).each do |i|
execute "update posts set expression#{i}_count = (select count(*) from expressions where parent_id = posts.id and expression_type_id = #{i})"
execute "update forum_threads set expression#{i}_count = (select sum(expression#{i}_count) from posts where forum_thread_id = forum_threads.id)"
diff --git a/db/migrate/20120719004636_add_email_hashed_password_name_salt_to_users.rb b/db/migrate/20120719004636_add_email_hashed_password_name_salt_to_users.rb
index bd1e05bea2d..4bd5e9b733b 100644
--- a/db/migrate/20120719004636_add_email_hashed_password_name_salt_to_users.rb
+++ b/db/migrate/20120719004636_add_email_hashed_password_name_salt_to_users.rb
@@ -4,7 +4,7 @@ class AddEmailHashedPasswordNameSaltToUsers < ActiveRecord::Migration
execute "update users set email= md5(random()::text) || 'domain.com'"
- change_column :users, :email, :string, limit:256, null: false
+ change_column :users, :email, :string, limit: 256, null: false
add_index :users, [:email], unique: true
rename_column :users, :display_username, :name
@@ -12,7 +12,7 @@ class AddEmailHashedPasswordNameSaltToUsers < ActiveRecord::Migration
add_column :users, :password_hash, :string, limit: 64
add_column :users, :salt, :string, limit: 32
add_column :users, :active, :boolean
- add_column :users, :activation_key,:string, limit: 32
+ add_column :users, :activation_key, :string, limit: 32
add_column :user_open_ids, :active, :boolean, null: false
diff --git a/db/migrate/20120720013733_add_username_lower_to_users.rb b/db/migrate/20120720013733_add_username_lower_to_users.rb
index 764fae375d4..38602aa2aa7 100644
--- a/db/migrate/20120720013733_add_username_lower_to_users.rb
+++ b/db/migrate/20120720013733_add_username_lower_to_users.rb
@@ -3,7 +3,7 @@ class AddUsernameLowerToUsers < ActiveRecord::Migration
add_column :users, :username_lower, :string, limit: 20
execute "update users set username_lower = lower(username)"
add_index :users, [:username_lower], unique: true
- change_column :users, :username_lower, :string, limit: 20, null:false
+ change_column :users, :username_lower, :string, limit: 20, null: false
end
def down
remove_column :users, :username_lower
diff --git a/db/migrate/20120807223020_create_actions.rb b/db/migrate/20120807223020_create_actions.rb
index 623bda5929a..ace59397854 100644
--- a/db/migrate/20120807223020_create_actions.rb
+++ b/db/migrate/20120807223020_create_actions.rb
@@ -8,7 +8,6 @@ class CreateActions < ActiveRecord::Migration
# There is a notificiation table as well that covers much of this,
# but this table is wider and is intended for non-notifying actions as well
-
t.integer :action_type, null: false
t.integer :user_id, null: false
t.integer :target_forum_thread_id
diff --git a/db/migrate/20120809020415_remove_site_id.rb b/db/migrate/20120809020415_remove_site_id.rb
index 86727e86fd7..c9904d4a705 100644
--- a/db/migrate/20120809020415_remove_site_id.rb
+++ b/db/migrate/20120809020415_remove_site_id.rb
@@ -9,7 +9,7 @@ class RemoveSiteId < ActiveRecord::Migration
remove_index 'expression_types', name: 'index_expression_types_on_site_id_and_expression_index'
remove_index 'expression_types', name: 'index_expression_types_on_site_id_and_name'
- remove_column 'expression_types','site_id'
+ remove_column 'expression_types', 'site_id'
add_index "expression_types", ["expression_index"], unique: true
add_index "expression_types", ["name"], unique: true
diff --git a/db/migrate/20120809053414_correct_indexing_on_posts.rb b/db/migrate/20120809053414_correct_indexing_on_posts.rb
index b3777e093ae..13ff4507d66 100644
--- a/db/migrate/20120809053414_correct_indexing_on_posts.rb
+++ b/db/migrate/20120809053414_correct_indexing_on_posts.rb
@@ -1,20 +1,20 @@
class CorrectIndexingOnPosts < ActiveRecord::Migration
def up
- execute "update posts pp
+ execute "update posts pp
set post_number = c.real_number
from
(
select p1.id, count(*) real_number from posts p1
join posts p2 on p1.forum_thread_id = p2.forum_thread_id
where p2.id <= p1.id and p1.forum_thread_id = p2.forum_thread_id
- group by p1.id
+ group by p1.id
) as c
where pp.id = c.id and pp.post_number <> c.real_number"
- remove_index "posts", ["forum_thread_id","post_number"]
+ remove_index "posts", ["forum_thread_id", "post_number"]
# this needs to be unique if it is not we can not use post_number to identify a post
- add_index "posts", ["forum_thread_id","post_number"], unique: true
+ add_index "posts", ["forum_thread_id", "post_number"], unique: true
end
diff --git a/db/migrate/20120809154750_remove_index_for_now.rb b/db/migrate/20120809154750_remove_index_for_now.rb
index 148cbe70a07..ea20ceb152e 100644
--- a/db/migrate/20120809154750_remove_index_for_now.rb
+++ b/db/migrate/20120809154750_remove_index_for_now.rb
@@ -1,11 +1,11 @@
class RemoveIndexForNow < ActiveRecord::Migration
def up
- remove_index "posts", ["forum_thread_id","post_number"]
- add_index "posts", ["forum_thread_id","post_number"], unique: false
+ remove_index "posts", ["forum_thread_id", "post_number"]
+ add_index "posts", ["forum_thread_id", "post_number"], unique: false
end
def down
- remove_index "posts", ["forum_thread_id","post_number"]
- add_index "posts", ["forum_thread_id","post_number"], unique: true
+ remove_index "posts", ["forum_thread_id", "post_number"]
+ add_index "posts", ["forum_thread_id", "post_number"], unique: true
end
end
diff --git a/db/migrate/20120809174649_create_post_actions.rb b/db/migrate/20120809174649_create_post_actions.rb
index ddcf4d4632a..7a8e5d9f440 100644
--- a/db/migrate/20120809174649_create_post_actions.rb
+++ b/db/migrate/20120809174649_create_post_actions.rb
@@ -3,7 +3,7 @@ class CreatePostActions < ActiveRecord::Migration
create_table :post_actions do |t|
t.integer :post_id, null: false
t.integer :user_id, null: false
- t.integer :post_action_type_id, null:false
+ t.integer :post_action_type_id, null: false
t.datetime :deleted_at
t.timestamps
end
diff --git a/db/migrate/20120816050526_add_unique_constraint_to_user_actions.rb b/db/migrate/20120816050526_add_unique_constraint_to_user_actions.rb
index 5a8ea4af878..6d79402d346 100644
--- a/db/migrate/20120816050526_add_unique_constraint_to_user_actions.rb
+++ b/db/migrate/20120816050526_add_unique_constraint_to_user_actions.rb
@@ -1,5 +1,5 @@
class AddUniqueConstraintToUserActions < ActiveRecord::Migration
def change
- add_index :user_actions, ['action_type','user_id', 'target_forum_thread_id', 'target_post_id', 'acting_user_id'], name: "idx_unique_rows", unique: true
+ add_index :user_actions, ['action_type', 'user_id', 'target_forum_thread_id', 'target_post_id', 'acting_user_id'], name: "idx_unique_rows", unique: true
end
end
diff --git a/db/migrate/20120821191616_add_bumped_at_to_forum_threads.rb b/db/migrate/20120821191616_add_bumped_at_to_forum_threads.rb
index 584c62c9fbf..9420f79a8d3 100644
--- a/db/migrate/20120821191616_add_bumped_at_to_forum_threads.rb
+++ b/db/migrate/20120821191616_add_bumped_at_to_forum_threads.rb
@@ -5,6 +5,6 @@ class AddBumpedAtToForumThreads < ActiveRecord::Migration
change_column :forum_threads, :bumped_at, :datetime, null: false
remove_index :forum_threads, :last_posted_at
- add_index :forum_threads, :bumped_at, order: {bumped_at: :desc}
+ add_index :forum_threads, :bumped_at, order: { bumped_at: :desc }
end
end
diff --git a/db/migrate/20121011155904_create_email_logs.rb b/db/migrate/20121011155904_create_email_logs.rb
index 2d92e00db64..abfea55e767 100644
--- a/db/migrate/20121011155904_create_email_logs.rb
+++ b/db/migrate/20121011155904_create_email_logs.rb
@@ -7,7 +7,7 @@ class CreateEmailLogs < ActiveRecord::Migration
t.timestamps
end
- add_index :email_logs, :created_at, order: {created_at: :desc}
- add_index :email_logs, [:user_id, :created_at], order: {created_at: :desc}
+ add_index :email_logs, :created_at, order: { created_at: :desc }
+ add_index :email_logs, [:user_id, :created_at], order: { created_at: :desc }
end
end
diff --git a/db/migrate/20121018103721_rename_forum_thread_tables.rb b/db/migrate/20121018103721_rename_forum_thread_tables.rb
index d513d1b0e2f..84980494dae 100644
--- a/db/migrate/20121018103721_rename_forum_thread_tables.rb
+++ b/db/migrate/20121018103721_rename_forum_thread_tables.rb
@@ -14,7 +14,6 @@ class RenameForumThreadTables < ActiveRecord::Migration
rename_column 'categories', 'threads_month', 'topics_month'
rename_column 'categories', 'threads_week', 'topics_week'
-
rename_column 'category_featured_topics', 'forum_thread_id', 'topic_id'
rename_column 'topic_link_clicks', 'forum_thread_link_id', 'topic_link_id'
@@ -22,7 +21,6 @@ class RenameForumThreadTables < ActiveRecord::Migration
rename_column 'topic_links', 'forum_thread_id', 'topic_id'
rename_column 'topic_links', 'link_forum_thread_id', 'link_topic_id'
-
rename_column 'topic_users', 'forum_thread_id', 'topic_id'
rename_column 'incoming_links', 'forum_thread_id', 'topic_id'
diff --git a/db/migrate/20130122232825_add_auto_track_after_seconds_and_banning_and_dob_to_user.rb b/db/migrate/20130122232825_add_auto_track_after_seconds_and_banning_and_dob_to_user.rb
index 1432d8ba70b..34ee5edbced 100644
--- a/db/migrate/20130122232825_add_auto_track_after_seconds_and_banning_and_dob_to_user.rb
+++ b/db/migrate/20130122232825_add_auto_track_after_seconds_and_banning_and_dob_to_user.rb
@@ -6,7 +6,7 @@ class AddAutoTrackAfterSecondsAndBanningAndDobToUser < ActiveRecord::Migration
add_column :users, :auto_track_topics_after_msecs, :integer
add_column :users, :views, :integer, null: false, default: 0
- remove_column :users, :auto_track_topics
+ remove_column :users, :auto_track_topics
add_column :topic_users, :total_msecs_viewed, :integer, null: false, default: 0
diff --git a/db/migrate/20130319122248_add_reply_to_user_id_to_post.rb b/db/migrate/20130319122248_add_reply_to_user_id_to_post.rb
index 3f537dfdc92..1eb09763de7 100644
--- a/db/migrate/20130319122248_add_reply_to_user_id_to_post.rb
+++ b/db/migrate/20130319122248_add_reply_to_user_id_to_post.rb
@@ -3,8 +3,8 @@ class AddReplyToUserIdToPost < ActiveRecord::Migration
# caching this column makes the topic page WAY faster
add_column :posts, :reply_to_user_id, :integer
execute 'UPDATE posts p SET reply_to_user_id = (
- SELECT u.id from users u
- JOIN posts p2 ON p2.user_id = u.id AND
+ SELECT u.id from users u
+ JOIN posts p2 ON p2.user_id = u.id AND
p2.post_number = p.reply_to_post_number AND
p2.topic_id = p.topic_id
)'
diff --git a/db/migrate/20130320012100_add_user_indexes_to_posts_and_topics.rb b/db/migrate/20130320012100_add_user_indexes_to_posts_and_topics.rb
index 3fffe74303b..89bdb3aee4b 100644
--- a/db/migrate/20130320012100_add_user_indexes_to_posts_and_topics.rb
+++ b/db/migrate/20130320012100_add_user_indexes_to_posts_and_topics.rb
@@ -1,9 +1,9 @@
class AddUserIndexesToPostsAndTopics < ActiveRecord::Migration
def up
- execute "CREATE INDEX idx_posts_user_id_deleted_at
+ execute "CREATE INDEX idx_posts_user_id_deleted_at
ON posts(user_id) WHERE deleted_at IS NULL"
-
- execute "CREATE INDEX idx_topics_user_id_deleted_at
+
+ execute "CREATE INDEX idx_topics_user_id_deleted_at
ON topics(user_id) WHERE deleted_at IS NULL"
end
diff --git a/db/migrate/20130404232558_add_user_extras.rb b/db/migrate/20130404232558_add_user_extras.rb
index 73d1add55dd..70c75482e56 100644
--- a/db/migrate/20130404232558_add_user_extras.rb
+++ b/db/migrate/20130404232558_add_user_extras.rb
@@ -7,7 +7,6 @@ class AddUserExtras < ActiveRecord::Migration
add_column :users, :likes_received, :integer, null: false, default: 0
add_column :users, :topic_reply_count, :integer, null: false, default: 0
-
# NOTE: to keep migrations working through refactorings we avoid externalizing this stuff.
# even though a helper method may make sense
execute <> 0 & 255)
);"
- change_column :topic_link_clicks, :ip_address, :inet, { :null => false }
+ change_column :topic_link_clicks, :ip_address, :inet, null: false
remove_column :topic_link_clicks, :ip
end
diff --git a/db/migrate/20130625022454_change_ip_to_inet_in_views.rb b/db/migrate/20130625022454_change_ip_to_inet_in_views.rb
index 30a0e8390bc..e4e01f56295 100644
--- a/db/migrate/20130625022454_change_ip_to_inet_in_views.rb
+++ b/db/migrate/20130625022454_change_ip_to_inet_in_views.rb
@@ -12,7 +12,7 @@ class ChangeIpToInetInViews < ActiveRecord::Migration
(ip >> 0 & 255)
);"
- change_column table, :ip_address, :inet, { :null => false }
+ change_column table, :ip_address, :inet, null: false
remove_column table, :ip
end
diff --git a/db/migrate/20130625170842_remove_access_password.rb b/db/migrate/20130625170842_remove_access_password.rb
index 31c5a83d4a5..d2b87bc71bd 100644
--- a/db/migrate/20130625170842_remove_access_password.rb
+++ b/db/migrate/20130625170842_remove_access_password.rb
@@ -1,7 +1,7 @@
class RemoveAccessPassword < ActiveRecord::Migration
def up
result = execute("SELECT count(*) FROM site_settings where name='access_password' and char_length(value) > 0")
- if result[0] and result[0]["count"].to_i > 0
+ if result[0] && result[0]["count"].to_i > (0)
execute "DELETE FROM site_settings where name='access_password'"
SiteSetting.login_required = true
SiteSetting.must_approve_users = true
diff --git a/db/migrate/20130911182437_create_user_stats.rb b/db/migrate/20130911182437_create_user_stats.rb
index 66f5370743c..ff3f78ab185 100644
--- a/db/migrate/20130911182437_create_user_stats.rb
+++ b/db/migrate/20130911182437_create_user_stats.rb
@@ -1,6 +1,6 @@
class CreateUserStats < ActiveRecord::Migration
def up
- create_table :user_stats, :id => false do |t|
+ create_table :user_stats, id: false do |t|
t.references :user, null: false
t.boolean :has_custom_avatar, default: false, null: false
end
diff --git a/db/migrate/20130912185218_acting_user_null.rb b/db/migrate/20130912185218_acting_user_null.rb
index fe99e3783cc..d03eabe527f 100644
--- a/db/migrate/20130912185218_acting_user_null.rb
+++ b/db/migrate/20130912185218_acting_user_null.rb
@@ -1,10 +1,10 @@
class ActingUserNull < ActiveRecord::Migration
def up
- change_column :user_histories, :acting_user_id, :integer, :null => true
+ change_column :user_histories, :acting_user_id, :integer, null: true
end
def down
execute "DELETE FROM user_histories WHERE acting_user_id IS NULL"
- change_column :user_histories, :acting_user_id, :integer, :null => false
+ change_column :user_histories, :acting_user_id, :integer, null: false
end
end
diff --git a/db/migrate/20131002070347_add_user_id_parent_type_index_on_views.rb b/db/migrate/20131002070347_add_user_id_parent_type_index_on_views.rb
index b1a20098d66..3055c712a84 100644
--- a/db/migrate/20131002070347_add_user_id_parent_type_index_on_views.rb
+++ b/db/migrate/20131002070347_add_user_id_parent_type_index_on_views.rb
@@ -1,5 +1,5 @@
class AddUserIdParentTypeIndexOnViews < ActiveRecord::Migration
def change
- add_index :views, [:user_id,:parent_type,:parent_id]
+ add_index :views, [:user_id, :parent_type, :parent_id]
end
end
diff --git a/db/migrate/20131022045114_add_uncategorized_category.rb b/db/migrate/20131022045114_add_uncategorized_category.rb
index 953960fd661..347bc2320c8 100644
--- a/db/migrate/20131022045114_add_uncategorized_category.rb
+++ b/db/migrate/20131022045114_add_uncategorized_category.rb
@@ -17,7 +17,6 @@ class AddUncategorizedCategory < ActiveRecord::Migration
execute "INSERT INTO site_settings(name, data_type, value, created_at, updated_at)
VALUES ('uncategorized_category_id', 3, #{category_id}, now(), now())"
-
execute "DELETE from site_settings where name in ('uncategorized_name', 'uncategorized_text_color', 'uncategorized_color')"
execute "UPDATE topics SET category_id = #{category_id} WHERE archetype = 'regular' AND category_id IS NULL"
diff --git a/db/migrate/20131023163509_add_parent_category_id_to_categories.rb b/db/migrate/20131023163509_add_parent_category_id_to_categories.rb
index f4b86f50414..759895f5fe8 100644
--- a/db/migrate/20131023163509_add_parent_category_id_to_categories.rb
+++ b/db/migrate/20131023163509_add_parent_category_id_to_categories.rb
@@ -3,4 +3,3 @@ class AddParentCategoryIdToCategories < ActiveRecord::Migration
add_column :categories, :parent_category_id, :integer
end
end
-
diff --git a/db/migrate/20131210181901_migrate_word_counts.rb b/db/migrate/20131210181901_migrate_word_counts.rb
index 64e05aae99b..e783725bb80 100644
--- a/db/migrate/20131210181901_migrate_word_counts.rb
+++ b/db/migrate/20131210181901_migrate_word_counts.rb
@@ -2,7 +2,7 @@ class MigrateWordCounts < ActiveRecord::Migration
disable_ddl_transaction!
def up
- post_ids = execute("SELECT id FROM posts WHERE word_count IS NULL LIMIT 500").map {|r| r['id'].to_i }
+ post_ids = execute("SELECT id FROM posts WHERE word_count IS NULL LIMIT 500").map { |r| r['id'].to_i }
while post_ids.length > 0
3.times do
begin
@@ -12,10 +12,10 @@ class MigrateWordCounts < ActiveRecord::Migration
# Deadlock. Try again, up to 3 times.
end
end
- post_ids = execute("SELECT id FROM posts WHERE word_count IS NULL LIMIT 500").map {|r| r['id'].to_i }
+ post_ids = execute("SELECT id FROM posts WHERE word_count IS NULL LIMIT 500").map { |r| r['id'].to_i }
end
- topic_ids = execute("SELECT id FROM topics WHERE word_count IS NULL LIMIT 500").map {|r| r['id'].to_i }
+ topic_ids = execute("SELECT id FROM topics WHERE word_count IS NULL LIMIT 500").map { |r| r['id'].to_i }
while topic_ids.length > 0
3.times do
begin
@@ -25,7 +25,7 @@ class MigrateWordCounts < ActiveRecord::Migration
# Deadlock. Try again, up to 3 times.
end
end
- topic_ids = execute("SELECT id FROM topics WHERE word_count IS NULL LIMIT 500").map {|r| r['id'].to_i }
+ topic_ids = execute("SELECT id FROM topics WHERE word_count IS NULL LIMIT 500").map { |r| r['id'].to_i }
end
end
diff --git a/db/migrate/20140211230222_move_cas_settings.rb b/db/migrate/20140211230222_move_cas_settings.rb
index 0de988fbfad..b832385a3b9 100644
--- a/db/migrate/20140211230222_move_cas_settings.rb
+++ b/db/migrate/20140211230222_move_cas_settings.rb
@@ -4,23 +4,23 @@ class MoveCasSettings < ActiveRecord::Migration
#convert the data over to be used by the plugin.
cas_hostname = SiteSetting.find_by(name: "cas_hostname")
cas_sso_hostname = SiteSetting.find_by(name: "cas_sso_hostname")
- if cas_hostname && ! cas_sso_hostname
+ if cas_hostname && ! cas_sso_hostname
#convert the setting over for use by the plugin
cas_hostname.update_attribute(:name, 'cas_sso_hostname')
- elsif cas_hostname && cas_sso_hostname
+ elsif cas_hostname && cas_sso_hostname
#copy the setting over for use by the plugin and delete the original setting
- cas_sso_hostname.update_attribute(:value,cas_hostname.value)
+ cas_sso_hostname.update_attribute(:value, cas_hostname.value)
cas_hostname.destroy
end
cas_domainname = SiteSetting.find_by(name: "cas_domainname")
cas_sso_email_domain = SiteSetting.find_by(name: "cas_sso_email_domain")
- if cas_domainname && ! cas_sso_email_domain
+ if cas_domainname && ! cas_sso_email_domain
#convert the setting over for use by the plugin
cas_domainname.update_attribute(:name, 'cas_sso_email_domain')
- elsif cas_domainname && cas_sso_email_domain
+ elsif cas_domainname && cas_sso_email_domain
#copy the setting over for use by the plugin and delete the original setting
- cas_sso_email_domain.update_attribute(:value,cas_domainname.value)
+ cas_sso_email_domain.update_attribute(:value, cas_domainname.value)
cas_domainname.destroy
end
@@ -29,7 +29,7 @@ class MoveCasSettings < ActiveRecord::Migration
cas_logins.destroy
end
- #remove the unused table
+ #remove the unused table
drop_table :cas_user_infos
end
diff --git a/db/migrate/20140227104930_add_custom_email_in_to_categories.rb b/db/migrate/20140227104930_add_custom_email_in_to_categories.rb
index 7d3cac2c5f2..fa31829cafe 100644
--- a/db/migrate/20140227104930_add_custom_email_in_to_categories.rb
+++ b/db/migrate/20140227104930_add_custom_email_in_to_categories.rb
@@ -1,12 +1,12 @@
class AddCustomEmailInToCategories < ActiveRecord::Migration
def up
- add_column :categories, :email_in, :string, null: true
- add_column :categories, :email_in_allow_strangers, :boolean, default: false
- add_index :categories, :email_in, unique: true
+ add_column :categories, :email_in, :string, null: true
+ add_column :categories, :email_in_allow_strangers, :boolean, default: false
+ add_index :categories, :email_in, unique: true
end
def down
- remove_column :categories, :email_in
- remove_column :categories, :email_in_allow_strangers
- remove_index :categories, :email_in
+ remove_column :categories, :email_in
+ remove_column :categories, :email_in_allow_strangers
+ remove_index :categories, :email_in
end
end
diff --git a/db/migrate/20140318150412_add_excerpt_to_topics.rb b/db/migrate/20140318150412_add_excerpt_to_topics.rb
index 35283cb47b5..513906d9000 100644
--- a/db/migrate/20140318150412_add_excerpt_to_topics.rb
+++ b/db/migrate/20140318150412_add_excerpt_to_topics.rb
@@ -2,7 +2,7 @@ class AddExcerptToTopics < ActiveRecord::Migration
def up
add_column :topics, :excerpt, :string, limit: 1000
- topic_ids = execute("SELECT id FROM topics WHERE pinned_at IS NOT NULL").map {|r| r['id'].to_i }
+ topic_ids = execute("SELECT id FROM topics WHERE pinned_at IS NOT NULL").map { |r| r['id'].to_i }
topic_ids.each do |topic_id|
cooked = execute("SELECT cooked FROM posts WHERE topic_id = #{topic_id} ORDER BY post_number ASC LIMIT 1")[0]['cooked']
if cooked
diff --git a/db/migrate/20140402201432_make_content_sha1_nullable.rb b/db/migrate/20140402201432_make_content_sha1_nullable.rb
index 29b7572edcc..fd2a60ebd93 100644
--- a/db/migrate/20140402201432_make_content_sha1_nullable.rb
+++ b/db/migrate/20140402201432_make_content_sha1_nullable.rb
@@ -1,5 +1,5 @@
class MakeContentSha1Nullable < ActiveRecord::Migration
def change
- change_column :topic_embeds, :content_sha1, :string, :limit => 40, :null => true
+ change_column :topic_embeds, :content_sha1, :string, limit: 40, null: true
end
end
diff --git a/db/migrate/20140530002535_remove_system_avatars_from_user_avatars.rb b/db/migrate/20140530002535_remove_system_avatars_from_user_avatars.rb
index ae4a8f364af..82e90e71530 100644
--- a/db/migrate/20140530002535_remove_system_avatars_from_user_avatars.rb
+++ b/db/migrate/20140530002535_remove_system_avatars_from_user_avatars.rb
@@ -9,7 +9,7 @@ class RemoveSystemAvatarsFromUserAvatars < ActiveRecord::Migration
# normally we dont reach into the object model, but we have to here.
# otherwise we will wait a real long time for uploads to go away
skip = -1
- while skip=destroy_system_avatar_batch(skip) do
+ while skip = destroy_system_avatar_batch(skip) do
puts "Destroyed up to id: #{skip}"
end
@@ -21,9 +21,9 @@ class RemoveSystemAvatarsFromUserAvatars < ActiveRecord::Migration
initial = skip
Upload.where('id IN (SELECT system_upload_id FROM user_avatars) AND id > ?', skip)
- .order(:id)
- .limit(500)
- .each do |upload|
+ .order(:id)
+ .limit(500)
+ .each do |upload|
skip = upload.id
begin
upload.destroy
diff --git a/db/migrate/20140715055242_add_quoted_posts.rb b/db/migrate/20140715055242_add_quoted_posts.rb
index 587d894799e..5f6c79cd3ec 100644
--- a/db/migrate/20140715055242_add_quoted_posts.rb
+++ b/db/migrate/20140715055242_add_quoted_posts.rb
@@ -9,7 +9,6 @@ class AddQuotedPosts < ActiveRecord::Migration
add_index :quoted_posts, [:post_id, :quoted_post_id], unique: true
add_index :quoted_posts, [:quoted_post_id, :post_id], unique: true
-
# NOTE this can be done in pg but too much of a headache
id = 0
while id = backfill_batch(id, 1000); end
@@ -37,9 +36,8 @@ SQL
topic_id = a['data-topic'].to_i
post_number = a['data-post'].to_i
- next if uniq[[topic_id,post_number]]
- uniq[[topic_id,post_number]] = true
-
+ next if uniq[[topic_id, post_number]]
+ uniq[[topic_id, post_number]] = true
execute "INSERT INTO quoted_posts(post_id, quoted_post_id, created_at, updated_at)
SELECT #{post_id}, id, created_at, updated_at
diff --git a/db/migrate/20140804010803_incoming_link_normalization.rb b/db/migrate/20140804010803_incoming_link_normalization.rb
index 2c3743541a8..171451dff51 100644
--- a/db/migrate/20140804010803_incoming_link_normalization.rb
+++ b/db/migrate/20140804010803_incoming_link_normalization.rb
@@ -36,7 +36,6 @@ class IncomingLinkNormalization < ActiveRecord::Migration
) X
WHERE a[2] IS NOT NULL"
-
execute "UPDATE incoming_links l
SET incoming_referer_id = r.id
FROM incoming_referers r
@@ -59,7 +58,6 @@ class IncomingLinkNormalization < ActiveRecord::Migration
FROM incoming_domains d
WHERE d.name = l.domain AND d.https = l.https AND d.port = l.port"
-
remove_column :incoming_referers, :domain
remove_column :incoming_referers, :port
remove_column :incoming_referers, :https
diff --git a/db/migrate/20140804075613_normalize_topic_view_data_and_index.rb b/db/migrate/20140804075613_normalize_topic_view_data_and_index.rb
index 4f6e6f1b2ee..67b9d784b5b 100644
--- a/db/migrate/20140804075613_normalize_topic_view_data_and_index.rb
+++ b/db/migrate/20140804075613_normalize_topic_view_data_and_index.rb
@@ -29,7 +29,6 @@ class NormalizeTopicViewDataAndIndex < ActiveRecord::Migration
SELECT NULL, topic_id, ip_address, viewed_at FROM tmp_views_ip
'
-
execute 'CREATE UNIQUE INDEX user_id_topic_id_topic_views ON topic_views(user_id, topic_id) WHERE user_id IS NOT NULL'
execute 'CREATE UNIQUE INDEX ip_address_topic_id_topic_views ON topic_views(ip_address, topic_id) WHERE user_id IS NULL'
diff --git a/db/migrate/20140815215618_add_name_lower_to_categories.rb b/db/migrate/20140815215618_add_name_lower_to_categories.rb
index 97c1685337d..20f6ef8c374 100644
--- a/db/migrate/20140815215618_add_name_lower_to_categories.rb
+++ b/db/migrate/20140815215618_add_name_lower_to_categories.rb
@@ -3,7 +3,7 @@ class AddNameLowerToCategories < ActiveRecord::Migration
def up
add_column :categories, :name_lower, :string, limit: 50
execute "update categories set name_lower = lower(name)"
- change_column :categories, :name_lower, :string, limit: 50, null:false
+ change_column :categories, :name_lower, :string, limit: 50, null: false
end
def down
diff --git a/db/migrate/20140913192733_add_trust_level_locked_column.rb b/db/migrate/20140913192733_add_trust_level_locked_column.rb
index 8ac5b0b9893..c086f4a2fde 100644
--- a/db/migrate/20140913192733_add_trust_level_locked_column.rb
+++ b/db/migrate/20140913192733_add_trust_level_locked_column.rb
@@ -1,6 +1,6 @@
class AddTrustLevelLockedColumn < ActiveRecord::Migration
def change
- add_column :users, :trust_level_locked, :boolean, { default: false, null: false}
+ add_column :users, :trust_level_locked, :boolean, default: false, null: false
reversible do |dir|
dir.up do
diff --git a/db/migrate/20140929204155_migrate_tos_setting.rb b/db/migrate/20140929204155_migrate_tos_setting.rb
index 4e313c0373b..6ecac45bb81 100644
--- a/db/migrate/20140929204155_migrate_tos_setting.rb
+++ b/db/migrate/20140929204155_migrate_tos_setting.rb
@@ -13,7 +13,6 @@ class MigrateTosSetting < ActiveRecord::Migration
label = res[0]['value']
end
-
label = PG::Connection.escape_string(label)
execute("INSERT INTO user_fields (name, field_type, editable) VALUES ('#{label}', 'confirm', false)")
end
diff --git a/db/migrate/20141216112341_resolve_duplicate_group_names.rb b/db/migrate/20141216112341_resolve_duplicate_group_names.rb
index 63a49e4b603..dc8fa1fdb02 100644
--- a/db/migrate/20141216112341_resolve_duplicate_group_names.rb
+++ b/db/migrate/20141216112341_resolve_duplicate_group_names.rb
@@ -11,7 +11,7 @@ class ResolveDuplicateGroupNames < ActiveRecord::Migration
groups = Group.where id: results.map { |r| r['id'] }
groups.group_by { |g| g.name.downcase }.each do |key, value|
value.each_with_index do |dup, index|
- dup.update! name: "#{dup.name[0..18]}_#{index+1}" if index > 0
+ dup.update! name: "#{dup.name[0..18]}_#{index + 1}" if index > 0
end
end
end
diff --git a/db/migrate/20150108002354_add_liked_and_bookmarked_to_topic_user.rb b/db/migrate/20150108002354_add_liked_and_bookmarked_to_topic_user.rb
index 2dcdd47314c..58b5f37831c 100644
--- a/db/migrate/20150108002354_add_liked_and_bookmarked_to_topic_user.rb
+++ b/db/migrate/20150108002354_add_liked_and_bookmarked_to_topic_user.rb
@@ -4,7 +4,7 @@ class AddLikedAndBookmarkedToTopicUser < ActiveRecord::Migration
add_column :topic_users, :bookmarked, :boolean, default: false
# likes and bookmarks PostActionType.types[:like] and :bookmark which should not be used in a migration
- {liked: 2, bookmarked: 1}.each do |name, type|
+ { liked: 2, bookmarked: 1 }.each do |name, type|
execute "UPDATE topic_users
SET #{name} = true
WHERE EXISTS (SELECT 1 FROM post_actions pa
diff --git a/db/migrate/20150713203955_enlarge_users_email_field.rb b/db/migrate/20150713203955_enlarge_users_email_field.rb
index 15856c0f04c..9b4238f4b50 100644
--- a/db/migrate/20150713203955_enlarge_users_email_field.rb
+++ b/db/migrate/20150713203955_enlarge_users_email_field.rb
@@ -1,8 +1,8 @@
class EnlargeUsersEmailField < ActiveRecord::Migration
def up
- change_column :users, :email, :string, :limit => 513
+ change_column :users, :email, :string, limit: 513
end
def down
- change_column :users, :email, :string, :limit => 128
+ change_column :users, :email, :string, limit: 128
end
end
diff --git a/db/migrate/20150729150523_migrate_auto_close_posts.rb b/db/migrate/20150729150523_migrate_auto_close_posts.rb
index d00ec9623ad..1a4d6bc0e70 100644
--- a/db/migrate/20150729150523_migrate_auto_close_posts.rb
+++ b/db/migrate/20150729150523_migrate_auto_close_posts.rb
@@ -9,7 +9,7 @@ class MigrateAutoClosePosts < ActiveRecord::Migration
sql = "UPDATE posts SET action_code = 'autoclosed.enabled', post_type = 3 "
sql << "WHERE post_type = 2 AND ("
- sql << strings.map {|s| "raw ~* #{ActiveRecord::Base.connection.quote(s)}" }.join(' OR ')
+ sql << strings.map { |s| "raw ~* #{ActiveRecord::Base.connection.quote(s)}" }.join(' OR ')
sql << ")"
execute sql
diff --git a/db/migrate/20160108051129_fix_incorrect_user_history.rb b/db/migrate/20160108051129_fix_incorrect_user_history.rb
index 2a9cbdf0fbc..e7b44a9e761 100644
--- a/db/migrate/20160108051129_fix_incorrect_user_history.rb
+++ b/db/migrate/20160108051129_fix_incorrect_user_history.rb
@@ -7,7 +7,6 @@ class FixIncorrectUserHistory < ActiveRecord::Migration
#
# This migration hunts for date stuff started going wrong and date it started being good and corrects the data
-
# this is a :auto_trust_level_change mislabled as :check_email
# impersonate that was actually delete topic
condition = < 0
+ if result[0] && result[0]["count"].to_i > (0)
execute "UPDATE categories SET show_subcategory_list = true WHERE parent_category_id IS NULL"
end
end
diff --git a/db/migrate/20170313192741_add_themes.rb b/db/migrate/20170313192741_add_themes.rb
index ab2e3abc3b4..52905c86b76 100644
--- a/db/migrate/20170313192741_add_themes.rb
+++ b/db/migrate/20170313192741_add_themes.rb
@@ -20,16 +20,15 @@ class AddThemes < ActiveRecord::Migration
remove_column :color_schemes, :versioned_id
enabled_theme_count = execute("SELECT count(*) FROM themes WHERE enabled")
- .to_a[0]["count"].to_i
-
+ .to_a[0]["count"].to_i
enabled_scheme_id = execute("SELECT id FROM color_schemes WHERE enabled")
- .to_a[0]&.fetch("id")
+ .to_a[0]&.fetch("id")
theme_key, theme_id =
execute("SELECT key, id FROM themes WHERE enabled").to_a[0]&.values
- if (enabled_theme_count == 0 && enabled_scheme_id) || enabled_theme_count > 1
+ if (enabled_theme_count == 0 && enabled_scheme_id) || enabled_theme_count > 1
puts "Creating a new default theme!"
@@ -67,8 +66,6 @@ SQL
execute(sql)
end
-
-
remove_column :themes, :enabled
remove_column :color_schemes, :enabled
end
diff --git a/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb b/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb
index 84500b50f77..ce2dfbb3e27 100644
--- a/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb
+++ b/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb
@@ -98,9 +98,7 @@ module ActiveRecord
if fallback_handler.master_down?
fallback_handler.verify_master
- connection = postgresql_connection(config.dup.merge({
- host: config[:replica_host], port: config[:replica_port]
- }))
+ connection = postgresql_connection(config.dup.merge(host: config[:replica_host], port: config[:replica_port]))
verify_replica(connection)
Discourse.enable_readonly_mode(Discourse::PG_READONLY_MODE_KEY)
diff --git a/lib/admin_constraint.rb b/lib/admin_constraint.rb
index 0ee711c2bca..db5c0e73b64 100644
--- a/lib/admin_constraint.rb
+++ b/lib/admin_constraint.rb
@@ -2,7 +2,7 @@ require_dependency 'current_user'
class AdminConstraint
- def initialize(options={})
+ def initialize(options = {})
@require_master = options[:require_master]
end
diff --git a/lib/admin_user_index_query.rb b/lib/admin_user_index_query.rb
index 3a52f75661f..0f216c606bc 100644
--- a/lib/admin_user_index_query.rb
+++ b/lib/admin_user_index_query.rb
@@ -24,10 +24,10 @@ class AdminUserIndexQuery
'read_time' => 'user_stats.time_read'
}
- def find_users(limit=100)
+ def find_users(limit = 100)
page = params[:page].to_i - 1
if page < 0
- page = 0
+ page = 0
end
find_users_query.limit(limit).offset(page * limit)
end
@@ -81,22 +81,22 @@ class AdminUserIndexQuery
where_conds << "user_stats.posts_read_count <= 1 AND user_stats.topics_entered <= 1"
@query.activated
- .references(:user_stats)
- .includes(:user_profile)
- .where("COALESCE(user_profiles.bio_raw, '') != ''")
- .where('users.created_at <= ?', 1.day.ago)
- .where(where_conds.map {|c| "(#{c})"}.join(" OR "))
+ .references(:user_stats)
+ .includes(:user_profile)
+ .where("COALESCE(user_profiles.bio_raw, '') != ''")
+ .where('users.created_at <= ?', 1.day.ago)
+ .where(where_conds.map { |c| "(#{c})" }.join(" OR "))
end
def filter_by_query_classification
case params[:query]
- when 'staff' then @query.where("admin or moderator")
- when 'admins' then @query.where(admin: true)
- when 'moderators' then @query.where(moderator: true)
- when 'blocked' then @query.blocked
- when 'suspended' then @query.suspended
- when 'pending' then @query.not_suspended.where(approved: false)
- when 'suspect' then suspect_users
+ when 'staff' then @query.where("admin or moderator")
+ when 'admins' then @query.where(admin: true)
+ when 'moderators' then @query.where(moderator: true)
+ when 'blocked' then @query.blocked
+ when 'suspended' then @query.suspended
+ when 'pending' then @query.not_suspended.where(approved: false)
+ when 'suspect' then suspect_users
end
end
diff --git a/lib/archetype.rb b/lib/archetype.rb
index 7213c8b26f0..8c8f3591ae6 100644
--- a/lib/archetype.rb
+++ b/lib/archetype.rb
@@ -32,7 +32,7 @@ class Archetype
@archetypes.values
end
- def self.register(name, options={})
+ def self.register(name, options = {})
@archetypes ||= {}
@archetypes[name] = Archetype.new(name, options)
end
diff --git a/lib/auth/current_user_provider.rb b/lib/auth/current_user_provider.rb
index cdd4d495fcc..1affbc8d870 100644
--- a/lib/auth/current_user_provider.rb
+++ b/lib/auth/current_user_provider.rb
@@ -12,12 +12,12 @@ class Auth::CurrentUserProvider
end
# log on a user and set cookies and session etc.
- def log_on_user(user,session,cookies)
+ def log_on_user(user, session, cookies)
raise NotImplementedError
end
# optional interface to be called to refresh cookies etc if needed
- def refresh_session(user,session,cookies)
+ def refresh_session(user, session, cookies)
end
# api has special rights return true if api was detected
@@ -35,7 +35,6 @@ class Auth::CurrentUserProvider
raise NotImplementedError
end
-
def log_off_user(session, cookies)
raise NotImplementedError
end
diff --git a/lib/auth/default_current_user_provider.rb b/lib/auth/default_current_user_provider.rb
index 4be651472ba..e94340c0de0 100644
--- a/lib/auth/default_current_user_provider.rb
+++ b/lib/auth/default_current_user_provider.rb
@@ -44,7 +44,7 @@ class Auth::DefaultCurrentUserProvider
current_user = nil
if auth_token && auth_token.length == 32
- limiter = RateLimiter.new(nil, "cookie_auth_#{request.ip}", COOKIE_ATTEMPTS_PER_MIN ,60)
+ limiter = RateLimiter.new(nil, "cookie_auth_#{request.ip}", COOKIE_ATTEMPTS_PER_MIN , 60)
if limiter.can_perform?
@user_token = UserAuthToken.lookup(auth_token,
@@ -127,8 +127,8 @@ class Auth::DefaultCurrentUserProvider
if !@user_token.legacy && needs_rotation
if @user_token.rotate!(user_agent: @env['HTTP_USER_AGENT'],
- client_ip: @request.ip,
- path: @env['REQUEST_PATH'])
+ client_ip: @request.ip,
+ path: @env['REQUEST_PATH'])
cookies[TOKEN_COOKIE] = cookie_hash(@user_token.unhashed_auth_token)
end
elsif @user_token.legacy
@@ -200,7 +200,6 @@ class Auth::DefaultCurrentUserProvider
cookies.delete(TOKEN_COOKIE)
end
-
# api has special rights return true if api was detected
def is_api?
current_user
diff --git a/lib/auth/facebook_authenticator.rb b/lib/auth/facebook_authenticator.rb
index f7f90cb26bd..f969c8dabf0 100644
--- a/lib/auth/facebook_authenticator.rb
+++ b/lib/auth/facebook_authenticator.rb
@@ -52,8 +52,8 @@ class Auth::FacebookAuthenticator < Auth::Authenticator
def register_middleware(omniauth)
omniauth.provider :facebook,
- :setup => lambda { |env|
- strategy = env["omniauth.strategy"]
+ setup: lambda { |env|
+ strategy = env["omniauth.strategy"]
strategy.options[:client_id] = SiteSetting.facebook_app_id
strategy.options[:client_secret] = SiteSetting.facebook_app_secret
strategy.options[:info_fields] = 'gender,email,name,about,first_name,link,last_name,website,location'
@@ -61,7 +61,7 @@ class Auth::FacebookAuthenticator < Auth::Authenticator
strategy.options[:scope] = 'email,user_about_me,user_location,user_website'
end
},
- :scope => "email"
+ scope: "email"
end
protected
diff --git a/lib/auth/github_authenticator.rb b/lib/auth/github_authenticator.rb
index e79414973ac..41874a04c1f 100644
--- a/lib/auth/github_authenticator.rb
+++ b/lib/auth/github_authenticator.rb
@@ -47,10 +47,8 @@ class Auth::GithubAuthenticator < Auth::Authenticator
# Potentially use *any* of the emails from GitHub to find a match or
# register a new user, with preference given to the primary email.
all_emails = Array.new(auth_token[:extra][:all_emails])
- all_emails.unshift({
- :email => data[:email],
- :verified => !!data[:email_verified]
- })
+ all_emails.unshift(email: data[:email],
+ verified: !!data[:email_verified])
# Only consider verified emails to match an existing user. We don't want
# someone to be able to create a GitHub account with an unverified email
@@ -106,14 +104,13 @@ class Auth::GithubAuthenticator < Auth::Authenticator
)
end
-
def register_middleware(omniauth)
omniauth.provider :github,
- :setup => lambda { |env|
- strategy = env["omniauth.strategy"]
+ setup: lambda { |env|
+ strategy = env["omniauth.strategy"]
strategy.options[:client_id] = SiteSetting.github_client_id
strategy.options[:client_secret] = SiteSetting.github_client_secret
},
- :scope => "user:email"
+ scope: "user:email"
end
end
diff --git a/lib/auth/google_oauth2_authenticator.rb b/lib/auth/google_oauth2_authenticator.rb
index 31e44ea25dc..385aa921481 100644
--- a/lib/auth/google_oauth2_authenticator.rb
+++ b/lib/auth/google_oauth2_authenticator.rb
@@ -21,7 +21,7 @@ class Auth::GoogleOAuth2Authenticator < Auth::Authenticator
if !result.user && !result.email.blank? && result.email_valid
result.user = User.find_by_email(result.email)
if result.user
- ::GoogleUserInfo.create({user_id: result.user.id}.merge(google_hash))
+ ::GoogleUserInfo.create({ user_id: result.user.id }.merge(google_hash))
end
end
@@ -30,7 +30,7 @@ class Auth::GoogleOAuth2Authenticator < Auth::Authenticator
def after_create_account(user, auth)
data = auth[:extra_data]
- GoogleUserInfo.create({user_id: user.id}.merge(data))
+ GoogleUserInfo.create({ user_id: user.id }.merge(data))
if auth[:email_valid].to_s == 'true'
EmailToken.confirm(user.email_tokens.first.token)
user.set_automatic_groups
@@ -41,8 +41,8 @@ class Auth::GoogleOAuth2Authenticator < Auth::Authenticator
# jwt encoding is causing auth to fail in quite a few conditions
# skipping
omniauth.provider :google_oauth2,
- :setup => lambda { |env|
- strategy = env["omniauth.strategy"]
+ setup: lambda { |env|
+ strategy = env["omniauth.strategy"]
strategy.options[:client_id] = SiteSetting.google_oauth2_client_id
strategy.options[:client_secret] = SiteSetting.google_oauth2_client_secret
},
diff --git a/lib/auth/instagram_authenticator.rb b/lib/auth/instagram_authenticator.rb
index ba2dd7f1bb0..507981ef2aa 100644
--- a/lib/auth/instagram_authenticator.rb
+++ b/lib/auth/instagram_authenticator.rb
@@ -39,8 +39,8 @@ class Auth::InstagramAuthenticator < Auth::Authenticator
def register_middleware(omniauth)
omniauth.provider :instagram,
- :setup => lambda { |env|
- strategy = env["omniauth.strategy"]
+ setup: lambda { |env|
+ strategy = env["omniauth.strategy"]
strategy.options[:client_id] = SiteSetting.instagram_consumer_key
strategy.options[:client_secret] = SiteSetting.instagram_consumer_secret
}
diff --git a/lib/auth/oauth2_authenticator.rb b/lib/auth/oauth2_authenticator.rb
index 5484a19f5fb..cadd1022a7b 100644
--- a/lib/auth/oauth2_authenticator.rb
+++ b/lib/auth/oauth2_authenticator.rb
@@ -5,7 +5,7 @@ class Auth::OAuth2Authenticator < Auth::Authenticator
end
# only option at the moment is :trusted
- def initialize(name, opts={})
+ def initialize(name, opts = {})
@name = name
@opts = opts
end
diff --git a/lib/auth/open_id_authenticator.rb b/lib/auth/open_id_authenticator.rb
index 04f2764a9cd..1bb17447c7f 100644
--- a/lib/auth/open_id_authenticator.rb
+++ b/lib/auth/open_id_authenticator.rb
@@ -49,15 +49,14 @@ class Auth::OpenIdAuthenticator < Auth::Authenticator
)
end
-
def register_middleware(omniauth)
omniauth.provider :open_id,
- :setup => lambda { |env|
- strategy = env["omniauth.strategy"]
+ setup: lambda { |env|
+ strategy = env["omniauth.strategy"]
strategy.options[:store] = OpenID::Store::Redis.new($redis)
},
- :name => name,
- :identifier => identifier,
- :require => "omniauth-openid"
+ name: name,
+ identifier: identifier,
+ require: "omniauth-openid"
end
end
diff --git a/lib/auth/result.rb b/lib/auth/result.rb
index eabc6999995..0c18d3e1e5e 100644
--- a/lib/auth/result.rb
+++ b/lib/auth/result.rb
@@ -35,8 +35,8 @@ class Auth::Result
if user.suspended?
{
suspended: true,
- suspended_message: I18n.t( user.suspend_reason ? "login.suspended_with_reason" : "login.suspended",
- {date: I18n.l(user.suspended_till, format: :date_only), reason: user.suspend_reason} )
+ suspended_message: I18n.t(user.suspend_reason ? "login.suspended_with_reason" : "login.suspended",
+ date: I18n.l(user.suspended_till, format: :date_only), reason: user.suspend_reason)
}
else
{
diff --git a/lib/auth/twitter_authenticator.rb b/lib/auth/twitter_authenticator.rb
index c5f91c04775..a88d2124c60 100644
--- a/lib/auth/twitter_authenticator.rb
+++ b/lib/auth/twitter_authenticator.rb
@@ -57,8 +57,8 @@ class Auth::TwitterAuthenticator < Auth::Authenticator
def register_middleware(omniauth)
omniauth.provider :twitter,
- :setup => lambda { |env|
- strategy = env["omniauth.strategy"]
+ setup: lambda { |env|
+ strategy = env["omniauth.strategy"]
strategy.options[:consumer_key] = SiteSetting.twitter_consumer_key
strategy.options[:consumer_secret] = SiteSetting.twitter_consumer_secret
}
diff --git a/lib/autospec/formatter.rb b/lib/autospec/formatter.rb
index 98d872de8ef..a5fe09acbec 100644
--- a/lib/autospec/formatter.rb
+++ b/lib/autospec/formatter.rb
@@ -16,7 +16,7 @@ class Autospec::Formatter < RSpec::Core::Formatters::BaseTextFormatter
def start(example_count)
super
File.delete(RSPEC_RESULT) if File.exists?(RSPEC_RESULT)
- @fail_file = File.open(RSPEC_RESULT,"w")
+ @fail_file = File.open(RSPEC_RESULT, "w")
end
def example_passed(_notification)
diff --git a/lib/autospec/manager.rb b/lib/autospec/manager.rb
index 3cc52008e19..857967031cf 100644
--- a/lib/autospec/manager.rb
+++ b/lib/autospec/manager.rb
@@ -9,7 +9,7 @@ module Autospec; end
class Autospec::Manager
- def self.run(opts={})
+ def self.run(opts = {})
self.new(opts).run
end
@@ -66,10 +66,10 @@ class Autospec::Manager
Autospec::QunitRunner.new
end
- def ensure_all_specs_will_run(current_runner=nil)
+ def ensure_all_specs_will_run(current_runner = nil)
puts "@@@@@@@@@@@@ ensure_all_specs_will_run" if @debug
- @queue.reject!{|_,s,_| s == "spec"}
+ @queue.reject! { |_, s, _| s == "spec" }
if current_runner
@queue.concat [['spec', 'spec', current_runner]]
@@ -151,14 +151,14 @@ class Autospec::Manager
# try focus tag
if failed_specs.length > 0
- filename,_ = failed_specs[0].split(":")
+ filename, _ = failed_specs[0].split(":")
if filename && File.exist?(filename) && !File.directory?(filename)
spec = File.read(filename)
- start,_ = spec.split(/\S*#focus\S*$/)
+ start, _ = spec.split(/\S*#focus\S*$/)
if start.length < spec.length
line = start.scan(/\n/).length + 1
puts "Found #focus tag on line #{line}!"
- failed_specs = ["#{filename}:#{line+1}"]
+ failed_specs = ["#{filename}:#{line + 1}"]
end
end
end
@@ -188,7 +188,7 @@ class Autospec::Manager
FileUtils.rm_f(socket_path)
server = SocketServer.new(socket_path)
server.start do |line|
- file,line = line.split(' ')
+ file, line = line.split(' ')
file = file.sub(Rails.root.to_s << "/", "")
# process_change can aquire a mutex and block
# the acceptor
@@ -196,7 +196,7 @@ class Autospec::Manager
if file =~ /(es6|js)$/
process_change([[file]])
else
- process_change([[file,line]])
+ process_change([[file, line]])
end
end
"OK"
@@ -213,7 +213,7 @@ class Autospec::Manager
listener = Listen.to("#{path}/#{watch}", options) do |modified, added, _|
paths = [modified, added].flatten
paths.compact!
- paths.map!{|long| long[(path.length+1)..-1]}
+ paths.map! { |long| long[(path.length + 1)..-1] }
process_change(paths)
end
listener.start
@@ -246,7 +246,7 @@ class Autospec::Manager
end
end
# watchers
- runner.watchers.each do |k,v|
+ runner.watchers.each do |k, v|
if m = k.match(file)
puts "@@@@@@@@@@@@ #{file} matched a watcher for #{runner}" if @debug
hit = true
diff --git a/lib/autospec/qunit_runner.rb b/lib/autospec/qunit_runner.rb
index 577a7c824c0..5c570643704 100644
--- a/lib/autospec/qunit_runner.rb
+++ b/lib/autospec/qunit_runner.rb
@@ -144,7 +144,7 @@ module Autospec
end
def try_to_find_module_name(file)
- file,_ = file.split(/:\d+$/)
+ file, _ = file.split(/:\d+$/)
return unless File.exists?(file)
File.open(file, "r").each_line do |line|
if m = /module\(['"]([^'"]+)/i.match(line)
diff --git a/lib/autospec/rspec_runner.rb b/lib/autospec/rspec_runner.rb
index b6f5b90dd15..3fb9c093770 100644
--- a/lib/autospec/rspec_runner.rb
+++ b/lib/autospec/rspec_runner.rb
@@ -19,8 +19,8 @@ module Autospec
watch(%r{^spec/fabricators/.+_fabricator\.rb$}) { "spec" }
- watch(%r{^app/assets/javascripts/pretty-text/.*\.js\.es6$}) { "spec/components/pretty_text_spec.rb"}
- watch(%r{^plugins/.*/discourse-markdown/.*\.js\.es6$}) { "spec/components/pretty_text_spec.rb"}
+ watch(%r{^app/assets/javascripts/pretty-text/.*\.js\.es6$}) { "spec/components/pretty_text_spec.rb" }
+ watch(%r{^plugins/.*/discourse-markdown/.*\.js\.es6$}) { "spec/components/pretty_text_spec.rb" }
watch(%r{^plugins/.*/spec/.*\.rb})
diff --git a/lib/autospec/simple_runner.rb b/lib/autospec/simple_runner.rb
index 01c0aada5ab..2c1fe8e656f 100644
--- a/lib/autospec/simple_runner.rb
+++ b/lib/autospec/simple_runner.rb
@@ -13,8 +13,8 @@ module Autospec
"-f", "Autospec::Formatter", specs.split].flatten.join(" ")
# launch rspec
Dir.chdir(Rails.root) do
- env = {"RAILS_ENV" => "test"}
- if specs.split(' ').any?{|s| s =~ /^(.\/)?plugins/}
+ env = { "RAILS_ENV" => "test" }
+ if specs.split(' ').any? { |s| s =~ /^(.\/)?plugins/ }
env["LOAD_PLUGINS"] = "1"
puts "Loading plugins while running specs"
end
diff --git a/lib/autospec/spork_runner.rb b/lib/autospec/spork_runner.rb
index fbd05d93ef5..b8ae2c8627e 100644
--- a/lib/autospec/spork_runner.rb
+++ b/lib/autospec/spork_runner.rb
@@ -30,7 +30,7 @@ module Autospec
def run(specs)
args = ["-r", "#{File.dirname(__FILE__)}/formatter.rb",
"-f", "Autospec::Formatter", specs.split].flatten
- spork_service.run(args,$stderr,$stdout)
+ spork_service.run(args, $stderr, $stdout)
end
def reload
@@ -66,7 +66,7 @@ module Autospec
def write_pid_file(file, pid)
FileUtils.mkdir_p(Rails.root + "tmp/pids")
- File.open(file,'w') do |f|
+ File.open(file, 'w') do |f|
f.write(pid)
end
end
@@ -95,7 +95,7 @@ module Autospec
sleep 1
end
- @spork_pid = Process.spawn({'RAILS_ENV' => 'test'}, "bundle exec spork")
+ @spork_pid = Process.spawn({ 'RAILS_ENV' => 'test' }, "bundle exec spork")
write_pid_file(spork_pid_file, @spork_pid)
running = false
diff --git a/lib/avatar_lookup.rb b/lib/avatar_lookup.rb
index d0b5877272b..d86871fee03 100644
--- a/lib/avatar_lookup.rb
+++ b/lib/avatar_lookup.rb
@@ -1,6 +1,6 @@
class AvatarLookup
- def initialize(user_ids=[])
+ def initialize(user_ids = [])
@user_ids = user_ids.tap(&:compact!).tap(&:uniq!).tap(&:flatten!)
end
@@ -23,9 +23,9 @@ class AvatarLookup
# adding tap here is a personal taste thing
hash = {}
User.joins(:user_emails)
- .where(id: @user_ids)
- .select(AvatarLookup.lookup_columns)
- .each{ |user| hash[user.id] = user }
+ .where(id: @user_ids)
+ .select(AvatarLookup.lookup_columns)
+ .each { |user| hash[user.id] = user }
hash
end
end
diff --git a/lib/backup_restore/backup_restore.rb b/lib/backup_restore/backup_restore.rb
index 12a9ecd21dd..c16314f98c0 100644
--- a/lib/backup_restore/backup_restore.rb
+++ b/lib/backup_restore/backup_restore.rb
@@ -11,11 +11,11 @@ module BackupRestore
METADATA_FILE = "meta.json"
LOGS_CHANNEL = "/admin/backups/logs"
- def self.backup!(user_id, opts={})
+ def self.backup!(user_id, opts = {})
start! BackupRestore::Backuper.new(user_id, opts)
end
- def self.restore!(user_id, opts={})
+ def self.restore!(user_id, opts = {})
start! BackupRestore::Restorer.new(user_id, opts)
end
diff --git a/lib/backup_restore/backuper.rb b/lib/backup_restore/backuper.rb
index c70a7a58506..9465457092d 100644
--- a/lib/backup_restore/backuper.rb
+++ b/lib/backup_restore/backuper.rb
@@ -3,7 +3,7 @@ module BackupRestore
class Backuper
attr_reader :success
- def initialize(user_id, opts={})
+ def initialize(user_id, opts = {})
@user_id = user_id
@client_id = opts[:client_id]
@publish_to_message_bus = opts[:publish_to_message_bus] || false
diff --git a/lib/backup_restore/restorer.rb b/lib/backup_restore/restorer.rb
index 2f4e7cdd46c..c0c2b413770 100644
--- a/lib/backup_restore/restorer.rb
+++ b/lib/backup_restore/restorer.rb
@@ -8,7 +8,7 @@ module BackupRestore
class Restorer
attr_reader :success
- def initialize(user_id, opts={})
+ def initialize(user_id, opts = {})
@user_id = user_id
@client_id = opts[:client_id]
@filename = opts[:filename]
diff --git a/lib/badge_queries.rb b/lib/badge_queries.rb
index 20a08d7daf0..cdb5ac8d6ab 100644
--- a/lib/badge_queries.rb
+++ b/lib/badge_queries.rb
@@ -133,44 +133,44 @@ SQL
GROUP BY acting_user_id
SQL
- def self.invite_badge(count,trust_level)
-"
- SELECT u.id user_id, current_timestamp granted_at
- FROM users u
- WHERE u.id IN (
- SELECT invited_by_id
- FROM invites i
- JOIN users u2 ON u2.id = i.user_id
- WHERE i.deleted_at IS NULL AND u2.active AND u2.trust_level >= #{trust_level.to_i} AND not u2.blocked
- GROUP BY invited_by_id
- HAVING COUNT(*) >= #{count.to_i}
- ) AND u.active AND NOT u.blocked AND u.id > 0 AND
- (:backfill OR u.id IN (:user_ids) )
-"
+ def self.invite_badge(count, trust_level)
+ "
+ SELECT u.id user_id, current_timestamp granted_at
+ FROM users u
+ WHERE u.id IN (
+ SELECT invited_by_id
+ FROM invites i
+ JOIN users u2 ON u2.id = i.user_id
+ WHERE i.deleted_at IS NULL AND u2.active AND u2.trust_level >= #{trust_level.to_i} AND not u2.blocked
+ GROUP BY invited_by_id
+ HAVING COUNT(*) >= #{count.to_i}
+ ) AND u.active AND NOT u.blocked AND u.id > 0 AND
+ (:backfill OR u.id IN (:user_ids) )
+ "
end
def self.like_badge(count, is_topic)
# we can do better with dates, but its hard work
-"
- SELECT p.user_id, p.id post_id, p.updated_at granted_at
- FROM badge_posts p
- WHERE #{is_topic ? "p.post_number = 1" : "p.post_number > 1" } AND p.like_count >= #{count.to_i} AND
- (:backfill OR p.id IN (:post_ids) )
-"
+ "
+ SELECT p.user_id, p.id post_id, p.updated_at granted_at
+ FROM badge_posts p
+ WHERE #{is_topic ? "p.post_number = 1" : "p.post_number > 1" } AND p.like_count >= #{count.to_i} AND
+ (:backfill OR p.id IN (:post_ids) )
+ "
end
def self.trust_level(level)
# we can do better with dates, but its hard work figuring this out historically
-"
- SELECT u.id user_id, current_timestamp granted_at FROM users u
- WHERE trust_level >= #{level.to_i} AND (
- :backfill OR u.id IN (:user_ids)
- )
-"
+ "
+ SELECT u.id user_id, current_timestamp granted_at FROM users u
+ WHERE trust_level >= #{level.to_i} AND (
+ :backfill OR u.id IN (:user_ids)
+ )
+ "
end
def self.sharing_badge(count)
-< ?", 1.day.ago)
- .order('created_at desc')
- .limit(SiteSetting.sequential_replies_threshold)
- .pluck(:user_id)
+ .where("created_at > ?", 1.day.ago)
+ .order('created_at desc')
+ .limit(SiteSetting.sequential_replies_threshold)
+ .pluck(:user_id)
# Did we get back as many posts as we asked for, and are they all by the current user?
return if recent_posts_user_ids.size != SiteSetting.sequential_replies_threshold ||
- recent_posts_user_ids.detect {|u| u != @user.id }
+ recent_posts_user_ids.detect { |u| u != @user.id }
# If we got this far, log that we've nagged them about the sequential replies
UserHistory.create!(action: UserHistory.actions[:notified_about_sequential_replies],
target_user_id: @user.id,
- topic_id: @details[:topic_id] )
+ topic_id: @details[:topic_id])
{
id: 'sequential_replies',
@@ -149,7 +149,7 @@ class ComposerMessagesFinder
order('created_at desc').
limit(SiteSetting.get_a_room_threshold).
pluck(:reply_to_user_id).
- find_all {|uid| uid != @user.id && uid == reply_to_user_id}
+ find_all { |uid| uid != @user.id && uid == reply_to_user_id }
return unless last_x_replies.size == SiteSetting.get_a_room_threshold
return unless @topic.posts.count('distinct user_id') >= min_users_posted
diff --git a/lib/content_buffer.rb b/lib/content_buffer.rb
index 99d176d4cb3..8db6146f0bb 100644
--- a/lib/content_buffer.rb
+++ b/lib/content_buffer.rb
@@ -35,7 +35,7 @@ class ContentBuffer
end
# fix last line
- @lines[start_row] << @lines[finish_row][finish_col-1..-1]
+ @lines[start_row] << @lines[finish_row][finish_col - 1..-1]
end
if transform[:operation] == :insert
diff --git a/lib/cooked_post_processor.rb b/lib/cooked_post_processor.rb
index 9d950f4cf06..c3d4afc198d 100644
--- a/lib/cooked_post_processor.rb
+++ b/lib/cooked_post_processor.rb
@@ -9,7 +9,7 @@ class CookedPostProcessor
attr_reader :cooking_options
- def initialize(post, opts={})
+ def initialize(post, opts = {})
@dirty = false
@opts = opts
@post = post
@@ -63,7 +63,7 @@ class CookedPostProcessor
upload_ids |= oneboxed_image_uploads.pluck(:id)
- values = upload_ids.map{ |u| "(#{@post.id},#{u})" }.join(",")
+ values = upload_ids.map { |u| "(#{@post.id},#{u})" }.join(",")
PostUpload.transaction do
PostUpload.delete_all(post_id: @post.id)
if upload_ids.length > 0
@@ -142,11 +142,11 @@ class CookedPostProcessor
original_width, original_height = original_image_size.map(&:to_f)
if w > 0
- ratio = w/original_width
- [w.floor, (original_height*ratio).floor]
+ ratio = w / original_width
+ [w.floor, (original_height * ratio).floor]
else
- ratio = h/original_height
- [(original_width*ratio).floor, h.floor]
+ ratio = h / original_height
+ [(original_width * ratio).floor, h.floor]
end
end
end
@@ -238,7 +238,7 @@ class CookedPostProcessor
false
end
- def add_lightbox!(img, original_width, original_height, upload=nil)
+ def add_lightbox!(img, original_width, original_height, upload = nil)
# first, create a div to hold our lightbox
lightbox = Nokogiri::XML::Node.new("div", @doc)
lightbox["class"] = "lightbox-wrapper"
@@ -283,7 +283,7 @@ class CookedPostProcessor
return I18n.t("upload.pasted_image_filename")
end
- def create_span_node(klass, content=nil)
+ def create_span_node(klass, content = nil)
span = Nokogiri::XML::Node.new("span", @doc)
span.content = content if content
span["class"] = klass
@@ -374,7 +374,7 @@ class CookedPostProcessor
# log the site setting change
reason = I18n.t("disable_remote_images_download_reason")
staff_action_logger = StaffActionLogger.new(Discourse.system_user)
- staff_action_logger.log_site_setting_change("download_remote_images_to_local", true, false, { details: reason })
+ staff_action_logger.log_site_setting_change("download_remote_images_to_local", true, false, details: reason)
# also send a private message to the site contact user
notify_about_low_disk_space
diff --git a/lib/current_user.rb b/lib/current_user.rb
index 01c5570028b..a5035b97646 100644
--- a/lib/current_user.rb
+++ b/lib/current_user.rb
@@ -8,19 +8,18 @@ module CurrentUser
Discourse.current_user_provider.new(env).current_user
end
-
# can be used to pretend current user does no exist, for CSRF attacks
def clear_current_user
@current_user_provider = Discourse.current_user_provider.new({})
end
def log_on_user(user)
- current_user_provider.log_on_user(user,session,cookies)
+ current_user_provider.log_on_user(user, session, cookies)
user.logged_in
end
def log_off_user
- current_user_provider.log_off_user(session,cookies)
+ current_user_provider.log_off_user(session, cookies)
end
def is_api?
@@ -36,7 +35,7 @@ module CurrentUser
end
def refresh_session(user)
- current_user_provider.refresh_session(user,session,cookies)
+ current_user_provider.refresh_session(user, session, cookies)
end
private
diff --git a/lib/demon/base.rb b/lib/demon/base.rb
index 6fb162faad5..188a27e9fe6 100644
--- a/lib/demon/base.rb
+++ b/lib/demon/base.rb
@@ -7,7 +7,7 @@ class Demon::Base
@demons
end
- def self.start(count=1)
+ def self.start(count = 1)
@demons ||= {}
count.times do |i|
(@demons["#{prefix}_#{i}"] ||= new(i)).start
@@ -50,7 +50,7 @@ class Demon::Base
"#{Rails.root}/tmp/pids/#{self.class.prefix}_#{@index}.pid"
end
- def alive?(pid=nil)
+ def alive?(pid = nil)
pid ||= @pid
if pid
Demon::Base.alive?(pid)
@@ -63,14 +63,14 @@ class Demon::Base
@started = false
if @pid
# TODO configurable stop signal
- Process.kill("HUP",@pid)
+ Process.kill("HUP", @pid)
wait_for_stop = lambda {
timeout = @stop_timeout
while alive? && timeout > 0
- timeout -= (@stop_timeout/10.0)
- sleep(@stop_timeout/10.0)
+ timeout -= (@stop_timeout / 10.0)
+ sleep(@stop_timeout / 10.0)
Process.waitpid(@pid, Process::WNOHANG) rescue -1
end
@@ -86,7 +86,6 @@ class Demon::Base
wait_for_stop.call
-
@pid = nil
@started = false
end
@@ -116,7 +115,7 @@ class Demon::Base
if existing = already_running?
# should not happen ... so kill violently
STDERR.puts "Attempting to kill pid #{existing}"
- Process.kill("TERM",existing)
+ Process.kill("TERM", existing)
end
@started = true
@@ -156,7 +155,7 @@ class Demon::Base
def write_pid_file
FileUtils.mkdir_p(Rails.root + "tmp/pids")
- File.open(pid_file,'w') do |f|
+ File.open(pid_file, 'w') do |f|
f.write(@pid)
end
end
@@ -182,7 +181,6 @@ class Demon::Base
end
end
-
def suppress_stdout
true
end
diff --git a/lib/demon/rails_autospec.rb b/lib/demon/rails_autospec.rb
index 92d15a8fb25..702876c87e4 100644
--- a/lib/demon/rails_autospec.rb
+++ b/lib/demon/rails_autospec.rb
@@ -12,9 +12,9 @@ class Demon::RailsAutospec < Demon::Base
require "rack"
ENV["RAILS_ENV"] = "test"
Rack::Server.start(
- :config => "config.ru",
- :AccessLog => [],
- :Port => ENV["TEST_SERVER_PORT"] || 60099,
+ config: "config.ru",
+ AccessLog: [],
+ Port: ENV["TEST_SERVER_PORT"] || 60099,
)
rescue => e
STDERR.puts e.message
diff --git a/lib/demon/sidekiq.rb b/lib/demon/sidekiq.rb
index a6f01944152..85e343c9879 100644
--- a/lib/demon/sidekiq.rb
+++ b/lib/demon/sidekiq.rb
@@ -7,7 +7,7 @@ class Demon::Sidekiq < Demon::Base
end
def self.after_fork(&blk)
- blk ? (@blk=blk) : @blk
+ blk ? (@blk = blk) : @blk
end
private
diff --git a/lib/directory_helper.rb b/lib/directory_helper.rb
index ec8eaccc5ae..7f8e6b86e31 100644
--- a/lib/directory_helper.rb
+++ b/lib/directory_helper.rb
@@ -2,7 +2,7 @@ module DirectoryHelper
def tmp_directory(prefix)
directory_cache[prefix] ||= begin
- f = File.join( Rails.root, 'tmp', Time.now.strftime("#{prefix}%Y%m%d%H%M%S") )
+ f = File.join(Rails.root, 'tmp', Time.now.strftime("#{prefix}%Y%m%d%H%M%S"))
FileUtils.mkdir_p(f) unless Dir[f].present?
f
end
diff --git a/lib/discourse.rb b/lib/discourse.rb
index 3a29209a3b3..dd9d9d3fef9 100644
--- a/lib/discourse.rb
+++ b/lib/discourse.rb
@@ -63,7 +63,7 @@ module Discourse
# When they don't have permission to do something
class InvalidAccess < StandardError
attr_reader :obj
- def initialize(msg=nil, obj=nil)
+ def initialize(msg = nil, obj = nil)
super(msg)
@obj = obj
end
@@ -115,7 +115,6 @@ module Discourse
set
end
-
def self.activate_plugins!
all_plugins = Plugin::Instance.find_all("#{Rails.root}/plugins")
@@ -144,11 +143,11 @@ module Discourse
end
def self.official_plugins
- plugins.find_all{|p| p.metadata.official?}
+ plugins.find_all { |p| p.metadata.official? }
end
def self.unofficial_plugins
- plugins.find_all{|p| !p.metadata.official?}
+ plugins.find_all { |p| !p.metadata.official? }
end
def self.assets_digest
@@ -378,7 +377,7 @@ module Discourse
Rails.cache.reconnect
Logster.store.redis.reconnect
# shuts down all connections in the pool
- Sidekiq.redis_pool.shutdown{|c| nil}
+ Sidekiq.redis_pool.shutdown { |c| nil }
# re-establish
Sidekiq.redis = sidekiq_redis_config
start_connection_reaper
@@ -402,7 +401,7 @@ module Discourse
sleep GlobalSetting.connection_reaper_interval
reap_connections(GlobalSetting.connection_reaper_age, GlobalSetting.connection_reaper_max_age)
rescue => e
- Discourse.handle_exception(e, {message: "Error reaping connections"})
+ Discourse.handle_exception(e, message: "Error reaping connections")
end
end
end
@@ -410,7 +409,7 @@ module Discourse
def self.reap_connections(idle, max_age)
pools = []
- ObjectSpace.each_object(ActiveRecord::ConnectionAdapters::ConnectionPool){|pool| pools << pool}
+ ObjectSpace.each_object(ActiveRecord::ConnectionAdapters::ConnectionPool) { |pool| pools << pool }
pools.each do |pool|
pool.drain(idle.seconds, max_age.seconds)
@@ -433,7 +432,7 @@ module Discourse
def self.reset_active_record_cache_if_needed(e)
last_cache_reset = Discourse.last_ar_cache_reset
- if e && e.message =~ /UndefinedColumn/ && (last_cache_reset.nil? || last_cache_reset < 30.seconds.ago)
+ if e && e.message =~ /UndefinedColumn/ && (last_cache_reset.nil? || last_cache_reset < 30.seconds.ago)
Rails.logger.warn "Clear Active Record cache cause schema appears to have changed!"
Discourse.last_ar_cache_reset = Time.zone.now
Discourse.reset_active_record_cache
@@ -448,5 +447,4 @@ module Discourse
nil
end
-
end
diff --git a/lib/discourse_cookie_store.rb b/lib/discourse_cookie_store.rb
index f962ba3a0c9..2dbd56792f0 100644
--- a/lib/discourse_cookie_store.rb
+++ b/lib/discourse_cookie_store.rb
@@ -1,6 +1,6 @@
class ActionDispatch::Session::DiscourseCookieStore < ActionDispatch::Session::CookieStore
- def initialize(app, options={})
- super(app,options)
+ def initialize(app, options = {})
+ super(app, options)
end
private
diff --git a/lib/discourse_hub.rb b/lib/discourse_hub.rb
index 174ca23fb8a..940800be17c 100644
--- a/lib/discourse_hub.rb
+++ b/lib/discourse_hub.rb
@@ -5,7 +5,7 @@ module DiscourseHub
STATS_FETCHED_AT_KEY = "stats_fetched_at"
def self.version_check_payload
- default_payload = { installed_version: Discourse::VERSION::STRING }.merge!(Discourse.git_branch == "unknown" ? {} : {branch: Discourse.git_branch})
+ default_payload = { installed_version: Discourse::VERSION::STRING }.merge!(Discourse.git_branch == "unknown" ? {} : { branch: Discourse.git_branch })
default_payload.merge!(get_payload)
end
@@ -23,23 +23,23 @@ module DiscourseHub
SiteSetting.share_anonymized_statistics && stats_fetched_at < 7.days.ago ? About.fetch_cached_stats.symbolize_keys : {}
end
- def self.get(rel_url, params={})
+ def self.get(rel_url, params = {})
singular_action :get, rel_url, params
end
- def self.post(rel_url, params={})
+ def self.post(rel_url, params = {})
collection_action :post, rel_url, params
end
- def self.put(rel_url, params={})
+ def self.put(rel_url, params = {})
collection_action :put, rel_url, params
end
- def self.delete(rel_url, params={})
+ def self.delete(rel_url, params = {})
singular_action :delete, rel_url, params
end
- def self.singular_action(action, rel_url, params={})
+ def self.singular_action(action, rel_url, params = {})
JSON.parse(Excon.send(action,
"#{hub_base_url}#{rel_url}",
headers: { 'Referer' => referer, 'Accept' => accepts.join(', ') },
@@ -48,7 +48,7 @@ module DiscourseHub
).body)
end
- def self.collection_action(action, rel_url, params={})
+ def self.collection_action(action, rel_url, params = {})
JSON.parse(Excon.send(action,
"#{hub_base_url}#{rel_url}",
body: JSON[params],
diff --git a/lib/discourse_plugin.rb b/lib/discourse_plugin.rb
index b39b676c024..a2f86705aec 100644
--- a/lib/discourse_plugin.rb
+++ b/lib/discourse_plugin.rb
@@ -27,10 +27,10 @@ class DiscoursePlugin
# Find the modules defined in the plugin with "Mixin" in their name.
def self.mixins
constants.map { |const_name| const_get(const_name) }
- .select { |const| const.class == Module && const.name["Mixin"] }
+ .select { |const| const.class == Module && const.name["Mixin"] }
end
- def register_js(file, opts={})
+ def register_js(file, opts = {})
@registry.register_js(file, opts)
end
@@ -38,7 +38,7 @@ class DiscoursePlugin
@registry.register_css(file)
end
- def register_archetype(name, options={})
+ def register_archetype(name, options = {})
@registry.register_archetype(name, options)
end
@@ -48,4 +48,3 @@ class DiscoursePlugin
end
end
-
diff --git a/lib/discourse_plugin_registry.rb b/lib/discourse_plugin_registry.rb
index 568c48932d0..9e404c16c52 100644
--- a/lib/discourse_plugin_registry.rb
+++ b/lib/discourse_plugin_registry.rb
@@ -70,7 +70,7 @@ class DiscoursePluginRegistry
end
- def register_js(filename, options={})
+ def register_js(filename, options = {})
# If we have a server side option, add that too.
self.class.javascripts << filename
end
@@ -79,15 +79,15 @@ class DiscoursePluginRegistry
self.class.stylesheets << filename
end
- def register_archetype(name, options={})
+ def register_archetype(name, options = {})
Archetype.register(name, options)
end
- def self.register_glob(root, extension, options=nil)
+ def self.register_glob(root, extension, options = nil)
self.asset_globs << [root, extension, options || {}]
end
- def self.each_globbed_asset(each_options=nil)
+ def self.each_globbed_asset(each_options = nil)
each_options ||= {}
self.asset_globs.each do |g|
@@ -108,7 +108,7 @@ class DiscoursePluginRegistry
JS_REGEX = /\.js$|\.js\.erb$|\.js\.es6$/
HANDLEBARS_REGEX = /\.hbs$|\.js\.handlebars$/
- def self.register_asset(asset, opts=nil)
+ def self.register_asset(asset, opts = nil)
if asset =~ JS_REGEX
if opts == :admin
self.admin_javascripts << asset
@@ -140,7 +140,7 @@ class DiscoursePluginRegistry
html_builders[name] = block
end
- def self.build_html(name, ctx=nil)
+ def self.build_html(name, ctx = nil)
html_builders[name]&.call(ctx)
end
diff --git a/lib/discourse_redis.rb b/lib/discourse_redis.rb
index 2277b751104..fccbb050e38 100644
--- a/lib/discourse_redis.rb
+++ b/lib/discourse_redis.rb
@@ -125,10 +125,10 @@ class DiscourseRedis
end
def self.slave_config(options = config)
- options.dup.merge!({ host: options[:slave_host], port: options[:slave_port] })
+ options.dup.merge!(host: options[:slave_host], port: options[:slave_port])
end
- def initialize(config=nil)
+ def initialize(config = nil)
@config = config || DiscourseRedis.config
@redis = DiscourseRedis.raw_connection(@config)
end
@@ -182,7 +182,7 @@ class DiscourseRedis
end
def mget(*args)
- args.map!{|a| "#{namespace}:#{a}"}
+ args.map! { |a| "#{namespace}:#{a}" }
DiscourseRedis.ignore_readonly { @redis.mget(*args) }
end
@@ -193,10 +193,10 @@ class DiscourseRedis
end
end
- def keys(pattern=nil)
+ def keys(pattern = nil)
DiscourseRedis.ignore_readonly do
len = namespace.length + 1
- @redis.keys("#{namespace}:#{pattern || '*'}").map{
+ @redis.keys("#{namespace}:#{pattern || '*'}").map {
|k| k[len..-1]
}
end
@@ -210,7 +210,7 @@ class DiscourseRedis
def flushdb
DiscourseRedis.ignore_readonly do
- keys.each{|k| del(k)}
+ keys.each { |k| del(k) }
end
end
diff --git a/lib/discourse_tagging.rb b/lib/discourse_tagging.rb
index 67e4d711712..0fcf8bda9b7 100644
--- a/lib/discourse_tagging.rb
+++ b/lib/discourse_tagging.rb
@@ -3,7 +3,6 @@ module DiscourseTagging
TAGS_FIELD_NAME = "tags"
TAGS_FILTER_REGEXP = /[\/\?#\[\]@!\$&'\(\)\*\+,;=\.%\\`^\s|\{\}"<>]+/ # /?#[]@!$&'()*+,;=.%\`^|{}"<>
-
def self.tag_topic_by_names(topic, guardian, tag_names_arg, append: false)
if SiteSetting.tagging_enabled
tag_names = DiscourseTagging.tags_for_saving(tag_names_arg, guardian) || []
@@ -33,11 +32,9 @@ module DiscourseTagging
# guardian is explicitly nil cause we don't want to strip all
# staff tags that already passed validation
- tags = filter_allowed_tags(Tag.where(name: tag_names), nil, {
- for_input: true,
- category: category,
- selected_tags: tag_names
- }).to_a
+ tags = filter_allowed_tags(Tag.where(name: tag_names), nil, for_input: true,
+ category: category,
+ selected_tags: tag_names).to_a
if tags.size < tag_names.size && (category.nil? || category.tags.count == 0)
tag_names.each do |name|
@@ -51,7 +48,7 @@ module DiscourseTagging
else
topic.tags = []
end
- topic.tags_changed=true
+ topic.tags_changed = true
end
true
end
@@ -61,7 +58,7 @@ module DiscourseTagging
# category: a Category to which the object being tagged belongs
# for_input: result is for an input field, so only show permitted tags
# selected_tags: an array of tag names that are in the current selection
- def self.filter_allowed_tags(query, guardian, opts={})
+ def self.filter_allowed_tags(query, guardian, opts = {})
term = opts[:term]
if term.present?
term.gsub!("_", "\\_")
@@ -124,9 +121,9 @@ module DiscourseTagging
else
# One tag per group restriction
exclude_group_ids = TagGroup.where(one_per_topic: true)
- .joins(:tag_group_memberships)
- .where('tag_group_memberships.tag_id in (?)', selected_tag_ids)
- .pluck(:id)
+ .joins(:tag_group_memberships)
+ .where('tag_group_memberships.tag_id in (?)', selected_tag_ids)
+ .pluck(:id)
if exclude_group_ids.empty?
sql = "tags.id NOT IN (#{select_sql} WHERE tg.parent_tag_id NOT IN (?))"
@@ -135,9 +132,9 @@ module DiscourseTagging
# It's possible that the selected tags violate some one-tag-per-group restrictions,
# so filter them out by picking one from each group.
limit_tag_ids = TagGroupMembership.select('distinct on (tag_group_id) tag_id')
- .where(tag_id: selected_tag_ids)
- .where(tag_group_id: exclude_group_ids)
- .map(&:tag_id)
+ .where(tag_id: selected_tag_ids)
+ .where(tag_group_id: exclude_group_ids)
+ .map(&:tag_id)
sql = "(tags.id NOT IN (#{select_sql} WHERE (tg.parent_tag_id NOT IN (?) OR tg.id in (?))) OR tags.id IN (?))"
query = query.where(sql, selected_tag_ids, exclude_group_ids, limit_tag_ids)
end
@@ -149,8 +146,8 @@ module DiscourseTagging
def self.clean_tag(tag)
tag.downcase.strip
- .gsub(/\s+/, '-').squeeze('-')
- .gsub(TAGS_FILTER_REGEXP, '')[0...SiteSetting.max_tag_length]
+ .gsub(/\s+/, '-').squeeze('-')
+ .gsub(TAGS_FILTER_REGEXP, '')[0...SiteSetting.max_tag_length]
end
def self.staff_only_tags(tags)
@@ -164,7 +161,7 @@ module DiscourseTagging
tag_diff.present? ? tag_diff : nil
end
- def self.tags_for_saving(tags_arg, guardian, opts={})
+ def self.tags_for_saving(tags_arg, guardian, opts = {})
return [] unless guardian.can_tag_topics? && tags_arg.present?
@@ -179,7 +176,7 @@ module DiscourseTagging
return opts[:unlimited] ? tag_names : tag_names[0...SiteSetting.max_tags_per_topic]
end
- def self.add_or_create_tags_by_name(taggable, tag_names_arg, opts={})
+ def self.add_or_create_tags_by_name(taggable, tag_names_arg, opts = {})
tag_names = DiscourseTagging.tags_for_saving(tag_names_arg, Guardian.new(Discourse.system_user), opts) || []
if taggable.tags.pluck(:name).sort != tag_names.sort
taggable.tags = Tag.where(name: tag_names).all
diff --git a/lib/discourse_updates.rb b/lib/discourse_updates.rb
index 3e2f14c6823..dd568063608 100644
--- a/lib/discourse_updates.rb
+++ b/lib/discourse_updates.rb
@@ -33,10 +33,10 @@ module DiscourseUpdates
# Handle cases when version check data is old so we report something that makes sense
- if (version_info.updated_at.nil? or # never performed a version check
- last_installed_version != Discourse::VERSION::STRING or # upgraded since the last version check
- (version_info.missing_versions_count == 0 and version_info.latest_version != version_info.installed_version) or # old data
- (version_info.missing_versions_count != 0 and version_info.latest_version == version_info.installed_version)) # old data
+ if (version_info.updated_at.nil? || # never performed a version check
+ last_installed_version != (Discourse::VERSION::STRING) || # upgraded since the last version check
+ (version_info.missing_versions_count == (0) && version_info.latest_version != (version_info.installed_version)) || # old data
+ (version_info.missing_versions_count != (0) && version_info.latest_version == (version_info.installed_version))) # old data
Jobs.enqueue(:version_check, all_sites: true)
version_info.version_check_pending = true
unless version_info.updated_at.nil?
@@ -92,7 +92,7 @@ module DiscourseUpdates
if versions.present?
# store the list in redis
version_keys = []
- versions[0,5].each do |v|
+ versions[0, 5].each do |v|
key = "#{missing_versions_key_prefix}:#{v['version']}"
$redis.mapped_hmset key, v
version_keys << key
@@ -108,7 +108,6 @@ module DiscourseUpdates
keys.present? ? keys.map { |k| $redis.hgetall(k) } : []
end
-
private
def last_installed_version_key
diff --git a/lib/distributed_cache.rb b/lib/distributed_cache.rb
index 31753320364..2b08e642169 100644
--- a/lib/distributed_cache.rb
+++ b/lib/distributed_cache.rb
@@ -17,7 +17,7 @@ class DistributedCache
end
def self.process_message(message)
- i = @subscribers.length-1
+ i = @subscribers.length - 1
payload = message.data
@@ -32,9 +32,9 @@ class DistributedCache
hash = current.hash(message.site_id)
case payload["op"]
- when "set" then hash[payload["key"]] = payload["marshalled"] ? Marshal.load(Base64.decode64(payload["value"])) : payload["value"]
- when "delete" then hash.delete(payload["key"])
- when "clear" then hash.clear
+ when "set" then hash[payload["key"]] = payload["marshalled"] ? Marshal.load(Base64.decode64(payload["value"])) : payload["value"]
+ when "delete" then hash.delete(payload["key"])
+ when "clear" then hash.clear
end
rescue WeakRef::RefError
@@ -66,22 +66,22 @@ class DistributedCache
message[:origin] = hash.identity
message[:hash_key] = hash.key
message[:discourse_version] = Discourse.git_version
- MessageBus.publish(channel_name, message, { user_ids: [-1] })
+ MessageBus.publish(channel_name, message, user_ids: [-1])
end
def self.set(hash, key, value)
# special support for set
marshal = (Set === value || Hash === value)
value = Base64.encode64(Marshal.dump(value)) if marshal
- publish(hash, { op: :set, key: key, value: value, marshalled: marshal })
+ publish(hash, op: :set, key: key, value: value, marshalled: marshal)
end
def self.delete(hash, key)
- publish(hash, { op: :delete, key: key })
+ publish(hash, op: :delete, key: key)
end
def self.clear(hash)
- publish(hash, { op: :clear })
+ publish(hash, op: :clear)
end
def self.register(hash)
@@ -103,7 +103,7 @@ class DistributedCache
(@seed_id ||= SecureRandom.hex) + "#{Process.pid}"
end
- def []=(k,v)
+ def []=(k, v)
k = k.to_s if Symbol === k
DistributedCache.set(self, k, v)
hash[k] = v
diff --git a/lib/distributed_memoizer.rb b/lib/distributed_memoizer.rb
index c5e7031d37e..e80b687923a 100644
--- a/lib/distributed_memoizer.rb
+++ b/lib/distributed_memoizer.rb
@@ -19,7 +19,7 @@ class DistributedMemoizer
begin
while Time.new < start + MAX_WAIT && !got_lock
LOCK.synchronize do
- got_lock = get_lock(redis,redis_lock_key)
+ got_lock = get_lock(redis, redis_lock_key)
end
sleep 0.001
end
@@ -38,7 +38,6 @@ class DistributedMemoizer
result
end
-
def self.redis_lock_key(key)
"memoize_lock_" << key
end
diff --git a/lib/distributed_mutex.rb b/lib/distributed_mutex.rb
index 6a0e0af8cd7..b014a554a32 100644
--- a/lib/distributed_mutex.rb
+++ b/lib/distributed_mutex.rb
@@ -1,11 +1,11 @@
# Cross-process locking using Redis.
class DistributedMutex
- def self.synchronize(key, redis=nil, &blk)
+ def self.synchronize(key, redis = nil, &blk)
self.new(key, redis).synchronize(&blk)
end
- def initialize(key, redis=nil)
+ def initialize(key, redis = nil)
@key = key
@redis = redis || $redis
@mutex = Mutex.new
diff --git a/lib/email/message_builder.rb b/lib/email/message_builder.rb
index 7632a244843..c72d7bca9ea 100644
--- a/lib/email/message_builder.rb
+++ b/lib/email/message_builder.rb
@@ -17,7 +17,7 @@ module Email
class MessageBuilder
attr_reader :template_args
- def initialize(to, opts=nil)
+ def initialize(to, opts = nil)
@to = to
@opts = opts || {}
@@ -166,7 +166,6 @@ module Email
result
end
-
protected
def reply_key
@@ -195,11 +194,13 @@ module Email
@reply_by_email_address = SiteSetting.reply_by_email_address.dup
@reply_by_email_address.gsub!("%{reply_key}", reply_key)
- @reply_by_email_address = if private_reply?
- alias_email(@reply_by_email_address)
- else
- site_alias_email(@reply_by_email_address)
- end
+
+ @reply_by_email_address =
+ if private_reply?
+ alias_email(@reply_by_email_address)
+ else
+ site_alias_email(@reply_by_email_address)
+ end
end
def alias_email(source)
diff --git a/lib/email/processor.rb b/lib/email/processor.rb
index a477f58e490..a13d3814dff 100644
--- a/lib/email/processor.rb
+++ b/lib/email/processor.rb
@@ -2,12 +2,12 @@ module Email
class Processor
- def initialize(mail, retry_on_rate_limit=true)
+ def initialize(mail, retry_on_rate_limit = true)
@mail = mail
@retry_on_rate_limit = retry_on_rate_limit
end
- def self.process!(mail, retry_on_rate_limit=true)
+ def self.process!(mail, retry_on_rate_limit = true)
Email::Processor.new(mail, retry_on_rate_limit).process!
end
@@ -35,23 +35,23 @@ module Email
def handle_failure(mail_string, e, incoming_email)
message_template = case e
- when Email::Receiver::EmptyEmailError then :email_reject_empty
- when Email::Receiver::NoBodyDetectedError then :email_reject_empty
- when Email::Receiver::UserNotFoundError then :email_reject_user_not_found
- when Email::Receiver::ScreenedEmailError then :email_reject_screened_email
- when Email::Receiver::AutoGeneratedEmailError then :email_reject_auto_generated
- when Email::Receiver::InactiveUserError then :email_reject_inactive_user
- when Email::Receiver::BlockedUserError then :email_reject_blocked_user
- when Email::Receiver::BadDestinationAddress then :email_reject_bad_destination_address
- when Email::Receiver::StrangersNotAllowedError then :email_reject_strangers_not_allowed
- when Email::Receiver::InsufficientTrustLevelError then :email_reject_insufficient_trust_level
- when Email::Receiver::ReplyUserNotMatchingError then :email_reject_reply_user_not_matching
- when Email::Receiver::TopicNotFoundError then :email_reject_topic_not_found
- when Email::Receiver::TopicClosedError then :email_reject_topic_closed
- when Email::Receiver::InvalidPost then :email_reject_invalid_post
- when ActiveRecord::Rollback then :email_reject_invalid_post
- when Email::Receiver::InvalidPostAction then :email_reject_invalid_post_action
- when Discourse::InvalidAccess then :email_reject_invalid_access
+ when Email::Receiver::EmptyEmailError then :email_reject_empty
+ when Email::Receiver::NoBodyDetectedError then :email_reject_empty
+ when Email::Receiver::UserNotFoundError then :email_reject_user_not_found
+ when Email::Receiver::ScreenedEmailError then :email_reject_screened_email
+ when Email::Receiver::AutoGeneratedEmailError then :email_reject_auto_generated
+ when Email::Receiver::InactiveUserError then :email_reject_inactive_user
+ when Email::Receiver::BlockedUserError then :email_reject_blocked_user
+ when Email::Receiver::BadDestinationAddress then :email_reject_bad_destination_address
+ when Email::Receiver::StrangersNotAllowedError then :email_reject_strangers_not_allowed
+ when Email::Receiver::InsufficientTrustLevelError then :email_reject_insufficient_trust_level
+ when Email::Receiver::ReplyUserNotMatchingError then :email_reject_reply_user_not_matching
+ when Email::Receiver::TopicNotFoundError then :email_reject_topic_not_found
+ when Email::Receiver::TopicClosedError then :email_reject_topic_closed
+ when Email::Receiver::InvalidPost then :email_reject_invalid_post
+ when ActiveRecord::Rollback then :email_reject_invalid_post
+ when Email::Receiver::InvalidPostAction then :email_reject_invalid_post_action
+ when Discourse::InvalidAccess then :email_reject_invalid_access
else :email_reject_unrecognized_error
end
diff --git a/lib/email/receiver.rb b/lib/email/receiver.rb
index 6bb65bbded9..94a8dd77b38 100644
--- a/lib/email/receiver.rb
+++ b/lib/email/receiver.rb
@@ -166,7 +166,7 @@ module Email
elsif bounce_score >= SiteSetting.bounce_score_threshold
# NOTE: we check bounce_score before sending emails, nothing to do
# here other than log it happened.
- reason = I18n.t("user.email.revoked", { email: user.email, date: user.user_stat.reset_bounce_score_after })
+ reason = I18n.t("user.email.revoked", email: user.email, date: user.user_stat.reset_bounce_score_after)
StaffActionLogger.new(Discourse.system_user).log_revoke_email(user, reason)
end
end
@@ -466,7 +466,7 @@ module Email
true
end
- def self.reply_by_email_address_regex(extract_reply_key=true)
+ def self.reply_by_email_address_regex(extract_reply_key = true)
reply_addresses = [SiteSetting.reply_by_email_address]
reply_addresses << (SiteSetting.alternative_reply_by_email_addresses.presence || "").split("|")
@@ -538,11 +538,11 @@ module Email
PostActionType.types[:like] if likes.include?(body.strip.downcase)
end
- def create_topic(options={})
+ def create_topic(options = {})
create_post_with_attachments(options)
end
- def create_reply(options={})
+ def create_reply(options = {})
raise TopicNotFoundError if options[:topic].nil? || options[:topic].trashed?
if post_action_type = post_action_for(options[:raw])
@@ -572,7 +572,7 @@ module Email
end
end
- def create_post_with_attachments(options={})
+ def create_post_with_attachments(options = {})
# deal with attachments
attachments.each do |attachment|
tmp = Tempfile.new(["discourse-email-attachment", File.extname(attachment.filename)])
@@ -612,7 +612,7 @@ module Email
end
end
- def create_post(options={})
+ def create_post(options = {})
options[:via_email] = true
options[:raw_email] = @raw_email
@@ -622,7 +622,7 @@ module Email
raise InvalidPost, "No post creation date found. Is the e-mail missing a Date: header?"
end
- options[:created_at] = DateTime.now if options[:created_at] > DateTime.now
+ options[:created_at] = DateTime.now if options[:created_at] > DateTime.now
is_private_message = options[:archetype] == Archetype.private_message ||
options[:topic].try(:private_message?)
diff --git a/lib/email/renderer.rb b/lib/email/renderer.rb
index 9b209781ff9..be802b7a991 100644
--- a/lib/email/renderer.rb
+++ b/lib/email/renderer.rb
@@ -3,7 +3,7 @@ require_dependency 'email/styles'
module Email
class Renderer
- def initialize(message, opts=nil)
+ def initialize(message, opts = nil)
@message = message
@opts = opts || {}
end
diff --git a/lib/email/sender.rb b/lib/email/sender.rb
index 61c5fc16854..08e141a923e 100644
--- a/lib/email/sender.rb
+++ b/lib/email/sender.rb
@@ -15,7 +15,7 @@ SMTP_CLIENT_ERRORS = [Net::SMTPFatalError, Net::SMTPSyntaxError]
module Email
class Sender
- def initialize(message, email_type, user=nil)
+ def initialize(message, email_type, user = nil)
@message = message
@email_type = email_type
@user = user
@@ -55,8 +55,8 @@ module Email
# These are the links we add when a user uploads a file or image.
# Ideally we would parse general markdown into plain text, but that is almost an intractable problem.
url_prefix = Discourse.base_url
- @message.parts[0].body = @message.parts[0].body.to_s.gsub(/([^<]*)<\/a>/, '[\2]('+url_prefix+'\1)')
- @message.parts[0].body = @message.parts[0].body.to_s.gsub(/]*)>/, '![]('+url_prefix+'\1)')
+ @message.parts[0].body = @message.parts[0].body.to_s.gsub(/([^<]*)<\/a>/, '[\2](' + url_prefix + '\1)')
+ @message.parts[0].body = @message.parts[0].body.to_s.gsub(/]*)>/, '![](' + url_prefix + '\1)')
@message.text_part.content_type = 'text/plain; charset=UTF-8'
@@ -88,8 +88,8 @@ module Email
""
referenced_posts = Post.includes(:incoming_email)
- .where(id: PostReply.where(reply_id: post_id).select(:post_id))
- .order(id: :desc)
+ .where(id: PostReply.where(reply_id: post_id).select(:post_id))
+ .order(id: :desc)
referenced_post_message_ids = referenced_posts.map do |post|
if post.incoming_email&.message_id.present?
@@ -165,9 +165,9 @@ module Email
when /\.mailjet\.com/
@message.header['X-MJ-CustomID'] = @message.message_id
when "smtp.mandrillapp.com"
- merge_json_x_header('X-MC-Metadata', { message_id: @message.message_id })
+ merge_json_x_header('X-MC-Metadata', message_id: @message.message_id)
when "smtp.sparkpostmail.com"
- merge_json_x_header('X-MSYS-API', { metadata: { message_id: @message.message_id } })
+ merge_json_x_header('X-MSYS-API', metadata: { message_id: @message.message_id })
end
# Suppress images from short emails
diff --git a/lib/email/styles.rb b/lib/email/styles.rb
index 4b51a023315..09a72731368 100644
--- a/lib/email/styles.rb
+++ b/lib/email/styles.rb
@@ -10,7 +10,7 @@ module Email
delegate :css, to: :fragment
- def initialize(html, opts=nil)
+ def initialize(html, opts = nil)
@html = html
@opts = opts || {}
@fragment = Nokogiri::HTML.fragment(@html)
@@ -41,7 +41,7 @@ module Email
img['width'] = img['height'] = 20
else
# use dimensions of original iPhone screen for 'too big, let device rescale'
- if img['width'].to_i > 320 or img['height'].to_i > 480
+ if img['width'].to_i > (320) || img['height'].to_i > (480)
img['width'] = img['height'] = 'auto'
end
end
@@ -246,7 +246,7 @@ module Email
linknum = 0
element.css('a').each do |inner|
# we want the first footer link to be specially highlighted as IMPORTANT
- if footernum == 0 and linknum == 0
+ if footernum == (0) && linknum == (0)
inner['style'] = "background-color: #006699; color:#ffffff; border-top: 4px solid #006699; border-right: 6px solid #006699; border-bottom: 4px solid #006699; border-left: 6px solid #006699; display: inline-block;"
else
inner['style'] = "color:#666;"
@@ -271,7 +271,7 @@ module Email
def style(selector, style, attribs = {})
@fragment.css(selector).each do |element|
add_styles(element, style) if style
- attribs.each do |k,v|
+ attribs.each do |k, v|
element[k] = v
end
end
diff --git a/lib/email_updater.rb b/lib/email_updater.rb
index d7acb357813..12a28781947 100644
--- a/lib/email_updater.rb
+++ b/lib/email_updater.rb
@@ -7,12 +7,12 @@ class EmailUpdater
attr_reader :user
- def initialize(guardian=nil, user=nil)
+ def initialize(guardian = nil, user = nil)
@guardian = guardian
@user = user
end
- def self.human_attribute_name(name, options={})
+ def self.human_attribute_name(name, options = {})
User.human_attribute_name(name, options)
end
@@ -68,8 +68,8 @@ class EmailUpdater
@user = token.user
change_req = user.email_change_requests
- .where('old_email_token_id = :token_id OR new_email_token_id = :token_id', { token_id: token.id})
- .first
+ .where('old_email_token_id = :token_id OR new_email_token_id = :token_id', token_id: token.id)
+ .first
# Simple state machine
case change_req.try(:change_state)
diff --git a/lib/es6_module_transpiler/tilt/es6_module_transpiler_template.rb b/lib/es6_module_transpiler/tilt/es6_module_transpiler_template.rb
index e64ce08380b..545f7522803 100644
--- a/lib/es6_module_transpiler/tilt/es6_module_transpiler_template.rb
+++ b/lib/es6_module_transpiler/tilt/es6_module_transpiler_template.rb
@@ -14,7 +14,7 @@ module Tilt
source = input[:data]
context = input[:environment].context_class.new(input)
- result = new(filename){source}.render(context)
+ result = new(filename) { source }.render(context)
context.metadata.merge(data: result)
end
@@ -28,8 +28,8 @@ module Tilt
ctx = MiniRacer::Context.new(timeout: 15000)
ctx.eval("var self = this; #{File.read("#{Rails.root}/vendor/assets/javascripts/babel.js")}")
ctx.eval("module = {}; exports = {};");
- ctx.attach("rails.logger.info", proc{|err| Rails.logger.info(err.to_s)})
- ctx.attach("rails.logger.error", proc{|err| Rails.logger.error(err.to_s)})
+ ctx.attach("rails.logger.info", proc { |err| Rails.logger.info(err.to_s) })
+ ctx.attach("rails.logger.error", proc { |err| Rails.logger.error(err.to_s) })
ctx.eval <]*class\s*=\s*['|"]excerpt['|"][^>]*>/
- def initialize(length, options=nil)
+ def initialize(length, options = nil)
@length = length
@excerpt = ""
@current_length = 0
@@ -45,13 +45,13 @@ class ExcerptParser < Nokogiri::XML::SAX::Document
end
def include_tag(name, attributes)
- characters("<#{name} #{attributes.map{|k,v| "#{k}=\"#{escape_attribute(v)}\""}.join(' ')}>", false, false, false)
+ characters("<#{name} #{attributes.map { |k, v| "#{k}=\"#{escape_attribute(v)}\"" }.join(' ')}>", false, false, false)
end
- def start_element(name, attributes=[])
+ def start_element(name, attributes = [])
case name
- when "img"
- attributes = Hash[*attributes.flatten]
+ when "img"
+ attributes = Hash[*attributes.flatten]
if attributes["class"] == 'emoji'
if @remap_emoji
@@ -78,28 +78,28 @@ class ExcerptParser < Nokogiri::XML::SAX::Document
characters("(#{attributes['src']})") if @markdown_images
- when "a"
- unless @strip_links
- include_tag(name, attributes)
- @in_a = true
- end
+ when "a"
+ unless @strip_links
+ include_tag(name, attributes)
+ @in_a = true
+ end
- when "aside"
- attributes = Hash[*attributes.flatten]
+ when "aside"
+ attributes = Hash[*attributes.flatten]
unless @keep_onebox_source && attributes['class'].include?('onebox')
@in_quote = true
end
- when 'article'
- if @keep_onebox_source && attributes.include?(['class', 'onebox-body'])
- @in_quote = true
- end
- when "div", "span"
- if attributes.include?(["class", "excerpt"])
- @excerpt = ""
- @current_length = 0
- @start_excerpt = true
- end
+ when 'article'
+ if @keep_onebox_source && attributes.include?(['class', 'onebox-body'])
+ @in_quote = true
+ end
+ when "div", "span"
+ if attributes.include?(["class", "excerpt"])
+ @excerpt = ""
+ @current_length = 0
+ @start_excerpt = true
+ end
# Preserve spoilers
if attributes.include?(["class", "spoiler"])
include_tag("span", attributes)
@@ -112,7 +112,7 @@ class ExcerptParser < Nokogiri::XML::SAX::Document
case name
when "a"
unless @strip_links
- characters("",false, false, false)
+ characters("", false, false, false)
@in_a = false
end
when "p", "br"
@@ -132,7 +132,7 @@ class ExcerptParser < Nokogiri::XML::SAX::Document
def characters(string, truncate = true, count_it = true, encode = true)
return if @in_quote
- encode = encode ? lambda{|s| ERB::Util.html_escape(s)} : lambda {|s| s}
+ encode = encode ? lambda { |s| ERB::Util.html_escape(s) } : lambda { |s| s }
if count_it && @current_length + string.length > @length
length = [0, @length - @current_length - 1].max
@excerpt << encode.call(string[0..length]) if truncate
diff --git a/lib/file_store/s3_store.rb b/lib/file_store/s3_store.rb
index 265c7d53a83..98f1c13f087 100644
--- a/lib/file_store/s3_store.rb
+++ b/lib/file_store/s3_store.rb
@@ -9,7 +9,7 @@ module FileStore
class S3Store < BaseStore
TOMBSTONE_PREFIX ||= "tombstone/"
- def initialize(s3_helper=nil)
+ def initialize(s3_helper = nil)
@s3_helper = s3_helper || S3Helper.new(s3_bucket, TOMBSTONE_PREFIX)
end
@@ -27,7 +27,7 @@ module FileStore
# - filename
# - content_type
# - cache_locally
- def store_file(file, path, opts={})
+ def store_file(file, path, opts = {})
filename = opts[:filename].presence || File.basename(path)
# cache file locally when needed
cache_file(file, File.basename(path)) if opts[:cache_locally]
diff --git a/lib/filter_best_posts.rb b/lib/filter_best_posts.rb
index 88f97d4d1a0..e01e79e0e0d 100644
--- a/lib/filter_best_posts.rb
+++ b/lib/filter_best_posts.rb
@@ -2,26 +2,27 @@ class FilterBestPosts
attr_accessor :filtered_posts, :posts
- def initialize(topic, filtered_posts, limit, options={})
+ def initialize(topic, filtered_posts, limit, options = {})
@filtered_posts = filtered_posts
@topic = topic
@limit = limit
options.each do |key, value|
- self.instance_variable_set("@#{key}".to_sym, value)
+ self.instance_variable_set("@#{key}".to_sym, value)
end
filter
end
def filter
- @posts = if @min_replies && @topic.posts_count < @min_replies + 1
- []
- else
- filter_posts_liked_by_moderators
- setup_posts
- filter_posts_based_on_trust_level
- filter_posts_based_on_score
- sort_posts
- end
+ @posts =
+ if @min_replies && @topic.posts_count < @min_replies + 1
+ []
+ else
+ filter_posts_liked_by_moderators
+ setup_posts
+ filter_posts_based_on_trust_level
+ filter_posts_based_on_score
+ sort_posts
+ end
end
private
@@ -39,24 +40,26 @@ class FilterBestPosts
end
def filter_posts_based_on_trust_level
- return unless @min_trust_level.try('>',0)
- @posts = if @bypass_trust_level_score.try('>',0)
- @posts.where('COALESCE(users.trust_level,0) >= ? OR posts.score >= ?',
- @min_trust_level,
- @bypass_trust_level_score)
- else
- @posts.where('COALESCE(users.trust_level,0) >= ?', @min_trust_level)
- end
+ return unless @min_trust_level.try('>', 0)
+
+ @posts =
+ if @bypass_trust_level_score.try('>', 0)
+ @posts.where('COALESCE(users.trust_level,0) >= ? OR posts.score >= ?',
+ @min_trust_level,
+ @bypass_trust_level_score
+ )
+ else
+ @posts.where('COALESCE(users.trust_level,0) >= ?', @min_trust_level)
+ end
end
def filter_posts_based_on_score
- return unless @min_score.try('>',0)
+ return unless @min_score.try('>', 0)
@posts = @posts.where('posts.score >= ?', @min_score)
end
def sort_posts
- @posts.to_a.sort!{|a,b| a.post_number <=> b.post_number}
+ @posts.to_a.sort! { |a, b| a.post_number <=> b.post_number }
end
end
-
diff --git a/lib/final_destination.rb b/lib/final_destination.rb
index b0aff9605bf..442f5b79a56 100644
--- a/lib/final_destination.rb
+++ b/lib/final_destination.rb
@@ -9,7 +9,7 @@ class FinalDestination
attr_reader :status
attr_reader :cookie
- def initialize(url, opts=nil)
+ def initialize(url, opts = nil)
@uri =
begin
URI(URI.escape(url)) if url
@@ -161,7 +161,7 @@ class FinalDestination
address = IPAddr.new(address_s)
- if private_ranges.any? {|r| r === address }
+ if private_ranges.any? { |r| r === address }
@status = :invalid_address
return false
end
@@ -178,7 +178,7 @@ class FinalDestination
def private_ranges
FinalDestination.standard_private_ranges +
- SiteSetting.blacklist_ip_blocks.split('|').map {|r| IPAddr.new(r) rescue nil }.compact
+ SiteSetting.blacklist_ip_blocks.split('|').map { |r| IPAddr.new(r) rescue nil }.compact
end
def self.standard_private_ranges
diff --git a/lib/flag_query.rb b/lib/flag_query.rb
index 11b21c8966f..53616e042f0 100644
--- a/lib/flag_query.rb
+++ b/lib/flag_query.rb
@@ -1,6 +1,6 @@
module FlagQuery
- def self.flagged_posts_report(current_user, filter, offset=0, per_page=25)
+ def self.flagged_posts_report(current_user, filter, offset = 0, per_page = 25)
actions = flagged_post_actions(filter)
guardian = Guardian.new(current_user)
@@ -12,11 +12,11 @@ module FlagQuery
end
post_ids = actions.limit(per_page)
- .offset(offset)
- .group(:post_id)
- .order('MIN(post_actions.created_at) DESC')
- .pluck(:post_id)
- .uniq
+ .offset(offset)
+ .group(:post_id)
+ .order('MIN(post_actions.created_at) DESC')
+ .pluck(:post_id)
+ .uniq
return nil if post_ids.blank?
@@ -47,8 +47,8 @@ module FlagQuery
end
post_actions = actions.order('post_actions.created_at DESC')
- .includes(related_post: { topic: { ordered_posts: :user }})
- .where(post_id: post_ids)
+ .includes(related_post: { topic: { ordered_posts: :user } })
+ .where(post_id: post_ids)
post_actions.each do |pa|
post = post_lookup[pa.post_id]
@@ -111,10 +111,10 @@ module FlagQuery
def self.flagged_post_actions(filter)
post_actions = PostAction.flags
- .joins("INNER JOIN posts ON posts.id = post_actions.post_id")
- .joins("INNER JOIN topics ON topics.id = posts.topic_id")
- .joins("LEFT JOIN users ON users.id = posts.user_id")
- .where("posts.user_id > 0")
+ .joins("INNER JOIN posts ON posts.id = post_actions.post_id")
+ .joins("INNER JOIN topics ON topics.id = posts.topic_id")
+ .joins("LEFT JOIN users ON users.id = posts.user_id")
+ .where("posts.user_id > 0")
if filter == "old"
post_actions.where("post_actions.disagreed_at IS NOT NULL OR
@@ -122,8 +122,8 @@ module FlagQuery
post_actions.agreed_at IS NOT NULL")
else
post_actions.active
- .where("posts.deleted_at" => nil)
- .where("topics.deleted_at" => nil)
+ .where("posts.deleted_at" => nil)
+ .where("topics.deleted_at" => nil)
end
end
diff --git a/lib/freedom_patches/active_record_base.rb b/lib/freedom_patches/active_record_base.rb
index 4f62d40647a..bd4eb2c1e82 100644
--- a/lib/freedom_patches/active_record_base.rb
+++ b/lib/freedom_patches/active_record_base.rb
@@ -19,13 +19,12 @@ class ActiveRecord::Base
ActiveRecord::Base.exec_sql(*args)
end
-
# Executes the given block +retries+ times (or forever, if explicitly given nil),
# catching and retrying SQL Deadlock errors.
#
# Thanks to: http://stackoverflow.com/a/7427186/165668
#
- def self.retry_lock_error(retries=5, &block)
+ def self.retry_lock_error(retries = 5, &block)
begin
yield
rescue ActiveRecord::StatementInvalid => e
diff --git a/lib/freedom_patches/ams_include_without_root.rb b/lib/freedom_patches/ams_include_without_root.rb
index 424489b3f5c..67c4cf185b6 100644
--- a/lib/freedom_patches/ams_include_without_root.rb
+++ b/lib/freedom_patches/ams_include_without_root.rb
@@ -8,7 +8,7 @@ module ActiveModel
# This method is copied over verbatim from the AMS version, except for silently
# ignoring associations that cannot be embedded without a root instead of
# raising an exception.
- def include!(name, options={})
+ def include!(name, options = {})
unique_values =
if hash = options[:hash]
if @options[:hash] == hash
diff --git a/lib/freedom_patches/better_handlebars_errors.rb b/lib/freedom_patches/better_handlebars_errors.rb
index 3cab31cc944..940afe71a20 100644
--- a/lib/freedom_patches/better_handlebars_errors.rb
+++ b/lib/freedom_patches/better_handlebars_errors.rb
@@ -13,4 +13,3 @@ module Ember
end
end
end
-
diff --git a/lib/freedom_patches/fast_pluck.rb b/lib/freedom_patches/fast_pluck.rb
index ac1203c66d0..9eacba972ff 100644
--- a/lib/freedom_patches/fast_pluck.rb
+++ b/lib/freedom_patches/fast_pluck.rb
@@ -64,7 +64,7 @@ class ActiveRecord::Relation
columns_hash.key?(cn) ? arel_table[cn] : cn
}
- conn.select_raw(relation, nil, relation.arel.bind_values + bind_values) do |result,_|
+ conn.select_raw(relation, nil, relation.arel.bind_values + bind_values) do |result, _|
result.type_map = SqlBuilder.pg_type_map
result.nfields == 1 ? result.column_values(0) : result.values
end
diff --git a/lib/freedom_patches/inflector_backport.rb b/lib/freedom_patches/inflector_backport.rb
index 299ee1107c7..1e192b0033e 100644
--- a/lib/freedom_patches/inflector_backport.rb
+++ b/lib/freedom_patches/inflector_backport.rb
@@ -23,7 +23,7 @@ module ActiveSupport
define_method(method_name) do |*args|
# this avoids recursive locks
found = true
- data = cache.fetch(args){found = false}
+ data = cache.fetch(args) { found = false }
unless found
cache[args] = data = send(uncached, *args)
end
@@ -56,8 +56,3 @@ module ActiveSupport
end
end
end
-
-
-
-
-
diff --git a/lib/freedom_patches/pool_drainer.rb b/lib/freedom_patches/pool_drainer.rb
index 6ded19de97d..bf1eb1e89c0 100644
--- a/lib/freedom_patches/pool_drainer.rb
+++ b/lib/freedom_patches/pool_drainer.rb
@@ -27,7 +27,7 @@ end
class ActiveRecord::ConnectionAdapters::ConnectionPool
# drain all idle connections
# if idle_time is specified only connections idle for N seconds will be drained
- def drain(idle_time=nil, max_age=nil)
+ def drain(idle_time = nil, max_age = nil)
synchronize do
@available.clear
@connections.delete_if do |conn|
diff --git a/lib/freedom_patches/rack_patches.rb b/lib/freedom_patches/rack_patches.rb
index e02aca52cf5..890435d9b9c 100644
--- a/lib/freedom_patches/rack_patches.rb
+++ b/lib/freedom_patches/rack_patches.rb
@@ -4,7 +4,7 @@ class Rack::ETag
private
def digest_body(body)
- parts = []
+ parts = []
has_body = false
body.each do |part|
@@ -28,15 +28,15 @@ end
class Rack::ConditionalGet
private
def to_rfc2822(since)
- # shortest possible valid date is the obsolete: 1 Nov 97 09:55 A
- # anything shorter is invalid, this avoids exceptions for common cases
- # most common being the empty string
- if since && since.length >= 16
- # NOTE: there is no trivial way to write this in a non execption way
- # _rfc2822 returns a hash but is not that usable
- Time.rfc2822(since) rescue nil
- else
- nil
- end
+ # shortest possible valid date is the obsolete: 1 Nov 97 09:55 A
+ # anything shorter is invalid, this avoids exceptions for common cases
+ # most common being the empty string
+ if since && since.length >= 16
+ # NOTE: there is no trivial way to write this in a non execption way
+ # _rfc2822 returns a hash but is not that usable
+ Time.rfc2822(since) rescue nil
+ else
+ nil
+ end
end
end
diff --git a/lib/freedom_patches/rails4.rb b/lib/freedom_patches/rails4.rb
index 82b4ed9fb9f..5052dd86542 100644
--- a/lib/freedom_patches/rails4.rb
+++ b/lib/freedom_patches/rails4.rb
@@ -1,4 +1,4 @@
-# Sam: This has now forked of rails. Trouble is we would never like to use "about 1 month" ever, we only want months for 2 or more months.
+# Sam: This has now forked of rails. Trouble is we would never like to use "about 1 month" ever, we only want months for 2 or more months.
#
# Backporting a fix to rails itself may get too complex
module FreedomPatches
@@ -6,7 +6,7 @@ module FreedomPatches
def self.distance_of_time_in_words(from_time, to_time = 0, include_seconds = false, options = {})
options = {
- :scope => :'datetime.distance_in_words',
+ scope: :'datetime.distance_in_words',
}.merge!(options)
from_time = from_time.to_time if from_time.respond_to?(:to_time)
@@ -15,36 +15,36 @@ module FreedomPatches
distance_in_minutes = (distance / 60.0).round
distance_in_seconds = distance.round
- I18n.with_options :locale => options[:locale], :scope => options[:scope] do |locale|
+ I18n.with_options locale: options[:locale], scope: options[:scope] do |locale|
case distance_in_minutes
- when 0..1
- return distance_in_minutes == 0 ?
- locale.t(:less_than_x_minutes, :count => 1) :
- locale.t(:x_minutes, :count => distance_in_minutes) unless include_seconds
+ when 0..1
+ return distance_in_minutes == 0 ?
+ locale.t(:less_than_x_minutes, count: 1) :
+ locale.t(:x_minutes, count: distance_in_minutes) unless include_seconds
case distance_in_seconds
- when 0..4 then locale.t :less_than_x_seconds, :count => 5
- when 5..9 then locale.t :less_than_x_seconds, :count => 10
- when 10..19 then locale.t :less_than_x_seconds, :count => 20
- when 20..39 then locale.t :half_a_minute
- when 40..59 then locale.t :less_than_x_minutes, :count => 1
- else locale.t :x_minutes, :count => 1
+ when 0..4 then locale.t :less_than_x_seconds, count: 5
+ when 5..9 then locale.t :less_than_x_seconds, count: 10
+ when 10..19 then locale.t :less_than_x_seconds, count: 20
+ when 20..39 then locale.t :half_a_minute
+ when 40..59 then locale.t :less_than_x_minutes, count: 1
+ else locale.t :x_minutes, count: 1
end
- when 2..44 then locale.t :x_minutes, :count => distance_in_minutes
- when 45..89 then locale.t :about_x_hours, :count => 1
- when 90..1439 then locale.t :about_x_hours, :count => (distance_in_minutes.to_f / 60.0).round
- when 1440..2519 then locale.t :x_days, :count => 1
-
+ when 2..44 then locale.t :x_minutes, count: distance_in_minutes
+ when 45..89 then locale.t :about_x_hours, count: 1
+ when 90..1439 then locale.t :about_x_hours, count: (distance_in_minutes.to_f / 60.0).round
+ when 1440..2519 then locale.t :x_days, count: 1
+
# this is were we diverge from Rails
- when 2520..129599 then locale.t :x_days, :count => (distance_in_minutes.to_f / 1440.0).round
- when 129600..525599 then locale.t :x_months, :count => (distance_in_minutes.to_f / 43200.0).round
+ when 2520..129599 then locale.t :x_days, count: (distance_in_minutes.to_f / 1440.0).round
+ when 129600..525599 then locale.t :x_months, count: (distance_in_minutes.to_f / 43200.0).round
else
- fyear = from_time.year
+ fyear = from_time.year
fyear += 1 if from_time.month >= 3
tyear = to_time.year
tyear -= 1 if to_time.month < 3
- leap_years = (fyear > tyear) ? 0 : (fyear..tyear).count{|x| Date.leap?(x)}
+ leap_years = (fyear > tyear) ? 0 : (fyear..tyear).count { |x| Date.leap?(x) }
minute_offset_for_leap_year = leap_years * 1440
# Discount the leap year days when calculating year distance.
# e.g. if there are 20 leap year days between 2 dates having the same day
@@ -55,11 +55,11 @@ module FreedomPatches
remainder = (minutes_with_offset % 525600)
distance_in_years = (minutes_with_offset / 525600)
if remainder < 131400
- locale.t(:about_x_years, :count => distance_in_years)
+ locale.t(:about_x_years, count: distance_in_years)
elsif remainder < 394200
- locale.t(:over_x_years, :count => distance_in_years)
+ locale.t(:over_x_years, count: distance_in_years)
else
- locale.t(:almost_x_years, :count => distance_in_years + 1)
+ locale.t(:almost_x_years, count: distance_in_years + 1)
end
end
end
diff --git a/lib/freedom_patches/raw_handlebars.rb b/lib/freedom_patches/raw_handlebars.rb
index a3bd47c8a7f..3d3a8a84f2d 100644
--- a/lib/freedom_patches/raw_handlebars.rb
+++ b/lib/freedom_patches/raw_handlebars.rb
@@ -54,11 +54,11 @@ end
class Ember::Handlebars::Template
include Discourse::Ember::Handlebars::Helper
- def precompile_handlebars(string, input=nil)
+ def precompile_handlebars(string, input = nil)
"requirejs('discourse-common/lib/raw-handlebars').template(#{Barber::Precompiler.compile(string)});"
end
- def compile_handlebars(string, input=nil)
+ def compile_handlebars(string, input = nil)
"requirejs('discourse-common/lib/raw-handlebars').compile(#{indent(string).inspect});"
end
diff --git a/lib/freedom_patches/safe_buffer.rb b/lib/freedom_patches/safe_buffer.rb
index b39a96ebaae..8c8a294bfd0 100644
--- a/lib/freedom_patches/safe_buffer.rb
+++ b/lib/freedom_patches/safe_buffer.rb
@@ -4,7 +4,7 @@
# The alternative is a broken website when this happens
class ActiveSupport::SafeBuffer
- def concat(value, raise_encoding_err=false)
+ def concat(value, raise_encoding_err = false)
if !html_safe? || value.html_safe?
super(value)
else
@@ -22,8 +22,8 @@ class ActiveSupport::SafeBuffer
self.force_encoding("UTF-8")
unless valid_encoding?
- encode!("utf-16","utf-8",:invalid => :replace)
- encode!("utf-8","utf-16")
+ encode!("utf-16", "utf-8", invalid: :replace)
+ encode!("utf-8", "utf-16")
end
Rails.logger.warn("Encountered a non UTF-8 string in SafeBuffer - #{self} - #{encoding_diags}")
end
@@ -36,7 +36,7 @@ class ActiveSupport::SafeBuffer
Rails.logger.warn("Attempted to concat a non UTF-8 string in SafeBuffer - #{value} - #{encoding_diags}")
end
- concat(value,_raise=true)
+ concat(value, _raise = true)
end
end
diff --git a/lib/freedom_patches/schema_migration_details.rb b/lib/freedom_patches/schema_migration_details.rb
index bbae956c11a..2c2722fdc77 100644
--- a/lib/freedom_patches/schema_migration_details.rb
+++ b/lib/freedom_patches/schema_migration_details.rb
@@ -4,7 +4,7 @@ module FreedomPatches
rval = nil
time = Benchmark.measure do
- rval=super
+ rval = super
end
sql = < :replace)
- str.encode!("utf-8","utf-16")
+ str.encode!("utf-16", "utf-8", invalid: :replace)
+ str.encode!("utf-8", "utf-16")
end
str
diff --git a/lib/freedom_patches/sprockets_patches.rb b/lib/freedom_patches/sprockets_patches.rb
index ca83e2aabbe..7cbf529aff2 100644
--- a/lib/freedom_patches/sprockets_patches.rb
+++ b/lib/freedom_patches/sprockets_patches.rb
@@ -21,9 +21,9 @@ if Rails.env == "development"
end
if source[0] != ?/
- # CODE REMOVED
- # source = compute_asset_path(source, options)
- source = "/assets/#{source}"
+ # CODE REMOVED
+ # source = compute_asset_path(source, options)
+ source = "/assets/#{source}"
end
relative_url_root = defined?(config.relative_url_root) && config.relative_url_root
diff --git a/lib/freedom_patches/translate_accelerator.rb b/lib/freedom_patches/translate_accelerator.rb
index ae6c1d48f55..92f0b80b311 100644
--- a/lib/freedom_patches/translate_accelerator.rb
+++ b/lib/freedom_patches/translate_accelerator.rb
@@ -49,10 +49,10 @@ module I18n
end
def ensure_all_loaded!
- backend.fallbacks(locale).each {|l| ensure_loaded!(l) }
+ backend.fallbacks(locale).each { |l| ensure_loaded!(l) }
end
- def search(query, opts=nil)
+ def search(query, opts = nil)
locale = opts[:locale] || config.locale
load_locale(locale) unless @loaded_locales.include?(locale)
@@ -167,7 +167,7 @@ module I18n
alias_method :t, :translate
- def exists?(key, locale=nil)
+ def exists?(key, locale = nil)
locale ||= config.locale
load_locale(locale) unless @loaded_locales.include?(locale)
exists_no_cache?(key, locale)
diff --git a/lib/gaps.rb b/lib/gaps.rb
index c1f3f89602f..0bf52b14fc0 100644
--- a/lib/gaps.rb
+++ b/lib/gaps.rb
@@ -23,7 +23,7 @@ class Gaps
end
def find_gaps
- return if @subset.nil? or @original.nil?
+ return if @subset.nil? || @original.nil?
i = j = 0
gaps = {}
@@ -48,7 +48,7 @@ class Gaps
break if (i == @subset.size) || (j == @original.size)
end
- @after[@subset[i-1]] = @original[j..-1] if j < @original.size
+ @after[@subset[i - 1]] = @original[j..-1] if j < @original.size
end
end
diff --git a/lib/guardian.rb b/lib/guardian.rb
index 48c9ea4077e..dd75225f824 100644
--- a/lib/guardian.rb
+++ b/lib/guardian.rb
@@ -34,7 +34,7 @@ class Guardian
attr_accessor :can_see_emails
- def initialize(user=nil)
+ def initialize(user = nil)
@user = user.presence || AnonymousUser.new
end
@@ -91,7 +91,7 @@ class Guardian
end
end
- def can_create?(klass, parent=nil)
+ def can_create?(klass, parent = nil)
return false unless authenticated? && klass
# If no parent is provided, we look for a can_create_klass?
@@ -155,8 +155,6 @@ class Guardian
true
end
-
-
# Can we impersonate this user?
def can_impersonate?(target)
target &&
@@ -233,7 +231,7 @@ class Guardian
is_me?(user)
end
- def can_invite_to_forum?(groups=nil)
+ def can_invite_to_forum?(groups = nil)
authenticated? &&
(SiteSetting.max_invites_per_day.to_i > 0 || is_staff?) &&
!SiteSetting.enable_sso &&
@@ -245,7 +243,7 @@ class Guardian
(groups.blank? || is_admin? || groups.all? { |g| can_edit_group?(g) })
end
- def can_invite_to?(object, groups=nil)
+ def can_invite_to?(object, groups = nil)
return false unless authenticated?
return true if is_admin?
return false unless SiteSetting.enable_private_messages?
@@ -322,7 +320,6 @@ class Guardian
end
end
-
private
def is_my_own?(obj)
diff --git a/lib/guardian/category_guardian.rb b/lib/guardian/category_guardian.rb
index 7e67066e892..567fbdbdd99 100644
--- a/lib/guardian/category_guardian.rb
+++ b/lib/guardian/category_guardian.rb
@@ -2,7 +2,7 @@
module CategoryGuardian
# Creating Method
- def can_create_category?(parent=nil)
+ def can_create_category?(parent = nil)
is_admin? ||
(
SiteSetting.allow_moderators_to_create_categories &&
@@ -34,10 +34,10 @@ module CategoryGuardian
if category.topic_count != 0
oldest_topic = category.topics.where.not(id: category.topic_id).order('created_at ASC').limit(1).first
if oldest_topic
- return I18n.t('category.cannot_delete.topic_exists', {count: category.topic_count, topic_link: "#{oldest_topic.title}"})
+ return I18n.t('category.cannot_delete.topic_exists', count: category.topic_count, topic_link: "#{oldest_topic.title}")
else
# This is a weird case, probably indicating a bug.
- return I18n.t('category.cannot_delete.topic_exists_no_oldest', {count: category.topic_count})
+ return I18n.t('category.cannot_delete.topic_exists_no_oldest', count: category.topic_count)
end
end
diff --git a/lib/guardian/post_guardian.rb b/lib/guardian/post_guardian.rb
index 9b8f8ab0c16..da4275650c5 100644
--- a/lib/guardian/post_guardian.rb
+++ b/lib/guardian/post_guardian.rb
@@ -3,7 +3,7 @@ module PostGuardian
# Can the user act on the post in a particular way.
# taken_actions = the list of actions the user has already taken
- def post_can_act?(post, action_key, opts={})
+ def post_can_act?(post, action_key, opts = {})
return false unless can_see_post?(post)
@@ -85,7 +85,7 @@ module PostGuardian
(!SpamRule::AutoBlock.block?(@user) || (!!parent.try(:private_message?) && parent.allowed_users.include?(@user))) && (
!parent ||
!parent.category ||
- Category.post_create_allowed(self).where(:id => parent.category.id).count == 1
+ Category.post_create_allowed(self).where(id: parent.category.id).count == 1
)
end
@@ -186,8 +186,8 @@ module PostGuardian
can_see_post?(post)
end
- def can_vote?(post, opts={})
- post_can_act?(post,:vote, opts)
+ def can_vote?(post, opts = {})
+ post_can_act?(post, :vote, opts)
end
def can_change_post_owner?
diff --git a/lib/guardian/topic_guardian.rb b/lib/guardian/topic_guardian.rb
index add956351be..8b8f08a12d0 100644
--- a/lib/guardian/topic_guardian.rb
+++ b/lib/guardian/topic_guardian.rb
@@ -76,7 +76,7 @@ module TopicGuardian
is_staff?
end
- def can_see_topic?(topic, hide_deleted=true)
+ def can_see_topic?(topic, hide_deleted = true)
return false unless topic
return true if is_admin?
return false if hide_deleted && topic.deleted_at && !can_see_deleted_topics?
@@ -107,6 +107,6 @@ module TopicGuardian
def can_edit_featured_link?(category_id)
return false unless SiteSetting.topic_featured_link_enabled
- Category.where(id: category_id||SiteSetting.uncategorized_category_id, topic_featured_link_allowed: true).exists?
+ Category.where(id: category_id || SiteSetting.uncategorized_category_id, topic_featured_link_allowed: true).exists?
end
end
diff --git a/lib/html_normalize.rb b/lib/html_normalize.rb
index 072789c0cba..9b5ebb5d58a 100644
--- a/lib/html_normalize.rb
+++ b/lib/html_normalize.rb
@@ -51,7 +51,7 @@ class HtmlNormalize
Oga::XML::Text === node || !BLOCK.include?(node.name.downcase)
end
- def dump_node(node, indent=0, buffer)
+ def dump_node(node, indent = 0, buffer)
if Oga::XML::Text === node
if node.parent&.name
@@ -70,7 +70,7 @@ class HtmlNormalize
attrs = node&.attributes
if (attrs && attrs.length > 0)
- attrs.sort!{|x,y| x.name <=> y.name}
+ attrs.sort! { |x, y| x.name <=> y.name }
attrs.each do |a|
buffer << " "
buffer << a.name
@@ -94,20 +94,20 @@ class HtmlNormalize
children&.each do |child|
if block && inline?(child)
inline_buffer ||= String.new
- dump_node(child, indent+1, inline_buffer)
+ dump_node(child, indent + 1, inline_buffer)
else
if inline_buffer
- buffer << " " * (indent+1) * 2
+ buffer << " " * (indent + 1) * 2
buffer << inline_buffer.strip
inline_buffer = nil
else
- dump_node(child, indent+1, buffer)
+ dump_node(child, indent + 1, buffer)
end
end
end
if inline_buffer
- buffer << " " * (indent+1) * 2
+ buffer << " " * (indent + 1) * 2
buffer << inline_buffer.strip
inline_buffer = nil
end
@@ -146,5 +146,4 @@ class HtmlNormalize
nodes[start...finish]
end
-
end
diff --git a/lib/html_prettify.rb b/lib/html_prettify.rb
index 39a8ca7d304..df91d767d32 100644
--- a/lib/html_prettify.rb
+++ b/lib/html_prettify.rb
@@ -12,7 +12,7 @@ class HtmlPrettify < String
new(html).to_html
end
- # Create a new RubyPants instance with the text in +string+.
+ # Create a new RubyPants instance with the text in +string+.
#
# Allowed elements in the options array:
#
@@ -50,7 +50,7 @@ class HtmlPrettify < String
# :ellipsis :: …
# :html_quote :: "
#
- def initialize(string, options=[2], entities = {})
+ def initialize(string, options = [2], entities = {})
super string
@options = [*options]
@@ -173,7 +173,6 @@ class HtmlPrettify < String
protected
-
# The string, with each instance of "--" translated to an
# em-dash HTML entity.
#
@@ -319,14 +318,14 @@ class HtmlPrettify < String
new_str = str.dup
{
- :en_dash => '-',
- :em_dash => '--',
- :single_left_quote => "'",
- :single_right_quote => "'",
- :double_left_quote => '"',
- :double_right_quote => '"',
- :ellipsis => '...'
- }.each do |k,v|
+ en_dash: '-',
+ em_dash: '--',
+ single_left_quote: "'",
+ single_right_quote: "'",
+ double_left_quote: '"',
+ double_right_quote: '"',
+ ellipsis: '...'
+ }.each do |k, v|
new_str.gsub!(/#{entity(k)}/, v)
end
diff --git a/lib/html_to_markdown.rb b/lib/html_to_markdown.rb
index e5360477406..21a3cded140 100644
--- a/lib/html_to_markdown.rb
+++ b/lib/html_to_markdown.rb
@@ -3,24 +3,23 @@ require "nokogiri"
class HtmlToMarkdown
class Block < Struct.new(:name, :head, :body, :opened, :markdown)
- def initialize(name, head="", body="", opened=false, markdown=""); super; end
+ def initialize(name, head = "", body = "", opened = false, markdown = ""); super; end
end
- def initialize(html, opts={})
+ def initialize(html, opts = {})
@opts = opts || {}
@doc = fix_span_elements(Nokogiri::HTML(html))
remove_whitespaces!
end
-
# If a `
` is within a `` that's invalid, so let's hoist the `
` up
def fix_span_elements(node)
if node.name == 'span' && node.at('div')
node.swap(node.children)
end
- node.children.each {|c| fix_span_elements(c)}
+ node.children.each { |c| fix_span_elements(c) }
node
end
diff --git a/lib/i18n/backend/discourse_i18n.rb b/lib/i18n/backend/discourse_i18n.rb
index f940bd8804d..65a090cd261 100644
--- a/lib/i18n/backend/discourse_i18n.rb
+++ b/lib/i18n/backend/discourse_i18n.rb
@@ -51,7 +51,7 @@ module I18n
protected
- def find_results(regexp, results, translations, path=nil)
+ def find_results(regexp, results, translations, path = nil)
return results if translations.blank?
translations.each do |k_sym, v|
diff --git a/lib/import/normalize.rb b/lib/import/normalize.rb
index 79dfb255f83..5279439dc4d 100644
--- a/lib/import/normalize.rb
+++ b/lib/import/normalize.rb
@@ -4,10 +4,10 @@
require 'htmlentities'
module Import; end
module Import::Normalize
- def self.normalize_code_blocks(code, lang=nil)
+ def self.normalize_code_blocks(code, lang = nil)
coder = HTMLEntities.new
code.gsub(/
\s*\n?(.*?)\n?<\/code>\s*<\/pre>/m) {
- "\n```#{lang}\n#{coder.decode($1)}\n```\n"
+ "\n```#{lang}\n#{coder.decode($1)}\n```\n"
}
end
end
diff --git a/lib/import_export/category_exporter.rb b/lib/import_export/category_exporter.rb
index 9f182e72470..4e2a57e8208 100644
--- a/lib/import_export/category_exporter.rb
+++ b/lib/import_export/category_exporter.rb
@@ -22,15 +22,14 @@ module ImportExport
self
end
-
CATEGORY_ATTRS = [:id, :name, :color, :created_at, :user_id, :slug, :description, :text_color,
:auto_close_hours, :auto_close_based_on_last_post,
:topic_template, :suppress_from_homepage, :all_topics_wiki, :permissions_params]
def export_categories
- @export_data[:category] = CATEGORY_ATTRS.inject({}) { |h,a| h[a] = @category.send(a); h }
+ @export_data[:category] = CATEGORY_ATTRS.inject({}) { |h, a| h[a] = @category.send(a); h }
@subcategories.find_each do |subcat|
- @export_data[:subcategories] << CATEGORY_ATTRS.inject({}) { |h,a| h[a] = subcat.send(a); h }
+ @export_data[:subcategories] << CATEGORY_ATTRS.inject({}) { |h, a| h[a] = subcat.send(a); h }
end
# export groups that are mentioned in category permissions
@@ -49,7 +48,6 @@ module ImportExport
self
end
-
GROUP_ATTRS = [ :id, :name, :created_at, :alias_level, :visible,
:automatic_membership_email_domains, :automatic_membership_retroactive,
:primary_group, :title, :grant_trust_level, :incoming_email]
@@ -57,7 +55,7 @@ module ImportExport
def export_groups(group_names)
group_names.each do |name|
group = Group.find_by_name(name)
- group_attrs = GROUP_ATTRS.inject({}) { |h,a| h[a] = group.send(a); h }
+ group_attrs = GROUP_ATTRS.inject({}) { |h, a| h[a] = group.send(a); h }
group_attrs[:user_ids] = group.users.pluck(:id)
@export_data[:groups] << group_attrs
end
@@ -75,7 +73,7 @@ module ImportExport
self
end
- def save_to_file(filename=nil)
+ def save_to_file(filename = nil)
require 'json'
output_basename = filename || File.join("category-export-#{Time.now.strftime("%Y-%m-%d-%H%M%S")}.json")
File.open(output_basename, "w:UTF-8") do |f|
diff --git a/lib/import_export/category_importer.rb b/lib/import_export/category_importer.rb
index 25b57acfcb9..8493b006a09 100644
--- a/lib/import_export/category_importer.rb
+++ b/lib/import_export/category_importer.rb
@@ -28,7 +28,7 @@ module ImportExport
external_id = g.delete(:id)
new_group = Group.find_by_name(g[:name]) || Group.create!(g)
user_ids.each do |external_user_id|
- new_group.add( User.find(@topic_importer.new_user_id(external_user_id)) ) rescue ActiveRecord::RecordNotUnique
+ new_group.add(User.find(@topic_importer.new_user_id(external_user_id))) rescue ActiveRecord::RecordNotUnique
end
end
end
@@ -47,7 +47,7 @@ module ImportExport
parent = Category.new(@export_data[:category])
parent.user_id = @topic_importer.new_user_id(@export_data[:category][:user_id]) # imported user's new id
parent.custom_fields["import_id"] = id
- parent.permissions = permissions.present? ? permissions : {"everyone" => CategoryGroup.permission_types[:full]}
+ parent.permissions = permissions.present? ? permissions : { "everyone" => CategoryGroup.permission_types[:full] }
parent.save!
set_category_description(parent, @export_data[:category][:description])
end
@@ -62,7 +62,7 @@ module ImportExport
subcategory.parent_category_id = parent.id
subcategory.user_id = @topic_importer.new_user_id(cat_attrs[:user_id])
subcategory.custom_fields["import_id"] = id
- subcategory.permissions = permissions.present? ? permissions : {"everyone" => CategoryGroup.permission_types[:full]}
+ subcategory.permissions = permissions.present? ? permissions : { "everyone" => CategoryGroup.permission_types[:full] }
subcategory.save!
set_category_description(subcategory, cat_attrs[:description])
end
diff --git a/lib/import_export/import_export.rb b/lib/import_export/import_export.rb
index 4bb6fa9250d..fad560768f2 100644
--- a/lib/import_export/import_export.rb
+++ b/lib/import_export/import_export.rb
@@ -6,7 +6,7 @@ require "json"
module ImportExport
- def self.export_category(category_id, filename=nil)
+ def self.export_category(category_id, filename = nil)
ImportExport::CategoryExporter.new(category_id).perform.save_to_file(filename)
end
diff --git a/lib/import_export/topic_exporter.rb b/lib/import_export/topic_exporter.rb
index 78b4dc4d9eb..4c494003edd 100644
--- a/lib/import_export/topic_exporter.rb
+++ b/lib/import_export/topic_exporter.rb
@@ -20,7 +20,6 @@ module ImportExport
self
end
-
USER_ATTRS = [:id, :email, :username, :name, :created_at, :trust_level, :active, :last_emailed_at]
def export_users
@@ -33,11 +32,9 @@ module ImportExport
u = post.user
unless @exported_user_ids.include?(u.id)
x = USER_ATTRS.inject({}) { |h, a| h[a] = u.send(a); h; }
- @export_data[:users] << x.merge({
- bio_raw: u.user_profile.bio_raw,
- website: u.user_profile.website,
- location: u.user_profile.location
- })
+ @export_data[:users] << x.merge(bio_raw: u.user_profile.bio_raw,
+ website: u.user_profile.website,
+ location: u.user_profile.location)
@exported_user_ids << u.id
end
end
@@ -46,7 +43,6 @@ module ImportExport
self
end
-
def export_topics
@topic_ids.each do |topic_id|
t = Topic.find(topic_id)
@@ -56,7 +52,6 @@ module ImportExport
puts ""
end
-
TOPIC_ATTRS = [:id, :title, :created_at, :views, :category_id, :closed, :archived, :archetype]
POST_ATTRS = [:id, :user_id, :post_number, :raw, :created_at, :reply_to_post_number,
:hidden, :hidden_reason_id, :wiki]
@@ -81,8 +76,7 @@ module ImportExport
self
end
-
- def save_to_file(filename=nil)
+ def save_to_file(filename = nil)
require 'json'
output_basename = filename || File.join("topic-export-#{Time.now.strftime("%Y-%m-%d-%H%M%S")}.json")
File.open(output_basename, "w:UTF-8") do |f|
diff --git a/lib/import_export/topic_importer.rb b/lib/import_export/topic_importer.rb
index 57496c5dab3..c681d39c2f6 100644
--- a/lib/import_export/topic_importer.rb
+++ b/lib/import_export/topic_importer.rb
@@ -36,14 +36,14 @@ module ImportExport
puts ""
print t[:title]
- first_post_attrs = t[:posts].first.merge( t.slice(*(TopicExporter::TOPIC_ATTRS - [:id, :category_id])) )
+ first_post_attrs = t[:posts].first.merge(t.slice(*(TopicExporter::TOPIC_ATTRS - [:id, :category_id])))
first_post_attrs[:user_id] = new_user_id(first_post_attrs[:user_id])
first_post_attrs[:category] = new_category_id(t[:category_id])
first_post = PostCustomField.where(name: "import_id", value: first_post_attrs[:id]).first.try(:post)
unless first_post
- first_post = create_post( first_post_attrs, first_post_attrs[:id] )
+ first_post = create_post(first_post_attrs, first_post_attrs[:id])
end
topic_id = first_post.topic_id
@@ -53,10 +53,8 @@ module ImportExport
print "."
existing = PostCustomField.where(name: "import_id", value: post_data[:id]).first.try(:post)
unless existing
- create_post(post_data.merge({
- topic_id: topic_id,
- user_id: new_user_id(post_data[:user_id])
- }), post_data[:id]) # see ImportScripts::Base
+ create_post(post_data.merge(topic_id: topic_id,
+ user_id: new_user_id(post_data[:user_id])), post_data[:id]) # see ImportScripts::Base
end
end
end
diff --git a/lib/inline_oneboxer.rb b/lib/inline_oneboxer.rb
index b064794882a..f345bef4d38 100644
--- a/lib/inline_oneboxer.rb
+++ b/lib/inline_oneboxer.rb
@@ -2,13 +2,13 @@ require_dependency 'retrieve_title'
class InlineOneboxer
- def initialize(urls, opts=nil)
+ def initialize(urls, opts = nil)
@urls = urls
@opts = opts || {}
end
def process
- @urls.map {|url| InlineOneboxer.lookup(url, @opts) }.compact
+ @urls.map { |url| InlineOneboxer.lookup(url, @opts) }.compact
end
def self.purge(url)
@@ -19,7 +19,7 @@ class InlineOneboxer
Rails.cache.read(cache_key(url))
end
- def self.lookup(url, opts=nil)
+ def self.lookup(url, opts = nil)
opts ||= {}
unless opts[:skip_cache]
@@ -44,7 +44,7 @@ class InlineOneboxer
uri.hostname.present? &&
domains.include?(uri.hostname) &&
title = RetrieveTitle.crawl(url)
- return onebox_for(url, title, opts)
+ return onebox_for(url, title, opts)
end
end
@@ -70,4 +70,3 @@ class InlineOneboxer
end
end
-
diff --git a/lib/js_locale_helper.rb b/lib/js_locale_helper.rb
index 2aa8d65a0f1..c352ee42d74 100644
--- a/lib/js_locale_helper.rb
+++ b/lib/js_locale_helper.rb
@@ -16,7 +16,7 @@ module JsLocaleHelper
end
end
- def self.load_translations(locale, opts=nil)
+ def self.load_translations(locale, opts = nil)
opts ||= {}
@loaded_translations = nil if opts[:force]
@@ -149,7 +149,7 @@ module JsLocaleHelper
end
def self.generate_message_format(message_formats, locale_str)
- formats = message_formats.map { |k,v| k.inspect << " : " << compile_message_format(locale_str, v) }.join(", ")
+ formats = message_formats.map { |k, v| k.inspect << " : " << compile_message_format(locale_str, v) }.join(", ")
filename = "#{Rails.root}/lib/javascripts/locale/#{locale_str}.js"
filename = "#{Rails.root}/lib/javascripts/locale/en.js" unless File.exists?(filename)
diff --git a/lib/json_error.rb b/lib/json_error.rb
index e52f18edf4d..5dfc720506c 100644
--- a/lib/json_error.rb
+++ b/lib/json_error.rb
@@ -1,6 +1,6 @@
module JsonError
- def create_errors_json(obj, type=nil)
+ def create_errors_json(obj, type = nil)
errors = create_errors_array obj
errors[:error_type] = type if type
errors
diff --git a/lib/letter_avatar.rb b/lib/letter_avatar.rb
index 62915edcaba..93766c4b2d1 100644
--- a/lib/letter_avatar.rb
+++ b/lib/letter_avatar.rb
@@ -89,7 +89,7 @@ class LetterAvatar
end
def to_rgb(color)
- r,g,b = color
+ r, g, b = color
"rgb(#{r},#{g},#{b})"
end
@@ -108,7 +108,7 @@ class LetterAvatar
skip = File.basename(cache_path)
parent_path = File.dirname(cache_path)
Dir.entries(parent_path).each do |path|
- unless ['.','..'].include?(path) || path == skip
+ unless ['.', '..'].include?(path) || path == skip
FileUtils.rm_rf(parent_path + "/" + path)
end
end
@@ -121,220 +121,220 @@ class LetterAvatar
# - H: 0 - 360
# - C: 0 - 2
# - L: 0.75 - 1.5
- COLORS = [[198,125,40],
- [61,155,243],
- [74,243,75],
- [238,89,166],
- [52,240,224],
- [177,156,155],
- [240,120,145],
- [111,154,78],
- [237,179,245],
- [237,101,95],
- [89,239,155],
- [43,254,70],
- [163,212,245],
- [65,152,142],
- [165,135,246],
- [181,166,38],
- [187,229,206],
- [77,164,25],
- [179,246,101],
- [234,93,37],
- [225,155,115],
- [142,140,188],
- [223,120,140],
- [249,174,27],
- [244,117,225],
- [137,141,102],
- [75,191,146],
- [188,239,142],
- [164,199,145],
- [173,120,149],
- [59,195,89],
- [222,198,220],
- [68,145,187],
- [236,204,179],
- [159,195,72],
- [188,121,189],
- [166,160,85],
- [181,233,37],
- [236,177,85],
- [121,147,160],
- [234,218,110],
- [241,157,191],
- [62,200,234],
- [133,243,34],
- [88,149,110],
- [59,228,248],
- [183,119,118],
- [251,195,45],
- [113,196,122],
- [197,115,70],
- [80,175,187],
- [103,231,238],
- [240,72,133],
- [228,149,241],
- [180,188,159],
- [172,132,85],
- [180,135,251],
- [236,194,58],
- [217,176,109],
- [88,244,199],
- [186,157,239],
- [113,230,96],
- [206,115,165],
- [244,178,163],
- [230,139,26],
- [241,125,89],
- [83,160,66],
- [107,190,166],
- [197,161,210],
- [198,203,245],
- [238,117,19],
- [228,119,116],
- [131,156,41],
- [145,178,168],
- [139,170,220],
- [233,95,125],
- [87,178,230],
- [157,200,119],
- [237,140,76],
- [229,185,186],
- [144,206,212],
- [236,209,158],
- [185,189,79],
- [34,208,66],
- [84,238,129],
- [133,140,134],
- [67,157,94],
- [168,179,25],
- [140,145,240],
- [151,241,125],
- [67,162,107],
- [200,156,21],
- [169,173,189],
- [226,116,189],
- [133,231,191],
- [194,161,63],
- [241,77,99],
- [241,217,53],
- [123,204,105],
- [210,201,119],
- [229,108,155],
- [240,91,72],
- [187,115,210],
- [240,163,100],
- [178,217,57],
- [179,135,116],
- [204,211,24],
- [186,135,57],
- [223,176,135],
- [204,148,151],
- [116,223,50],
- [95,195,46],
- [123,160,236],
- [181,172,131],
- [142,220,202],
- [240,140,112],
- [172,145,164],
- [228,124,45],
- [135,151,243],
- [42,205,125],
- [192,233,116],
- [119,170,114],
- [158,138,26],
- [73,190,183],
- [185,229,243],
- [227,107,55],
- [196,205,202],
- [132,143,60],
- [233,192,237],
- [62,150,220],
- [205,201,141],
- [106,140,190],
- [161,131,205],
- [135,134,158],
- [198,139,81],
- [115,171,32],
- [101,181,67],
- [149,137,119],
- [37,142,183],
- [183,130,175],
- [168,125,133],
- [124,142,87],
- [236,156,171],
- [232,194,91],
- [219,200,69],
- [144,219,34],
- [219,95,187],
- [145,154,217],
- [165,185,100],
- [127,238,163],
- [224,178,198],
- [119,153,120],
- [124,212,92],
- [172,161,105],
- [231,155,135],
- [157,132,101],
- [122,185,146],
- [53,166,51],
- [70,163,90],
- [150,190,213],
- [210,107,60],
- [166,152,185],
- [159,194,159],
- [39,141,222],
- [202,176,161],
- [95,140,229],
- [168,142,87],
- [93,170,203],
- [159,142,54],
- [14,168,39],
- [94,150,149],
- [187,206,136],
- [157,224,166],
- [235,158,208],
- [109,232,216],
- [141,201,87],
- [208,124,118],
- [142,125,214],
- [19,237,174],
- [72,219,41],
- [234,102,111],
- [168,142,79],
- [188,135,35],
- [95,155,143],
- [148,173,116],
- [223,112,95],
- [228,128,236],
- [206,114,54],
- [195,119,88],
- [235,140,94],
- [235,202,125],
- [233,155,153],
- [214,214,238],
- [246,200,35],
- [151,125,171],
- [132,145,172],
- [131,142,118],
- [199,126,150],
- [61,162,123],
- [58,176,151],
- [215,141,69],
- [225,154,220],
- [220,77,167],
- [233,161,64],
- [130,221,137],
- [81,191,129],
- [169,162,140],
- [174,177,222],
- [236,174,47],
- [233,188,180],
- [69,222,172],
- [71,232,93],
- [118,211,238],
- [157,224,83],
- [218,105,73],
- [126,169,36]]
+ COLORS = [[198, 125, 40],
+ [61, 155, 243],
+ [74, 243, 75],
+ [238, 89, 166],
+ [52, 240, 224],
+ [177, 156, 155],
+ [240, 120, 145],
+ [111, 154, 78],
+ [237, 179, 245],
+ [237, 101, 95],
+ [89, 239, 155],
+ [43, 254, 70],
+ [163, 212, 245],
+ [65, 152, 142],
+ [165, 135, 246],
+ [181, 166, 38],
+ [187, 229, 206],
+ [77, 164, 25],
+ [179, 246, 101],
+ [234, 93, 37],
+ [225, 155, 115],
+ [142, 140, 188],
+ [223, 120, 140],
+ [249, 174, 27],
+ [244, 117, 225],
+ [137, 141, 102],
+ [75, 191, 146],
+ [188, 239, 142],
+ [164, 199, 145],
+ [173, 120, 149],
+ [59, 195, 89],
+ [222, 198, 220],
+ [68, 145, 187],
+ [236, 204, 179],
+ [159, 195, 72],
+ [188, 121, 189],
+ [166, 160, 85],
+ [181, 233, 37],
+ [236, 177, 85],
+ [121, 147, 160],
+ [234, 218, 110],
+ [241, 157, 191],
+ [62, 200, 234],
+ [133, 243, 34],
+ [88, 149, 110],
+ [59, 228, 248],
+ [183, 119, 118],
+ [251, 195, 45],
+ [113, 196, 122],
+ [197, 115, 70],
+ [80, 175, 187],
+ [103, 231, 238],
+ [240, 72, 133],
+ [228, 149, 241],
+ [180, 188, 159],
+ [172, 132, 85],
+ [180, 135, 251],
+ [236, 194, 58],
+ [217, 176, 109],
+ [88, 244, 199],
+ [186, 157, 239],
+ [113, 230, 96],
+ [206, 115, 165],
+ [244, 178, 163],
+ [230, 139, 26],
+ [241, 125, 89],
+ [83, 160, 66],
+ [107, 190, 166],
+ [197, 161, 210],
+ [198, 203, 245],
+ [238, 117, 19],
+ [228, 119, 116],
+ [131, 156, 41],
+ [145, 178, 168],
+ [139, 170, 220],
+ [233, 95, 125],
+ [87, 178, 230],
+ [157, 200, 119],
+ [237, 140, 76],
+ [229, 185, 186],
+ [144, 206, 212],
+ [236, 209, 158],
+ [185, 189, 79],
+ [34, 208, 66],
+ [84, 238, 129],
+ [133, 140, 134],
+ [67, 157, 94],
+ [168, 179, 25],
+ [140, 145, 240],
+ [151, 241, 125],
+ [67, 162, 107],
+ [200, 156, 21],
+ [169, 173, 189],
+ [226, 116, 189],
+ [133, 231, 191],
+ [194, 161, 63],
+ [241, 77, 99],
+ [241, 217, 53],
+ [123, 204, 105],
+ [210, 201, 119],
+ [229, 108, 155],
+ [240, 91, 72],
+ [187, 115, 210],
+ [240, 163, 100],
+ [178, 217, 57],
+ [179, 135, 116],
+ [204, 211, 24],
+ [186, 135, 57],
+ [223, 176, 135],
+ [204, 148, 151],
+ [116, 223, 50],
+ [95, 195, 46],
+ [123, 160, 236],
+ [181, 172, 131],
+ [142, 220, 202],
+ [240, 140, 112],
+ [172, 145, 164],
+ [228, 124, 45],
+ [135, 151, 243],
+ [42, 205, 125],
+ [192, 233, 116],
+ [119, 170, 114],
+ [158, 138, 26],
+ [73, 190, 183],
+ [185, 229, 243],
+ [227, 107, 55],
+ [196, 205, 202],
+ [132, 143, 60],
+ [233, 192, 237],
+ [62, 150, 220],
+ [205, 201, 141],
+ [106, 140, 190],
+ [161, 131, 205],
+ [135, 134, 158],
+ [198, 139, 81],
+ [115, 171, 32],
+ [101, 181, 67],
+ [149, 137, 119],
+ [37, 142, 183],
+ [183, 130, 175],
+ [168, 125, 133],
+ [124, 142, 87],
+ [236, 156, 171],
+ [232, 194, 91],
+ [219, 200, 69],
+ [144, 219, 34],
+ [219, 95, 187],
+ [145, 154, 217],
+ [165, 185, 100],
+ [127, 238, 163],
+ [224, 178, 198],
+ [119, 153, 120],
+ [124, 212, 92],
+ [172, 161, 105],
+ [231, 155, 135],
+ [157, 132, 101],
+ [122, 185, 146],
+ [53, 166, 51],
+ [70, 163, 90],
+ [150, 190, 213],
+ [210, 107, 60],
+ [166, 152, 185],
+ [159, 194, 159],
+ [39, 141, 222],
+ [202, 176, 161],
+ [95, 140, 229],
+ [168, 142, 87],
+ [93, 170, 203],
+ [159, 142, 54],
+ [14, 168, 39],
+ [94, 150, 149],
+ [187, 206, 136],
+ [157, 224, 166],
+ [235, 158, 208],
+ [109, 232, 216],
+ [141, 201, 87],
+ [208, 124, 118],
+ [142, 125, 214],
+ [19, 237, 174],
+ [72, 219, 41],
+ [234, 102, 111],
+ [168, 142, 79],
+ [188, 135, 35],
+ [95, 155, 143],
+ [148, 173, 116],
+ [223, 112, 95],
+ [228, 128, 236],
+ [206, 114, 54],
+ [195, 119, 88],
+ [235, 140, 94],
+ [235, 202, 125],
+ [233, 155, 153],
+ [214, 214, 238],
+ [246, 200, 35],
+ [151, 125, 171],
+ [132, 145, 172],
+ [131, 142, 118],
+ [199, 126, 150],
+ [61, 162, 123],
+ [58, 176, 151],
+ [215, 141, 69],
+ [225, 154, 220],
+ [220, 77, 167],
+ [233, 161, 64],
+ [130, 221, 137],
+ [81, 191, 129],
+ [169, 162, 140],
+ [174, 177, 222],
+ [236, 174, 47],
+ [233, 188, 180],
+ [69, 222, 172],
+ [71, 232, 93],
+ [118, 211, 238],
+ [157, 224, 83],
+ [218, 105, 73],
+ [126, 169, 36]]
end
diff --git a/lib/markdown_linker.rb b/lib/markdown_linker.rb
index b6bb1a2eb1e..fab7c5a6b60 100644
--- a/lib/markdown_linker.rb
+++ b/lib/markdown_linker.rb
@@ -17,7 +17,7 @@ class MarkdownLinker
def references
result = ""
- (@rendered..@index-1).each do |i|
+ (@rendered..@index - 1).each do |i|
result << "[#{i}]: #{@markdown_links[i]}\n"
end
@rendered = @index
diff --git a/lib/memory_diagnostics.rb b/lib/memory_diagnostics.rb
index a49480677a9..3a3fcd60f54 100644
--- a/lib/memory_diagnostics.rb
+++ b/lib/memory_diagnostics.rb
@@ -4,7 +4,7 @@ module MemoryDiagnostics
File.exists?(snapshot_filename)
end
- def self.compare(from=nil, to=nil)
+ def self.compare(from = nil, to = nil)
from ||= snapshot_filename
if !to
@@ -38,7 +38,7 @@ module MemoryDiagnostics
end
end
- report << summary.sort{|a,b| b[1] <=> a[1]}[0..50].map{|k,v|
+ report << summary.sort { |a, b| b[1] <=> a[1] }[0..50].map { |k, v|
"#{k}: #{v}"
}.join("\n")
@@ -59,9 +59,9 @@ module MemoryDiagnostics
"#{snapshot_path}/#{Process.pid}.snapshot"
end
- def self.snapshot_current_process(filename=nil)
+ def self.snapshot_current_process(filename = nil)
filename ||= snapshot_filename
- pid=fork do
+ pid = fork do
snapshot(filename)
end
@@ -86,7 +86,7 @@ module MemoryDiagnostics
IO.binwrite(filename, Marshal::dump(object_ids))
end
- def self.memory_report(opts={})
+ def self.memory_report(opts = {})
begin
# ruby 2.1
GC.start(full_mark: true)
@@ -94,7 +94,6 @@ module MemoryDiagnostics
GC.start
end
-
classes = {}
large_objects = []
@@ -113,11 +112,11 @@ module MemoryDiagnostics
classes[:unknown] += 1
end
end
- classes = classes.sort{|a,b| b[1] <=> a[1]}[0..40].map{|klass, count| "#{klass}: #{count}"}
+ classes = classes.sort { |a, b| b[1] <=> a[1] }[0..40].map { |klass, count| "#{klass}: #{count}" }
- classes << "\nLarge Objects (#{large_objects.length} larger than 200 bytes total size #{large_objects.map{|x,_| x}.sum}):\n"
+ classes << "\nLarge Objects (#{large_objects.length} larger than 200 bytes total size #{large_objects.map { |x, _| x }.sum}):\n"
- classes += large_objects.sort{|a,b| b[0] <=> a[0]}[0..800].map do |size,object|
+ classes += large_objects.sort { |a, b| b[0] <=> a[0] }[0..800].map do |size, object|
rval = "#{object.class}: size #{size}"
rval << " " << object.to_s[0..500].gsub("\n", "") if (String === object) || (Regexp === object)
rval << "\n"
@@ -125,10 +124,8 @@ module MemoryDiagnostics
end
end
- stats = GC.stat.map{|k,v| "#{k}: #{v}"}
- counts = ObjectSpace.count_objects.sort{|a,b| b[1] <=> a[1] }.map{|k,v| "#{k}: #{v}"}
-
-
+ stats = GC.stat.map { |k, v| "#{k}: #{v}" }
+ counts = ObjectSpace.count_objects.sort { |a, b| b[1] <=> a[1] }.map { |k, v| "#{k}: #{v}" }
< 'image/png' }, [ File.read(default_image)] ]
end
end
-
+
status, headers, response = @app.call(env)
[status, headers, response]
end
diff --git a/lib/middleware/request_tracker.rb b/lib/middleware/request_tracker.rb
index 90b36890d0e..a2dae84e97f 100644
--- a/lib/middleware/request_tracker.rb
+++ b/lib/middleware/request_tracker.rb
@@ -2,11 +2,11 @@ require_dependency 'middleware/anonymous_cache'
class Middleware::RequestTracker
- def initialize(app, settings={})
+ def initialize(app, settings = {})
@app = app
end
- def self.log_request_on_site(data,host)
+ def self.log_request_on_site(data, host)
RailsMultisite::ConnectionManagement.with_hostname(host) do
log_request(data)
end
@@ -46,8 +46,8 @@ class Middleware::RequestTracker
TRACK_VIEW = "HTTP_DISCOURSE_TRACK_VIEW".freeze
CONTENT_TYPE = "Content-Type".freeze
- def self.get_data(env,result)
- status,headers = result
+ def self.get_data(env, result)
+ status, headers = result
status = status.to_i
helper = Middleware::AnonymousCache::Helper.new(env)
@@ -74,21 +74,21 @@ class Middleware::RequestTracker
ensure
# we got to skip this on error ... its just logging
- data = self.class.get_data(env,result) rescue nil
+ data = self.class.get_data(env, result) rescue nil
host = RailsMultisite::ConnectionManagement.host(env)
if data
- if result && (headers=result[1])
+ if result && (headers = result[1])
headers["X-Discourse-TrackView"] = "1" if data[:track_view]
end
- log_later(data,host)
+ log_later(data, host)
end
end
- def log_later(data,host)
- Scheduler::Defer.later("Track view", _db=nil) do
- self.class.log_request_on_site(data,host)
+ def log_later(data, host)
+ Scheduler::Defer.later("Track view", _db = nil) do
+ self.class.log_request_on_site(data, host)
end
end
diff --git a/lib/middleware/turbo_dev.rb b/lib/middleware/turbo_dev.rb
index beda1652243..53e81cb50df 100644
--- a/lib/middleware/turbo_dev.rb
+++ b/lib/middleware/turbo_dev.rb
@@ -13,7 +13,7 @@ module Middleware
# config.middleware.insert 0, Middleware::TurboDev
#
class TurboDev
- def initialize(app, settings={})
+ def initialize(app, settings = {})
@app = app
end
@@ -27,7 +27,7 @@ module Middleware
etag = etag.gsub "\"", ""
asset = Rails.application.assets.find_asset(name)
if asset && asset.digest == etag
- return [304,{},[]]
+ return [304, {}, []]
end
end
diff --git a/lib/new_post_manager.rb b/lib/new_post_manager.rb
index 7d99a8b4ed6..8777f1b8ff7 100644
--- a/lib/new_post_manager.rb
+++ b/lib/new_post_manager.rb
@@ -17,16 +17,16 @@ class NewPostManager
end
def self.handlers
- sorted_handlers.map {|h| h[:proc]}
+ sorted_handlers.map { |h| h[:proc] }
end
def self.clear_handlers!
@sorted_handlers = [{ priority: 0, proc: method(:default_handler) }]
end
- def self.add_handler(priority=0, &block)
+ def self.add_handler(priority = 0, &block)
sorted_handlers << { priority: priority, proc: block }
- @sorted_handlers.sort_by! {|h| -h[:priority]}
+ @sorted_handlers.sort_by! { |h| -h[:priority] }
end
def self.is_first_post?(manager)
@@ -129,7 +129,7 @@ class NewPostManager
def initialize(user, args)
@user = user
- @args = args.delete_if {|_, v| v.nil?}
+ @args = args.delete_if { |_, v| v.nil? }
end
def perform
@@ -158,11 +158,11 @@ class NewPostManager
end
# Enqueue this post in a queue
- def enqueue(queue, reason=nil)
+ def enqueue(queue, reason = nil)
result = NewPostResult.new(:enqueued)
enqueuer = PostEnqueuer.new(@user, queue)
- queued_args = {post_options: @args.dup}
+ queued_args = { post_options: @args.dup }
queued_args[:raw] = queued_args[:post_options].delete(:raw)
queued_args[:topic_id] = queued_args[:post_options].delete(:topic_id)
diff --git a/lib/new_post_result.rb b/lib/new_post_result.rb
index 63acab0b002..78725ea11f0 100644
--- a/lib/new_post_result.rb
+++ b/lib/new_post_result.rb
@@ -10,7 +10,7 @@ class NewPostResult
attr_accessor :queued_post
attr_accessor :pending_count
- def initialize(action, success=false)
+ def initialize(action, success = false)
@action = action
@success = success
end
diff --git a/lib/oneboxer.rb b/lib/oneboxer.rb
index 08d3ac4149b..42862abe325 100644
--- a/lib/oneboxer.rb
+++ b/lib/oneboxer.rb
@@ -18,16 +18,16 @@ module Oneboxer
end
def self.ignore_redirects
- @ignore_redirects ||= ['http://www.dropbox.com','http://store.steampowered.com', Discourse.base_url]
+ @ignore_redirects ||= ['http://www.dropbox.com', 'http://store.steampowered.com', Discourse.base_url]
end
- def self.preview(url, options=nil)
+ def self.preview(url, options = nil)
options ||= {}
invalidate(url) if options[:invalidate_oneboxes]
onebox_raw(url)[:preview]
end
- def self.onebox(url, options=nil)
+ def self.onebox(url, options = nil)
options ||= {}
invalidate(url) if options[:invalidate_oneboxes]
onebox_raw(url)[:onebox]
@@ -74,7 +74,7 @@ module Oneboxer
def self.append_source_topic_id(url, topic_id)
# hack urls to create proper expansions
- if url =~ Regexp.new("^#{Discourse.base_url.gsub(".","\\.")}.*$", true)
+ if url =~ Regexp.new("^#{Discourse.base_url.gsub(".", "\\.")}.*$", true)
uri = URI.parse(url) rescue nil
if uri && uri.path
route = Rails.application.routes.recognize_path(uri.path) rescue nil
@@ -86,7 +86,7 @@ module Oneboxer
url
end
- def self.apply(string_or_doc, args=nil)
+ def self.apply(string_or_doc, args = nil)
doc = string_or_doc
doc = Nokogiri::HTML::fragment(doc) if doc.is_a?(String)
changed = false
@@ -95,7 +95,7 @@ module Oneboxer
if args && args[:topic_id]
url = append_source_topic_id(url, args[:topic_id])
end
- onebox, _preview = yield(url,element)
+ onebox, _preview = yield(url, element)
if onebox
parsed_onebox = Nokogiri::HTML::fragment(onebox)
next unless parsed_onebox.children.count > 0
diff --git a/lib/pbkdf2.rb b/lib/pbkdf2.rb
index f21cc8aebce..1032b4a1ad0 100644
--- a/lib/pbkdf2.rb
+++ b/lib/pbkdf2.rb
@@ -20,18 +20,18 @@ class Pbkdf2
u = ret = prf(h, password, salt + [1].pack("N"))
2.upto(iterations) do
- u = prf(h, password, u)
+ u = prf(h, password, u)
ret.xor!(u)
end
- ret.bytes.map{|b| ("0" + b.to_s(16))[-2..-1]}.join("")
+ ret.bytes.map { |b| ("0" + b.to_s(16))[-2..-1] }.join("")
end
protected
# fallback xor in case we need it for jruby ... way slower
- def self.xor(x,y)
- x.bytes.zip(y.bytes).map{|x,y| x ^ y}.pack('c*')
+ def self.xor(x, y)
+ x.bytes.zip(y.bytes).map { |x, y| x ^ y }.pack('c*')
end
def self.prf(hash_function, password, data)
diff --git a/lib/pinned_check.rb b/lib/pinned_check.rb
index b1a25a4d5db..54543499b34 100644
--- a/lib/pinned_check.rb
+++ b/lib/pinned_check.rb
@@ -2,16 +2,16 @@
# taking into account anonymous users and users who have dismissed it
class PinnedCheck
- def self.unpinned?(topic,topic_user=nil)
+ def self.unpinned?(topic, topic_user = nil)
topic.pinned_at &&
topic_user &&
topic_user.cleared_pinned_at &&
topic_user.cleared_pinned_at > topic.pinned_at
end
- def self.pinned?(topic, topic_user=nil)
+ def self.pinned?(topic, topic_user = nil)
!!topic.pinned_at &&
- !unpinned?(topic,topic_user)
+ !unpinned?(topic, topic_user)
end
end
diff --git a/lib/plugin/auth_provider.rb b/lib/plugin/auth_provider.rb
index 570a245b081..996d9ba0413 100644
--- a/lib/plugin/auth_provider.rb
+++ b/lib/plugin/auth_provider.rb
@@ -12,7 +12,7 @@ class Plugin::AuthProvider
end
def to_json
- result = {name: name}
+ result = { name: name }
result['customUrl'] = custom_url if custom_url
result['titleOverride'] = title if title
result['titleSetting'] = title_setting if title_setting
diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb
index ca749901078..50867afaa0e 100644
--- a/lib/plugin/instance.rb
+++ b/lib/plugin/instance.rb
@@ -58,14 +58,14 @@ class Plugin::Instance
}
end
- def initialize(metadata=nil, path=nil)
+ def initialize(metadata = nil, path = nil)
@metadata = metadata
@path = path
@idx = 0
end
def add_admin_route(label, location)
- @admin_route = {label: label, location: location}
+ @admin_route = { label: label, location: location }
end
def enabled?
@@ -74,7 +74,7 @@ class Plugin::Instance
delegate :name, to: :metadata
- def add_to_serializer(serializer, attr, define_include_method=true, &block)
+ def add_to_serializer(serializer, attr, define_include_method = true, &block)
klass = "#{serializer.to_s.classify}Serializer".constantize rescue "#{serializer.to_s}Serializer".constantize
klass.attributes(attr) unless attr.to_s.start_with?("include_")
@@ -164,7 +164,7 @@ class Plugin::Instance
def delete_extra_automatic_assets(good_paths)
return unless Dir.exists? auto_generated_path
- filenames = good_paths.map{|f| File.basename(f)}
+ filenames = good_paths.map { |f| File.basename(f) }
# nuke old files
Dir.foreach(auto_generated_path) do |p|
next if [".", ".."].include?(p)
@@ -242,13 +242,13 @@ class Plugin::Instance
DiscoursePluginRegistry.register_html_builder(name, &block)
end
- def register_asset(file, opts=nil)
+ def register_asset(file, opts = nil)
full_path = File.dirname(path) << "/assets/" << file
assets << [full_path, opts]
end
def register_color_scheme(name, colors)
- color_schemes << {name: name, colors: colors}
+ color_schemes << { name: name, colors: colors }
end
def register_seed_data(key, value)
@@ -362,14 +362,13 @@ JS
target = Rails.root.to_s + "/public/plugins/"
Discourse::Utils.execute_command('mkdir', '-p', target)
- target << name.gsub(/\s/,"_")
+ target << name.gsub(/\s/, "_")
# TODO a cleaner way of registering and unregistering
Discourse::Utils.execute_command('rm', '-f', target)
Discourse::Utils.execute_command('ln', '-s', public_data, target)
end
end
-
def auth_provider(opts)
provider = Plugin::AuthProvider.new
@@ -379,7 +378,6 @@ JS
auth_providers << provider
end
-
# shotgun approach to gem loading, in future we need to hack bundler
# to at least determine dependencies do not clash before loading
#
@@ -390,7 +388,7 @@ JS
PluginGem.load(path, name, version, opts)
end
- def enabled_site_setting(setting=nil)
+ def enabled_site_setting(setting = nil)
if setting
@enabled_site_setting = setting
else
@@ -421,9 +419,9 @@ JS
Dir.glob("#{root_path}/**/*") do |f|
if File.directory?(f)
- yield [f,true]
+ yield [f, true]
elsif f.to_s.ends_with?(".js.es6") || f.to_s.ends_with?(".hbs")
- yield [f,false]
+ yield [f, false]
end
end
end
@@ -442,7 +440,7 @@ JS
def write_asset(path, contents)
unless File.exists?(path)
ensure_directory(path)
- File.open(path,"w") { |f| f.write(contents) }
+ File.open(path, "w") { |f| f.write(contents) }
end
end
diff --git a/lib/plugin/theme.rb b/lib/plugin/theme.rb
index 04128d6f352..41ba7dc9992 100644
--- a/lib/plugin/theme.rb
+++ b/lib/plugin/theme.rb
@@ -27,4 +27,3 @@ class Plugin::Theme
end
end
end
-
diff --git a/lib/plugin_gem.rb b/lib/plugin_gem.rb
index 48df5e57c8b..6347cc8dce9 100644
--- a/lib/plugin_gem.rb
+++ b/lib/plugin_gem.rb
@@ -1,5 +1,5 @@
module PluginGem
- def self.load(path, name, version, opts=nil)
+ def self.load(path, name, version, opts = nil)
opts ||= {}
gems_path = File.dirname(path) + "/gems/#{RUBY_VERSION}"
diff --git a/lib/post_creator.rb b/lib/post_creator.rb
index 405a7e0537a..42b70558235 100644
--- a/lib/post_creator.rb
+++ b/lib/post_creator.rb
@@ -239,8 +239,8 @@ class PostCreator
return unless post.reply_to_post_number.present?
reply_info = Post.where(topic_id: post.topic_id, post_number: post.reply_to_post_number)
- .select(:user_id, :post_type)
- .first
+ .select(:user_id, :post_type)
+ .first
if reply_info.present?
post.reply_to_user_id ||= reply_info.user_id
@@ -316,11 +316,11 @@ class PostCreator
def handle_spam
if @spam
- GroupMessage.create( Group[:moderators].name,
+ GroupMessage.create(Group[:moderators].name,
:spam_post_blocked,
- { user: @user,
- limit_once_per: 24.hours,
- message_params: {domains: @post.linked_hosts.keys.join(', ')} } )
+ user: @user,
+ limit_once_per: 24.hours,
+ message_params: { domains: @post.linked_hosts.keys.join(', ') })
elsif @post && errors.blank? && !skip_validations?
SpamRulesEnforcer.enforce!(@post)
end
@@ -339,7 +339,7 @@ class PostCreator
unless @topic.topic_allowed_users.where(user_id: @user.id).exists?
unless @topic.topic_allowed_groups.where('group_id IN (
SELECT group_id FROM group_users where user_id = ?
- )',@user.id).exists?
+ )', @user.id).exists?
@topic.topic_allowed_users.create!(user_id: @user.id)
end
end
@@ -363,11 +363,13 @@ class PostCreator
def find_category_id
@opts.delete(:category) if @opts[:archetype].present? && @opts[:archetype] == Archetype.private_message
- category = if (@opts[:category].is_a? Integer) || (@opts[:category] =~ /^\d+$/)
- Category.find_by(id: @opts[:category])
- else
- Category.find_by(name_lower: @opts[:category].try(:downcase))
- end
+ category =
+ if (@opts[:category].is_a? Integer) || (@opts[:category] =~ /^\d+$/)
+ Category.find_by(id: @opts[:category])
+ else
+ Category.find_by(name_lower: @opts[:category].try(:downcase))
+ end
+
category&.id
end
@@ -491,7 +493,6 @@ class PostCreator
last_read_post_number: @post.post_number,
highest_seen_post_number: @post.post_number)
-
# assume it took us 5 seconds of reading time to make a post
PostTiming.record_timing(topic_id: @post.topic_id,
user_id: @post.user_id,
diff --git a/lib/post_destroyer.rb b/lib/post_destroyer.rb
index 07f34e85ee7..3f7cdbffab1 100644
--- a/lib/post_destroyer.rb
+++ b/lib/post_destroyer.rb
@@ -6,10 +6,10 @@ class PostDestroyer
def self.destroy_old_hidden_posts
Post.where(deleted_at: nil, hidden: true)
- .where("hidden_at < ?", 30.days.ago)
- .find_each do |post|
- PostDestroyer.new(Discourse.system_user, post).destroy
- end
+ .where("hidden_at < ?", 30.days.ago)
+ .find_each do |post|
+ PostDestroyer.new(Discourse.system_user, post).destroy
+ end
end
def self.destroy_stubs
@@ -17,26 +17,26 @@ class PostDestroyer
# exclude deleted topics and posts that are actively flagged
Post.where(deleted_at: nil, user_deleted: true)
- .where("NOT EXISTS (
+ .where("NOT EXISTS (
SELECT 1 FROM topics t
WHERE t.deleted_at IS NOT NULL AND
t.id = posts.topic_id
)")
- .where("updated_at < ? AND post_number > 1", SiteSetting.delete_removed_posts_after.hours.ago)
- .where("NOT EXISTS (
+ .where("updated_at < ? AND post_number > 1", SiteSetting.delete_removed_posts_after.hours.ago)
+ .where("NOT EXISTS (
SELECT 1
FROM post_actions pa
WHERE pa.post_id = posts.id AND
pa.deleted_at IS NULL AND
pa.post_action_type_id IN (?)
)", PostActionType.notify_flag_type_ids)
- .find_each do |post|
+ .find_each do |post|
PostDestroyer.new(Discourse.system_user, post, context: context).destroy
end
end
- def initialize(user, post, opts={})
+ def initialize(user, post, opts = {})
@user = user
@post = post
@topic = post.topic if post
diff --git a/lib/post_jobs_enqueuer.rb b/lib/post_jobs_enqueuer.rb
index 3227f76c3cf..cb8fdb56c1a 100644
--- a/lib/post_jobs_enqueuer.rb
+++ b/lib/post_jobs_enqueuer.rb
@@ -1,5 +1,5 @@
class PostJobsEnqueuer
- def initialize(post, topic, new_topic, opts={})
+ def initialize(post, topic, new_topic, opts = {})
@post = post
@topic = topic
@new_topic = new_topic
diff --git a/lib/post_revisor.rb b/lib/post_revisor.rb
index 831faa47b43..f443a64d93b 100644
--- a/lib/post_revisor.rb
+++ b/lib/post_revisor.rb
@@ -42,7 +42,7 @@ class PostRevisor
attr_reader :category_changed
- def initialize(post, topic=nil)
+ def initialize(post, topic = nil)
@post = post
@topic = topic || post.topic
end
@@ -112,7 +112,7 @@ class PostRevisor
# - bypass_bump: do not bump the topic, even if last post
# - skip_validations: ask ActiveRecord to skip validations
# - skip_revision: do not create a new PostRevision record
- def revise!(editor, fields, opts={})
+ def revise!(editor, fields, opts = {})
@editor = editor
@fields = fields.with_indifferent_access
@opts = opts
@@ -197,7 +197,7 @@ class PostRevisor
end
def topic_changed?
- PostRevisor.tracked_topic_fields.keys.any? {|f| @fields.has_key?(f)}
+ PostRevisor.tracked_topic_fields.keys.any? { |f| @fields.has_key?(f) }
end
def revise_post
@@ -253,15 +253,15 @@ class PostRevisor
# UserActionCreator will create new UserAction records for the new owner
UserAction.where(target_post_id: @post.id)
- .where(user_id: prev_owner.id)
- .where(action_type: USER_ACTIONS_TO_REMOVE)
- .destroy_all
+ .where(user_id: prev_owner.id)
+ .where(action_type: USER_ACTIONS_TO_REMOVE)
+ .destroy_all
if @post.post_number == 1
UserAction.where(target_topic_id: @post.topic_id)
- .where(user_id: prev_owner.id)
- .where(action_type: UserAction::NEW_TOPIC)
- .destroy_all
+ .where(user_id: prev_owner.id)
+ .where(action_type: UserAction::NEW_TOPIC)
+ .destroy_all
end
end
@@ -283,9 +283,9 @@ class PostRevisor
# post owner changed
if prev_owner && new_owner && prev_owner != new_owner
likes = UserAction.where(target_post_id: @post.id)
- .where(user_id: prev_owner.id)
- .where(action_type: UserAction::WAS_LIKED)
- .update_all(user_id: new_owner.id)
+ .where(user_id: prev_owner.id)
+ .where(action_type: UserAction::WAS_LIKED)
+ .update_all(user_id: new_owner.id)
private_message = @post.topic.private_message?
@@ -412,8 +412,8 @@ class PostRevisor
def is_last_post?
!Post.where(topic_id: @topic.id)
- .where("post_number > ?", @post.post_number)
- .exists?
+ .where("post_number > ?", @post.post_number)
+ .exists?
end
def plugin_callbacks
diff --git a/lib/pretty_text.rb b/lib/pretty_text.rb
index 8c74bd6fe1f..cfe191f5051 100644
--- a/lib/pretty_text.rb
+++ b/lib/pretty_text.rb
@@ -128,7 +128,7 @@ module PrettyText
end
end
- def self.markdown(text, opts={})
+ def self.markdown(text, opts = {})
# we use the exact same markdown converter as the client
# TODO: use the same extensions on both client and server (in particular the template for mentions)
baked = nil
@@ -165,7 +165,7 @@ module PrettyText
__optInput.customEmoji = #{custom_emoji.to_json};
__optInput.emojiUnicodeReplacer = __emojiUnicodeReplacer;
__optInput.lookupInlineOnebox = __lookupInlineOnebox;
- #{opts[:linkify] == false ? "__optInput.linkify = false;": ""}
+ #{opts[:linkify] == false ? "__optInput.linkify = false;" : ""}
__optInput.censoredWords = #{WordWatcher.words_for_action(:censor).join('|').to_json};
JS
@@ -179,7 +179,6 @@ module PrettyText
buffer << "__textOptions = __buildOptions(__optInput);\n"
-
buffer << ("__pt = new __PrettyText(__textOptions);")
# Be careful disabling sanitization. We allow for custom emails
@@ -225,7 +224,7 @@ module PrettyText
end
end
- def self.cook(text, opts={})
+ def self.cook(text, opts = {})
options = opts.dup
# we have a minor inconsistency
@@ -281,7 +280,7 @@ module PrettyText
if !uri.host.present? ||
uri.host == site_uri.host ||
uri.host.ends_with?("." << site_uri.host) ||
- whitelist.any?{|u| uri.host == u || uri.host.ends_with?("." << u)}
+ whitelist.any? { |u| uri.host == u || uri.host.ends_with?("." << u) }
# we are good no need for nofollow
else
l["rel"] = "nofollow noopener"
@@ -328,7 +327,7 @@ module PrettyText
links
end
- def self.excerpt(html, max_length, options={})
+ def self.excerpt(html, max_length, options = {})
# TODO: properly fix this HACK in ExcerptParser without introducing XSS
doc = Nokogiri::HTML.fragment(html)
strip_image_wrapping(doc)
@@ -342,7 +341,7 @@ module PrettyText
# If the user is not basic, strip links from their bio
fragment = Nokogiri::HTML.fragment(string)
- fragment.css('a').each {|a| a.replace(a.inner_html) }
+ fragment.css('a').each { |a| a.replace(a.inner_html) }
fragment.to_html
end
diff --git a/lib/pretty_text/helpers.rb b/lib/pretty_text/helpers.rb
index c9859e04ad7..38abc290922 100644
--- a/lib/pretty_text/helpers.rb
+++ b/lib/pretty_text/helpers.rb
@@ -11,7 +11,7 @@ module PrettyText
I18n.t(key)
else
str = I18n.t(key, Hash[opts.entries].symbolize_keys).dup
- opts.each { |k,v| str.gsub!("{{#{k.to_s}}}", v.to_s) }
+ opts.each { |k, v| str.gsub!("{{#{k.to_s}}}", v.to_s) }
str
end
end
diff --git a/lib/primary_group_lookup.rb b/lib/primary_group_lookup.rb
index c61bb1b7e5e..5f488dfedf9 100644
--- a/lib/primary_group_lookup.rb
+++ b/lib/primary_group_lookup.rb
@@ -1,5 +1,5 @@
class PrimaryGroupLookup
- def initialize(user_ids=[])
+ def initialize(user_ids = [])
@user_ids = user_ids.tap(&:compact!).tap(&:uniq!).tap(&:flatten!)
end
@@ -20,13 +20,13 @@ class PrimaryGroupLookup
def user_lookup_hash
users_with_primary_group = User.where(id: @user_ids)
- .where.not(primary_group_id: nil)
- .select(:id, :primary_group_id)
+ .where.not(primary_group_id: nil)
+ .select(:id, :primary_group_id)
group_lookup = {}
group_ids = users_with_primary_group.map(&:primary_group_id).compact
Group.where(id: group_ids).select(self.class.lookup_columns)
- .each { |g| group_lookup[g.id] = g }
+ .each { |g| group_lookup[g.id] = g }
hash = {}
users_with_primary_group.each do |u|
diff --git a/lib/promotion.rb b/lib/promotion.rb
index 82dd5a998cf..368032144d5 100644
--- a/lib/promotion.rb
+++ b/lib/promotion.rb
@@ -7,7 +7,6 @@ class Promotion
@user = user
end
-
# Review a user for a promotion. Delegates work to a review_#{trust_level} method.
# Returns true if the user was promoted, false otherwise.
def review
@@ -17,7 +16,6 @@ class Promotion
# Promotion beyond basic requires some expensive queries, so don't do that here.
return false if @user.trust_level >= TrustLevel[2]
-
review_method = :"review_tl#{@user.trust_level}"
return send(review_method) if respond_to?(review_method)
@@ -43,7 +41,7 @@ class Promotion
new_level = level
if new_level < old_level && !@user.trust_level_locked
- next_up = new_level+1
+ next_up = new_level + 1
key = "tl#{next_up}_met?"
if self.class.respond_to?(key) && self.class.send(key, @user)
raise Discourse::InvalidAccess.new, I18n.t('trust_levels.change_failed_explanation',
@@ -62,10 +60,10 @@ class Promotion
if admin
StaffActionLogger.new(admin).log_trust_level_change(@user, old_level, new_level)
else
- UserHistory.create!( action: UserHistory.actions[:auto_trust_level_change],
- target_user_id: @user.id,
- previous_value: old_level,
- new_value: new_level)
+ UserHistory.create!(action: UserHistory.actions[:auto_trust_level_change],
+ target_user_id: @user.id,
+ previous_value: old_level,
+ new_value: new_level)
end
@user.save!
@user.user_profile.recook_bio
@@ -77,7 +75,6 @@ class Promotion
true
end
-
def self.tl2_met?(user)
stat = user.user_stat
return false if stat.topics_entered < SiteSetting.tl2_requires_topics_entered
diff --git a/lib/rate_limiter.rb b/lib/rate_limiter.rb
index 0985db91162..59359af107e 100644
--- a/lib/rate_limiter.rb
+++ b/lib/rate_limiter.rb
@@ -72,7 +72,7 @@ class RateLimiter
arr = $redis.lrange(@key, 0, @max) || []
t0 = Time.now.to_i
- arr.reject! {|a| (t0 - a.to_i) > @secs}
+ arr.reject! { |a| (t0 - a.to_i) > @secs }
@max - arr.size
end
diff --git a/lib/rate_limiter/limit_exceeded.rb b/lib/rate_limiter/limit_exceeded.rb
index 787bcdd381b..0836ecd3a7e 100644
--- a/lib/rate_limiter/limit_exceeded.rb
+++ b/lib/rate_limiter/limit_exceeded.rb
@@ -4,7 +4,7 @@ class RateLimiter
class LimitExceeded < StandardError
attr_reader :type
- def initialize(available_in, type=nil)
+ def initialize(available_in, type = nil)
@available_in = available_in
@type = type
end
diff --git a/lib/rate_limiter/on_create_record.rb b/lib/rate_limiter/on_create_record.rb
index 4232ab9a7f8..14374de6a12 100644
--- a/lib/rate_limiter/on_create_record.rb
+++ b/lib/rate_limiter/on_create_record.rb
@@ -13,7 +13,7 @@ class RateLimiter
return @rate_limiter if @rate_limiter.present?
limit_key = "create_#{self.class.name.underscore}"
- max_setting = if user && user.new_user? and SiteSetting.has_setting?("rate_limit_new_user_#{limit_key}")
+ max_setting = if user && user.new_user? && SiteSetting.has_setting?("rate_limit_new_user_#{limit_key}")
SiteSetting.send("rate_limit_new_user_#{limit_key}")
else
SiteSetting.send("rate_limit_#{limit_key}")
@@ -31,7 +31,7 @@ class RateLimiter
end
module ClassMethods
- def rate_limit(limiter_method=nil)
+ def rate_limit(limiter_method = nil)
limiter_method = limiter_method || :default_rate_limiter
diff --git a/lib/s3_helper.rb b/lib/s3_helper.rb
index 7fbfcc8d10e..778808a7018 100644
--- a/lib/s3_helper.rb
+++ b/lib/s3_helper.rb
@@ -6,7 +6,7 @@ class S3Helper
attr_reader :s3_bucket_name
- def initialize(s3_upload_bucket, tombstone_prefix='', options={})
+ def initialize(s3_upload_bucket, tombstone_prefix = '', options = {})
@s3_options = default_s3_options.merge(options)
@s3_bucket_name, @s3_bucket_folder_path = begin
@@ -24,14 +24,14 @@ class S3Helper
check_missing_options
end
- def upload(file, path, options={})
+ def upload(file, path, options = {})
path = get_path_for_s3_upload(path)
obj = s3_bucket.object(path)
obj.upload_file(file, options)
path
end
- def remove(s3_filename, copy_to_tombstone=false)
+ def remove(s3_filename, copy_to_tombstone = false)
bucket = s3_bucket
# copy the file in tombstone
@@ -50,9 +50,8 @@ class S3Helper
return if @tombstone_prefix.blank?
# cf. http://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html
- s3_resource.client.put_bucket_lifecycle({
- bucket: @s3_bucket_name,
- lifecycle_configuration: {
+ s3_resource.client.put_bucket_lifecycle(bucket: @s3_bucket_name,
+ lifecycle_configuration: {
rules: [
{
id: "purge-tombstone",
@@ -61,8 +60,7 @@ class S3Helper
prefix: @tombstone_prefix
}
]
- }
- })
+ })
end
private
diff --git a/lib/scheduler/defer.rb b/lib/scheduler/defer.rb
index e055e7f9206..7b4abf7d64c 100644
--- a/lib/scheduler/defer.rb
+++ b/lib/scheduler/defer.rb
@@ -22,7 +22,7 @@ module Scheduler
@async = val
end
- def later(desc = nil, db=RailsMultisite::ConnectionManagement.current_db, &blk)
+ def later(desc = nil, db = RailsMultisite::ConnectionManagement.current_db, &blk)
if @async
start_thread unless (@thread && @thread.alive?) || @paused
@queue << [db, blk, desc]
@@ -43,7 +43,7 @@ module Scheduler
def do_all_work
while !@queue.empty?
- do_work(_non_block=true)
+ do_work(_non_block = true)
end
end
@@ -61,16 +61,16 @@ module Scheduler
end
# using non_block to match Ruby #deq
- def do_work(non_block=false)
+ def do_work(non_block = false)
db, job, desc = @queue.deq(non_block)
begin
RailsMultisite::ConnectionManagement.establish_connection(db: db) if db
job.call
rescue => ex
- Discourse.handle_job_exception(ex, {message: "Running deferred code '#{desc}'"})
+ Discourse.handle_job_exception(ex, message: "Running deferred code '#{desc}'")
end
rescue => ex
- Discourse.handle_job_exception(ex, {message: "Processing deferred code queue"})
+ Discourse.handle_job_exception(ex, message: "Processing deferred code queue")
ensure
ActiveRecord::Base.connection_handler.clear_active_connections!
end
diff --git a/lib/scheduler/manager.rb b/lib/scheduler/manager.rb
index 48466a6687c..6b6cf9fd0e9 100644
--- a/lib/scheduler/manager.rb
+++ b/lib/scheduler/manager.rb
@@ -42,13 +42,13 @@ module Scheduler
def keep_alive
@manager.keep_alive
rescue => ex
- Discourse.handle_job_exception(ex, {message: "Scheduling manager keep-alive"})
+ Discourse.handle_job_exception(ex, message: "Scheduling manager keep-alive")
end
def reschedule_orphans
@manager.reschedule_orphans!
rescue => ex
- Discourse.handle_job_exception(ex, {message: "Scheduling manager orphan rescheduler"})
+ Discourse.handle_job_exception(ex, message: "Scheduling manager orphan rescheduler")
end
def hostname
@@ -117,7 +117,7 @@ module Scheduler
@mutex.synchronize { info.write! }
end
rescue => ex
- Discourse.handle_job_exception(ex, {message: "Processing scheduled job queue"})
+ Discourse.handle_job_exception(ex, message: "Processing scheduled job queue")
ensure
@running = false
ActiveRecord::Base.connection_handler.clear_active_connections!
@@ -175,11 +175,11 @@ module Scheduler
end
- def self.without_runner(redis=nil)
+ def self.without_runner(redis = nil)
self.new(redis, skip_runner: true)
end
- def initialize(redis = nil, options=nil)
+ def initialize(redis = nil, options = nil)
@redis = $redis || redis
@random_ratio = 0.1
unless options && options[:skip_runner]
@@ -236,7 +236,7 @@ module Scheduler
end
end
- def reschedule_orphans_on!(hostname=nil)
+ def reschedule_orphans_on!(hostname = nil)
redis.zrange(Manager.queue_key(hostname), 0, -1).each do |key|
klass = get_klass(key)
next unless klass
@@ -264,7 +264,7 @@ module Scheduler
end
end
- def schedule_next_job(hostname=nil)
+ def schedule_next_job(hostname = nil)
(key, due), _ = redis.zrange Manager.queue_key(hostname), 0, 0, withscores: true
return unless key
@@ -310,7 +310,6 @@ module Scheduler
end
end
-
def self.discover_schedules
# hack for developemnt reloader is crazytown
# multiple classes with same name can be in
@@ -343,7 +342,7 @@ module Scheduler
"_scheduler_lock_"
end
- def self.queue_key(hostname=nil)
+ def self.queue_key(hostname = nil)
if hostname
"_scheduler_queue_#{hostname}_"
else
@@ -351,7 +350,7 @@ module Scheduler
end
end
- def self.schedule_key(klass,hostname=nil)
+ def self.schedule_key(klass, hostname = nil)
if hostname
"_scheduler_#{klass}_#{hostname}"
else
diff --git a/lib/scheduler/schedule.rb b/lib/scheduler/schedule.rb
index a00fe1330f4..05c8085bc1f 100644
--- a/lib/scheduler/schedule.rb
+++ b/lib/scheduler/schedule.rb
@@ -1,13 +1,13 @@
module Scheduler::Schedule
- def daily(options=nil)
+ def daily(options = nil)
if options
@daily = options
end
@daily
end
- def every(duration=nil)
+ def every(duration = nil)
if duration
@every = duration
if manager = Scheduler::Manager.current
diff --git a/lib/scheduler/web.rb b/lib/scheduler/web.rb
index 6d414ce8e91..e9d573ea442 100644
--- a/lib/scheduler/web.rb
+++ b/lib/scheduler/web.rb
@@ -15,8 +15,8 @@ module Scheduler
return unless duration
if duration < 1000
"#{duration}ms"
- elsif duration < 60*1000
- "#{'%.2f' % (duration/1000.0)} secs"
+ elsif duration < 60 * 1000
+ "#{'%.2f' % (duration / 1000.0)} secs"
end
end
end
@@ -24,7 +24,7 @@ module Scheduler
app.get "/scheduler" do
RailsMultisite::ConnectionManagement.with_connection("default") do
@manager = Scheduler::Manager.without_runner
- @schedules = Scheduler::Manager.discover_schedules.sort do |a,b|
+ @schedules = Scheduler::Manager.discover_schedules.sort do |a, b|
a_next = a.schedule_info.next_run
b_next = b.schedule_info.next_run
if a_next && b_next
@@ -35,13 +35,13 @@ module Scheduler
1
end
end
- erb File.read(File.join(VIEWS, 'scheduler.erb')), locals: {view_path: VIEWS}
+ erb File.read(File.join(VIEWS, 'scheduler.erb')), locals: { view_path: VIEWS }
end
end
app.get "/scheduler/history" do
@scheduler_stats = SchedulerStat.order('started_at desc').limit(200)
- erb File.read(File.join(VIEWS, 'history.erb')), locals: {view_path: VIEWS}
+ erb File.read(File.join(VIEWS, 'history.erb')), locals: { view_path: VIEWS }
end
app.post "/scheduler/:name/trigger" do
diff --git a/lib/score_calculator.rb b/lib/score_calculator.rb
index 8901c12e5ab..baf93cb457e 100644
--- a/lib/score_calculator.rb
+++ b/lib/score_calculator.rb
@@ -11,19 +11,18 @@ class ScoreCalculator
}
end
- def initialize(weightings=nil)
+ def initialize(weightings = nil)
@weightings = weightings || ScoreCalculator.default_score_weights
end
# Calculate the score for all posts based on the weightings
- def calculate(opts=nil)
+ def calculate(opts = nil)
update_posts_score(opts)
update_posts_rank(opts)
update_topics_rank(opts)
update_topics_percent_rank(opts)
end
-
private
def update_posts_score(opts)
@@ -110,7 +109,6 @@ SQL
posts_required: SiteSetting.summary_posts_required,
score_required: SiteSetting.summary_score_threshold)
-
filter_topics(builder, opts)
builder.exec
@@ -131,7 +129,6 @@ SQL
builder.exec
end
-
def filter_topics(builder, opts)
return builder unless opts
diff --git a/lib/screening_model.rb b/lib/screening_model.rb
index 26ed789c6c4..62cc0eb8a1a 100644
--- a/lib/screening_model.rb
+++ b/lib/screening_model.rb
@@ -24,7 +24,7 @@ module ScreeningModel
end
def action_name=(arg)
- raise ArgumentError.new("Invalid action type #{arg}") if arg.nil? or !self.class.actions.has_key?(arg.to_sym)
+ raise ArgumentError.new("Invalid action type #{arg}") if arg.nil? || !self.class.actions.has_key?(arg.to_sym)
self.action_type = self.class.actions[arg.to_sym]
end
diff --git a/lib/search.rb b/lib/search.rb
index 0edd4eecf7c..843127e8499 100644
--- a/lib/search.rb
+++ b/lib/search.rb
@@ -27,25 +27,25 @@ class Search
# base docker config
#
case SiteSetting.default_locale.to_sym
- when :da then 'danish'
- when :de then 'german'
- when :en then 'english'
- when :es then 'spanish'
- when :fr then 'french'
- when :it then 'italian'
- when :nl then 'dutch'
- when :nb_NO then 'norwegian'
- when :pt then 'portuguese'
- when :pt_BR then 'portuguese'
- when :sv then 'swedish'
- when :ru then 'russian'
+ when :da then 'danish'
+ when :de then 'german'
+ when :en then 'english'
+ when :es then 'spanish'
+ when :fr then 'french'
+ when :it then 'italian'
+ when :nl then 'dutch'
+ when :nb_NO then 'norwegian'
+ when :pt then 'portuguese'
+ when :pt_BR then 'portuguese'
+ when :sv then 'swedish'
+ when :ru then 'russian'
else 'simple' # use the 'simple' stemmer for other languages
end
end
def self.rebuild_problem_posts(limit = 10000)
posts = Post.joins(:topic)
- .where('posts.id IN (
+ .where('posts.id IN (
SELECT p2.id FROM posts p2
LEFT JOIN post_search_data pd ON locale = ? AND p2.id = pd.post_id
WHERE pd.post_id IS NULL
@@ -58,7 +58,7 @@ class Search
end
posts = Post.joins(:topic)
- .where('posts.id IN (
+ .where('posts.id IN (
SELECT p2.id FROM posts p2
LEFT JOIN topic_search_data pd ON locale = ? AND p2.topic_id = pd.topic_id
WHERE pd.topic_id IS NULL AND p2.post_number = 1
@@ -105,7 +105,7 @@ class Search
month = $2 ? $3.to_i : 1
day = $4 ? $5.to_i : 1
- return if day==0 || month==0 || day > 31 || month > 12
+ return if day == 0 || month == 0 || day > 31 || month > 12
return Time.zone.parse("#{year}-#{month}-#{day}") rescue nil
end
@@ -131,17 +131,16 @@ class Search
def self.min_post_id_no_cache
return 0 unless SiteSetting.search_prefer_recent_posts?
-
offset, has_more = Post.unscoped
- .order('id desc')
- .offset(SiteSetting.search_recent_posts_size-1)
- .limit(2)
- .pluck(:id)
+ .order('id desc')
+ .offset(SiteSetting.search_recent_posts_size - 1)
+ .limit(2)
+ .pluck(:id)
has_more ? offset : 0
end
- def self.min_post_id(opts=nil)
+ def self.min_post_id(opts = nil)
return 0 unless SiteSetting.search_prefer_recent_posts?
# It can be quite slow to count all the posts so let's cache it
@@ -153,7 +152,7 @@ class Search
attr_accessor :term
attr_reader :clean_term
- def initialize(term, opts=nil)
+ def initialize(term, opts = nil)
@opts = opts || {}
@guardian = @opts[:guardian] || Guardian.new
@search_context = @opts[:search_context]
@@ -195,7 +194,7 @@ class Search
@valid
end
- def self.execute(term, opts=nil)
+ def self.execute(term, opts = nil)
self.new(term, opts).execute
end
@@ -213,7 +212,7 @@ class Search
unless @filters.present? || @opts[:search_for_id]
min_length = @opts[:min_search_term_length] || SiteSetting.min_search_term_length
- terms = (@term || '').split(/\s(?=(?:[^"]|"[^"]*")*$)/).reject {|t| t.length < min_length }
+ terms = (@term || '').split(/\s(?=(?:[^"]|"[^"]*")*$)/).reject { |t| t.length < min_length }
if terms.blank?
@term = ''
@@ -240,7 +239,7 @@ class Search
@results
end
- def self.advanced_filter(trigger,&block)
+ def self.advanced_filter(trigger, &block)
(@advanced_filters ||= {})[trigger] = block
end
@@ -292,11 +291,11 @@ class Search
end
end
- advanced_filter(/in:wiki/) do |posts,match|
+ advanced_filter(/in:wiki/) do |posts, match|
posts.where(wiki: true)
end
- advanced_filter(/badge:(.*)/) do |posts,match|
+ advanced_filter(/badge:(.*)/) do |posts, match|
badge_id = Badge.where('name ilike ? OR id = ?', match, match.to_i).pluck(:id).first
if badge_id
posts.where('posts.user_id IN (SELECT ub.user_id FROM user_badges ub WHERE ub.badge_id = ?)', badge_id)
@@ -323,7 +322,7 @@ class Search
posts.where("posts.user_id = #{@guardian.user.id}") if @guardian.user
end
- advanced_filter(/in:(watching|tracking)/) do |posts,match|
+ advanced_filter(/in:(watching|tracking)/) do |posts, match|
if @guardian.user
level = TopicUser.notification_levels[match.to_sym]
posts.where("posts.topic_id IN (
@@ -358,7 +357,7 @@ class Search
end
end
- advanced_filter(/category:(.+)/) do |posts,match|
+ advanced_filter(/category:(.+)/) do |posts, match|
exact = false
if match[0] == "="
@@ -381,7 +380,7 @@ class Search
end
end
- advanced_filter(/^\#([a-zA-Z0-9\-:=]+)/) do |posts,match|
+ advanced_filter(/^\#([a-zA-Z0-9\-:=]+)/) do |posts, match|
exact = true
@@ -422,7 +421,7 @@ class Search
end
end
- advanced_filter(/group:(.+)/) do |posts,match|
+ advanced_filter(/group:(.+)/) do |posts, match|
group_id = Group.where('name ilike ? OR (id = ? AND id > 0)', match, match.to_i).pluck(:id).first
if group_id
posts.where("posts.user_id IN (select gu.user_id from group_users gu where gu.group_id = ?)", group_id)
@@ -431,7 +430,7 @@ class Search
end
end
- advanced_filter(/user:(.+)/) do |posts,match|
+ advanced_filter(/user:(.+)/) do |posts, match|
user_id = User.where(staged: false).where('username_lower = ? OR id = ?', match.downcase, match.to_i).pluck(:id).first
if user_id
posts.where("posts.user_id = #{user_id}")
@@ -440,7 +439,7 @@ class Search
end
end
- advanced_filter(/^\@([a-zA-Z0-9_\-.]+)/) do |posts,match|
+ advanced_filter(/^\@([a-zA-Z0-9_\-.]+)/) do |posts, match|
user_id = User.where(staged: false).where(username_lower: match.downcase).pluck(:id).first
if user_id
posts.where("posts.user_id = #{user_id}")
@@ -449,7 +448,7 @@ class Search
end
end
- advanced_filter(/before:(.*)/) do |posts,match|
+ advanced_filter(/before:(.*)/) do |posts, match|
if date = Search.word_to_date(match)
posts.where("posts.created_at < ?", date)
else
@@ -457,7 +456,7 @@ class Search
end
end
- advanced_filter(/after:(.*)/) do |posts,match|
+ advanced_filter(/after:(.*)/) do |posts, match|
if date = Search.word_to_date(match)
posts.where("posts.created_at > ?", date)
else
@@ -490,16 +489,15 @@ class Search
private
-
def process_advanced_search!(term)
- term.to_s.scan(/(([^" \t\n\x0B\f\r]+)?(("[^"]+")?))/).to_a.map do |(word,_)|
+ term.to_s.scan(/(([^" \t\n\x0B\f\r]+)?(("[^"]+")?))/).to_a.map do |(word, _)|
next if word.blank?
found = false
Search.advanced_filters.each do |matcher, block|
- cleaned = word.gsub(/["']/,"")
+ cleaned = word.gsub(/["']/, "")
if cleaned =~ matcher
(@filters ||= []) << [block, $1]
found = true
@@ -539,7 +537,6 @@ class Search
end.compact.join(' ')
end
-
def find_grouped_results
if @results.type_filter.present?
@@ -600,11 +597,11 @@ class Search
secure_category_ids
categories = Category.includes(:category_search_data)
- .where("category_search_data.search_data @@ #{ts_query}")
- .references(:category_search_data)
- .order("topics_month DESC")
- .secured(@guardian)
- .limit(@limit)
+ .where("category_search_data.search_data @@ #{ts_query}")
+ .references(:category_search_data)
+ .order("topics_month DESC")
+ .secured(@guardian)
+ .limit(@limit)
categories.each do |category|
@results.add(category)
@@ -615,37 +612,37 @@ class Search
return if SiteSetting.hide_user_profiles_from_public && !@guardian.user
users = User.includes(:user_search_data)
- .references(:user_search_data)
- .where(active: true)
- .where(staged: false)
- .where("user_search_data.search_data @@ #{ts_query("simple")}")
- .order("CASE WHEN username_lower = '#{@original_term.downcase}' THEN 0 ELSE 1 END")
- .order("last_posted_at DESC")
- .limit(@limit)
+ .references(:user_search_data)
+ .where(active: true)
+ .where(staged: false)
+ .where("user_search_data.search_data @@ #{ts_query("simple")}")
+ .order("CASE WHEN username_lower = '#{@original_term.downcase}' THEN 0 ELSE 1 END")
+ .order("last_posted_at DESC")
+ .limit(@limit)
users.each do |user|
@results.add(user)
end
end
- def posts_query(limit, opts=nil)
+ def posts_query(limit, opts = nil)
opts ||= {}
posts = Post.where(post_type: Topic.visible_post_types(@guardian.user))
- .joins(:post_search_data, :topic)
- .joins("LEFT JOIN categories ON categories.id = topics.category_id")
- .where("topics.deleted_at" => nil)
- .where("topics.visible")
+ .joins(:post_search_data, :topic)
+ .joins("LEFT JOIN categories ON categories.id = topics.category_id")
+ .where("topics.deleted_at" => nil)
+ .where("topics.visible")
is_topic_search = @search_context.present? && @search_context.is_a?(Topic)
if opts[:private_messages] || (is_topic_search && @search_context.private_message?)
- posts = posts.where("topics.archetype = ?", Archetype.private_message)
+ posts = posts.where("topics.archetype = ?", Archetype.private_message)
unless @guardian.is_admin?
posts = posts.private_posts_for_user(@guardian.user)
end
else
- posts = posts.where("topics.archetype <> ?", Archetype.private_message)
+ posts = posts.where("topics.archetype <> ?", Archetype.private_message)
end
if @term.present?
@@ -696,7 +693,7 @@ class Search
posts = posts.where("topics.category_id in (?)", category_ids)
elsif @search_context.is_a?(Topic)
posts = posts.where("topics.id = #{@search_context.id}")
- .order("posts.post_number #{@order == :latest ? "DESC" : ""}")
+ .order("posts.post_number #{@order == :latest ? "DESC" : ""}")
end
end
@@ -767,11 +764,11 @@ class Search
t.split(/[\)\(&']/)[0]
end.compact!
- query = Post.sanitize(all_terms.map {|t| "'#{PG::Connection.escape_string(t)}':*"}.join(" #{joiner} "))
+ query = Post.sanitize(all_terms.map { |t| "'#{PG::Connection.escape_string(t)}':*" }.join(" #{joiner} "))
"TO_TSQUERY(#{locale || query_locale}, #{query})"
end
- def ts_query(locale=nil)
+ def ts_query(locale = nil)
@ts_query_cache ||= {}
@ts_query_cache[(locale || query_locale) + " " + @term] ||= Search.ts_query(@term, locale)
end
@@ -825,7 +822,7 @@ class Search
end
if added < @limit
- aggregate_posts(post_sql[:remaining]).each {|p| @results.add(p) }
+ aggregate_posts(post_sql[:remaining]).each { |p| @results.add(p) }
end
end
diff --git a/lib/search/grouped_search_results.rb b/lib/search/grouped_search_results.rb
index d6677155c28..90ca05f229f 100644
--- a/lib/search/grouped_search_results.rb
+++ b/lib/search/grouped_search_results.rb
@@ -57,8 +57,7 @@ class Search
end
end
-
- def self.blurb_for(cooked, term=nil, blurb_length=200)
+ def self.blurb_for(cooked, term = nil, blurb_length = 200)
cooked = SearchIndexer::HtmlScrubber.scrub(cooked).squish
blurb = nil
diff --git a/lib/secure_session.rb b/lib/secure_session.rb
index bbe9a71833e..ecb46a6f67e 100644
--- a/lib/secure_session.rb
+++ b/lib/secure_session.rb
@@ -8,7 +8,7 @@ class SecureSession
$redis.get("#{@prefix}#{key}")
end
- def []=(key,val)
+ def []=(key, val)
if val == nil
$redis.del("#{@prefix}#{key}")
else
diff --git a/lib/single_sign_on.rb b/lib/single_sign_on.rb
index b8a20a80eb8..7578a8aabed 100644
--- a/lib/single_sign_on.rb
+++ b/lib/single_sign_on.rb
@@ -43,7 +43,7 @@ class SingleSignOn
sso.send("#{k}=", val)
end
- decoded_hash.each do |k,v|
+ decoded_hash.each do |k, v|
if field = k[/^custom\.(.+)$/, 1]
sso.custom_fields[field] = v
end
@@ -72,7 +72,7 @@ class SingleSignOn
OpenSSL::HMAC.hexdigest("sha256", sso_secret, payload)
end
- def to_url(base_url=nil)
+ def to_url(base_url = nil)
base = "#{base_url || sso_url}"
"#{base}#{base.include?('?') ? '&' : '?'}#{payload}"
end
@@ -86,7 +86,7 @@ class SingleSignOn
payload = {}
ACCESSORS.each do |k|
- next if (val = send k) == nil
+ next if (val = send k) == nil
payload[k] = val
end
diff --git a/lib/site_setting_extension.rb b/lib/site_setting_extension.rb
index 99ab174d22d..5b9fb8987d6 100644
--- a/lib/site_setting_extension.rb
+++ b/lib/site_setting_extension.rb
@@ -169,13 +169,13 @@ module SiteSettingExtension
end
def client_settings_json_uncached
- MultiJson.dump(Hash[*@client_settings.map{|n| [n, self.send(n)]}.flatten])
+ MultiJson.dump(Hash[*@client_settings.map { |n| [n, self.send(n)] }.flatten])
end
# Retrieve all settings
- def all_settings(include_hidden=false)
+ def all_settings(include_hidden = false)
@defaults
- .reject{|s, _| hidden_settings.include?(s) && !include_hidden}
+ .reject { |s, _| hidden_settings.include?(s) && !include_hidden }
.map do |s, v|
value = send(s)
type = types[get_data_type(s, value)]
@@ -190,9 +190,9 @@ module SiteSettingExtension
}
if type == :enum && enum_class(s)
- opts.merge!({valid_values: enum_class(s).values, translate_names: enum_class(s).translate_names?})
+ opts.merge!(valid_values: enum_class(s).values, translate_names: enum_class(s).translate_names?)
elsif type == :enum
- opts.merge!({valid_values: choices[s].map{|c| {name: c, value: c}}, translate_names: false})
+ opts.merge!(valid_values: choices[s].map { |c| { name: c, value: c } }, translate_names: false)
end
opts[:textarea] = true if static_types[s] == :textarea
@@ -219,7 +219,7 @@ module SiteSettingExtension
ensure_listen_for_changes
old = current
- new_hash = Hash[*(provider.all.map { |s|
+ new_hash = Hash[*(provider.all.map { |s|
[s.name.intern, convert(s.value, s.data_type, s.name)]
}.to_a.flatten)]
@@ -325,11 +325,11 @@ module SiteSettingExtension
end
def notify_changed!
- MessageBus.publish('/site_settings', {process: process_id})
+ MessageBus.publish('/site_settings', process: process_id)
end
def notify_clients!(name)
- MessageBus.publish('/client_settings', {name: name, value: self.send(name)})
+ MessageBus.publish('/client_settings', name: name, value: self.send(name))
end
def has_setting?(name)
@@ -371,7 +371,7 @@ module SiteSettingExtension
end
end
- def set_and_log(name, value, user=Discourse.system_user)
+ def set_and_log(name, value, user = Discourse.system_user)
prev_value = send(name)
set(name, value)
StaffActionLogger.new(user).log_site_setting_change(name, prev_value, value) if has_setting?(name)
@@ -389,14 +389,14 @@ module SiteSettingExtension
deletions = []
new_hash.each do |name, value|
- changes << [name,value] if !old.has_key?(name) || old[name] != value
+ changes << [name, value] if !old.has_key?(name) || old[name] != value
end
- old.each do |name,value|
- deletions << [name,value] unless new_hash.has_key?(name)
+ old.each do |name, value|
+ deletions << [name, value] unless new_hash.has_key?(name)
end
- [changes,deletions]
+ [changes, deletions]
end
def get_data_type(name, val)
diff --git a/lib/site_settings/db_provider.rb b/lib/site_settings/db_provider.rb
index 7757299fbd7..4410e05eeef 100644
--- a/lib/site_settings/db_provider.rb
+++ b/lib/site_settings/db_provider.rb
@@ -33,8 +33,8 @@ class SiteSettings::DbProvider
model ||= @model.new
model.name = name
- model.value = value
- model.data_type = data_type
+ model.value = value
+ model.data_type = data_type
# save! used to ensure after_commit is called
model.save!
diff --git a/lib/slug.rb b/lib/slug.rb
index 0f3b62b3f07..5ee570198ee 100644
--- a/lib/slug.rb
+++ b/lib/slug.rb
@@ -5,11 +5,12 @@ module Slug
CHAR_FILTER_REGEXP = /[:\/\?#\[\]@!\$&'\(\)\*\+,;=_\.~%\\`^\s|\{\}"<>]+/ # :/?#[]@!$&'()*+,;=_.~%\`^|{}"<>
def self.for(string, default = 'topic')
- slug = case (SiteSetting.slug_generation_method || :ascii).to_sym
- when :ascii then self.ascii_generator(string)
- when :encoded then self.encoded_generator(string)
- when :none then self.none_generator(string)
- end
+ slug =
+ case (SiteSetting.slug_generation_method || :ascii).to_sym
+ when :ascii then self.ascii_generator(string)
+ when :encoded then self.encoded_generator(string)
+ when :none then self.none_generator(string)
+ end
# Reject slugs that only contain numbers, because they would be indistinguishable from id's.
slug = (slug =~ /[^\d]/ ? slug : '')
slug.blank? ? default : slug
@@ -23,8 +24,8 @@ module Slug
def self.ascii_generator(string)
string.tr("'", "")
- .parameterize
- .tr("_", "-")
+ .parameterize
+ .tr("_", "-")
end
def self.encoded_generator(string)
@@ -32,10 +33,10 @@ module Slug
# including reserved characters from RFC3986.
# See also URI::REGEXP::PATTERN.
string.strip
- .gsub(/\s+/, '-')
- .gsub(CHAR_FILTER_REGEXP, '')
- .gsub(/\A-+|-+\z/, '') # remove possible trailing and preceding dashes
- .squeeze('-') # squeeze continuous dashes to prettify slug
+ .gsub(/\s+/, '-')
+ .gsub(CHAR_FILTER_REGEXP, '')
+ .gsub(/\A-+|-+\z/, '') # remove possible trailing and preceding dashes
+ .squeeze('-') # squeeze continuous dashes to prettify slug
end
def self.none_generator(string)
diff --git a/lib/source_url.rb b/lib/source_url.rb
index 41d4fe5decc..90a4391f5b1 100644
--- a/lib/source_url.rb
+++ b/lib/source_url.rb
@@ -6,7 +6,7 @@ class SourceURL < Tilt::Template
source = input[:data]
context = input[:environment].context_class.new(input)
- result = new(filename){source}.render(context)
+ result = new(filename) { source }.render(context)
context.metadata.merge(data: result)
end
diff --git a/lib/spam_handler.rb b/lib/spam_handler.rb
index b14532c27d6..2b8253512c3 100644
--- a/lib/spam_handler.rb
+++ b/lib/spam_handler.rb
@@ -4,15 +4,15 @@ class SpamHandler
return false if SiteSetting.max_new_accounts_per_registration_ip <= 0
tl2_plus_accounts_with_same_ip = User.where("trust_level >= ?", TrustLevel[2])
- .where(ip_address: ip_address.to_s)
- .count
+ .where(ip_address: ip_address.to_s)
+ .count
return false if tl2_plus_accounts_with_same_ip > 0
staff_user_ids = Group[:staff].user_ids - [-1]
staff_members_with_same_ip = User.where(id: staff_user_ids)
- .where(ip_address: ip_address.to_s)
- .count
+ .where(ip_address: ip_address.to_s)
+ .count
return false if staff_members_with_same_ip > 0
@@ -20,9 +20,9 @@ class SpamHandler
return false if ip_whitelisted
tl0_accounts_with_same_ip = User.unscoped
- .where(trust_level: TrustLevel[0])
- .where(ip_address: ip_address.to_s)
- .count
+ .where(trust_level: TrustLevel[0])
+ .where(ip_address: ip_address.to_s)
+ .count
tl0_accounts_with_same_ip >= SiteSetting.max_new_accounts_per_registration_ip
end
diff --git a/lib/sql_builder.rb b/lib/sql_builder.rb
index 70e461095c3..35598c57232 100644
--- a/lib/sql_builder.rb
+++ b/lib/sql_builder.rb
@@ -1,13 +1,13 @@
class SqlBuilder
- def initialize(template,klass=nil)
+ def initialize(template, klass = nil)
@args = {}
@sql = template
@sections = {}
@klass = klass
end
- [:set, :where2,:where,:order_by,:limit,:left_join,:join,:offset, :select].each do |k|
+ [:set, :where2, :where, :order_by, :limit, :left_join, :join, :offset, :select].each do |k|
define_method k do |data, args = {}|
@args.merge!(args)
@sections[k] ||= []
@@ -18,7 +18,7 @@ class SqlBuilder
def secure_category(secure_category_ids, category_alias = 'c')
if secure_category_ids.present?
- where("NOT COALESCE(" << category_alias << ".read_restricted, false) OR " << category_alias << ".id IN (:secure_category_ids)", secure_category_ids: secure_category_ids)
+ where("NOT COALESCE(" << category_alias << ".read_restricted, false) OR " << category_alias << ".id IN (:secure_category_ids)", secure_category_ids: secure_category_ids)
else
where("NOT COALESCE(" << category_alias << ".read_restricted, false)")
end
@@ -28,17 +28,17 @@ class SqlBuilder
def to_sql
sql = @sql.dup
- @sections.each do |k,v|
+ @sections.each do |k, v|
joined = nil
case k
when :select
joined = "SELECT " << v.join(" , ")
when :where, :where2
- joined = "WHERE " << v.map{|c| "(" << c << ")" }.join(" AND ")
+ joined = "WHERE " << v.map { |c| "(" << c << ")" }.join(" AND ")
when :join
- joined = v.map{|item| "JOIN " << item }.join("\n")
+ joined = v.map { |item| "JOIN " << item }.join("\n")
when :left_join
- joined = v.map{|item| "LEFT JOIN " << item }.join("\n")
+ joined = v.map { |item| "LEFT JOIN " << item }.join("\n")
when :limit
joined = "LIMIT " << v.last.to_s
when :offset
@@ -64,7 +64,7 @@ class SqlBuilder
if @args == {}
ActiveRecord::Base.exec_sql(sql)
else
- ActiveRecord::Base.exec_sql(sql,@args)
+ ActiveRecord::Base.exec_sql(sql, @args)
end
end
end
@@ -74,7 +74,7 @@ class SqlBuilder
end
class RailsDateTimeDecoder < PG::SimpleDecoder
- def decode(string, tuple=nil, field=nil)
+ def decode(string, tuple = nil, field = nil)
if Rails.version >= "4.2.0"
@caster ||= ActiveRecord::Type::DateTime.new
@caster.type_cast_from_database(string)
@@ -84,14 +84,13 @@ class SqlBuilder
end
end
-
class ActiveRecordTypeMap < PG::BasicTypeMapForResults
def initialize(connection)
super(connection)
rm_coder 0, 1114
add_coder RailsDateTimeDecoder.new(name: "timestamp", oid: 1114, format: 0)
- # we don't need deprecations
- self.default_type_map = PG::TypeMapInRuby.new
+ # we don't need deprecations
+ self.default_type_map = PG::TypeMapInRuby.new
end
end
diff --git a/lib/stats_socket.rb b/lib/stats_socket.rb
index 337bc7b058a..e1afc677baf 100644
--- a/lib/stats_socket.rb
+++ b/lib/stats_socket.rb
@@ -16,7 +16,7 @@ class StatsSocket < SocketServer
when "v8_stat"
stats = {}
ObjectSpace.each_object(MiniRacer::Context) do |context|
- context.heap_stats.each do |k,v|
+ context.heap_stats.each do |k, v|
stats[k] = (stats[k] || 0) + v
end
end
diff --git a/lib/stylesheet/compiler.rb b/lib/stylesheet/compiler.rb
index e6a7530b88b..e886c6bdcef 100644
--- a/lib/stylesheet/compiler.rb
+++ b/lib/stylesheet/compiler.rb
@@ -15,7 +15,7 @@ module Stylesheet
footer:after { content: '#{error}' }"
end
- def self.compile_asset(asset, options={})
+ def self.compile_asset(asset, options = {})
if Importer.special_imports[asset.to_s]
filename = "theme.scss"
@@ -26,12 +26,12 @@ module Stylesheet
file = File.read path
end
- compile(file,filename,options)
+ compile(file, filename, options)
end
- def self.compile(stylesheet, filename, options={})
- source_map_file = options[:source_map_file] || "#{filename.sub(".scss","")}.css.map";
+ def self.compile(stylesheet, filename, options = {})
+ source_map_file = options[:source_map_file] || "#{filename.sub(".scss", "")}.css.map";
engine = SassC::Engine.new(stylesheet,
importer: Importer,
@@ -44,7 +44,6 @@ module Stylesheet
theme_field: options[:theme_field],
load_paths: [ASSET_ROOT])
-
result = engine.render
if options[:rtl]
diff --git a/lib/stylesheet/manager.rb b/lib/stylesheet/manager.rb
index ebceac32698..85cd6bd0833 100644
--- a/lib/stylesheet/manager.rb
+++ b/lib/stylesheet/manager.rb
@@ -16,7 +16,7 @@ class Stylesheet::Manager
end
def self.clear_theme_cache!
- cache.hash.keys.select{|k| k =~ /theme/}.each{|k|cache.delete(k)}
+ cache.hash.keys.select { |k| k =~ /theme/ }.each { |k|cache.delete(k) }
end
def self.stylesheet_href(target = :desktop, theme_key = :missing)
@@ -54,9 +54,9 @@ class Stylesheet::Manager
end
def self.precompile_css
- themes = Theme.where('user_selectable OR key = ?', SiteSetting.default_theme_key).pluck(:key,:name)
+ themes = Theme.where('user_selectable OR key = ?', SiteSetting.default_theme_key).pluck(:key, :name)
themes << nil
- themes.each do |key,name|
+ themes.each do |key, name|
[:desktop, :mobile, :desktop_rtl, :mobile_rtl].each do |target|
theme_key = key || SiteSetting.default_theme_key
cache_key = "#{target}_#{theme_key}"
@@ -104,7 +104,7 @@ class Stylesheet::Manager
@theme_key = theme_key
end
- def compile(opts={})
+ def compile(opts = {})
unless opts[:force]
if File.exists?(stylesheet_fullpath)
unless StylesheetCache.where(target: qualified_target, digest: digest).exists?
@@ -120,7 +120,7 @@ class Stylesheet::Manager
end
rtl = @target.to_s =~ /_rtl$/
- css,source_map = begin
+ css, source_map = begin
Stylesheet::Compiler.compile_asset(
@target,
rtl: rtl,
@@ -216,7 +216,7 @@ class Stylesheet::Manager
end
def stylesheet_filename_no_digest
- stylesheet_filename(_with_digest=false)
+ stylesheet_filename(_with_digest = false)
end
def is_theme?
diff --git a/lib/stylesheet/watcher.rb b/lib/stylesheet/watcher.rb
index 138d750fd60..e7c9a5ab9b1 100644
--- a/lib/stylesheet/watcher.rb
+++ b/lib/stylesheet/watcher.rb
@@ -3,7 +3,7 @@ require 'listen'
module Stylesheet
class Watcher
- def self.watch(paths=nil)
+ def self.watch(paths = nil)
watcher = new(paths)
watcher.start
watcher
@@ -26,7 +26,6 @@ module Stylesheet
end
end
-
root = Rails.root.to_s
@paths.each do |watch|
Thread.new do
@@ -34,7 +33,7 @@ module Stylesheet
listener = Listen.to("#{root}/#{watch}", ignore: /xxxx/) do |modified, added, _|
paths = [modified, added].flatten
paths.compact!
- paths.map!{|long| long[(root.length+1)..-1]}
+ paths.map! { |long| long[(root.length + 1)..-1] }
process_change(paths)
end
rescue => e
@@ -55,7 +54,7 @@ module Stylesheet
Stylesheet::Manager.cache.clear
message = ["desktop", "mobile", "admin"].map do |name|
- {target: name, new_href: Stylesheet::Manager.stylesheet_href(name.to_sym) , theme_key: SiteSetting.default_theme_key}
+ { target: name, new_href: Stylesheet::Manager.stylesheet_href(name.to_sym) , theme_key: SiteSetting.default_theme_key }
end
MessageBus.publish '/file-change', message
diff --git a/lib/suggested_topics_builder.rb b/lib/suggested_topics_builder.rb
index 9436bb5c5a9..cd857875b16 100644
--- a/lib/suggested_topics_builder.rb
+++ b/lib/suggested_topics_builder.rb
@@ -11,15 +11,14 @@ class SuggestedTopicsBuilder
@results = []
end
-
- def add_results(results, priority=:low)
+ def add_results(results, priority = :low)
# WARNING .blank? will execute an Active Record query
return unless results
# Only add results if we don't have those topic ids already
results = results.where('topics.id NOT IN (?)', @excluded_topic_ids)
- .where(visible: true)
+ .where(visible: true)
# If limit suggested to category is enabled, restrict to that category
if @category_id && SiteSetting.limit_suggested_to_category?
@@ -29,8 +28,8 @@ class SuggestedTopicsBuilder
unless results.empty?
# Keep track of the ids we've added
- @excluded_topic_ids.concat results.map {|r| r.id}
- splice_results(results,priority)
+ @excluded_topic_ids.concat results.map { |r| r.id }
+ splice_results(results, priority)
end
end
@@ -40,7 +39,7 @@ class SuggestedTopicsBuilder
# Topics from category @category_id need to be first in the list, all others after.
other_category_index = @results.index { |r| r.category_id != @category_id }
- category_results, other_category_results = results.partition{ |r| r.category_id == @category_id }
+ category_results, other_category_results = results.partition { |r| r.category_id == @category_id }
if other_category_index
@results.insert other_category_index, *category_results
@@ -66,7 +65,7 @@ class SuggestedTopicsBuilder
end
def category_results_left
- SiteSetting.suggested_topics - @results.count{|r| r.category_id == @category_id}
+ SiteSetting.suggested_topics - @results.count { |r| r.category_id == @category_id }
end
def size
diff --git a/lib/table_migration_helper.rb b/lib/table_migration_helper.rb
index 4d0308341bc..605555d49f8 100644
--- a/lib/table_migration_helper.rb
+++ b/lib/table_migration_helper.rb
@@ -45,7 +45,7 @@ SQL
new_name: new_name,
delay: "#{delay.to_i || 0} seconds",
after_migration: after_migration).to_a.length > 0
- on_drop&.call
+ on_drop&.call
ActiveRecord::Base.exec_sql("DROP TABLE #{old_name}")
end
diff --git a/lib/tasks/add_topic_to_quotes.rake b/lib/tasks/add_topic_to_quotes.rake
index 51d1cf2edd8..ff36e46bf06 100644
--- a/lib/tasks/add_topic_to_quotes.rake
+++ b/lib/tasks/add_topic_to_quotes.rake
@@ -6,4 +6,3 @@ task "add_topic_to_quotes" => :environment do
Post.update_all ["raw = ?, cooked = ?", new_raw, new_cooked], ["id = ?", p.id]
end
end
-
diff --git a/lib/tasks/admin.rake b/lib/tasks/admin.rake
index cd7e40d39fa..c57e03b7859 100644
--- a/lib/tasks/admin.rake
+++ b/lib/tasks/admin.rake
@@ -1,6 +1,6 @@
desc "invite an admin to this discourse instance"
-task "admin:invite", [:email] => [:environment] do |_,args|
+task "admin:invite", [:email] => [:environment] do |_, args|
email = args[:email]
if !email || email !~ /@/
puts "ERROR: Expecting rake admin:invite[some@email.com]"
@@ -20,7 +20,7 @@ task "admin:invite", [:email] => [:environment] do |_,args|
puts "Granting admin!"
user.grant_admin!
user.change_trust_level!(4)
- user.email_tokens.update_all confirmed: true
+ user.email_tokens.update_all confirmed: true
puts "Sending email!"
email_token = user.email_tokens.create(email: user.email)
@@ -42,8 +42,8 @@ task "admin:create" => :environment do
reset_password = ask("User with this email already exists! Do you want to reset the password for this email? (Y/n) ")
if (reset_password == "" || reset_password.downcase == 'y')
begin
- password = ask("Password: ") {|q| q.echo = false}
- password_confirmation = ask("Repeat password: ") {|q| q.echo = false}
+ password = ask("Password: ") { |q| q.echo = false }
+ password_confirmation = ask("Repeat password: ") { |q| q.echo = false }
end while password != password_confirmation
admin.password = password
end
@@ -53,8 +53,8 @@ task "admin:create" => :environment do
admin.email = email
admin.username = UserNameSuggester.suggest(admin.email)
begin
- password = ask("Password: ") {|q| q.echo = false}
- password_confirmation = ask("Repeat password: ") {|q| q.echo = false}
+ password = ask("Password: ") { |q| q.echo = false }
+ password_confirmation = ask("Repeat password: ") { |q| q.echo = false }
end while password != password_confirmation
admin.password = password
end
@@ -82,7 +82,7 @@ task "admin:create" => :environment do
if (grant_admin == "" || grant_admin.downcase == 'y')
admin.grant_admin!
admin.change_trust_level!(4)
- admin.email_tokens.update_all confirmed: true
+ admin.email_tokens.update_all confirmed: true
admin.activate
say("\nYour account now has Admin privileges!")
diff --git a/lib/tasks/api.rake b/lib/tasks/api.rake
index ef42e8a7bd4..5a4ef6c85e0 100644
--- a/lib/tasks/api.rake
+++ b/lib/tasks/api.rake
@@ -1,6 +1,6 @@
desc "generate api key if missing, return existing if already there"
task "api_key:get" => :environment do
- api_key = ApiKey.create_master_key
+ api_key = ApiKey.create_master_key
puts api_key.key
end
diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake
index 57235096c16..9029f9cf4b5 100644
--- a/lib/tasks/assets.rake
+++ b/lib/tasks/assets.rake
@@ -71,10 +71,10 @@ def assets_path
"#{Rails.root}/public/assets"
end
-def compress_node(from,to)
+def compress_node(from, to)
to_path = "#{assets_path}/#{to}"
assets = cdn_relative_path("/assets")
- source_map_root = assets + ((d=File.dirname(from)) == "." ? "" : "/#{d}")
+ source_map_root = assets + ((d = File.dirname(from)) == "." ? "" : "/#{d}")
source_map_url = cdn_path "/assets/#{to}.map"
cmd = "uglifyjs '#{assets_path}/#{from}' -p relative -c -m -o '#{to_path}' --source-map-root '#{source_map_root}' --source-map '#{assets_path}/#{to}.map' --source-map-url '#{source_map_url}'"
@@ -89,7 +89,7 @@ def compress_node(from,to)
result
end
-def compress_ruby(from,to)
+def compress_ruby(from, to)
data = File.read("#{assets_path}/#{from}")
uglified, map = Uglifier.new(comments: :none,
@@ -99,7 +99,7 @@ def compress_ruby(from,to)
output_filename: File.basename(to)
}
)
- .compile_with_map(data)
+ .compile_with_map(data)
dest = "#{assets_path}/#{to}"
File.write(dest, uglified << "\n//# sourceMappingURL=#{cdn_path "/assets/#{to}.map"}")
@@ -121,11 +121,11 @@ def brotli(path)
end
end
-def compress(from,to)
+def compress(from, to)
if $node_uglify
- compress_node(from,to)
+ compress_node(from, to)
else
- compress_ruby(from,to)
+ compress_ruby(from, to)
end
end
@@ -148,10 +148,10 @@ task 'assets:precompile' => 'assets:precompile:before' do
concurrent? do |proc|
to_skip = Rails.configuration.assets.skip_minification || []
manifest.files
- .select{|k,v| k =~ /\.js$/}
- .each do |file, info|
+ .select { |k, v| k =~ /\.js$/ }
+ .each do |file, info|
- path = "#{assets_path}/#{file}"
+ path = "#{assets_path}/#{file}"
_file = (d = File.dirname(file)) == "." ? "_#{file}" : "#{d}/_#{File.basename(file)}"
_path = "#{assets_path}/#{_file}"
@@ -164,7 +164,7 @@ task 'assets:precompile' => 'assets:precompile:before' do
# We can specify some files to never minify
unless (ENV["DONT_MINIFY"] == "1") || to_skip.include?(info['logical_path'])
FileUtils.mv(path, _path)
- compress(_file,file)
+ compress(_file, file)
end
info["size"] = File.size(path)
diff --git a/lib/tasks/auto_annotate_models.rake b/lib/tasks/auto_annotate_models.rake
index dde0cc03644..617f473c9b6 100644
--- a/lib/tasks/auto_annotate_models.rake
+++ b/lib/tasks/auto_annotate_models.rake
@@ -1,36 +1,34 @@
# NOTE: only doing this in development as some production environments (Heroku)
# NOTE: are sensitive to local FS writes, and besides -- it's just not proper
# NOTE: to have a dev-mode tool do its thing in production.
-if(Rails.env.development? || Rails.env.test?)
+if (Rails.env.development? || Rails.env.test?)
task :set_annotation_options do
# You can override any of these by setting an environment variable of the
# same name.
- Annotate.set_defaults({
- 'position_in_routes' => "before",
- 'position_in_class' => "after",
- 'position_in_test' => "before",
- 'position_in_fixture' => "before",
- 'position_in_factory' => "before",
- 'show_indexes' => "true",
- 'simple_indexes' => "false",
- 'model_dir' => "app/models",
- 'include_version' => "false",
- 'require' => "",
- 'exclude_tests' => "true",
- 'exclude_fixtures' => "true",
- 'exclude_helpers' => "true",
- 'exclude_factories' => "true",
- 'exclude_serializers' => "true",
- 'exclude_controllers' => "true",
- 'ignore_model_sub_dir' => "false",
- 'skip_on_db_migrate' => "true",
- 'format_bare' => "true",
- 'format_rdoc' => "false",
- 'format_markdown' => "false",
- 'sort' => "false",
- 'force' => "false",
- 'trace' => "false",
- })
+ Annotate.set_defaults('position_in_routes' => "before",
+ 'position_in_class' => "after",
+ 'position_in_test' => "before",
+ 'position_in_fixture' => "before",
+ 'position_in_factory' => "before",
+ 'show_indexes' => "true",
+ 'simple_indexes' => "false",
+ 'model_dir' => "app/models",
+ 'include_version' => "false",
+ 'require' => "",
+ 'exclude_tests' => "true",
+ 'exclude_fixtures' => "true",
+ 'exclude_helpers' => "true",
+ 'exclude_factories' => "true",
+ 'exclude_serializers' => "true",
+ 'exclude_controllers' => "true",
+ 'ignore_model_sub_dir' => "false",
+ 'skip_on_db_migrate' => "true",
+ 'format_bare' => "true",
+ 'format_rdoc' => "false",
+ 'format_markdown' => "false",
+ 'sort' => "false",
+ 'force' => "false",
+ 'trace' => "false")
end
end
diff --git a/lib/tasks/autospec.rake b/lib/tasks/autospec.rake
index 3df52d0f051..2f1de2c4863 100644
--- a/lib/tasks/autospec.rake
+++ b/lib/tasks/autospec.rake
@@ -6,7 +6,7 @@ desc "Run all specs automatically as needed"
task "autospec" => :environment do
require 'autospec/manager'
- debug = ARGV.any?{ |a| a == "d" || a == "debug" } || ENV["DEBUG"]
+ debug = ARGV.any? { |a| a == "d" || a == "debug" } || ENV["DEBUG"]
force_polling = ARGV.any? { |a| a == "p" || a == "polling" }
latency = ((ARGV.find { |a| a =~ /l=|latency=/ } || "").split("=")[1] || 3).to_i
diff --git a/lib/tasks/avatars.rake b/lib/tasks/avatars.rake
index 4c1da8fd54f..5b2df506cf6 100644
--- a/lib/tasks/avatars.rake
+++ b/lib/tasks/avatars.rake
@@ -24,7 +24,7 @@ task "avatars:clean" => :environment do
OptimizedImage.where("upload_id IN (SELECT custom_upload_id FROM user_avatars) OR
upload_id IN (SELECT gravatar_upload_id FROM user_avatars) OR
upload_id IN (SELECT uploaded_avatar_id FROM users)")
- .find_each do |optimized_image|
+ .find_each do |optimized_image|
optimized_image.destroy!
putc "." if (i += 1) % 10 == 0
end
diff --git a/lib/tasks/backfill.thor b/lib/tasks/backfill.thor
index a69a58803d3..44afebbda59 100644
--- a/lib/tasks/backfill.thor
+++ b/lib/tasks/backfill.thor
@@ -1,7 +1,6 @@
class Backfill < Thor
desc "link_titles", "Backfills link titles"
-
def link_titles
require './config/environment'
topic_links = TopicLink.where(crawled_at: nil, internal: false)
@@ -13,4 +12,3 @@ class Backfill < Thor
end
end
end
-
diff --git a/lib/tasks/build_test_topic.rake b/lib/tasks/build_test_topic.rake
index e135cabc928..7c64a76566e 100644
--- a/lib/tasks/build_test_topic.rake
+++ b/lib/tasks/build_test_topic.rake
@@ -4,7 +4,6 @@ desc 'create pushstate/replacestate test topic'
task 'build_test_topic' => :environment do
puts 'Creating topic'
-
# Acceptable options:
#
# raw - raw text of post
@@ -33,7 +32,7 @@ task 'build_test_topic' => :environment do
links = []
[-30, -10, 10, 30].each do |offset|
where = (post_number + offset)
- if where >= 1 and where <= 100
+ if where >= (1) && where <= (100)
links << "Link to ##{where}: #{topic_url}/#{where}"
end
end
diff --git a/lib/tasks/cdn.rake b/lib/tasks/cdn.rake
index c9b793cbf34..0e13c3ae8c7 100644
--- a/lib/tasks/cdn.rake
+++ b/lib/tasks/cdn.rake
@@ -34,7 +34,7 @@ task 'assets:prestage' => :environment do |t|
"id" => config["id"],
"login" => config["login"],
"passwd" => config["password"],
- "json" => {"prefetch_paths" => asset}.to_json
+ "json" => { "prefetch_paths" => asset }.to_json
)
response = http.request(request)
@@ -43,7 +43,7 @@ task 'assets:prestage' => :environment do |t|
failed_assets.push(asset)
end
end
-
+
if failed_assets.length > 0
raise "Failed to pre-stage #{failed_assets.length}/#{assets.length} files"
end
diff --git a/lib/tasks/docker.rake b/lib/tasks/docker.rake
index b6089394478..64a4514ae78 100644
--- a/lib/tasks/docker.rake
+++ b/lib/tasks/docker.rake
@@ -16,7 +16,7 @@
# this can also be set to a branch, e.g. "origin/tests-passed"
#
# Example usage:
-# Run all core and plugin tests:
+# Run all core and plugin tests:
# docker run discourse/discourse_test:release
# Run only rspec tests:
# docker run -e RUBY_ONLY=1 discourse/discourse_test:release
@@ -25,7 +25,6 @@
# Run tests for a specific plugin (with a plugin mounted from host filesystem):
# docker run -e SKIP_CORE=1 SINGLE_PLUGIN='my-awesome-plugin' -v $(pwd)/my-awesome-plugin:/var/www/discourse/plugins/my-awesome-plugin discourse/discourse_test:release
-
def run_or_fail(command)
pid = Process.spawn(command)
Process.wait(pid)
@@ -53,7 +52,6 @@ task 'docker:test' do
puts "Starting postgres"
@pg_pid = Process.spawn("#{@postgres_bin}postmaster -D tmp/test_data/pg")
-
ENV["RAILS_ENV"] = "test"
@good = run_or_fail("bundle exec rake db:create db:migrate")
diff --git a/lib/tasks/emoji.rake b/lib/tasks/emoji.rake
index a601dbc3c87..5ff933cab7f 100644
--- a/lib/tasks/emoji.rake
+++ b/lib/tasks/emoji.rake
@@ -446,10 +446,10 @@ def generate_emoji_groups(keywords)
emoji_list_section = title_section.first.parent.parent.next_element
emoji_list_section.css("a.plain img").each do |link|
emoji_code = link.attr("title")
- .scan(/U\+(.{4,5})\b/)
- .flatten
- .map { |code| code.downcase.strip }
- .join("_")
+ .scan(/U\+(.{4,5})\b/)
+ .flatten
+ .map { |code| code.downcase.strip }
+ .join("_")
emoji_char = code_to_emoji(emoji_code)
@@ -489,16 +489,16 @@ def write_db_json(emojis)
# skin tones variations of emojis shouldn’t appear in autocomplete
emojis_without_tones = emojis
.select { |char, config|
- !FITZPATRICK_SCALE.any? { |scale|
- codepoints_to_code(char.codepoints, config["fitzpatrick_scale"])[scale]
- }
- }
+ !FITZPATRICK_SCALE.any? { |scale|
+ codepoints_to_code(char.codepoints, config["fitzpatrick_scale"])[scale]
+ }
+ }
.map { |char, config|
- {
- "code" => codepoints_to_code(char.codepoints, config["fitzpatrick_scale"]).tr("_", "-"),
- "name" => config["name"]
- }
+ {
+ "code" => codepoints_to_code(char.codepoints, config["fitzpatrick_scale"]).tr("_", "-"),
+ "name" => config["name"]
}
+ }
emoji_with_tones = emojis
.select { |code, config| config["fitzpatrick_scale"] }
@@ -532,9 +532,9 @@ end
def codepoints_to_code(codepoints, fitzpatrick_scale)
codepoints = codepoints
- .map { |c| c.to_s(16).rjust(4, "0") }
- .join("_")
- .downcase
+ .map { |c| c.to_s(16).rjust(4, "0") }
+ .join("_")
+ .downcase
if !fitzpatrick_scale
codepoints.gsub!(/_fe0f$/, "")
diff --git a/lib/tasks/highlight.rake b/lib/tasks/highlight.rake
index d6baa771fbb..f0e0c2bc209 100644
--- a/lib/tasks/highlight.rake
+++ b/lib/tasks/highlight.rake
@@ -1,7 +1,7 @@
desc "download latest version of highlight and prepare it"
task "highlightjs:update" do
- def run(cmd, opts={})
+ def run(cmd, opts = {})
puts cmd
system(cmd, opts.merge(out: $stdout, err: :out))
end
diff --git a/lib/tasks/i18n_stats.rake b/lib/tasks/i18n_stats.rake
index 59884021368..ae48b2e9686 100644
--- a/lib/tasks/i18n_stats.rake
+++ b/lib/tasks/i18n_stats.rake
@@ -9,7 +9,7 @@ task "i18n:stats" => :environment do
# detect pluralizable string
if (source["other"] != nil)
- target[namespace] = {pluralizable: true, content: source}
+ target[namespace] = { pluralizable: true, content: source }
return
end
@@ -36,7 +36,7 @@ task "i18n:stats" => :environment do
same = []
total = a.count
- a.each do |key,value|
+ a.each do |key, value|
if b[key] == nil
minus << key
end
@@ -45,13 +45,13 @@ task "i18n:stats" => :environment do
end
end
- b.each do |key,value|
+ b.each do |key, value|
if a[key] == nil
plus << key
end
end
- a.each do |key,value|
+ a.each do |key, value|
if value.kind_of?(Hash)
if value[:pluralizable]
plural_keys.each do |pl|
@@ -61,7 +61,7 @@ task "i18n:stats" => :environment do
end
if b[key] != nil && b[key].kind_of?(Hash)
- b[key][:content].each do |pl,val|
+ b[key][:content].each do |pl, val|
if ! plural_keys.include?(pl)
if a[key][:content]["zero"] == nil
plus << "#{key}.#{pl}"
@@ -80,11 +80,11 @@ task "i18n:stats" => :environment do
end
end
- return plus,minus,same,total
+ return plus, minus, same, total
end
def get_plurals(locale)
- I18n.t("i18n.plural.keys", :locale => locale).map { |x| x.to_s }
+ I18n.t("i18n.plural.keys", locale: locale).map { |x| x.to_s }
end
puts "Discourse Translation Status Script"
diff --git a/lib/tasks/images.rake b/lib/tasks/images.rake
index c754841f05d..b74a7720a9f 100644
--- a/lib/tasks/images.rake
+++ b/lib/tasks/images.rake
@@ -2,7 +2,7 @@ require_dependency "file_helper"
task "images:compress" => :environment do
images = Dir.glob("#{Rails.root}/app/**/*.png")
- image_sizes = Hash[*images.map{|i| [i,File.size(i)]}.to_a.flatten]
+ image_sizes = Hash[*images.map { |i| [i, File.size(i)] }.to_a.flatten]
FileHelper.optimize_images!(images) do |name, optimized|
if optimized
new_size = File.size(name)
diff --git a/lib/tasks/import.rake b/lib/tasks/import.rake
index a462631c8c4..a0ec50de6c4 100644
--- a/lib/tasks/import.rake
+++ b/lib/tasks/import.rake
@@ -293,7 +293,6 @@ def update_posts
AND reply_count <> Y.replies
SQL
-
# -- TODO: ensure this is how this works!
# WITH X AS (
# SELECT pr.post_id, p.user_id
diff --git a/lib/tasks/integration.rake b/lib/tasks/integration.rake
index 1317eb6b1d8..32e2a8d1e98 100644
--- a/lib/tasks/integration.rake
+++ b/lib/tasks/integration.rake
@@ -38,7 +38,6 @@ task 'integration:create_fixtures' => :environment do
end
-
def fake_xhr(url)
uri = URI(url)
diff --git a/lib/tasks/plugin.rake b/lib/tasks/plugin.rake
index 51c674132f0..56cfb312072 100644
--- a/lib/tasks/plugin.rake
+++ b/lib/tasks/plugin.rake
@@ -49,7 +49,7 @@ task 'plugin:install', :repo do |t, args|
plugin_path = File.expand_path('plugins/' + name)
if File.directory?(File.expand_path(plugin_path))
- abort('Plugin directory, ' + plugin_path + ', already exists.')
+ abort('Plugin directory, ' + plugin_path + ', already exists.')
end
clone_status = system('git clone ' + repo + ' ' + plugin_path)
diff --git a/lib/tasks/posts.rake b/lib/tasks/posts.rake
index 0338f3c9fcc..f7793400401 100644
--- a/lib/tasks/posts.rake
+++ b/lib/tasks/posts.rake
@@ -13,7 +13,7 @@ task 'posts:fix_letter_avatars' => :environment do
return unless SiteSetting.external_system_avatars_enabled
search = Post.where("user_id <> -1")
- .where("raw LIKE '%/letter\_avatar/%' OR cooked LIKE '%/letter\_avatar/%'")
+ .where("raw LIKE '%/letter\_avatar/%' OR cooked LIKE '%/letter\_avatar/%'")
rebaked = 0
total = search.count
@@ -27,7 +27,7 @@ task 'posts:fix_letter_avatars' => :environment do
end
desc 'Rebake all posts matching string/regex and optionally delay the loop'
-task 'posts:rebake_match', [:pattern, :type, :delay] => [:environment] do |_,args|
+task 'posts:rebake_match', [:pattern, :type, :delay] => [:environment] do |_, args|
pattern = args[:pattern]
type = args[:type]
type = type.downcase if type
@@ -106,7 +106,7 @@ task 'posts:normalize_code' => :environment do
Post.where("raw like '%
%%'").each do |p|
normalized = Import::Normalize.normalize_code_blocks(p.raw, lang)
if normalized != p.raw
- p.revise(Discourse.system_user, { raw: normalized })
+ p.revise(Discourse.system_user, raw: normalized)
putc "."
i += 1
end
@@ -116,14 +116,14 @@ task 'posts:normalize_code' => :environment do
puts "#{i} posts normalized!"
end
-def remap_posts(find, replace="")
+def remap_posts(find, replace = "")
i = 0
Post.where("raw LIKE ?", "%#{find}%").each do |p|
new_raw = p.raw.dup
new_raw = new_raw.gsub!(/#{Regexp.escape(find)}/, replace) || new_raw
if new_raw != p.raw
- p.revise(Discourse.system_user, { raw: new_raw }, { bypass_bump: true, skip_revision: true })
+ p.revise(Discourse.system_user, { raw: new_raw }, bypass_bump: true, skip_revision: true)
putc "."
i += 1
end
@@ -132,7 +132,7 @@ def remap_posts(find, replace="")
end
desc 'Remap all posts matching specific string'
-task 'posts:remap', [:find, :replace] => [:environment] do |_,args|
+task 'posts:remap', [:find, :replace] => [:environment] do |_, args|
find = args[:find]
replace = args[:replace]
@@ -150,7 +150,7 @@ task 'posts:remap', [:find, :replace] => [:environment] do |_,args|
end
desc 'Delete occurrence of a word/string'
-task 'posts:delete_word', [:find] => [:environment] do |_,args|
+task 'posts:delete_word', [:find] => [:environment] do |_, args|
require 'highline/import'
find = args[:find]
diff --git a/lib/tasks/qunit.rake b/lib/tasks/qunit.rake
index 715af0ed6ef..a80e443ed4a 100644
--- a/lib/tasks/qunit.rake
+++ b/lib/tasks/qunit.rake
@@ -10,7 +10,7 @@ task "qunit:test", [:timeout, :qunit_path] => :environment do |_, args|
end
# ensure we have this port available
- def port_available? port
+ def port_available?(port)
server = TCPServer.open port
server.close
true
@@ -26,9 +26,9 @@ task "qunit:test", [:timeout, :qunit_path] => :environment do |_, args|
unless pid = fork
Discourse.after_fork
- Rack::Server.start(:config => "config.ru",
- :AccessLog => [],
- :Port => port)
+ Rack::Server.start(config: "config.ru",
+ AccessLog: [],
+ Port: port)
exit
end
diff --git a/lib/tasks/release_note.rake b/lib/tasks/release_note.rake
index 54c40e267b1..4023727d45d 100644
--- a/lib/tasks/release_note.rake
+++ b/lib/tasks/release_note.rake
@@ -55,14 +55,14 @@ end
def escape_brackets(line)
line.gsub("<", "`<")
- .gsub(">", ">`")
- .gsub("[", "`[")
- .gsub("]", "]`")
+ .gsub(">", ">`")
+ .gsub("[", "`[")
+ .gsub("]", "]`")
end
def split_comments(text)
text = normalize_terms(text)
- terms = ["FIX:", "FEATURE:", "UX:", "SECURITY:" ,"PERF:"]
+ terms = ["FIX:", "FEATURE:", "UX:", "SECURITY:" , "PERF:"]
terms.each do |term|
text = newlines_at_term(text, term)
end
@@ -79,7 +79,7 @@ end
def newlines_at_term(text, term)
if text.include?(term)
- text = text.split(term).map{ |l| l.strip }.join("\n#{term} ")
+ text = text.split(term).map { |l| l.strip }.join("\n#{term} ")
end
text
end
diff --git a/lib/tasks/scheduler.rake b/lib/tasks/scheduler.rake
index 208d524ee59..d7d1efeb86b 100644
--- a/lib/tasks/scheduler.rake
+++ b/lib/tasks/scheduler.rake
@@ -1,21 +1,21 @@
desc "This task is called by the Heroku scheduler add-on"
# Every day at 6am
-task :enqueue_digest_emails => :environment do
+task enqueue_digest_emails: :environment do
Jobs::EnqueueDigestEmails.new.execute(nil)
end
# Every day at 4am
-task :category_stats => :environment do
+task category_stats: :environment do
Jobs::CategoryStats.new.execute(nil)
end
# Every 10 minutes
-task :periodical_updates => :environment do
+task periodical_updates: :environment do
Jobs::PeriodicalUpdates.new.execute(nil)
end
# Every day
-task :version_check => :environment do
+task version_check: :environment do
Jobs::VersionCheck.new.execute(nil)
-end
\ No newline at end of file
+end
diff --git a/lib/tasks/search.rake b/lib/tasks/search.rake
index c944812d793..ef84747cce4 100644
--- a/lib/tasks/search.rake
+++ b/lib/tasks/search.rake
@@ -2,7 +2,7 @@ task "search:reindex" => :environment do
ENV['RAILS_DB'] ? reindex_search : reindex_search_all_sites
end
-def reindex_search(db=RailsMultisite::ConnectionManagement.current_db)
+def reindex_search(db = RailsMultisite::ConnectionManagement.current_db)
puts "Reindexing '#{db}'"
puts ""
puts "Posts:"
diff --git a/lib/tasks/typepad.thor b/lib/tasks/typepad.thor
index 26613f89b61..7db75d415ed 100644
--- a/lib/tasks/typepad.thor
+++ b/lib/tasks/typepad.thor
@@ -45,7 +45,7 @@ class Typepad < Thor
end
end
- entries.each_with_index do |e,i|
+ entries.each_with_index do |e, i|
if e[:title] =~ /Head/
puts "#{i}: #{e[:title]}"
end
@@ -56,7 +56,7 @@ class Typepad < Thor
puts "Importing #{entries.size} entries"
entries.each_with_index do |entry, idx|
- puts "Importing (#{idx+1}/#{entries.size})"
+ puts "Importing (#{idx + 1}/#{entries.size})"
next if entry[:body].blank?
puts entry[:unique_url]
@@ -219,7 +219,7 @@ class Typepad < Thor
current << c
end
end
- segments.delete_if {|s| s.nil? || s.size < 2}
+ segments.delete_if { |s| s.nil? || s.size < 2 }
segments << current
comment[:author] = segments[0]
diff --git a/lib/tasks/uploads.rake b/lib/tasks/uploads.rake
index e8c5dc67b29..9da415dba0b 100644
--- a/lib/tasks/uploads.rake
+++ b/lib/tasks/uploads.rake
@@ -27,8 +27,8 @@ def gather_uploads
puts "", "Gathering uploads for '#{current_db}'...", ""
Upload.where("url ~ '^\/uploads\/'")
- .where("url !~ '^\/uploads\/#{current_db}'")
- .find_each do |upload|
+ .where("url !~ '^\/uploads\/#{current_db}'")
+ .find_each do |upload|
begin
old_db = upload.url[/^\/uploads\/([^\/]+)\//, 1]
from = upload.url.dup
@@ -100,7 +100,7 @@ def guess_filename(url, raw)
filename ||= File.basename(url)
filename
rescue
- nil
+ nil
ensure
f.try(:close!) rescue nil
end
@@ -203,8 +203,8 @@ def migrate_to_s3
# Migrate all uploads
Upload.where.not(sha1: nil)
- .where("url NOT LIKE '#{s3.absolute_base_url}%'")
- .find_each do |upload|
+ .where("url NOT LIKE '#{s3.absolute_base_url}%'")
+ .find_each do |upload|
# remove invalid uploads
if upload.url.blank?
upload.destroy!
@@ -215,7 +215,7 @@ def migrate_to_s3
# retrieve the path to the local file
path = local.path_for(upload)
# make sure the file exists locally
- if !path or !File.exists?(path)
+ if !path || !File.exists?(path)
putc "X"
next
end
diff --git a/lib/tasks/user_actions.rake b/lib/tasks/user_actions.rake
index ffba1f2b228..f457454978e 100644
--- a/lib/tasks/user_actions.rake
+++ b/lib/tasks/user_actions.rake
@@ -2,9 +2,9 @@ desc "rebuild the user_actions table"
task "user_actions:rebuild" => :environment do
MessageBus.off
UserAction.delete_all
- PostAction.all.each{|i| UserActionCreator.log_post_action(i)}
- Topic.all.each {|i| UserActionCreator.log_topic(i)}
- Post.all.each {|i| UserActionCreator.log_post(i)}
+ PostAction.all.each { |i| UserActionCreator.log_post_action(i) }
+ Topic.all.each { |i| UserActionCreator.log_topic(i) }
+ Post.all.each { |i| UserActionCreator.log_post(i) }
Notification.all.each do |notification|
UserActionCreator.log_notification(notification.post,
notification.user,
@@ -12,4 +12,3 @@ task "user_actions:rebuild" => :environment do
notification.user)
end
end
-
diff --git a/lib/tasks/users.rake b/lib/tasks/users.rake
index 7772bba6600..d01d30b744b 100644
--- a/lib/tasks/users.rake
+++ b/lib/tasks/users.rake
@@ -1,5 +1,5 @@
desc "Change topic/post ownership of all the topics/posts by a specific user (without creating new revision)"
-task "users:change_post_ownership", [:old_username, :new_username, :archetype] => [:environment] do |_,args|
+task "users:change_post_ownership", [:old_username, :new_username, :archetype] => [:environment] do |_, args|
old_username = args[:old_username]
new_username = args[:new_username]
archetype = args[:archetype]
diff --git a/lib/text_sentinel.rb b/lib/text_sentinel.rb
index e86a897b67c..fa88e647f96 100644
--- a/lib/text_sentinel.rb
+++ b/lib/text_sentinel.rb
@@ -11,12 +11,12 @@ class TextSentinel
ENTROPY_SCALE ||= 0.7
- def initialize(text, opts=nil)
+ def initialize(text, opts = nil)
@opts = opts || {}
@text = text.to_s.encode('UTF-8', invalid: :replace, undef: :replace, replace: '')
end
- def self.body_sentinel(text, opts={})
+ def self.body_sentinel(text, opts = {})
entropy = SiteSetting.body_min_entropy
if opts[:private_message]
scale_entropy = SiteSetting.min_private_message_post_length.to_f / SiteSetting.min_post_length.to_f
@@ -41,7 +41,7 @@ class TextSentinel
# Non-ASCII characters are weighted heavier since they contain more "information"
def entropy
chars = @text.to_s.strip.split('')
- @entropy ||= chars.pack('M*'*chars.size).gsub("\n",'').split('=').uniq.size
+ @entropy ||= chars.pack('M*' * chars.size).gsub("\n", '').split('=').uniq.size
end
def valid?
@@ -74,7 +74,6 @@ class TextSentinel
@opts[:max_word_length].blank? || @text.split(/\s|\/|-|\.|:/).map(&:size).max <= @opts[:max_word_length]
end
-
def seems_quiet?
# We don't allow all upper case content
SiteSetting.allow_uppercase_posts || @text == @text.mb_chars.downcase.to_s || @text != @text.mb_chars.upcase.to_s
diff --git a/lib/timeline_lookup.rb b/lib/timeline_lookup.rb
index 1c62d879f52..90d4a5e02a6 100644
--- a/lib/timeline_lookup.rb
+++ b/lib/timeline_lookup.rb
@@ -2,7 +2,7 @@ module TimelineLookup
# Given an array of tuples (id, post_number, days_ago), return at most `max_values` worth of a
# lookup table to help the front end timeline display dates associated with posts
- def self.build(tuples, max_values=300)
+ def self.build(tuples, max_values = 300)
result = []
every = (tuples.size.to_f / max_values).ceil
@@ -14,7 +14,7 @@ module TimelineLookup
days_ago = t[2]
if (days_ago != last_days_ago)
- result << [idx+1, days_ago]
+ result << [idx + 1, days_ago]
last_days_ago = days_ago
end
diff --git a/lib/topic_creator.rb b/lib/topic_creator.rb
index ecd35fd116b..885f4f26053 100644
--- a/lib/topic_creator.rb
+++ b/lib/topic_creator.rb
@@ -80,13 +80,16 @@ class TopicCreator
topic.topic_allowed_groups(true).each do |tag|
tag.group.group_users.each do |gu|
next if gu.user_id == -1 || gu.user_id == topic.user_id
- action = case gu.notification_level
- when TopicUser.notification_levels[:tracking] then "track!"
- when TopicUser.notification_levels[:regular] then "regular!"
- when TopicUser.notification_levels[:muted] then "mute!"
- when TopicUser.notification_levels[:watching] then "watch!"
- else "track!"
- end
+
+ action =
+ case gu.notification_level
+ when TopicUser.notification_levels[:tracking] then "track!"
+ when TopicUser.notification_levels[:regular] then "regular!"
+ when TopicUser.notification_levels[:muted] then "mute!"
+ when TopicUser.notification_levels[:watching] then "watch!"
+ else "track!"
+ end
+
topic.notifier.send(action, gu.user_id)
end
end
@@ -152,7 +155,7 @@ class TopicCreator
def setup_auto_close_time(topic)
return unless @opts[:auto_close_time].present?
return unless @guardian.can_moderate?(topic)
- topic.set_auto_close(@opts[:auto_close_time], {by_user: @user})
+ topic.set_auto_close(@opts[:auto_close_time], by_user: @user)
end
def process_private_message(topic)
@@ -163,8 +166,8 @@ class TopicCreator
rollback_with!(topic, :no_user_selected)
end
- add_users(topic,@opts[:target_usernames])
- add_groups(topic,@opts[:target_group_names])
+ add_users(topic, @opts[:target_usernames])
+ add_groups(topic, @opts[:target_group_names])
topic.topic_allowed_users.build(user_id: @user.id)
end
diff --git a/lib/topic_list_responder.rb b/lib/topic_list_responder.rb
index 05133300855..b53380345f6 100644
--- a/lib/topic_list_responder.rb
+++ b/lib/topic_list_responder.rb
@@ -21,4 +21,3 @@ module TopicListResponder
end
end
-
diff --git a/lib/topic_query.rb b/lib/topic_query.rb
index 51deb6654fa..934c3e84ef0 100644
--- a/lib/topic_query.rb
+++ b/lib/topic_query.rb
@@ -46,7 +46,6 @@ class TopicQuery
no_definitions)
end
-
# Maps `order` to a columns in `topics`
SORTABLE_MAPPING = {
'likes' => 'like_count',
@@ -80,21 +79,21 @@ class TopicQuery
def self.apply_custom_filters(results, topic_query)
if @custom_filters
- @custom_filters.each do |key,filter|
+ @custom_filters.each do |key, filter|
results = filter.call(results, topic_query)
end
end
results
end
- def initialize(user=nil, options={})
+ def initialize(user = nil, options = {})
options.assert_valid_keys(TopicQuery.valid_options)
@options = options.dup
@user = user
@guardian = Guardian.new(@user)
end
- def joined_topic_user(list=nil)
+ def joined_topic_user(list = nil)
(list || Topic).joins("LEFT OUTER JOIN topic_users AS tu ON (topics.id = tu.topic_id AND tu.user_id = #{@user.id.to_i})")
end
@@ -108,8 +107,8 @@ class TopicQuery
if topic.private_message?
group_ids = topic.topic_allowed_groups
- .where('group_id IN (SELECT group_id FROM group_users WHERE user_id = :user_id)', user_id: @user.id)
- .pluck(:group_id)
+ .where('group_id IN (SELECT group_id FROM group_users WHERE user_id = :user_id)', user_id: @user.id)
+ .pluck(:group_id)
{
topic: topic,
my_group_ids: group_ids,
@@ -151,7 +150,7 @@ class TopicQuery
builder.add_results(random_suggested(topic, builder.results_left, builder.excluded_topic_ids)) unless builder.full?
end
- params = {unordered: true}
+ params = { unordered: true }
if topic.private_message?
params[:preload_posters] = true
end
@@ -170,19 +169,19 @@ class TopicQuery
end
def list_new
- create_list(:new, {unordered: true}, new_results)
+ create_list(:new, { unordered: true }, new_results)
end
def list_unread
- create_list(:unread, {unordered: true}, unread_results)
+ create_list(:unread, { unordered: true }, unread_results)
end
def list_posted
- create_list(:posted) {|l| l.where('tu.posted') }
+ create_list(:posted) { |l| l.where('tu.posted') }
end
def list_bookmarks
- create_list(:bookmarks) {|l| l.where('tu.bookmarked') }
+ create_list(:bookmarks) { |l| l.where('tu.bookmarked') }
end
def list_top_for(period)
@@ -207,14 +206,14 @@ class TopicQuery
def not_archived(list, user)
list.joins("LEFT JOIN user_archived_messages um
ON um.user_id = #{user.id.to_i} AND um.topic_id = topics.id")
- .where('um.user_id IS NULL')
+ .where('um.user_id IS NULL')
end
def list_private_messages(user)
list = private_messages_for(user, :user)
list = not_archived(list, user)
- .where('NOT (topics.participant_count = 1 AND topics.user_id = ?)', user.id)
+ .where('NOT (topics.participant_count = 1 AND topics.user_id = ?)', user.id)
create_list(:private_messages, {}, list)
end
@@ -262,8 +261,8 @@ class TopicQuery
def list_category_topic_ids(category)
query = default_results(category: category.id)
pinned_ids = query.where('pinned_at IS NOT NULL AND category_id = ?', category.id)
- .limit(nil)
- .order('pinned_at DESC').pluck(:id)
+ .limit(nil)
+ .order('pinned_at DESC').pluck(:id)
non_pinned_ids = query.where('pinned_at IS NULL OR category_id <> ?', category.id).pluck(:id)
(pinned_ids + non_pinned_ids)
end
@@ -276,8 +275,8 @@ class TopicQuery
def self.new_filter(list, treat_as_new_topic_start_date)
list.where("topics.created_at >= :created_at", created_at: treat_as_new_topic_start_date)
- .where("tu.last_read_post_number IS NULL")
- .where("COALESCE(tu.notification_level, :tracking) >= :tracking", tracking: TopicUser.notification_levels[:tracking])
+ .where("tu.last_read_post_number IS NULL")
+ .where("COALESCE(tu.notification_level, :tracking) >= :tracking", tracking: TopicUser.notification_levels[:tracking])
end
def self.unread_filter(list, user_id, opts)
@@ -293,8 +292,8 @@ class TopicQuery
col_name = opts[:staff] ? "highest_staff_post_number" : "highest_post_number"
list
- .where("tu.last_read_post_number < topics.#{col_name}")
- .where("COALESCE(tu.notification_level, :regular) >= :tracking",
+ .where("tu.last_read_post_number < topics.#{col_name}")
+ .where("COALESCE(tu.notification_level, :regular) >= :tracking",
regular: TopicUser.notification_levels[:regular], tracking: TopicUser.notification_levels[:tracking])
end
@@ -322,12 +321,12 @@ class TopicQuery
end
- def create_list(filter, options={}, topics = nil)
+ def create_list(filter, options = {}, topics = nil)
topics ||= default_results(options)
topics = yield(topics) if block_given?
options = options.merge(@options)
- if ["activity","default"].include?(options[:order] || "activity") &&
+ if ["activity", "default"].include?(options[:order] || "activity") &&
!options[:unordered] &&
filter != :private_messages
topics = prioritize_pinned_topics(topics, options)
@@ -348,7 +347,7 @@ class TopicQuery
end
topics.each do |t|
- t.allowed_user_ids = filter == :private_messages ? t.allowed_users.map{|u| u.id} : []
+ t.allowed_user_ids = filter == :private_messages ? t.allowed_users.map { |u| u.id } : []
end
list = TopicList.new(filter, @user, topics, options.merge(@options))
@@ -356,7 +355,7 @@ class TopicQuery
list
end
- def latest_results(options={})
+ def latest_results(options = {})
result = default_results(options)
result = remove_muted_topics(result, @user) unless options && options[:state] == "muted".freeze
result = remove_muted_categories(result, @user, exclude: options[:category])
@@ -370,12 +369,12 @@ class TopicQuery
result
end
- def unread_results(options={})
+ def unread_results(options = {})
result = TopicQuery.unread_filter(
- default_results(options.reverse_merge(:unordered => true)),
+ default_results(options.reverse_merge(unordered: true)),
@user&.id,
staff: @user&.staff?)
- .order('CASE WHEN topics.user_id = tu.user_id THEN 1 ELSE 2 END')
+ .order('CASE WHEN topics.user_id = tu.user_id THEN 1 ELSE 2 END')
self.class.results_filter_callbacks.each do |filter_callback|
result = filter_callback.call(:unread, result, @user, options)
@@ -384,10 +383,10 @@ class TopicQuery
suggested_ordering(result, options)
end
- def new_results(options={})
+ def new_results(options = {})
# TODO does this make sense or should it be ordered on created_at
# it is ordering on bumped_at now
- result = TopicQuery.new_filter(default_results(options.reverse_merge(:unordered => true)), @user.user_option.treat_as_new_topic_start_date)
+ result = TopicQuery.new_filter(default_results(options.reverse_merge(unordered: true)), @user.user_option.treat_as_new_topic_start_date)
result = remove_muted_topics(result, @user)
result = remove_muted_categories(result, @user, exclude: options[:category])
result = remove_muted_tags(result, @user, options)
@@ -436,8 +435,8 @@ class TopicQuery
end
result = result.joins("LEFT OUTER JOIN topic_users AS tu ON (topics.id = tu.topic_id AND tu.user_id = #{user.id.to_i})")
- .order("topics.bumped_at DESC")
- .private_messages
+ .order("topics.bumped_at DESC")
+ .private_messages
result = result.limit(options[:per_page]) unless options[:limit] == false
result = result.visible if options[:visible] || @user.nil? || @user.regular?
@@ -489,9 +488,8 @@ class TopicQuery
category_id
end
-
# Create results based on a bunch of default options
- def default_results(options={})
+ def default_results(options = {})
options.reverse_merge!(@options)
options.reverse_merge!(per_page: per_page_setting)
@@ -504,7 +502,7 @@ class TopicQuery
if @user
result = result.joins("LEFT OUTER JOIN topic_users AS tu ON (topics.id = tu.topic_id AND tu.user_id = #{@user.id.to_i})")
- .references('tu')
+ .references('tu')
end
category_id = get_category_id(options[:category])
@@ -559,7 +557,7 @@ class TopicQuery
end
elsif @options[:no_tags]
# the following will do: ("topics"."id" NOT IN (SELECT DISTINCT "topic_tags"."topic_id" FROM "topic_tags"))
- result = result.where.not(:id => TopicTag.select(:topic_id).uniq)
+ result = result.where.not(id: TopicTag.select(:topic_id).uniq)
end
end
@@ -578,7 +576,7 @@ class TopicQuery
result = result.limit(options[:per_page]) unless options[:limit] == false
result = result.visible if options[:visible]
- result = result.where.not(topics: {id: options[:except_topic_ids]}).references(:topics) if options[:except_topic_ids]
+ result = result.where.not(topics: { id: options[:except_topic_ids] }).references(:topics) if options[:except_topic_ids]
if options[:page]
offset = options[:page].to_i * options[:per_page]
@@ -641,7 +639,7 @@ class TopicQuery
end
end
- if (filter=options[:filter]) && @user
+ if (filter = options[:filter]) && @user
action =
if filter == "bookmarked"
PostActionType.types[:bookmark]
@@ -665,7 +663,7 @@ class TopicQuery
result = result.where('topics.posts_count <= ?', options[:max_posts]) if options[:max_posts].present?
result = result.where('topics.posts_count >= ?', options[:min_posts]) if options[:min_posts].present?
- result = TopicQuery.apply_custom_filters(result,self)
+ result = TopicQuery.apply_custom_filters(result, self)
@guardian.filter_allowed_categories(result)
end
@@ -677,12 +675,12 @@ class TopicQuery
list
end
- def remove_muted_categories(list, user, opts=nil)
+ def remove_muted_categories(list, user, opts = nil)
category_id = get_category_id(opts[:exclude]) if opts
if user
list = list.references("cu")
- .where("
+ .where("
NOT EXISTS (
SELECT 1
FROM category_users cu
@@ -699,7 +697,7 @@ class TopicQuery
list
end
- def remove_muted_tags(list, user, opts=nil)
+ def remove_muted_tags(list, user, opts = nil)
if user.nil? || !SiteSetting.tagging_enabled || !SiteSetting.remove_muted_tags_from_latest
list
else
@@ -732,7 +730,7 @@ class TopicQuery
def new_messages(params)
TopicQuery.new_filter(messages_for_groups_or_user(params[:my_group_ids]), Time.at(SiteSetting.min_new_topics_time).to_datetime)
- .limit(params[:count])
+ .limit(params[:count])
end
@@ -741,7 +739,7 @@ class TopicQuery
messages_for_groups_or_user(params[:my_group_ids]),
@user&.id,
staff: @user&.staff?)
- .limit(params[:count])
+ .limit(params[:count])
end
def related_messages_user(params)
@@ -811,7 +809,7 @@ class TopicQuery
query.order('topics.bumped_at DESC')
end
- def random_suggested(topic, count, excluded_topic_ids=[])
+ def random_suggested(topic, count, excluded_topic_ids = [])
result = default_results(unordered: true, per_page: count).where(closed: false, archived: false)
excluded_topic_ids += Category.topic_ids.to_a
result = result.where("topics.id NOT IN (?)", excluded_topic_ids) unless excluded_topic_ids.empty?
@@ -829,7 +827,7 @@ class TopicQuery
# of muted, big edge case
#
# we over select in case cache is stale
- max = (count*1.3).to_i
+ max = (count * 1.3).to_i
ids = RandomTopicSelector.next(max) + RandomTopicSelector.next(max, topic.category)
result.where(id: ids.uniq)
diff --git a/lib/topic_retriever.rb b/lib/topic_retriever.rb
index 672ca60a696..82f815d9f7c 100644
--- a/lib/topic_retriever.rb
+++ b/lib/topic_retriever.rb
@@ -1,6 +1,6 @@
class TopicRetriever
- def initialize(embed_url, opts=nil)
+ def initialize(embed_url, opts = nil)
@embed_url = embed_url
@author_username = opts[:author_username]
@opts = opts || {}
@@ -34,7 +34,6 @@ class TopicRetriever
# It's possible another process or job found the embed already. So if that happened bail out.
return if TopicEmbed.where(embed_url: @embed_url).exists?
-
# First check RSS if that is enabled
if SiteSetting.feed_polling_enabled?
Jobs::PollFeed.new.execute({})
diff --git a/lib/topic_subtype.rb b/lib/topic_subtype.rb
index 0d8224c4e45..731ed29c3e0 100644
--- a/lib/topic_subtype.rb
+++ b/lib/topic_subtype.rb
@@ -9,7 +9,7 @@ class TopicSubtype
end
def attributes
- {'id' => @id, 'options' => @options }
+ { 'id' => @id, 'options' => @options }
end
def self.list
@@ -41,7 +41,7 @@ class TopicSubtype
'pending_users'
end
- def self.register(name, options={})
+ def self.register(name, options = {})
@subtypes ||= {}
@subtypes[name] = TopicSubtype.new(name, options)
end
diff --git a/lib/topic_view.rb b/lib/topic_view.rb
index 482853d71e8..d631a331353 100644
--- a/lib/topic_view.rb
+++ b/lib/topic_view.rb
@@ -37,7 +37,7 @@ class TopicView
wpcf.flatten.uniq
end
- def initialize(topic_id, user=nil, options={})
+ def initialize(topic_id, user = nil, options = {})
@message_bus_last_id = MessageBus.last_id("/topic/#{topic_id}")
@user = user
@guardian = Guardian.new(@user)
@@ -50,11 +50,13 @@ class TopicView
end
@page = 1 if (!@page || @page.zero?)
- @chunk_size = case
- when options[:slow_platform] then TopicView.slow_chunk_size
- when @print then TopicView.print_chunk_size
- else TopicView.chunk_size
- end
+ @chunk_size =
+ case
+ when options[:slow_platform] then TopicView.slow_chunk_size
+ when @print then TopicView.print_chunk_size
+ else TopicView.chunk_size
+ end
+
@limit ||= @chunk_size
setup_filtered_posts
@@ -82,12 +84,15 @@ class TopicView
def canonical_path
path = relative_url
- path << if @post_number
- page = ((@post_number.to_i - 1) / @limit) + 1
- (page > 1) ? "?page=#{page}" : ""
- else
- (@page && @page.to_i > 1) ? "?page=#{@page}" : ""
- end
+
+ path <<
+ if @post_number
+ page = ((@post_number.to_i - 1) / @limit) + 1
+ (page > 1) ? "?page=#{page}" : ""
+ else
+ (@page && @page.to_i > 1) ? "?page=#{@page}" : ""
+ end
+
path
end
@@ -161,7 +166,7 @@ class TopicView
return @desired_post if @desired_post.present?
return nil if posts.blank?
- @desired_post = posts.detect {|p| p.post_number == @post_number.to_i}
+ @desired_post = posts.detect { |p| p.post_number == @post_number.to_i }
@desired_post ||= posts.first
@desired_post
end
@@ -175,7 +180,7 @@ class TopicView
def read_time
return nil if @post_number.present? && @post_number.to_i != 1 # only show for topic URLs
- (@topic.word_count/SiteSetting.read_time_word_count).floor if @topic.word_count
+ (@topic.word_count / SiteSetting.read_time_word_count).floor if @topic.word_count
end
def like_count
@@ -235,7 +240,6 @@ class TopicView
filter_posts_in_range(min_idx, max_idx)
end
-
def filter_posts_paged(page)
page = [page, 1].max
min = @limit * (page - 1)
@@ -248,7 +252,7 @@ class TopicView
filter_posts_in_range(min, max)
end
- def filter_best(max, opts={})
+ def filter_best(max, opts = {})
filter = FilterBestPosts.new(@topic, @filtered_posts, max, opts)
@posts = filter.posts
@filtered_posts = filter.filtered_posts
@@ -261,9 +265,9 @@ class TopicView
def has_deleted?
@predelete_filtered_posts.with_deleted
- .where("posts.deleted_at IS NOT NULL")
- .where("posts.post_number > 1")
- .exists?
+ .where("posts.deleted_at IS NOT NULL")
+ .where("posts.post_number > 1")
+ .exists?
end
def topic_user
@@ -275,17 +279,17 @@ class TopicView
def post_counts_by_user
@post_counts_by_user ||= Post.where(topic_id: @topic.id)
- .where("user_id IS NOT NULL")
- .group(:user_id)
- .order("count_all DESC")
- .limit(24)
- .count
+ .where("user_id IS NOT NULL")
+ .group(:user_id)
+ .order("count_all DESC")
+ .limit(24)
+ .count
end
def participants
@participants ||= begin
participants = {}
- User.where(id: post_counts_by_user.map {|k,v| k}).includes(:primary_group).each {|u| participants[u.id] = u}
+ User.where(id: post_counts_by_user.map { |k, v| k }).includes(:primary_group).each { |u| participants[u.id] = u }
participants
end
end
@@ -303,7 +307,7 @@ class TopicView
end
def link_counts
- @link_counts ||= TopicLink.counts_for(guardian,@topic, posts)
+ @link_counts ||= TopicLink.counts_for(guardian, @topic, posts)
end
# Are we the initial page load? If so, we can return extra information like
@@ -331,7 +335,7 @@ class TopicView
def current_post_ids
@current_post_ids ||= if @posts.is_a?(Array)
- @posts.map {|p| p.id }
+ @posts.map { |p| p.id }
else
@posts.pluck(:post_number)
end
@@ -341,13 +345,13 @@ class TopicView
# calculations.
def filtered_post_stream
@filtered_post_stream ||= @filtered_posts.order(:sort_order)
- .pluck(:id,
+ .pluck(:id,
:post_number,
'EXTRACT(DAYS FROM CURRENT_TIMESTAMP - created_at)::INT AS days_ago')
end
def filtered_post_ids
- @filtered_post_ids ||= filtered_post_stream.map {|tuple| tuple[0]}
+ @filtered_post_ids ||= filtered_post_stream.map { |tuple| tuple[0] }
end
protected
@@ -359,11 +363,11 @@ class TopicView
return result unless topic_user.present?
post_numbers = PostTiming
- .where(topic_id: @topic.id, user_id: @user.id)
- .where(post_number: current_post_ids)
- .pluck(:post_number)
+ .where(topic_id: @topic.id, user_id: @user.id)
+ .where(post_number: current_post_ids)
+ .pluck(:post_number)
- post_numbers.each {|pn| result << pn}
+ post_numbers.each { |pn| result << pn }
result
end
end
@@ -383,8 +387,8 @@ class TopicView
def filter_posts_by_ids(post_ids)
# TODO: Sort might be off
@posts = Post.where(id: post_ids, topic_id: @topic.id)
- .includes(:user, :reply_to_user, :incoming_email)
- .order('sort_order')
+ .includes(:user, :reply_to_user, :incoming_email)
+ .order('sort_order')
@posts = filter_post_types(@posts)
@posts = @posts.with_deleted if @guardian.can_see_deleted_posts?
@posts
@@ -435,7 +439,7 @@ class TopicView
# Username filters
if @username_filters.present?
- usernames = @username_filters.map{|u| u.downcase}
+ usernames = @username_filters.map { |u| u.downcase }
@filtered_posts = @filtered_posts.where('post_number = 1 OR posts.user_id IN (SELECT u.id FROM users u WHERE username_lower IN (?))', usernames)
@contains_gaps = true
end
diff --git a/lib/topics_bulk_action.rb b/lib/topics_bulk_action.rb
index 5e4d8d9f75d..1af2db62a2e 100644
--- a/lib/topics_bulk_action.rb
+++ b/lib/topics_bulk_action.rb
@@ -1,6 +1,6 @@
class TopicsBulkAction
- def initialize(user, topic_ids, operation, options={})
+ def initialize(user, topic_ids, operation, options = {})
@user = user
@topic_ids = topic_ids
@operation = operation
@@ -45,7 +45,7 @@ class TopicsBulkAction
if group
GroupArchivedMessage.move_to_inbox!(group.id, t.id)
else
- UserArchivedMessage.move_to_inbox!(@user.id,t.id)
+ UserArchivedMessage.move_to_inbox!(@user.id, t.id)
end
end
end
@@ -177,6 +177,4 @@ class TopicsBulkAction
@topics ||= Topic.where(id: @topic_ids)
end
-
end
-
diff --git a/lib/twitter_api.rb b/lib/twitter_api.rb
index 2c9ce48a601..da281fe05fe 100644
--- a/lib/twitter_api.rb
+++ b/lib/twitter_api.rb
@@ -5,7 +5,7 @@ class TwitterApi
def prettify_tweet(tweet)
text = tweet["full_text"].dup
- if entities = tweet["entities"] and urls = entities["urls"]
+ if (entities = tweet["entities"]) && (urls = entities["urls"])
urls.each do |url|
text.gsub!(url["url"], "#{url["display_url"]}")
end
@@ -125,7 +125,6 @@ class TwitterApi
URI.parse "#{BASE_URL}/oauth2/token"
end
-
def http(uri)
Net::HTTP.new(uri.host, uri.port).tap { |http| http.use_ssl = true }
end
diff --git a/lib/unread.rb b/lib/unread.rb
index f04ffcd2289..36a7d09e816 100644
--- a/lib/unread.rb
+++ b/lib/unread.rb
@@ -8,10 +8,9 @@ class Unread
@topic_user = topic_user
end
-
def unread_posts
return 0 if do_not_notify?(@topic_user.notification_level)
- result = ((@topic_user.highest_seen_post_number||0) - (@topic_user.last_read_post_number||0))
+ result = ((@topic_user.highest_seen_post_number || 0) - (@topic_user.last_read_post_number || 0))
result = 0 if result < 0
result
end
@@ -22,7 +21,7 @@ class Unread
highest_post_number = @guardian.is_staff? ? @topic.highest_staff_post_number : @topic.highest_post_number
- return 0 if (@topic_user.last_read_post_number||0) > highest_post_number
+ return 0 if (@topic_user.last_read_post_number || 0) > highest_post_number
new_posts = (highest_post_number - @topic_user.highest_seen_post_number)
new_posts = 0 if new_posts < 0
diff --git a/lib/validators/allow_user_locale_enabled_validator.rb b/lib/validators/allow_user_locale_enabled_validator.rb
index ebae4be4509..73d3cb5c51b 100644
--- a/lib/validators/allow_user_locale_enabled_validator.rb
+++ b/lib/validators/allow_user_locale_enabled_validator.rb
@@ -1,6 +1,6 @@
class AllowUserLocaleEnabledValidator
- def initialize(opts={})
+ def initialize(opts = {})
@opts = opts
end
@@ -15,4 +15,4 @@ class AllowUserLocaleEnabledValidator
I18n.t("site_settings.errors.user_locale_not_enabled");
end
-end
\ No newline at end of file
+end
diff --git a/lib/validators/alternative_reply_by_email_addresses_validator.rb b/lib/validators/alternative_reply_by_email_addresses_validator.rb
index d35dedf7c3a..412059ce86e 100644
--- a/lib/validators/alternative_reply_by_email_addresses_validator.rb
+++ b/lib/validators/alternative_reply_by_email_addresses_validator.rb
@@ -1,5 +1,5 @@
class AlternativeReplyByEmailAddressesValidator
- def initialize(opts={})
+ def initialize(opts = {})
@opts = opts
end
diff --git a/lib/validators/email_setting_validator.rb b/lib/validators/email_setting_validator.rb
index e9fb583167b..e44725396d3 100644
--- a/lib/validators/email_setting_validator.rb
+++ b/lib/validators/email_setting_validator.rb
@@ -1,5 +1,5 @@
class EmailSettingValidator
- def initialize(opts={})
+ def initialize(opts = {})
@opts = opts
end
diff --git a/lib/validators/integer_setting_validator.rb b/lib/validators/integer_setting_validator.rb
index 185eb0a7994..48a8d6ca7a1 100644
--- a/lib/validators/integer_setting_validator.rb
+++ b/lib/validators/integer_setting_validator.rb
@@ -1,5 +1,5 @@
class IntegerSettingValidator
- def initialize(opts={})
+ def initialize(opts = {})
@opts = opts
@opts[:min] = 0 unless @opts[:min].present? || @opts[:hidden]
@opts[:max] = 20000 unless @opts[:max].present? || @opts[:hidden]
@@ -7,18 +7,18 @@ class IntegerSettingValidator
def valid_value?(val)
return false if val.to_i.to_s != val.to_s
- return false if @opts[:min] and @opts[:min].to_i > val.to_i
- return false if @opts[:max] and @opts[:max].to_i < val.to_i
+ return false if @opts[:min] && @opts[:min].to_i > (val.to_i)
+ return false if @opts[:max] && @opts[:max].to_i < (val.to_i)
true
end
def error_message
if @opts[:min] && @opts[:max]
- I18n.t('site_settings.errors.invalid_integer_min_max', {min: @opts[:min], max: @opts[:max]})
+ I18n.t('site_settings.errors.invalid_integer_min_max', min: @opts[:min], max: @opts[:max])
elsif @opts[:min]
- I18n.t('site_settings.errors.invalid_integer_min', {min: @opts[:min]})
+ I18n.t('site_settings.errors.invalid_integer_min', min: @opts[:min])
elsif @opts[:max]
- I18n.t('site_settings.errors.invalid_integer_max', {max: @opts[:max]})
+ I18n.t('site_settings.errors.invalid_integer_max', max: @opts[:max])
else
I18n.t('site_settings.errors.invalid_integer')
end
diff --git a/lib/validators/pop3_polling_enabled_setting_validator.rb b/lib/validators/pop3_polling_enabled_setting_validator.rb
index f62e252bbbe..d002f4eee7f 100644
--- a/lib/validators/pop3_polling_enabled_setting_validator.rb
+++ b/lib/validators/pop3_polling_enabled_setting_validator.rb
@@ -2,7 +2,7 @@ require "net/pop"
class POP3PollingEnabledSettingValidator
- def initialize(opts={})
+ def initialize(opts = {})
@opts = opts
end
diff --git a/lib/validators/post_validator.rb b/lib/validators/post_validator.rb
index dec44496a8a..a9b1f468c45 100644
--- a/lib/validators/post_validator.rb
+++ b/lib/validators/post_validator.rb
@@ -24,7 +24,7 @@ class Validators::PostValidator < ActiveModel::Validator
post.errors.add(:topic_id, :blank, options) if post.topic_id.blank?
end
- if post.new_record? and post.user_id.nil?
+ if post.new_record? && post.user_id.nil?
post.errors.add(:user_id, :blank, options)
end
end
diff --git a/lib/validators/regex_setting_validator.rb b/lib/validators/regex_setting_validator.rb
index e1aa9900b64..895342372aa 100644
--- a/lib/validators/regex_setting_validator.rb
+++ b/lib/validators/regex_setting_validator.rb
@@ -2,7 +2,7 @@ class RegexSettingValidator
LOREM = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam eget sem non elit tincidunt rhoncus.'.freeze
- def initialize(opts={})
+ def initialize(opts = {})
@opts = opts
end
diff --git a/lib/validators/reply_by_email_address_validator.rb b/lib/validators/reply_by_email_address_validator.rb
index 024a1aab707..3c3b5698f89 100644
--- a/lib/validators/reply_by_email_address_validator.rb
+++ b/lib/validators/reply_by_email_address_validator.rb
@@ -1,5 +1,5 @@
class ReplyByEmailAddressValidator
- def initialize(opts={})
+ def initialize(opts = {})
@opts = opts
end
diff --git a/lib/validators/reply_by_email_enabled_validator.rb b/lib/validators/reply_by_email_enabled_validator.rb
index e7333de0f6c..8170a129354 100644
--- a/lib/validators/reply_by_email_enabled_validator.rb
+++ b/lib/validators/reply_by_email_enabled_validator.rb
@@ -1,6 +1,6 @@
class ReplyByEmailEnabledValidator
- def initialize(opts={})
+ def initialize(opts = {})
@opts = opts
end
diff --git a/lib/validators/sso_overrides_email_validator.rb b/lib/validators/sso_overrides_email_validator.rb
index 4af0149b5f6..202cfc7b00c 100644
--- a/lib/validators/sso_overrides_email_validator.rb
+++ b/lib/validators/sso_overrides_email_validator.rb
@@ -1,5 +1,5 @@
class SsoOverridesEmailValidator
- def initialize(opts={})
+ def initialize(opts = {})
@opts = opts
end
diff --git a/lib/validators/string_setting_validator.rb b/lib/validators/string_setting_validator.rb
index 07a65500bdd..b7ffc2dcf3e 100644
--- a/lib/validators/string_setting_validator.rb
+++ b/lib/validators/string_setting_validator.rb
@@ -1,5 +1,5 @@
class StringSettingValidator
- def initialize(opts={})
+ def initialize(opts = {})
@opts = opts
@regex = Regexp.new(opts[:regex]) if opts[:regex]
@regex_error = opts[:regex_error] || 'site_settings.errors.regex_mismatch'
@@ -8,12 +8,12 @@ class StringSettingValidator
def valid_value?(val)
return true if !val.present?
- if (@opts[:min] and @opts[:min].to_i > val.length) || (@opts[:max] and @opts[:max].to_i < val.length)
+ if (@opts[:min] && @opts[:min].to_i > (val.length)) || (@opts[:max] && @opts[:max].to_i < (val.length))
@length_fail = true
return false
end
- if @regex and !(val =~ @regex)
+ if @regex && !(val =~ @regex)
@regex_fail = true
return false
end
@@ -26,11 +26,11 @@ class StringSettingValidator
I18n.t(@regex_error)
elsif @length_fail
if @opts[:min] && @opts[:max]
- I18n.t('site_settings.errors.invalid_string_min_max', {min: @opts[:min], max: @opts[:max]})
+ I18n.t('site_settings.errors.invalid_string_min_max', min: @opts[:min], max: @opts[:max])
elsif @opts[:min]
- I18n.t('site_settings.errors.invalid_string_min', {min: @opts[:min]})
+ I18n.t('site_settings.errors.invalid_string_min', min: @opts[:min])
else
- I18n.t('site_settings.errors.invalid_string_max', {max: @opts[:max]})
+ I18n.t('site_settings.errors.invalid_string_max', max: @opts[:max])
end
else
I18n.t('site_settings.errors.invalid_string')
diff --git a/lib/validators/topic_title_length_validator.rb b/lib/validators/topic_title_length_validator.rb
index 82d9d54f9ee..bdee42c81c8 100644
--- a/lib/validators/topic_title_length_validator.rb
+++ b/lib/validators/topic_title_length_validator.rb
@@ -7,15 +7,16 @@ class TopicTitleLengthValidator < ActiveModel::EachValidator
private
def title_validator(record)
- length_range = if record.user.try(:admin?)
- 1..SiteSetting.max_topic_title_length
- elsif record.private_message?
- SiteSetting.private_message_title_length
- else
- SiteSetting.topic_title_length
- end
+ length_range =
+ if record.user.try(:admin?)
+ 1..SiteSetting.max_topic_title_length
+ elsif record.private_message?
+ SiteSetting.private_message_title_length
+ else
+ SiteSetting.topic_title_length
+ end
- ActiveModel::Validations::LengthValidator.new({attributes: :title, in: length_range, allow_blank: true})
+ ActiveModel::Validations::LengthValidator.new(attributes: :title, in: length_range, allow_blank: true)
end
end
diff --git a/lib/validators/username_setting_validator.rb b/lib/validators/username_setting_validator.rb
index 3dbc75fba1d..d9aa18ad5fc 100644
--- a/lib/validators/username_setting_validator.rb
+++ b/lib/validators/username_setting_validator.rb
@@ -1,5 +1,5 @@
class UsernameSettingValidator
- def initialize(opts={})
+ def initialize(opts = {})
@opts = opts
end
diff --git a/lib/wizard.rb b/lib/wizard.rb
index e7a74f190c1..d577c2aa29a 100644
--- a/lib/wizard.rb
+++ b/lib/wizard.rb
@@ -87,10 +87,10 @@ class Wizard
end
first_admin_id = User.where(admin: true)
- .human_users
- .joins(:user_auth_tokens)
- .order('user_auth_tokens.created_at')
- .pluck(:id).first
+ .human_users
+ .joins(:user_auth_tokens)
+ .order('user_auth_tokens.created_at')
+ .pluck(:id).first
if @user&.id && first_admin_id == @user.id
!Wizard::Builder.new(@user).build.completed?
diff --git a/lib/wizard/builder.rb b/lib/wizard/builder.rb
index 56e6bc4a32f..d3ba97ff1f6 100644
--- a/lib/wizard/builder.rb
+++ b/lib/wizard/builder.rb
@@ -82,7 +82,7 @@ class Wizard
username = Discourse.system_user.username if username.blank?
contact = step.add_field(id: 'site_contact', type: 'dropdown', value: username)
- User.where(admin: true).pluck(:username).each {|c| contact.add_choice(c) }
+ User.where(admin: true).pluck(:username).each { |c| contact.add_choice(c) }
step.on_update do |updater|
updater.apply_settings(:contact_email, :contact_url)
@@ -120,8 +120,8 @@ class Wizard
themes = step.add_field(id: 'base_scheme_id', type: 'dropdown', required: true, value: scheme_id)
ColorScheme.base_color_scheme_colors.each do |t|
with_hash = t[:colors].dup
- with_hash.map{|k,v| with_hash[k] = "##{v}"}
- themes.add_choice(t[:id], data: {colors: with_hash})
+ with_hash.map { |k, v| with_hash[k] = "##{v}" }
+ themes.add_choice(t[:id], data: { colors: with_hash })
end
step.add_field(id: 'theme_preview', type: 'component')
@@ -187,12 +187,10 @@ class Wizard
end
@wizard.append_step('emoji') do |step|
- sets = step.add_field({
- id: 'emoji_set',
- type: 'radio',
- required: true,
- value: SiteSetting.emoji_set
- })
+ sets = step.add_field(id: 'emoji_set',
+ type: 'radio',
+ required: true,
+ value: SiteSetting.emoji_set)
emoji = ["smile", "+1", "tada", "poop"]
@@ -201,10 +199,8 @@ class Wizard
""
end
- sets.add_choice(set[:value], {
- label: I18n.t("js.#{set[:name]}"),
- extra_label: "#{imgs.join}"
- })
+ sets.add_choice(set[:value], label: I18n.t("js.#{set[:name]}"),
+ extra_label: "#{imgs.join}")
step.on_update do |updater|
updater.apply_settings(:emoji_set)
diff --git a/lib/wizard/field.rb b/lib/wizard/field.rb
index 0816e055d7f..45fdacc9992 100644
--- a/lib/wizard/field.rb
+++ b/lib/wizard/field.rb
@@ -27,7 +27,7 @@ class Wizard
@choices = []
end
- def add_choice(id, opts=nil)
+ def add_choice(id, opts = nil)
choice = Choice.new(id, opts || {})
choice.field = self
diff --git a/lib/wizard/step_updater.rb b/lib/wizard/step_updater.rb
index f05605c33fe..3d8ad87a3d6 100644
--- a/lib/wizard/step_updater.rb
+++ b/lib/wizard/step_updater.rb
@@ -44,7 +44,7 @@ class Wizard
end
def apply_settings(*ids)
- ids.each {|id| apply_setting(id)}
+ ids.each { |id| apply_setting(id) }
end
end
diff --git a/plugins/discourse-narrative-bot/db/fixtures/001_discobot.rb b/plugins/discourse-narrative-bot/db/fixtures/001_discobot.rb
index e9ce7b2dd6a..ebc2299937f 100644
--- a/plugins/discourse-narrative-bot/db/fixtures/001_discobot.rb
+++ b/plugins/discourse-narrative-bot/db/fixtures/001_discobot.rb
@@ -1,4 +1,4 @@
-discobot_username ='discobot'
+discobot_username = 'discobot'
user = User.find_by(id: -2)
if !user
@@ -37,7 +37,7 @@ if !user
end
bot = User.find(-2)
-bot.update!(admin:true, moderator: false)
+bot.update!(admin: true, moderator: false)
bot.user_option.update!(
email_private_messages: false,
diff --git a/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/advanced_user_narrative.rb b/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/advanced_user_narrative.rb
index fb6b4e2e14a..b5fbe5bc732 100644
--- a/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/advanced_user_narrative.rb
+++ b/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/advanced_user_narrative.rb
@@ -101,7 +101,7 @@ module DiscourseNarrativeBot
def reset_bot(user, post)
if pm_to_bot?(post)
- reset_data(user, { topic_id: post.topic_id })
+ reset_data(user, topic_id: post.topic_id)
else
reset_data(user)
end
@@ -116,15 +116,13 @@ module DiscourseNarrativeBot
fake_delay
- post = PostCreator.create!(@user, {
- raw: I18n.t(
+ post = PostCreator.create!(@user, raw: I18n.t(
"#{I18N_KEY}.edit.bot_created_post_raw",
i18n_post_args(discobot_username: self.discobot_user.username)
),
- topic_id: data[:topic_id],
- skip_bot: true,
- skip_validations: true
- })
+ topic_id: data[:topic_id],
+ skip_bot: true,
+ skip_validations: true)
set_state_data(:post_id, post.id)
post
@@ -133,15 +131,13 @@ module DiscourseNarrativeBot
def init_tutorial_recover
data = get_data(@user)
- post = PostCreator.create!(@user, {
- raw: I18n.t(
+ post = PostCreator.create!(@user, raw: I18n.t(
"#{I18N_KEY}.recover.deleted_post_raw",
i18n_post_args(discobot_username: self.discobot_user.username)
),
- topic_id: data[:topic_id],
- skip_bot: true,
- skip_validations: true
- })
+ topic_id: data[:topic_id],
+ skip_bot: true,
+ skip_validations: true)
set_state_data(:post_id, post.id)
diff --git a/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/base.rb b/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/base.rb
index e00cf5eb2f0..f2bbc9d3b1c 100644
--- a/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/base.rb
+++ b/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/base.rb
@@ -109,7 +109,7 @@ module DiscourseNarrativeBot
skip_trigger: TrackSelector.skip_trigger,
reset_trigger: "#{TrackSelector.reset_trigger} #{self.class.reset_trigger}"
)
- ), {}, { skip_send_email: false })
+ ), {}, skip_send_email: false)
end
end
@@ -168,8 +168,8 @@ module DiscourseNarrativeBot
end
end
- def i18n_post_args(extra={})
- {base_uri: Discourse.base_uri}.merge(extra)
+ def i18n_post_args(extra = {})
+ { base_uri: Discourse.base_uri }.merge(extra)
end
def valid_topic?(topic_id)
diff --git a/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/new_user_narrative.rb b/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/new_user_narrative.rb
index 76e5b2e6fe0..7596d335a15 100644
--- a/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/new_user_narrative.rb
+++ b/plugins/discourse-narrative-bot/lib/discourse_narrative_bot/new_user_narrative.rb
@@ -121,7 +121,7 @@ module DiscourseNarrativeBot
def reset_bot(user, post)
if pm_to_bot?(post)
- reset_data(user, { topic_id: post.topic_id })
+ reset_data(user, topic_id: post.topic_id)
else
reset_data(user)
end
@@ -154,7 +154,7 @@ module DiscourseNarrativeBot
PostRevisor.new(post, topic).revise!(
self.discobot_user,
{ raw: raw },
- { skip_validations: true, force_new_version: true }
+ skip_validations: true, force_new_version: true
)
set_state_data(:post_version, post.reload.version || 0)
diff --git a/plugins/discourse-narrative-bot/plugin.rb b/plugins/discourse-narrative-bot/plugin.rb
index adc514e29c4..79aba1b6ede 100644
--- a/plugins/discourse-narrative-bot/plugin.rb
+++ b/plugins/discourse-narrative-bot/plugin.rb
@@ -96,7 +96,7 @@ after_initialize do
end
respond_to do |format|
- format.svg { render inline: svg}
+ format.svg { render inline: svg }
end
end
end
diff --git a/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/advanced_user_narrative_spec.rb b/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/advanced_user_narrative_spec.rb
index a3dd4e826ca..5c2eeb04523 100644
--- a/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/advanced_user_narrative_spec.rb
+++ b/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/advanced_user_narrative_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe DiscourseNarrativeBot::AdvancedUserNarrative do
let(:topic) do
Fabricate(:private_message_topic, first_post: first_post,
- topic_allowed_users: [
+ topic_allowed_users: [
Fabricate.build(:topic_allowed_user, user: discobot_user),
Fabricate.build(:topic_allowed_user, user: user),
]
@@ -79,15 +79,13 @@ RSpec.describe DiscourseNarrativeBot::AdvancedUserNarrative do
new_post = Post.offset(1).last
- expect(narrative.get_data(user)).to eq({
- "topic_id" => topic.id,
- "state" => "tutorial_edit",
- "last_post_id" => new_post.id,
- "track" => described_class.to_s,
- "tutorial_edit" => {
+ expect(narrative.get_data(user)).to eq("topic_id" => topic.id,
+ "state" => "tutorial_edit",
+ "last_post_id" => new_post.id,
+ "track" => described_class.to_s,
+ "tutorial_edit" => {
"post_id" => Post.last.id
- }
- })
+ })
expect(new_post.raw).to eq(expected_raw.chomp)
expect(new_post.topic.id).to eq(topic.id)
@@ -111,15 +109,13 @@ RSpec.describe DiscourseNarrativeBot::AdvancedUserNarrative do
new_post = Post.offset(1).last
- expect(narrative.get_data(user)).to eq({
- "topic_id" => new_post.topic.id,
- "state" => "tutorial_edit",
- "last_post_id" => new_post.id,
- "track" => described_class.to_s,
- "tutorial_edit" => {
+ expect(narrative.get_data(user)).to eq("topic_id" => new_post.topic.id,
+ "state" => "tutorial_edit",
+ "last_post_id" => new_post.id,
+ "track" => described_class.to_s,
+ "tutorial_edit" => {
"post_id" => Post.last.id
- }
- })
+ })
expect(new_post.raw).to eq(expected_raw.chomp)
expect(new_post.topic.id).to_not eq(topic.id)
@@ -659,11 +655,9 @@ RSpec.describe DiscourseNarrativeBot::AdvancedUserNarrative do
'discourse_narrative_bot.advanced_user_narrative.details.reply', base_uri: ''
))
- expect(narrative.get_data(user)).to eq({
- "state" => "end",
- "topic_id" => topic.id,
- "track" => described_class.to_s
- })
+ expect(narrative.get_data(user)).to eq("state" => "end",
+ "topic_id" => topic.id,
+ "track" => described_class.to_s)
expect(user.badges.where(name: DiscourseNarrativeBot::AdvancedUserNarrative::BADGE_NAME).exists?)
.to eq(true)
diff --git a/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/new_user_narrative_spec.rb b/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/new_user_narrative_spec.rb
index b234519ed9f..f85c05b070f 100644
--- a/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/new_user_narrative_spec.rb
+++ b/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/new_user_narrative_spec.rb
@@ -8,7 +8,7 @@ describe DiscourseNarrativeBot::NewUserNarrative do
let(:topic) do
Fabricate(:private_message_topic, first_post: first_post,
- topic_allowed_users: [
+ topic_allowed_users: [
Fabricate.build(:topic_allowed_user, user: discobot_user),
Fabricate.build(:topic_allowed_user, user: user),
]
@@ -83,12 +83,10 @@ describe DiscourseNarrativeBot::NewUserNarrative do
new_post = Post.last
- expect(narrative.get_data(user)).to eq({
- "topic_id" => topic.id,
- "state" => "tutorial_bookmark",
- "last_post_id" => new_post.id,
- "track" => described_class.to_s
- })
+ expect(narrative.get_data(user)).to eq("topic_id" => topic.id,
+ "state" => "tutorial_bookmark",
+ "last_post_id" => new_post.id,
+ "track" => described_class.to_s)
expect(new_post.raw).to eq(expected_raw.chomp)
expect(new_post.topic.id).to eq(topic.id)
@@ -111,12 +109,10 @@ describe DiscourseNarrativeBot::NewUserNarrative do
new_post = Post.last
- expect(narrative.get_data(user)).to eq({
- "topic_id" => new_post.topic.id,
- "state" => "tutorial_bookmark",
- "last_post_id" => new_post.id,
- "track" => described_class.to_s
- })
+ expect(narrative.get_data(user)).to eq("topic_id" => new_post.topic.id,
+ "state" => "tutorial_bookmark",
+ "last_post_id" => new_post.id,
+ "track" => described_class.to_s)
expect(new_post.raw).to eq(expected_raw.chomp)
expect(new_post.topic.id).to_not eq(topic.id)
@@ -922,11 +918,9 @@ describe DiscourseNarrativeBot::NewUserNarrative do
expect(first_post.reload.raw).to eq('Hello world')
- expect(narrative.get_data(user)).to include({
- "state" => "end",
- "topic_id" => new_post.topic_id,
- "track" => described_class.to_s,
- })
+ expect(narrative.get_data(user)).to include("state" => "end",
+ "topic_id" => new_post.topic_id,
+ "track" => described_class.to_s)
expect(user.badges.where(name: DiscourseNarrativeBot::NewUserNarrative::BADGE_NAME).exists?)
.to eq(true)
diff --git a/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/track_selector_spec.rb b/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/track_selector_spec.rb
index b6166ccfcfe..5e7594a2e72 100644
--- a/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/track_selector_spec.rb
+++ b/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/track_selector_spec.rb
@@ -42,7 +42,7 @@ describe DiscourseNarrativeBot::TrackSelector do
let(:topic) do
Fabricate(:private_message_topic, first_post: first_post,
- topic_allowed_users: [
+ topic_allowed_users: [
Fabricate.build(:topic_allowed_user, user: discobot_user),
Fabricate.build(:topic_allowed_user, user: user),
]
@@ -454,7 +454,6 @@ describe DiscourseNarrativeBot::TrackSelector do
expect(new_post.raw).to eq(random_mention_reply)
end
-
describe 'rate limiting random reply message in public topic' do
let(:topic) { Fabricate(:topic) }
let(:other_post) { Fabricate(:post, raw: '@discobot show me something', topic: topic) }
diff --git a/plugins/discourse-nginx-performance-report/app/jobs/scheduled/daily_performance_report.rb b/plugins/discourse-nginx-performance-report/app/jobs/scheduled/daily_performance_report.rb
index 78b25666e4d..80d44a2aeb2 100644
--- a/plugins/discourse-nginx-performance-report/app/jobs/scheduled/daily_performance_report.rb
+++ b/plugins/discourse-nginx-performance-report/app/jobs/scheduled/daily_performance_report.rb
@@ -45,7 +45,6 @@ module Jobs
title: I18n.t('performance_report.initial_topic_title'),
skip_validations: true)
-
unless post && post.topic_id
raise StandardError, "Could not create or retrieve performance report topic id"
end
diff --git a/plugins/discourse-nginx-performance-report/lib/log_analyzer.rb b/plugins/discourse-nginx-performance-report/lib/log_analyzer.rb
index 79cac5163ad..439b1202470 100644
--- a/plugins/discourse-nginx-performance-report/lib/log_analyzer.rb
+++ b/plugins/discourse-nginx-performance-report/lib/log_analyzer.rb
@@ -2,7 +2,6 @@ class LogAnalyzer
class LineParser
-
# log_format log_discourse '[$time_local] "$http_host" $remote_addr "$request" "$http_user_agent" "$sent_http_x_discourse_route" $status $bytes_sent "$http_referer" $upstream_response_time $request_time "$sent_http_x_discourse_username"';
attr_accessor :time, :ip_address, :url, :route, :user_agent, :rails_duration, :total_duration,
@@ -69,8 +68,8 @@ class LogAnalyzer
@aggregate_type = :duration
end
- def add(id, duration, aggregate=nil)
- ary = (@data[id] ||= [0,0])
+ def add(id, duration, aggregate = nil)
+ ary = (@data[id] ||= [0, 0])
ary[0] += duration
ary[1] += 1
unless aggregate.nil?
@@ -83,8 +82,8 @@ class LogAnalyzer
end
end
- def top(n, aggregator_formatter=nil)
- @data.sort{|a,b| b[1][0] <=> a[1][0]}.first(n).map do |metric, ary|
+ def top(n, aggregator_formatter = nil)
+ @data.sort { |a, b| b[1][0] <=> a[1][0] }.first(n).map do |metric, ary|
metric = metric.to_s
metric = "[empty]" if metric.length == 0
result = [metric, ary[0], ary[1]]
@@ -93,7 +92,7 @@ class LogAnalyzer
if aggregator_formatter
result.push aggregator_formatter.call(ary[2], ary[0], ary[1])
else
- result.push ary[2].sort{|a,b| b[1] <=> a[1]}.first(5).map{|k,v|
+ result.push ary[2].sort { |a, b| b[1] <=> a[1] }.first(5).map { |k, v|
v = "%.2f" % v if Float === v
"#{k}(#{v})"}.join(" ")
end
@@ -104,7 +103,7 @@ class LogAnalyzer
end
end
- def initialize(filenames, args={})
+ def initialize(filenames, args = {})
@filenames = filenames
@ip_to_rails_duration = Aggeregator.new
@username_to_rails_duration = Aggeregator.new
@@ -148,7 +147,7 @@ class LogAnalyzer
@url_to_rails_duration.add(parsed.url, parsed.rails_duration)
- @status_404_to_count.add(parsed.url,1) if parsed.status == "404"
+ @status_404_to_count.add(parsed.url, 1) if parsed.status == "404"
end
end
self
diff --git a/plugins/discourse-nginx-performance-report/script/nginx_analyze.rb b/plugins/discourse-nginx-performance-report/script/nginx_analyze.rb
index 8550806f879..480beb67ebd 100644
--- a/plugins/discourse-nginx-performance-report/script/nginx_analyze.rb
+++ b/plugins/discourse-nginx-performance-report/script/nginx_analyze.rb
@@ -30,7 +30,7 @@ def top(cols, aggregator, count, aggregator_formatter = nil)
col_just = []
- col_widths = map_with_index(cols) do |name,idx|
+ col_widths = map_with_index(cols) do |name, idx|
max_width = name.length
if cols[idx].respond_to? :align
@@ -46,14 +46,14 @@ def top(cols, aggregator, count, aggregator_formatter = nil)
row[idx] = row[idx].to_s
max_width = row[idx].length if row[idx].length > max_width
end
- [max_width,80].min
+ [max_width, 80].min
end
- puts(map_with_index(cols) do |name,idx|
+ puts(map_with_index(cols) do |name, idx|
name.ljust(col_widths[idx])
end.join(" "))
- puts(map_with_index(cols) do |name,idx|
+ puts(map_with_index(cols) do |name, idx|
("-" * name.length).ljust(col_widths[idx])
end.join(" "))
@@ -102,7 +102,7 @@ end
puts
puts "Analyzed: #{analyzer.filenames.join(",")} on #{`hostname`}"
if limit
- puts "Limited to #{DateTime.now - (limit.to_f / (60*24.0))} - #{DateTime.now}"
+ puts "Limited to #{DateTime.now - (limit.to_f / (60 * 24.0))} - #{DateTime.now}"
end
puts SPACER
puts "#{analyzer.from_time} - #{analyzer.to_time}"
@@ -121,7 +121,7 @@ puts SPACER
puts
puts "Top 100 routes by Server Load"
puts
-top(["Route", "Duration", "Reqs", Column.new("Mobile", :rjust)], analyzer.route_to_rails_duration, 100, lambda{
+top(["Route", "Duration", "Reqs", Column.new("Mobile", :rjust)], analyzer.route_to_rails_duration, 100, lambda {
|hash, name, total|
"#{hash["mobile"] || 0} (#{"%.2f" % (((hash["mobile"] || 0) / (total + 0.0)) * 100)})%"}
)
diff --git a/plugins/poll/db/migrate/20151016163051_merge_polls_votes.rb b/plugins/poll/db/migrate/20151016163051_merge_polls_votes.rb
index 17e6459e120..33bd122bdf9 100644
--- a/plugins/poll/db/migrate/20151016163051_merge_polls_votes.rb
+++ b/plugins/poll/db/migrate/20151016163051_merge_polls_votes.rb
@@ -5,11 +5,11 @@ class MergePollsVotes < ActiveRecord::Migration
polls_votes = {}
PostCustomField.where(post_id: post_id).where("name LIKE 'polls-votes-%'").find_each do |pcf|
user_id = pcf.name["polls-votes-".size..-1]
- polls_votes["#{user_id}"] = ::JSON.parse(pcf.value||"{}")
+ polls_votes["#{user_id}"] = ::JSON.parse(pcf.value || "{}")
end
pcf = PostCustomField.find_or_create_by(name: "polls-votes", post_id: post_id)
- pcf.value = ::JSON.parse(pcf.value||"{}").merge(polls_votes).to_json
+ pcf.value = ::JSON.parse(pcf.value || "{}").merge(polls_votes).to_json
pcf.save
end
end
diff --git a/plugins/poll/db/migrate/20160321164925_close_polls_in_closed_topics.rb b/plugins/poll/db/migrate/20160321164925_close_polls_in_closed_topics.rb
index 5ca969c68dc..978a41c890c 100644
--- a/plugins/poll/db/migrate/20160321164925_close_polls_in_closed_topics.rb
+++ b/plugins/poll/db/migrate/20160321164925_close_polls_in_closed_topics.rb
@@ -2,9 +2,9 @@ class ClosePollsInClosedTopics < ActiveRecord::Migration
def up
PostCustomField.joins(post: :topic)
- .where("post_custom_fields.name = 'polls'")
- .where("topics.closed")
- .find_each do |pcf|
+ .where("post_custom_fields.name = 'polls'")
+ .where("topics.closed")
+ .find_each do |pcf|
polls = ::JSON.parse(pcf.value || "{}")
polls.values.each { |poll| poll["status"] = "closed" }
pcf.value = polls.to_json
diff --git a/plugins/poll/lib/polls_updater.rb b/plugins/poll/lib/polls_updater.rb
index 5464005175d..488331041b1 100644
--- a/plugins/poll/lib/polls_updater.rb
+++ b/plugins/poll/lib/polls_updater.rb
@@ -101,7 +101,7 @@ module DiscoursePoll
post.save_custom_fields(true)
# publish the changes
- MessageBus.publish("/polls/#{post.topic_id}", { post_id: post.id, polls: polls })
+ MessageBus.publish("/polls/#{post.topic_id}", post_id: post.id, polls: polls)
end
end
diff --git a/plugins/poll/lib/tasks/migrate_old_polls.rake b/plugins/poll/lib/tasks/migrate_old_polls.rake
index 17e5c3946c8..d8f2ee40644 100644
--- a/plugins/poll/lib/tasks/migrate_old_polls.rake
+++ b/plugins/poll/lib/tasks/migrate_old_polls.rake
@@ -27,9 +27,9 @@ desc "Migrate old polls to new syntax"
task "poll:migrate_old_polls" => :environment do
# iterate over all polls
PluginStoreRow.where(plugin_name: "poll")
- .where("key LIKE 'poll_options_%'")
- .pluck(:key)
- .each do |poll_options_key|
+ .where("key LIKE 'poll_options_%'")
+ .pluck(:key)
+ .each do |poll_options_key|
# extract the post_id
post_id = poll_options_key["poll_options_".length..-1].to_i
# load the post from the db
@@ -56,9 +56,9 @@ task "poll:migrate_old_polls" => :environment do
options = post.custom_fields["polls"]["poll"]["options"]
# iterate over all votes
PluginStoreRow.where(plugin_name: "poll")
- .where("key LIKE 'poll_vote_#{post_id}_%'")
- .pluck(:key, :value)
- .each do |poll_vote_key, vote|
+ .where("key LIKE 'poll_vote_#{post_id}_%'")
+ .pluck(:key, :value)
+ .each do |poll_vote_key, vote|
# extract the user_id
user_id = poll_vote_key["poll_vote_#{post_id}_%".length..-1].to_i
# find the selected option
diff --git a/plugins/poll/plugin.rb b/plugins/poll/plugin.rb
index 2bf54226e3f..33709ecb0f5 100644
--- a/plugins/poll/plugin.rb
+++ b/plugins/poll/plugin.rb
@@ -136,7 +136,7 @@ after_initialize do
post.save_custom_fields(true)
- MessageBus.publish("/polls/#{post.topic_id}", {post_id: post.id, polls: polls })
+ MessageBus.publish("/polls/#{post.topic_id}", post_id: post.id, polls: polls)
polls[poll_name]
end
@@ -230,7 +230,7 @@ after_initialize do
end
next unless option["voter_ids"]
- user_ids << option["voter_ids"].slice((params[:offset].to_i || 0) * 25, 25)
+ user_ids << option["voter_ids"].slice((params[:offset].to_i || 0) * 25, 25)
end
user_ids.flatten!
@@ -295,7 +295,7 @@ after_initialize do
end
end
- validate(:post, :validate_polls) do |force=nil|
+ validate(:post, :validate_polls) do |force = nil|
return if !SiteSetting.poll_enabled? && (self.user && !self.user.staff?)
# only care when raw has changed!
@@ -360,9 +360,8 @@ after_initialize do
# tells the front-end we have a poll for that post
on(:post_created) do |post|
next if post.is_first_post? || post.custom_fields[DiscoursePoll::POLLS_CUSTOM_FIELD].blank?
- MessageBus.publish("/polls/#{post.topic_id}", {
- post_id: post.id,
- polls: post.custom_fields[DiscoursePoll::POLLS_CUSTOM_FIELD]})
+ MessageBus.publish("/polls/#{post.topic_id}", post_id: post.id,
+ polls: post.custom_fields[DiscoursePoll::POLLS_CUSTOM_FIELD])
end
add_to_serializer(:post, :polls, false) do
diff --git a/plugins/poll/spec/controllers/polls_controller_spec.rb b/plugins/poll/spec/controllers/polls_controller_spec.rb
index 677a72d6098..02db8bdf930 100644
--- a/plugins/poll/spec/controllers/polls_controller_spec.rb
+++ b/plugins/poll/spec/controllers/polls_controller_spec.rb
@@ -13,7 +13,7 @@ describe ::DiscoursePoll::PollsController do
it "works" do
MessageBus.expects(:publish)
- xhr :put, :vote, { post_id: poll.id, poll_name: "poll", options: ["5c24fc1df56d764b550ceae1b9319125"] }
+ xhr :put, :vote, post_id: poll.id, poll_name: "poll", options: ["5c24fc1df56d764b550ceae1b9319125"]
expect(response).to be_success
json = ::JSON.parse(response.body)
@@ -23,7 +23,7 @@ describe ::DiscoursePoll::PollsController do
end
it "requires at least 1 valid option" do
- xhr :put, :vote, { post_id: poll.id, poll_name: "poll", options: ["A", "B"] }
+ xhr :put, :vote, post_id: poll.id, poll_name: "poll", options: ["A", "B"]
expect(response).not_to be_success
json = ::JSON.parse(response.body)
@@ -31,10 +31,10 @@ describe ::DiscoursePoll::PollsController do
end
it "supports vote changes" do
- xhr :put, :vote, { post_id: poll.id, poll_name: "poll", options: ["5c24fc1df56d764b550ceae1b9319125"] }
+ xhr :put, :vote, post_id: poll.id, poll_name: "poll", options: ["5c24fc1df56d764b550ceae1b9319125"]
expect(response).to be_success
- xhr :put, :vote, { post_id: poll.id, poll_name: "poll", options: ["e89dec30bbd9bf50fabf6a05b4324edf"] }
+ xhr :put, :vote, post_id: poll.id, poll_name: "poll", options: ["e89dec30bbd9bf50fabf6a05b4324edf"]
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["poll"]["voters"]).to eq(1)
@@ -44,13 +44,13 @@ describe ::DiscoursePoll::PollsController do
it "works even if topic is closed" do
topic.update_attribute(:closed, true)
- xhr :put, :vote, { post_id: poll.id, poll_name: "poll", options: ["5c24fc1df56d764b550ceae1b9319125"] }
+ xhr :put, :vote, post_id: poll.id, poll_name: "poll", options: ["5c24fc1df56d764b550ceae1b9319125"]
expect(response).to be_success
end
it "ensures topic is not archived" do
topic.update_attribute(:archived, true)
- xhr :put, :vote, { post_id: poll.id, poll_name: "poll", options: ["A"] }
+ xhr :put, :vote, post_id: poll.id, poll_name: "poll", options: ["A"]
expect(response).not_to be_success
json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq(I18n.t("poll.topic_must_be_open_to_vote"))
@@ -58,21 +58,21 @@ describe ::DiscoursePoll::PollsController do
it "ensures post is not trashed" do
poll.trash!
- xhr :put, :vote, { post_id: poll.id, poll_name: "poll", options: ["A"] }
+ xhr :put, :vote, post_id: poll.id, poll_name: "poll", options: ["A"]
expect(response).not_to be_success
json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq(I18n.t("poll.post_is_deleted"))
end
it "ensures polls are associated with the post" do
- xhr :put, :vote, { post_id: Fabricate(:post).id, poll_name: "foobar", options: ["A"] }
+ xhr :put, :vote, post_id: Fabricate(:post).id, poll_name: "foobar", options: ["A"]
expect(response).not_to be_success
json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq(I18n.t("poll.no_polls_associated_with_this_post"))
end
it "checks the name of the poll" do
- xhr :put, :vote, { post_id: poll.id, poll_name: "foobar", options: ["A"] }
+ xhr :put, :vote, post_id: poll.id, poll_name: "foobar", options: ["A"]
expect(response).not_to be_success
json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq(I18n.t("poll.no_poll_with_this_name", name: "foobar"))
@@ -80,7 +80,7 @@ describe ::DiscoursePoll::PollsController do
it "ensures poll is open" do
closed_poll = create_post(raw: "[poll status=closed]\n- A\n- B\n[/poll]")
- xhr :put, :vote, { post_id: closed_poll.id, poll_name: "poll", options: ["5c24fc1df56d764b550ceae1b9319125"] }
+ xhr :put, :vote, post_id: closed_poll.id, poll_name: "poll", options: ["5c24fc1df56d764b550ceae1b9319125"]
expect(response).not_to be_success
json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq(I18n.t("poll.poll_must_be_open_to_vote"))
@@ -88,9 +88,9 @@ describe ::DiscoursePoll::PollsController do
it "doesn't discard anonymous votes when someone votes" do
default_poll = poll.custom_fields["polls"]["poll"]
- add_anonymous_votes(poll, default_poll, 17, {"5c24fc1df56d764b550ceae1b9319125" => 11, "e89dec30bbd9bf50fabf6a05b4324edf" => 6})
+ add_anonymous_votes(poll, default_poll, 17, "5c24fc1df56d764b550ceae1b9319125" => 11, "e89dec30bbd9bf50fabf6a05b4324edf" => 6)
- xhr :put, :vote, { post_id: poll.id, poll_name: "poll", options: ["5c24fc1df56d764b550ceae1b9319125"] }
+ xhr :put, :vote, post_id: poll.id, poll_name: "poll", options: ["5c24fc1df56d764b550ceae1b9319125"]
expect(response).to be_success
json = ::JSON.parse(response.body)
@@ -148,7 +148,7 @@ describe ::DiscoursePoll::PollsController do
it "works for OP" do
MessageBus.expects(:publish)
- xhr :put, :toggle_status, { post_id: poll.id, poll_name: "poll", status: "closed" }
+ xhr :put, :toggle_status, post_id: poll.id, poll_name: "poll", status: "closed"
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["poll"]["status"]).to eq("closed")
@@ -158,7 +158,7 @@ describe ::DiscoursePoll::PollsController do
log_in(:moderator)
MessageBus.expects(:publish)
- xhr :put, :toggle_status, { post_id: poll.id, poll_name: "poll", status: "closed" }
+ xhr :put, :toggle_status, post_id: poll.id, poll_name: "poll", status: "closed"
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["poll"]["status"]).to eq("closed")
@@ -166,7 +166,7 @@ describe ::DiscoursePoll::PollsController do
it "ensures post is not trashed" do
poll.trash!
- xhr :put, :toggle_status, { post_id: poll.id, poll_name: "poll", status: "closed" }
+ xhr :put, :toggle_status, post_id: poll.id, poll_name: "poll", status: "closed"
expect(response).not_to be_success
json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq(I18n.t("poll.post_is_deleted"))
diff --git a/plugins/poll/spec/controllers/posts_controller_spec.rb b/plugins/poll/spec/controllers/posts_controller_spec.rb
index 41bd0a42db8..dd0219f3845 100644
--- a/plugins/poll/spec/controllers/posts_controller_spec.rb
+++ b/plugins/poll/spec/controllers/posts_controller_spec.rb
@@ -12,7 +12,7 @@ describe PostsController do
describe "polls" do
it "works" do
- xhr :post, :create, { title: title, raw: "[poll]\n- A\n- B\n[/poll]" }
+ xhr :post, :create, title: title, raw: "[poll]\n- A\n- B\n[/poll]"
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["cooked"]).to match("data-poll-")
@@ -21,7 +21,7 @@ describe PostsController do
it "works on any post" do
post = Fabricate(:post)
- xhr :post, :create, { topic_id: post.topic.id, raw: "[poll]\n- A\n- B\n[/poll]" }
+ xhr :post, :create, topic_id: post.topic.id, raw: "[poll]\n- A\n- B\n[/poll]"
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["cooked"]).to match("data-poll-")
@@ -29,14 +29,14 @@ describe PostsController do
end
it "should have different options" do
- xhr :post, :create, { title: title, raw: "[poll]\n- A\n- A\n[/poll]" }
+ xhr :post, :create, title: title, raw: "[poll]\n- A\n- A\n[/poll]"
expect(response).not_to be_success
json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq(I18n.t("poll.default_poll_must_have_different_options"))
end
it "should have at least 2 options" do
- xhr :post, :create, { title: title, raw: "[poll]\n- A\n[/poll]" }
+ xhr :post, :create, title: title, raw: "[poll]\n- A\n[/poll]"
expect(response).not_to be_success
json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq(I18n.t("poll.default_poll_must_have_at_least_2_options"))
@@ -47,7 +47,7 @@ describe PostsController do
(SiteSetting.poll_maximum_options + 1).times { |n| raw << "\n- #{n}" }
raw << "\n[/poll]"
- xhr :post, :create, { title: title, raw: raw }
+ xhr :post, :create, title: title, raw: raw
expect(response).not_to be_success
json = ::JSON.parse(response.body)
@@ -55,14 +55,14 @@ describe PostsController do
end
it "should have valid parameters" do
- xhr :post, :create, { title: title, raw: "[poll type=multiple min=5]\n- A\n- B\n[/poll]" }
+ xhr :post, :create, title: title, raw: "[poll type=multiple min=5]\n- A\n- B\n[/poll]"
expect(response).not_to be_success
json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq(I18n.t("poll.default_poll_with_multiple_choices_has_invalid_parameters"))
end
it "prevents self-xss" do
- xhr :post, :create, { title: title, raw: "[poll name=]\n- A\n- B\n[/poll]" }
+ xhr :post, :create, title: title, raw: "[poll name=]\n- A\n- B\n[/poll]"
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["cooked"]).to match("data-poll-")
@@ -71,7 +71,7 @@ describe PostsController do
end
it "also works whe there is a link starting with '[poll'" do
- xhr :post, :create, { title: title, raw: "[Polls are awesome](/foobar)\n[poll]\n- A\n- B\n[/poll]" }
+ xhr :post, :create, title: title, raw: "[Polls are awesome](/foobar)\n[poll]\n- A\n- B\n[/poll]"
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["cooked"]).to match("data-poll-")
@@ -79,7 +79,7 @@ describe PostsController do
end
it "prevents pollception" do
- xhr :post, :create, { title: title, raw: "[poll name=1]\n- A\n[poll name=2]\n- B\n- C\n[/poll]\n- D\n[/poll]" }
+ xhr :post, :create, title: title, raw: "[poll name=1]\n- A\n[poll name=2]\n- B\n- C\n[/poll]\n- D\n[/poll]"
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["cooked"]).to match("data-poll-")
@@ -93,13 +93,13 @@ describe PostsController do
let(:post_id) do
freeze_time(4.minutes.ago) do
- xhr :post, :create, { title: title, raw: "[poll]\n- A\n- B\n[/poll]" }
+ xhr :post, :create, title: title, raw: "[poll]\n- A\n- B\n[/poll]"
::JSON.parse(response.body)["id"]
end
end
it "can be changed" do
- xhr :put, :update, { id: post_id, post: { raw: "[poll]\n- A\n- B\n- C\n[/poll]" } }
+ xhr :put, :update, id: post_id, post: { raw: "[poll]\n- A\n- B\n- C\n[/poll]" }
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["post"]["polls"]["poll"]["options"][2]["html"]).to eq("C")
@@ -107,7 +107,7 @@ describe PostsController do
it "resets the votes" do
DiscoursePoll::Poll.vote(post_id, "poll", ["5c24fc1df56d764b550ceae1b9319125"], user)
- xhr :put, :update, { id: post_id, post: { raw: "[poll]\n- A\n- B\n- C\n[/poll]" } }
+ xhr :put, :update, id: post_id, post: { raw: "[poll]\n- A\n- B\n- C\n[/poll]" }
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["post"]["polls_votes"]).to_not be
@@ -123,7 +123,7 @@ describe PostsController do
let(:post_id) do
freeze_time(6.minutes.ago) do
- xhr :post, :create, { title: title, raw: poll }
+ xhr :post, :create, title: title, raw: poll
::JSON.parse(response.body)["id"]
end
end
@@ -137,7 +137,7 @@ describe PostsController do
describe "with no vote" do
it "OP can change the options" do
- xhr :put, :update, { id: post_id, post: { raw: new_option } }
+ xhr :put, :update, id: post_id, post: { raw: new_option }
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["post"]["polls"]["poll"]["options"][1]["html"]).to eq("C")
@@ -145,14 +145,14 @@ describe PostsController do
it "staff can change the options" do
log_in_user(Fabricate(:moderator))
- xhr :put, :update, { id: post_id, post: { raw: new_option } }
+ xhr :put, :update, id: post_id, post: { raw: new_option }
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["post"]["polls"]["poll"]["options"][1]["html"]).to eq("C")
end
it "support changes on the post" do
- xhr :put, :update, { id: post_id, post: { raw: updated } }
+ xhr :put, :update, id: post_id, post: { raw: updated }
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["post"]["cooked"]).to match("before")
@@ -167,7 +167,7 @@ describe PostsController do
end
it "OP cannot change the options" do
- xhr :put, :update, { id: post_id, post: { raw: new_option } }
+ xhr :put, :update, id: post_id, post: { raw: new_option }
expect(response).not_to be_success
json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq(I18n.t(
@@ -178,7 +178,7 @@ describe PostsController do
it "staff can change the options and votes are merged" do
log_in_user(Fabricate(:moderator))
- xhr :put, :update, { id: post_id, post: { raw: new_option } }
+ xhr :put, :update, id: post_id, post: { raw: new_option }
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["post"]["polls"]["poll"]["options"][1]["html"]).to eq("C")
@@ -190,10 +190,10 @@ describe PostsController do
it "staff can change the options and anonymous votes are merged" do
post = Post.find_by(id: post_id)
default_poll = post.custom_fields["polls"]["poll"]
- add_anonymous_votes(post, default_poll, 7, {"5c24fc1df56d764b550ceae1b9319125" => 7})
+ add_anonymous_votes(post, default_poll, 7, "5c24fc1df56d764b550ceae1b9319125" => 7)
log_in_user(Fabricate(:moderator))
- xhr :put, :update, { id: post_id, post: { raw: new_option } }
+ xhr :put, :update, id: post_id, post: { raw: new_option }
expect(response).to be_success
json = ::JSON.parse(response.body)
@@ -204,7 +204,7 @@ describe PostsController do
end
it "support changes on the post" do
- xhr :put, :update, { id: post_id, post: { raw: updated } }
+ xhr :put, :update, id: post_id, post: { raw: updated }
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["post"]["cooked"]).to match("before")
@@ -221,14 +221,14 @@ describe PostsController do
describe "named polls" do
it "should have different options" do
- xhr :post, :create, { title: title, raw: "[poll name=""foo""]\n- A\n- A\n[/poll]" }
+ xhr :post, :create, title: title, raw: "[poll name=""foo""]\n- A\n- A\n[/poll]"
expect(response).not_to be_success
json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq(I18n.t("poll.named_poll_must_have_different_options", name: "foo"))
end
it "should have at least 2 options" do
- xhr :post, :create, { title: title, raw: "[poll name='foo']\n- A\n[/poll]" }
+ xhr :post, :create, title: title, raw: "[poll name='foo']\n- A\n[/poll]"
expect(response).not_to be_success
json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq(I18n.t("poll.named_poll_must_have_at_least_2_options", name: "foo"))
@@ -239,7 +239,7 @@ describe PostsController do
describe "multiple polls" do
it "works" do
- xhr :post, :create, { title: title, raw: "[poll]\n- A\n- B\n[/poll]\n[poll name=foo]\n- A\n- B\n[/poll]" }
+ xhr :post, :create, title: title, raw: "[poll]\n- A\n- B\n[/poll]\n[poll name=foo]\n- A\n- B\n[/poll]"
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["cooked"]).to match("data-poll-")
@@ -248,14 +248,14 @@ describe PostsController do
end
it "should have a name" do
- xhr :post, :create, { title: title, raw: "[poll]\n- A\n- B\n[/poll]\n[poll]\n- A\n- B\n[/poll]" }
+ xhr :post, :create, title: title, raw: "[poll]\n- A\n- B\n[/poll]\n[poll]\n- A\n- B\n[/poll]"
expect(response).not_to be_success
json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq(I18n.t("poll.multiple_polls_without_name"))
end
it "should have unique name" do
- xhr :post, :create, { title: title, raw: "[poll name=foo]\n- A\n- B\n[/poll]\n[poll name=foo]\n- A\n- B\n[/poll]" }
+ xhr :post, :create, title: title, raw: "[poll name=foo]\n- A\n- B\n[/poll]\n[poll name=foo]\n- A\n- B\n[/poll]"
expect(response).not_to be_success
json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq(I18n.t("poll.multiple_polls_with_same_name", name: "foo"))
diff --git a/plugins/poll/spec/integration/poll_endpoints_spec.rb b/plugins/poll/spec/integration/poll_endpoints_spec.rb
index 47c6080585d..67e247e4f21 100644
--- a/plugins/poll/spec/integration/poll_endpoints_spec.rb
+++ b/plugins/poll/spec/integration/poll_endpoints_spec.rb
@@ -13,10 +13,8 @@ describe "DiscoursePoll endpoints" do
user
)
- get "/polls/voters.json", {
- post_id: post.id,
- poll_name: DiscoursePoll::DEFAULT_POLL_NAME
- }
+ get "/polls/voters.json", post_id: post.id,
+ poll_name: DiscoursePoll::DEFAULT_POLL_NAME
expect(response.status).to eq(200)
@@ -36,11 +34,9 @@ describe "DiscoursePoll endpoints" do
user
)
- get "/polls/voters.json", {
- post_id: post.id,
- poll_name: DiscoursePoll::DEFAULT_POLL_NAME,
- option_id: 'e89dec30bbd9bf50fabf6a05b4324edf'
- }
+ get "/polls/voters.json", post_id: post.id,
+ poll_name: DiscoursePoll::DEFAULT_POLL_NAME,
+ option_id: 'e89dec30bbd9bf50fabf6a05b4324edf'
expect(response.status).to eq(200)
@@ -57,7 +53,7 @@ describe "DiscoursePoll endpoints" do
describe 'when post_id is blank' do
it 'should raise the right error' do
- expect { get "/polls/voters.json", { poll_name: DiscoursePoll::DEFAULT_POLL_NAME } }
+ expect { get "/polls/voters.json", poll_name: DiscoursePoll::DEFAULT_POLL_NAME }
.to raise_error(ActionController::ParameterMissing)
end
end
@@ -65,17 +61,15 @@ describe "DiscoursePoll endpoints" do
describe 'when post_id is not valid' do
it 'should raise the right error' do
expect do
- get "/polls/voters.json", {
- post_id: -1,
- poll_name: DiscoursePoll::DEFAULT_POLL_NAME
- }
+ get "/polls/voters.json", post_id: -1,
+ poll_name: DiscoursePoll::DEFAULT_POLL_NAME
end.to raise_error(Discourse::InvalidParameters, 'post_id is invalid')
end
end
describe 'when poll_name is blank' do
it 'should raise the right error' do
- expect { get "/polls/voters.json", { post_id: post.id } }
+ expect { get "/polls/voters.json", post_id: post.id }
.to raise_error(ActionController::ParameterMissing)
end
end
@@ -101,10 +95,8 @@ describe "DiscoursePoll endpoints" do
user
)
- get "/polls/voters.json", {
- post_id: post.id,
- poll_name: DiscoursePoll::DEFAULT_POLL_NAME
- }
+ get "/polls/voters.json", post_id: post.id,
+ poll_name: DiscoursePoll::DEFAULT_POLL_NAME
expect(response.status).to eq(200)
diff --git a/plugins/poll/spec/lib/polls_validator_spec.rb b/plugins/poll/spec/lib/polls_validator_spec.rb
index 629fc0527af..a4d6fc27b63 100644
--- a/plugins/poll/spec/lib/polls_validator_spec.rb
+++ b/plugins/poll/spec/lib/polls_validator_spec.rb
@@ -71,7 +71,6 @@ describe ::DiscoursePoll::PollsValidator do
)
end
-
it 'should ensure that polls have at least 2 options' do
raw = <<~RAW
[poll]
diff --git a/script/bench.rb b/script/bench.rb
index 9de35492a8c..84893f5ebda 100644
--- a/script/bench.rb
+++ b/script/bench.rb
@@ -64,7 +64,6 @@ end
@timings = {}
-
def measure(name)
start = Time.now
yield
@@ -100,7 +99,6 @@ unless $? == 0
abort "Apache Bench is not installed. Try: apt-get install apache2-utils or brew install ab"
end
-
unless File.exists?("config/database.yml")
puts "Copying database.yml.development.sample to database.yml"
`cp config/database.yml.development-sample config/database.yml`
@@ -108,7 +106,6 @@ end
ENV["RAILS_ENV"] = "profile"
-
discourse_env_vars = %w(DISCOURSE_DUMP_HEAP RUBY_GC_HEAP_INIT_SLOTS RUBY_GC_HEAP_FREE_SLOTS RUBY_GC_HEAP_GROWTH_FACTOR RUBY_GC_HEAP_GROWTH_MAX_SLOTS RUBY_GC_MALLOC_LIMIT RUBY_GC_OLDMALLOC_LIMIT RUBY_GC_MALLOC_LIMIT_MAX RUBY_GC_OLDMALLOC_LIMIT_MAX RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR)
if @include_env
@@ -124,7 +121,7 @@ else
end
end
-def port_available? port
+def port_available?(port)
server = TCPServer.open("0.0.0.0", port)
server.close
true
@@ -174,13 +171,14 @@ begin
puts "precompiling assets"
run("bundle exec rake assets:precompile")
- pid = if @unicorn
- ENV['UNICORN_PORT'] = @port.to_s
- FileUtils.mkdir_p(File.join('tmp', 'pids'))
- spawn("bundle exec unicorn -c config/unicorn.conf.rb")
- else
- spawn("bundle exec thin start -p #{@port}")
- end
+ pid =
+ if @unicorn
+ ENV['UNICORN_PORT'] = @port.to_s
+ FileUtils.mkdir_p(File.join('tmp', 'pids'))
+ spawn("bundle exec unicorn -c config/unicorn.conf.rb")
+ else
+ spawn("bundle exec thin start -p #{@port}")
+ end
while port_available? @port
sleep 1
@@ -199,7 +197,7 @@ begin
# ["user", "/u/admin1/activity"],
]
- tests = tests.map{|k,url| ["#{k}_admin", "#{url}#{append}"]} + tests
+ tests = tests.map { |k, url| ["#{k}_admin", "#{url}#{append}"] } + tests
# NOTE: we run the most expensive page first in the bench
@@ -210,15 +208,13 @@ begin
a[50] < b[50] ? a : b
end
-
results = {}
@best_of.times do
tests.each do |name, url|
- results[name] = best_of(bench(url, name),results[name])
+ results[name] = best_of(bench(url, name), results[name])
end
end
-
puts "Your Results: (note for timings- percentile is first, duration is second in millisecs)"
# Prevent using external facts because it breaks when running in the
@@ -226,8 +222,8 @@ begin
Facter::Util::Config.external_facts_dirs = []
facts = Facter.to_hash
- facts.delete_if{|k,v|
- !["operatingsystem","architecture","kernelversion",
+ facts.delete_if { |k, v|
+ !["operatingsystem", "architecture", "kernelversion",
"memorysize", "physicalprocessorcount", "processor0",
"virtual"].include?(k)
}
@@ -238,15 +234,12 @@ begin
YAML.load `ruby script/memstats.rb #{pid} --yaml`
end
-
mem = get_mem(pid)
- results = results.merge({
- "timings" => @timings,
- "ruby-version" => "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}",
- "rss_kb" => mem["rss_kb"],
- "pss_kb" => mem["pss_kb"]
- }).merge(facts)
+ results = results.merge("timings" => @timings,
+ "ruby-version" => "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}",
+ "rss_kb" => mem["rss_kb"],
+ "pss_kb" => mem["pss_kb"]).merge(facts)
if @unicorn
child_pids = `ps --ppid #{pid} | awk '{ print $1; }' | grep -v PID`.split("\n")
@@ -270,7 +263,7 @@ begin
end
if @result_file
- File.open(@result_file,"wb") do |f|
+ File.open(@result_file, "wb") do |f|
f.write(results)
end
end
diff --git a/script/benchmarks/markdown/bench.rb b/script/benchmarks/markdown/bench.rb
index a69318ec19d..74926c95a2a 100644
--- a/script/benchmarks/markdown/bench.rb
+++ b/script/benchmarks/markdown/bench.rb
@@ -4,7 +4,6 @@ require File.expand_path('../../../../config/environment', __FILE__)
# set any flags here
# MiniRacer::Platform.set_flags! :noturbo
-
tests = [
["tiny post", "**hello**"],
["giant post", File.read("giant_post.md")],
@@ -28,7 +27,7 @@ PrettyText.v8.eval("window.commonmark = window.markdownit('commonmark')")
# exit
Benchmark.ips do |x|
- [true,false].each do |sanitize|
+ [true, false].each do |sanitize|
tests.each do |test, text|
x.report("#{test} sanitize: #{sanitize}") do
PrettyText.markdown(text, sanitize: sanitize)
@@ -36,7 +35,6 @@ Benchmark.ips do |x|
end
end
-
tests.each do |test, text|
x.report("markdown it no extensions commonmark #{test}") do
PrettyText.v8.eval("window.commonmark.render(#{text.inspect})")
@@ -44,7 +42,6 @@ Benchmark.ips do |x|
end
end
-
# 27-07-2017 - Sam's NUC
#
# v8 5.7
@@ -131,4 +128,3 @@ end
# 1.448k (± 6.7%) i/s - 7.239k in 5.024831s
# markdown it no extensions commonmark lots of mentions
# 1.986k (± 5.2%) i/s - 9.990k in 5.044624s
-
diff --git a/script/bulk_import/base.rb b/script/bulk_import/base.rb
index 377eb8b20a5..7ed396c2fa7 100644
--- a/script/bulk_import/base.rb
+++ b/script/bulk_import/base.rb
@@ -10,7 +10,7 @@ module BulkImport; end
class BulkImport::Base
NOW ||= "now()".freeze
- PRIVATE_OFFSET ||= 2 ** 30
+ PRIVATE_OFFSET ||= 2**30
def initialize
db = ActiveRecord::Base.connection_config
@@ -477,7 +477,7 @@ class BulkImport::Base
start = Time.now
imported_ids = []
process_method_name = "process_#{name}"
- sql = "COPY #{name.pluralize} (#{columns.map {|c| "\"#{c}\""}.join(",")}) FROM STDIN"
+ sql = "COPY #{name.pluralize} (#{columns.map { |c| "\"#{c}\"" }.join(",")}) FROM STDIN"
@raw_connection.copy_data(sql, @encoder) do
rows.each do |row|
diff --git a/script/diff_heaps.rb b/script/diff_heaps.rb
index e854f2f65ae..947f4b02b36 100644
--- a/script/diff_heaps.rb
+++ b/script/diff_heaps.rb
@@ -30,11 +30,10 @@ end
diff.group_by do |x|
[x["type"], x["file"], x["line"]]
-end.map {|x,y|
- [x, y.count]
-}.sort{ |a,b|
- b[1] <=> a[1]
-}.each{ |x,y|
+end.map { |x, y|
+ [x, y.count]
+}.sort { |a, b|
+ b[1] <=> a[1]
+}.each { |x, y|
puts "Leaked #{y} #{x[0]} objects at: #{x[1]}:#{x[2]}"
}
-
diff --git a/script/discourse b/script/discourse
index c07d6685ef4..7bbb2714abe 100755
--- a/script/discourse
+++ b/script/discourse
@@ -28,8 +28,8 @@ class DiscourseCLI < Thor
discourse remap --regex "\[\/?color(=[^\]]*)*]" "" # removing "color" bbcodes
LONGDESC
- option :global, :type => :boolean
- option :regex, :type => :boolean
+ option :global, type: :boolean
+ option :regex, type: :boolean
def remap(from, to)
load_rails
@@ -48,7 +48,7 @@ class DiscourseCLI < Thor
if options[:global]
RailsMultisite::ConnectionManagement.each_connection do |db|
- puts "","Remapping tables on #{db}...",""
+ puts "", "Remapping tables on #{db}...", ""
do_remap(from, to, options[:regex])
end
else
@@ -85,7 +85,7 @@ class DiscourseCLI < Thor
end
desc "restore", "Restore a Discourse backup"
- def restore(filename=nil)
+ def restore(filename = nil)
if !filename
puts "You must provide a filename to restore. Did you mean one of the following?\n\n"
@@ -175,7 +175,7 @@ class DiscourseCLI < Thor
end
desc "export_category", "Export a category, all its topics, and all users who posted in those topics"
- def export_category(category_id, filename=nil)
+ def export_category(category_id, filename = nil)
raise "Category id argument is missing!" unless category_id
load_rails
@@ -225,7 +225,7 @@ class DiscourseCLI < Thor
require File.expand_path(File.dirname(__FILE__) + "/../lib/import_export/import_export")
end
- def do_remap(from, to, regex=false)
+ def do_remap(from, to, regex = false)
sql = "SELECT table_name, column_name
FROM information_schema.columns
WHERE table_schema='public' and (data_type like 'char%' or data_type like 'text%') and is_updatable = 'YES'"
@@ -257,7 +257,6 @@ WHERE table_schema='public' and (data_type like 'char%' or data_type like 'text%
end
end
-
end
DiscourseCLI.start(ARGV)
diff --git a/script/import_scripts/askbot.rb b/script/import_scripts/askbot.rb
index ec0cfc7cb8c..5620f0aa294 100644
--- a/script/import_scripts/askbot.rb
+++ b/script/import_scripts/askbot.rb
@@ -24,11 +24,11 @@ class ImportScripts::MyAskBot < ImportScripts::Base
@tagmap = []
@td = PG::TextDecoder::TimestampWithTimeZone.new
@client = PG.connect(
- :dbname => DB_NAME,
- :host => DB_HOST,
- :port => DB_PORT,
- :user => DB_USER,
- :password => DB_PASS
+ dbname: DB_NAME,
+ host: DB_HOST,
+ port: DB_PORT,
+ user: DB_USER,
+ password: DB_PASS
)
end
@@ -79,7 +79,7 @@ class ImportScripts::MyAskBot < ImportScripts::Base
tid = tag["thread_id"].to_i
tnm = tag["name"].downcase
if @tagmap[tid]
- @tagmap[tid].push( tnm )
+ @tagmap[tid].push(tnm)
else
@tagmap[tid] = [ tnm ]
end
@@ -110,7 +110,7 @@ class ImportScripts::MyAskBot < ImportScripts::Base
break if users.ntuples() < 1
- next if all_records_exist? :users, users.map {|u| u["id"].to_i}
+ next if all_records_exist? :users, users.map { |u| u["id"].to_i }
create_users(users, total: total_count, offset: offset) do |user|
{
@@ -155,7 +155,7 @@ class ImportScripts::MyAskBot < ImportScripts::Base
break if posts.ntuples() < 1
- next if all_records_exist? :posts, posts.map {|p| p["id"].to_i}
+ next if all_records_exist? :posts, posts.map { |p| p["id"].to_i }
create_posts(posts, total: post_count, offset: offset) do |post|
pid = post["id"]
@@ -174,7 +174,7 @@ class ImportScripts::MyAskBot < ImportScripts::Base
id: pid,
title: post["title"],
category: cat,
- custom_fields: {import_id: pid, import_thread_id: tid, import_tags: tags},
+ custom_fields: { import_id: pid, import_thread_id: tid, import_tags: tags },
user_id: user_id_from_imported_user_id(post["author_id"]) || Discourse::SYSTEM_USER_ID,
created_at: Time.zone.at(@td.decode(post["added_at"])),
raw: post["text"],
@@ -210,7 +210,7 @@ class ImportScripts::MyAskBot < ImportScripts::Base
break if posts.ntuples() < 1
- next if all_records_exist? :posts, posts.map {|p| p["id"].to_i}
+ next if all_records_exist? :posts, posts.map { |p| p["id"].to_i }
create_posts(posts, total: post_count, offset: offset) do |post|
tid = post["thread_id"].to_i
@@ -220,7 +220,7 @@ class ImportScripts::MyAskBot < ImportScripts::Base
{
id: pid,
topic_id: parent[:topic_id],
- custom_fields: {import_id: pid},
+ custom_fields: { import_id: pid },
user_id: user_id_from_imported_user_id(post["author_id"]) || Discourse::SYSTEM_USER_ID,
created_at: Time.zone.at(@td.decode(post["added_at"])),
raw: post["text"]
@@ -230,47 +230,48 @@ class ImportScripts::MyAskBot < ImportScripts::Base
end
def post_process_posts
- puts "", "Postprocessing posts..."
- current = 0
- max = Post.count
- # Rewrite internal links; e.g.
- # ask.cvxr.com/question/(\d+)/[^'"}]*
- # I am sure this is incomplete, but we didn't make heavy use of internal
- # links on our site.
- tmp = Regexp.quote("http://" << OLD_SITE)
- r1 = /"(#{tmp})?\/question\/(\d+)\/[a-zA-Z-]*\/?"/
- r2 = /\((#{tmp})?\/question\/(\d+)\/[a-zA-Z-]*\/?\)/
- r3 = /#tmp\/question\/(\d+)\/[a-zA-Z-]*\/?>?/
- Post.find_each do |post|
- raw = post.raw.gsub(r1) do
- if topic = topic_lookup_from_imported_post_id($2)
- "\"#{topic[:url]}\""
- else
- $&
- end
+ puts "", "Postprocessing posts..."
+ current = 0
+ max = Post.count
+ # Rewrite internal links; e.g.
+ # ask.cvxr.com/question/(\d+)/[^'"}]*
+ # I am sure this is incomplete, but we didn't make heavy use of internal
+ # links on our site.
+ tmp = Regexp.quote("http://" << OLD_SITE)
+ r1 = /"(#{tmp})?\/question\/(\d+)\/[a-zA-Z-]*\/?"/
+ r2 = /\((#{tmp})?\/question\/(\d+)\/[a-zA-Z-]*\/?\)/
+ r3 = /#tmp\/question\/(\d+)\/[a-zA-Z-]*\/?>?/
+ Post.find_each do |post|
+ raw = post.raw.gsub(r1) do
+ if topic = topic_lookup_from_imported_post_id($2)
+ "\"#{topic[:url]}\""
+ else
+ $&
end
- raw = raw.gsub(r2) do
- if topic = topic_lookup_from_imported_post_id($2)
- "(#{topic[:url]})"
- else
- $&
- end
- end
- raw = raw.gsub(r3) do
- if topic = topic_lookup_from_imported_post_id($1)
- trec = Topic.find_by(id: topic[:topic_id])
- "[#{trec.title}](#{topic[:url]})"
- else
- $&
- end
- end
- if raw != post.raw
- post.raw = raw
- post.save
- end
- print_status(current += 1, max)
end
+ raw = raw.gsub(r2) do
+ if topic = topic_lookup_from_imported_post_id($2)
+ "(#{topic[:url]})"
+ else
+ $&
+ end
+ end
+ raw = raw.gsub(r3) do
+ if topic = topic_lookup_from_imported_post_id($1)
+ trec = Topic.find_by(id: topic[:topic_id])
+ "[#{trec.title}](#{topic[:url]})"
+ else
+ $&
+ end
+ end
+
+ if raw != post.raw
+ post.raw = raw
+ post.save
+ end
+ print_status(current += 1, max)
end
end
+end
ImportScripts::MyAskBot.new.perform
diff --git a/script/import_scripts/base.rb b/script/import_scripts/base.rb
index 4acd2b76a0c..b156a0f70c8 100644
--- a/script/import_scripts/base.rb
+++ b/script/import_scripts/base.rb
@@ -30,7 +30,7 @@ class ImportScripts::Base
@bbcode_to_md = true if use_bbcode_to_md?
@site_settings_during_import = {}
@old_site_settings = {}
- @start_times = {import: Time.now}
+ @start_times = { import: Time.now }
end
def preload_i18n
@@ -56,7 +56,7 @@ class ImportScripts::Base
reset_topic_counters
elapsed = Time.now - @start_times[:import]
- puts '', '', 'Done (%02dh %02dmin %02dsec)' % [elapsed/3600, elapsed/60%60, elapsed%60]
+ puts '', '', 'Done (%02dh %02dmin %02dsec)' % [elapsed / 3600, elapsed / 60 % 60, elapsed % 60]
ensure
reset_site_settings
@@ -118,7 +118,7 @@ class ImportScripts::Base
delegate method_name, to: :@lookup
end
- def create_admin(opts={})
+ def create_admin(opts = {})
admin = User.new
admin.email = opts[:email] || "sam.saffron@gmail.com"
admin.username = opts[:username] || "sam"
@@ -140,7 +140,7 @@ class ImportScripts::Base
# Required fields are :id and :name, where :id is the id of the
# group in the original datasource. The given id will not be used
# to create the Discourse group record.
- def create_groups(results, opts={})
+ def create_groups(results, opts = {})
created = 0
skipped = 0
failed = 0
@@ -171,12 +171,12 @@ class ImportScripts::Base
end
def create_group(opts, import_id)
- opts = opts.dup.tap {|o| o.delete(:id) }
+ opts = opts.dup.tap { |o| o.delete(:id) }
import_name = opts[:name]
opts[:name] = UserNameSuggester.suggest(import_name)
existing = Group.where(name: opts[:name]).first
- return existing if existing and existing.custom_fields["import_id"].to_i == import_id.to_i
+ return existing if existing && existing.custom_fields["import_id"].to_i == (import_id.to_i)
g = existing || Group.new(opts)
g.custom_fields["import_id"] = import_id
g.custom_fields["import_name"] = import_name
@@ -196,8 +196,8 @@ class ImportScripts::Base
existing = "#{type.to_s.classify}CustomField".constantize
existing = existing.where(name: 'import_id')
- .joins('JOIN import_ids ON val = value')
- .count
+ .joins('JOIN import_ids ON val = value')
+ .count
if existing == import_ids.length
puts "Skipping #{import_ids.length} already imported #{type}"
return true
@@ -216,7 +216,7 @@ class ImportScripts::Base
# Required fields are :id and :email, where :id is the id of the
# user in the original datasource. The given id will not be used to
# create the Discourse user record.
- def create_users(results, opts={})
+ def create_users(results, opts = {})
created = 0
skipped = 0
failed = 0
@@ -422,7 +422,7 @@ class ImportScripts::Base
# Attributes will be passed to the PostCreator.
# Topics should give attributes title and category.
# Replies should provide topic_id. Use topic_lookup_from_imported_post_id to find the topic.
- def create_posts(results, opts={})
+ def create_posts(results, opts = {})
skipped = 0
created = 0
total = opts[:total] || results.size
@@ -502,7 +502,7 @@ class ImportScripts::Base
# Block should return a hash with the attributes for the bookmark.
# Required fields are :user_id and :post_id, where both ids are
# the values in the original datasource.
- def create_bookmarks(results, opts={})
+ def create_bookmarks(results, opts = {})
created = 0
skipped = 0
total = opts[:total] || results.size
@@ -539,7 +539,7 @@ class ImportScripts::Base
[created, skipped]
end
- def close_inactive_topics(opts={})
+ def close_inactive_topics(opts = {})
num_days = opts[:days] || 30
puts '', "Closing topics that have been inactive for more than #{num_days} days."
@@ -775,7 +775,7 @@ class ImportScripts::Base
end
def get_start_time(key)
- @start_times.fetch(key) {|k| @start_times[k] = Time.now}
+ @start_times.fetch(key) { |k| @start_times[k] = Time.now }
end
def batches(batch_size)
diff --git a/script/import_scripts/base/csv_helper.rb b/script/import_scripts/base/csv_helper.rb
index c505ce71015..e70f850bc4f 100644
--- a/script/import_scripts/base/csv_helper.rb
+++ b/script/import_scripts/base/csv_helper.rb
@@ -10,7 +10,7 @@ module ImportScripts
end
def initialize(cols)
- cols.each_with_index do |col,idx|
+ cols.each_with_index do |col, idx|
self.class.send(:define_method, col.downcase.gsub(/[\W]/, '_').squeeze('_')) do
@row[idx]
end
@@ -72,4 +72,4 @@ module ImportScripts
end
end
end
-end
\ No newline at end of file
+end
diff --git a/script/import_scripts/bbpress.rb b/script/import_scripts/bbpress.rb
index e91b8ef8ae5..7b3a35afd5c 100644
--- a/script/import_scripts/bbpress.rb
+++ b/script/import_scripts/bbpress.rb
@@ -1,7 +1,6 @@
require 'mysql2'
require File.expand_path(File.dirname(__FILE__) + "/base.rb")
-
# Before running this script, paste these lines into your shell,
# then use arrow keys to edit the values
=begin
@@ -125,7 +124,7 @@ class ImportScripts::Bbpress < ImportScripts::Base
end
# gather every existent username
- anon_posts.each do |id,post|
+ anon_posts.each do |id, post|
anon_names[post['name']] = Hash.new if not anon_names[post['name']]
# overwriting email address, one user can only use one email address
anon_names[post['name']]['email'] = post['email']
@@ -133,7 +132,7 @@ class ImportScripts::Bbpress < ImportScripts::Base
end
# make sure every user name has a unique email address
- anon_names.each do |k,name|
+ anon_names.each do |k, name|
if not emails.include? name['email']
emails.push ( name['email'])
else
@@ -141,7 +140,6 @@ class ImportScripts::Bbpress < ImportScripts::Base
end
end
-
create_users(anon_names) do |k, n|
{
id: k,
diff --git a/script/import_scripts/bespoke_1.rb b/script/import_scripts/bespoke_1.rb
index 5cd1744212a..0026ff30ace 100644
--- a/script/import_scripts/bespoke_1.rb
+++ b/script/import_scripts/bespoke_1.rb
@@ -43,7 +43,7 @@ class ImportScripts::Bespoke < ImportScripts::Base
end
def initialize(cols)
- cols.each_with_index do |col,idx|
+ cols.each_with_index do |col, idx|
self.class.send(:define_method, col) do
@row[idx]
end
@@ -71,7 +71,7 @@ class ImportScripts::Bespoke < ImportScripts::Base
File.open(filename).each_line do |line|
# escaping is mental here
- line.gsub!(/\\(.{1})/){|m| m[-1] == '"'? '""': m[-1]}
+ line.gsub!(/\\(.{1})/) { |m| m[-1] == '"' ? '""' : m[-1] }
line.strip!
current_row << "\n" unless current_row.empty?
@@ -119,7 +119,7 @@ class ImportScripts::Bespoke < ImportScripts::Base
end
def total_rows(table)
- File.foreach("#{@path}/#{table}.csv").inject(0) {|c, line| c+1} - 1
+ File.foreach("#{@path}/#{table}.csv").inject(0) { |c, line| c + 1 } - 1
end
def import_users
@@ -169,7 +169,7 @@ class ImportScripts::Bespoke < ImportScripts::Base
def import_categories
rows = []
csv_parse("categories") do |row|
- rows << {id: row.id, name: row.name, description: row.description}
+ rows << { id: row.id, name: row.name, description: row.description }
end
create_categories(rows) do |row|
@@ -181,46 +181,46 @@ class ImportScripts::Bespoke < ImportScripts::Base
# purple and #1223f3
raw.gsub!(/\[color=[#a-z0-9]+\]/i, "")
raw.gsub!(/\[\/color\]/i, "")
- raw.gsub!(/\[signature\].+\[\/signature\]/im,"")
+ raw.gsub!(/\[signature\].+\[\/signature\]/im, "")
raw
end
def import_post_batch!(posts, topics, offset, total)
- create_posts(posts, total: total, offset: offset) do |post|
+ create_posts(posts, total: total, offset: offset) do |post|
- mapped = {}
+ mapped = {}
- mapped[:id] = post[:id]
- mapped[:user_id] = user_id_from_imported_user_id(post[:user_id]) || -1
- mapped[:raw] = post[:body]
- mapped[:created_at] = post[:created_at]
+ mapped[:id] = post[:id]
+ mapped[:user_id] = user_id_from_imported_user_id(post[:user_id]) || -1
+ mapped[:raw] = post[:body]
+ mapped[:created_at] = post[:created_at]
- topic = topics[post[:topic_id]]
+ topic = topics[post[:topic_id]]
- unless topic[:post_id]
- mapped[:category] = category_id_from_imported_category_id(topic[:category_id])
- mapped[:title] = post[:title]
- topic[:post_id] = post[:id]
- else
- parent = topic_lookup_from_imported_post_id(topic[:post_id])
- next unless parent
+ unless topic[:post_id]
+ mapped[:category] = category_id_from_imported_category_id(topic[:category_id])
+ mapped[:title] = post[:title]
+ topic[:post_id] = post[:id]
+ else
+ parent = topic_lookup_from_imported_post_id(topic[:post_id])
+ next unless parent
- mapped[:topic_id] = parent[:topic_id]
+ mapped[:topic_id] = parent[:topic_id]
- reply_to_post_id = post_id_from_imported_post_id(post[:reply_id])
- if reply_to_post_id
- reply_to_post_number = @post_number_map[reply_to_post_id]
- if reply_to_post_number && reply_to_post_number > 1
- mapped[:reply_to_post_number] = reply_to_post_number
- end
+ reply_to_post_id = post_id_from_imported_post_id(post[:reply_id])
+ if reply_to_post_id
+ reply_to_post_number = @post_number_map[reply_to_post_id]
+ if reply_to_post_number && reply_to_post_number > 1
+ mapped[:reply_to_post_number] = reply_to_post_number
end
end
-
- next if topic[:deleted] or post[:deleted]
-
- mapped
end
+ next if topic[:deleted] || post[:deleted]
+
+ mapped
+ end
+
posts.clear
end
@@ -262,7 +262,7 @@ class ImportScripts::Bespoke < ImportScripts::Base
created_at: DateTime.parse(row.dcreate)
}
posts << row
- count+=1
+ count += 1
if posts.length > 0 && posts.length % BATCH_SIZE == 0
import_post_batch!(posts, topic_map, count - posts.length, total)
@@ -274,7 +274,6 @@ class ImportScripts::Bespoke < ImportScripts::Base
exit
end
-
end
unless ARGV[0] && Dir.exist?(ARGV[0])
diff --git a/script/import_scripts/discuz_x.rb b/script/import_scripts/discuz_x.rb
index 791b6c38da2..8ee30b359cd 100644
--- a/script/import_scripts/discuz_x.rb
+++ b/script/import_scripts/discuz_x.rb
@@ -176,11 +176,11 @@ class ImportScripts::DiscuzX < ImportScripts::Base
last_posted_at: user['last_posted_at'],
moderator: @moderator_group_id.include?(user['group_id']),
admin: @admin_group_id.include?(user['group_id']),
- website: (user['website'] and user['website'].include?('.')) ? user['website'].strip : ( user['qq'] and user['qq'].strip == user['qq'].strip.to_i and user['qq'].strip.to_i > 10000 ) ? 'http://user.qzone.qq.com/' + user['qq'].strip : nil,
- bio_raw: first_exists((user['bio'] and CGI.unescapeHTML(user['bio'])), user['sightml'], user['spacenote']).strip[0,3000],
- location: first_exists(user['address'], (!user['resideprovince'].blank? ? [user['resideprovince'], user['residecity'], user['residedist'], user['residecommunity']] : [user['birthprovince'], user['birthcity'], user['birthdist'], user['birthcommunity']]).reject{|location|location.blank?}.join(' ')),
+ website: (user['website'] && user['website'].include?('.')) ? user['website'].strip : (user['qq'] && user['qq'].strip == (user['qq'].strip.to_i) && user['qq'].strip.to_i > (10000)) ? 'http://user.qzone.qq.com/' + user['qq'].strip : nil,
+ bio_raw: first_exists((user['bio'] && CGI.unescapeHTML(user['bio'])), user['sightml'], user['spacenote']).strip[0, 3000],
+ location: first_exists(user['address'], (!user['resideprovince'].blank? ? [user['resideprovince'], user['residecity'], user['residedist'], user['residecommunity']] : [user['birthprovince'], user['birthcity'], user['birthdist'], user['birthcommunity']]).reject { |location|location.blank? }.join(' ')),
post_create_action: lambda do |newmember|
- if user['avatar_exists'] == 1 and newmember.uploaded_avatar_id.blank?
+ if user['avatar_exists'] == (1) && newmember.uploaded_avatar_id.blank?
path, filename = discuzx_avatar_fullpath(user['id'])
if path
begin
@@ -199,7 +199,7 @@ class ImportScripts::DiscuzX < ImportScripts::Base
end
end
end
- if !user['spacecss'].blank? and newmember.user_profile.profile_background.blank?
+ if !user['spacecss'].blank? && newmember.user_profile.profile_background.blank?
# profile background
if matched = user['spacecss'].match(/body\s*{[^}]*url\('?(.+?)'?\)/i)
body_background = matched[1].split(ORIGINAL_SITE_PREFIX, 2).last
@@ -234,7 +234,7 @@ class ImportScripts::DiscuzX < ImportScripts::Base
# we don't send email to the unconfirmed user
newmember.update(email_digests: user['email_confirmed'] == 1) if newmember.email_digests
- newmember.update(name: '') if !newmember.name.blank? and newmember.name == newmember.username
+ newmember.update(name: '') if !newmember.name.blank? && newmember.name == (newmember.username)
end
}
end
@@ -259,10 +259,10 @@ class ImportScripts::DiscuzX < ImportScripts::Base
max_position = Category.all.max_by(&:position).position
create_categories(results) do |row|
- next if row['type'] == 'group' or row['status'] == 2 # or row['status'].to_i == 3 # 如果不想导入群组,取消注释
+ next if row['type'] == ('group') || row['status'] == (2) # or row['status'].to_i == 3 # 如果不想导入群组,取消注释
extra = PHP.unserialize(row['extra']) if !row['extra'].blank?
- if extra and !extra["namecolor"].blank?
- color = extra["namecolor"][1,6]
+ if extra && !extra["namecolor"].blank?
+ color = extra["namecolor"][1, 6]
end
Category.all.max_by(&:position).position
@@ -273,7 +273,7 @@ class ImportScripts::DiscuzX < ImportScripts::Base
description: row['description'],
position: row['position'].to_i + max_position,
color: color,
- suppress_from_homepage: (row['status'] == 0 or row['status'] == 3),
+ suppress_from_homepage: (row['status'] == (0) || row['status'] == (3)),
post_create_action: lambda do |category|
if slug = @category_slug[row['id']]
category.update(slug: slug)
@@ -289,7 +289,7 @@ class ImportScripts::DiscuzX < ImportScripts::Base
if upload
category.logo_url = upload.url
# FIXME: I don't know how to get '/shared' by script. May change to Rails.root
- category.color = Miro::DominantColors.new(File.join('/shared', category.logo_url)).to_hex.first[1,6] if !color
+ category.color = Miro::DominantColors.new(File.join('/shared', category.logo_url)).to_hex.first[1, 6] if !color
category.save!
end
end
@@ -332,10 +332,10 @@ class ImportScripts::DiscuzX < ImportScripts::Base
LIMIT #{BATCH_SIZE}
OFFSET #{offset};
")
- # u.status != -1 AND u.groupid != 4 AND u.groupid != 5 用户未被锁定、禁访或禁言。在现实中的 Discuz 论坛,禁止的用户通常是广告机或驱逐的用户,这些不需要导入。
+ # u.status != -1 AND u.groupid != 4 AND u.groupid != 5 用户未被锁定、禁访或禁言。在现实中的 Discuz 论坛,禁止的用户通常是广告机或驱逐的用户,这些不需要导入。
break if results.size < 1
- next if all_records_exist? :posts, results.map {|p| p["id"].to_i}
+ next if all_records_exist? :posts, results.map { |p| p["id"].to_i }
create_posts(results, total: total_count, offset: offset) do |m|
skip = false
@@ -364,7 +364,7 @@ class ImportScripts::DiscuzX < ImportScripts::Base
if results.empty?
puts "WARNING: can't find poll options for topic #{m['topic_id']}, skip poll"
else
- mapped[:raw].prepend "[poll#{poll['multiple'] ? ' type=multiple' : ''}#{poll['maxchoices'] > 0 ? " max=#{poll['maxchoices']}" : ''}]\n#{results.map{|option|'- ' + option['polloption']}.join("\n")}\n[/poll]\n"
+ mapped[:raw].prepend "[poll#{poll['multiple'] ? ' type=multiple' : ''}#{poll['maxchoices'] > 0 ? " max=#{poll['maxchoices']}" : ''}]\n#{results.map { |option|'- ' + option['polloption'] }.join("\n")}\n[/poll]\n"
end
end
else
@@ -398,7 +398,7 @@ class ImportScripts::DiscuzX < ImportScripts::Base
end
elsif (m['status'] & 2) >> 1 == 1 # waiting for approve
mapped[:post_create_action] = lambda do |post|
- PostAction.act(Discourse.system_user, post, 6, {take_action: false})
+ PostAction.act(Discourse.system_user, post, 6, take_action: false)
end
end
skip ? nil : mapped
@@ -423,7 +423,7 @@ class ImportScripts::DiscuzX < ImportScripts::Base
break if results.size < 1
- # next if all_records_exist?
+ # next if all_records_exist?
create_bookmarks(results, total: total_count, offset: offset) do |row|
{
@@ -434,7 +434,6 @@ class ImportScripts::DiscuzX < ImportScripts::Base
end
end
-
def import_private_messages
puts '', 'creating private messages'
@@ -494,7 +493,7 @@ class ImportScripts::DiscuzX < ImportScripts::Base
SELECT plid thread_id, uid user_id
FROM #{table_name 'ucenter_pm_members'}
WHERE plid = #{m['thread_id']};
- ").map {|r| r['user_id']}.uniq
+ ").map { |r| r['user_id'] }.uniq
mapped[:target_usernames] = import_user_ids.map! do |import_user_id|
import_user_id.to_s == m['user_id'].to_s ? nil : User.find_by(id: user_id_from_imported_user_id(import_user_id)).try(:username)
@@ -587,7 +586,7 @@ class ImportScripts::DiscuzX < ImportScripts::Base
s.gsub!(/\[img[^\]]*\]https?:\/\/#{ORIGINAL_SITE_PREFIX}\/(.*)\[\/img\]/i, '[x-attach]\1[/x-attach]') # dont convert attachment
s.gsub!(/]*src="https?:\/\/#{ORIGINAL_SITE_PREFIX}\/(.*)".*?>/i, '[x-attach]\1[/x-attach]') # dont convert attachment
s.gsub!(/\[img[^\]]*\]https?:\/\/www\.touhou\.cc\/blog\/(.*)\[\/img\]/i, '[x-attach]../blog/\1[/x-attach]') # 私货
- s.gsub!(/\[img[^\]]*\]https?:\/\/www\.touhou\.cc\/ucenter\/avatar.php\?uid=(\d+)[^\]]*\[\/img\]/i) { "[x-attach]#{discuzx_avatar_fullpath($1,false)[0]}[/x-attach]" } # 私货
+ s.gsub!(/\[img[^\]]*\]https?:\/\/www\.touhou\.cc\/ucenter\/avatar.php\?uid=(\d+)[^\]]*\[\/img\]/i) { "[x-attach]#{discuzx_avatar_fullpath($1, false)[0]}[/x-attach]" } # 私货
s.gsub!(/\[img=(\d+),(\d+)\]([^\]]*)\[\/img\]/i, '')
s.gsub!(/\[img\]([^\]]*)\[\/img\]/i, '')
@@ -671,7 +670,7 @@ class ImportScripts::DiscuzX < ImportScripts::Base
# @someone without the url
s.gsub!(/@\[url=[^\[\]]*?\](\S*)\[\/url\]/i, '@\1')
- s.scan(/http(?:s)?:\/\/#{ORIGINAL_SITE_PREFIX.gsub('.', '\.')}\/[^\[\]\s]*/) {|link|puts "WARNING: post #{import_id} can't replace internal url #{link}"}
+ s.scan(/http(?:s)?:\/\/#{ORIGINAL_SITE_PREFIX.gsub('.', '\.')}\/[^\[\]\s]*/) { |link|puts "WARNING: post #{import_id} can't replace internal url #{link}" }
s.strip
end
@@ -785,7 +784,7 @@ class ImportScripts::DiscuzX < ImportScripts::Base
FROM #{table_name 'forum_attachment'}
WHERE pid = #{post.custom_fields['import_id']}"
if !inline_attachments.empty?
- sql << " AND aid NOT IN (#{inline_attachments.join(',')})"
+ sql << " AND aid NOT IN (#{inline_attachments.join(',')})"
end
results = mysql_query(sql)
@@ -805,7 +804,7 @@ class ImportScripts::DiscuzX < ImportScripts::Base
end
if new_raw != post.raw
- PostRevisor.new(post).revise!(post.user, { raw: new_raw }, { bypass_bump: true, edit_reason: '从 Discuz 中导入附件' })
+ PostRevisor.new(post).revise!(post.user, { raw: new_raw }, bypass_bump: true, edit_reason: '从 Discuz 中导入附件')
end
success_count += 1
@@ -818,7 +817,7 @@ class ImportScripts::DiscuzX < ImportScripts::Base
end
# Create the full path to the discuz avatar specified from user id
- def discuzx_avatar_fullpath(user_id, absolute=true)
+ def discuzx_avatar_fullpath(user_id, absolute = true)
padded_id = user_id.to_s.rjust(9, '0')
part_1 = padded_id[0..2]
@@ -945,7 +944,7 @@ class ImportScripts::DiscuzX < ImportScripts::Base
end
def first_exists(*items)
- items.find{|item|!item.blank?} || ''
+ items.find { |item|!item.blank? } || ''
end
def mysql_query(sql)
diff --git a/script/import_scripts/disqus.rb b/script/import_scripts/disqus.rb
index 6f0929d8588..a73febe4768 100644
--- a/script/import_scripts/disqus.rb
+++ b/script/import_scripts/disqus.rb
@@ -11,7 +11,7 @@ class ImportScripts::Disqus < ImportScripts::Base
def initialize
abort("File '#{IMPORT_FILE}' not found") if !File.exist?(IMPORT_FILE)
- @category = Category.where(name: IMPORT_CATEGORY).first
+ @category = Category.where(name: IMPORT_CATEGORY).first
abort("Category #{IMPORT_CATEGORY} not found") if @category.blank?
@parser = DisqusSAX.new
@@ -135,7 +135,7 @@ class DisqusSAX < Nokogiri::XML::SAX::Document
thread = @threads[id]
thread[:posts] << @post
else
- @thread = {id: id, posts: []}
+ @thread = { id: id, posts: [] }
end
when 'parent'
if @post
@@ -194,7 +194,7 @@ class DisqusSAX < Nokogiri::XML::SAX::Document
end
def inside?(*params)
- return !params.find{|p| !@inside[p]}
+ return !params.find { |p| !@inside[p] }
end
def normalize
@@ -203,7 +203,7 @@ class DisqusSAX < Nokogiri::XML::SAX::Document
# Remove any threads that have no posts
@threads.delete(id)
else
- t[:posts].delete_if {|p| p[:is_spam] == 'true' || p[:is_deleted] == 'true'}
+ t[:posts].delete_if { |p| p[:is_spam] == 'true' || p[:is_deleted] == 'true' }
end
end
diff --git a/script/import_scripts/drupal-6.rb b/script/import_scripts/drupal-6.rb
index 1df513df409..018a1fba904 100644
--- a/script/import_scripts/drupal-6.rb
+++ b/script/import_scripts/drupal-6.rb
@@ -5,7 +5,7 @@ class ImportScripts::Drupal < ImportScripts::Base
DRUPAL_DB = ENV['DRUPAL_DB'] || "newsite3"
VID = ENV['DRUPAL_VID'] || 1
-
+
def initialize
super
@@ -23,7 +23,7 @@ class ImportScripts::Drupal < ImportScripts::Base
def execute
create_users(@client.query("SELECT uid id, name, mail email, created FROM users;")) do |row|
- {id: row['id'], username: row['name'], email: row['email'], created_at: Time.zone.at(row['created'])}
+ { id: row['id'], username: row['name'], email: row['email'], created_at: Time.zone.at(row['created']) }
end
# You'll need to edit the following query for your Drupal install:
@@ -32,7 +32,7 @@ class ImportScripts::Drupal < ImportScripts::Base
# * Table name may be term_data.
# * May need to select a vid other than 1.
create_categories(categories_query) do |c|
- {id: c['tid'], name: c['name'], description: c['description']}
+ { id: c['tid'], name: c['name'], description: c['description'] }
end
# "Nodes" in Drupal are divided into types. Here we import two types,
@@ -65,8 +65,8 @@ class ImportScripts::Drupal < ImportScripts::Base
results = @client.query("
SELECT n.nid nid,
- n.title title,
- n.uid uid,
+ n.title title,
+ n.uid uid,
n.created created,
n.sticky sticky,
nr.body body
@@ -85,7 +85,7 @@ class ImportScripts::Drupal < ImportScripts::Base
created_at: Time.zone.at(row['created']),
pinned_at: row['sticky'].to_i == 1 ? Time.zone.at(row['created']) : nil,
title: row['title'].try(:strip),
- custom_fields: {import_id: "nid:#{row['nid']}"}
+ custom_fields: { import_id: "nid:#{row['nid']}" }
}
end
end
@@ -123,7 +123,7 @@ class ImportScripts::Drupal < ImportScripts::Base
break if results.size < 1
- next if all_records_exist? :posts, results.map {|p| "nid:#{p['nid']}"}
+ next if all_records_exist? :posts, results.map { |p| "nid:#{p['nid']}" }
create_posts(results, total: total_count, offset: offset) do |row|
{
@@ -141,7 +141,7 @@ class ImportScripts::Drupal < ImportScripts::Base
def create_replies
puts '', "creating replies in topics"
-
+
if ENV['DRUPAL_IMPORT_BLOG']
node_types = "('forum','blog')"
else
@@ -149,7 +149,7 @@ class ImportScripts::Drupal < ImportScripts::Base
end
total_count = @client.query("
- SELECT COUNT(*) count
+ SELECT COUNT(*) count
FROM comments c
LEFT JOIN node n ON n.nid=c.nid
WHERE node.type IN #{node_types}
@@ -167,18 +167,18 @@ class ImportScripts::Drupal < ImportScripts::Base
c.uid,
c.timestamp,
c.comment body
- FROM comments c
+ FROM comments c
LEFT JOIN node n ON n.nid=c.nid
WHERE n.type IN #{node_types}
AND n.status = 1
- AND c.status=0
+ AND c.status=0
LIMIT #{batch_size}
OFFSET #{offset};
", cache_rows: false)
break if results.size < 1
- next if all_records_exist? :posts, results.map {|p| "cid:#{p['cid']}"}
+ next if all_records_exist? :posts, results.map { |p| "cid:#{p['cid']}" }
create_posts(results, total: total_count, offset: offset) do |row|
topic_mapping = topic_lookup_from_imported_post_id("nid:#{row['nid']}")
@@ -192,7 +192,7 @@ class ImportScripts::Drupal < ImportScripts::Base
}
if row['pid']
parent = topic_lookup_from_imported_post_id("cid:#{row['pid']}")
- h[:reply_to_post_number] = parent[:post_number] if parent and parent[:post_number] > 1
+ h[:reply_to_post_number] = parent[:post_number] if parent && parent[:post_number] > (1)
end
h
else
@@ -205,6 +205,6 @@ class ImportScripts::Drupal < ImportScripts::Base
end
-if __FILE__==$0
+if __FILE__ == $0
ImportScripts::Drupal.new.perform
end
diff --git a/script/import_scripts/drupal.rb b/script/import_scripts/drupal.rb
index a15933b10c1..6b773486d00 100644
--- a/script/import_scripts/drupal.rb
+++ b/script/import_scripts/drupal.rb
@@ -23,7 +23,7 @@ class ImportScripts::Drupal < ImportScripts::Base
def execute
create_users(@client.query("SELECT uid id, name, mail email, created FROM users;")) do |row|
- {id: row['id'], username: row['name'], email: row['email'], created_at: Time.zone.at(row['created'])}
+ { id: row['id'], username: row['name'], email: row['email'], created_at: Time.zone.at(row['created']) }
end
# You'll need to edit the following query for your Drupal install:
@@ -32,7 +32,7 @@ class ImportScripts::Drupal < ImportScripts::Base
# * Table name may be term_data.
# * May need to select a vid other than 1.
create_categories(categories_query) do |c|
- {id: c['tid'], name: c['name'], description: c['description']}
+ { id: c['tid'], name: c['name'], description: c['description'] }
end
# "Nodes" in Drupal are divided into types. Here we import two types,
@@ -82,7 +82,7 @@ class ImportScripts::Drupal < ImportScripts::Base
created_at: Time.zone.at(row['created']),
pinned_at: row['sticky'].to_i == 1 ? Time.zone.at(row['created']) : nil,
title: row['title'].try(:strip),
- custom_fields: {import_id: "nid:#{row['nid']}"}
+ custom_fields: { import_id: "nid:#{row['nid']}" }
}
end
end
@@ -121,7 +121,7 @@ class ImportScripts::Drupal < ImportScripts::Base
break if results.size < 1
- next if all_records_exist? :posts, results.map {|p| "nid:#{p['nid']}"}
+ next if all_records_exist? :posts, results.map { |p| "nid:#{p['nid']}" }
create_posts(results, total: total_count, offset: offset) do |row|
{
@@ -169,7 +169,7 @@ class ImportScripts::Drupal < ImportScripts::Base
break if results.size < 1
- next if all_records_exist? :posts, results.map {|p| "cid:#{p['cid']}"}
+ next if all_records_exist? :posts, results.map { |p| "cid:#{p['cid']}" }
create_posts(results, total: total_count, offset: offset) do |row|
topic_mapping = topic_lookup_from_imported_post_id("nid:#{row['nid']}")
@@ -183,7 +183,7 @@ class ImportScripts::Drupal < ImportScripts::Base
}
if row['pid']
parent = topic_lookup_from_imported_post_id("cid:#{row['pid']}")
- h[:reply_to_post_number] = parent[:post_number] if parent and parent[:post_number] > 1
+ h[:reply_to_post_number] = parent[:post_number] if parent && parent[:post_number] > (1)
end
h
else
@@ -196,6 +196,6 @@ class ImportScripts::Drupal < ImportScripts::Base
end
-if __FILE__==$0
+if __FILE__ == $0
ImportScripts::Drupal.new.perform
end
diff --git a/script/import_scripts/drupal_json.rb b/script/import_scripts/drupal_json.rb
index ac40525caf6..d99fb86f871 100644
--- a/script/import_scripts/drupal_json.rb
+++ b/script/import_scripts/drupal_json.rb
@@ -8,7 +8,7 @@ class ImportScripts::DrupalJson < ImportScripts::Base
def initialize
super
- @users_json = load_json("formatted_users.json")
+ @users_json = load_json("formatted_users.json")
end
def execute
@@ -40,6 +40,6 @@ class ImportScripts::DrupalJson < ImportScripts::Base
end
end
-if __FILE__==$0
+if __FILE__ == $0
ImportScripts::DrupalJson.new.perform
end
diff --git a/script/import_scripts/drupal_qa.rb b/script/import_scripts/drupal_qa.rb
index 9899f73ad5e..98d79198646 100644
--- a/script/import_scripts/drupal_qa.rb
+++ b/script/import_scripts/drupal_qa.rb
@@ -56,7 +56,7 @@ class ImportScripts::DrupalQA < ImportScripts::Drupal
break if results.size < 1
- next if all_records_exist? :posts, results.map {|p| "nid:#{p['nid']}"}
+ next if all_records_exist? :posts, results.map { |p| "nid:#{p['nid']}" }
create_posts(results, total: total_count, offset: offset) do |row|
{
@@ -102,7 +102,7 @@ class ImportScripts::DrupalQA < ImportScripts::Drupal
break if results.size < 1
- next if all_records_exist? :posts, results.map {|p| "cid:#{p['cid']}"}
+ next if all_records_exist? :posts, results.map { |p| "cid:#{p['cid']}" }
create_posts(results, total: total_count, offset: offset) do |row|
topic_mapping = topic_lookup_from_imported_post_id("nid:#{row['nid']}")
@@ -155,7 +155,7 @@ class ImportScripts::DrupalQA < ImportScripts::Drupal
break if results.size < 1
- next if all_records_exist? :posts, results.map {|p| "cid:#{p['cid']}"}
+ next if all_records_exist? :posts, results.map { |p| "cid:#{p['cid']}" }
create_posts(results, total: total_count, offset: offset) do |row|
topic_mapping = topic_lookup_from_imported_post_id("nid:#{row['nid']}")
@@ -207,7 +207,7 @@ class ImportScripts::DrupalQA < ImportScripts::Drupal
break if results.size < 1
- next if all_records_exist? :posts, results.map {|p| "cid:#{p['cid']}"}
+ next if all_records_exist? :posts, results.map { |p| "cid:#{p['cid']}" }
create_posts(results, total: total_count, offset: offset) do |row|
topic_mapping = topic_lookup_from_imported_post_id("nid:#{row['nid']}")
@@ -235,6 +235,6 @@ class ImportScripts::DrupalQA < ImportScripts::Drupal
end
-if __FILE__==$0
+if __FILE__ == $0
ImportScripts::DrupalQA.new.perform
end
diff --git a/script/import_scripts/fluxbb.rb b/script/import_scripts/fluxbb.rb
index d754c5db0c7..7b886447153 100644
--- a/script/import_scripts/fluxbb.rb
+++ b/script/import_scripts/fluxbb.rb
@@ -74,7 +74,7 @@ class ImportScripts::FluxBB < ImportScripts::Base
break if results.size < 1
- next if all_records_exist? :users, results.map {|u| u["id"].to_i}
+ next if all_records_exist? :users, results.map { |u| u["id"].to_i }
create_users(results, total: total_count, offset: offset) do |user|
{ id: user['id'],
@@ -91,7 +91,7 @@ class ImportScripts::FluxBB < ImportScripts::Base
admin: user['group_id'] == 1 }
end
- groupusers = results.select{ |user| user['group_id'] > 2 }
+ groupusers = results.select { |user| user['group_id'] > 2 }
groupusers.each do |user|
if user['group_id']
@@ -164,7 +164,7 @@ class ImportScripts::FluxBB < ImportScripts::Base
").to_a
break if results.size < 1
- next if all_records_exist? :posts, results.map {|m| m['id'].to_i}
+ next if all_records_exist? :posts, results.map { |m| m['id'].to_i }
create_posts(results, total: total_count, offset: offset) do |m|
skip = false
diff --git a/script/import_scripts/getsatisfaction.rb b/script/import_scripts/getsatisfaction.rb
index de5ff13a62b..ffa0b0388e8 100644
--- a/script/import_scripts/getsatisfaction.rb
+++ b/script/import_scripts/getsatisfaction.rb
@@ -37,7 +37,6 @@ class ImportScripts::GetSatisfaction < ImportScripts::Base
super
end
-
def execute
c = Category.find_by(name: 'Old Forum') ||
Category.create!(name: 'Old Forum', user: Discourse.system_user)
@@ -61,7 +60,7 @@ class ImportScripts::GetSatisfaction < ImportScripts::Base
end
def initialize(cols)
- cols.each_with_index do |col,idx|
+ cols.each_with_index do |col, idx|
self.class.send(:define_method, col) do
@row[idx]
end
@@ -134,7 +133,7 @@ class ImportScripts::GetSatisfaction < ImportScripts::Base
def total_rows(table)
# In case of Excel export file, I converted it to CSV and used:
# CSV.foreach("#{@path}/#{table}.csv", encoding:'iso-8859-1:utf-8').inject(0) {|c, line| c+1} - 1
- File.foreach("#{@path}/#{table}.csv").inject(0) {|c, line| c+1} - 1
+ File.foreach("#{@path}/#{table}.csv").inject(0) { |c, line| c + 1 } - 1
end
def import_users
@@ -191,7 +190,7 @@ class ImportScripts::GetSatisfaction < ImportScripts::Base
def import_categories
rows = []
csv_parse("categories") do |row|
- rows << {id: row.id, name: row.name, description: row.description}
+ rows << { id: row.id, name: row.name, description: row.description }
end
create_categories(rows) do |row|
@@ -209,7 +208,7 @@ class ImportScripts::GetSatisfaction < ImportScripts::Base
code = $2
hoist = SecureRandom.hex
# tidy code, wow, this is impressively crazy
- code.gsub!(/ (\s*)/,"\n\\1")
+ code.gsub!(/ (\s*)/, "\n\\1")
code.gsub!(/^\s*\n$/, "\n")
code.gsub!(/\n+/m, "\n")
code.strip!
@@ -231,48 +230,47 @@ class ImportScripts::GetSatisfaction < ImportScripts::Base
end
def import_post_batch!(posts, topics, offset, total)
- create_posts(posts, total: total, offset: offset) do |post|
+ create_posts(posts, total: total, offset: offset) do |post|
- mapped = {}
+ mapped = {}
- mapped[:id] = post[:id]
- mapped[:user_id] = user_id_from_imported_user_id(post[:user_id]) || -1
- mapped[:raw] = post[:body]
- mapped[:created_at] = post[:created_at]
+ mapped[:id] = post[:id]
+ mapped[:user_id] = user_id_from_imported_user_id(post[:user_id]) || -1
+ mapped[:raw] = post[:body]
+ mapped[:created_at] = post[:created_at]
- topic = topics[post[:topic_id]]
+ topic = topics[post[:topic_id]]
- unless topic
- p "MISSING TOPIC #{post[:topic_id]}"
- p post
- next
- end
+ unless topic
+ p "MISSING TOPIC #{post[:topic_id]}"
+ p post
+ next
+ end
+ unless topic[:post_id]
+ mapped[:title] = post[:title] || "Topic title missing"
+ topic[:post_id] = post[:id]
+ mapped[:category] = post[:category]
+ else
+ parent = topic_lookup_from_imported_post_id(topic[:post_id])
+ next unless parent
- unless topic[:post_id]
- mapped[:title] = post[:title] || "Topic title missing"
- topic[:post_id] = post[:id]
- mapped[:category] = post[:category]
- else
- parent = topic_lookup_from_imported_post_id(topic[:post_id])
- next unless parent
+ mapped[:topic_id] = parent[:topic_id]
- mapped[:topic_id] = parent[:topic_id]
-
- reply_to_post_id = post_id_from_imported_post_id(post[:reply_id])
- if reply_to_post_id
- reply_to_post_number = @post_number_map[reply_to_post_id]
- if reply_to_post_number && reply_to_post_number > 1
- mapped[:reply_to_post_number] = reply_to_post_number
- end
+ reply_to_post_id = post_id_from_imported_post_id(post[:reply_id])
+ if reply_to_post_id
+ reply_to_post_number = @post_number_map[reply_to_post_id]
+ if reply_to_post_number && reply_to_post_number > 1
+ mapped[:reply_to_post_number] = reply_to_post_number
end
end
-
- next if topic[:deleted] or post[:deleted]
-
- mapped
end
+ next if topic[:deleted] || post[:deleted]
+
+ mapped
+ end
+
posts.clear
end
@@ -324,7 +322,7 @@ class ImportScripts::GetSatisfaction < ImportScripts::Base
created_at: DateTime.parse(row.created_at)
}
posts << row
- count+=1
+ count += 1
if posts.length > 0 && posts.length % BATCH_SIZE == 0
import_post_batch!(posts, topic_map, count - posts.length, total)
diff --git a/script/import_scripts/jive.rb b/script/import_scripts/jive.rb
index c64e87a66bb..ae077bda2ee 100644
--- a/script/import_scripts/jive.rb
+++ b/script/import_scripts/jive.rb
@@ -6,7 +6,7 @@ require File.expand_path(File.dirname(__FILE__) + "/base.rb")
class ImportScripts::Jive < ImportScripts::Base
BATCH_SIZE = 1000
- CATEGORY_IDS = [2023,2003,2004,2042,2036,2029] # categories that should be imported
+ CATEGORY_IDS = [2023, 2003, 2004, 2042, 2036, 2029] # categories that should be imported
def initialize(path)
@path = path
@@ -45,7 +45,7 @@ class ImportScripts::Jive < ImportScripts::Base
end
def initialize(cols)
- cols.each_with_index do |col,idx|
+ cols.each_with_index do |col, idx|
self.class.send(:define_method, col) do
@row[idx]
end
@@ -72,7 +72,7 @@ class ImportScripts::Jive < ImportScripts::Base
File.open(filename).each_line do |line|
- line.gsub!(/\\(.{1})/){|m| m[-1] == '"'? '""': m[-1]}
+ line.gsub!(/\\(.{1})/) { |m| m[-1] == '"' ? '""' : m[-1] }
line.strip!
current_row << "\n" unless current_row.empty?
@@ -120,7 +120,7 @@ class ImportScripts::Jive < ImportScripts::Base
end
def total_rows(table)
- File.foreach("#{@path}/#{table}.csv").inject(0) {|c, line| c+1} - 1
+ File.foreach("#{@path}/#{table}.csv").inject(0) { |c, line| c + 1 } - 1
end
def import_groups
@@ -128,7 +128,7 @@ class ImportScripts::Jive < ImportScripts::Base
rows = []
csv_parse("groups") do |row|
- rows << {id: row.groupid, name: row.name}
+ rows << { id: row.groupid, name: row.name }
end
create_groups(rows) do |row|
@@ -204,7 +204,7 @@ class ImportScripts::Jive < ImportScripts::Base
csv_parse("communities") do |row|
next unless CATEGORY_IDS.include?(row.communityid.to_i)
- rows << {id: row.communityid, name: "#{row.name} (#{row.communityid})"}
+ rows << { id: row.communityid, name: "#{row.name} (#{row.communityid})" }
end
create_categories(rows) do |row|
@@ -228,47 +228,47 @@ class ImportScripts::Jive < ImportScripts::Base
end
def import_post_batch!(posts, topics, offset, total)
- create_posts(posts, total: total, offset: offset) do |post|
+ create_posts(posts, total: total, offset: offset) do |post|
- mapped = {}
+ mapped = {}
- mapped[:id] = post[:id]
- mapped[:user_id] = user_id_from_imported_user_id(post[:user_id]) || -1
- mapped[:raw] = post[:body]
- mapped[:created_at] = post[:created_at]
+ mapped[:id] = post[:id]
+ mapped[:user_id] = user_id_from_imported_user_id(post[:user_id]) || -1
+ mapped[:raw] = post[:body]
+ mapped[:created_at] = post[:created_at]
- topic = topics[post[:topic_id]]
+ topic = topics[post[:topic_id]]
- unless topic
- p "MISSING TOPIC #{post[:topic_id]}"
- p post
- next
- end
+ unless topic
+ p "MISSING TOPIC #{post[:topic_id]}"
+ p post
+ next
+ end
- unless topic[:post_id]
- mapped[:category] = category_id_from_imported_category_id(topic[:category_id])
- mapped[:title] = post[:title]
- topic[:post_id] = post[:id]
- else
- parent = topic_lookup_from_imported_post_id(topic[:post_id])
- next unless parent
+ unless topic[:post_id]
+ mapped[:category] = category_id_from_imported_category_id(topic[:category_id])
+ mapped[:title] = post[:title]
+ topic[:post_id] = post[:id]
+ else
+ parent = topic_lookup_from_imported_post_id(topic[:post_id])
+ next unless parent
- mapped[:topic_id] = parent[:topic_id]
+ mapped[:topic_id] = parent[:topic_id]
- reply_to_post_id = post_id_from_imported_post_id(post[:reply_id])
- if reply_to_post_id
- reply_to_post_number = @post_number_map[reply_to_post_id]
- if reply_to_post_number && reply_to_post_number > 1
- mapped[:reply_to_post_number] = reply_to_post_number
- end
+ reply_to_post_id = post_id_from_imported_post_id(post[:reply_id])
+ if reply_to_post_id
+ reply_to_post_number = @post_number_map[reply_to_post_id]
+ if reply_to_post_number && reply_to_post_number > 1
+ mapped[:reply_to_post_number] = reply_to_post_number
end
end
-
- next if topic[:deleted] or post[:deleted]
-
- mapped
end
+ next if topic[:deleted] || post[:deleted]
+
+ mapped
+ end
+
posts.clear
end
@@ -290,14 +290,14 @@ class ImportScripts::Jive < ImportScripts::Base
#IMAGE UPLOADER
if thread.imagecount
Dir.foreach("/var/www/discourse/script/import_scripts/jive/img/#{thread.messageid}") do |item|
- next if item == '.' or item == '..' or item == '.DS_Store'
+ next if item == ('.') || item == ('..') || item == ('.DS_Store')
photo_path = "/var/www/discourse/script/import_scripts/jive/img/#{thread.messageid}/#{item}"
upload = create_upload(thread.userid, photo_path, File.basename(photo_path))
if upload.persisted?
- puts "Image upload is successful for #{photo_path}, new path is #{upload.url}!"
- thread.body.gsub!(item,upload.url)
+ puts "Image upload is successful for #{photo_path}, new path is #{upload.url}!"
+ thread.body.gsub!(item, upload.url)
else
- puts "Error: Image upload is not successful for #{photo_path}!"
+ puts "Error: Image upload is not successful for #{photo_path}!"
end
end
end
@@ -305,15 +305,15 @@ class ImportScripts::Jive < ImportScripts::Base
#ATTACHMENT UPLOADER
if thread.attachmentcount
Dir.foreach("/var/www/discourse/script/import_scripts/jive/attach/#{thread.messageid}") do |item|
- next if item == '.' or item == '..' or item == '.DS_Store'
+ next if item == ('.') || item == ('..') || item == ('.DS_Store')
attach_path = "/var/www/discourse/script/import_scripts/jive/attach/#{thread.messageid}/#{item}"
upload = create_upload(thread.userid, attach_path, File.basename(attach_path))
if upload.persisted?
- puts "Attachment upload is successful for #{attach_path}, new path is #{upload.url}!"
- thread.body.gsub!(item,upload.url)
- thread.body << "
#{attachment_html(upload,item)}"
+ puts "Attachment upload is successful for #{attach_path}, new path is #{upload.url}!"
+ thread.body.gsub!(item, upload.url)
+ thread.body << "
#{attachment_html(upload, item)}"
else
- puts "Error: Attachment upload is not successful for #{attach_path}!"
+ puts "Error: Attachment upload is not successful for #{attach_path}!"
end
end
end
@@ -337,7 +337,7 @@ class ImportScripts::Jive < ImportScripts::Base
topic_map.each do |_, topic|
posts << topic if topic[:body]
- count+=1
+ count += 1
end
csv_parse("messages") do |thread|
@@ -350,14 +350,14 @@ class ImportScripts::Jive < ImportScripts::Base
#IMAGE UPLOADER
if thread.imagecount
Dir.foreach("/var/www/discourse/script/import_scripts/jive/img/#{thread.messageid}") do |item|
- next if item == '.' or item == '..' or item == '.DS_Store'
+ next if item == ('.') || item == ('..') || item == ('.DS_Store')
photo_path = "/var/www/discourse/script/import_scripts/jive/img/#{thread.messageid}/#{item}"
upload = create_upload(thread.userid, photo_path, File.basename(photo_path))
if upload.persisted?
- puts "Image upload is successful for #{photo_path}, new path is #{upload.url}!"
- thread.body.gsub!(item,upload.url)
+ puts "Image upload is successful for #{photo_path}, new path is #{upload.url}!"
+ thread.body.gsub!(item, upload.url)
else
- puts "Error: Image upload is not successful for #{photo_path}!"
+ puts "Error: Image upload is not successful for #{photo_path}!"
end
end
end
@@ -365,15 +365,15 @@ class ImportScripts::Jive < ImportScripts::Base
#ATTACHMENT UPLOADER
if thread.attachmentcount
Dir.foreach("/var/www/discourse/script/import_scripts/jive/attach/#{thread.messageid}") do |item|
- next if item == '.' or item == '..' or item == '.DS_Store'
+ next if item == ('.') || item == ('..') || item == ('.DS_Store')
attach_path = "/var/www/discourse/script/import_scripts/jive/attach/#{thread.messageid}/#{item}"
upload = create_upload(thread.userid, attach_path, File.basename(attach_path))
if upload.persisted?
- puts "Attachment upload is successful for #{attach_path}, new path is #{upload.url}!"
- thread.body.gsub!(item,upload.url)
- thread.body << "
#{attachment_html(upload,item)}"
+ puts "Attachment upload is successful for #{attach_path}, new path is #{upload.url}!"
+ thread.body.gsub!(item, upload.url)
+ thread.body << "
#{attachment_html(upload, item)}"
else
- puts "Error: Attachment upload is not successful for #{attach_path}!"
+ puts "Error: Attachment upload is not successful for #{attach_path}!"
end
end
end
@@ -387,7 +387,7 @@ class ImportScripts::Jive < ImportScripts::Base
created_at: DateTime.parse(thread.creationdate)
}
posts << row
- count+=1
+ count += 1
if posts.length > 0 && posts.length % BATCH_SIZE == 0
import_post_batch!(posts, topic_map, count - posts.length, total)
diff --git a/script/import_scripts/jive_api.rb b/script/import_scripts/jive_api.rb
index 0441db26280..f8c3734a351 100644
--- a/script/import_scripts/jive_api.rb
+++ b/script/import_scripts/jive_api.rb
@@ -334,7 +334,7 @@ class ImportScripts::JiveApi < ImportScripts::Base
SQL
end
- def get(url_or_path, authenticated=false)
+ def get(url_or_path, authenticated = false)
tries ||= 3
command = ["curl", "--silent"]
diff --git a/script/import_scripts/json_generic.rb b/script/import_scripts/json_generic.rb
index c6474b26674..f98bcebcbc5 100755
--- a/script/import_scripts/json_generic.rb
+++ b/script/import_scripts/json_generic.rb
@@ -6,7 +6,7 @@ require File.expand_path(File.dirname(__FILE__) + "/base.rb")
class ImportScripts::JsonGeneric < ImportScripts::Base
JSON_FILE_PATH = ENV['JSON_FILE']
- BATCH_SIZE ||= 1000
+ BATCH_SIZE ||= 1000
def initialize
super
@@ -59,7 +59,6 @@ class ImportScripts::JsonGeneric < ImportScripts::Base
end
end
-
def import_discussions
puts "", "Importing discussions"
@@ -103,6 +102,6 @@ class ImportScripts::JsonGeneric < ImportScripts::Base
end
end
-if __FILE__==$0
+if __FILE__ == $0
ImportScripts::JsonGeneric.new.perform
end
diff --git a/script/import_scripts/kunena.rb b/script/import_scripts/kunena.rb
index 3cb52e7b38a..1aa333593ee 100644
--- a/script/import_scripts/kunena.rb
+++ b/script/import_scripts/kunena.rb
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + "/base.rb")
class ImportScripts::Kunena < ImportScripts::Base
- KUNENA_DB = "kunena"
+ KUNENA_DB = "kunena"
def initialize
super
@@ -38,7 +38,7 @@ class ImportScripts::Kunena < ImportScripts::Base
@users = nil
create_categories(@client.query("SELECT id, parent, name, description, ordering FROM jos_kunena_categories ORDER BY parent, id;")) do |c|
- h = {id: c['id'], name: c['name'], description: c['description'], position: c['ordering'].to_i}
+ h = { id: c['id'], name: c['name'], description: c['description'], position: c['ordering'].to_i }
if c['parent'].to_i > 0
h[:parent_category_id] = category_id_from_imported_category_id(c['parent'])
end
@@ -61,12 +61,12 @@ class ImportScripts::Kunena < ImportScripts::Base
puts "fetching Joomla users data from mysql"
results = @client.query("SELECT id, username, email, registerDate FROM jos_users;", cache_rows: false)
results.each do |u|
- next unless u['id'].to_i > 0 and u['username'].present? and u['email'].present?
- username = u['username'].gsub(' ', '_').gsub(/[^A-Za-z0-9_]/, '')[0,User.username_length.end]
+ next unless u['id'].to_i > (0) && u['username'].present? && u['email'].present?
+ username = u['username'].gsub(' ', '_').gsub(/[^A-Za-z0-9_]/, '')[0, User.username_length.end]
if username.length < User.username_length.first
username = username * User.username_length.first
end
- @users[u['id'].to_i] = {id: u['id'].to_i, username: username, email: u['email'], created_at: u['registerDate']}
+ @users[u['id'].to_i] = { id: u['id'].to_i, username: username, email: u['email'], created_at: u['registerDate'] }
end
puts "fetching Kunena user data from mysql"
@@ -109,7 +109,7 @@ class ImportScripts::Kunena < ImportScripts::Base
break if results.size < 1
- next if all_records_exist? :posts, results.map {|p| p['id'].to_i}
+ next if all_records_exist? :posts, results.map { |p| p['id'].to_i }
create_posts(results, total: total_count, offset: offset) do |m|
skip = false
diff --git a/script/import_scripts/kunena3.rb b/script/import_scripts/kunena3.rb
index 2f4d7808c44..4a271202748 100644
--- a/script/import_scripts/kunena3.rb
+++ b/script/import_scripts/kunena3.rb
@@ -60,7 +60,7 @@ class ImportScripts::Kunena < ImportScripts::Base
@users = nil
create_categories(@client.query("SELECT id, #{PARENT_FIELD} as parent_id, name, description, ordering FROM #{KUNENA_PREFIX}kunena_categories ORDER BY #{PARENT_FIELD}, id;")) do |c|
- h = {id: c['id'], name: c['name'], description: c['description'], position: c['ordering'].to_i}
+ h = { id: c['id'], name: c['name'], description: c['description'], position: c['ordering'].to_i }
if c['parent_id'].to_i > 0
h[:parent_category_id] = category_id_from_imported_category_id(c['parent_id'])
end
@@ -83,12 +83,12 @@ class ImportScripts::Kunena < ImportScripts::Base
puts "fetching Joomla users data from mysql"
results = @client.query("SELECT id, username, email, registerDate FROM #{KUNENA_PREFIX}users;", cache_rows: false)
results.each do |u|
- next unless u['id'].to_i > 0 and u['username'].present? and u['email'].present?
- username = u['username'].gsub(' ', '_').gsub(/[^A-Za-z0-9_]/, '')[0,User.username_length.end]
+ next unless u['id'].to_i > (0) && u['username'].present? && u['email'].present?
+ username = u['username'].gsub(' ', '_').gsub(/[^A-Za-z0-9_]/, '')[0, User.username_length.end]
if username.length < User.username_length.first
username = username * User.username_length.first
end
- @users[u['id'].to_i] = {id: u['id'].to_i, username: username, email: u['email'], created_at: u['registerDate']}
+ @users[u['id'].to_i] = { id: u['id'].to_i, username: username, email: u['email'], created_at: u['registerDate'] }
end
puts "fetching Kunena user data from mysql"
@@ -131,7 +131,7 @@ class ImportScripts::Kunena < ImportScripts::Base
break if results.size < 1
- next if all_records_exist? :posts, results.map {|p| p['id'].to_i}
+ next if all_records_exist? :posts, results.map { |p| p['id'].to_i }
create_posts(results, total: total_count, offset: offset) do |m|
skip = false
diff --git a/script/import_scripts/lithium.rb b/script/import_scripts/lithium.rb
index 54cd27e1d92..b366a2a4d78 100644
--- a/script/import_scripts/lithium.rb
+++ b/script/import_scripts/lithium.rb
@@ -10,8 +10,6 @@
# that was done using import_scripts/support/convert_mysql_xml_to_mysql.rb
#
-
-
require 'mysql2'
require 'csv'
require 'reverse_markdown'
@@ -19,7 +17,7 @@ require File.expand_path(File.dirname(__FILE__) + "/base.rb")
require 'htmlentities'
# remove table conversion
-[:table,:td,:tr,:th,:thead,:tbody].each do |tag|
+[:table, :td, :tr, :th, :thead, :tbody].each do |tag|
ReverseMarkdown::Converters.unregister(tag)
end
@@ -101,7 +99,7 @@ class ImportScripts::Lithium < ImportScripts::Base
break if users.size < 1
- next if all_records_exist? :users, users.map {|u| u["id"].to_i}
+ next if all_records_exist? :users, users.map { |u| u["id"].to_i }
create_users(users, total: user_count, offset: offset) do |user|
@@ -123,7 +121,7 @@ class ImportScripts::Lithium < ImportScripts::Base
end
def unix_time(t)
- Time.at(t/1000.0)
+ Time.at(t / 1000.0)
end
def import_profile_picture(old_user, imported_user)
@@ -191,7 +189,6 @@ class ImportScripts::Lithium < ImportScripts::Base
top_level_ids = Set.new
child_ids = Set.new
-
parent = nil
CSV.foreach(CATEGORY_CSV) do |row|
display_id = row[2].strip
@@ -216,7 +213,6 @@ class ImportScripts::Lithium < ImportScripts::Base
top_level_categories = categories.select { |c| top_level_ids.include? c["display_id"] }
-
create_categories(top_level_categories) do |category|
info = category_info[category["display_id"]]
info[:id] = category["node_id"]
@@ -228,7 +224,6 @@ class ImportScripts::Lithium < ImportScripts::Base
}
end
-
puts "", "importing children categories..."
children_categories = categories.select { |c| child_ids.include? c["display_id"] }
@@ -246,7 +241,7 @@ class ImportScripts::Lithium < ImportScripts::Base
end
puts "", "securing categories"
- category_info.each do |_,info|
+ category_info.each do |_, info|
if info[:secure]
id = category_id_from_imported_category_id(info[:id])
if id
@@ -278,7 +273,7 @@ class ImportScripts::Lithium < ImportScripts::Base
break if topics.size < 1
- next if all_records_exist? :posts, topics.map {|topic| "#{topic["node_id"]} #{topic["id"]}"}
+ next if all_records_exist? :posts, topics.map { |topic| "#{topic["node_id"]} #{topic["id"]}" }
create_posts(topics, total: topic_count, offset: offset) do |topic|
@@ -295,7 +290,7 @@ class ImportScripts::Lithium < ImportScripts::Base
raw: raw,
created_at: unix_time(topic["post_date"]),
views: topic["views"],
- custom_fields: {import_unique_id: topic["unique_id"]},
+ custom_fields: { import_unique_id: topic["unique_id"] },
import_mode: true
}
else
@@ -326,7 +321,7 @@ class ImportScripts::Lithium < ImportScripts::Base
break if posts.size < 1
- next if all_records_exist? :posts, posts.map {|post| "#{post["node_id"]} #{post["root_id"]} #{post["id"]}"}
+ next if all_records_exist? :posts, posts.map { |post| "#{post["node_id"]} #{post["root_id"]} #{post["id"]}" }
create_posts(posts, total: post_count, offset: offset) do |post|
raw = post["raw"]
@@ -340,7 +335,7 @@ class ImportScripts::Lithium < ImportScripts::Base
topic_id: topic[:topic_id],
raw: raw,
created_at: unix_time(post["post_date"]),
- custom_fields: {import_unique_id: post["unique_id"]},
+ custom_fields: { import_unique_id: post["unique_id"] },
import_mode: true
}
@@ -365,7 +360,7 @@ class ImportScripts::Lithium < ImportScripts::Base
"smileysurprised" => "dizzy_face",
"smileytongue" => "stuck_out_tongue",
"smileyvery-happy" => "grin",
- "smileywink" => "wink",
+ "smileywink" => "wink",
"smileyfrustrated" => "confounded",
"smileyembarrassed" => "flushed",
"smileylol" => "laughing",
@@ -382,7 +377,6 @@ class ImportScripts::Lithium < ImportScripts::Base
"catlol" => "joy_cat"
}
-
def import_likes
puts "\nimporting likes..."
@@ -395,8 +389,6 @@ class ImportScripts::Lithium < ImportScripts::Base
existing_map[import_id] = post_id
end
-
-
puts "loading data into temp table"
PostAction.exec_sql("create temp table like_data(user_id int, post_id int, created_at timestamp without time zone)")
PostAction.transaction do
@@ -436,7 +428,6 @@ class ImportScripts::Lithium < ImportScripts::Base
WHERE ua.id IS NULL AND pa.post_action_type_id = 2
SQL
-
# reverse action
UserAction.exec_sql <<-SQL
INSERT INTO user_actions (user_id, action_type, target_topic_id, target_post_id, acting_user_id, created_at, updated_at)
@@ -490,7 +481,6 @@ class ImportScripts::Lithium < ImportScripts::Base
existing_map[import_id] = post_id
end
-
puts "loading data into temp table"
PostAction.exec_sql("create temp table accepted_data(post_id int primary key)")
PostAction.transaction do
@@ -507,7 +497,6 @@ class ImportScripts::Lithium < ImportScripts::Base
end
end
-
puts "deleting dupe answers"
PostAction.exec_sql <<-SQL
DELETE FROM accepted_data WHERE post_id NOT IN (
@@ -553,7 +542,7 @@ class ImportScripts::Lithium < ImportScripts::Base
users = {}
- [inbox,outbox].each do |r|
+ [inbox, outbox].each do |r|
r.each do |row|
ary = (users[row["note_id"]] ||= Set.new)
user_id = user_id_from_imported_user_id(row["user_id"])
@@ -567,7 +556,7 @@ class ImportScripts::Lithium < ImportScripts::Base
subject_to_first_note = {}
mysql_query("SELECT note_id, subject, sender_user_id FROM tblia_notes_content order by note_id").each do |row|
- user_id = user_id_from_imported_user_id(row["sender_user_id"])
+ user_id = user_id_from_imported_user_id(row["sender_user_id"])
ary = (users[row["note_id"]] ||= Set.new)
if user_id
ary << user_id
@@ -581,7 +570,7 @@ class ImportScripts::Lithium < ImportScripts::Base
puts "Loading user_id to username map"
user_map = {}
- User.pluck(:id, :username).each do |id,username|
+ User.pluck(:id, :username).each do |id, username|
user_map[id] = username
end
@@ -596,17 +585,16 @@ class ImportScripts::Lithium < ImportScripts::Base
OFFSET #{offset}
SQL
-
break if topics.size < 1
- next if all_records_exist? :posts, topics.map {|topic| "pm_#{topic["note_id"]}"}
+ next if all_records_exist? :posts, topics.map { |topic| "pm_#{topic["note_id"]}" }
create_posts(topics, total: topic_count, offset: offset) do |topic|
user_id = user_id_from_imported_user_id(topic["sender_user_id"]) || Discourse::SYSTEM_USER_ID
participants = users[topic["note_id"]]
- usernames = (participants - [user_id]).map{|id| user_map[id]}
+ usernames = (participants - [user_id]).map { |id| user_map[id] }
subject = topic["subject"]
topic_id = nil
@@ -646,7 +634,6 @@ class ImportScripts::Lithium < ImportScripts::Base
def close_topics
-
puts "\nclosing closed topics..."
sql = "select unique_id post_id from message2 where root_id = id AND (attributes & 0x0002 ) != 0;"
@@ -658,8 +645,8 @@ class ImportScripts::Lithium < ImportScripts::Base
existing_map[import_id.to_i] = post_id.to_i
end
- results.map{|r| r["post_id"]}.each_slice(500) do |ids|
- mapped = ids.map{|id| existing_map[id]}.compact
+ results.map { |r| r["post_id"] }.each_slice(500) do |ids|
+ mapped = ids.map { |id| existing_map[id] }.compact
Topic.exec_sql("
UPDATE topics SET closed = true
WHERE id IN (SELECT topic_id FROM posts where id in (:ids))
@@ -668,7 +655,6 @@ class ImportScripts::Lithium < ImportScripts::Base
end
-
def create_permalinks
puts "Creating permalinks"
@@ -739,7 +725,6 @@ SQL
def post_process_posts
puts "", "Postprocessing posts..."
-
current = 0
max = Post.count
@@ -766,7 +751,6 @@ SQL
end
end
-
def postprocess_post_raw(raw, user_id)
doc = Nokogiri::HTML.fragment(raw)
@@ -827,7 +811,7 @@ SQL
":#{SMILEY_SUBS[$1] || $1}:"
end
# nbsp central
- raw.gsub!(/([a-zA-Z0-9]) ([a-zA-Z0-9])/,"\\1 \\2")
+ raw.gsub!(/([a-zA-Z0-9]) ([a-zA-Z0-9])/, "\\1 \\2")
raw
end
diff --git a/script/import_scripts/mbox-experimental.rb b/script/import_scripts/mbox-experimental.rb
index 065b0111bd8..12c18515abb 100644
--- a/script/import_scripts/mbox-experimental.rb
+++ b/script/import_scripts/mbox-experimental.rb
@@ -14,4 +14,3 @@ module ImportScripts
Importer.new(@settings).perform
end
end
-
diff --git a/script/import_scripts/mbox.rb b/script/import_scripts/mbox.rb
index e7c25ed18c6..d0b379aa12a 100755
--- a/script/import_scripts/mbox.rb
+++ b/script/import_scripts/mbox.rb
@@ -46,7 +46,7 @@ class ImportScripts::Mbox < ImportScripts::Base
exit
end
- validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create
+ validates_format_of :email, with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, on: :create
def execute
import_categories
@@ -63,7 +63,7 @@ class ImportScripts::Mbox < ImportScripts::Base
mappings = CATEGORY_MAPPINGS.values - ['uncategorized']
create_categories(mappings) do |c|
- {id: c, name: c}
+ { id: c, name: c }
end
end
@@ -109,7 +109,7 @@ class ImportScripts::Mbox < ImportScripts::Base
each_line(f) do |line|
line = line.scrub
if line =~ SPLIT_AT
-p message_count += 1
+ p message_count += 1
if !msg.empty?
mail = Mail.read_from_string(msg)
yield mail, f
@@ -163,7 +163,7 @@ p message_count += 1
puts "#{not_found.size} records couldn't be associated with parents"
if not_found.present?
- db.execute "UPDATE emails SET reply_to = NULL WHERE msg_id IN (#{not_found.map {|nf| "'#{nf}'"}.join(',')})"
+ db.execute "UPDATE emails SET reply_to = NULL WHERE msg_id IN (#{not_found.map { |nf| "'#{nf}'" }.join(',')})"
end
dupe_titles = db.execute "SELECT title, COUNT(*) FROM emails GROUP BY title HAVING count(*) > 1"
@@ -197,7 +197,7 @@ p message_count += 1
from_email.gsub!(/ /, '')
end
end
-p end
+ end
display_names = from.try(:display_names)
if display_names.present?
@@ -308,7 +308,7 @@ p end
title.strip
#In case of mixed localized prefixes there could be many of them if the mail client didn't strip the localized ones
- if original_length > title.length
+ if original_length > title.length
clean_title(title)
else
title
@@ -331,9 +331,9 @@ p end
total_count = all_users.size
batches(BATCH_SIZE) do |offset|
- users = all_users[offset..offset+BATCH_SIZE-1]
+ users = all_users[offset..offset + BATCH_SIZE - 1]
break if users.nil?
- next if all_records_exist? :users, users.map {|u| u[1]}
+ next if all_records_exist? :users, users.map { |u| u[1] }
create_users(users, total: total_count, offset: offset) do |u|
{
@@ -374,7 +374,7 @@ p end
new_raw = p.raw.dup
new_raw = new_raw.gsub!(/#{Regexp.escape(find)}/i, replace) || new_raw
if new_raw != p.raw
- p.revise(Discourse.system_user, { raw: new_raw }, { bypass_bump: true })
+ p.revise(Discourse.system_user, { raw: new_raw }, bypass_bump: true)
print_warning "\nReplaced #{find} with #{replace} in topic #{p.topic_id}"
end
end
@@ -411,10 +411,10 @@ p end
topic_count = all_topics.size
batches(BATCH_SIZE) do |offset|
- topics = all_topics[offset..offset+BATCH_SIZE-1]
+ topics = all_topics[offset..offset + BATCH_SIZE - 1]
break if topics.nil?
- next if all_records_exist? :posts, topics.map {|t| t[0]}
+ next if all_records_exist? :posts, topics.map { |t| t[0] }
create_posts(topics, total: topic_count, offset: offset) do |t|
raw_email = t[5]
@@ -454,7 +454,7 @@ p end
raw = clean_raw(raw)
raw = raw.dup.to_s
raw.gsub!(/#{from_email}/, "@#{username}")
- cleaned_email = from_email.dup.sub(/@/,' at ')
+ cleaned_email = from_email.dup.sub(/@/, ' at ')
raw.gsub!(/#{cleaned_email}/, "@#{username}")
{ id: t[0],
title: clean_title(title),
@@ -490,11 +490,11 @@ p end
puts "Replies: #{post_count}"
batches(BATCH_SIZE) do |offset|
- posts = replies[offset..offset+BATCH_SIZE-1]
+ posts = replies[offset..offset + BATCH_SIZE - 1]
break if posts.nil?
break if posts.count < 1
- next if all_records_exist? :posts, posts.map {|p| p[0]}
+ next if all_records_exist? :posts, posts.map { |p| p[0] }
create_posts(posts, total: post_count, offset: offset) do |p|
parent_id = p[6]
@@ -521,7 +521,7 @@ p end
user_id = user_id_from_imported_user_id(from_email) || Discourse::SYSTEM_USER_ID
raw = clean_raw(raw).to_s
raw.gsub!(/#{from_email}/, "@#{username}")
- cleaned_email = from_email.dup.sub(/@/,' at ')
+ cleaned_email = from_email.dup.sub(/@/, ' at ')
raw.gsub!(/#{cleaned_email}/, "@#{username}")
# import the attachments
mail.attachments.each do |attachment|
diff --git a/script/import_scripts/muut.rb b/script/import_scripts/muut.rb
index ccd356d90db..24134ee3f92 100644
--- a/script/import_scripts/muut.rb
+++ b/script/import_scripts/muut.rb
@@ -59,7 +59,6 @@ class ImportScripts::Muut < ImportScripts::Base
end
end
-
def import_categories
puts "", "Importing categories"
@@ -72,7 +71,6 @@ class ImportScripts::Muut < ImportScripts::Base
end
end
-
def import_discussions
puts "", "Importing discussions"
@@ -81,7 +79,6 @@ class ImportScripts::Muut < ImportScripts::Base
@imported_json['categories'].each do |category|
-
@imported_json['threads'][category['path']].each do |thread|
next if thread["seed"]["key"] == "skip-this-topic"
@@ -96,7 +93,7 @@ class ImportScripts::Muut < ImportScripts::Base
end
# update user display name
- if thread["seed"]["author"] && thread["seed"]["author"]["displayname"] != "" && mapped[:user_id] != -1
+ if thread["seed"]["author"] && thread["seed"]["author"]["displayname"] != "" && mapped[:user_id] != -1
user = User.find_by(id: mapped[:user_id])
if user
user.name = thread["seed"]["author"]["displayname"]
@@ -181,6 +178,6 @@ class ImportScripts::Muut < ImportScripts::Base
end
-if __FILE__==$0
+if __FILE__ == $0
ImportScripts::Muut.new.perform
end
diff --git a/script/import_scripts/mybb.rb b/script/import_scripts/mybb.rb
index 8bf101c39ab..f9201ecacfa 100644
--- a/script/import_scripts/mybb.rb
+++ b/script/import_scripts/mybb.rb
@@ -37,7 +37,7 @@ class ImportScripts::MyBB < ImportScripts::Base
end
def execute
- SiteSetting.disable_emails=true
+ SiteSetting.disable_emails = true
import_users
import_categories
import_posts
@@ -66,7 +66,7 @@ class ImportScripts::MyBB < ImportScripts::Base
break if results.size < 1
- next if all_records_exist? :users, results.map {|u| u["id"].to_i}
+ next if all_records_exist? :users, results.map { |u| u["id"].to_i }
create_users(results, total: total_count, offset: offset) do |user|
{ id: user['id'],
@@ -87,7 +87,7 @@ class ImportScripts::MyBB < ImportScripts::Base
")
create_categories(results) do |row|
- h = {id: row['id'], name: CGI.unescapeHTML(row['name']), description: CGI.unescapeHTML(row['description'])}
+ h = { id: row['id'], name: CGI.unescapeHTML(row['name']), description: CGI.unescapeHTML(row['description']) }
if row['parent_id'].to_i > 0
h[:parent_category_id] = category_id_from_imported_category_id(row['parent_id'])
end
@@ -120,7 +120,7 @@ class ImportScripts::MyBB < ImportScripts::Base
break if results.size < 1
- next if all_records_exist? :posts, results.map {|m| m['id'].to_i}
+ next if all_records_exist? :posts, results.map { |m| m['id'].to_i }
create_posts(results, total: total_count, offset: offset) do |m|
skip = false
@@ -235,7 +235,7 @@ class ImportScripts::MyBB < ImportScripts::Base
def create_permalinks
puts '', 'Creating redirects...', ''
- SiteSetting.permalink_normalizations= '/(\\w+)-(\\d+)[-.].*/\\1-\\2.html'
+ SiteSetting.permalink_normalizations = '/(\\w+)-(\\d+)[-.].*/\\1-\\2.html'
puts '', 'Users...', ''
total_users = User.count
start_time = Time.now
@@ -244,7 +244,7 @@ class ImportScripts::MyBB < ImportScripts::Base
ucf = u.custom_fields
count += 1
if ucf && ucf["import_id"] && ucf["import_username"]
- Permalink.create(url: "#{BASE}/user-#{ucf['import_id']}.html", external_url: "/u/#{u.username}" ) rescue nil
+ Permalink.create(url: "#{BASE}/user-#{ucf['import_id']}.html", external_url: "/u/#{u.username}") rescue nil
end
print_status(count, total_users, start_time)
end
@@ -260,7 +260,7 @@ class ImportScripts::MyBB < ImportScripts::Base
unless QUIET
puts ("forum-#{id}.html --> /c/#{cat.id}")
end
- Permalink.create( url: "#{BASE}/forum-#{id}.html", category_id: cat.id ) rescue nil
+ Permalink.create(url: "#{BASE}/forum-#{id}.html", category_id: cat.id) rescue nil
print_status(count, total_categories, start_time)
end
@@ -286,7 +286,7 @@ class ImportScripts::MyBB < ImportScripts::Base
count += 1
if topic = topic_lookup_from_imported_post_id(post['id'])
id = post['topic_id']
- Permalink.create( url: "#{BASE}/thread-#{id}.html", topic_id: topic[:topic_id] ) rescue nil
+ Permalink.create(url: "#{BASE}/thread-#{id}.html", topic_id: topic[:topic_id]) rescue nil
unless QUIET
puts ("#{BASE}/thread-#{id}.html --> http://localhost:3000/t/#{topic[:topic_id]}")
end
@@ -296,8 +296,6 @@ class ImportScripts::MyBB < ImportScripts::Base
end
end
-
-
def mysql_query(sql)
@client.query(sql, cache_rows: false)
end
diff --git a/script/import_scripts/mylittleforum.rb b/script/import_scripts/mylittleforum.rb
index fbec5dad462..f0ec1524720 100644
--- a/script/import_scripts/mylittleforum.rb
+++ b/script/import_scripts/mylittleforum.rb
@@ -2,7 +2,6 @@ require "mysql2"
require File.expand_path(File.dirname(__FILE__) + "/base.rb")
require 'htmlentities'
-
# Before running this script, paste these lines into your shell,
# then use arrow keys to edit the values
=begin
@@ -16,7 +15,6 @@ export IMAGE_BASE="http://www.example.com/forum"
export BASE="forum"
=end
-
class ImportScripts::MylittleforumSQL < ImportScripts::Base
DB_HOST ||= ENV['DB_HOST'] || "localhost"
@@ -37,10 +35,9 @@ class ImportScripts::MylittleforumSQL < ImportScripts::Base
# Site settings
SiteSetting.disable_emails = true
if FORCE_HOSTNAME
- SiteSetting.force_hostname=FORCE_HOSTNAME
+ SiteSetting.force_hostname = FORCE_HOSTNAME
end
-
def initialize
if IMPORT_AFTER > "1970-01-01"
@@ -57,7 +54,7 @@ class ImportScripts::MylittleforumSQL < ImportScripts::Base
database: DB_NAME
)
rescue Exception => e
- puts '='*50
+ puts '=' * 50
puts e.message
puts < #{username}")
end
@@ -210,7 +207,7 @@ EOM
OFFSET #{offset};")
break if discussions.size < 1
- next if all_records_exist? :posts, discussions.map {|t| "discussion#" + t['DiscussionID'].to_s}
+ next if all_records_exist? :posts, discussions.map { |t| "discussion#" + t['DiscussionID'].to_s }
create_posts(discussions, total: total_count, offset: offset) do |discussion|
@@ -226,7 +223,7 @@ EOM
{
id: "discussion#" + discussion['DiscussionID'].to_s,
user_id: user_id_from_imported_user_id(discussion['InsertUserID']) || Discourse::SYSTEM_USER_ID,
- title: discussion['Name'].gsub('\\"','"'),
+ title: discussion['Name'].gsub('\\"', '"'),
category: category_id_from_imported_category_id(discussion['CategoryID']),
raw: raw,
created_at: Time.zone.at(discussion['DateInserted']),
@@ -260,7 +257,7 @@ EOM
OFFSET #{offset};")
break if comments.size < 1
- next if all_records_exist? :posts, comments.map {|comment| "comment#" + comment['CommentID'].to_s}
+ next if all_records_exist? :posts, comments.map { |comment| "comment#" + comment['CommentID'].to_s }
create_posts(comments, total: total_count, offset: offset) do |comment|
next unless t = topic_lookup_from_imported_post_id("discussion#" + comment['DiscussionID'].to_s)
@@ -286,9 +283,9 @@ EOM
youtube_cooked = clean_up(youtube_raw.dup.to_s)
# get just src from