aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.buildpacks2
-rw-r--r--.gitignore8
-rw-r--r--Pipfile34
-rw-r--r--Pipfile.lock504
-rw-r--r--Procfile2
-rw-r--r--README.md23
-rw-r--r--app.json79
-rw-r--r--install.sh24
-rw-r--r--newspipe/bootstrap.py (renamed from src/bootstrap.py)0
-rw-r--r--newspipe/conf.py (renamed from src/conf.py)0
-rw-r--r--newspipe/conf/conf.cfg-sample (renamed from src/conf/conf.cfg-sample)0
-rw-r--r--newspipe/crawler/default_crawler.py (renamed from src/crawler/default_crawler.py)0
-rw-r--r--newspipe/lib/__init__.py (renamed from src/lib/__init__.py)0
-rw-r--r--newspipe/lib/article_utils.py (renamed from src/lib/article_utils.py)0
-rw-r--r--newspipe/lib/data.py (renamed from src/lib/data.py)0
-rw-r--r--newspipe/lib/feed_utils.py (renamed from src/lib/feed_utils.py)0
-rwxr-xr-xnewspipe/lib/misc_utils.py (renamed from src/lib/misc_utils.py)0
-rw-r--r--newspipe/lib/utils.py (renamed from src/lib/utils.py)0
-rwxr-xr-xnewspipe/manager.py (renamed from src/manager.py)0
-rw-r--r--newspipe/notifications/emails.py (renamed from src/notifications/emails.py)0
-rw-r--r--newspipe/notifications/notifications.py (renamed from src/notifications/notifications.py)0
-rwxr-xr-xnewspipe/runserver.py (renamed from src/runserver.py)0
-rw-r--r--newspipe/web/__init__.py (renamed from src/web/__init__.py)0
-rw-r--r--newspipe/web/controllers/__init__.py (renamed from src/web/controllers/__init__.py)0
-rw-r--r--newspipe/web/controllers/abstract.py (renamed from src/web/controllers/abstract.py)0
-rw-r--r--newspipe/web/controllers/article.py (renamed from src/web/controllers/article.py)0
-rw-r--r--newspipe/web/controllers/bookmark.py (renamed from src/web/controllers/bookmark.py)0
-rw-r--r--newspipe/web/controllers/category.py (renamed from src/web/controllers/category.py)0
-rw-r--r--newspipe/web/controllers/feed.py (renamed from src/web/controllers/feed.py)0
-rw-r--r--newspipe/web/controllers/icon.py (renamed from src/web/controllers/icon.py)0
-rw-r--r--newspipe/web/controllers/tag.py (renamed from src/web/controllers/tag.py)0
-rw-r--r--newspipe/web/controllers/user.py (renamed from src/web/controllers/user.py)0
-rw-r--r--newspipe/web/decorators.py (renamed from src/web/decorators.py)0
-rw-r--r--newspipe/web/forms.py (renamed from src/web/forms.py)0
-rw-r--r--newspipe/web/js/actions/MenuActions.js (renamed from src/web/js/actions/MenuActions.js)0
-rw-r--r--newspipe/web/js/actions/MiddlePanelActions.js (renamed from src/web/js/actions/MiddlePanelActions.js)0
-rw-r--r--newspipe/web/js/actions/RightPanelActions.js (renamed from src/web/js/actions/RightPanelActions.js)0
-rw-r--r--newspipe/web/js/app.js (renamed from src/web/js/app.js)0
-rw-r--r--newspipe/web/js/components/MainApp.react.js (renamed from src/web/js/components/MainApp.react.js)0
-rw-r--r--newspipe/web/js/components/Menu.react.js (renamed from src/web/js/components/Menu.react.js)0
-rw-r--r--newspipe/web/js/components/MiddlePanel.react.js (renamed from src/web/js/components/MiddlePanel.react.js)0
-rw-r--r--newspipe/web/js/components/Navbar.react.js (renamed from src/web/js/components/Navbar.react.js)0
-rw-r--r--newspipe/web/js/components/RightPanel.react.js (renamed from src/web/js/components/RightPanel.react.js)0
-rw-r--r--newspipe/web/js/components/time.react.js (renamed from src/web/js/components/time.react.js)0
-rw-r--r--newspipe/web/js/constants/JarrConstants.js (renamed from src/web/js/constants/JarrConstants.js)0
-rw-r--r--newspipe/web/js/dispatcher/JarrDispatcher.js (renamed from src/web/js/dispatcher/JarrDispatcher.js)0
-rw-r--r--newspipe/web/js/dispatcher/__tests__/AppDispatcher-test.js (renamed from src/web/js/dispatcher/__tests__/AppDispatcher-test.js)0
-rw-r--r--newspipe/web/js/stores/MenuStore.js (renamed from src/web/js/stores/MenuStore.js)0
-rw-r--r--newspipe/web/js/stores/MiddlePanelStore.js (renamed from src/web/js/stores/MiddlePanelStore.js)0
-rw-r--r--newspipe/web/js/stores/RightPanelStore.js (renamed from src/web/js/stores/RightPanelStore.js)0
-rw-r--r--newspipe/web/js/stores/__tests__/TodoStore-test.js (renamed from src/web/js/stores/__tests__/TodoStore-test.js)0
-rw-r--r--newspipe/web/lib/__init__.py (renamed from src/web/lib/__init__.py)0
-rw-r--r--newspipe/web/lib/user_utils.py (renamed from src/web/lib/user_utils.py)0
-rw-r--r--newspipe/web/lib/view_utils.py (renamed from src/web/lib/view_utils.py)0
-rw-r--r--newspipe/web/models/__init__.py (renamed from src/web/models/__init__.py)0
-rw-r--r--newspipe/web/models/article.py (renamed from src/web/models/article.py)0
-rw-r--r--newspipe/web/models/bookmark.py (renamed from src/web/models/bookmark.py)0
-rw-r--r--newspipe/web/models/category.py (renamed from src/web/models/category.py)0
-rw-r--r--newspipe/web/models/feed.py (renamed from src/web/models/feed.py)0
-rw-r--r--newspipe/web/models/icon.py (renamed from src/web/models/icon.py)0
-rw-r--r--newspipe/web/models/right_mixin.py (renamed from src/web/models/right_mixin.py)0
-rw-r--r--newspipe/web/models/role.py (renamed from src/web/models/role.py)0
-rw-r--r--newspipe/web/models/tag.py (renamed from src/web/models/tag.py)0
-rw-r--r--newspipe/web/models/user.py (renamed from src/web/models/user.py)0
l---------newspipe/web/static/css/bootstrap-theme.min.css (renamed from src/web/static/css/bootstrap-theme.min.css)0
l---------newspipe/web/static/css/bootstrap-theme.min.css.map (renamed from src/web/static/css/bootstrap-theme.min.css.map)0
l---------newspipe/web/static/css/bootstrap.min.css (renamed from src/web/static/css/bootstrap.min.css)0
l---------newspipe/web/static/css/bootstrap.min.css.map (renamed from src/web/static/css/bootstrap.min.css.map)0
-rw-r--r--newspipe/web/static/css/customized-bootstrap.css (renamed from src/web/static/css/customized-bootstrap.css)0
-rw-r--r--newspipe/web/static/css/one-page-app.css (renamed from src/web/static/css/one-page-app.css)0
l---------newspipe/web/static/fonts (renamed from src/web/static/fonts)0
-rw-r--r--newspipe/web/static/img/favicon.ico (renamed from src/web/static/img/favicon.ico)bin1150 -> 1150 bytes
-rw-r--r--newspipe/web/static/img/newspipe.png (renamed from src/web/static/img/newspipe.png)bin1547 -> 1547 bytes
-rw-r--r--newspipe/web/static/img/newspipe.svg (renamed from src/web/static/img/newspipe.svg)0
-rw-r--r--newspipe/web/static/img/pinboard.png (renamed from src/web/static/img/pinboard.png)bin597 -> 597 bytes
-rwxr-xr-xnewspipe/web/static/img/reddit.png (renamed from src/web/static/img/reddit.png)bin525 -> 525 bytes
-rw-r--r--newspipe/web/static/img/twitter.png (renamed from src/web/static/img/twitter.png)bin640 -> 640 bytes
-rw-r--r--newspipe/web/static/js/articles.js (renamed from src/web/static/js/articles.js)0
-rw-r--r--newspipe/web/static/js/feed.js (renamed from src/web/static/js/feed.js)0
-rw-r--r--newspipe/web/static/js/jquery.js (renamed from src/web/static/js/jquery.js)0
-rw-r--r--newspipe/web/templates/about.html (renamed from src/web/templates/about.html)0
-rw-r--r--newspipe/web/templates/about_more.html (renamed from src/web/templates/about_more.html)0
-rw-r--r--newspipe/web/templates/admin/create_user.html (renamed from src/web/templates/admin/create_user.html)0
-rw-r--r--newspipe/web/templates/admin/dashboard.html (renamed from src/web/templates/admin/dashboard.html)0
-rw-r--r--newspipe/web/templates/article.html (renamed from src/web/templates/article.html)0
-rw-r--r--newspipe/web/templates/article_pub.html (renamed from src/web/templates/article_pub.html)0
-rw-r--r--newspipe/web/templates/bookmarks.html (renamed from src/web/templates/bookmarks.html)0
-rw-r--r--newspipe/web/templates/categories.html (renamed from src/web/templates/categories.html)0
-rw-r--r--newspipe/web/templates/duplicates.html (renamed from src/web/templates/duplicates.html)0
-rw-r--r--newspipe/web/templates/edit_bookmark.html (renamed from src/web/templates/edit_bookmark.html)0
-rw-r--r--newspipe/web/templates/edit_category.html (renamed from src/web/templates/edit_category.html)0
-rw-r--r--newspipe/web/templates/edit_feed.html (renamed from src/web/templates/edit_feed.html)0
-rw-r--r--newspipe/web/templates/emails/account_activation.txt (renamed from src/web/templates/emails/account_activation.txt)0
-rw-r--r--newspipe/web/templates/emails/new_password.txt (renamed from src/web/templates/emails/new_password.txt)0
-rw-r--r--newspipe/web/templates/errors/404.html (renamed from src/web/templates/errors/404.html)0
-rw-r--r--newspipe/web/templates/errors/500.html (renamed from src/web/templates/errors/500.html)0
-rw-r--r--newspipe/web/templates/feed.html (renamed from src/web/templates/feed.html)0
-rw-r--r--newspipe/web/templates/feed_list.html (renamed from src/web/templates/feed_list.html)0
-rw-r--r--newspipe/web/templates/feed_list_per_categories.html (renamed from src/web/templates/feed_list_per_categories.html)0
-rw-r--r--newspipe/web/templates/feed_list_simple.html (renamed from src/web/templates/feed_list_simple.html)0
-rw-r--r--newspipe/web/templates/feeds.html (renamed from src/web/templates/feeds.html)0
-rw-r--r--newspipe/web/templates/history.html (renamed from src/web/templates/history.html)0
-rw-r--r--newspipe/web/templates/home.html (renamed from src/web/templates/home.html)0
-rw-r--r--newspipe/web/templates/inactives.html (renamed from src/web/templates/inactives.html)0
-rw-r--r--newspipe/web/templates/layout.html (renamed from src/web/templates/layout.html)0
-rw-r--r--newspipe/web/templates/login.html (renamed from src/web/templates/login.html)0
-rw-r--r--newspipe/web/templates/management.html (renamed from src/web/templates/management.html)0
-rw-r--r--newspipe/web/templates/opml.xml (renamed from src/web/templates/opml.xml)0
-rw-r--r--newspipe/web/templates/popular.html (renamed from src/web/templates/popular.html)0
-rw-r--r--newspipe/web/templates/profile.html (renamed from src/web/templates/profile.html)0
-rw-r--r--newspipe/web/templates/profile_public.html (renamed from src/web/templates/profile_public.html)0
-rw-r--r--newspipe/web/templates/signup.html (renamed from src/web/templates/signup.html)0
-rw-r--r--newspipe/web/templates/user_stream.html (renamed from src/web/templates/user_stream.html)0
-rw-r--r--newspipe/web/translations/babel.cfg (renamed from src/web/translations/babel.cfg)0
-rw-r--r--newspipe/web/translations/fr/LC_MESSAGES/messages.mo (renamed from src/web/translations/fr/LC_MESSAGES/messages.mo)bin19672 -> 19672 bytes
-rw-r--r--newspipe/web/translations/fr/LC_MESSAGES/messages.po (renamed from src/web/translations/fr/LC_MESSAGES/messages.po)0
-rwxr-xr-xnewspipe/web/translations/internationalization.sh (renamed from src/web/translations/internationalization.sh)0
-rw-r--r--newspipe/web/translations/messages.pot (renamed from src/web/translations/messages.pot)0
-rw-r--r--newspipe/web/views/__init__.py (renamed from src/web/views/__init__.py)0
-rw-r--r--newspipe/web/views/admin.py (renamed from src/web/views/admin.py)0
-rw-r--r--newspipe/web/views/api/__init__.py (renamed from src/web/views/api/__init__.py)0
-rw-r--r--newspipe/web/views/api/v2/__init__.py (renamed from src/web/views/api/v2/__init__.py)0
-rw-r--r--newspipe/web/views/api/v2/article.py (renamed from src/web/views/api/v2/article.py)0
-rw-r--r--newspipe/web/views/api/v2/category.py (renamed from src/web/views/api/v2/category.py)0
-rw-r--r--newspipe/web/views/api/v2/common.py (renamed from src/web/views/api/v2/common.py)0
-rw-r--r--newspipe/web/views/api/v2/feed.py (renamed from src/web/views/api/v2/feed.py)0
-rw-r--r--newspipe/web/views/api/v3/__init__.py (renamed from src/web/views/api/v3/__init__.py)0
-rw-r--r--newspipe/web/views/api/v3/article.py (renamed from src/web/views/api/v3/article.py)0
-rw-r--r--newspipe/web/views/api/v3/common.py (renamed from src/web/views/api/v3/common.py)0
-rw-r--r--newspipe/web/views/api/v3/feed.py (renamed from src/web/views/api/v3/feed.py)0
-rw-r--r--newspipe/web/views/article.py (renamed from src/web/views/article.py)0
-rw-r--r--newspipe/web/views/bookmark.py (renamed from src/web/views/bookmark.py)0
-rw-r--r--newspipe/web/views/category.py (renamed from src/web/views/category.py)0
-rw-r--r--newspipe/web/views/common.py (renamed from src/web/views/common.py)0
-rw-r--r--newspipe/web/views/feed.py (renamed from src/web/views/feed.py)0
-rw-r--r--newspipe/web/views/home.py (renamed from src/web/views/home.py)0
-rw-r--r--newspipe/web/views/icon.py (renamed from src/web/views/icon.py)0
-rw-r--r--newspipe/web/views/session_mgmt.py (renamed from src/web/views/session_mgmt.py)0
-rw-r--r--newspipe/web/views/user.py (renamed from src/web/views/user.py)0
-rw-r--r--newspipe/web/views/views.py (renamed from src/web/views/views.py)0
-rw-r--r--poetry.lock923
-rw-r--r--pyproject.toml44
-rw-r--r--runtime.txt1
143 files changed, 992 insertions, 652 deletions
diff --git a/.buildpacks b/.buildpacks
deleted file mode 100644
index f1de1de6..00000000
--- a/.buildpacks
+++ /dev/null
@@ -1,2 +0,0 @@
-https://github.com/heroku/heroku-buildpack-nodejs
-https://github.com/ejholmes/heroku-buildpack-bower
diff --git a/.gitignore b/.gitignore
index 780b0a5e..17a7e884 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,10 +22,12 @@ eproject.cfg
venv
build
-src/conf/conf.cfg
+newspipe.egg-info/
+
+newspipe/conf/conf.cfg
.coverage
# js and node files
node_modules
-src/web/static/bower_components/
-src/web/static/js/bundle.min.js
+newspipe/web/static/bower_components/
+newspipe/web/static/js/bundle.min.js
diff --git a/Pipfile b/Pipfile
deleted file mode 100644
index 588235ee..00000000
--- a/Pipfile
+++ /dev/null
@@ -1,34 +0,0 @@
-[[source]]
-url = "https://pypi.python.org/simple"
-verify_ssl = true
-name = "pypi"
-
-[packages]
-aiohttp = "*"
-requests = "*"
-chardet = "*"
-requests-futures = "*"
-feedparser = "*"
-"beautifulsoup4" = "*"
-lxml = "*"
-opml = "*"
-SQLAlchemy = "*"
-alembic = "*"
-Flask = "*"
-Flask-SQLAlchemy = "*"
-Flask-Login = "*"
-Flask-Principal = "*"
-Flask-WTF = "*"
-Flask-RESTful = "*"
-Flask-Restless = "*"
-Flask-paginate = "*"
-Flask-Babel = "*"
-Flask-SSLify = "*"
-Flask-Migrate = "*"
-Flask-Script = "*"
-WTForms = "*"
-sendgrid = "*"
-python-dateutil = "*"
-psycopg2-binary = "*"
-
-[dev-packages]
diff --git a/Pipfile.lock b/Pipfile.lock
deleted file mode 100644
index f9b9dff8..00000000
--- a/Pipfile.lock
+++ /dev/null
@@ -1,504 +0,0 @@
-{
- "_meta": {
- "hash": {
- "sha256": "6b30dc177331d8eda5e9c7531c9871b33a650c1610b0eddbad9345bad862c7f4"
- },
- "pipfile-spec": 6,
- "requires": {},
- "sources": [
- {
- "name": "pypi",
- "url": "https://pypi.python.org/simple",
- "verify_ssl": true
- }
- ]
- },
- "default": {
- "aiohttp": {
- "hashes": [
- "sha256:1e984191d1ec186881ffaed4581092ba04f7c61582a177b187d3a2f07ed9719e",
- "sha256:259ab809ff0727d0e834ac5e8a283dc5e3e0ecc30c4d80b3cd17a4139ce1f326",
- "sha256:2f4d1a4fdce595c947162333353d4a44952a724fba9ca3205a3df99a33d1307a",
- "sha256:32e5f3b7e511aa850829fbe5aa32eb455e5534eaa4b1ce93231d00e2f76e5654",
- "sha256:344c780466b73095a72c616fac5ea9c4665add7fc129f285fbdbca3cccf4612a",
- "sha256:460bd4237d2dbecc3b5ed57e122992f60188afe46e7319116da5eb8a9dfedba4",
- "sha256:4c6efd824d44ae697814a2a85604d8e992b875462c6655da161ff18fd4f29f17",
- "sha256:50aaad128e6ac62e7bf7bd1f0c0a24bc968a0c0590a726d5a955af193544bcec",
- "sha256:6206a135d072f88da3e71cc501c59d5abffa9d0bb43269a6dcd28d66bfafdbdd",
- "sha256:65f31b622af739a802ca6fd1a3076fd0ae523f8485c52924a89561ba10c49b48",
- "sha256:ae55bac364c405caa23a4f2d6cfecc6a0daada500274ffca4a9230e7129eac59",
- "sha256:b778ce0c909a2653741cb4b1ac7015b5c130ab9c897611df43ae6a58523cb965"
- ],
- "index": "pypi",
- "version": "==3.6.2"
- },
- "alembic": {
- "hashes": [
- "sha256:2df2519a5b002f881517693b95626905a39c5faf4b5a1f94de4f1441095d1d26"
- ],
- "index": "pypi",
- "version": "==1.4.0"
- },
- "aniso8601": {
- "hashes": [
- "sha256:529dcb1f5f26ee0df6c0a1ee84b7b27197c3c50fc3a6321d66c544689237d072",
- "sha256:c033f63d028b9a58e3ab0c2c7d0532ab4bfa7452bfc788fbfe3ddabd327b181a"
- ],
- "version": "==8.0.0"
- },
- "async-timeout": {
- "hashes": [
- "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f",
- "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"
- ],
- "version": "==3.0.1"
- },
- "attrs": {
- "hashes": [
- "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c",
- "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"
- ],
- "version": "==19.3.0"
- },
- "babel": {
- "hashes": [
- "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38",
- "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"
- ],
- "version": "==2.8.0"
- },
- "beautifulsoup4": {
- "hashes": [
- "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a",
- "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887",
- "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"
- ],
- "index": "pypi",
- "version": "==4.8.2"
- },
- "blinker": {
- "hashes": [
- "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"
- ],
- "version": "==1.4"
- },
- "certifi": {
- "hashes": [
- "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3",
- "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"
- ],
- "version": "==2019.11.28"
- },
- "chardet": {
- "hashes": [
- "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
- "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
- ],
- "index": "pypi",
- "version": "==3.0.4"
- },
- "click": {
- "hashes": [
- "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13",
- "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"
- ],
- "version": "==7.0"
- },
- "feedparser": {
- "hashes": [
- "sha256:bd030652c2d08532c034c27fcd7c85868e7fa3cb2b17f230a44a6bbc92519bf9",
- "sha256:cd2485472e41471632ed3029d44033ee420ad0b57111db95c240c9160a85831c",
- "sha256:ce875495c90ebd74b179855449040003a1beb40cd13d5f037a0654251e260b02"
- ],
- "index": "pypi",
- "version": "==5.2.1"
- },
- "flask": {
- "hashes": [
- "sha256:13f9f196f330c7c2c5d7a5cf91af894110ca0215ac051b5844701f2bfd934d52",
- "sha256:45eb5a6fd193d6cf7e0cf5d8a5b31f83d5faae0293695626f539a823e93b13f6"
- ],
- "index": "pypi",
- "version": "==1.1.1"
- },
- "flask-babel": {
- "hashes": [
- "sha256:247f4ec34cf605d03781f480bccb1a5acb719df1d1a2a743c091ab3db5d5fde2",
- "sha256:d6a70468f9a8919d59fba2a291a003da3a05ff884275dddbd965f3b98b09ab3e"
- ],
- "index": "pypi",
- "version": "==1.0.0"
- },
- "flask-login": {
- "hashes": [
- "sha256:6d33aef15b5bcead780acc339464aae8a6e28f13c90d8b1cf9de8b549d1c0b4b",
- "sha256:7451b5001e17837ba58945aead261ba425fdf7b4f0448777e597ddab39f4fba0"
- ],
- "index": "pypi",
- "version": "==0.5.0"
- },
- "flask-migrate": {
- "hashes": [
- "sha256:6fb038be63d4c60727d5dfa5f581a6189af5b4e2925bc378697b4f0a40cfb4e1",
- "sha256:a96ff1875a49a40bd3e8ac04fce73fdb0870b9211e6168608cbafa4eb839d502"
- ],
- "index": "pypi",
- "version": "==2.5.2"
- },
- "flask-paginate": {
- "hashes": [
- "sha256:d2aa07b4ef27f56f973482aaa06a0d93dc769a3e4d3e9c382a305ab72ac38ad9"
- ],
- "index": "pypi",
- "version": "==0.5.5"
- },
- "flask-principal": {
- "hashes": [
- "sha256:f5d6134b5caebfdbb86f32d56d18ee44b080876a27269560a96ea35f75c99453"
- ],
- "index": "pypi",
- "version": "==0.4.0"
- },
- "flask-restful": {
- "hashes": [
- "sha256:5ea9a5991abf2cb69b4aac19793faac6c032300505b325687d7c305ffaa76915",
- "sha256:d891118b951921f1cec80cabb4db98ea6058a35e6404788f9e70d5b243813ec2"
- ],
- "index": "pypi",
- "version": "==0.3.8"
- },
- "flask-restless": {
- "hashes": [
- "sha256:1de47fe80abd47239c9a1804e0ba5da1d23b9f40cfc26202d16bed37f178c2b6"
- ],
- "index": "pypi",
- "version": "==0.17.0"
- },
- "flask-script": {
- "hashes": [
- "sha256:6425963d91054cfcc185807141c7314a9c5ad46325911bd24dcb489bd0161c65"
- ],
- "index": "pypi",
- "version": "==2.0.6"
- },
- "flask-sqlalchemy": {
- "hashes": [
- "sha256:0078d8663330dc05a74bc72b3b6ddc441b9a744e2f56fe60af1a5bfc81334327",
- "sha256:6974785d913666587949f7c2946f7001e4fa2cb2d19f4e69ead02e4b8f50b33d"
- ],
- "index": "pypi",
- "version": "==2.4.1"
- },
- "flask-sslify": {
- "hashes": [
- "sha256:d33e1d3c09cd95154176aa8a7319418e52129fc482dd56d8a8ad7c24500d543e"
- ],
- "index": "pypi",
- "version": "==0.1.5"
- },
- "flask-wtf": {
- "hashes": [
- "sha256:57b3faf6fe5d6168bda0c36b0df1d05770f8e205e18332d0376ddb954d17aef2",
- "sha256:d417e3a0008b5ba583da1763e4db0f55a1269d9dd91dcc3eb3c026d3c5dbd720"
- ],
- "index": "pypi",
- "version": "==0.14.3"
- },
- "idna": {
- "hashes": [
- "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb",
- "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"
- ],
- "version": "==2.9"
- },
- "itsdangerous": {
- "hashes": [
- "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19",
- "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"
- ],
- "version": "==1.1.0"
- },
- "jinja2": {
- "hashes": [
- "sha256:93187ffbc7808079673ef52771baa950426fd664d3aad1d0fa3e95644360e250",
- "sha256:b0eaf100007721b5c16c1fc1eecb87409464edc10469ddc9a22a27a99123be49"
- ],
- "version": "==2.11.1"
- },
- "lxml": {
- "hashes": [
- "sha256:06d4e0bbb1d62e38ae6118406d7cdb4693a3fa34ee3762238bcb96c9e36a93cd",
- "sha256:0701f7965903a1c3f6f09328c1278ac0eee8f56f244e66af79cb224b7ef3801c",
- "sha256:1f2c4ec372bf1c4a2c7e4bb20845e8bcf8050365189d86806bad1e3ae473d081",
- "sha256:4235bc124fdcf611d02047d7034164897ade13046bda967768836629bc62784f",
- "sha256:5828c7f3e615f3975d48f40d4fe66e8a7b25f16b5e5705ffe1d22e43fb1f6261",
- "sha256:585c0869f75577ac7a8ff38d08f7aac9033da2c41c11352ebf86a04652758b7a",
- "sha256:5d467ce9c5d35b3bcc7172c06320dddb275fea6ac2037f72f0a4d7472035cea9",
- "sha256:63dbc21efd7e822c11d5ddbedbbb08cd11a41e0032e382a0fd59b0b08e405a3a",
- "sha256:7bc1b221e7867f2e7ff1933165c0cec7153dce93d0cdba6554b42a8beb687bdb",
- "sha256:8620ce80f50d023d414183bf90cc2576c2837b88e00bea3f33ad2630133bbb60",
- "sha256:8a0ebda56ebca1a83eb2d1ac266649b80af8dd4b4a3502b2c1e09ac2f88fe128",
- "sha256:90ed0e36455a81b25b7034038e40880189169c308a3df360861ad74da7b68c1a",
- "sha256:95e67224815ef86924fbc2b71a9dbd1f7262384bca4bc4793645794ac4200717",
- "sha256:afdb34b715daf814d1abea0317b6d672476b498472f1e5aacbadc34ebbc26e89",
- "sha256:b4b2c63cc7963aedd08a5f5a454c9f67251b1ac9e22fd9d72836206c42dc2a72",
- "sha256:d068f55bda3c2c3fcaec24bd083d9e2eede32c583faf084d6e4b9daaea77dde8",
- "sha256:d5b3c4b7edd2e770375a01139be11307f04341ec709cf724e0f26ebb1eef12c3",
- "sha256:deadf4df349d1dcd7b2853a2c8796593cc346600726eff680ed8ed11812382a7",
- "sha256:df533af6f88080419c5a604d0d63b2c33b1c0c4409aba7d0cb6de305147ea8c8",
- "sha256:e4aa948eb15018a657702fee0b9db47e908491c64d36b4a90f59a64741516e77",
- "sha256:e5d842c73e4ef6ed8c1bd77806bf84a7cb535f9c0cf9b2c74d02ebda310070e1",
- "sha256:ebec08091a22c2be870890913bdadd86fcd8e9f0f22bcb398abd3af914690c15",
- "sha256:edc15fcfd77395e24543be48871c251f38132bb834d9fdfdad756adb6ea37679",
- "sha256:f2b74784ed7e0bc2d02bd53e48ad6ba523c9b36c194260b7a5045071abbb1012",
- "sha256:fa071559f14bd1e92077b1b5f6c22cf09756c6de7139370249eb372854ce51e6",
- "sha256:fd52e796fee7171c4361d441796b64df1acfceb51f29e545e812f16d023c4bbc",
- "sha256:fe976a0f1ef09b3638778024ab9fb8cde3118f203364212c198f71341c0715ca"
- ],
- "index": "pypi",
- "version": "==4.5.0"
- },
- "mako": {
- "hashes": [
- "sha256:2984a6733e1d472796ceef37ad48c26f4a984bb18119bb2dbc37a44d8f6e75a4"
- ],
- "version": "==1.1.1"
- },
- "markupsafe": {
- "hashes": [
- "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
- "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
- "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
- "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
- "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
- "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
- "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
- "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
- "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
- "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
- "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
- "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
- "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
- "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
- "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
- "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
- "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
- "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
- "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
- "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
- "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
- "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
- "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
- "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
- "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
- "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
- "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
- "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
- "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
- "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
- "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
- "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
- "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"
- ],
- "version": "==1.1.1"
- },
- "mimerender": {
- "hashes": [
- "sha256:e7f1377efee18c3f562cee54907a3329223c824332889fb74b745ddfd0a9b1c6"
- ],
- "version": "==0.6.0"
- },
- "multidict": {
- "hashes": [
- "sha256:317f96bc0950d249e96d8d29ab556d01dd38888fbe68324f46fd834b430169f1",
- "sha256:42f56542166040b4474c0c608ed051732033cd821126493cf25b6c276df7dd35",
- "sha256:4b7df040fb5fe826d689204f9b544af469593fb3ff3a069a6ad3409f742f5928",
- "sha256:544fae9261232a97102e27a926019100a9db75bec7b37feedd74b3aa82f29969",
- "sha256:620b37c3fea181dab09267cd5a84b0f23fa043beb8bc50d8474dd9694de1fa6e",
- "sha256:6e6fef114741c4d7ca46da8449038ec8b1e880bbe68674c01ceeb1ac8a648e78",
- "sha256:7774e9f6c9af3f12f296131453f7b81dabb7ebdb948483362f5afcaac8a826f1",
- "sha256:85cb26c38c96f76b7ff38b86c9d560dea10cf3459bb5f4caf72fc1bb932c7136",
- "sha256:a326f4240123a2ac66bb163eeba99578e9d63a8654a59f4688a79198f9aa10f8",
- "sha256:ae402f43604e3b2bc41e8ea8b8526c7fa7139ed76b0d64fc48e28125925275b2",
- "sha256:aee283c49601fa4c13adc64c09c978838a7e812f85377ae130a24d7198c0331e",
- "sha256:b51249fdd2923739cd3efc95a3d6c363b67bbf779208e9f37fd5e68540d1a4d4",
- "sha256:bb519becc46275c594410c6c28a8a0adc66fe24fef154a9addea54c1adb006f5",
- "sha256:c2c37185fb0af79d5c117b8d2764f4321eeb12ba8c141a95d0aa8c2c1d0a11dd",
- "sha256:dc561313279f9d05a3d0ffa89cd15ae477528ea37aa9795c4654588a3287a9ab",
- "sha256:e439c9a10a95cb32abd708bb8be83b2134fa93790a4fb0535ca36db3dda94d20",
- "sha256:fc3b4adc2ee8474cb3cd2a155305d5f8eda0a9c91320f83e55748e1fcb68f8e3"
- ],
- "version": "==4.7.5"
- },
- "opml": {
- "hashes": [
- "sha256:db1eef2a251b8af33e2eabb62baf922006dbd8c66c742931090e331a0362a770"
- ],
- "index": "pypi",
- "version": "==0.5"
- },
- "psycopg2-binary": {
- "hashes": [
- "sha256:040234f8a4a8dfd692662a8308d78f63f31a97e1c42d2480e5e6810c48966a29",
- "sha256:086f7e89ec85a6704db51f68f0dcae432eff9300809723a6e8782c41c2f48e03",
- "sha256:18ca813fdb17bc1db73fe61b196b05dd1ca2165b884dd5ec5568877cabf9b039",
- "sha256:19dc39616850342a2a6db70559af55b22955f86667b5f652f40c0e99253d9881",
- "sha256:2166e770cb98f02ed5ee2b0b569d40db26788e0bf2ec3ae1a0d864ea6f1d8309",
- "sha256:3a2522b1d9178575acee4adf8fd9f979f9c0449b00b4164bb63c3475ea6528ed",
- "sha256:3aa773580f85a28ffdf6f862e59cb5a3cc7ef6885121f2de3fca8d6ada4dbf3b",
- "sha256:3b5deaa3ee7180585a296af33e14c9b18c218d148e735c7accf78130765a47e3",
- "sha256:407af6d7e46593415f216c7f56ba087a9a42bd6dc2ecb86028760aa45b802bd7",
- "sha256:4c3c09fb674401f630626310bcaf6cd6285daf0d5e4c26d6e55ca26a2734e39b",
- "sha256:4c6717962247445b4f9e21c962ea61d2e884fc17df5ddf5e35863b016f8a1f03",
- "sha256:50446fae5681fc99f87e505d4e77c9407e683ab60c555ec302f9ac9bffa61103",
- "sha256:5057669b6a66aa9ca118a2a860159f0ee3acf837eda937bdd2a64f3431361a2d",
- "sha256:5dd90c5438b4f935c9d01fcbad3620253da89d19c1f5fca9158646407ed7df35",
- "sha256:659c815b5b8e2a55193ede2795c1e2349b8011497310bb936da7d4745652823b",
- "sha256:69b13fdf12878b10dc6003acc8d0abf3ad93e79813fd5f3812497c1c9fb9be49",
- "sha256:7a1cb80e35e1ccea3e11a48afe65d38744a0e0bde88795cc56a4d05b6e4f9d70",
- "sha256:7e6e3c52e6732c219c07bd97fff6c088f8df4dae3b79752ee3a817e6f32e177e",
- "sha256:7f42a8490c4fe854325504ce7a6e4796b207960dabb2cbafe3c3959cb00d1d7e",
- "sha256:84156313f258eafff716b2961644a4483a9be44a5d43551d554844d15d4d224e",
- "sha256:8578d6b8192e4c805e85f187bc530d0f52ba86c39172e61cd51f68fddd648103",
- "sha256:890167d5091279a27e2505ff0e1fb273f8c48c41d35c5b92adbf4af80e6b2ed6",
- "sha256:98e10634792ac0e9e7a92a76b4991b44c2325d3e7798270a808407355e7bb0a1",
- "sha256:9aadff9032e967865f9778485571e93908d27dab21d0fdfdec0ca779bb6f8ad9",
- "sha256:9f24f383a298a0c0f9b3113b982e21751a8ecde6615494a3f1470eb4a9d70e9e",
- "sha256:a73021b44813b5c84eda4a3af5826dd72356a900bac9bd9dd1f0f81ee1c22c2f",
- "sha256:afd96845e12638d2c44d213d4810a08f4dc4a563f9a98204b7428e567014b1cd",
- "sha256:b73ddf033d8cd4cc9dfed6324b1ad2a89ba52c410ef6877998422fcb9c23e3a8",
- "sha256:b8f490f5fad1767a1331df1259763b3bad7d7af12a75b950c2843ba319b2415f",
- "sha256:dbc5cd56fff1a6152ca59445178652756f4e509f672e49ccdf3d79c1043113a4",
- "sha256:eac8a3499754790187bb00574ab980df13e754777d346f85e0ff6df929bcd964",
- "sha256:eaed1c65f461a959284649e37b5051224f4db6ebdc84e40b5e65f2986f101a08"
- ],
- "index": "pypi",
- "version": "==2.8.4"
- },
- "python-dateutil": {
- "hashes": [
- "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c",
- "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"
- ],
- "index": "pypi",
- "version": "==2.8.1"
- },
- "python-editor": {
- "hashes": [
- "sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d",
- "sha256:51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b",
- "sha256:5f98b069316ea1c2ed3f67e7f5df6c0d8f10b689964a4a811ff64f0106819ec8"
- ],
- "version": "==1.0.4"
- },
- "python-http-client": {
- "hashes": [
- "sha256:10bfbc7ecd25e55215680ce2827b1a3bf4e06ba4a59758039d047d6104b6f169"
- ],
- "version": "==3.2.5"
- },
- "python-mimeparse": {
- "hashes": [
- "sha256:76e4b03d700a641fd7761d3cd4fdbbdcd787eade1ebfac43f877016328334f78",
- "sha256:a295f03ff20341491bfe4717a39cd0a8cc9afad619ba44b77e86b0ab8a2b8282"
- ],
- "version": "==1.6.0"
- },
- "pytz": {
- "hashes": [
- "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d",
- "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"
- ],
- "version": "==2019.3"
- },
- "requests": {
- "hashes": [
- "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee",
- "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"
- ],
- "index": "pypi",
- "version": "==2.23.0"
- },
- "requests-futures": {
- "hashes": [
- "sha256:35547502bf1958044716a03a2f47092a89efe8f9789ab0c4c528d9c9c30bc148"
- ],
- "index": "pypi",
- "version": "==1.0.0"
- },
- "sendgrid": {
- "hashes": [
- "sha256:8112a3e2edd4cef208ed46335f058d2782397b395b96a472dcfd5e2618cf621b",
- "sha256:e2b8bd90522f22a22d2557aee9cb77d0c372a8c4ca35e65d062b4ecaf0b9a4bd"
- ],
- "index": "pypi",
- "version": "==6.1.2"
- },
- "six": {
- "hashes": [
- "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
- "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
- ],
- "version": "==1.14.0"
- },
- "soupsieve": {
- "hashes": [
- "sha256:e914534802d7ffd233242b785229d5ba0766a7f487385e3f714446a07bf540ae",
- "sha256:fcd71e08c0aee99aca1b73f45478549ee7e7fc006d51b37bec9e9def7dc22b69"
- ],
- "version": "==2.0"
- },
- "sqlalchemy": {
- "hashes": [
- "sha256:64a7b71846db6423807e96820993fa12a03b89127d278290ca25c0b11ed7b4fb"
- ],
- "index": "pypi",
- "version": "==1.3.13"
- },
- "urllib3": {
- "hashes": [
- "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc",
- "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc"
- ],
- "version": "==1.25.8"
- },
- "werkzeug": {
- "hashes": [
- "sha256:169ba8a33788476292d04186ab33b01d6add475033dfc07215e6d219cc077096",
- "sha256:6dc65cf9091cf750012f56f2cad759fa9e879f511b5ff8685e456b4e3bf90d16"
- ],
- "version": "==1.0.0"
- },
- "wtforms": {
- "hashes": [
- "sha256:0cdbac3e7f6878086c334aa25dc5a33869a3954e9d1e015130d65a69309b3b61",
- "sha256:e3ee092c827582c50877cdbd49e9ce6d2c5c1f6561f849b3b068c1b8029626f1"
- ],
- "index": "pypi",
- "version": "==2.2.1"
- },
- "yarl": {
- "hashes": [
- "sha256:0c2ab325d33f1b824734b3ef51d4d54a54e0e7a23d13b86974507602334c2cce",
- "sha256:0ca2f395591bbd85ddd50a82eb1fde9c1066fafe888c5c7cc1d810cf03fd3cc6",
- "sha256:2098a4b4b9d75ee352807a95cdf5f10180db903bc5b7270715c6bbe2551f64ce",
- "sha256:25e66e5e2007c7a39541ca13b559cd8ebc2ad8fe00ea94a2aad28a9b1e44e5ae",
- "sha256:26d7c90cb04dee1665282a5d1a998defc1a9e012fdca0f33396f81508f49696d",
- "sha256:308b98b0c8cd1dfef1a0311dc5e38ae8f9b58349226aa0533f15a16717ad702f",
- "sha256:3ce3d4f7c6b69c4e4f0704b32eca8123b9c58ae91af740481aa57d7857b5e41b",
- "sha256:58cd9c469eced558cd81aa3f484b2924e8897049e06889e8ff2510435b7ef74b",
- "sha256:5b10eb0e7f044cf0b035112446b26a3a2946bca9d7d7edb5e54a2ad2f6652abb",
- "sha256:6faa19d3824c21bcbfdfce5171e193c8b4ddafdf0ac3f129ccf0cdfcb083e462",
- "sha256:944494be42fa630134bf907714d40207e646fd5a94423c90d5b514f7b0713fea",
- "sha256:a161de7e50224e8e3de6e184707476b5a989037dcb24292b391a3d66ff158e70",
- "sha256:a4844ebb2be14768f7994f2017f70aca39d658a96c786211be5ddbe1c68794c1",
- "sha256:c2b509ac3d4b988ae8769901c66345425e361d518aecbe4acbfc2567e416626a",
- "sha256:c9959d49a77b0e07559e579f38b2f3711c2b8716b8410b320bf9713013215a1b",
- "sha256:d8cdee92bc930d8b09d8bd2043cedd544d9c8bd7436a77678dd602467a993080",
- "sha256:e15199cdb423316e15f108f51249e44eb156ae5dba232cb73be555324a1d49c2"
- ],
- "version": "==1.4.2"
- }
- },
- "develop": {}
-}
diff --git a/Procfile b/Procfile
deleted file mode 100644
index 7c8bf856..00000000
--- a/Procfile
+++ /dev/null
@@ -1,2 +0,0 @@
-web: python src/runserver.py
-init: python src/manager.py db_create
diff --git a/README.md b/README.md
index 042da0bf..ce3bf0f9 100644
--- a/README.md
+++ b/README.md
@@ -10,14 +10,14 @@ https://todo.sr.ht/~cedric/newspipe
## Main features
-* can be easily deployed on Heroku or on your server;
+* easy to deploy;
* multiple users can use a Newspipe instance;
* a RESTful API to manage your articles (or connect your own crawler);
* data liberation: export and import all your account with a JSON file;
* export and import feeds with OPML files;
* favorite articles;
* detection of inactive feeds;
-* Pinboard and reddit;
+* share on Pinboard and reddit;
* personal management of bookmarks (with import from Pinboard).
The core technologies are [Flask](http://flask.pocoo.org),
@@ -32,13 +32,6 @@ A documentation is available [here](https://newspipe.readthedocs.io) and
provides different ways to
[install Newspipe](https://newspipe.readthedocs.io/en/latest/deployment.html).
-Test Newspipe on Heroku:
-
-[![Deploy to Heroku](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://builds.sr.ht/~cedric/Stegano)
-
-It is important to specify an application name and the URL of your instance
-(*PLATFORM_URL*) through the Heroku form.
-
## Deployment
@@ -51,15 +44,15 @@ $ sudo apt-get install postgresql npm
## Configure and install the application
```bash
-$ git clone https://git.sr.ht/~cedric/Newspipe
+$ git clone https://git.sr.ht/~cedric/newspipe
$ cd newspipe/
-$ pipenv install
+$ poetry install
✨🍰✨
$ npm install
-$ cp src/conf/conf.cfg-sample src/conf/conf.cfg
-$ pipenv shell
-$ python src/manager.py db_create
-$ python src/runserver.py
+$ cp newspipe/conf/conf.cfg-sample newspipe/conf/conf.cfg
+$ poetry shell
+$ python newspipe/manager.py db_create
+$ python newspipe/runserver.py
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
```
diff --git a/app.json b/app.json
deleted file mode 100644
index 48e1b6e5..00000000
--- a/app.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "name": "Newspipe",
- "description": "A news aggregator that can be deployed on Heroku.",
- "keywords": [
- "aggregator",
- "news",
- "RSS"
- ],
- "website": "https://git.sr.ht/~cedric/Newspipe",
- "repository": "https://git.sr.ht/~cedric/Newspipe",
- "logo": "https://git.sr.ht/~cedric/Newspipe/blob/master/src/web/static/img/newspipe.png",
- "scripts": {
- "postdeploy": "python src/manager.py db_create"
- },
- "addons": [
- "heroku-postgresql:hobby-dev",
- "scheduler:standard"
- ],
- "buildpacks": [
- {
- "url": "https://github.com/heroku/heroku-buildpack-nodejs"
- },
- {
- "url": "https://github.com/ejholmes/heroku-buildpack-bower"
- },
- {
- "url": "heroku/python"
- }
- ],
- "env": {
- "PLATFORM_URL": {
- "description": "Address of your Newspipe instance (for example: https://YOUR-APPLICATION-NAME.herokuapp.com/)",
- "required": true,
- "value": ""
- },
- "ADMIN_EMAIL": {
- "description": "Administrator email address.",
- "required": true,
- "value": ""
- },
- "ADMIN_PASSWORD": {
- "description": "Your password.",
- "required": true,
- "value": ""
- },
- "SECRET_KEY": {
- "description": "A secret token in order to use sessions.",
- "required": true,
- "value": "iYtWRvAl!S7+Gz8kabK3@CBvr"
- },
- "SELF_REGISTRATION": {
- "description": "If set to True, users will be able to create new accounts.",
- "required": true,
- "value": "false"
- },
- "SECURITY_PASSWORD_SALT": {
- "description": "A secret to confirm account creation with a link in an email.",
- "required": true,
- "value": "^HEpK@L&cP5dMR^kiz8IIZj8q"
- },
- "TOKEN_VALIDITY_PERIOD": {
- "description": "Validity period (in seconds) of the account confirmation link sent by email.",
- "required": true,
- "value": "3600"
- },
- "HEROKU": "1",
- "CDN_ADDRESS": "https://cdn.cedricbonhomme.org/",
- "NOTIFICATION_EMAIL": "newspipe@no-reply.com",
- "SENDGRID_API_KEY": "REDACTED",
- "CRAWLER_RESOLV": {
- "description": "Specify if the crawler should try to resolve link of articles behind proxies.",
- "value": "false"
- },
- "FEED_REFRESH_INTERVAL": {
- "description": "Feeds refresh interval (in minutes) for the crawler.",
- "value": "120"
- }
- }
-}
diff --git a/install.sh b/install.sh
index 1733c718..77cde199 100644
--- a/install.sh
+++ b/install.sh
@@ -9,13 +9,13 @@
sudo apt-get install npm
-pipenv install
+poetry install
npm install
-cp src/conf/conf.cfg-sample src/conf/conf.cfg
+cp newspipe/conf/conf.cfg-sample newspipe/conf/conf.cfg
# Delete default database configuration
-sed -i '/database/d' src/conf/conf.cfg
-sed -i '/database_url/d' src/conf/conf.cfg
+sed -i '/database/d' newspipe/conf/conf.cfg
+sed -i '/database_url/d' newspipe/conf/conf.cfg
# Configuration of the database
if [ "$1" == postgres ]; then
@@ -30,21 +30,21 @@ if [ "$1" == postgres ]; then
echo "GRANT ALL PRIVILEGES ON DATABASE aggregator TO pgsqluser;" | sudo -u postgres psql
# Add configuration lines for PostgreSQL
- echo '[database]' >> src/conf/conf.cfg
- echo 'database_url = postgres://pgsqluser:pgsqlpwd@127.0.0.1:5433/aggregator' >> src/conf/conf.cfg
+ echo '[database]' >> newspipe/conf/conf.cfg
+ echo 'database_url = postgres://pgsqluser:pgsqlpwd@127.0.0.1:5433/aggregator' >> newspipe/conf/conf.cfg
elif [ "$1" == sqlite ]; then
# Add configuration lines for SQLite
echo "Configuring the SQLite database..."
- echo '[database]' >> src/conf/conf.cfg
- echo 'database_url = sqlite:///newspipe.db' >> src/conf/conf.cfg
+ echo '[database]' >> newspipe/conf/conf.cfg
+ echo 'database_url = sqlite:///newspipe.db' >> newspipe/conf/conf.cfg
fi
-pipenv shell
+poetry shell
echo "Initialization of the database..."
-python src/manager.py db_empty
-python src/manager.py db_create
+python newspipe/manager.py db_empty
+python newspipe/manager.py db_create
echo "Launching Newspipe..."
-python src/runserver.py
+python newspipe/runserver.py
diff --git a/src/bootstrap.py b/newspipe/bootstrap.py
index 8e5413e0..8e5413e0 100644
--- a/src/bootstrap.py
+++ b/newspipe/bootstrap.py
diff --git a/src/conf.py b/newspipe/conf.py
index ced602ca..ced602ca 100644
--- a/src/conf.py
+++ b/newspipe/conf.py
diff --git a/src/conf/conf.cfg-sample b/newspipe/conf/conf.cfg-sample
index ed14a4d9..ed14a4d9 100644
--- a/src/conf/conf.cfg-sample
+++ b/newspipe/conf/conf.cfg-sample
diff --git a/src/crawler/default_crawler.py b/newspipe/crawler/default_crawler.py
index 79a746b5..79a746b5 100644
--- a/src/crawler/default_crawler.py
+++ b/newspipe/crawler/default_crawler.py
diff --git a/src/lib/__init__.py b/newspipe/lib/__init__.py
index e69de29b..e69de29b 100644
--- a/src/lib/__init__.py
+++ b/newspipe/lib/__init__.py
diff --git a/src/lib/article_utils.py b/newspipe/lib/article_utils.py
index 9891e29f..9891e29f 100644
--- a/src/lib/article_utils.py
+++ b/newspipe/lib/article_utils.py
diff --git a/src/lib/data.py b/newspipe/lib/data.py
index 067a0a04..067a0a04 100644
--- a/src/lib/data.py
+++ b/newspipe/lib/data.py
diff --git a/src/lib/feed_utils.py b/newspipe/lib/feed_utils.py
index c2d4ca6e..c2d4ca6e 100644
--- a/src/lib/feed_utils.py
+++ b/newspipe/lib/feed_utils.py
diff --git a/src/lib/misc_utils.py b/newspipe/lib/misc_utils.py
index 8fb2d284..8fb2d284 100755
--- a/src/lib/misc_utils.py
+++ b/newspipe/lib/misc_utils.py
diff --git a/src/lib/utils.py b/newspipe/lib/utils.py
index d206b769..d206b769 100644
--- a/src/lib/utils.py
+++ b/newspipe/lib/utils.py
diff --git a/src/manager.py b/newspipe/manager.py
index 9535ac59..9535ac59 100755
--- a/src/manager.py
+++ b/newspipe/manager.py
diff --git a/src/notifications/emails.py b/newspipe/notifications/emails.py
index 098c29bf..098c29bf 100644
--- a/src/notifications/emails.py
+++ b/newspipe/notifications/emails.py
diff --git a/src/notifications/notifications.py b/newspipe/notifications/notifications.py
index e775f4b9..e775f4b9 100644
--- a/src/notifications/notifications.py
+++ b/newspipe/notifications/notifications.py
diff --git a/src/runserver.py b/newspipe/runserver.py
index 287a52f8..287a52f8 100755
--- a/src/runserver.py
+++ b/newspipe/runserver.py
diff --git a/src/web/__init__.py b/newspipe/web/__init__.py
index ca5ddbe1..ca5ddbe1 100644
--- a/src/web/__init__.py
+++ b/newspipe/web/__init__.py
diff --git a/src/web/controllers/__init__.py b/newspipe/web/controllers/__init__.py
index 5fbc2619..5fbc2619 100644
--- a/src/web/controllers/__init__.py
+++ b/newspipe/web/controllers/__init__.py
diff --git a/src/web/controllers/abstract.py b/newspipe/web/controllers/abstract.py
index 764ff305..764ff305 100644
--- a/src/web/controllers/abstract.py
+++ b/newspipe/web/controllers/abstract.py
diff --git a/src/web/controllers/article.py b/newspipe/web/controllers/article.py
index d7058229..d7058229 100644
--- a/src/web/controllers/article.py
+++ b/newspipe/web/controllers/article.py
diff --git a/src/web/controllers/bookmark.py b/newspipe/web/controllers/bookmark.py
index b5413243..b5413243 100644
--- a/src/web/controllers/bookmark.py
+++ b/newspipe/web/controllers/bookmark.py
diff --git a/src/web/controllers/category.py b/newspipe/web/controllers/category.py
index fef5ca81..fef5ca81 100644
--- a/src/web/controllers/category.py
+++ b/newspipe/web/controllers/category.py
diff --git a/src/web/controllers/feed.py b/newspipe/web/controllers/feed.py
index d75cd994..d75cd994 100644
--- a/src/web/controllers/feed.py
+++ b/newspipe/web/controllers/feed.py
diff --git a/src/web/controllers/icon.py b/newspipe/web/controllers/icon.py
index 07c4a4ef..07c4a4ef 100644
--- a/src/web/controllers/icon.py
+++ b/newspipe/web/controllers/icon.py
diff --git a/src/web/controllers/tag.py b/newspipe/web/controllers/tag.py
index 35fd5613..35fd5613 100644
--- a/src/web/controllers/tag.py
+++ b/newspipe/web/controllers/tag.py
diff --git a/src/web/controllers/user.py b/newspipe/web/controllers/user.py
index 6ab04d44..6ab04d44 100644
--- a/src/web/controllers/user.py
+++ b/newspipe/web/controllers/user.py
diff --git a/src/web/decorators.py b/newspipe/web/decorators.py
index 3835f646..3835f646 100644
--- a/src/web/decorators.py
+++ b/newspipe/web/decorators.py
diff --git a/src/web/forms.py b/newspipe/web/forms.py
index 7b1893e2..7b1893e2 100644
--- a/src/web/forms.py
+++ b/newspipe/web/forms.py
diff --git a/src/web/js/actions/MenuActions.js b/newspipe/web/js/actions/MenuActions.js
index 824610d8..824610d8 100644
--- a/src/web/js/actions/MenuActions.js
+++ b/newspipe/web/js/actions/MenuActions.js
diff --git a/src/web/js/actions/MiddlePanelActions.js b/newspipe/web/js/actions/MiddlePanelActions.js
index 700814d4..700814d4 100644
--- a/src/web/js/actions/MiddlePanelActions.js
+++ b/newspipe/web/js/actions/MiddlePanelActions.js
diff --git a/src/web/js/actions/RightPanelActions.js b/newspipe/web/js/actions/RightPanelActions.js
index 5d78e001..5d78e001 100644
--- a/src/web/js/actions/RightPanelActions.js
+++ b/newspipe/web/js/actions/RightPanelActions.js
diff --git a/src/web/js/app.js b/newspipe/web/js/app.js
index 7837e6ae..7837e6ae 100644
--- a/src/web/js/app.js
+++ b/newspipe/web/js/app.js
diff --git a/src/web/js/components/MainApp.react.js b/newspipe/web/js/components/MainApp.react.js
index 32bb663e..32bb663e 100644
--- a/src/web/js/components/MainApp.react.js
+++ b/newspipe/web/js/components/MainApp.react.js
diff --git a/src/web/js/components/Menu.react.js b/newspipe/web/js/components/Menu.react.js
index 64672240..64672240 100644
--- a/src/web/js/components/Menu.react.js
+++ b/newspipe/web/js/components/Menu.react.js
diff --git a/src/web/js/components/MiddlePanel.react.js b/newspipe/web/js/components/MiddlePanel.react.js
index fc7c763a..fc7c763a 100644
--- a/src/web/js/components/MiddlePanel.react.js
+++ b/newspipe/web/js/components/MiddlePanel.react.js
diff --git a/src/web/js/components/Navbar.react.js b/newspipe/web/js/components/Navbar.react.js
index 83f3c72c..83f3c72c 100644
--- a/src/web/js/components/Navbar.react.js
+++ b/newspipe/web/js/components/Navbar.react.js
diff --git a/src/web/js/components/RightPanel.react.js b/newspipe/web/js/components/RightPanel.react.js
index 6384cdfe..6384cdfe 100644
--- a/src/web/js/components/RightPanel.react.js
+++ b/newspipe/web/js/components/RightPanel.react.js
diff --git a/src/web/js/components/time.react.js b/newspipe/web/js/components/time.react.js
index 07e1fbdf..07e1fbdf 100644
--- a/src/web/js/components/time.react.js
+++ b/newspipe/web/js/components/time.react.js
diff --git a/src/web/js/constants/JarrConstants.js b/newspipe/web/js/constants/JarrConstants.js
index 78e8bf04..78e8bf04 100644
--- a/src/web/js/constants/JarrConstants.js
+++ b/newspipe/web/js/constants/JarrConstants.js
diff --git a/src/web/js/dispatcher/JarrDispatcher.js b/newspipe/web/js/dispatcher/JarrDispatcher.js
index 56da186f..56da186f 100644
--- a/src/web/js/dispatcher/JarrDispatcher.js
+++ b/newspipe/web/js/dispatcher/JarrDispatcher.js
diff --git a/src/web/js/dispatcher/__tests__/AppDispatcher-test.js b/newspipe/web/js/dispatcher/__tests__/AppDispatcher-test.js
index d3a35fc5..d3a35fc5 100644
--- a/src/web/js/dispatcher/__tests__/AppDispatcher-test.js
+++ b/newspipe/web/js/dispatcher/__tests__/AppDispatcher-test.js
diff --git a/src/web/js/stores/MenuStore.js b/newspipe/web/js/stores/MenuStore.js
index 770bc501..770bc501 100644
--- a/src/web/js/stores/MenuStore.js
+++ b/newspipe/web/js/stores/MenuStore.js
diff --git a/src/web/js/stores/MiddlePanelStore.js b/newspipe/web/js/stores/MiddlePanelStore.js
index c554f929..c554f929 100644
--- a/src/web/js/stores/MiddlePanelStore.js
+++ b/newspipe/web/js/stores/MiddlePanelStore.js
diff --git a/src/web/js/stores/RightPanelStore.js b/newspipe/web/js/stores/RightPanelStore.js
index 6c268dfd..6c268dfd 100644
--- a/src/web/js/stores/RightPanelStore.js
+++ b/newspipe/web/js/stores/RightPanelStore.js
diff --git a/src/web/js/stores/__tests__/TodoStore-test.js b/newspipe/web/js/stores/__tests__/TodoStore-test.js
index 6da6cd3c..6da6cd3c 100644
--- a/src/web/js/stores/__tests__/TodoStore-test.js
+++ b/newspipe/web/js/stores/__tests__/TodoStore-test.js
diff --git a/src/web/lib/__init__.py b/newspipe/web/lib/__init__.py
index e69de29b..e69de29b 100644
--- a/src/web/lib/__init__.py
+++ b/newspipe/web/lib/__init__.py
diff --git a/src/web/lib/user_utils.py b/newspipe/web/lib/user_utils.py
index f78a6ed6..f78a6ed6 100644
--- a/src/web/lib/user_utils.py
+++ b/newspipe/web/lib/user_utils.py
diff --git a/src/web/lib/view_utils.py b/newspipe/web/lib/view_utils.py
index 1d8c6aed..1d8c6aed 100644
--- a/src/web/lib/view_utils.py
+++ b/newspipe/web/lib/view_utils.py
diff --git a/src/web/models/__init__.py b/newspipe/web/models/__init__.py
index bfb1368c..bfb1368c 100644
--- a/src/web/models/__init__.py
+++ b/newspipe/web/models/__init__.py
diff --git a/src/web/models/article.py b/newspipe/web/models/article.py
index d55e59c1..d55e59c1 100644
--- a/src/web/models/article.py
+++ b/newspipe/web/models/article.py
diff --git a/src/web/models/bookmark.py b/newspipe/web/models/bookmark.py
index eb6b73e3..eb6b73e3 100644
--- a/src/web/models/bookmark.py
+++ b/newspipe/web/models/bookmark.py
diff --git a/src/web/models/category.py b/newspipe/web/models/category.py
index 2da7809a..2da7809a 100644
--- a/src/web/models/category.py
+++ b/newspipe/web/models/category.py
diff --git a/src/web/models/feed.py b/newspipe/web/models/feed.py
index fc0b64cb..fc0b64cb 100644
--- a/src/web/models/feed.py
+++ b/newspipe/web/models/feed.py
diff --git a/src/web/models/icon.py b/newspipe/web/models/icon.py
index adc9cf69..adc9cf69 100644
--- a/src/web/models/icon.py
+++ b/newspipe/web/models/icon.py
diff --git a/src/web/models/right_mixin.py b/newspipe/web/models/right_mixin.py
index 1c316f95..1c316f95 100644
--- a/src/web/models/right_mixin.py
+++ b/newspipe/web/models/right_mixin.py
diff --git a/src/web/models/role.py b/newspipe/web/models/role.py
index 0a2ecd4a..0a2ecd4a 100644
--- a/src/web/models/role.py
+++ b/newspipe/web/models/role.py
diff --git a/src/web/models/tag.py b/newspipe/web/models/tag.py
index 76467c0b..76467c0b 100644
--- a/src/web/models/tag.py
+++ b/newspipe/web/models/tag.py
diff --git a/src/web/models/user.py b/newspipe/web/models/user.py
index 4d65c3c5..4d65c3c5 100644
--- a/src/web/models/user.py
+++ b/newspipe/web/models/user.py
diff --git a/src/web/static/css/bootstrap-theme.min.css b/newspipe/web/static/css/bootstrap-theme.min.css
index 06469c8d..06469c8d 120000
--- a/src/web/static/css/bootstrap-theme.min.css
+++ b/newspipe/web/static/css/bootstrap-theme.min.css
diff --git a/src/web/static/css/bootstrap-theme.min.css.map b/newspipe/web/static/css/bootstrap-theme.min.css.map
index 0448a4a0..0448a4a0 120000
--- a/src/web/static/css/bootstrap-theme.min.css.map
+++ b/newspipe/web/static/css/bootstrap-theme.min.css.map
diff --git a/src/web/static/css/bootstrap.min.css b/newspipe/web/static/css/bootstrap.min.css
index 30c399cb..30c399cb 120000
--- a/src/web/static/css/bootstrap.min.css
+++ b/newspipe/web/static/css/bootstrap.min.css
diff --git a/src/web/static/css/bootstrap.min.css.map b/newspipe/web/static/css/bootstrap.min.css.map
index 146f88dd..146f88dd 120000
--- a/src/web/static/css/bootstrap.min.css.map
+++ b/newspipe/web/static/css/bootstrap.min.css.map
diff --git a/src/web/static/css/customized-bootstrap.css b/newspipe/web/static/css/customized-bootstrap.css
index c385c908..c385c908 100644
--- a/src/web/static/css/customized-bootstrap.css
+++ b/newspipe/web/static/css/customized-bootstrap.css
diff --git a/src/web/static/css/one-page-app.css b/newspipe/web/static/css/one-page-app.css
index f8c443c3..f8c443c3 100644
--- a/src/web/static/css/one-page-app.css
+++ b/newspipe/web/static/css/one-page-app.css
diff --git a/src/web/static/fonts b/newspipe/web/static/fonts
index 4097ea8b..4097ea8b 120000
--- a/src/web/static/fonts
+++ b/newspipe/web/static/fonts
diff --git a/src/web/static/img/favicon.ico b/newspipe/web/static/img/favicon.ico
index 5b056c1e..5b056c1e 100644
--- a/src/web/static/img/favicon.ico
+++ b/newspipe/web/static/img/favicon.ico
Binary files differ
diff --git a/src/web/static/img/newspipe.png b/newspipe/web/static/img/newspipe.png
index c3ba5029..c3ba5029 100644
--- a/src/web/static/img/newspipe.png
+++ b/newspipe/web/static/img/newspipe.png
Binary files differ
diff --git a/src/web/static/img/newspipe.svg b/newspipe/web/static/img/newspipe.svg
index be22ae42..be22ae42 100644
--- a/src/web/static/img/newspipe.svg
+++ b/newspipe/web/static/img/newspipe.svg
diff --git a/src/web/static/img/pinboard.png b/newspipe/web/static/img/pinboard.png
index 6dddc10b..6dddc10b 100644
--- a/src/web/static/img/pinboard.png
+++ b/newspipe/web/static/img/pinboard.png
Binary files differ
diff --git a/src/web/static/img/reddit.png b/newspipe/web/static/img/reddit.png
index 2d615f2a..2d615f2a 100755
--- a/src/web/static/img/reddit.png
+++ b/newspipe/web/static/img/reddit.png
Binary files differ
diff --git a/src/web/static/img/twitter.png b/newspipe/web/static/img/twitter.png
index fc11c4ce..fc11c4ce 100644
--- a/src/web/static/img/twitter.png
+++ b/newspipe/web/static/img/twitter.png
Binary files differ
diff --git a/src/web/static/js/articles.js b/newspipe/web/static/js/articles.js
index 350723a4..350723a4 100644
--- a/src/web/static/js/articles.js
+++ b/newspipe/web/static/js/articles.js
diff --git a/src/web/static/js/feed.js b/newspipe/web/static/js/feed.js
index ceef58fc..ceef58fc 100644
--- a/src/web/static/js/feed.js
+++ b/newspipe/web/static/js/feed.js
diff --git a/src/web/static/js/jquery.js b/newspipe/web/static/js/jquery.js
index e5ace116..e5ace116 100644
--- a/src/web/static/js/jquery.js
+++ b/newspipe/web/static/js/jquery.js
diff --git a/src/web/templates/about.html b/newspipe/web/templates/about.html
index 4cfafb79..4cfafb79 100644
--- a/src/web/templates/about.html
+++ b/newspipe/web/templates/about.html
diff --git a/src/web/templates/about_more.html b/newspipe/web/templates/about_more.html
index d4353a15..d4353a15 100644
--- a/src/web/templates/about_more.html
+++ b/newspipe/web/templates/about_more.html
diff --git a/src/web/templates/admin/create_user.html b/newspipe/web/templates/admin/create_user.html
index 40aad468..40aad468 100644
--- a/src/web/templates/admin/create_user.html
+++ b/newspipe/web/templates/admin/create_user.html
diff --git a/src/web/templates/admin/dashboard.html b/newspipe/web/templates/admin/dashboard.html
index 350a2e47..350a2e47 100644
--- a/src/web/templates/admin/dashboard.html
+++ b/newspipe/web/templates/admin/dashboard.html
diff --git a/src/web/templates/article.html b/newspipe/web/templates/article.html
index a95d86d9..a95d86d9 100644
--- a/src/web/templates/article.html
+++ b/newspipe/web/templates/article.html
diff --git a/src/web/templates/article_pub.html b/newspipe/web/templates/article_pub.html
index e810d18f..e810d18f 100644
--- a/src/web/templates/article_pub.html
+++ b/newspipe/web/templates/article_pub.html
diff --git a/src/web/templates/bookmarks.html b/newspipe/web/templates/bookmarks.html
index a3ec4580..a3ec4580 100644
--- a/src/web/templates/bookmarks.html
+++ b/newspipe/web/templates/bookmarks.html
diff --git a/src/web/templates/categories.html b/newspipe/web/templates/categories.html
index 4985e0ca..4985e0ca 100644
--- a/src/web/templates/categories.html
+++ b/newspipe/web/templates/categories.html
diff --git a/src/web/templates/duplicates.html b/newspipe/web/templates/duplicates.html
index d944a1a5..d944a1a5 100644
--- a/src/web/templates/duplicates.html
+++ b/newspipe/web/templates/duplicates.html
diff --git a/src/web/templates/edit_bookmark.html b/newspipe/web/templates/edit_bookmark.html
index efd9d775..efd9d775 100644
--- a/src/web/templates/edit_bookmark.html
+++ b/newspipe/web/templates/edit_bookmark.html
diff --git a/src/web/templates/edit_category.html b/newspipe/web/templates/edit_category.html
index 93c952d6..93c952d6 100644
--- a/src/web/templates/edit_category.html
+++ b/newspipe/web/templates/edit_category.html
diff --git a/src/web/templates/edit_feed.html b/newspipe/web/templates/edit_feed.html
index 9c773204..9c773204 100644
--- a/src/web/templates/edit_feed.html
+++ b/newspipe/web/templates/edit_feed.html
diff --git a/src/web/templates/emails/account_activation.txt b/newspipe/web/templates/emails/account_activation.txt
index c7d9c52e..c7d9c52e 100644
--- a/src/web/templates/emails/account_activation.txt
+++ b/newspipe/web/templates/emails/account_activation.txt
diff --git a/src/web/templates/emails/new_password.txt b/newspipe/web/templates/emails/new_password.txt
index 1a04a36d..1a04a36d 100644
--- a/src/web/templates/emails/new_password.txt
+++ b/newspipe/web/templates/emails/new_password.txt
diff --git a/src/web/templates/errors/404.html b/newspipe/web/templates/errors/404.html
index c64a2be8..c64a2be8 100644
--- a/src/web/templates/errors/404.html
+++ b/newspipe/web/templates/errors/404.html
diff --git a/src/web/templates/errors/500.html b/newspipe/web/templates/errors/500.html
index 417fc0c7..417fc0c7 100644
--- a/src/web/templates/errors/500.html
+++ b/newspipe/web/templates/errors/500.html
diff --git a/src/web/templates/feed.html b/newspipe/web/templates/feed.html
index 31db94a5..31db94a5 100644
--- a/src/web/templates/feed.html
+++ b/newspipe/web/templates/feed.html
diff --git a/src/web/templates/feed_list.html b/newspipe/web/templates/feed_list.html
index 8c258c3c..8c258c3c 100644
--- a/src/web/templates/feed_list.html
+++ b/newspipe/web/templates/feed_list.html
diff --git a/src/web/templates/feed_list_per_categories.html b/newspipe/web/templates/feed_list_per_categories.html
index 34d10ddd..34d10ddd 100644
--- a/src/web/templates/feed_list_per_categories.html
+++ b/newspipe/web/templates/feed_list_per_categories.html
diff --git a/src/web/templates/feed_list_simple.html b/newspipe/web/templates/feed_list_simple.html
index 5f692a53..5f692a53 100644
--- a/src/web/templates/feed_list_simple.html
+++ b/newspipe/web/templates/feed_list_simple.html
diff --git a/src/web/templates/feeds.html b/newspipe/web/templates/feeds.html
index 805e1b74..805e1b74 100644
--- a/src/web/templates/feeds.html
+++ b/newspipe/web/templates/feeds.html
diff --git a/src/web/templates/history.html b/newspipe/web/templates/history.html
index d9ee9538..d9ee9538 100644
--- a/src/web/templates/history.html
+++ b/newspipe/web/templates/history.html
diff --git a/src/web/templates/home.html b/newspipe/web/templates/home.html
index bc38d189..bc38d189 100644
--- a/src/web/templates/home.html
+++ b/newspipe/web/templates/home.html
diff --git a/src/web/templates/inactives.html b/newspipe/web/templates/inactives.html
index e89a5fe1..e89a5fe1 100644
--- a/src/web/templates/inactives.html
+++ b/newspipe/web/templates/inactives.html
diff --git a/src/web/templates/layout.html b/newspipe/web/templates/layout.html
index 29d4470f..29d4470f 100644
--- a/src/web/templates/layout.html
+++ b/newspipe/web/templates/layout.html
diff --git a/src/web/templates/login.html b/newspipe/web/templates/login.html
index d2724ac3..d2724ac3 100644
--- a/src/web/templates/login.html
+++ b/newspipe/web/templates/login.html
diff --git a/src/web/templates/management.html b/newspipe/web/templates/management.html
index 4d7c2da3..4d7c2da3 100644
--- a/src/web/templates/management.html
+++ b/newspipe/web/templates/management.html
diff --git a/src/web/templates/opml.xml b/newspipe/web/templates/opml.xml
index 7159e279..7159e279 100644
--- a/src/web/templates/opml.xml
+++ b/newspipe/web/templates/opml.xml
diff --git a/src/web/templates/popular.html b/newspipe/web/templates/popular.html
index 4b207903..4b207903 100644
--- a/src/web/templates/popular.html
+++ b/newspipe/web/templates/popular.html
diff --git a/src/web/templates/profile.html b/newspipe/web/templates/profile.html
index 523e7c3c..523e7c3c 100644
--- a/src/web/templates/profile.html
+++ b/newspipe/web/templates/profile.html
diff --git a/src/web/templates/profile_public.html b/newspipe/web/templates/profile_public.html
index e933a04b..e933a04b 100644
--- a/src/web/templates/profile_public.html
+++ b/newspipe/web/templates/profile_public.html
diff --git a/src/web/templates/signup.html b/newspipe/web/templates/signup.html
index 8d34b3bf..8d34b3bf 100644
--- a/src/web/templates/signup.html
+++ b/newspipe/web/templates/signup.html
diff --git a/src/web/templates/user_stream.html b/newspipe/web/templates/user_stream.html
index b05376a8..b05376a8 100644
--- a/src/web/templates/user_stream.html
+++ b/newspipe/web/templates/user_stream.html
diff --git a/src/web/translations/babel.cfg b/newspipe/web/translations/babel.cfg
index f0234b32..f0234b32 100644
--- a/src/web/translations/babel.cfg
+++ b/newspipe/web/translations/babel.cfg
diff --git a/src/web/translations/fr/LC_MESSAGES/messages.mo b/newspipe/web/translations/fr/LC_MESSAGES/messages.mo
index 87b48bb3..87b48bb3 100644
--- a/src/web/translations/fr/LC_MESSAGES/messages.mo
+++ b/newspipe/web/translations/fr/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/src/web/translations/fr/LC_MESSAGES/messages.po b/newspipe/web/translations/fr/LC_MESSAGES/messages.po
index be948d2e..be948d2e 100644
--- a/src/web/translations/fr/LC_MESSAGES/messages.po
+++ b/newspipe/web/translations/fr/LC_MESSAGES/messages.po
diff --git a/src/web/translations/internationalization.sh b/newspipe/web/translations/internationalization.sh
index 51efa840..51efa840 100755
--- a/src/web/translations/internationalization.sh
+++ b/newspipe/web/translations/internationalization.sh
diff --git a/src/web/translations/messages.pot b/newspipe/web/translations/messages.pot
index 871417c8..871417c8 100644
--- a/src/web/translations/messages.pot
+++ b/newspipe/web/translations/messages.pot
diff --git a/src/web/views/__init__.py b/newspipe/web/views/__init__.py
index 41bb52f3..41bb52f3 100644
--- a/src/web/views/__init__.py
+++ b/newspipe/web/views/__init__.py
diff --git a/src/web/views/admin.py b/newspipe/web/views/admin.py
index 73b2b668..73b2b668 100644
--- a/src/web/views/admin.py
+++ b/newspipe/web/views/admin.py
diff --git a/src/web/views/api/__init__.py b/newspipe/web/views/api/__init__.py
index e69de29b..e69de29b 100644
--- a/src/web/views/api/__init__.py
+++ b/newspipe/web/views/api/__init__.py
diff --git a/src/web/views/api/v2/__init__.py b/newspipe/web/views/api/v2/__init__.py
index 46760261..46760261 100644
--- a/src/web/views/api/v2/__init__.py
+++ b/newspipe/web/views/api/v2/__init__.py
diff --git a/src/web/views/api/v2/article.py b/newspipe/web/views/api/v2/article.py
index 2be286c6..2be286c6 100644
--- a/src/web/views/api/v2/article.py
+++ b/newspipe/web/views/api/v2/article.py
diff --git a/src/web/views/api/v2/category.py b/newspipe/web/views/api/v2/category.py
index 70fda1ea..70fda1ea 100644
--- a/src/web/views/api/v2/category.py
+++ b/newspipe/web/views/api/v2/category.py
diff --git a/src/web/views/api/v2/common.py b/newspipe/web/views/api/v2/common.py
index 8a53d7e6..8a53d7e6 100644
--- a/src/web/views/api/v2/common.py
+++ b/newspipe/web/views/api/v2/common.py
diff --git a/src/web/views/api/v2/feed.py b/newspipe/web/views/api/v2/feed.py
index a0691277..a0691277 100644
--- a/src/web/views/api/v2/feed.py
+++ b/newspipe/web/views/api/v2/feed.py
diff --git a/src/web/views/api/v3/__init__.py b/newspipe/web/views/api/v3/__init__.py
index 76aa1f19..76aa1f19 100644
--- a/src/web/views/api/v3/__init__.py
+++ b/newspipe/web/views/api/v3/__init__.py
diff --git a/src/web/views/api/v3/article.py b/newspipe/web/views/api/v3/article.py
index 4cf35648..4cf35648 100644
--- a/src/web/views/api/v3/article.py
+++ b/newspipe/web/views/api/v3/article.py
diff --git a/src/web/views/api/v3/common.py b/newspipe/web/views/api/v3/common.py
index d5e94a3f..d5e94a3f 100644
--- a/src/web/views/api/v3/common.py
+++ b/newspipe/web/views/api/v3/common.py
diff --git a/src/web/views/api/v3/feed.py b/newspipe/web/views/api/v3/feed.py
index 2cbbafd9..2cbbafd9 100644
--- a/src/web/views/api/v3/feed.py
+++ b/newspipe/web/views/api/v3/feed.py
diff --git a/src/web/views/article.py b/newspipe/web/views/article.py
index bf39795d..bf39795d 100644
--- a/src/web/views/article.py
+++ b/newspipe/web/views/article.py
diff --git a/src/web/views/bookmark.py b/newspipe/web/views/bookmark.py
index 21d832d2..21d832d2 100644
--- a/src/web/views/bookmark.py
+++ b/newspipe/web/views/bookmark.py
diff --git a/src/web/views/category.py b/newspipe/web/views/category.py
index 138561dd..138561dd 100644
--- a/src/web/views/category.py
+++ b/newspipe/web/views/category.py
diff --git a/src/web/views/common.py b/newspipe/web/views/common.py
index e422fd57..e422fd57 100644
--- a/src/web/views/common.py
+++ b/newspipe/web/views/common.py
diff --git a/src/web/views/feed.py b/newspipe/web/views/feed.py
index b98a005a..b98a005a 100644
--- a/src/web/views/feed.py
+++ b/newspipe/web/views/feed.py
diff --git a/src/web/views/home.py b/newspipe/web/views/home.py
index 34ecb9fa..34ecb9fa 100644
--- a/src/web/views/home.py
+++ b/newspipe/web/views/home.py
diff --git a/src/web/views/icon.py b/newspipe/web/views/icon.py
index 64e54cab..64e54cab 100644
--- a/src/web/views/icon.py
+++ b/newspipe/web/views/icon.py
diff --git a/src/web/views/session_mgmt.py b/newspipe/web/views/session_mgmt.py
index 0db76115..0db76115 100644
--- a/src/web/views/session_mgmt.py
+++ b/newspipe/web/views/session_mgmt.py
diff --git a/src/web/views/user.py b/newspipe/web/views/user.py
index 24b73a60..24b73a60 100644
--- a/src/web/views/user.py
+++ b/newspipe/web/views/user.py
diff --git a/src/web/views/views.py b/newspipe/web/views/views.py
index 57f790b1..57f790b1 100644
--- a/src/web/views/views.py
+++ b/newspipe/web/views/views.py
diff --git a/poetry.lock b/poetry.lock
new file mode 100644
index 00000000..9c1388f8
--- /dev/null
+++ b/poetry.lock
@@ -0,0 +1,923 @@
+[[package]]
+category = "main"
+description = "Async http client/server framework (asyncio)"
+name = "aiohttp"
+optional = false
+python-versions = ">=3.5.3"
+version = "3.6.2"
+
+[package.dependencies]
+async-timeout = ">=3.0,<4.0"
+attrs = ">=17.3.0"
+chardet = ">=2.0,<4.0"
+multidict = ">=4.5,<5.0"
+yarl = ">=1.0,<2.0"
+
+[package.extras]
+speedups = ["aiodns", "brotlipy", "cchardet"]
+
+[[package]]
+category = "main"
+description = "A database migration tool for SQLAlchemy."
+name = "alembic"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "1.4.0"
+
+[package.dependencies]
+Mako = "*"
+SQLAlchemy = ">=1.1.0"
+python-dateutil = "*"
+python-editor = ">=0.3"
+
+[[package]]
+category = "main"
+description = "A library for parsing ISO 8601 strings."
+name = "aniso8601"
+optional = false
+python-versions = "*"
+version = "8.0.0"
+
+[[package]]
+category = "main"
+description = "Timeout context manager for asyncio programs"
+name = "async-timeout"
+optional = false
+python-versions = ">=3.5.3"
+version = "3.0.1"
+
+[[package]]
+category = "main"
+description = "Classes Without Boilerplate"
+name = "attrs"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "19.3.0"
+
+[package.extras]
+azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"]
+dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"]
+docs = ["sphinx", "zope.interface"]
+tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"]
+
+[[package]]
+category = "main"
+description = "Internationalization utilities"
+name = "babel"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "2.8.0"
+
+[package.dependencies]
+pytz = ">=2015.7"
+
+[[package]]
+category = "main"
+description = "Screen-scraping library"
+name = "beautifulsoup4"
+optional = false
+python-versions = "*"
+version = "4.8.2"
+
+[package.dependencies]
+soupsieve = ">=1.2"
+
+[package.extras]
+html5lib = ["html5lib"]
+lxml = ["lxml"]
+
+[[package]]
+category = "main"
+description = "Fast, simple object-to-object and broadcast signaling"
+name = "blinker"
+optional = false
+python-versions = "*"
+version = "1.4"
+
+[[package]]
+category = "main"
+description = "Python package for providing Mozilla's CA Bundle."
+name = "certifi"
+optional = false
+python-versions = "*"
+version = "2019.11.28"
+
+[[package]]
+category = "main"
+description = "Universal encoding detector for Python 2 and 3"
+name = "chardet"
+optional = false
+python-versions = "*"
+version = "3.0.4"
+
+[[package]]
+category = "main"
+description = "Composable command line interface toolkit"
+name = "click"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "7.0"
+
+[[package]]
+category = "main"
+description = "Universal feed parser, handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds"
+name = "feedparser"
+optional = false
+python-versions = "*"
+version = "5.2.1"
+
+[[package]]
+category = "main"
+description = "A simple framework for building complex web applications."
+name = "flask"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "1.1.1"
+
+[package.dependencies]
+Jinja2 = ">=2.10.1"
+Werkzeug = ">=0.15"
+click = ">=5.1"
+itsdangerous = ">=0.24"
+
+[package.extras]
+dev = ["pytest", "coverage", "tox", "sphinx", "pallets-sphinx-themes", "sphinxcontrib-log-cabinet", "sphinx-issues"]
+docs = ["sphinx", "pallets-sphinx-themes", "sphinxcontrib-log-cabinet", "sphinx-issues"]
+dotenv = ["python-dotenv"]
+
+[[package]]
+category = "main"
+description = "Adds i18n/l10n support to Flask applications"
+name = "flask-babel"
+optional = false
+python-versions = "*"
+version = "1.0.0"
+
+[package.dependencies]
+Babel = ">=2.3"
+Flask = "*"
+Jinja2 = ">=2.5"
+pytz = "*"
+
+[[package]]
+category = "main"
+description = "User session management for Flask"
+name = "flask-login"
+optional = false
+python-versions = "*"
+version = "0.5.0"
+
+[package.dependencies]
+Flask = "*"
+
+[[package]]
+category = "main"
+description = "SQLAlchemy database migrations for Flask applications using Alembic"
+name = "flask-migrate"
+optional = false
+python-versions = "*"
+version = "2.5.2"
+
+[package.dependencies]
+Flask = ">=0.9"
+Flask-SQLAlchemy = ">=1.0"
+alembic = ">=0.7"
+
+[[package]]
+category = "main"
+description = "Simple paginate support for flask"
+name = "flask-paginate"
+optional = false
+python-versions = "*"
+version = "0.5.5"
+
+[package.dependencies]
+Flask = "*"
+
+[[package]]
+category = "main"
+description = "Identity management for flask"
+name = "flask-principal"
+optional = false
+python-versions = "*"
+version = "0.4.0"
+
+[package.dependencies]
+Flask = "*"
+blinker = "*"
+
+[[package]]
+category = "main"
+description = "Simple framework for creating REST APIs"
+name = "flask-restful"
+optional = false
+python-versions = "*"
+version = "0.3.8"
+
+[package.dependencies]
+Flask = ">=0.8"
+aniso8601 = ">=0.82"
+pytz = "*"
+six = ">=1.3.0"
+
+[package.extras]
+docs = ["sphinx"]
+
+[[package]]
+category = "main"
+description = "A Flask extension for easy ReSTful API generation"
+name = "flask-restless"
+optional = false
+python-versions = "*"
+version = "0.17.0"
+
+[package.dependencies]
+flask = ">=0.10"
+mimerender = ">=0.5.2"
+python-dateutil = ">2.0"
+sqlalchemy = ">=0.8"
+
+[[package]]
+category = "main"
+description = "Scripting support for Flask"
+name = "flask-script"
+optional = false
+python-versions = "*"
+version = "2.0.6"
+
+[package.dependencies]
+Flask = "*"
+
+[[package]]
+category = "main"
+description = "Adds SQLAlchemy support to your Flask application."
+name = "flask-sqlalchemy"
+optional = false
+python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*"
+version = "2.4.1"
+
+[package.dependencies]
+Flask = ">=0.10"
+SQLAlchemy = ">=0.8.0"
+
+[[package]]
+category = "main"
+description = "Force SSL on your Flask app."
+name = "flask-sslify"
+optional = false
+python-versions = "*"
+version = "0.1.5"
+
+[package.dependencies]
+Flask = "*"
+
+[[package]]
+category = "main"
+description = "Simple integration of Flask and WTForms."
+name = "flask-wtf"
+optional = false
+python-versions = "*"
+version = "0.14.3"
+
+[package.dependencies]
+Flask = "*"
+WTForms = "*"
+itsdangerous = "*"
+
+[[package]]
+category = "main"
+description = "Internationalized Domain Names in Applications (IDNA)"
+name = "idna"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "2.9"
+
+[[package]]
+category = "main"
+description = "Various helpers to pass data to untrusted environments and back."
+name = "itsdangerous"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "1.1.0"
+
+[[package]]
+category = "main"
+description = "A very fast and expressive template engine."
+name = "jinja2"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "2.11.1"
+
+[package.dependencies]
+MarkupSafe = ">=0.23"
+
+[package.extras]
+i18n = ["Babel (>=0.8)"]
+
+[[package]]
+category = "main"
+description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API."
+name = "lxml"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*"
+version = "4.5.0"
+
+[package.extras]
+cssselect = ["cssselect (>=0.7)"]
+html5 = ["html5lib"]
+htmlsoup = ["beautifulsoup4"]
+source = ["Cython (>=0.29.7)"]
+
+[[package]]
+category = "main"
+description = "A super-fast templating language that borrows the best ideas from the existing templating languages."
+name = "mako"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "1.1.1"
+
+[package.dependencies]
+MarkupSafe = ">=0.9.2"
+
+[package.extras]
+babel = ["babel"]
+lingua = ["lingua"]
+
+[[package]]
+category = "main"
+description = "Safely add untrusted strings to HTML/XML markup."
+name = "markupsafe"
+optional = false
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
+version = "1.1.1"
+
+[[package]]
+category = "main"
+description = "RESTful HTTP Content Negotiation for Flask, Bottle, web.py and webapp2 (Google App Engine)"
+name = "mimerender"
+optional = false
+python-versions = "*"
+version = "0.6.0"
+
+[package.dependencies]
+python_mimeparse = ">=0.1.4"
+
+[[package]]
+category = "main"
+description = "multidict implementation"
+name = "multidict"
+optional = false
+python-versions = ">=3.5"
+version = "4.7.5"
+
+[[package]]
+category = "main"
+description = "Lightweight OPML parsing."
+name = "opml"
+optional = false
+python-versions = "*"
+version = "0.5"
+
+[package.dependencies]
+lxml = "*"
+setuptools = "*"
+
+[[package]]
+category = "main"
+description = "psycopg2 - Python-PostgreSQL Database Adapter"
+name = "psycopg2-binary"
+optional = false
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
+version = "2.8.4"
+
+[[package]]
+category = "dev"
+description = "Python interface to Graphviz's Dot"
+name = "pydot"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "1.4.1"
+
+[package.dependencies]
+pyparsing = ">=2.1.4"
+
+[[package]]
+category = "dev"
+description = "Python parsing module"
+name = "pyparsing"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+version = "2.4.6"
+
+[[package]]
+category = "main"
+description = "Extensions to the standard Python datetime module"
+name = "python-dateutil"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+version = "2.8.1"
+
+[package.dependencies]
+six = ">=1.5"
+
+[[package]]
+category = "main"
+description = "Programmatically open an editor, capture the result."
+name = "python-editor"
+optional = false
+python-versions = "*"
+version = "1.0.4"
+
+[[package]]
+category = "main"
+description = "HTTP REST client, simplified for Python"
+name = "python-http-client"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "3.2.5"
+
+[[package]]
+category = "main"
+description = "A module provides basic functions for parsing mime-type names and matching them against a list of media-ranges."
+name = "python-mimeparse"
+optional = false
+python-versions = "*"
+version = "1.6.0"
+
+[[package]]
+category = "main"
+description = "World timezone definitions, modern and historical"
+name = "pytz"
+optional = false
+python-versions = "*"
+version = "2019.3"
+
+[[package]]
+category = "main"
+description = "Python HTTP for Humans."
+name = "requests"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "2.23.0"
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+chardet = ">=3.0.2,<4"
+idna = ">=2.5,<3"
+urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26"
+
+[package.extras]
+security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
+socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"]
+
+[[package]]
+category = "main"
+description = "Asynchronous Python HTTP for Humans."
+name = "requests-futures"
+optional = false
+python-versions = "*"
+version = "1.0.0"
+
+[package.dependencies]
+requests = ">=1.2.0"
+
+[[package]]
+category = "main"
+description = "Twilio SendGrid library for Python"
+name = "sendgrid"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "6.1.2"
+
+[package.dependencies]
+python-http-client = ">=3.2.1"
+
+[[package]]
+category = "main"
+description = "Python 2 and 3 compatibility utilities"
+name = "six"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+version = "1.14.0"
+
+[[package]]
+category = "main"
+description = "A modern CSS selector implementation for Beautiful Soup."
+name = "soupsieve"
+optional = false
+python-versions = ">=3.5"
+version = "2.0"
+
+[[package]]
+category = "main"
+description = "Database Abstraction Library"
+name = "sqlalchemy"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "1.3.13"
+
+[package.extras]
+mssql = ["pyodbc"]
+mssql_pymssql = ["pymssql"]
+mssql_pyodbc = ["pyodbc"]
+mysql = ["mysqlclient"]
+oracle = ["cx-oracle"]
+postgresql = ["psycopg2"]
+postgresql_pg8000 = ["pg8000"]
+postgresql_psycopg2binary = ["psycopg2-binary"]
+postgresql_psycopg2cffi = ["psycopg2cffi"]
+pymysql = ["pymysql"]
+
+[[package]]
+category = "dev"
+description = "Turn SQLAlchemy DB Model into a graph"
+name = "sqlalchemy-schemadisplay"
+optional = false
+python-versions = "*"
+version = "1.3"
+
+[package.dependencies]
+pydot = "*"
+setuptools = "*"
+
+[[package]]
+category = "main"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+name = "urllib3"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
+version = "1.25.8"
+
+[package.extras]
+brotli = ["brotlipy (>=0.6.0)"]
+secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
+socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"]
+
+[[package]]
+category = "main"
+description = "The comprehensive WSGI web application library."
+name = "werkzeug"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "1.0.0"
+
+[package.extras]
+dev = ["pytest", "coverage", "tox", "sphinx", "pallets-sphinx-themes", "sphinx-issues"]
+watchdog = ["watchdog"]
+
+[[package]]
+category = "main"
+description = "A flexible forms validation and rendering library for Python web development."
+name = "wtforms"
+optional = false
+python-versions = "*"
+version = "2.2.1"
+
+[package.extras]
+locale = ["Babel (>=1.3)"]
+
+[[package]]
+category = "main"
+description = "Yet another URL library"
+name = "yarl"
+optional = false
+python-versions = ">=3.5"
+version = "1.4.2"
+
+[package.dependencies]
+idna = ">=2.0"
+multidict = ">=4.0"
+
+[metadata]
+content-hash = "6714462ca1b9ea98f6ec5d7ef69d7ddbed1ae0687cbff95accbcda74074714a2"
+python-versions = "^3.8"
+
+[metadata.files]
+aiohttp = [
+ {file = "aiohttp-3.6.2-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:1e984191d1ec186881ffaed4581092ba04f7c61582a177b187d3a2f07ed9719e"},
+ {file = "aiohttp-3.6.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:50aaad128e6ac62e7bf7bd1f0c0a24bc968a0c0590a726d5a955af193544bcec"},
+ {file = "aiohttp-3.6.2-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:65f31b622af739a802ca6fd1a3076fd0ae523f8485c52924a89561ba10c49b48"},
+ {file = "aiohttp-3.6.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ae55bac364c405caa23a4f2d6cfecc6a0daada500274ffca4a9230e7129eac59"},
+ {file = "aiohttp-3.6.2-cp36-cp36m-win32.whl", hash = "sha256:344c780466b73095a72c616fac5ea9c4665add7fc129f285fbdbca3cccf4612a"},
+ {file = "aiohttp-3.6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:4c6efd824d44ae697814a2a85604d8e992b875462c6655da161ff18fd4f29f17"},
+ {file = "aiohttp-3.6.2-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:2f4d1a4fdce595c947162333353d4a44952a724fba9ca3205a3df99a33d1307a"},
+ {file = "aiohttp-3.6.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6206a135d072f88da3e71cc501c59d5abffa9d0bb43269a6dcd28d66bfafdbdd"},
+ {file = "aiohttp-3.6.2-cp37-cp37m-win32.whl", hash = "sha256:b778ce0c909a2653741cb4b1ac7015b5c130ab9c897611df43ae6a58523cb965"},
+ {file = "aiohttp-3.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:32e5f3b7e511aa850829fbe5aa32eb455e5534eaa4b1ce93231d00e2f76e5654"},
+ {file = "aiohttp-3.6.2-py3-none-any.whl", hash = "sha256:460bd4237d2dbecc3b5ed57e122992f60188afe46e7319116da5eb8a9dfedba4"},
+ {file = "aiohttp-3.6.2.tar.gz", hash = "sha256:259ab809ff0727d0e834ac5e8a283dc5e3e0ecc30c4d80b3cd17a4139ce1f326"},
+]
+alembic = [
+ {file = "alembic-1.4.0.tar.gz", hash = "sha256:2df2519a5b002f881517693b95626905a39c5faf4b5a1f94de4f1441095d1d26"},
+]
+aniso8601 = [
+ {file = "aniso8601-8.0.0-py2.py3-none-any.whl", hash = "sha256:c033f63d028b9a58e3ab0c2c7d0532ab4bfa7452bfc788fbfe3ddabd327b181a"},
+ {file = "aniso8601-8.0.0.tar.gz", hash = "sha256:529dcb1f5f26ee0df6c0a1ee84b7b27197c3c50fc3a6321d66c544689237d072"},
+]
+async-timeout = [
+ {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"},
+ {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"},
+]
+attrs = [
+ {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"},
+ {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"},
+]
+babel = [
+ {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"},
+ {file = "Babel-2.8.0.tar.gz", hash = "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38"},
+]
+beautifulsoup4 = [
+ {file = "beautifulsoup4-4.8.2-py2-none-any.whl", hash = "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"},
+ {file = "beautifulsoup4-4.8.2-py3-none-any.whl", hash = "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887"},
+ {file = "beautifulsoup4-4.8.2.tar.gz", hash = "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a"},
+]
+blinker = [
+ {file = "blinker-1.4.tar.gz", hash = "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"},
+]
+certifi = [
+ {file = "certifi-2019.11.28-py2.py3-none-any.whl", hash = "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3"},
+ {file = "certifi-2019.11.28.tar.gz", hash = "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"},
+]
+chardet = [
+ {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
+ {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"},
+]
+click = [
+ {file = "Click-7.0-py2.py3-none-any.whl", hash = "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13"},
+ {file = "Click-7.0.tar.gz", hash = "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"},
+]
+feedparser = [
+ {file = "feedparser-5.2.1.tar.bz2", hash = "sha256:ce875495c90ebd74b179855449040003a1beb40cd13d5f037a0654251e260b02"},
+ {file = "feedparser-5.2.1.tar.gz", hash = "sha256:bd030652c2d08532c034c27fcd7c85868e7fa3cb2b17f230a44a6bbc92519bf9"},
+ {file = "feedparser-5.2.1.zip", hash = "sha256:cd2485472e41471632ed3029d44033ee420ad0b57111db95c240c9160a85831c"},
+]
+flask = [
+ {file = "Flask-1.1.1-py2.py3-none-any.whl", hash = "sha256:45eb5a6fd193d6cf7e0cf5d8a5b31f83d5faae0293695626f539a823e93b13f6"},
+ {file = "Flask-1.1.1.tar.gz", hash = "sha256:13f9f196f330c7c2c5d7a5cf91af894110ca0215ac051b5844701f2bfd934d52"},
+]
+flask-babel = [
+ {file = "Flask-Babel-1.0.0.tar.gz", hash = "sha256:d6a70468f9a8919d59fba2a291a003da3a05ff884275dddbd965f3b98b09ab3e"},
+ {file = "Flask_Babel-1.0.0-py3-none-any.whl", hash = "sha256:247f4ec34cf605d03781f480bccb1a5acb719df1d1a2a743c091ab3db5d5fde2"},
+]
+flask-login = [
+ {file = "Flask-Login-0.5.0.tar.gz", hash = "sha256:6d33aef15b5bcead780acc339464aae8a6e28f13c90d8b1cf9de8b549d1c0b4b"},
+ {file = "Flask_Login-0.5.0-py2.py3-none-any.whl", hash = "sha256:7451b5001e17837ba58945aead261ba425fdf7b4f0448777e597ddab39f4fba0"},
+]
+flask-migrate = [
+ {file = "Flask-Migrate-2.5.2.tar.gz", hash = "sha256:a96ff1875a49a40bd3e8ac04fce73fdb0870b9211e6168608cbafa4eb839d502"},
+ {file = "Flask_Migrate-2.5.2-py2.py3-none-any.whl", hash = "sha256:6fb038be63d4c60727d5dfa5f581a6189af5b4e2925bc378697b4f0a40cfb4e1"},
+]
+flask-paginate = [
+ {file = "flask_paginate-0.5.5-py2.py3-none-any.whl", hash = "sha256:d2aa07b4ef27f56f973482aaa06a0d93dc769a3e4d3e9c382a305ab72ac38ad9"},
+]
+flask-principal = [
+ {file = "Flask-Principal-0.4.0.tar.gz", hash = "sha256:f5d6134b5caebfdbb86f32d56d18ee44b080876a27269560a96ea35f75c99453"},
+]
+flask-restful = [
+ {file = "Flask-RESTful-0.3.8.tar.gz", hash = "sha256:5ea9a5991abf2cb69b4aac19793faac6c032300505b325687d7c305ffaa76915"},
+ {file = "Flask_RESTful-0.3.8-py2.py3-none-any.whl", hash = "sha256:d891118b951921f1cec80cabb4db98ea6058a35e6404788f9e70d5b243813ec2"},
+]
+flask-restless = [
+ {file = "Flask-Restless-0.17.0.tar.gz", hash = "sha256:1de47fe80abd47239c9a1804e0ba5da1d23b9f40cfc26202d16bed37f178c2b6"},
+]
+flask-script = [
+ {file = "Flask-Script-2.0.6.tar.gz", hash = "sha256:6425963d91054cfcc185807141c7314a9c5ad46325911bd24dcb489bd0161c65"},
+]
+flask-sqlalchemy = [
+ {file = "Flask-SQLAlchemy-2.4.1.tar.gz", hash = "sha256:6974785d913666587949f7c2946f7001e4fa2cb2d19f4e69ead02e4b8f50b33d"},
+ {file = "Flask_SQLAlchemy-2.4.1-py2.py3-none-any.whl", hash = "sha256:0078d8663330dc05a74bc72b3b6ddc441b9a744e2f56fe60af1a5bfc81334327"},
+]
+flask-sslify = [
+ {file = "Flask-SSLify-0.1.5.tar.gz", hash = "sha256:d33e1d3c09cd95154176aa8a7319418e52129fc482dd56d8a8ad7c24500d543e"},
+]
+flask-wtf = [
+ {file = "Flask-WTF-0.14.3.tar.gz", hash = "sha256:d417e3a0008b5ba583da1763e4db0f55a1269d9dd91dcc3eb3c026d3c5dbd720"},
+ {file = "Flask_WTF-0.14.3-py2.py3-none-any.whl", hash = "sha256:57b3faf6fe5d6168bda0c36b0df1d05770f8e205e18332d0376ddb954d17aef2"},
+]
+idna = [
+ {file = "idna-2.9-py2.py3-none-any.whl", hash = "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"},
+ {file = "idna-2.9.tar.gz", hash = "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb"},
+]
+itsdangerous = [
+ {file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"},
+ {file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"},
+]
+jinja2 = [
+ {file = "Jinja2-2.11.1-py2.py3-none-any.whl", hash = "sha256:b0eaf100007721b5c16c1fc1eecb87409464edc10469ddc9a22a27a99123be49"},
+ {file = "Jinja2-2.11.1.tar.gz", hash = "sha256:93187ffbc7808079673ef52771baa950426fd664d3aad1d0fa3e95644360e250"},
+]
+lxml = [
+ {file = "lxml-4.5.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0701f7965903a1c3f6f09328c1278ac0eee8f56f244e66af79cb224b7ef3801c"},
+ {file = "lxml-4.5.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:06d4e0bbb1d62e38ae6118406d7cdb4693a3fa34ee3762238bcb96c9e36a93cd"},
+ {file = "lxml-4.5.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5828c7f3e615f3975d48f40d4fe66e8a7b25f16b5e5705ffe1d22e43fb1f6261"},
+ {file = "lxml-4.5.0-cp27-cp27m-win32.whl", hash = "sha256:afdb34b715daf814d1abea0317b6d672476b498472f1e5aacbadc34ebbc26e89"},
+ {file = "lxml-4.5.0-cp27-cp27m-win_amd64.whl", hash = "sha256:585c0869f75577ac7a8ff38d08f7aac9033da2c41c11352ebf86a04652758b7a"},
+ {file = "lxml-4.5.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:8a0ebda56ebca1a83eb2d1ac266649b80af8dd4b4a3502b2c1e09ac2f88fe128"},
+ {file = "lxml-4.5.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:fe976a0f1ef09b3638778024ab9fb8cde3118f203364212c198f71341c0715ca"},
+ {file = "lxml-4.5.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7bc1b221e7867f2e7ff1933165c0cec7153dce93d0cdba6554b42a8beb687bdb"},
+ {file = "lxml-4.5.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d068f55bda3c2c3fcaec24bd083d9e2eede32c583faf084d6e4b9daaea77dde8"},
+ {file = "lxml-4.5.0-cp35-cp35m-win32.whl", hash = "sha256:e4aa948eb15018a657702fee0b9db47e908491c64d36b4a90f59a64741516e77"},
+ {file = "lxml-4.5.0-cp35-cp35m-win_amd64.whl", hash = "sha256:1f2c4ec372bf1c4a2c7e4bb20845e8bcf8050365189d86806bad1e3ae473d081"},
+ {file = "lxml-4.5.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:5d467ce9c5d35b3bcc7172c06320dddb275fea6ac2037f72f0a4d7472035cea9"},
+ {file = "lxml-4.5.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:95e67224815ef86924fbc2b71a9dbd1f7262384bca4bc4793645794ac4200717"},
+ {file = "lxml-4.5.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ebec08091a22c2be870890913bdadd86fcd8e9f0f22bcb398abd3af914690c15"},
+ {file = "lxml-4.5.0-cp36-cp36m-win32.whl", hash = "sha256:deadf4df349d1dcd7b2853a2c8796593cc346600726eff680ed8ed11812382a7"},
+ {file = "lxml-4.5.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f2b74784ed7e0bc2d02bd53e48ad6ba523c9b36c194260b7a5045071abbb1012"},
+ {file = "lxml-4.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fa071559f14bd1e92077b1b5f6c22cf09756c6de7139370249eb372854ce51e6"},
+ {file = "lxml-4.5.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:edc15fcfd77395e24543be48871c251f38132bb834d9fdfdad756adb6ea37679"},
+ {file = "lxml-4.5.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd52e796fee7171c4361d441796b64df1acfceb51f29e545e812f16d023c4bbc"},
+ {file = "lxml-4.5.0-cp37-cp37m-win32.whl", hash = "sha256:90ed0e36455a81b25b7034038e40880189169c308a3df360861ad74da7b68c1a"},
+ {file = "lxml-4.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:df533af6f88080419c5a604d0d63b2c33b1c0c4409aba7d0cb6de305147ea8c8"},
+ {file = "lxml-4.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b4b2c63cc7963aedd08a5f5a454c9f67251b1ac9e22fd9d72836206c42dc2a72"},
+ {file = "lxml-4.5.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e5d842c73e4ef6ed8c1bd77806bf84a7cb535f9c0cf9b2c74d02ebda310070e1"},
+ {file = "lxml-4.5.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:63dbc21efd7e822c11d5ddbedbbb08cd11a41e0032e382a0fd59b0b08e405a3a"},
+ {file = "lxml-4.5.0-cp38-cp38-win32.whl", hash = "sha256:4235bc124fdcf611d02047d7034164897ade13046bda967768836629bc62784f"},
+ {file = "lxml-4.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:d5b3c4b7edd2e770375a01139be11307f04341ec709cf724e0f26ebb1eef12c3"},
+ {file = "lxml-4.5.0.tar.gz", hash = "sha256:8620ce80f50d023d414183bf90cc2576c2837b88e00bea3f33ad2630133bbb60"},
+]
+mako = [
+ {file = "Mako-1.1.1.tar.gz", hash = "sha256:2984a6733e1d472796ceef37ad48c26f4a984bb18119bb2dbc37a44d8f6e75a4"},
+]
+markupsafe = [
+ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"},
+ {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"},
+ {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"},
+ {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"},
+ {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"},
+ {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"},
+ {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"},
+ {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"},
+ {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"},
+ {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"},
+ {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"},
+ {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"},
+]
+mimerender = [
+ {file = "mimerender-0.6.0.tar.gz", hash = "sha256:e7f1377efee18c3f562cee54907a3329223c824332889fb74b745ddfd0a9b1c6"},
+]
+multidict = [
+ {file = "multidict-4.7.5-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:fc3b4adc2ee8474cb3cd2a155305d5f8eda0a9c91320f83e55748e1fcb68f8e3"},
+ {file = "multidict-4.7.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:42f56542166040b4474c0c608ed051732033cd821126493cf25b6c276df7dd35"},
+ {file = "multidict-4.7.5-cp35-cp35m-win32.whl", hash = "sha256:7774e9f6c9af3f12f296131453f7b81dabb7ebdb948483362f5afcaac8a826f1"},
+ {file = "multidict-4.7.5-cp35-cp35m-win_amd64.whl", hash = "sha256:c2c37185fb0af79d5c117b8d2764f4321eeb12ba8c141a95d0aa8c2c1d0a11dd"},
+ {file = "multidict-4.7.5-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:e439c9a10a95cb32abd708bb8be83b2134fa93790a4fb0535ca36db3dda94d20"},
+ {file = "multidict-4.7.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:85cb26c38c96f76b7ff38b86c9d560dea10cf3459bb5f4caf72fc1bb932c7136"},
+ {file = "multidict-4.7.5-cp36-cp36m-win32.whl", hash = "sha256:620b37c3fea181dab09267cd5a84b0f23fa043beb8bc50d8474dd9694de1fa6e"},
+ {file = "multidict-4.7.5-cp36-cp36m-win_amd64.whl", hash = "sha256:6e6fef114741c4d7ca46da8449038ec8b1e880bbe68674c01ceeb1ac8a648e78"},
+ {file = "multidict-4.7.5-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:a326f4240123a2ac66bb163eeba99578e9d63a8654a59f4688a79198f9aa10f8"},
+ {file = "multidict-4.7.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dc561313279f9d05a3d0ffa89cd15ae477528ea37aa9795c4654588a3287a9ab"},
+ {file = "multidict-4.7.5-cp37-cp37m-win32.whl", hash = "sha256:4b7df040fb5fe826d689204f9b544af469593fb3ff3a069a6ad3409f742f5928"},
+ {file = "multidict-4.7.5-cp37-cp37m-win_amd64.whl", hash = "sha256:317f96bc0950d249e96d8d29ab556d01dd38888fbe68324f46fd834b430169f1"},
+ {file = "multidict-4.7.5-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:b51249fdd2923739cd3efc95a3d6c363b67bbf779208e9f37fd5e68540d1a4d4"},
+ {file = "multidict-4.7.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ae402f43604e3b2bc41e8ea8b8526c7fa7139ed76b0d64fc48e28125925275b2"},
+ {file = "multidict-4.7.5-cp38-cp38-win32.whl", hash = "sha256:bb519becc46275c594410c6c28a8a0adc66fe24fef154a9addea54c1adb006f5"},
+ {file = "multidict-4.7.5-cp38-cp38-win_amd64.whl", hash = "sha256:544fae9261232a97102e27a926019100a9db75bec7b37feedd74b3aa82f29969"},
+ {file = "multidict-4.7.5.tar.gz", hash = "sha256:aee283c49601fa4c13adc64c09c978838a7e812f85377ae130a24d7198c0331e"},
+]
+opml = [
+ {file = "opml-0.5-py2.5.egg", hash = "sha256:9d92806e32068ae5eb2d8826b54d3eeaad1d57b9d6c9cbdc28b57369f85c1222"},
+ {file = "opml-0.5.tar.gz", hash = "sha256:db1eef2a251b8af33e2eabb62baf922006dbd8c66c742931090e331a0362a770"},
+]
+psycopg2-binary = [
+ {file = "psycopg2-binary-2.8.4.tar.gz", hash = "sha256:3a2522b1d9178575acee4adf8fd9f979f9c0449b00b4164bb63c3475ea6528ed"},
+ {file = "psycopg2_binary-2.8.4-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:890167d5091279a27e2505ff0e1fb273f8c48c41d35c5b92adbf4af80e6b2ed6"},
+ {file = "psycopg2_binary-2.8.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:dbc5cd56fff1a6152ca59445178652756f4e509f672e49ccdf3d79c1043113a4"},
+ {file = "psycopg2_binary-2.8.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:7f42a8490c4fe854325504ce7a6e4796b207960dabb2cbafe3c3959cb00d1d7e"},
+ {file = "psycopg2_binary-2.8.4-cp27-cp27m-win32.whl", hash = "sha256:8578d6b8192e4c805e85f187bc530d0f52ba86c39172e61cd51f68fddd648103"},
+ {file = "psycopg2_binary-2.8.4-cp27-cp27m-win_amd64.whl", hash = "sha256:5dd90c5438b4f935c9d01fcbad3620253da89d19c1f5fca9158646407ed7df35"},
+ {file = "psycopg2_binary-2.8.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:9aadff9032e967865f9778485571e93908d27dab21d0fdfdec0ca779bb6f8ad9"},
+ {file = "psycopg2_binary-2.8.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:659c815b5b8e2a55193ede2795c1e2349b8011497310bb936da7d4745652823b"},
+ {file = "psycopg2_binary-2.8.4-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:2166e770cb98f02ed5ee2b0b569d40db26788e0bf2ec3ae1a0d864ea6f1d8309"},
+ {file = "psycopg2_binary-2.8.4-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:7e6e3c52e6732c219c07bd97fff6c088f8df4dae3b79752ee3a817e6f32e177e"},
+ {file = "psycopg2_binary-2.8.4-cp34-cp34m-win32.whl", hash = "sha256:040234f8a4a8dfd692662a8308d78f63f31a97e1c42d2480e5e6810c48966a29"},
+ {file = "psycopg2_binary-2.8.4-cp34-cp34m-win_amd64.whl", hash = "sha256:69b13fdf12878b10dc6003acc8d0abf3ad93e79813fd5f3812497c1c9fb9be49"},
+ {file = "psycopg2_binary-2.8.4-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:19dc39616850342a2a6db70559af55b22955f86667b5f652f40c0e99253d9881"},
+ {file = "psycopg2_binary-2.8.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:9f24f383a298a0c0f9b3113b982e21751a8ecde6615494a3f1470eb4a9d70e9e"},
+ {file = "psycopg2_binary-2.8.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:eaed1c65f461a959284649e37b5051224f4db6ebdc84e40b5e65f2986f101a08"},
+ {file = "psycopg2_binary-2.8.4-cp35-cp35m-win32.whl", hash = "sha256:4c6717962247445b4f9e21c962ea61d2e884fc17df5ddf5e35863b016f8a1f03"},
+ {file = "psycopg2_binary-2.8.4-cp35-cp35m-win_amd64.whl", hash = "sha256:84156313f258eafff716b2961644a4483a9be44a5d43551d554844d15d4d224e"},
+ {file = "psycopg2_binary-2.8.4-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:3b5deaa3ee7180585a296af33e14c9b18c218d148e735c7accf78130765a47e3"},
+ {file = "psycopg2_binary-2.8.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5057669b6a66aa9ca118a2a860159f0ee3acf837eda937bdd2a64f3431361a2d"},
+ {file = "psycopg2_binary-2.8.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:afd96845e12638d2c44d213d4810a08f4dc4a563f9a98204b7428e567014b1cd"},
+ {file = "psycopg2_binary-2.8.4-cp36-cp36m-win32.whl", hash = "sha256:a73021b44813b5c84eda4a3af5826dd72356a900bac9bd9dd1f0f81ee1c22c2f"},
+ {file = "psycopg2_binary-2.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:407af6d7e46593415f216c7f56ba087a9a42bd6dc2ecb86028760aa45b802bd7"},
+ {file = "psycopg2_binary-2.8.4-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:3aa773580f85a28ffdf6f862e59cb5a3cc7ef6885121f2de3fca8d6ada4dbf3b"},
+ {file = "psycopg2_binary-2.8.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:eac8a3499754790187bb00574ab980df13e754777d346f85e0ff6df929bcd964"},
+ {file = "psycopg2_binary-2.8.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:7a1cb80e35e1ccea3e11a48afe65d38744a0e0bde88795cc56a4d05b6e4f9d70"},
+ {file = "psycopg2_binary-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:086f7e89ec85a6704db51f68f0dcae432eff9300809723a6e8782c41c2f48e03"},
+ {file = "psycopg2_binary-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:b73ddf033d8cd4cc9dfed6324b1ad2a89ba52c410ef6877998422fcb9c23e3a8"},
+ {file = "psycopg2_binary-2.8.4-cp38-cp38-macosx_10_9_x86_64.macosx_10_9_intel.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:4c3c09fb674401f630626310bcaf6cd6285daf0d5e4c26d6e55ca26a2734e39b"},
+ {file = "psycopg2_binary-2.8.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:18ca813fdb17bc1db73fe61b196b05dd1ca2165b884dd5ec5568877cabf9b039"},
+ {file = "psycopg2_binary-2.8.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:50446fae5681fc99f87e505d4e77c9407e683ab60c555ec302f9ac9bffa61103"},
+ {file = "psycopg2_binary-2.8.4-cp38-cp38-win32.whl", hash = "sha256:98e10634792ac0e9e7a92a76b4991b44c2325d3e7798270a808407355e7bb0a1"},
+ {file = "psycopg2_binary-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:b8f490f5fad1767a1331df1259763b3bad7d7af12a75b950c2843ba319b2415f"},
+]
+pydot = [
+ {file = "pydot-1.4.1-py2.py3-none-any.whl", hash = "sha256:67be714300c78fda5fd52f79ec994039e3f76f074948c67b5ff539b433ad354f"},
+ {file = "pydot-1.4.1.tar.gz", hash = "sha256:d49c9d4dd1913beec2a997f831543c8cbd53e535b1a739e921642fe416235f01"},
+]
+pyparsing = [
+ {file = "pyparsing-2.4.6-py2.py3-none-any.whl", hash = "sha256:c342dccb5250c08d45fd6f8b4a559613ca603b57498511740e65cd11a2e7dcec"},
+ {file = "pyparsing-2.4.6.tar.gz", hash = "sha256:4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f"},
+]
+python-dateutil = [
+ {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"},
+ {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"},
+]
+python-editor = [
+ {file = "python-editor-1.0.4.tar.gz", hash = "sha256:51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b"},
+ {file = "python_editor-1.0.4-py2-none-any.whl", hash = "sha256:5f98b069316ea1c2ed3f67e7f5df6c0d8f10b689964a4a811ff64f0106819ec8"},
+ {file = "python_editor-1.0.4-py2.7.egg", hash = "sha256:ea87e17f6ec459e780e4221f295411462e0d0810858e055fc514684350a2f522"},
+ {file = "python_editor-1.0.4-py3-none-any.whl", hash = "sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d"},
+ {file = "python_editor-1.0.4-py3.5.egg", hash = "sha256:c3da2053dbab6b29c94e43c486ff67206eafbe7eb52dbec7390b5e2fb05aac77"},
+]
+python-http-client = [
+ {file = "python_http_client-3.2.5.tar.gz", hash = "sha256:10bfbc7ecd25e55215680ce2827b1a3bf4e06ba4a59758039d047d6104b6f169"},
+]
+python-mimeparse = [
+ {file = "python-mimeparse-1.6.0.tar.gz", hash = "sha256:76e4b03d700a641fd7761d3cd4fdbbdcd787eade1ebfac43f877016328334f78"},
+ {file = "python_mimeparse-1.6.0-py2.py3-none-any.whl", hash = "sha256:a295f03ff20341491bfe4717a39cd0a8cc9afad619ba44b77e86b0ab8a2b8282"},
+]
+pytz = [
+ {file = "pytz-2019.3-py2.py3-none-any.whl", hash = "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d"},
+ {file = "pytz-2019.3.tar.gz", hash = "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"},
+]
+requests = [
+ {file = "requests-2.23.0-py2.py3-none-any.whl", hash = "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee"},
+ {file = "requests-2.23.0.tar.gz", hash = "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"},
+]
+requests-futures = [
+ {file = "requests-futures-1.0.0.tar.gz", hash = "sha256:35547502bf1958044716a03a2f47092a89efe8f9789ab0c4c528d9c9c30bc148"},
+]
+sendgrid = [
+ {file = "sendgrid-6.1.2-py3-none-any.whl", hash = "sha256:e2b8bd90522f22a22d2557aee9cb77d0c372a8c4ca35e65d062b4ecaf0b9a4bd"},
+ {file = "sendgrid-6.1.2-py3.6.egg", hash = "sha256:faa8105a36cc8a02be4f4bbe22816d1d1c8985bbc7cc9f8bb4195870d7cff7e5"},
+ {file = "sendgrid-6.1.2.tar.gz", hash = "sha256:8112a3e2edd4cef208ed46335f058d2782397b395b96a472dcfd5e2618cf621b"},
+]
+six = [
+ {file = "six-1.14.0-py2.py3-none-any.whl", hash = "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"},
+ {file = "six-1.14.0.tar.gz", hash = "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a"},
+]
+soupsieve = [
+ {file = "soupsieve-2.0-py2.py3-none-any.whl", hash = "sha256:fcd71e08c0aee99aca1b73f45478549ee7e7fc006d51b37bec9e9def7dc22b69"},
+ {file = "soupsieve-2.0.tar.gz", hash = "sha256:e914534802d7ffd233242b785229d5ba0766a7f487385e3f714446a07bf540ae"},
+]
+sqlalchemy = [
+ {file = "SQLAlchemy-1.3.13.tar.gz", hash = "sha256:64a7b71846db6423807e96820993fa12a03b89127d278290ca25c0b11ed7b4fb"},
+]
+sqlalchemy-schemadisplay = [
+ {file = "sqlalchemy_schemadisplay-1.3.tar.gz", hash = "sha256:0a9f26d77be9d92c9564d87cc17668fe141a816036c5f5d7c8cb053b253957e0"},
+ {file = "sqlalchemy_schemadisplay-1.3.zip", hash = "sha256:b38f0d5947bd3ed9e2b180b4d8c9cd44c9d09edc0ce26722d89be4cc264903b5"},
+]
+urllib3 = [
+ {file = "urllib3-1.25.8-py2.py3-none-any.whl", hash = "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc"},
+ {file = "urllib3-1.25.8.tar.gz", hash = "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc"},
+]
+werkzeug = [
+ {file = "Werkzeug-1.0.0-py2.py3-none-any.whl", hash = "sha256:6dc65cf9091cf750012f56f2cad759fa9e879f511b5ff8685e456b4e3bf90d16"},
+ {file = "Werkzeug-1.0.0.tar.gz", hash = "sha256:169ba8a33788476292d04186ab33b01d6add475033dfc07215e6d219cc077096"},
+]
+wtforms = [
+ {file = "WTForms-2.2.1-py2.py3-none-any.whl", hash = "sha256:e3ee092c827582c50877cdbd49e9ce6d2c5c1f6561f849b3b068c1b8029626f1"},
+ {file = "WTForms-2.2.1.tar.gz", hash = "sha256:0cdbac3e7f6878086c334aa25dc5a33869a3954e9d1e015130d65a69309b3b61"},
+]
+yarl = [
+ {file = "yarl-1.4.2-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:3ce3d4f7c6b69c4e4f0704b32eca8123b9c58ae91af740481aa57d7857b5e41b"},
+ {file = "yarl-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:a4844ebb2be14768f7994f2017f70aca39d658a96c786211be5ddbe1c68794c1"},
+ {file = "yarl-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:d8cdee92bc930d8b09d8bd2043cedd544d9c8bd7436a77678dd602467a993080"},
+ {file = "yarl-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:c2b509ac3d4b988ae8769901c66345425e361d518aecbe4acbfc2567e416626a"},
+ {file = "yarl-1.4.2-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:308b98b0c8cd1dfef1a0311dc5e38ae8f9b58349226aa0533f15a16717ad702f"},
+ {file = "yarl-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:944494be42fa630134bf907714d40207e646fd5a94423c90d5b514f7b0713fea"},
+ {file = "yarl-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:5b10eb0e7f044cf0b035112446b26a3a2946bca9d7d7edb5e54a2ad2f6652abb"},
+ {file = "yarl-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a161de7e50224e8e3de6e184707476b5a989037dcb24292b391a3d66ff158e70"},
+ {file = "yarl-1.4.2-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:26d7c90cb04dee1665282a5d1a998defc1a9e012fdca0f33396f81508f49696d"},
+ {file = "yarl-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0c2ab325d33f1b824734b3ef51d4d54a54e0e7a23d13b86974507602334c2cce"},
+ {file = "yarl-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:e15199cdb423316e15f108f51249e44eb156ae5dba232cb73be555324a1d49c2"},
+ {file = "yarl-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:2098a4b4b9d75ee352807a95cdf5f10180db903bc5b7270715c6bbe2551f64ce"},
+ {file = "yarl-1.4.2-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c9959d49a77b0e07559e579f38b2f3711c2b8716b8410b320bf9713013215a1b"},
+ {file = "yarl-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:25e66e5e2007c7a39541ca13b559cd8ebc2ad8fe00ea94a2aad28a9b1e44e5ae"},
+ {file = "yarl-1.4.2-cp38-cp38-win32.whl", hash = "sha256:6faa19d3824c21bcbfdfce5171e193c8b4ddafdf0ac3f129ccf0cdfcb083e462"},
+ {file = "yarl-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:0ca2f395591bbd85ddd50a82eb1fde9c1066fafe888c5c7cc1d810cf03fd3cc6"},
+ {file = "yarl-1.4.2.tar.gz", hash = "sha256:58cd9c469eced558cd81aa3f484b2924e8897049e06889e8ff2510435b7ef74b"},
+]
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 00000000..fb57d65e
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,44 @@
+[tool.poetry]
+name = "newspipe"
+version = "8.0.0"
+description = "Newspipe is a web-based news aggregator and reader."
+authors = ["Cédric Bonhomme <cedric@cedricbonhomme.org>"]
+license = "AGPL-3.0-or-later"
+
+[tool.poetry.dependencies]
+python = "^3.8"
+aiohttp = "^3.6.2"
+requests = "^2.23.0"
+chardet = "^3.0.4"
+requests-futures = "^1.0.0"
+feedparser = "^5.2.1"
+beautifulsoup4 = "^4.8.2"
+lxml = "^4.5.0"
+opml = "^0.5"
+SQLAlchemy = "^1.3.13"
+alembic = "^1.4.0"
+Flask = "^1.1.1"
+Flask-SQLAlchemy = "^2.4.1"
+Flask-Login = "^0.5.0"
+Flask-Principal = "^0.4.0"
+Flask-WTF = "^0.14.3"
+Flask-RESTful = "^0.3.8"
+Flask-Restless = "^0.17.0"
+Flask-paginate = "^0.5.5"
+Flask-Babel = "^1.0.0"
+Flask-SSLify = "^0.1.5"
+Flask-Migrate = "^2.5.2"
+Flask-Script = "^2.0.6"
+WTForms = "^2.2.1"
+sendgrid = "^6.1.2"
+python-dateutil = "^2.8.1"
+psycopg2-binary = "^2.8.4"
+
+
+
+[tool.poetry.dev-dependencies]
+sqlalchemy-schemadisplay = "^1.3"
+
+[build-system]
+requires = ["poetry>=0.12"]
+build-backend = "poetry.masonry.api"
diff --git a/runtime.txt b/runtime.txt
deleted file mode 100644
index 73b1cf81..00000000
--- a/runtime.txt
+++ /dev/null
@@ -1 +0,0 @@
-python-3.8.0
bgstack15