commit 905363dbea35422ece7833ea78e28090e1824fb7 Author: Llloooggg Date: Fri Sep 2 11:49:33 2022 +0300 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9c0dd89 --- /dev/null +++ b/.gitignore @@ -0,0 +1,252 @@ +# Created by https://www.toptal.com/developers/gitignore/api/flask,python +# Edit at https://www.toptal.com/developers/gitignore?templates=flask,python + +### Flask ### +instance/* +!instance/.gitignore +.webassets-cache +.env + +### Flask.Python Stack ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### Python ### +# Byte-compiled / optimized / DLL files + +# C extensions + +# Distribution / packaging + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. + +# Installer logs + +# Unit test / coverage reports + +# Translations + +# Django stuff: + +# Flask stuff: + +# Scrapy stuff: + +# Sphinx documentation + +# PyBuilder + +# Jupyter Notebook + +# IPython + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm + +# Celery stuff + +# SageMath parsed files + +# Environments + +# Spyder project settings + +# Rope project settings + +# mkdocs documentation + +# mypy + +# Pyre type checker + +# pytype static type analyzer + +# Cython debug symbols + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. + +# End of https://www.toptal.com/developers/gitignore/api/flask,python \ No newline at end of file diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..dde86c7 --- /dev/null +++ b/app/__init__.py @@ -0,0 +1,17 @@ +from flask import Flask +from flask_socketio import SocketIO + +socketio = SocketIO() + + +def create_app(debug=False): + app = Flask(__name__) + app.debug = debug + app.config["SECRET_KEY"] = "asdfkasidughap234alsif" + + from .main import main as main_blueprint + + app.register_blueprint(main_blueprint) + + socketio.init_app(app) + return app diff --git a/app/main/__init__.py b/app/main/__init__.py new file mode 100644 index 0000000..afaca04 --- /dev/null +++ b/app/main/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +main = Blueprint("main", __name__) + +from . import routes, events # noqa: F401 diff --git a/app/main/events.py b/app/main/events.py new file mode 100644 index 0000000..b22a693 --- /dev/null +++ b/app/main/events.py @@ -0,0 +1,29 @@ +import json + +import pyinotify + +from .. import socketio + +thread = None + + +class ModHandler(pyinotify.ProcessEvent): + def process_IN_CLOSE_WRITE(self, evt): + with open("data/data.json") as json_file: + data = json.load(json_file) + socketio.emit("file_updated", data) + + +def background_thread(): + handler = ModHandler() + wm = pyinotify.WatchManager() + notifier = pyinotify.Notifier(wm, handler) + wm.add_watch("data/data.json", pyinotify.IN_CLOSE_WRITE) + notifier.loop() + + +@socketio.on("connect") +def update_data(): + global thread + if thread is None: + thread = socketio.start_background_task(target=background_thread) diff --git a/app/main/routes.py b/app/main/routes.py new file mode 100644 index 0000000..30cd2a8 --- /dev/null +++ b/app/main/routes.py @@ -0,0 +1,8 @@ +from flask import render_template + +from . import main + + +@main.route("/") +def index(): + return render_template("index.html") diff --git a/app/templates/index.html b/app/templates/index.html new file mode 100644 index 0000000..f2d0b95 --- /dev/null +++ b/app/templates/index.html @@ -0,0 +1,11 @@ + + + diff --git a/data/data.json b/data/data.json new file mode 100644 index 0000000..1bbb719 --- /dev/null +++ b/data/data.json @@ -0,0 +1,3 @@ +{ + "data": "test" +} \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..73d01bb --- /dev/null +++ b/main.py @@ -0,0 +1,7 @@ +#!/bin/env python +from app import create_app, socketio + +app = create_app(debug=True) + +if __name__ == '__main__': + socketio.run(app) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5abac81 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,16 @@ +bidict==0.22.0 +click==8.1.3 +Flask==2.2.2 +Flask-SocketIO==5.3.0 +h11==0.13.0 +importlib-metadata==4.12.0 +itsdangerous==2.1.2 +Jinja2==3.1.2 +MarkupSafe==2.1.1 +pyinotify==0.9.6 +python-engineio==4.3.4 +python-socketio==5.7.1 +simple-websocket==0.8.0 +Werkzeug==2.2.2 +wsproto==1.2.0 +zipp==3.8.1