Compare commits

...

17 Commits

Author SHA1 Message Date
Giacomo Leidi 584186e831
Update system dependencies. 2024-03-20 00:41:57 +01:00
Giacomo Leidi 9763ca5fbf
Update system dependencies. 2024-03-14 12:39:16 +01:00
Giacomo Leidi 904aa06629
Fix docker image. 2024-03-02 00:12:05 +01:00
Giacomo Leidi be715d201c
Update dependencies. 2024-03-01 23:38:11 +01:00
Giacomo Leidi 647925acd3
Update dependencies 2024-02-28 23:45:20 +01:00
Giacomo Leidi e5100d499e
Update channels-lock.scm 2024-02-18 14:00:38 +01:00
Giacomo Leidi 9ac1d55d02
Update channels-lock.scm 2024-02-01 20:28:14 +01:00
Giacomo Leidi bf1c18f347
update guix config 2024-01-28 21:50:00 +01:00
Giacomo Leidi e381c1b522
Migrate to importlib and update some dependencies (#189)
* Migrate to importlib.

* Update CI
2024-01-28 21:08:17 +01:00
Giacomo Leidi 77a881980b
Update README.md. 2024-01-07 22:44:11 +01:00
Giacomo Leidi 5710d46874
Update README.md. 2024-01-07 22:42:51 +01:00
Giacomo Leidi 9794b00cc0
add badges 2024-01-07 22:37:58 +01:00
Giacomo Leidi 5ebaa04f3d
Revert "Update .envrc"
This reverts commit 1e43a4e12d.
2023-10-30 20:58:53 +01:00
Giacomo Leidi 0f19cf4a9e
Revert "temporary lock"
This reverts commit 8d3026523a.
2023-10-30 20:57:07 +01:00
Giacomo Leidi 8d3026523a
temporary lock 2023-10-10 19:55:39 +02:00
Giacomo Leidi 1e43a4e12d
Update .envrc 2023-10-10 18:04:05 +02:00
Giacomo Leidi 45e1f551d8
Update release.yml 2023-07-17 17:48:32 +02:00
21 changed files with 302 additions and 270 deletions

View File

@ -5,10 +5,34 @@ name: CI
# Controls when the workflow will run
on:
pull_request:
paths-ignore:
- 'guix.scm'
- 'manifest.scm'
- 'channels-lock.scm'
- '.envrc'
- '.gitignore'
- 'pre-commit-*.yaml'
- Dockerfile
- README.*
- LICENSE
- 'sample_settings/**'
- 'etc/**'
push:
# Sequence of patterns matched against refs/tags
branches: ["master"]
paths-ignore:
- 'guix.scm'
- 'manifest.scm'
- 'channels-lock.scm'
- '.envrc'
- '.gitignore'
- 'pre-commit-*.yaml'
- Dockerfile
- README.*
- LICENSE
- 'sample_settings/**'
- 'etc/**'
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
@ -16,20 +40,32 @@ on:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
run-tests-dev:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11"]
poetry-version: ["1.1.12", "1.7.0"]
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
# Runs a single command using the runners shell
- name: Set up Python 3.10
uses: actions/setup-python@v2
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: "3.10"
python-version: ${{ matrix.python-version }}
- name: Run image
uses: abatilo/actions-poetry@v2
with:
poetry-version: ${{ matrix.poetry-version }}
- name: Setup a local virtual environment
run: |
poetry config virtualenvs.create true --local
poetry config virtualenvs.in-project true --local
- uses: actions/cache@v3
name: Define a cache for the virtual environment based on the dependencies lock file
with:
path: ./.venv
key: venv-${{ hashFiles('poetry.lock') }}
- name: Install dependencies
run: scripts/install_github_actions_dev_dependencies.sh
- name: Run tests in dev env
run: scripts/run_pipeline_tests.sh
run: scripts/run_pipeline_tests.sh

View File

@ -27,7 +27,7 @@ jobs:
# Runs a single command using the runners shell
- name: Install GNU Guix
uses: PromyLOPh/guix-install-action@v1
uses: PromyLOPh/guix-install-action@v1.4
# Runs a set of commands using the runners shell
- name: Build image

1
.img/license.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="118.9" height="20"><linearGradient id="smooth" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="round"><rect width="118.9" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#round)"><rect width="56.2" height="20" fill="#555"/><rect x="56.2" width="62.7" height="20" fill="#007ec6"/><rect width="118.9" height="20" fill="url(#smooth)"/></g><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110"><text x="291.0" y="150" fill="#010101" fill-opacity=".3" transform="scale(0.1)" textLength="462.0" lengthAdjust="spacing">LICENSE</text><text x="291.0" y="140" transform="scale(0.1)" textLength="462.0" lengthAdjust="spacing">LICENSE</text><text x="865.5000000000001" y="150" fill="#010101" fill-opacity=".3" transform="scale(0.1)" textLength="527.0" lengthAdjust="spacing">Coopyleft</text><text x="865.5000000000001" y="140" transform="scale(0.1)" textLength="527.0" lengthAdjust="spacing">Coopyleft</text><a xlink:href="https://github.com/Tech-Workers-Coalition-Italia/mobilizon-reshare/blob/master/LICENSE"><rect width="56.2" height="20" fill="rgba(0,0,0,0)"/></a><a xlink:href="https://github.com/Tech-Workers-Coalition-Italia/mobilizon-reshare/blob/master/LICENSE"><rect x="56.2" width="62.7" height="20" fill="rgba(0,0,0,0)"/></a></g></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

1
.img/pypi.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="71.6" height="20"><linearGradient id="smooth" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="round"><rect width="71.6" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#round)"><rect width="33.6" height="20" fill="#555"/><rect x="33.6" width="38.0" height="20" fill="#007ec6"/><rect width="71.6" height="20" fill="url(#smooth)"/></g><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110"><text x="178.0" y="150" fill="#010101" fill-opacity=".3" transform="scale(0.1)" textLength="236.0" lengthAdjust="spacing">pypi</text><text x="178.0" y="140" transform="scale(0.1)" textLength="236.0" lengthAdjust="spacing">pypi</text><text x="516.0" y="150" fill="#010101" fill-opacity=".3" transform="scale(0.1)" textLength="280.0" lengthAdjust="spacing">0.3.6</text><text x="516.0" y="140" transform="scale(0.1)" textLength="280.0" lengthAdjust="spacing">0.3.6</text><a xlink:href="https://pypi.org/project/mobilizon-reshare/"><rect width="33.6" height="20" fill="rgba(0,0,0,0)"/></a><a xlink:href="https://pypi.org/project/mobilizon-reshare/"><rect x="33.6" width="38.0" height="20" fill="rgba(0,0,0,0)"/></a></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

1
.img/python.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="131.5" height="20"><linearGradient id="smooth" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="round"><rect width="131.5" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#round)"><rect width="65.5" height="20" fill="#555"/><rect x="65.5" width="66.0" height="20" fill="#007ec6"/><rect width="131.5" height="20" fill="url(#smooth)"/></g><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110"><image x="5" y="3" width="14" height="14" xlink:href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0icHlZZWxsb3ciIGdyYWRpZW50VHJhbnNmb3JtPSJyb3RhdGUoNDUpIj4KICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlNSIgb2Zmc2V0PSIwLjYiLz4KICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RhMSIgb2Zmc2V0PSIxIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJweUJsdWUiIGdyYWRpZW50VHJhbnNmb3JtPSJyb3RhdGUoNDUpIj4KICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY5ZiIgb2Zmc2V0PSIwLjQiLz4KICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQ2OCIgb2Zmc2V0PSIxIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KCiAgPHBhdGggZD0iTTI3LDE2YzAtNyw5LTEzLDI0LTEzYzE1LDAsMjMsNiwyMywxM2wwLDIyYzAsNy01LDEyLTExLDEybC0yNCwwYy04LDAtMTQsNi0xNCwxNWwwLDEwbC05LDBjLTgsMC0xMy05LTEzLTI0YzAtMTQsNS0yMywxMy0yM2wzNSwwbDAtM2wtMjQsMGwwLTlsMCwweiBNODgsNTB2MSIgZmlsbD0idXJsKCNweUJsdWUpIi8+CiAgPHBhdGggZD0iTTc0LDg3YzAsNy04LDEzLTIzLDEzYy0xNSwwLTI0LTYtMjQtMTNsMC0yMmMwLTcsNi0xMiwxMi0xMmwyNCwwYzgsMCwxNC03LDE0LTE1bDAtMTBsOSwwYzcsMCwxMyw5LDEzLDIzYzAsMTUtNiwyNC0xMywyNGwtMzUsMGwwLDNsMjMsMGwwLDlsMCwweiBNMTQwLDUwdjEiIGZpbGw9InVybCgjcHlZZWxsb3cpIi8+CgogIDxjaXJjbGUgcj0iNCIgY3g9IjY0IiBjeT0iODgiIGZpbGw9IiNGRkYiLz4KICA8Y2lyY2xlIHI9IjQiIGN4PSIzNyIgY3k9IjE1IiBmaWxsPSIjRkZGIi8+Cjwvc3ZnPgo="/><text x="422.5" y="150" fill="#010101" fill-opacity=".3" transform="scale(0.1)" textLength="385.0" lengthAdjust="spacing">python</text><text x="422.5" y="140" transform="scale(0.1)" textLength="385.0" lengthAdjust="spacing">python</text><text x="975.0" y="150" fill="#010101" fill-opacity=".3" transform="scale(0.1)" textLength="560.0" lengthAdjust="spacing">3.10, 3.11</text><text x="975.0" y="140" transform="scale(0.1)" textLength="560.0" lengthAdjust="spacing">3.10, 3.11</text><a xlink:href="https://www.python.org/"><rect width="65.5" height="20" fill="rgba(0,0,0,0)"/></a><a xlink:href="https://www.python.org/"><rect x="65.5" width="66.0" height="20" fill="rgba(0,0,0,0)"/></a></g></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -3,7 +3,7 @@ repos:
rev: stable
hooks:
- id: black
language_version: python3.9
language_version: python3.10
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v1.2.3
hooks:

View File

@ -1,4 +1,7 @@
[![CI](https://github.com/Tech-Workers-Coalition-Italia/mobilizon-reshare/actions/workflows/main.yml/badge.svg?branch=master)](https://github.com/Tech-Workers-Coalition-Italia/mobilizon-reshare/actions/workflows/main.yml)
[![Python versions](https://raw.githubusercontent.com/Tech-Workers-Coalition-Italia/mobilizon-reshare/master/.img/python.svg)](https://python.org)
[![PyPI version](https://raw.githubusercontent.com/Tech-Workers-Coalition-Italia/mobilizon-reshare/master/.img/pypi.svg)](https://pypi.org/project/mobilizon-reshare/)
[![License](https://raw.githubusercontent.com/Tech-Workers-Coalition-Italia/mobilizon-reshare/master/.img/license.svg)](https://github.com/Tech-Workers-Coalition-Italia/mobilizon-reshare/blob/master/LICENSE)
The goal of `mobilizon_reshare` is to provide a suite to reshare Mobilizon events on a broad selection of platforms. This
tool enables an organization to automate their social media strategy in regards

View File

@ -10,7 +10,7 @@
(name 'guix)
(url "https://git.savannah.gnu.org/git/guix.git")
(commit
"79a3cd34c0318928186a04b6481c4d22c0051d04")
"b7eb1a8116b2caee7acf26fb963ae998fbdb4253")
(introduction
(make-channel-introduction
"afb9f2752315f131e4ddd44eba02eed403365085"

View File

@ -4,11 +4,9 @@
#:use-module (guix gexp)
#:use-module (guix packages)
#:use-module (guix utils)
#:use-module (gnu packages databases) ;; for python-tortoise-orm
#:use-module (gnu packages markup) ;; for python-markdownify
#:use-module (gnu packages python)
#:use-module (gnu packages python-web) ;; for python-uvicorn
#:use-module (gnu packages python-xyz) ;; for dynaconf
#:use-module (gnu packages markup) ;; for python-markdownify
#:use-module (gnu packages python-web) ;; for python-fastapi-pagination-minimal and uvicorn
#:use-module (gnu packages python-xyz) ;; for python-apscheduler
#:use-module (mobilizon-reshare package)
#:use-module (mobilizon-reshare dependencies)
#:use-module (ice-9 rdelim)
@ -29,10 +27,24 @@
(revision "0")
(commit (read-line
(open-input-pipe "git show HEAD | head -1 | cut -d ' ' -f 2"))))
(package (inherit mobilizon-reshare)
(name "mobilizon-reshare.git")
(version (git-version source-version revision commit))
(source mobilizon-reshare-git-origin))))
((package-input-rewriting/spec `(("python-fastapi" . ,(const python-fastapi))
("python-dotenv" . ,(const python-dotenv-0.13.0))
("python-uvicorn" . ,(const python-uvicorn))))
(package (inherit mobilizon-reshare)
(name "mobilizon-reshare.git")
(version (git-version source-version revision commit))
(source mobilizon-reshare-git-origin)
(propagated-inputs
(modify-inputs (package-propagated-inputs mobilizon-reshare)
(replace "python-uvicorn" python-uvicorn)
(replace "python-fastapi" python-fastapi)
(replace "python-fastapi-pagination-minimal"
(package
(inherit python-fastapi-pagination-minimal)
(propagated-inputs
(modify-inputs (package-propagated-inputs python-fastapi-pagination-minimal)
(replace "python-fastapi" python-fastapi)))))
(replace "python-markdownify" python-markdownify)))))))
(define-public mobilizon-reshare-scheduler
(package (inherit mobilizon-reshare.git)

View File

@ -12,6 +12,6 @@
(map cadr (package-direct-inputs mobilizon-reshare))
(map specification->package+output
'("git-cal" "man-db" "texinfo"
"python-pre-commit" "cloc"
"pre-commit" "cloc"
"ripgrep" "python-semver"
"fd" "docker-compose" "poetry"))))

View File

@ -1,10 +1,9 @@
import importlib.resources
import importlib
import logging
from logging.config import dictConfig
from pathlib import Path
from typing import Optional
import pkg_resources
from appdirs import AppDirs
from dynaconf import Dynaconf, Validator
@ -48,17 +47,18 @@ def init_logging(settings: Optional[Dynaconf] = None):
def get_settings_files_paths() -> Optional[str]:
dirs = AppDirs(appname="mobilizon-reshare", version=current_version())
bundled_settings_path = pkg_resources.resource_filename(
"mobilizon_reshare", "settings.toml"
)
for config_path in [
Path(dirs.user_config_dir, "mobilizon_reshare.toml").absolute(),
Path(dirs.site_config_dir, "mobilizon_reshare.toml").absolute(),
bundled_settings_path,
]:
if config_path and Path(config_path).exists():
logger.debug(f"Loading configuration from {config_path}")
return config_path
bundled_settings_ref = importlib.resources.files(
"mobilizon_reshare"
) / "settings.toml"
with importlib.resources.as_file(bundled_settings_ref) as bundled_settings_path:
for config_path in [
Path(dirs.user_config_dir, "mobilizon_reshare.toml").absolute(),
Path(dirs.site_config_dir, "mobilizon_reshare.toml").absolute(),
bundled_settings_path.absolute(),
]:
if config_path and Path(config_path).exists():
logger.debug(f"Loading configuration from {config_path}")
return config_path
def build_settings(validators: Optional[list[Validator]] = None) -> Dynaconf:

View File

@ -1,3 +1,4 @@
import importlib
import inspect
import logging
from abc import ABC, abstractmethod
@ -124,6 +125,33 @@ class AbstractEventFormatter(LoggerMixin, ConfLoaderMixin):
"""
raise NotImplementedError # pragma: no cover
def _get_name(self) -> str:
return self._conf[1]
def _get_template(self, configured_template, default_generator) -> Template:
if configured_template:
return JINJA_ENV.get_template(configured_template)
else:
template_ref = default_generator()
with importlib.resources.as_file(template_ref) as template_path:
return JINJA_ENV.get_template(template_path.as_posix())
def get_default_template_path(self, type=""):
return importlib.resources.files(
"mobilizon_reshare.publishers.templates"
) / f"{self._get_name()}{type}.tmpl.j2"
def get_default_recap_template_path(self):
return self.get_default_template_path(type="_recap")
def get_default_recap_header_template_path(self):
return self.get_default_template_path(type="_recap_header")
def validate_event(self, event: _MobilizonEvent) -> None:
self._validate_event(event)
self._validate_message(self.get_message_from_event(event))
@ -148,21 +176,20 @@ class AbstractEventFormatter(LoggerMixin, ConfLoaderMixin):
"""
Retrieves publisher's message template.
"""
template_path = self.conf.msg_template_path or self.default_template_path
return JINJA_ENV.get_template(template_path)
return self._get_template(self.conf.msg_template_path, self.get_default_template_path)
def get_recap_header(self):
template_path = (
self.conf.recap_header_template_path
or self.default_recap_header_template_path
def get_recap_header(self) -> Template:
return self._get_template(
self.conf.recap_header_template_path,
self.get_default_recap_header_template_path
)
return JINJA_ENV.get_template(template_path).render()
def get_recap_fragment_template(self) -> Template:
template_path = (
self.conf.recap_template_path or self.default_recap_template_path
return self._get_template(
self.conf.recap_template_path,
self.get_default_recap_template_path
)
return JINJA_ENV.get_template(template_path)
def get_recap_fragment(self, event: _MobilizonEvent) -> str:
"""

View File

@ -1,7 +1,6 @@
from typing import Optional
import facebook
import pkg_resources
from facebook import GraphAPIError
from mobilizon_reshare.dataclasses import MobilizonEvent
@ -19,19 +18,7 @@ from mobilizon_reshare.publishers.exceptions import (
class FacebookFormatter(AbstractEventFormatter):
_conf = ("publisher", "facebook")
default_template_path = pkg_resources.resource_filename(
"mobilizon_reshare.publishers.templates", "facebook.tmpl.j2"
)
default_recap_template_path = pkg_resources.resource_filename(
"mobilizon_reshare.publishers.templates", "facebook_recap.tmpl.j2"
)
default_recap_header_template_path = pkg_resources.resource_filename(
"mobilizon_reshare.publishers.templates", "facebook_recap_header.tmpl.j2"
)
def _validate_event(self, event: MobilizonEvent) -> None:
text = event.description

View File

@ -1,7 +1,6 @@
from typing import Optional
from urllib.parse import urljoin
import pkg_resources
import requests
from requests import Response
@ -20,19 +19,7 @@ from mobilizon_reshare.publishers.exceptions import (
class MastodonFormatter(AbstractEventFormatter):
_conf = ("publisher", "mastodon")
default_template_path = pkg_resources.resource_filename(
"mobilizon_reshare.publishers.templates", "mastodon.tmpl.j2"
)
default_recap_template_path = pkg_resources.resource_filename(
"mobilizon_reshare.publishers.templates", "mastodon_recap.tmpl.j2"
)
default_recap_header_template_path = pkg_resources.resource_filename(
"mobilizon_reshare.publishers.templates", "mastodon_recap_header.tmpl.j2"
)
def _validate_event(self, event: MobilizonEvent) -> None:
text = event.description

View File

@ -1,7 +1,6 @@
import re
from typing import Optional
import pkg_resources
import requests
from bs4 import BeautifulSoup
from requests import Response
@ -20,18 +19,6 @@ from mobilizon_reshare.publishers.exceptions import (
class TelegramFormatter(AbstractEventFormatter):
default_template_path = pkg_resources.resource_filename(
"mobilizon_reshare.publishers.templates", "telegram.tmpl.j2"
)
default_recap_template_path = pkg_resources.resource_filename(
"mobilizon_reshare.publishers.templates", "telegram_recap.tmpl.j2"
)
default_recap_header_template_path = pkg_resources.resource_filename(
"mobilizon_reshare.publishers.templates", "telegram_recap_header.tmpl.j2"
)
_conf = ("publisher", "telegram")
def _validate_event(self, event: MobilizonEvent) -> None:

View File

@ -1,6 +1,5 @@
from typing import Optional
import pkg_resources
from tweepy import OAuthHandler, API, TweepyException
from tweepy.models import Status
@ -17,19 +16,7 @@ from mobilizon_reshare.publishers.exceptions import (
class TwitterFormatter(AbstractEventFormatter):
_conf = ("publisher", "twitter")
default_template_path = pkg_resources.resource_filename(
"mobilizon_reshare.publishers.templates", "twitter.tmpl.j2"
)
default_recap_template_path = pkg_resources.resource_filename(
"mobilizon_reshare.publishers.templates", "twitter_recap.tmpl.j2"
)
default_recap_header_template_path = pkg_resources.resource_filename(
"mobilizon_reshare.publishers.templates", "twitter_recap_header.tmpl.j2"
)
def _validate_event(self, event: MobilizonEvent) -> None:
pass # pragma: no cover

View File

@ -1,7 +1,6 @@
from typing import Optional
from urllib.parse import urljoin
import pkg_resources
import requests
from requests import Response
from requests.auth import HTTPBasicAuth
@ -23,19 +22,7 @@ from mobilizon_reshare.publishers.exceptions import (
class ZulipFormatter(AbstractEventFormatter):
_conf = ("publisher", "zulip")
default_template_path = pkg_resources.resource_filename(
"mobilizon_reshare.publishers.templates", "zulip.tmpl.j2"
)
default_recap_template_path = pkg_resources.resource_filename(
"mobilizon_reshare.publishers.templates", "zulip_recap.tmpl.j2"
)
default_recap_header_template_path = pkg_resources.resource_filename(
"mobilizon_reshare.publishers.templates", "zulip_recap_header.tmpl.j2"
)
def _validate_event(self, event: MobilizonEvent) -> None:
text = event.description

View File

@ -1,7 +1,7 @@
import logging
from pathlib import Path
import pkg_resources
import importlib
import urllib3.util
from aerich import Command
from tortoise import Tortoise
@ -47,9 +47,9 @@ TORTOISE_ORM = get_tortoise_orm()
class MoReDB:
def get_migration_location(self):
scheme = get_db_url().scheme
return pkg_resources.resource_filename(
"mobilizon_reshare", f"migrations/{scheme}"
)
scheme_ref = importlib.resources.files("mobilizon_reshare") / "migrations" / f"{scheme}"
with importlib.resources.as_file(scheme_ref) as scheme_path:
return scheme_path
async def _implement_db_changes(self):
logging.info("Performing aerich migrations.")

279
poetry.lock generated
View File

@ -30,28 +30,30 @@ typing_extensions = ">=3.7.2"
[[package]]
name = "alabaster"
version = "0.7.13"
description = "A configurable sidebar-enabled Sphinx theme"
version = "0.7.16"
description = "A light, configurable Sphinx theme"
category = "dev"
optional = false
python-versions = ">=3.6"
python-versions = ">=3.9"
[[package]]
name = "anyio"
version = "3.6.2"
version = "4.3.0"
description = "High level compatibility layer for multiple asynchronous event loop implementations"
category = "main"
optional = false
python-versions = ">=3.6.2"
python-versions = ">=3.8"
[package.dependencies]
exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""}
idna = ">=2.8"
sniffio = ">=1.1"
typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""}
[package.extras]
doc = ["packaging", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"]
test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"]
trio = ["trio (>=0.16,<0.22)"]
doc = ["packaging", "Sphinx (>=7)", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"]
test = ["anyio", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"]
trio = ["trio (>=0.23)"]
[[package]]
name = "appdirs"
@ -73,28 +75,27 @@ python-versions = ">=3.6"
python-dateutil = ">=2.7.0"
[[package]]
name = "asgiref"
version = "3.6.0"
description = "ASGI specs, helper code, and adapters"
name = "async-timeout"
version = "4.0.3"
description = "Timeout context manager for asyncio programs"
category = "main"
optional = false
python-versions = ">=3.7"
[package.extras]
tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"]
[[package]]
name = "asyncpg"
version = "0.27.0"
version = "0.29.0"
description = "An asyncio PostgreSQL driver"
category = "main"
optional = false
python-versions = ">=3.7.0"
python-versions = ">=3.8.0"
[package.dependencies]
async-timeout = {version = ">=4.0.3", markers = "python_version < \"3.12.0\""}
[package.extras]
dev = ["Cython (>=0.29.24,<0.30.0)", "pytest (>=6.0)", "Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "flake8 (>=5.0.4,<5.1.0)", "uvloop (>=0.15.3)"]
docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"]
test = ["flake8 (>=5.0.4,<5.1.0)", "uvloop (>=0.15.3)"]
docs = ["Sphinx (>=5.3.0,<5.4.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=1.2.2)"]
test = ["flake8 (>=6.1,<7.0)", "uvloop (>=0.15.3)"]
[[package]]
name = "asynctest"
@ -114,7 +115,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[[package]]
name = "attrs"
version = "23.1.0"
version = "23.2.0"
description = "Classes Without Boilerplate"
category = "dev"
optional = false
@ -125,16 +126,20 @@ cov = ["attrs", "coverage[toml] (>=5.3)"]
dev = ["attrs", "pre-commit"]
docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"]
tests = ["attrs", "zope-interface"]
tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest-mypy-plugins", "pytest-xdist", "pytest (>=4.3.0)"]
tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"]
tests-no-zope = ["attrs", "cloudpickle", "hypothesis", "pympler", "pytest-xdist", "pytest (>=4.3.0)"]
[[package]]
name = "babel"
version = "2.12.1"
version = "2.14.0"
description = "Internationalization utilities"
category = "dev"
optional = false
python-versions = ">=3.7"
[package.extras]
dev = ["pytest (>=6.0)", "pytest-cov", "freezegun (>=1.0,<2.0)"]
[[package]]
name = "beautifulsoup4"
version = "4.11.2"
@ -152,7 +157,7 @@ lxml = ["lxml"]
[[package]]
name = "certifi"
version = "2023.5.7"
version = "2024.2.2"
description = "Python package for providing Mozilla's CA Bundle."
category = "main"
optional = false
@ -160,7 +165,7 @@ python-versions = ">=3.6"
[[package]]
name = "charset-normalizer"
version = "3.1.0"
version = "3.3.2"
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
category = "main"
optional = false
@ -168,7 +173,7 @@ python-versions = ">=3.7.0"
[[package]]
name = "click"
version = "8.1.3"
version = "8.1.7"
description = "Composable command line interface toolkit"
category = "main"
optional = false
@ -187,11 +192,11 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7
[[package]]
name = "coverage"
version = "7.2.5"
version = "7.4.3"
description = "Code coverage measurement for Python"
category = "dev"
optional = false
python-versions = ">=3.7"
python-versions = ">=3.8"
[package.dependencies]
tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""}
@ -247,6 +252,17 @@ toml = ["toml"]
vault = ["hvac"]
yaml = ["ruamel.yaml"]
[[package]]
name = "exceptiongroup"
version = "1.2.0"
description = "Backport of PEP 654 (exception groups)"
category = "main"
optional = false
python-versions = ">=3.7"
[package.extras]
test = ["pytest (>=6)"]
[[package]]
name = "facebook-sdk"
version = "3.1.0"
@ -260,7 +276,7 @@ requests = "*"
[[package]]
name = "fastapi"
version = "0.85.2"
version = "0.92.0"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
category = "main"
optional = false
@ -268,17 +284,17 @@ python-versions = ">=3.7"
[package.dependencies]
pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0"
starlette = "0.20.4"
starlette = ">=0.25.0,<0.26.0"
[package.extras]
all = ["email-validator (>=1.1.1,<2.0.0)", "itsdangerous (>=1.1.0,<3.0.0)", "jinja2 (>=2.11.2,<4.0.0)", "orjson (>=3.2.1,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "requests (>=2.24.0,<3.0.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)", "uvicorn[standard] (>=0.12.0,<0.19.0)"]
dev = ["autoflake (>=1.4.0,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "pre-commit (>=2.17.0,<3.0.0)", "uvicorn[standard] (>=0.12.0,<0.19.0)"]
doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer[all] (>=0.6.1,<0.7.0)"]
test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest-cov (>=2.12.0,<5.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "requests (>=2.24.0,<3.0.0)", "sqlalchemy (>=1.3.18,<=1.4.41)", "types-orjson (==3.6.2)", "types-ujson (==5.5.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"]
all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.21.0)"]
doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer[all] (>=0.6.1,<0.8.0)"]
test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.10.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.6.0.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"]
[[package]]
name = "fastapi-pagination"
version = "0.11.4"
version = "0.12.3"
description = "FastAPI pagination"
category = "main"
optional = false
@ -289,20 +305,21 @@ fastapi = ">=0.80.0"
pydantic = ">=1.9.1"
[package.extras]
sqlalchemy = ["SQLAlchemy (>=1.3.20)", "sqlakeyset (>=1.0.1659142803,<2.0.0)"]
sqlalchemy = ["SQLAlchemy (>=1.3.20)", "sqlakeyset (>=2.0.1680321678,<3.0.0)"]
asyncpg = ["SQLAlchemy (>=1.3.20)", "asyncpg (>=0.24.0)"]
all = ["SQLAlchemy (>=1.3.20)", "databases (>=0.6.0)", "orm (>=0.3.1)", "tortoise-orm (>=0.16.18,<0.20.0)", "asyncpg (>=0.24.0)", "ormar (>=0.11.2)", "django (<5.0.0)", "piccolo (>=0.89,<0.106)", "motor (>=2.5.1,<4.0.0)", "mongoengine (>=0.23.1,<0.27.0)", "sqlmodel (>=0.0.8,<0.0.9)", "pony (>=0.7.16,<0.8.0)", "beanie (>=1.11.9,<2.0.0)", "sqlakeyset (>=1.0.1659142803,<2.0.0)", "scylla-driver (>=3.25.6,<4.0.0)"]
all = ["SQLAlchemy (>=1.3.20)", "databases (>=0.6.0)", "orm (>=0.3.1)", "tortoise-orm (>=0.16.18,<0.20.0)", "asyncpg (>=0.24.0)", "ormar (>=0.11.2)", "django (<5.0.0)", "piccolo (>=0.89,<0.112)", "motor (>=2.5.1,<4.0.0)", "mongoengine (>=0.23.1,<0.28.0)", "sqlmodel (>=0.0.8,<0.0.9)", "pony (>=0.7.16,<0.8.0)", "beanie (>=1.11.9,<2.0.0)", "sqlakeyset (>=2.0.1680321678,<3.0.0)", "scylla-driver (>=3.25.6,<4.0.0)", "bunnet (>=1.1.0,<2.0.0)"]
databases = ["databases (>=0.6.0)"]
orm = ["databases (>=0.6.0)", "orm (>=0.3.1)"]
django = ["databases (>=0.6.0)", "django (<5.0.0)"]
tortoise = ["tortoise-orm (>=0.16.18,<0.20.0)"]
ormar = ["ormar (>=0.11.2)"]
piccolo = ["piccolo (>=0.89,<0.106)"]
piccolo = ["piccolo (>=0.89,<0.112)"]
motor = ["motor (>=2.5.1,<4.0.0)"]
mongoengine = ["mongoengine (>=0.23.1,<0.27.0)"]
sqlmodel = ["sqlmodel (>=0.0.8,<0.0.9)", "sqlakeyset (>=1.0.1659142803,<2.0.0)"]
mongoengine = ["mongoengine (>=0.23.1,<0.28.0)"]
sqlmodel = ["sqlmodel (>=0.0.8,<0.0.9)", "sqlakeyset (>=2.0.1680321678,<3.0.0)"]
beanie = ["beanie (>=1.11.9,<2.0.0)"]
scylla-driver = ["scylla-driver (>=3.25.6,<4.0.0)"]
bunnet = ["bunnet (>=1.1.0,<2.0.0)"]
[[package]]
name = "h11"
@ -314,7 +331,7 @@ python-versions = ">=3.7"
[[package]]
name = "httpcore"
version = "0.16.3"
version = "0.17.3"
description = "A minimal low-level HTTP client."
category = "dev"
optional = false
@ -332,7 +349,7 @@ socks = ["socksio (>=1.0.0,<2.0.0)"]
[[package]]
name = "httpx"
version = "0.23.3"
version = "0.24.1"
description = "The next generation HTTP client."
category = "dev"
optional = false
@ -340,19 +357,19 @@ python-versions = ">=3.7"
[package.dependencies]
certifi = "*"
httpcore = ">=0.15.0,<0.17.0"
rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]}
httpcore = ">=0.15.0,<0.18.0"
idna = "*"
sniffio = "*"
[package.extras]
brotli = ["brotli", "brotlicffi"]
cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"]
cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"]
http2 = ["h2 (>=3,<5)"]
socks = ["socksio (>=1.0.0,<2.0.0)"]
[[package]]
name = "idna"
version = "3.4"
version = "3.6"
description = "Internationalized Domain Names in Applications (IDNA)"
category = "main"
optional = false
@ -366,22 +383,6 @@ category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[[package]]
name = "importlib-metadata"
version = "6.6.0"
description = "Read metadata from Python packages"
category = "dev"
optional = false
python-versions = ">=3.7"
[package.dependencies]
zipp = ">=0.5"
[package.extras]
docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"]
perf = ["ipython"]
testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8", "importlib-resources (>=1.3)"]
[[package]]
name = "iniconfig"
version = "2.0.0"
@ -400,7 +401,7 @@ python-versions = ">=3.6.2,<4.0"
[[package]]
name = "jinja2"
version = "3.1.2"
version = "3.1.3"
description = "A very fast and expressive template engine."
category = "main"
optional = false
@ -414,21 +415,21 @@ i18n = ["Babel (>=2.7)"]
[[package]]
name = "lxml"
version = "4.9.2"
version = "5.1.0"
description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API."
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*"
python-versions = ">=3.6"
[package.extras]
cssselect = ["cssselect (>=0.7)"]
html5 = ["html5lib"]
htmlsoup = ["beautifulsoup4"]
source = ["Cython (>=0.29.7)"]
source = ["Cython (>=3.0.7)"]
[[package]]
name = "markdownify"
version = "0.10.3"
version = "0.11.6"
description = "Convert HTML to markdown."
category = "main"
optional = false
@ -440,7 +441,7 @@ six = ">=1.15,<2"
[[package]]
name = "markupsafe"
version = "2.1.2"
version = "2.1.5"
description = "Safely add untrusted strings to HTML/XML markup."
category = "main"
optional = false
@ -461,7 +462,7 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"]
[[package]]
name = "packaging"
version = "23.1"
version = "23.2"
description = "Core utilities for Python packages"
category = "dev"
optional = false
@ -469,11 +470,11 @@ python-versions = ">=3.7"
[[package]]
name = "pluggy"
version = "1.0.0"
version = "1.4.0"
description = "plugin and hook calling mechanisms for python"
category = "dev"
optional = false
python-versions = ">=3.6"
python-versions = ">=3.8"
[package.extras]
dev = ["pre-commit", "tox"]
@ -500,7 +501,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[[package]]
name = "pydantic"
version = "1.10.7"
version = "1.10.14"
description = "Data validation and settings management using python type hints"
category = "main"
optional = false
@ -515,7 +516,7 @@ email = ["email-validator (>=1.0.3)"]
[[package]]
name = "pygments"
version = "2.15.1"
version = "2.17.2"
description = "Pygments is a syntax highlighting package written in Python."
category = "dev"
optional = false
@ -523,6 +524,7 @@ python-versions = ">=3.7"
[package.extras]
plugins = ["importlib-metadata"]
windows-terminal = ["colorama (>=0.4.6)"]
[[package]]
name = "pypika-tortoise"
@ -595,7 +597,7 @@ pytest = ">=3.2.5"
[[package]]
name = "python-dateutil"
version = "2.8.2"
version = "2.9.0.post0"
description = "Extensions to the standard Python datetime module"
category = "main"
optional = false
@ -606,7 +608,7 @@ six = ">=1.5"
[[package]]
name = "python-slugify"
version = "8.0.1"
version = "8.0.4"
description = "A Python slugify application that also handles Unicode"
category = "dev"
optional = false
@ -621,7 +623,7 @@ unidecode = ["Unidecode (>=1.1.1)"]
[[package]]
name = "pytz"
version = "2023.3"
version = "2024.1"
description = "World timezone definitions, modern and historical"
category = "main"
optional = false
@ -662,33 +664,20 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"]
[[package]]
name = "responses"
version = "0.13.4"
version = "0.22.0"
description = "A utility library for mocking out the `requests` Python library."
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
python-versions = ">=3.7"
[package.dependencies]
requests = ">=2.0"
six = "*"
requests = ">=2.22.0,<3.0"
toml = "*"
types-toml = "*"
urllib3 = ">=1.25.10"
[package.extras]
tests = ["coverage (>=3.7.1,<6.0.0)", "pytest-cov", "pytest-localserver", "flake8", "types-mock", "types-requests", "types-six", "pytest (>=4.6,<5.0)", "pytest (>=4.6)", "mypy"]
[[package]]
name = "rfc3986"
version = "1.5.0"
description = "Validating URI References per RFC 3986"
category = "dev"
optional = false
python-versions = "*"
[package.dependencies]
idna = {version = "*", optional = true, markers = "extra == \"idna2008\""}
[package.extras]
idna2008 = ["idna"]
tests = ["pytest (>=7.0.0)", "coverage (>=6.0.0)", "pytest-cov", "pytest-asyncio", "pytest-httpserver", "flake8", "types-requests", "mypy"]
[[package]]
name = "six"
@ -700,7 +689,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
[[package]]
name = "sniffio"
version = "1.3.0"
version = "1.3.1"
description = "Sniff out which async library your code is running under"
category = "main"
optional = false
@ -716,11 +705,11 @@ python-versions = "*"
[[package]]
name = "soupsieve"
version = "2.4.1"
version = "2.5"
description = "A modern CSS selector implementation for Beautiful Soup."
category = "main"
optional = false
python-versions = ">=3.7"
python-versions = ">=3.8"
[[package]]
name = "sphinx"
@ -736,7 +725,6 @@ babel = ">=1.3"
colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""}
docutils = ">=0.14,<0.18"
imagesize = "*"
importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""}
Jinja2 = ">=2.3"
packaging = "*"
Pygments = ">=2.0"
@ -771,7 +759,7 @@ type_comments = ["typed-ast (>=1.4.0)"]
[[package]]
name = "sphinx-material"
version = "0.0.35"
version = "0.0.36"
description = "Material sphinx theme"
category = "dev"
optional = false
@ -785,42 +773,45 @@ python-slugify = {version = "*", extras = ["unidecode"]}
sphinx = ">=2.0"
[package.extras]
dev = ["black (==19.10b0)"]
dev = ["black (==22.12.0)"]
[[package]]
name = "sphinxcontrib-applehelp"
version = "1.0.4"
version = "1.0.8"
description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books"
category = "dev"
optional = false
python-versions = ">=3.8"
python-versions = ">=3.9"
[package.extras]
lint = ["flake8", "mypy", "docutils-stubs"]
standalone = ["Sphinx (>=5)"]
test = ["pytest"]
[[package]]
name = "sphinxcontrib-devhelp"
version = "1.0.2"
description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document."
version = "1.0.6"
description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents"
category = "dev"
optional = false
python-versions = ">=3.5"
python-versions = ">=3.9"
[package.extras]
lint = ["flake8", "mypy", "docutils-stubs"]
standalone = ["Sphinx (>=5)"]
test = ["pytest"]
[[package]]
name = "sphinxcontrib-htmlhelp"
version = "2.0.1"
version = "2.0.5"
description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
category = "dev"
optional = false
python-versions = ">=3.8"
python-versions = ">=3.9"
[package.extras]
lint = ["flake8", "mypy", "docutils-stubs"]
standalone = ["Sphinx (>=5)"]
test = ["pytest", "html5lib"]
[[package]]
@ -848,31 +839,33 @@ six = ">=1.5.2"
[[package]]
name = "sphinxcontrib-qthelp"
version = "1.0.3"
description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document."
version = "1.0.7"
description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents"
category = "dev"
optional = false
python-versions = ">=3.5"
python-versions = ">=3.9"
[package.extras]
lint = ["flake8", "mypy", "docutils-stubs"]
standalone = ["Sphinx (>=5)"]
test = ["pytest"]
[[package]]
name = "sphinxcontrib-serializinghtml"
version = "1.1.5"
description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."
version = "1.1.10"
description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)"
category = "dev"
optional = false
python-versions = ">=3.5"
python-versions = ">=3.9"
[package.extras]
lint = ["flake8", "mypy", "docutils-stubs"]
standalone = ["Sphinx (>=5)"]
test = ["pytest"]
[[package]]
name = "starlette"
version = "0.20.4"
version = "0.25.0"
description = "The little ASGI library that shines."
category = "main"
optional = false
@ -880,10 +873,9 @@ python-versions = ">=3.7"
[package.dependencies]
anyio = ">=3.4.0,<5"
typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""}
[package.extras]
full = ["itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"]
full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"]
[[package]]
name = "text-unidecode"
@ -911,7 +903,7 @@ python-versions = ">=3.7"
[[package]]
name = "tomlkit"
version = "0.11.8"
version = "0.12.4"
description = "Style preserving TOML library"
category = "main"
optional = false
@ -938,7 +930,7 @@ asyncmy = ["asyncmy (>=0.2.5,<0.3.0)"]
asyncodbc = ["asyncodbc (>=0.1.1,<0.2.0)"]
asyncpg = ["asyncpg"]
accel = ["ciso8601", "orjson", "uvloop"]
psycopg = ["psycopg[pool,binary] (==3.0.12)"]
psycopg = ["psycopg[binary,pool] (==3.0.12)"]
[[package]]
name = "tweepy"
@ -960,17 +952,25 @@ docs = ["myst-parser (==0.15.2)", "readthedocs-sphinx-search (==0.1.1)", "sphinx
socks = ["requests[socks] (>=2.27.0,<3)"]
test = ["vcrpy (>=1.10.3)"]
[[package]]
name = "types-toml"
version = "0.10.8.7"
description = "Typing stubs for toml"
category = "dev"
optional = false
python-versions = "*"
[[package]]
name = "typing-extensions"
version = "4.5.0"
description = "Backported and Experimental Type Hints for Python 3.7+"
version = "4.10.0"
description = "Backported and Experimental Type Hints for Python 3.8+"
category = "main"
optional = false
python-versions = ">=3.7"
python-versions = ">=3.8"
[[package]]
name = "unidecode"
version = "1.3.6"
version = "1.3.8"
description = "ASCII transliterations of Unicode text"
category = "dev"
optional = false
@ -978,49 +978,37 @@ python-versions = ">=3.5"
[[package]]
name = "urllib3"
version = "1.26.15"
version = "1.26.18"
description = "HTTP library with thread-safe connection pooling, file post, and more."
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
[package.extras]
brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"]
brotli = ["brotlicffi (>=0.8.0)", "brotli (==1.0.9)", "brotlipy (>=0.6.0)", "brotli (>=1.0.9)"]
secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"]
socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
[[package]]
name = "uvicorn"
version = "0.17.6"
version = "0.23.2"
description = "The lightning-fast ASGI server."
category = "main"
optional = false
python-versions = ">=3.7"
python-versions = ">=3.8"
[package.dependencies]
asgiref = ">=3.4.0"
click = ">=7.0"
h11 = ">=0.8"
typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""}
[package.extras]
standard = ["websockets (>=10.0)", "httptools (>=0.4.0)", "watchgod (>=0.6)", "python-dotenv (>=0.13)", "PyYAML (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "colorama (>=0.4)"]
[[package]]
name = "zipp"
version = "3.15.0"
description = "Backport of pathlib-compatible object wrapper for zip files"
category = "dev"
optional = false
python-versions = ">=3.7"
[package.extras]
docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"]
testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "jaraco.functools", "more-itertools", "big-o", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"]
standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"]
[metadata]
lock-version = "1.1"
python-versions = "^3.9"
content-hash = "bfc1512cd6f94fdc013dbebcf70c0077093b2bc3126c8573c35a3569445f948d"
python-versions = "^3.10"
content-hash = "a81b518a3185eb0b2c42e6c927dab3f46dd91eb749cb52a1fbd0a462d51b685c"
[metadata.files]
aerich = []
@ -1029,7 +1017,7 @@ alabaster = []
anyio = []
appdirs = []
arrow = []
asgiref = []
async-timeout = []
asyncpg = []
asynctest = []
atomicwrites = []
@ -1045,6 +1033,7 @@ css-html-js-minify = []
dictdiffer = []
docutils = []
dynaconf = []
exceptiongroup = []
facebook-sdk = []
fastapi = []
fastapi-pagination = []
@ -1053,7 +1042,6 @@ httpcore = []
httpx = []
idna = []
imagesize = []
importlib-metadata = []
iniconfig = []
iso8601 = []
jinja2 = []
@ -1078,7 +1066,6 @@ pytz = []
requests = []
requests-oauthlib = []
responses = []
rfc3986 = []
six = []
sniffio = []
snowballstemmer = []
@ -1100,8 +1087,8 @@ tomli = []
tomlkit = []
tortoise-orm = []
tweepy = []
types-toml = []
typing-extensions = []
unidecode = []
urllib3 = []
uvicorn = []
zipp = []

View File

@ -9,7 +9,7 @@ authors = ["Simone Robutti <simone.robutti@protonmail.com>"]
license = "Coopyleft"
[tool.poetry.dependencies]
python = "^3.9"
python = "^3.10"
dynaconf = "~3.1"
tortoise-orm = {extras = ["asyncpg"], version = "~0.19"}
aiosqlite = "~0.17"
@ -18,17 +18,17 @@ requests = "~2.28"
arrow = "~1.1"
click = "~8.1"
beautifulsoup4 = "~4.11"
markdownify = "~0.10"
markdownify = "~0.11"
appdirs = "~1.4"
tweepy = "~4.13"
facebook-sdk = "~3.1"
aerich = "~0.6"
fastapi = "~0.85"
uvicorn = "~0.17"
fastapi-pagination = "^0.11.0"
fastapi = "~0.92"
uvicorn = "~0.23"
fastapi-pagination = "~0.12"
[tool.poetry.dev-dependencies]
responses = "~0.13"
responses = "~0.22"
pytest-asyncio = "~0.15"
asynctest = "~0.13"
pytest = "~6.2"
@ -38,7 +38,7 @@ Sphinx = "~4.4"
sphinxcontrib-napoleon = "~0.7"
sphinx-material = "~0.0"
sphinx-autodoc-typehints = "~1.17"
httpx = "~0.23"
httpx = "~0.24"

29
scripts/generate_badges.sh Executable file
View File

@ -0,0 +1,29 @@
#!/usr/bin/env bash
set -eu
project_root="$(cd "$(dirname $(dirname "$0"))" && pwd)"
get_version () {
cat "${project_root}/mobilizon_reshare/VERSION"
}
python -m pybadges \
--left-text="python" \
--right-text="3.10, 3.11" \
--whole-link="https://www.python.org/" \
--browser \
--logo='https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/python.svg' \
--embed-logo=yes
python -m pybadges \
--left-text="pypi" \
--right-text="$(get_version)" \
--whole-link="https://pypi.org/project/mobilizon-reshare/" \
--browser
python -m pybadges \
--left-text="LICENSE" \
--right-text="Coopyleft" \
--whole-link="https://github.com/Tech-Workers-Coalition-Italia/mobilizon-reshare/blob/master/LICENSE" \
--browser