diff options
Diffstat (limited to 'nixpkgs/pkgs/development/python-modules/ihatemoney/remove_flask_script.patch')
-rw-r--r-- | nixpkgs/pkgs/development/python-modules/ihatemoney/remove_flask_script.patch | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/python-modules/ihatemoney/remove_flask_script.patch b/nixpkgs/pkgs/development/python-modules/ihatemoney/remove_flask_script.patch new file mode 100644 index 000000000000..dac59680a09c --- /dev/null +++ b/nixpkgs/pkgs/development/python-modules/ihatemoney/remove_flask_script.patch @@ -0,0 +1,284 @@ +commit 4d831ba2316d54f4916fb9d1160ec7a3856b47d4 +Author: Glandos <bugs-github@antipoul.fr> +Date: Sun Jun 6 14:30:52 2021 +0200 + + remove usage of Flask-Script + + Use flask.cli instead with compatibility layer for existing commands, + such as "runserver". + + cherry-pick from 74e222f1a1cbfc2fac102fefc1115e9d0a6586dc + +diff --git a/Makefile b/Makefile +index a681709..90ab1bb 100644 +--- a/Makefile ++++ b/Makefile +@@ -38,7 +38,7 @@ update: remove-install-stamp install ## Update the dependencies + .PHONY: serve + serve: install ## Run the ihatemoney server + @echo 'Running ihatemoney on http://localhost:5000' +- $(PYTHON) -m ihatemoney.manage runserver ++ $(PYTHON) -m ihatemoney.manage run + + .PHONY: test + test: install-dev ## Run the tests +diff --git a/docs/installation.rst b/docs/installation.rst +index 4994499..4df70a2 100644 +--- a/docs/installation.rst ++++ b/docs/installation.rst +@@ -59,7 +59,7 @@ Test it + + Once installed, you can start a test server:: + +- ihatemoney runserver ++ ihatemoney run + + And point your browser at `http://localhost:5000 <http://localhost:5000>`_. + +diff --git a/ihatemoney/manage.py b/ihatemoney/manage.py +index a192844..805a07f 100755 +--- a/ihatemoney/manage.py ++++ b/ihatemoney/manage.py +@@ -5,8 +5,8 @@ import os + import random + import sys + +-from flask_migrate import Migrate, MigrateCommand +-from flask_script import Command, Manager, Option ++import click ++from flask.cli import FlaskGroup + from werkzeug.security import generate_password_hash + + from ihatemoney.models import Project, db +@@ -14,31 +14,48 @@ from ihatemoney.run import create_app + from ihatemoney.utils import create_jinja_env + + +-class GeneratePasswordHash(Command): ++@click.group(cls=FlaskGroup, create_app=create_app) ++def cli(): ++ """IHateMoney Management script""" + +- """Get password from user and hash it without printing it in clear text.""" + +- def run(self): +- password = getpass.getpass(prompt="Password: ") +- print(generate_password_hash(password)) +- +- +-class GenerateConfig(Command): +- def get_options(self): +- return [ +- Option( +- "config_file", +- choices=[ +- "ihatemoney.cfg", +- "apache-vhost.conf", +- "gunicorn.conf.py", +- "supervisord.conf", +- "nginx.conf", +- ], +- ) ++@cli.command( ++ context_settings={"ignore_unknown_options": True, "allow_extra_args": True} ++) ++@click.pass_context ++def runserver(ctx): ++ """Deprecated, use the "run" command instead""" ++ click.secho( ++ '"runserver" is deprecated, please use the standard "run" flask command', ++ fg="red", ++ ) ++ run = cli.get_command(ctx, "run") ++ ctx.forward(run) ++ ++ ++@click.command(name="generate_password_hash") ++def password_hash(): ++ """Get password from user and hash it without printing it in clear text.""" ++ password = getpass.getpass(prompt="Password: ") ++ print(generate_password_hash(password)) ++ ++ ++@click.command() ++@click.argument( ++ "config_file", ++ type=click.Choice( ++ [ ++ "ihatemoney.cfg", ++ "apache-vhost.conf", ++ "gunicorn.conf.py", ++ "supervisord.conf", ++ "nginx.conf", + ] ++ ), ++) ++def generate_config(config_file): ++ """Generate front-end server configuration""" + +- @staticmethod + def gen_secret_key(): + return "".join( + [ +@@ -49,59 +66,33 @@ class GenerateConfig(Command): + ] + ) + +- def run(self, config_file): +- env = create_jinja_env("conf-templates", strict_rendering=True) +- template = env.get_template("%s.j2" % config_file) ++ env = create_jinja_env("conf-templates", strict_rendering=True) ++ template = env.get_template(f"{config_file}.j2") + +- bin_path = os.path.dirname(sys.executable) +- pkg_path = os.path.abspath(os.path.dirname(__file__)) ++ bin_path = os.path.dirname(sys.executable) ++ pkg_path = os.path.abspath(os.path.dirname(__file__)) + +- print( +- template.render( +- pkg_path=pkg_path, +- bin_path=bin_path, +- sys_prefix=sys.prefix, +- secret_key=self.gen_secret_key(), +- ) ++ print( ++ template.render( ++ pkg_path=pkg_path, ++ bin_path=bin_path, ++ sys_prefix=sys.prefix, ++ secret_key=gen_secret_key(), + ) +- +- +-class DeleteProject(Command): +- def run(self, project_name): +- demo_project = Project.query.get(project_name) +- db.session.delete(demo_project) ++ ) ++ ++ ++@cli.command() ++@click.argument("project_name") ++def delete_project(project_name): ++ """Delete a project""" ++ project = Project.query.get(project_name) ++ if project is None: ++ click.secho(f'Project "{project_name}" not found', fg="red") ++ else: ++ db.session.delete(project) + db.session.commit() + + +-def main(): +- QUIET_COMMANDS = ("generate_password_hash", "generate-config") +- +- exception = None +- backup_stderr = sys.stderr +- # Hack to divert stderr for commands generating content to stdout +- # to avoid confusing the user +- if len(sys.argv) > 1 and sys.argv[1] in QUIET_COMMANDS: +- sys.stderr = open(os.devnull, "w") +- +- try: +- app = create_app() +- Migrate(app, db) +- except Exception as e: +- exception = e +- +- # Restore stderr +- sys.stderr = backup_stderr +- +- if exception: +- raise exception +- +- manager = Manager(app) +- manager.add_command("db", MigrateCommand) +- manager.add_command("generate_password_hash", GeneratePasswordHash) +- manager.add_command("generate-config", GenerateConfig) +- manager.add_command("delete-project", DeleteProject) +- manager.run() +- +- + if __name__ == "__main__": +- main() ++ cli() +diff --git a/ihatemoney/tests/tests.py b/ihatemoney/tests/tests.py +index b27fafc..23f19a6 100644 +--- a/ihatemoney/tests/tests.py ++++ b/ihatemoney/tests/tests.py +@@ -15,7 +15,7 @@ from sqlalchemy import orm + from werkzeug.security import check_password_hash, generate_password_hash + + from ihatemoney import history, models, utils +-from ihatemoney.manage import DeleteProject, GenerateConfig, GeneratePasswordHash ++from ihatemoney.manage import delete_project, generate_config, password_hash + from ihatemoney.run import create_app, db, load_configuration + from ihatemoney.versioning import LoggingMode + +@@ -2157,28 +2157,24 @@ class CommandTestCase(BaseTestCase): + - raise no exception + - produce something non-empty + """ +- cmd = GenerateConfig() +- for config_file in cmd.get_options()[0].kwargs["choices"]: +- with patch("sys.stdout", new=io.StringIO()) as stdout: +- cmd.run(config_file) +- print(stdout.getvalue()) +- self.assertNotEqual(len(stdout.getvalue().strip()), 0) ++ runner = self.app.test_cli_runner() ++ for config_file in generate_config.params[0].type.choices: ++ result = runner.invoke(generate_config, config_file) ++ self.assertNotEqual(len(result.output.strip()), 0) + + def test_generate_password_hash(self): +- cmd = GeneratePasswordHash() +- with patch("sys.stdout", new=io.StringIO()) as stdout, patch( +- "getpass.getpass", new=lambda prompt: "secret" +- ): # NOQA +- cmd.run() +- print(stdout.getvalue()) +- self.assertEqual(len(stdout.getvalue().strip()), 189) ++ runner = self.app.test_cli_runner() ++ with patch("getpass.getpass", new=lambda prompt: "secret"): ++ result = runner.invoke(password_hash) ++ print(result.output.strip()) ++ self.assertEqual(len(result.output.strip()), 102) + + def test_demo_project_deletion(self): + self.create_project("demo") + self.assertEquals(models.Project.query.get("demo").name, "demo") + +- cmd = DeleteProject() +- cmd.run("demo") ++ runner = self.app.test_cli_runner() ++ runner.invoke(delete_project, "demo") + + self.assertEqual(len(models.Project.query.all()), 0) + +diff --git a/setup.cfg b/setup.cfg +index d493717..48e447c 100644 +--- a/setup.cfg ++++ b/setup.cfg +@@ -31,7 +31,6 @@ install_requires = + Flask-Mail==0.9.1 + Flask-Migrate==2.5.3 + Flask-RESTful==0.3.8 +- Flask-Script==2.0.6 + Flask-SQLAlchemy==2.4.1 + Flask-WTF==0.14.3 + WTForms==2.2.1 +@@ -51,8 +50,12 @@ dev = + zest.releaser==6.20.1 + + [options.entry_points] ++flask.commands = ++ generate_password_hash = ihatemoney.manage:password_hash ++ generate-config = ihatemoney.manage:generate_config ++ + console_scripts = +- ihatemoney = ihatemoney.manage:main ++ ihatemoney = ihatemoney.manage:cli + + paste.app_factory = + main = ihatemoney.run:main |