Merge branch 'main' into feature/stimulus-character-count
This commit is contained in:
commit
559ed3ecf8
|
@ -1,3 +1,5 @@
|
|||
# These are supported funding model platforms
|
||||
|
||||
github: retrospring
|
||||
open_collective: retrospring
|
||||
patreon: retrospring
|
||||
|
|
5
Gemfile
5
Gemfile
|
@ -65,6 +65,9 @@ gem "redis"
|
|||
|
||||
gem "fake_email_validator"
|
||||
|
||||
# TLD validation
|
||||
gem "tldv", "~> 0.1.0"
|
||||
|
||||
gem "jwt", "~> 2.5"
|
||||
|
||||
group :development do
|
||||
|
@ -94,7 +97,7 @@ group :development, :test do
|
|||
gem "rspec-mocks"
|
||||
gem "rspec-rails", "~> 5.1"
|
||||
gem "rspec-sidekiq", "~> 3.0", require: false
|
||||
gem "rubocop", "~> 1.36"
|
||||
gem "rubocop", "~> 1.37"
|
||||
gem "rubocop-rails", "~> 2.16"
|
||||
gem "shoulda-matchers", "~> 5.2"
|
||||
gem "simplecov", require: false
|
||||
|
|
14
Gemfile.lock
14
Gemfile.lock
|
@ -315,7 +315,7 @@ GEM
|
|||
net-smtp (0.3.2)
|
||||
net-protocol
|
||||
nio4r (2.5.8)
|
||||
nokogiri (1.13.8)
|
||||
nokogiri (1.13.9)
|
||||
mini_portile2 (~> 2.8.0)
|
||||
racc (~> 1.4)
|
||||
notiffany (0.1.3)
|
||||
|
@ -444,17 +444,17 @@ GEM
|
|||
rspec-core (~> 3.0, >= 3.0.0)
|
||||
sidekiq (>= 2.4.0)
|
||||
rspec-support (3.11.0)
|
||||
rubocop (1.36.0)
|
||||
rubocop (1.37.1)
|
||||
json (~> 2.3)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.1.2.1)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8, < 3.0)
|
||||
rexml (>= 3.2.5, < 4.0)
|
||||
rubocop-ast (>= 1.20.1, < 2.0)
|
||||
rubocop-ast (>= 1.23.0, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 1.4.0, < 3.0)
|
||||
rubocop-ast (1.21.0)
|
||||
rubocop-ast (1.23.0)
|
||||
parser (>= 3.1.1.0)
|
||||
rubocop-rails (2.16.1)
|
||||
activesupport (>= 4.2.0)
|
||||
|
@ -518,6 +518,9 @@ GEM
|
|||
thread_safe (0.3.6)
|
||||
tilt (2.0.11)
|
||||
timeout (0.3.0)
|
||||
tldv (0.1.0)
|
||||
tldv-data (~> 1.0)
|
||||
tldv-data (1.0.2022101300)
|
||||
turbo-rails (1.1.1)
|
||||
actionpack (>= 6.0.0)
|
||||
activejob (>= 6.0.0)
|
||||
|
@ -627,7 +630,7 @@ DEPENDENCIES
|
|||
rspec-mocks
|
||||
rspec-rails (~> 5.1)
|
||||
rspec-sidekiq (~> 3.0)
|
||||
rubocop (~> 1.36)
|
||||
rubocop (~> 1.37)
|
||||
rubocop-rails (~> 2.16)
|
||||
ruby-progressbar
|
||||
sanitize
|
||||
|
@ -641,6 +644,7 @@ DEPENDENCIES
|
|||
simplecov-cobertura
|
||||
simplecov-json
|
||||
spring (~> 4.1)
|
||||
tldv (~> 0.1.0)
|
||||
turbo-rails
|
||||
twitter
|
||||
twitter-text
|
||||
|
|
|
@ -2,14 +2,15 @@
|
|||
|
||||
class TimelineController < ApplicationController
|
||||
before_action :authenticate_user!
|
||||
before_action :set_list, only: %i[list]
|
||||
before_action :set_lists
|
||||
|
||||
def index
|
||||
paginate_timeline { |args| current_user.cursored_timeline(**args) }
|
||||
end
|
||||
|
||||
def list
|
||||
@list = current_user.lists.find_by!(name: params[:list_name])
|
||||
@title = list_title(current_user.lists.find_by!(name: params[:list_name]))
|
||||
@title = list_title(@list)
|
||||
paginate_timeline { |args| @list.cursored_timeline(**args) }
|
||||
end
|
||||
|
||||
|
@ -20,6 +21,15 @@ class TimelineController < ApplicationController
|
|||
|
||||
private
|
||||
|
||||
def set_list
|
||||
@list = current_user.lists.find_by!(name: params[:list_name]) if params[:list_name].present?
|
||||
end
|
||||
|
||||
def set_lists
|
||||
@lists = current_user.lists
|
||||
@lists = @lists.where.not(id: @list.id) if @list.present?
|
||||
end
|
||||
|
||||
def paginate_timeline
|
||||
@timeline = yield(last_id: params[:last_id])
|
||||
@timeline_last_id = @timeline.map(&:id).min
|
||||
|
|
|
@ -79,6 +79,7 @@
|
|||
"components/entry",
|
||||
"components/flags",
|
||||
"components/icons",
|
||||
"components/inbox-actions",
|
||||
"components/inbox-entry",
|
||||
"components/jumbotron",
|
||||
"components/locales",
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
.inbox-actions {
|
||||
.form-group {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.card-body {
|
||||
padding: $card-spacer-y $card-spacer-x;
|
||||
}
|
||||
}
|
|
@ -6,6 +6,14 @@
|
|||
&:focus {
|
||||
color: RGB(var(--primary-text));
|
||||
}
|
||||
|
||||
/* svg-logo! \o/ */
|
||||
svg {
|
||||
height: $navbar-brand-font-size;
|
||||
path {
|
||||
fill: RGB(var(--primary-text));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-nav {
|
||||
|
@ -47,4 +55,4 @@
|
|||
color: RGB(var(--primary-text));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,15 +1,10 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "tldv"
|
||||
|
||||
class TypoedEmailValidator < ActiveModel::EachValidator
|
||||
# this array contains "forbidden" email address endings
|
||||
INVALID_ENDINGS = [
|
||||
# without @:
|
||||
".carrd",
|
||||
".con",
|
||||
".coom",
|
||||
".cmo",
|
||||
".mail",
|
||||
|
||||
# with @:
|
||||
*%w[
|
||||
fmail.com
|
||||
|
@ -50,7 +45,13 @@ class TypoedEmailValidator < ActiveModel::EachValidator
|
|||
return false unless value.include?("@")
|
||||
|
||||
# part after the @ needs to have at least one period
|
||||
return false if value.split("@", 2).last.count(".").zero?
|
||||
_prefix, domain = value.split("@", 2)
|
||||
domain_parts = domain.split(".")
|
||||
return false if domain_parts.length == 1
|
||||
|
||||
# check if the TLD is valid
|
||||
tld = domain_parts.last
|
||||
return false unless TLDv.valid?(tld)
|
||||
|
||||
# finally, common typos
|
||||
return false if INVALID_ENDINGS.any? { value.end_with?(_1) }
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
.card.inbox-actions
|
||||
.card-body
|
||||
.d-md-flex
|
||||
= bootstrap_form_tag url: inbox_path, method: :get, html: { class: "d-block" } do |f|
|
||||
= f.text_field :author, value: params[:author], placeholder: t(".author.placeholder"), prepend: "@", hide_label: true,
|
||||
append: f.button(t(".author.button"), name: nil, class: "btn btn-light", id: "ib-author")
|
||||
.d-flex.ml-auto.mt-2.mt-md-0
|
||||
%button.btn.btn-info.mr-auto{ type: :button, id: "ib-generate-question" }
|
||||
= t(".questions.button")
|
||||
.button-group.ml-1
|
||||
%button.btn.btn-default{ title: t(".share.heading"), data: { toggle: :dropdown }, aria: { expanded: false } }
|
||||
%i.fa.fa-fw.fa-share-alt
|
||||
%span.sr-only= t(".share.heading")
|
||||
.dropdown-menu.dropdown-menu-right{ role: :menu }
|
||||
%a.dropdown-item{ href: "https://twitter.com/intent/tweet?text=Ask%20me%20anything%21&url=#{user_url(current_user)}", target: "_blank" }
|
||||
%i.fa.fa-fw.fa-twitter
|
||||
= t(".share.button", service: "Twitter")
|
||||
%a.dropdown-item{ href: "https://www.tumblr.com/share/link?url=#{user_url(current_user)}&name=Ask%20me%20anything%21", target: "_blank" }
|
||||
%i.fa.fa-fw.fa-tumblr
|
||||
= t(".share.button", service: "Tumblr")
|
||||
%button.btn.btn-danger.ml-1{ type: :button, title: t(".actions.delete"), id: delete_id, disabled: (disabled ? :disabled : nil), data: { ib_count: inbox_count } }
|
||||
%i.fa.fa-fw.fa-trash-o
|
||||
%span.sr-only= t(".actions.delete")
|
|
@ -1,27 +0,0 @@
|
|||
.card
|
||||
.card-header= t(".questions.heading")
|
||||
.card-body
|
||||
%button.btn.btn-block.btn-info{ type: :button, id: "ib-generate-question" }= t(".questions.button")
|
||||
.card
|
||||
.card-header= t(".share.heading")
|
||||
.card-body
|
||||
%a.btn.btn-block.btn-primary{ target: "_blank",
|
||||
href: "https://twitter.com/intent/tweet?text=Ask%20me%20anything%21&url=#{user_url(current_user)}" }
|
||||
%i.fa.fa-fw.fa-twitter
|
||||
= t(".share.button", service: "Twitter")
|
||||
%a.btn.btn-block.btn-primary{ target: "_blank",
|
||||
href: "https://www.tumblr.com/share/link?url=#{user_url(current_user)}&name=Ask%20me%20anything%21" }
|
||||
%i.fa.fa-fw.fa-tumblr
|
||||
= t(".share.button", service: "Tumblr")
|
||||
.card
|
||||
.card-header= t(".author.heading")
|
||||
.card-body
|
||||
%form#author-form
|
||||
= bootstrap_form_tag url: inbox_path, method: :get do |f|
|
||||
= f.text_field :author, value: params[:author], placeholder: t(".author.placeholder"), prepend: "@", hide_label: true
|
||||
= f.button t(".author.button"), name: nil, class: "btn btn-light btn-block btn-sm", id: "ib-author"
|
||||
.card
|
||||
.card-header= t(".actions.heading")
|
||||
.card-body
|
||||
%button.btn.btn-block.btn-danger{ type: :button, id: delete_id, disabled: (disabled ? :disabled : nil), data: { ib_count: inbox_count } }
|
||||
= t(".actions.delete")
|
|
@ -1,9 +1,7 @@
|
|||
.container-lg.container--main
|
||||
.row
|
||||
.col-md-3.col-sm-4.d-none.d-sm-block
|
||||
= render 'shared/sidebar'
|
||||
.col-md-9.col-xs-12.col-sm-8
|
||||
.col-sm-10.col-md-10.col-lg-9.mx-auto
|
||||
= render 'layouts/messages'
|
||||
= render 'tabs/feed', list: @list
|
||||
= render 'tabs/feed', lists: @lists, list: @list
|
||||
= yield
|
||||
.d-block.d-sm-none= render 'shared/links'
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
.container-lg.container--main
|
||||
.row
|
||||
.col-md-3.col-xs-12.col-sm-4.order-2.order-sm-1
|
||||
= render 'inbox/sidebar', delete_id: @delete_id, disabled: @disabled, inbox_count: @inbox_count
|
||||
.col-md-9.col-xs-12.col-sm-8.order-1.order-sm-2
|
||||
.col-sm-10.col-md-10.col-lg-9.mx-auto
|
||||
= render 'inbox/actions', delete_id: @delete_id, disabled: @disabled, inbox_count: @inbox_count
|
||||
= render 'layouts/messages'
|
||||
= yield
|
||||
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
%nav.navbar.navbar-themed.navbar-expand-lg.bg-primary.fixed-top.d-lg-block.d-none.d-print-none{ role: :navigation }
|
||||
.container{ class: ios_web_app? ? 'ios-web-app' : '' }
|
||||
%a.navbar-brand{ href: '/' }
|
||||
= APP_CONFIG['site_name']
|
||||
%a.navbar-brand{ href: '/', title: APP_CONFIG["site_name"] }
|
||||
- if APP_CONFIG["use_svg_logo"]
|
||||
= render inline: Rails.application.config.justask_svg_logo
|
||||
- else
|
||||
= APP_CONFIG["site_name"]
|
||||
%ul.nav.navbar-nav.mr-auto
|
||||
= nav_entry t("navigation.timeline"), root_path, icon: 'home'
|
||||
= nav_entry t("navigation.inbox"), '/inbox', icon: 'inbox', badge: inbox_count
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
%nav.navbar.navbar-themed.navbar-expand-lg.bg-primary.fixed-top{ role: :navigation }
|
||||
.container{ class: ios_web_app? ? 'ios-web-app' : '' }
|
||||
%a.navbar-brand{ href: '/' }= APP_CONFIG['site_name']
|
||||
%a.navbar-brand{ href: '/', title: APP_CONFIG["site_name"] }
|
||||
- if APP_CONFIG["use_svg_logo"]
|
||||
= render inline: Rails.application.config.justask_svg_logo
|
||||
- else
|
||||
= APP_CONFIG["site_name"]
|
||||
%button.navbar-toggler{ data: { target: '#j2-main-navbar-collapse', toggle: :collapse }, type: :button }
|
||||
%span.sr-only= t("navigation.toggle")
|
||||
%span.navbar-toggler-icon
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
.card.userbox
|
||||
%img.userbox__header{ src: current_user.profile_header.url(:mobile) }
|
||||
.card-body
|
||||
%img.userbox__avatar{ src: current_user.profile_picture.url(:small) }
|
||||
.profile__name
|
||||
- unless current_user.profile.display_name.blank?
|
||||
.profile__display-name
|
||||
= current_user.profile.display_name
|
||||
.profile__screen-name
|
||||
= current_user.screen_name
|
||||
- unless @list.nil?
|
||||
.card
|
||||
.card-header= t(".list.title")
|
||||
.card-body
|
||||
- if @list.members.empty?
|
||||
%p.text-muted= t(".list.none")
|
||||
- @list.members.each do |member|
|
||||
%a{ href: user_path(member.user), title: member.user.screen_name, data: { toggle: :tooltip, placement: :top } }
|
||||
%img.avatar-xs{ src: member.user.profile_picture.url(:medium) }
|
||||
|
||||
= render "shared/links"
|
|
@ -10,7 +10,16 @@
|
|||
- else
|
||||
= t(".lists.title")
|
||||
.dropdown-menu.dropdown-menu-right.dropdown-menu--lists
|
||||
- if current_user.lists.empty?
|
||||
- if list
|
||||
%h6.dropdown-header= t(".lists.members.title")
|
||||
- if list.members.empty?
|
||||
%p.text-muted= t(".list.members.none")
|
||||
- else
|
||||
%p.px-4.pb-2
|
||||
- list.members.each do |member|
|
||||
%a{ href: user_path(member.user), title: member.user.screen_name, data: { toggle: :tooltip, placement: :top } }
|
||||
%img.avatar-xs{ src: member.user.profile_picture.url(:small), loading: :lazy }
|
||||
- if !list && lists.empty?
|
||||
.p-3= t(".lists.notice_html")
|
||||
- current_user.lists.each do |list|
|
||||
- lists.each do |list|
|
||||
%a.dropdown-item{ href: list_timeline_path(list.name) }= list.display_name
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
return unless APP_CONFIG[:use_svg_logo]
|
||||
|
||||
begin
|
||||
logo_path = Rails.public_path.join("logo.svg")
|
||||
# we are only interested in the first element which should be the <svg> node --> extract it and transform some attributes
|
||||
logo_svg = File.read(logo_path)
|
||||
svg_doc = Nokogiri::XML(logo_svg)
|
||||
svg_node = svg_doc.first_element_child
|
||||
# remove some attributes that might interfere with the rest of the layout
|
||||
%w[id name class width height].each do |attr|
|
||||
svg_node.remove_attribute attr
|
||||
end
|
||||
|
||||
Rails.application.config.justask_svg_logo = svg_node.to_xml
|
||||
rescue => e
|
||||
warn "use_svg_logo is enabled, but the SVG could not be read due to: #{e.message} (#{e.class.name}). Disabling SVG logo."
|
||||
APP_CONFIG[:use_svg_logo] = false
|
||||
end
|
|
@ -1,6 +1,9 @@
|
|||
# The site name, shown everywhere.
|
||||
site_name: "justask"
|
||||
|
||||
# Use the SVG logo from `/public/logo.svg`
|
||||
use_svg_logo: false
|
||||
|
||||
hostname: "justask.rrerr.net"
|
||||
https: true
|
||||
|
||||
|
|
|
@ -100,7 +100,7 @@ en:
|
|||
title: "Share"
|
||||
comments:
|
||||
none: "There are no comments yet."
|
||||
placeholder: "Comment..."
|
||||
placeholder: "Comment..."
|
||||
smiles:
|
||||
none: "No one smiled this yet."
|
||||
application:
|
||||
|
@ -200,17 +200,14 @@ en:
|
|||
settings: "service settings"
|
||||
show:
|
||||
empty: "Nothing to see here."
|
||||
sidebar:
|
||||
actions:
|
||||
actions:
|
||||
heading: "Actions"
|
||||
delete: "Delete all questions"
|
||||
author:
|
||||
heading: "Show author"
|
||||
button: "Show"
|
||||
placeholder: "username"
|
||||
placeholder: "Filter by username"
|
||||
questions:
|
||||
heading: "Out of questions?"
|
||||
button: "Get new question"
|
||||
button: "Generate question"
|
||||
share:
|
||||
heading: "Share"
|
||||
button: "Share on %{service}"
|
||||
|
@ -514,10 +511,6 @@ en:
|
|||
anonymous_block:
|
||||
deleted_question: "Deleted question"
|
||||
blocked: "blocked %{time} ago"
|
||||
sidebar:
|
||||
list:
|
||||
title: "Members"
|
||||
none: "No members yet."
|
||||
tabs:
|
||||
feed:
|
||||
public: "Public"
|
||||
|
@ -534,6 +527,9 @@ en:
|
|||
Once you have done that, the lists will be shown here.
|
||||
When you select a list you'll get a timeline view of all users within that list.
|
||||
</p>
|
||||
members:
|
||||
title: "Members"
|
||||
none: "No members yet."
|
||||
moderation:
|
||||
all: "All reports"
|
||||
answers: :activerecord.models.answer.other
|
||||
|
|
|
@ -21,14 +21,14 @@
|
|||
"lato-font": "^3.0.0",
|
||||
"popper.js": "^1.16.1",
|
||||
"rails_admin": "3.0.0",
|
||||
"regenerator-runtime": "^0.13.7",
|
||||
"regenerator-runtime": "^0.13.10",
|
||||
"sweetalert": "1.1.3",
|
||||
"toastify-js": "^1.12.0",
|
||||
"typescript": "^4.8.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.19.3",
|
||||
"@babel/preset-env": "^7.19.3",
|
||||
"@babel/preset-env": "^7.19.4",
|
||||
"@rails/webpacker": "5.4.3",
|
||||
"@typescript-eslint/eslint-plugin": "^4.11.0",
|
||||
"@typescript-eslint/parser": "^4.11.0",
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 958.75 170.24"><defs><style>.cls-1{fill:#5e35b1;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="main_stuff" data-name="main stuff"><path class="cls-1" d="M210.08,93.09H137.94c3.53,13.17,15,20,29.49,20,9.45,0,17.8-2.6,24.85-8.72l11.31,12.06c-8,10-21.88,17.06-38.94,17.06-26.52,0-50.26-18-50.26-50.07,0-32.45,24.11-50.07,48.77-50.07C187.64,33.38,215.46,50.63,210.08,93.09ZM137.57,74.92H188c-1.48-13.72-13-20.59-24.66-20.59C151.85,54.33,140.72,61,137.57,74.92Z"/><path class="cls-1" d="M271.65,109.22v19.11c-3.71,3.33-10.75,4.45-16.87,4.45-16.32,0-28.19-8-28.19-27.82V55.08H212.87V35.23h13.72V10.57h25V35.23h19.84V55.08H251.63v45.8c0,5,2.78,9.83,10.94,9.83A31.27,31.27,0,0,0,271.65,109.22Z"/><path class="cls-1" d="M343.61,34.12V57.86a36.36,36.36,0,0,0-6.31-.56c-18.73,0-30.41,13-30.41,32.27v42.09H282V35.23h24.85v25c3.34-14.84,12.79-26.89,30.23-26.89A25.72,25.72,0,0,1,343.61,34.12Z"/><path class="cls-1" d="M345.65,83.45c0-32.64,25.59-50.07,50.81-50.07,25,0,50.81,17.43,50.81,50.07s-25.78,50.07-50.81,50.07C371.24,133.52,345.65,116.09,345.65,83.45Zm77,0c0-17.25-12.24-27.63-26.15-27.63S370.13,66.2,370.13,83.45s12.42,27.63,26.33,27.63S422.61,100.69,422.61,83.45Z"/><path class="cls-1" d="M451,106.44l19.84-5.37c1.85,6.3,6.49,12.79,15.95,12.79,6.3,0,12.42-3.15,12.42-10,0-4.64-3-8-10.57-10.76l-11.87-4.45c-15.95-5.75-22.62-16-22.62-27.63,0-17.25,15.2-27.63,33.38-27.63,17.43,0,30.23,9.83,33.38,24.66l-19.47,5c-2.6-7.79-7.61-10.2-12.8-10.2-6.49,0-10.38,3.71-10.38,8.35,0,4.08,2.41,7.6,10,10.19L499,75.47c11.86,4.27,24.84,11.32,24.84,28.38,0,19.28-16.5,29.67-36.71,29.67C468.05,133.52,454,124.25,451,106.44Z"/><path class="cls-1" d="M635.87,83.45c0,33.38-23.92,50.07-46.36,50.07-17.24,0-28.37-9.46-30.78-14.84h-.56V166.9H533.33V35.23h24.84v13h.56c2.41-5.37,13.54-14.83,30.78-14.83C612,33.38,635.87,50.07,635.87,83.45Zm-24.66,0c0-18-13-27.82-26.7-27.82-14.1,0-26.89,9.65-26.89,27.82s12.79,27.81,26.89,27.81C598.23,111.26,611.21,101.44,611.21,83.45Z"/><path class="cls-1" d="M707.09,34.12V57.86a36.25,36.25,0,0,0-6.3-.56c-18.73,0-30.42,13-30.42,32.27v42.09H645.52V35.23h24.85v25c3.34-14.84,12.8-26.89,30.23-26.89A25.61,25.61,0,0,1,707.09,34.12Z"/><path class="cls-1" d="M716.55,0H741.4V21.88H716.55Zm0,35.23H741.4v96.43H716.55Z"/><path class="cls-1" d="M846.55,74.92v56.74H821.7V79c0-14.1-7.6-23.37-20.59-23.37-12.79,0-20.58,9.27-20.58,23.37v52.66H755.68V35.23h24.85V48.4c5.38-8.53,15-15,29.49-15C829.86,33.38,846.55,45.62,846.55,74.92Z"/><path class="cls-1" d="M958.75,35.23v89.2c0,36.9-28.93,45.81-50.82,45.81-11.12,0-22.25-2.23-28-5.94V144.09c4.45,3,14.1,5.38,23.55,5.38,18.55,0,30.42-8.72,30.42-23.37v-7.42h-1.12c-2.41,5.38-13.16,14.84-30.22,14.84-22.26,0-46.36-16.69-46.36-50.07s24.1-50.07,46.36-50.07c17.06,0,27.81,9.46,30.22,14.83h1.12v-13Zm-24.3,48.22c0-18.17-12.79-27.82-26.89-27.82-13.9,0-26.89,9.83-26.89,27.82s13,27.81,26.89,27.81C921.66,111.26,934.45,101.62,934.45,83.45Z"/><path class="cls-1" d="M24.74,102.21a39.48,39.48,0,0,0,5.17,1.08c14.53,2,31.15-.92,45.28-7.56a73.4,73.4,0,0,1,8.48,34.89h22.65A93.26,93.26,0,0,0,93.59,83.5C103.67,74,108.76,62.39,108,50.35A39.88,39.88,0,0,0,84.36,16.86C68.54,9.65,50.13,9.84,36.68,10c-5.27.06-18.07.24-24.9.34H0V130.62H24.74Zm8.65-19.07c-4.22-.59-8.15-3.12-8.57-5.53a3.34,3.34,0,0,1,1.05-3.3c2.3-2.32,7.52-4,12.13-4h.66a38.36,38.36,0,0,1,23,8.67C52.48,82.67,42.07,84.35,33.39,83.14ZM24.74,30.52l12.2-.16c11.72-.12,26.31-.26,37.19,4.69A19.67,19.67,0,0,1,85.37,51.54c.39,6-2.15,11.06-5.37,14.92A61.43,61.43,0,0,0,39.59,49.9a46.85,46.85,0,0,0-14.85,1.91Z"/></g></g></svg>
|
After Width: | Height: | Size: 3.5 KiB |
|
@ -92,6 +92,11 @@ describe TimelineController do
|
|||
|
||||
it { should have_http_status(200) }
|
||||
it_behaves_like "paginates", :followed_user_answers
|
||||
|
||||
it "assigns all lists to an instance variable" do
|
||||
subject
|
||||
expect(assigns(:lists)).to eq(user.lists)
|
||||
end
|
||||
end
|
||||
|
||||
describe "#list" do
|
||||
|
@ -108,6 +113,11 @@ describe TimelineController do
|
|||
subject
|
||||
expect(assigns(:list)).to eq(list)
|
||||
end
|
||||
|
||||
it "excludes the current selected list from the list of lists" do
|
||||
subject
|
||||
expect(assigns(:lists)).not_to include(list)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ describe User::RegistrationsController, type: :controller do
|
|||
{
|
||||
user: {
|
||||
screen_name: "dio",
|
||||
email: "the-world-21@somewhere.everywhere",
|
||||
email: "the-world-21@somewhere.everywhere.now",
|
||||
password: "AReallySecurePassword456!",
|
||||
password_confirmation: "AReallySecurePassword456!"
|
||||
}
|
||||
|
@ -85,7 +85,7 @@ describe User::RegistrationsController, type: :controller do
|
|||
{
|
||||
user: {
|
||||
screen_name: "Dio Brando",
|
||||
email: "the-world-21@somewhere.everywhere",
|
||||
email: "the-world-21@somewhere.everywhere.now",
|
||||
password: "AReallySecurePassword456!",
|
||||
password_confirmation: "AReallySecurePassword456!"
|
||||
}
|
||||
|
@ -102,7 +102,7 @@ describe User::RegistrationsController, type: :controller do
|
|||
{
|
||||
user: {
|
||||
screen_name: "moderator",
|
||||
email: "the-world-21@somewhere.everywhere",
|
||||
email: "the-world-21@somewhere.everywhere.now",
|
||||
password: "AReallySecurePassword456!",
|
||||
password_confirmation: "AReallySecurePassword456!"
|
||||
}
|
||||
|
|
|
@ -64,6 +64,7 @@ RSpec.describe User, type: :model do
|
|||
include_examples "valid email", "fritz.fantom@protonmail.com"
|
||||
include_examples "valid email", "fritz.fantom@example.email"
|
||||
include_examples "valid email", "fritz.fantom@enterprise.k8s.420stripes.k8s.needs.more.k8s.jira.atlassian.k8s.eu-central-1.s3.amazonaws.com"
|
||||
include_examples "valid email", "fritz.fantom@emacs.horse"
|
||||
include_examples "invalid email", "@jack"
|
||||
|
||||
# examples from the real world:
|
||||
|
|
86
yarn.lock
86
yarn.lock
|
@ -24,10 +24,10 @@
|
|||
dependencies:
|
||||
"@babel/highlight" "^7.18.6"
|
||||
|
||||
"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.19.3":
|
||||
version "7.19.3"
|
||||
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.3.tgz#707b939793f867f5a73b2666e6d9a3396eb03151"
|
||||
integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==
|
||||
"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.19.3", "@babel/compat-data@^7.19.4":
|
||||
version "7.19.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.4.tgz#95c86de137bf0317f3a570e1b6e996b427299747"
|
||||
integrity sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==
|
||||
|
||||
"@babel/core@^7.15.0", "@babel/core@^7.19.3":
|
||||
version "7.19.3"
|
||||
|
@ -316,10 +316,10 @@
|
|||
dependencies:
|
||||
"@babel/types" "^7.18.6"
|
||||
|
||||
"@babel/helper-string-parser@^7.18.10":
|
||||
version "7.18.10"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56"
|
||||
integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==
|
||||
"@babel/helper-string-parser@^7.19.4":
|
||||
version "7.19.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63"
|
||||
integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==
|
||||
|
||||
"@babel/helper-validator-identifier@^7.16.7":
|
||||
version "7.16.7"
|
||||
|
@ -484,14 +484,14 @@
|
|||
"@babel/helper-plugin-utils" "^7.18.6"
|
||||
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
|
||||
|
||||
"@babel/plugin-proposal-object-rest-spread@^7.14.7", "@babel/plugin-proposal-object-rest-spread@^7.18.9":
|
||||
version "7.18.9"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7"
|
||||
integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==
|
||||
"@babel/plugin-proposal-object-rest-spread@^7.14.7", "@babel/plugin-proposal-object-rest-spread@^7.19.4":
|
||||
version "7.19.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz#a8fc86e8180ff57290c91a75d83fe658189b642d"
|
||||
integrity sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==
|
||||
dependencies:
|
||||
"@babel/compat-data" "^7.18.8"
|
||||
"@babel/helper-compilation-targets" "^7.18.9"
|
||||
"@babel/helper-plugin-utils" "^7.18.9"
|
||||
"@babel/compat-data" "^7.19.4"
|
||||
"@babel/helper-compilation-targets" "^7.19.3"
|
||||
"@babel/helper-plugin-utils" "^7.19.0"
|
||||
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
|
||||
"@babel/plugin-transform-parameters" "^7.18.8"
|
||||
|
||||
|
@ -673,12 +673,12 @@
|
|||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.18.6"
|
||||
|
||||
"@babel/plugin-transform-block-scoping@^7.18.9":
|
||||
version "7.18.9"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d"
|
||||
integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==
|
||||
"@babel/plugin-transform-block-scoping@^7.19.4":
|
||||
version "7.19.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz#315d70f68ce64426db379a3d830e7ac30be02e9b"
|
||||
integrity sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.18.9"
|
||||
"@babel/helper-plugin-utils" "^7.19.0"
|
||||
|
||||
"@babel/plugin-transform-classes@^7.19.0":
|
||||
version "7.19.0"
|
||||
|
@ -702,12 +702,12 @@
|
|||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.18.9"
|
||||
|
||||
"@babel/plugin-transform-destructuring@^7.14.7", "@babel/plugin-transform-destructuring@^7.18.13":
|
||||
version "7.18.13"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz#9e03bc4a94475d62b7f4114938e6c5c33372cbf5"
|
||||
integrity sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==
|
||||
"@babel/plugin-transform-destructuring@^7.14.7", "@babel/plugin-transform-destructuring@^7.19.4":
|
||||
version "7.19.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz#46890722687b9b89e1369ad0bd8dc6c5a3b4319d"
|
||||
integrity sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.18.9"
|
||||
"@babel/helper-plugin-utils" "^7.19.0"
|
||||
|
||||
"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4":
|
||||
version "7.18.6"
|
||||
|
@ -924,12 +924,12 @@
|
|||
"@babel/helper-create-regexp-features-plugin" "^7.18.6"
|
||||
"@babel/helper-plugin-utils" "^7.18.6"
|
||||
|
||||
"@babel/preset-env@^7.15.0", "@babel/preset-env@^7.19.3":
|
||||
version "7.19.3"
|
||||
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.19.3.tgz#52cd19abaecb3f176a4ff9cc5e15b7bf06bec754"
|
||||
integrity sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w==
|
||||
"@babel/preset-env@^7.15.0", "@babel/preset-env@^7.19.4":
|
||||
version "7.19.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.19.4.tgz#4c91ce2e1f994f717efb4237891c3ad2d808c94b"
|
||||
integrity sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==
|
||||
dependencies:
|
||||
"@babel/compat-data" "^7.19.3"
|
||||
"@babel/compat-data" "^7.19.4"
|
||||
"@babel/helper-compilation-targets" "^7.19.3"
|
||||
"@babel/helper-plugin-utils" "^7.19.0"
|
||||
"@babel/helper-validator-option" "^7.18.6"
|
||||
|
@ -944,7 +944,7 @@
|
|||
"@babel/plugin-proposal-logical-assignment-operators" "^7.18.9"
|
||||
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6"
|
||||
"@babel/plugin-proposal-numeric-separator" "^7.18.6"
|
||||
"@babel/plugin-proposal-object-rest-spread" "^7.18.9"
|
||||
"@babel/plugin-proposal-object-rest-spread" "^7.19.4"
|
||||
"@babel/plugin-proposal-optional-catch-binding" "^7.18.6"
|
||||
"@babel/plugin-proposal-optional-chaining" "^7.18.9"
|
||||
"@babel/plugin-proposal-private-methods" "^7.18.6"
|
||||
|
@ -968,10 +968,10 @@
|
|||
"@babel/plugin-transform-arrow-functions" "^7.18.6"
|
||||
"@babel/plugin-transform-async-to-generator" "^7.18.6"
|
||||
"@babel/plugin-transform-block-scoped-functions" "^7.18.6"
|
||||
"@babel/plugin-transform-block-scoping" "^7.18.9"
|
||||
"@babel/plugin-transform-block-scoping" "^7.19.4"
|
||||
"@babel/plugin-transform-classes" "^7.19.0"
|
||||
"@babel/plugin-transform-computed-properties" "^7.18.9"
|
||||
"@babel/plugin-transform-destructuring" "^7.18.13"
|
||||
"@babel/plugin-transform-destructuring" "^7.19.4"
|
||||
"@babel/plugin-transform-dotall-regex" "^7.18.6"
|
||||
"@babel/plugin-transform-duplicate-keys" "^7.18.9"
|
||||
"@babel/plugin-transform-exponentiation-operator" "^7.18.6"
|
||||
|
@ -998,7 +998,7 @@
|
|||
"@babel/plugin-transform-unicode-escapes" "^7.18.10"
|
||||
"@babel/plugin-transform-unicode-regex" "^7.18.6"
|
||||
"@babel/preset-modules" "^0.1.5"
|
||||
"@babel/types" "^7.19.3"
|
||||
"@babel/types" "^7.19.4"
|
||||
babel-plugin-polyfill-corejs2 "^0.3.3"
|
||||
babel-plugin-polyfill-corejs3 "^0.6.0"
|
||||
babel-plugin-polyfill-regenerator "^0.4.1"
|
||||
|
@ -1064,12 +1064,12 @@
|
|||
debug "^4.1.0"
|
||||
globals "^11.1.0"
|
||||
|
||||
"@babel/types@^7.16.7", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.4.4":
|
||||
version "7.19.3"
|
||||
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.3.tgz#fc420e6bbe54880bce6779ffaf315f5e43ec9624"
|
||||
integrity sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==
|
||||
"@babel/types@^7.16.7", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.19.4", "@babel/types@^7.4.4":
|
||||
version "7.19.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.4.tgz#0dd5c91c573a202d600490a35b33246fed8a41c7"
|
||||
integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==
|
||||
dependencies:
|
||||
"@babel/helper-string-parser" "^7.18.10"
|
||||
"@babel/helper-string-parser" "^7.19.4"
|
||||
"@babel/helper-validator-identifier" "^7.19.1"
|
||||
to-fast-properties "^2.0.0"
|
||||
|
||||
|
@ -6577,10 +6577,10 @@ regenerate@^1.4.2:
|
|||
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
|
||||
integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
|
||||
|
||||
regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7, regenerator-runtime@^0.13.9:
|
||||
version "0.13.9"
|
||||
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
|
||||
integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
|
||||
regenerator-runtime@^0.13.10, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9:
|
||||
version "0.13.10"
|
||||
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee"
|
||||
integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==
|
||||
|
||||
regenerator-transform@^0.15.0:
|
||||
version "0.15.0"
|
||||
|
|
Loading…
Reference in New Issue