From fa19c9480c817ee263e60f1592ee197e085ea8e7 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 3 Sep 2020 17:01:24 +0200 Subject: [PATCH 1/4] Cleanup unused imports / misc 'fatal' flake8 errors --- data/hooks/diagnosis/14-ports.py | 1 - data/hooks/diagnosis/21-web.py | 1 - data/hooks/diagnosis/70-regenconf.py | 1 - src/yunohost/app.py | 2 +- src/yunohost/backup.py | 6 ++---- .../data_migrations/0016_php70_to_php73_pools.py | 2 +- .../data_migrations/0017_postgresql_9p6_to_11.py | 2 +- src/yunohost/firewall.py | 1 - src/yunohost/permission.py | 1 - src/yunohost/regenconf.py | 2 -- src/yunohost/tests/test_appscatalog.py | 2 +- src/yunohost/tests/test_permission.py | 12 +----------- src/yunohost/tests/test_settings.py | 4 ++-- src/yunohost/tools.py | 8 +++----- src/yunohost/user.py | 3 --- src/yunohost/utils/password.py | 6 +----- tests/remove_stale_translated_strings.py | 1 - 17 files changed, 13 insertions(+), 42 deletions(-) diff --git a/data/hooks/diagnosis/14-ports.py b/data/hooks/diagnosis/14-ports.py index 38f6e0089..eec2e5f03 100644 --- a/data/hooks/diagnosis/14-ports.py +++ b/data/hooks/diagnosis/14-ports.py @@ -3,7 +3,6 @@ import os from yunohost.diagnosis import Diagnoser -from yunohost.utils.error import YunohostError from yunohost.service import _get_services class PortsDiagnoser(Diagnoser): diff --git a/data/hooks/diagnosis/21-web.py b/data/hooks/diagnosis/21-web.py index c1f6d912a..94665a6e6 100644 --- a/data/hooks/diagnosis/21-web.py +++ b/data/hooks/diagnosis/21-web.py @@ -8,7 +8,6 @@ from moulinette.utils.filesystem import read_file from yunohost.diagnosis import Diagnoser from yunohost.domain import domain_list -from yunohost.utils.error import YunohostError DIAGNOSIS_SERVER = "diagnosis.yunohost.org" diff --git a/data/hooks/diagnosis/70-regenconf.py b/data/hooks/diagnosis/70-regenconf.py index 0dff71b5b..396f64a0f 100644 --- a/data/hooks/diagnosis/70-regenconf.py +++ b/data/hooks/diagnosis/70-regenconf.py @@ -2,7 +2,6 @@ import os -import subprocess from yunohost.diagnosis import Diagnoser from yunohost.regenconf import _get_regenconf_infos, _calculate_hash diff --git a/src/yunohost/app.py b/src/yunohost/app.py index f9f31c64a..0caa9d5e1 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -681,7 +681,7 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu from yunohost.hook import hook_add, hook_remove, hook_exec, hook_callback from yunohost.log import OperationLogger - from yunohost.permission import user_permission_list, permission_create, permission_url, permission_delete, permission_sync_to_user, user_permission_update + from yunohost.permission import user_permission_list, permission_create, permission_url, permission_delete, permission_sync_to_user from yunohost.regenconf import manually_modified_files # Fetch or extract sources diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index bfe958a89..14d96f45c 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -894,8 +894,6 @@ class RestoreManager(): """ from permission import permission_sync_to_user - successfull_apps = self.targets.list("apps", include=["Success", "Warning"]) - permission_sync_to_user() if os.path.ismount(self.work_dir): @@ -1160,7 +1158,7 @@ class RestoreManager(): return from yunohost.user import user_group_list - from yunohost.permission import permission_create, permission_delete, user_permission_update, user_permission_list, permission_sync_to_user + from yunohost.permission import permission_create, permission_delete, user_permission_list, permission_sync_to_user # Backup old permission for apps # We need to do that because in case of an app is installed we can't remove the permission for this app @@ -1257,7 +1255,7 @@ class RestoreManager(): name should be already install) """ from yunohost.user import user_group_list - from yunohost.permission import permission_create, permission_delete, user_permission_list, user_permission_update, permission_sync_to_user + from yunohost.permission import permission_create, permission_delete, user_permission_list, permission_sync_to_user def copytree(src, dst, symlinks=False, ignore=None): for item in os.listdir(src): diff --git a/src/yunohost/data_migrations/0016_php70_to_php73_pools.py b/src/yunohost/data_migrations/0016_php70_to_php73_pools.py index 1cdb2bc4d..73875d359 100644 --- a/src/yunohost/data_migrations/0016_php70_to_php73_pools.py +++ b/src/yunohost/data_migrations/0016_php70_to_php73_pools.py @@ -4,7 +4,7 @@ from shutil import copy2 from moulinette.utils.log import getActionLogger -from yunohost.app import _is_installed, _get_app_settings, _set_app_settings, _patch_legacy_php_versions_in_settings +from yunohost.app import _is_installed, _patch_legacy_php_versions_in_settings from yunohost.tools import Migration from yunohost.service import _run_service_command diff --git a/src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py b/src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py index 955393c5b..3cb904613 100644 --- a/src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py +++ b/src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py @@ -28,7 +28,7 @@ class MyMigration(Migration): # Make sure there's a 9.6 cluster try: self.runcmd("pg_lsclusters | grep -q '^9.6 '") - except Exception as e: + except Exception: logger.warning("It looks like there's not active 9.6 cluster, so probably don't need to run this migration") return diff --git a/src/yunohost/firewall.py b/src/yunohost/firewall.py index 4c3cfb0f7..c17e958e7 100644 --- a/src/yunohost/firewall.py +++ b/src/yunohost/firewall.py @@ -24,7 +24,6 @@ Manage firewall rules """ import os -import sys import yaml import miniupnpc diff --git a/src/yunohost/permission.py b/src/yunohost/permission.py index 67a0f57b0..cd81489a2 100644 --- a/src/yunohost/permission.py +++ b/src/yunohost/permission.py @@ -31,7 +31,6 @@ import random from moulinette import m18n from moulinette.utils.log import getActionLogger from yunohost.utils.error import YunohostError -from yunohost.user import user_list from yunohost.log import is_unit_operation logger = getActionLogger('yunohost.user') diff --git a/src/yunohost/regenconf.py b/src/yunohost/regenconf.py index 6c9b10aac..7f4f73247 100644 --- a/src/yunohost/regenconf.py +++ b/src/yunohost/regenconf.py @@ -21,7 +21,6 @@ import os import yaml -import json import subprocess import shutil import hashlib @@ -31,7 +30,6 @@ from datetime import datetime from moulinette import m18n from moulinette.utils import log, filesystem -from moulinette.utils.filesystem import read_file from yunohost.utils.error import YunohostError from yunohost.log import is_unit_operation diff --git a/src/yunohost/tests/test_appscatalog.py b/src/yunohost/tests/test_appscatalog.py index 40cf1489f..d9f0c14e5 100644 --- a/src/yunohost/tests/test_appscatalog.py +++ b/src/yunohost/tests/test_appscatalog.py @@ -6,7 +6,7 @@ import glob import shutil from moulinette import m18n -from moulinette.utils.filesystem import read_json, write_to_json, write_to_yaml, mkdir +from moulinette.utils.filesystem import read_json, write_to_json, write_to_yaml from yunohost.utils.error import YunohostError from yunohost.app import (_initialize_apps_catalog_system, diff --git a/src/yunohost/tests/test_permission.py b/src/yunohost/tests/test_permission.py index 82ec151f3..4dfc1ce6b 100644 --- a/src/yunohost/tests/test_permission.py +++ b/src/yunohost/tests/test_permission.py @@ -4,7 +4,7 @@ import os from conftest import message, raiseYunohostError, get_test_apps_dir -from yunohost.app import app_install, app_remove, app_change_url, app_list, app_map, _installed_apps +from yunohost.app import app_install, app_remove, app_change_url, app_map, _installed_apps from yunohost.user import user_list, user_create, user_delete, \ user_group_list, user_group_delete from yunohost.permission import user_permission_update, user_permission_list, user_permission_reset, \ @@ -370,16 +370,6 @@ def test_permission_reset_idempotency(): assert set(res['blog.main']['corresponding_users']) == set(["alice", "bob"]) -def test_permission_reset_idempotency(): - # Reset permission - user_permission_reset("blog.main") - user_permission_reset("blog.main") - - res = user_permission_list(full=True)['permissions'] - assert res['blog.main']['allowed'] == ["all_users"] - assert set(res['blog.main']['corresponding_users']) == set(["alice", "bob"]) - - # # Error on update function # diff --git a/src/yunohost/tests/test_settings.py b/src/yunohost/tests/test_settings.py index 3fdfce67c..c7105fd1b 100644 --- a/src/yunohost/tests/test_settings.py +++ b/src/yunohost/tests/test_settings.py @@ -64,10 +64,10 @@ def test_settings_list(): def test_settings_set(): settings_set("example.bool", False) - assert settings_get("example.bool") == False + assert settings_get("example.bool") is False settings_set("example.bool", "on") - assert settings_get("example.bool") == True + assert settings_get("example.bool") is True def test_settings_set_int(): settings_set("example.int", 21) diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index b6d45b03c..2e90b38ee 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -26,10 +26,8 @@ import re import os import yaml -import json import subprocess import pwd -import socket from importlib import import_module from moulinette import msignals, m18n @@ -37,8 +35,8 @@ from moulinette.utils.log import getActionLogger from moulinette.utils.process import check_output, call_async_output from moulinette.utils.filesystem import read_json, write_to_json, read_yaml, write_to_yaml -from yunohost.app import _update_apps_catalog, app_info, app_upgrade, app_ssowatconf, app_list, _initialize_apps_catalog_system -from yunohost.domain import domain_add, domain_list +from yunohost.app import _update_apps_catalog, app_info, app_upgrade, _initialize_apps_catalog_system +from yunohost.domain import domain_add from yunohost.dyndns import _dyndns_available, _dyndns_provides from yunohost.firewall import firewall_upnp from yunohost.service import service_start, service_enable @@ -118,7 +116,7 @@ def tools_ldapinit(): if not os.path.isdir('/home/{0}'.format("admin")): logger.warning(m18n.n('user_home_creation_failed'), exc_info=1) - + logger.success(m18n.n('ldap_initialized')) diff --git a/src/yunohost/user.py b/src/yunohost/user.py index d19da177c..35b316859 100644 --- a/src/yunohost/user.py +++ b/src/yunohost/user.py @@ -27,7 +27,6 @@ import os import re import pwd import grp -import json import crypt import random import string @@ -36,7 +35,6 @@ import copy from moulinette import m18n from moulinette.utils.log import getActionLogger -from moulinette.utils.filesystem import read_json, write_to_json, read_yaml, write_to_yaml from yunohost.utils.error import YunohostError from yunohost.service import service_status @@ -239,7 +237,6 @@ def user_delete(operation_logger, username, purge=False): """ from yunohost.hook import hook_callback from yunohost.utils.ldap import _get_ldap_interface - from yunohost.permission import permission_sync_to_user if username not in user_list()["users"]: raise YunohostError('user_unknown', user=username) diff --git a/src/yunohost/utils/password.py b/src/yunohost/utils/password.py index b4f7025f7..e7ff6c275 100644 --- a/src/yunohost/utils/password.py +++ b/src/yunohost/utils/password.py @@ -63,7 +63,7 @@ class PasswordValidator(object): settings = json.load(open('/etc/yunohost/settings.json', "r")) setting_key = "security.password." + profile + ".strength" self.validation_strength = int(settings[setting_key]["value"]) - except Exception as e: + except Exception: # Fallback to default value if we can't fetch settings for some reason self.validation_strength = 1 @@ -83,11 +83,7 @@ class PasswordValidator(object): # on top (at least not the moulinette ones) # because the moulinette needs to be correctly initialized # as well as modules available in python's path. - import logging from yunohost.utils.error import YunohostError - from moulinette.utils.log import getActionLogger - - logger = logging.getLogger('yunohost.utils.password') status, msg = self.validation_summary(password) if status == "error": diff --git a/tests/remove_stale_translated_strings.py b/tests/remove_stale_translated_strings.py index 0213bc2be..4e39f131e 100644 --- a/tests/remove_stale_translated_strings.py +++ b/tests/remove_stale_translated_strings.py @@ -1,4 +1,3 @@ -import re import json import glob from collections import OrderedDict From ecbd63636b572750144258428b715d092317a4eb Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 3 Sep 2020 17:07:39 +0200 Subject: [PATCH 2/4] autopep8 --in-place -a -a -a -a -a -r data/ doc/ tests/ src/yunohost/tests/ src/yunohost/utils/ src/yunohost/data_migrations/ --- data/actionsmap/yunohost_completion.py | 10 +- data/hooks/diagnosis/00-basesystem.py | 5 +- data/hooks/diagnosis/14-ports.py | 1 + data/hooks/diagnosis/24-mail.py | 6 +- data/hooks/diagnosis/30-services.py | 2 + data/hooks/diagnosis/50-systemresources.py | 10 +- doc/generate_helper_doc.py | 37 ++-- .../0017_postgresql_9p6_to_11.py | 3 +- .../data_migrations/0018_xtable_to_nftable.py | 1 - src/yunohost/tests/conftest.py | 6 +- .../tests/test_apps_arguments_parsing.py | 176 +++++++++--------- src/yunohost/tests/test_appscatalog.py | 4 +- src/yunohost/tests/test_backuprestore.py | 37 ++-- src/yunohost/tests/test_changeurl.py | 1 + src/yunohost/tests/test_permission.py | 17 +- src/yunohost/tests/test_regenconf.py | 3 +- src/yunohost/tests/test_service.py | 2 + src/yunohost/tests/test_settings.py | 2 + src/yunohost/tests/test_user-group.py | 4 +- src/yunohost/utils/error.py | 4 +- src/yunohost/utils/ldap.py | 16 +- src/yunohost/utils/network.py | 1 + src/yunohost/utils/yunopaste.py | 2 +- tests/remove_stale_translated_strings.py | 2 +- tests/test_actionmap.py | 1 + 25 files changed, 189 insertions(+), 164 deletions(-) diff --git a/data/actionsmap/yunohost_completion.py b/data/actionsmap/yunohost_completion.py index 45d15f16c..f4fee30ca 100644 --- a/data/actionsmap/yunohost_completion.py +++ b/data/actionsmap/yunohost_completion.py @@ -15,15 +15,17 @@ THIS_SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) ACTIONSMAP_FILE = THIS_SCRIPT_DIR + '/yunohost.yml' BASH_COMPLETION_FILE = THIS_SCRIPT_DIR + '/../bash-completion.d/yunohost' + def get_dict_actions(OPTION_SUBTREE, category): ACTIONS = [action for action in OPTION_SUBTREE[category]["actions"].keys() - if not action.startswith('_')] + if not action.startswith('_')] ACTIONS_STR = '{}'.format(' '.join(ACTIONS)) - DICT = { "actions_str": ACTIONS_STR } + DICT = {"actions_str": ACTIONS_STR} return DICT + with open(ACTIONSMAP_FILE, 'r') as stream: # Getting the dictionary containning what actions are possible per category @@ -40,10 +42,10 @@ with open(ACTIONSMAP_FILE, 'r') as stream: ACTIONS_DICT[category]["subcategories_str"] = "" if "subcategories" in OPTION_TREE[category].keys(): - SUBCATEGORIES = [ subcategory for subcategory in OPTION_TREE[category]["subcategories"].keys() ] + SUBCATEGORIES = [subcategory for subcategory in OPTION_TREE[category]["subcategories"].keys()] SUBCATEGORIES_STR = '{}'.format(' '.join(SUBCATEGORIES)) - + ACTIONS_DICT[category]["subcategories_str"] = SUBCATEGORIES_STR for subcategory in SUBCATEGORIES: diff --git a/data/hooks/diagnosis/00-basesystem.py b/data/hooks/diagnosis/00-basesystem.py index ec802c870..8773f8b53 100644 --- a/data/hooks/diagnosis/00-basesystem.py +++ b/data/hooks/diagnosis/00-basesystem.py @@ -63,10 +63,10 @@ class BaseSystemDiagnoser(Diagnoser): ynh_core_version = ynh_packages["yunohost"]["version"] consistent_versions = all(infos["version"][:3] == ynh_core_version[:3] for infos in ynh_packages.values()) ynh_version_details = [("diagnosis_basesystem_ynh_single_version", - {"package":package, + {"package": package, "version": infos["version"], "repo": infos["repo"]} - ) + ) for package, infos in ynh_packages.items()] yield dict(meta={"test": "ynh_versions"}, @@ -75,7 +75,6 @@ class BaseSystemDiagnoser(Diagnoser): summary="diagnosis_basesystem_ynh_main_version" if consistent_versions else "diagnosis_basesystem_ynh_inconsistent_versions", details=ynh_version_details) - if self.is_vulnerable_to_meltdown(): yield dict(meta={"test": "meltdown"}, status="ERROR", diff --git a/data/hooks/diagnosis/14-ports.py b/data/hooks/diagnosis/14-ports.py index eec2e5f03..b74b3907e 100644 --- a/data/hooks/diagnosis/14-ports.py +++ b/data/hooks/diagnosis/14-ports.py @@ -5,6 +5,7 @@ import os from yunohost.diagnosis import Diagnoser from yunohost.service import _get_services + class PortsDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] diff --git a/data/hooks/diagnosis/24-mail.py b/data/hooks/diagnosis/24-mail.py index a483e676d..fca9345ab 100644 --- a/data/hooks/diagnosis/24-mail.py +++ b/data/hooks/diagnosis/24-mail.py @@ -47,7 +47,6 @@ class MailDiagnoser(Diagnoser): status="SUCCESS", summary="diagnosis_mail_" + name + "_ok") - def check_outgoing_port_25(self): """ Check outgoing port 25 is open and not blocked by router @@ -64,7 +63,6 @@ class MailDiagnoser(Diagnoser): details=["diagnosis_mail_outgoing_port_25_blocked_details", "diagnosis_mail_outgoing_port_25_blocked_relay_vpn"]) - def check_ehlo(self): """ Check the server is reachable from outside and it's the good one @@ -99,7 +97,6 @@ class MailDiagnoser(Diagnoser): summary="diagnosis_mail_ehlo_wrong", details=["diagnosis_mail_ehlo_wrong_details"]) - def check_fcrdns(self): """ Check the reverse DNS is well defined by doing a Forward-confirmed @@ -148,7 +145,6 @@ class MailDiagnoser(Diagnoser): summary="diagnosis_mail_fcrdns_different_from_ehlo_domain", details=details) - def check_blacklist(self): """ Check with dig onto blacklist DNS server @@ -225,7 +221,6 @@ class MailDiagnoser(Diagnoser): status="SUCCESS", summary="diagnosis_mail_queue_ok") - def get_ips_checked(self): outgoing_ipversions = [] outgoing_ips = [] @@ -245,5 +240,6 @@ class MailDiagnoser(Diagnoser): outgoing_ips.append(global_ipv6) return (outgoing_ipversions, outgoing_ips) + def main(args, env, loggers): return MailDiagnoser(args, env, loggers).diagnose() diff --git a/data/hooks/diagnosis/30-services.py b/data/hooks/diagnosis/30-services.py index d0fe50ae9..562d48d6d 100644 --- a/data/hooks/diagnosis/30-services.py +++ b/data/hooks/diagnosis/30-services.py @@ -5,6 +5,7 @@ import os from yunohost.diagnosis import Diagnoser from yunohost.service import service_status + class ServicesDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] @@ -36,5 +37,6 @@ class ServicesDiagnoser(Diagnoser): yield item + def main(args, env, loggers): return ServicesDiagnoser(args, env, loggers).diagnose() diff --git a/data/hooks/diagnosis/50-systemresources.py b/data/hooks/diagnosis/50-systemresources.py index 6960b9bf0..00e5ee84a 100644 --- a/data/hooks/diagnosis/50-systemresources.py +++ b/data/hooks/diagnosis/50-systemresources.py @@ -7,6 +7,7 @@ import re from yunohost.diagnosis import Diagnoser + class SystemResourcesDiagnoser(Diagnoser): id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] @@ -16,7 +17,7 @@ class SystemResourcesDiagnoser(Diagnoser): def run(self): MB = 1024**2 - GB = MB*1024 + GB = MB * 1024 # # RAM @@ -79,7 +80,7 @@ class SystemResourcesDiagnoser(Diagnoser): # N.B.: we do not use usage.total because we want # to take into account the 5% security margin # correctly (c.f. the doc of psutil ...) - "total": human_size(usage.used+usage.free), + "total": human_size(usage.used + usage.free), "free": human_size(usage.free), "free_percent": free_percent}) @@ -96,7 +97,6 @@ class SystemResourcesDiagnoser(Diagnoser): item["status"] = "SUCCESS" item["summary"] = "diagnosis_diskusage_ok" - yield item # @@ -112,7 +112,6 @@ class SystemResourcesDiagnoser(Diagnoser): summary="diagnosis_processes_killed_by_oom_reaper", data={"kills_summary": kills_summary}) - def recent_kills_by_oom_reaper(self): if not os.path.exists("/var/log/kern.log"): return [] @@ -145,7 +144,7 @@ class SystemResourcesDiagnoser(Diagnoser): def human_size(bytes_): # Adapted from https://stackoverflow.com/a/1094933 - for unit in ['','ki','Mi','Gi','Ti','Pi','Ei','Zi']: + for unit in ['', 'ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi']: if abs(bytes_) < 1024.0: return "%s %sB" % (round_(bytes_), unit) bytes_ /= 1024.0 @@ -160,5 +159,6 @@ def round_(n): n = int(round(n)) return n + def main(args, env, loggers): return SystemResourcesDiagnoser(args, env, loggers).diagnose() diff --git a/doc/generate_helper_doc.py b/doc/generate_helper_doc.py index a7866b85b..a97d424eb 100644 --- a/doc/generate_helper_doc.py +++ b/doc/generate_helper_doc.py @@ -4,12 +4,13 @@ import os import glob import datetime + def render(helpers): - data = { "helpers": helpers, - "date": datetime.datetime.now().strftime("%m/%d/%Y"), - "version": open("../debian/changelog").readlines()[0].split()[1].strip("()") - } + data = {"helpers": helpers, + "date": datetime.datetime.now().strftime("%m/%d/%Y"), + "version": open("../debian/changelog").readlines()[0].split()[1].strip("()") + } from jinja2 import Template from ansi2html import Ansi2HTMLConverter @@ -22,13 +23,14 @@ def render(helpers): return conv.convert(shell, False) template = open("helper_doc_template.html", "r").read() - t = Template(template) + t = Template(template) t.globals['now'] = datetime.datetime.utcnow result = t.render(data=data, convert=shell_to_html, shell_css=shell_css) open("helpers.html", "w").write(result) ############################################################################## + class Parser(): def __init__(self, filename): @@ -42,15 +44,15 @@ class Parser(): self.blocks = [] current_reading = "void" - current_block = { "name": None, - "line": -1, - "comments": [], - "code": [] } + current_block = {"name": None, + "line": -1, + "comments": [], + "code": []} for i, line in enumerate(self.file): if line.startswith("#!/bin/bash"): - continue + continue line = line.rstrip().replace("\t", " ") @@ -73,7 +75,7 @@ class Parser(): elif line.strip() == "": # Well eh that was not an actual helper definition ... start over ? current_reading = "void" - current_block = { "name": None, + current_block = {"name": None, "line": -1, "comments": [], "code": [] @@ -101,10 +103,10 @@ class Parser(): # (we ignore helpers containing [internal] ...) if not "[internal]" in current_block["comments"]: self.blocks.append(current_block) - current_block = { "name": None, - "line": -1, - "comments": [], - "code": [] } + current_block = {"name": None, + "line": -1, + "comments": [], + "code": []} else: current_block["code"].append(line) @@ -180,13 +182,14 @@ class Parser(): b["usage"] = b["usage"].strip() - def is_global_comment(line): return line.startswith('#') + def malformed_error(line_number): return "Malformed file line {} ?".format(line_number) + def main(): helper_files = sorted(glob.glob("../data/helpers.d/*")) @@ -204,5 +207,5 @@ def main(): render(helpers) -main() +main() diff --git a/src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py b/src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py index 3cb904613..b81cbd8be 100644 --- a/src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py +++ b/src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py @@ -36,7 +36,7 @@ class MyMigration(Migration): raise YunohostError("migration_0017_not_enough_space", path="/var/lib/postgresql/") self.runcmd("systemctl stop postgresql") - self.runcmd("pg_dropcluster --stop 11 main || true") # We do not trigger an exception if the command fails because that probably means cluster 11 doesn't exists, which is fine because it's created during the pg_upgradecluster) + self.runcmd("pg_dropcluster --stop 11 main || true") # We do not trigger an exception if the command fails because that probably means cluster 11 doesn't exists, which is fine because it's created during the pg_upgradecluster) self.runcmd("pg_upgradecluster -m upgrade 9.6 main") self.runcmd("pg_dropcluster --stop 9.6 main") self.runcmd("systemctl start postgresql") @@ -63,4 +63,3 @@ class MyMigration(Migration): out = out.strip().split("\n") return (returncode, out, err) - diff --git a/src/yunohost/data_migrations/0018_xtable_to_nftable.py b/src/yunohost/data_migrations/0018_xtable_to_nftable.py index 2f931a6ef..8a7e11412 100644 --- a/src/yunohost/data_migrations/0018_xtable_to_nftable.py +++ b/src/yunohost/data_migrations/0018_xtable_to_nftable.py @@ -106,4 +106,3 @@ class MyMigration(Migration): out = out.strip().split("\n") return (returncode, out, err) - diff --git a/src/yunohost/tests/conftest.py b/src/yunohost/tests/conftest.py index 1bfbd0cec..2bda72852 100644 --- a/src/yunohost/tests/conftest.py +++ b/src/yunohost/tests/conftest.py @@ -18,10 +18,12 @@ def clone_test_app(request): else: os.system("cd %s/apps && git pull > /dev/null 2>&1" % cwd) + def get_test_apps_dir(): cwd = os.path.split(os.path.realpath(__file__))[0] return os.path.join(cwd, "apps") + @contextmanager def message(mocker, key, **kwargs): mocker.spy(m18n, "n") @@ -38,7 +40,6 @@ def raiseYunohostError(mocker, key, **kwargs): assert e_info._excinfo[1].kwargs == kwargs - def pytest_addoption(parser): parser.addoption("--yunodebug", action="store_true", default=False) @@ -56,12 +57,15 @@ def new_translate(self, key, *args, **kwargs): raise KeyError("Unable to retrieve key %s for default locale !" % key) return old_translate(self, key, *args, **kwargs) + + moulinette.core.Translator.translate = new_translate def new_m18nn(self, key, *args, **kwargs): return self._namespaces[self._current_namespace].translate(key, *args, **kwargs) + moulinette.core.Moulinette18n.n = new_m18nn # diff --git a/src/yunohost/tests/test_apps_arguments_parsing.py b/src/yunohost/tests/test_apps_arguments_parsing.py index a3d5b7f09..03ed9e93a 100644 --- a/src/yunohost/tests/test_apps_arguments_parsing.py +++ b/src/yunohost/tests/test_apps_arguments_parsing.py @@ -40,21 +40,21 @@ def test_parse_args_in_yunohost_format_empty(): def test_parse_args_in_yunohost_format_string(): - questions = [{"name": "some_string", "type": "string",}] + questions = [{"name": "some_string", "type": "string", }] answers = {"some_string": "some_value"} expected_result = OrderedDict({"some_string": ("some_value", "string")}) assert _parse_args_in_yunohost_format(answers, questions) == expected_result def test_parse_args_in_yunohost_format_string_default_type(): - questions = [{"name": "some_string",}] + questions = [{"name": "some_string", }] answers = {"some_string": "some_value"} expected_result = OrderedDict({"some_string": ("some_value", "string")}) assert _parse_args_in_yunohost_format(answers, questions) == expected_result def test_parse_args_in_yunohost_format_string_no_input(): - questions = [{"name": "some_string",}] + questions = [{"name": "some_string", }] answers = {} with pytest.raises(YunohostError): @@ -62,7 +62,7 @@ def test_parse_args_in_yunohost_format_string_no_input(): def test_parse_args_in_yunohost_format_string_input(): - questions = [{"name": "some_string", "ask": "some question",}] + questions = [{"name": "some_string", "ask": "some question", }] answers = {} expected_result = OrderedDict({"some_string": ("some_value", "string")}) @@ -72,7 +72,7 @@ def test_parse_args_in_yunohost_format_string_input(): @pytest.mark.skip # that shit should work x( def test_parse_args_in_yunohost_format_string_input_no_ask(): - questions = [{"name": "some_string",}] + questions = [{"name": "some_string", }] answers = {} expected_result = OrderedDict({"some_string": ("some_value", "string")}) @@ -81,14 +81,14 @@ def test_parse_args_in_yunohost_format_string_input_no_ask(): def test_parse_args_in_yunohost_format_string_no_input_optional(): - questions = [{"name": "some_string", "optional": True,}] + questions = [{"name": "some_string", "optional": True, }] answers = {} expected_result = OrderedDict({"some_string": ("", "string")}) assert _parse_args_in_yunohost_format(answers, questions) == expected_result def test_parse_args_in_yunohost_format_string_optional_with_input(): - questions = [{"name": "some_string", "ask": "some question", "optional": True,}] + questions = [{"name": "some_string", "ask": "some question", "optional": True, }] answers = {} expected_result = OrderedDict({"some_string": ("some_value", "string")}) @@ -98,7 +98,7 @@ def test_parse_args_in_yunohost_format_string_optional_with_input(): @pytest.mark.skip # this should work without ask def test_parse_args_in_yunohost_format_string_optional_with_input_without_ask(): - questions = [{"name": "some_string", "optional": True,}] + questions = [{"name": "some_string", "optional": True, }] answers = {} expected_result = OrderedDict({"some_string": ("some_value", "string")}) @@ -108,7 +108,7 @@ def test_parse_args_in_yunohost_format_string_optional_with_input_without_ask(): def test_parse_args_in_yunohost_format_string_no_input_default(): questions = [ - {"name": "some_string", "ask": "some question", "default": "some_value",} + {"name": "some_string", "ask": "some question", "default": "some_value", } ] answers = {} expected_result = OrderedDict({"some_string": ("some_value", "string")}) @@ -117,7 +117,7 @@ def test_parse_args_in_yunohost_format_string_no_input_default(): def test_parse_args_in_yunohost_format_string_input_test_ask(): ask_text = "some question" - questions = [{"name": "some_string", "ask": ask_text,}] + questions = [{"name": "some_string", "ask": ask_text, }] answers = {} with patch.object(msignals, "prompt", return_value="some_value") as prompt: @@ -128,7 +128,7 @@ def test_parse_args_in_yunohost_format_string_input_test_ask(): def test_parse_args_in_yunohost_format_string_input_test_ask_with_default(): ask_text = "some question" default_text = "some example" - questions = [{"name": "some_string", "ask": ask_text, "default": default_text,}] + questions = [{"name": "some_string", "ask": ask_text, "default": default_text, }] answers = {} with patch.object(msignals, "prompt", return_value="some_value") as prompt: @@ -140,7 +140,7 @@ def test_parse_args_in_yunohost_format_string_input_test_ask_with_default(): def test_parse_args_in_yunohost_format_string_input_test_ask_with_example(): ask_text = "some question" example_text = "some example" - questions = [{"name": "some_string", "ask": ask_text, "example": example_text,}] + questions = [{"name": "some_string", "ask": ask_text, "example": example_text, }] answers = {} with patch.object(msignals, "prompt", return_value="some_value") as prompt: @@ -153,7 +153,7 @@ def test_parse_args_in_yunohost_format_string_input_test_ask_with_example(): def test_parse_args_in_yunohost_format_string_input_test_ask_with_help(): ask_text = "some question" help_text = "some_help" - questions = [{"name": "some_string", "ask": ask_text, "help": help_text,}] + questions = [{"name": "some_string", "ask": ask_text, "help": help_text, }] answers = {} with patch.object(msignals, "prompt", return_value="some_value") as prompt: @@ -188,7 +188,7 @@ def test_parse_args_in_yunohost_format_string_with_choice_bad(): def test_parse_args_in_yunohost_format_string_with_choice_ask(): ask_text = "some question" choices = ["fr", "en", "es", "it", "ru"] - questions = [{"name": "some_string", "ask": ask_text, "choices": choices,}] + questions = [{"name": "some_string", "ask": ask_text, "choices": choices, }] answers = {} with patch.object(msignals, "prompt", return_value="ru") as prompt: @@ -214,14 +214,14 @@ def test_parse_args_in_yunohost_format_string_with_choice_default(): def test_parse_args_in_yunohost_format_password(): - questions = [{"name": "some_password", "type": "password",}] + questions = [{"name": "some_password", "type": "password", }] answers = {"some_password": "some_value"} expected_result = OrderedDict({"some_password": ("some_value", "password")}) assert _parse_args_in_yunohost_format(answers, questions) == expected_result def test_parse_args_in_yunohost_format_password_no_input(): - questions = [{"name": "some_password", "type": "password",}] + questions = [{"name": "some_password", "type": "password", }] answers = {} with pytest.raises(YunohostError): @@ -229,7 +229,7 @@ def test_parse_args_in_yunohost_format_password_no_input(): def test_parse_args_in_yunohost_format_password_input(): - questions = [{"name": "some_password", "type": "password", "ask": "some question",}] + questions = [{"name": "some_password", "type": "password", "ask": "some question", }] answers = {} expected_result = OrderedDict({"some_password": ("some_value", "password")}) @@ -239,7 +239,7 @@ def test_parse_args_in_yunohost_format_password_input(): @pytest.mark.skip # that shit should work x( def test_parse_args_in_yunohost_format_password_input_no_ask(): - questions = [{"name": "some_password", "type": "password",}] + questions = [{"name": "some_password", "type": "password", }] answers = {} expected_result = OrderedDict({"some_password": ("some_value", "password")}) @@ -248,7 +248,7 @@ def test_parse_args_in_yunohost_format_password_input_no_ask(): def test_parse_args_in_yunohost_format_password_no_input_optional(): - questions = [{"name": "some_password", "type": "password", "optional": True,}] + questions = [{"name": "some_password", "type": "password", "optional": True, }] answers = {} expected_result = OrderedDict({"some_password": ("", "password")}) assert _parse_args_in_yunohost_format(answers, questions) == expected_result @@ -272,7 +272,7 @@ def test_parse_args_in_yunohost_format_password_optional_with_input(): @pytest.mark.skip # this should work without ask def test_parse_args_in_yunohost_format_password_optional_with_input_without_ask(): - questions = [{"name": "some_password", "type": "password", "optional": True,}] + questions = [{"name": "some_password", "type": "password", "optional": True, }] answers = {} expected_result = OrderedDict({"some_password": ("some_value", "password")}) @@ -316,7 +316,7 @@ def test_parse_args_in_yunohost_format_password_no_input_example(): def test_parse_args_in_yunohost_format_password_input_test_ask(): ask_text = "some question" - questions = [{"name": "some_password", "type": "password", "ask": ask_text,}] + questions = [{"name": "some_password", "type": "password", "ask": ask_text, }] answers = {} with patch.object(msignals, "prompt", return_value="some_value") as prompt: @@ -365,14 +365,14 @@ def test_parse_args_in_yunohost_format_password_input_test_ask_with_help(): def test_parse_args_in_yunohost_format_path(): - questions = [{"name": "some_path", "type": "path",}] + questions = [{"name": "some_path", "type": "path", }] answers = {"some_path": "some_value"} expected_result = OrderedDict({"some_path": ("some_value", "path")}) assert _parse_args_in_yunohost_format(answers, questions) == expected_result def test_parse_args_in_yunohost_format_path_no_input(): - questions = [{"name": "some_path", "type": "path",}] + questions = [{"name": "some_path", "type": "path", }] answers = {} with pytest.raises(YunohostError): @@ -380,7 +380,7 @@ def test_parse_args_in_yunohost_format_path_no_input(): def test_parse_args_in_yunohost_format_path_input(): - questions = [{"name": "some_path", "type": "path", "ask": "some question",}] + questions = [{"name": "some_path", "type": "path", "ask": "some question", }] answers = {} expected_result = OrderedDict({"some_path": ("some_value", "path")}) @@ -390,7 +390,7 @@ def test_parse_args_in_yunohost_format_path_input(): @pytest.mark.skip # that shit should work x( def test_parse_args_in_yunohost_format_path_input_no_ask(): - questions = [{"name": "some_path", "type": "path",}] + questions = [{"name": "some_path", "type": "path", }] answers = {} expected_result = OrderedDict({"some_path": ("some_value", "path")}) @@ -399,7 +399,7 @@ def test_parse_args_in_yunohost_format_path_input_no_ask(): def test_parse_args_in_yunohost_format_path_no_input_optional(): - questions = [{"name": "some_path", "type": "path", "optional": True,}] + questions = [{"name": "some_path", "type": "path", "optional": True, }] answers = {} expected_result = OrderedDict({"some_path": ("", "path")}) assert _parse_args_in_yunohost_format(answers, questions) == expected_result @@ -407,7 +407,7 @@ def test_parse_args_in_yunohost_format_path_no_input_optional(): def test_parse_args_in_yunohost_format_path_optional_with_input(): questions = [ - {"name": "some_path", "ask": "some question", "type": "path", "optional": True,} + {"name": "some_path", "ask": "some question", "type": "path", "optional": True, } ] answers = {} expected_result = OrderedDict({"some_path": ("some_value", "path")}) @@ -418,7 +418,7 @@ def test_parse_args_in_yunohost_format_path_optional_with_input(): @pytest.mark.skip # this should work without ask def test_parse_args_in_yunohost_format_path_optional_with_input_without_ask(): - questions = [{"name": "some_path", "type": "path", "optional": True,}] + questions = [{"name": "some_path", "type": "path", "optional": True, }] answers = {} expected_result = OrderedDict({"some_path": ("some_value", "path")}) @@ -442,7 +442,7 @@ def test_parse_args_in_yunohost_format_path_no_input_default(): def test_parse_args_in_yunohost_format_path_input_test_ask(): ask_text = "some question" - questions = [{"name": "some_path", "type": "path", "ask": ask_text,}] + questions = [{"name": "some_path", "type": "path", "ask": ask_text, }] answers = {} with patch.object(msignals, "prompt", return_value="some_value") as prompt: @@ -454,7 +454,7 @@ def test_parse_args_in_yunohost_format_path_input_test_ask_with_default(): ask_text = "some question" default_text = "some example" questions = [ - {"name": "some_path", "type": "path", "ask": ask_text, "default": default_text,} + {"name": "some_path", "type": "path", "ask": ask_text, "default": default_text, } ] answers = {} @@ -468,7 +468,7 @@ def test_parse_args_in_yunohost_format_path_input_test_ask_with_example(): ask_text = "some question" example_text = "some example" questions = [ - {"name": "some_path", "type": "path", "ask": ask_text, "example": example_text,} + {"name": "some_path", "type": "path", "ask": ask_text, "example": example_text, } ] answers = {} @@ -483,7 +483,7 @@ def test_parse_args_in_yunohost_format_path_input_test_ask_with_help(): ask_text = "some question" help_text = "some_help" questions = [ - {"name": "some_path", "type": "path", "ask": ask_text, "help": help_text,} + {"name": "some_path", "type": "path", "ask": ask_text, "help": help_text, } ] answers = {} @@ -494,89 +494,89 @@ def test_parse_args_in_yunohost_format_path_input_test_ask_with_help(): def test_parse_args_in_yunohost_format_boolean(): - questions = [{"name": "some_boolean", "type": "boolean",}] + questions = [{"name": "some_boolean", "type": "boolean", }] answers = {"some_boolean": "y"} expected_result = OrderedDict({"some_boolean": (1, "boolean")}) assert _parse_args_in_yunohost_format(answers, questions) == expected_result def test_parse_args_in_yunohost_format_boolean_all_yes(): - questions = [{"name": "some_boolean", "type": "boolean",}] + questions = [{"name": "some_boolean", "type": "boolean", }] expected_result = OrderedDict({"some_boolean": (1, "boolean")}) assert ( - _parse_args_in_yunohost_format({"some_boolean": "y"}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": "y"}, questions) == + expected_result ) assert ( - _parse_args_in_yunohost_format({"some_boolean": "Y"}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": "Y"}, questions) == + expected_result ) assert ( - _parse_args_in_yunohost_format({"some_boolean": "yes"}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": "yes"}, questions) == + expected_result ) assert ( - _parse_args_in_yunohost_format({"some_boolean": "Yes"}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": "Yes"}, questions) == + expected_result ) assert ( - _parse_args_in_yunohost_format({"some_boolean": "YES"}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": "YES"}, questions) == + expected_result ) assert ( - _parse_args_in_yunohost_format({"some_boolean": "1"}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": "1"}, questions) == + expected_result ) assert ( - _parse_args_in_yunohost_format({"some_boolean": 1}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": 1}, questions) == + expected_result ) assert ( - _parse_args_in_yunohost_format({"some_boolean": True}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": True}, questions) == + expected_result ) def test_parse_args_in_yunohost_format_boolean_all_no(): - questions = [{"name": "some_boolean", "type": "boolean",}] + questions = [{"name": "some_boolean", "type": "boolean", }] expected_result = OrderedDict({"some_boolean": (0, "boolean")}) assert ( - _parse_args_in_yunohost_format({"some_boolean": "n"}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": "n"}, questions) == + expected_result ) assert ( - _parse_args_in_yunohost_format({"some_boolean": "N"}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": "N"}, questions) == + expected_result ) assert ( - _parse_args_in_yunohost_format({"some_boolean": "no"}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": "no"}, questions) == + expected_result ) assert ( - _parse_args_in_yunohost_format({"some_boolean": "No"}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": "No"}, questions) == + expected_result ) assert ( - _parse_args_in_yunohost_format({"some_boolean": "No"}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": "No"}, questions) == + expected_result ) assert ( - _parse_args_in_yunohost_format({"some_boolean": "0"}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": "0"}, questions) == + expected_result ) assert ( - _parse_args_in_yunohost_format({"some_boolean": 0}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": 0}, questions) == + expected_result ) assert ( - _parse_args_in_yunohost_format({"some_boolean": False}, questions) - == expected_result + _parse_args_in_yunohost_format({"some_boolean": False}, questions) == + expected_result ) # XXX apparently boolean are always False (0) by default, I'm not sure what to think about that def test_parse_args_in_yunohost_format_boolean_no_input(): - questions = [{"name": "some_boolean", "type": "boolean",}] + questions = [{"name": "some_boolean", "type": "boolean", }] answers = {} expected_result = OrderedDict({"some_boolean": (0, "boolean")}) @@ -584,7 +584,7 @@ def test_parse_args_in_yunohost_format_boolean_no_input(): def test_parse_args_in_yunohost_format_boolean_bad_input(): - questions = [{"name": "some_boolean", "type": "boolean",}] + questions = [{"name": "some_boolean", "type": "boolean", }] answers = {"some_boolean": "stuff"} with pytest.raises(YunohostError): @@ -592,7 +592,7 @@ def test_parse_args_in_yunohost_format_boolean_bad_input(): def test_parse_args_in_yunohost_format_boolean_input(): - questions = [{"name": "some_boolean", "type": "boolean", "ask": "some question",}] + questions = [{"name": "some_boolean", "type": "boolean", "ask": "some question", }] answers = {} expected_result = OrderedDict({"some_boolean": (1, "boolean")}) @@ -606,7 +606,7 @@ def test_parse_args_in_yunohost_format_boolean_input(): @pytest.mark.skip # we should work def test_parse_args_in_yunohost_format_boolean_input_no_ask(): - questions = [{"name": "some_boolean", "type": "boolean",}] + questions = [{"name": "some_boolean", "type": "boolean", }] answers = {} expected_result = OrderedDict({"some_boolean": ("some_value", "boolean")}) @@ -615,7 +615,7 @@ def test_parse_args_in_yunohost_format_boolean_input_no_ask(): def test_parse_args_in_yunohost_format_boolean_no_input_optional(): - questions = [{"name": "some_boolean", "type": "boolean", "optional": True,}] + questions = [{"name": "some_boolean", "type": "boolean", "optional": True, }] answers = {} expected_result = OrderedDict({"some_boolean": (0, "boolean")}) # default to false assert _parse_args_in_yunohost_format(answers, questions) == expected_result @@ -638,7 +638,7 @@ def test_parse_args_in_yunohost_format_boolean_optional_with_input(): def test_parse_args_in_yunohost_format_boolean_optional_with_input_without_ask(): - questions = [{"name": "some_boolean", "type": "boolean", "optional": True,}] + questions = [{"name": "some_boolean", "type": "boolean", "optional": True, }] answers = {} expected_result = OrderedDict({"some_boolean": (0, "boolean")}) @@ -677,7 +677,7 @@ def test_parse_args_in_yunohost_format_boolean_bad_default(): def test_parse_args_in_yunohost_format_boolean_input_test_ask(): ask_text = "some question" - questions = [{"name": "some_boolean", "type": "boolean", "ask": ask_text,}] + questions = [{"name": "some_boolean", "type": "boolean", "ask": ask_text, }] answers = {} with patch.object(msignals, "prompt", return_value=0) as prompt: @@ -704,7 +704,7 @@ def test_parse_args_in_yunohost_format_boolean_input_test_ask_with_default(): def test_parse_args_in_yunohost_format_domain_empty(): - questions = [{"name": "some_domain", "type": "domain",}] + questions = [{"name": "some_domain", "type": "domain", }] answers = {} with patch.object( @@ -719,7 +719,7 @@ def test_parse_args_in_yunohost_format_domain_empty(): def test_parse_args_in_yunohost_format_domain(): main_domain = "my_main_domain.com" domains = [main_domain] - questions = [{"name": "some_domain", "type": "domain",}] + questions = [{"name": "some_domain", "type": "domain", }] answers = {"some_domain": main_domain} expected_result = OrderedDict({"some_domain": (main_domain, "domain")}) @@ -735,7 +735,7 @@ def test_parse_args_in_yunohost_format_domain_two_domains(): other_domain = "some_other_domain.tld" domains = [main_domain, other_domain] - questions = [{"name": "some_domain", "type": "domain",}] + questions = [{"name": "some_domain", "type": "domain", }] answers = {"some_domain": other_domain} expected_result = OrderedDict({"some_domain": (other_domain, "domain")}) @@ -758,7 +758,7 @@ def test_parse_args_in_yunohost_format_domain_two_domains_wrong_answer(): other_domain = "some_other_domain.tld" domains = [main_domain, other_domain] - questions = [{"name": "some_domain", "type": "domain",}] + questions = [{"name": "some_domain", "type": "domain", }] answers = {"some_domain": "doesnt_exist.pouet"} with patch.object( @@ -774,7 +774,7 @@ def test_parse_args_in_yunohost_format_domain_two_domains_default_no_ask(): other_domain = "some_other_domain.tld" domains = [main_domain, other_domain] - questions = [{"name": "some_domain", "type": "domain",}] + questions = [{"name": "some_domain", "type": "domain", }] answers = {} expected_result = OrderedDict({"some_domain": (main_domain, "domain")}) @@ -831,7 +831,7 @@ def test_parse_args_in_yunohost_format_user_empty(): } } - questions = [{"name": "some_user", "type": "user",}] + questions = [{"name": "some_user", "type": "user", }] answers = {} with patch.object(user, "user_list", return_value={"users": users}): @@ -852,7 +852,7 @@ def test_parse_args_in_yunohost_format_user(): } } - questions = [{"name": "some_user", "type": "user",}] + questions = [{"name": "some_user", "type": "user", }] answers = {"some_user": username} expected_result = OrderedDict({"some_user": (username, "user")}) @@ -883,7 +883,7 @@ def test_parse_args_in_yunohost_format_user_two_users(): }, } - questions = [{"name": "some_user", "type": "user",}] + questions = [{"name": "some_user", "type": "user", }] answers = {"some_user": other_user} expected_result = OrderedDict({"some_user": (other_user, "user")}) @@ -919,7 +919,7 @@ def test_parse_args_in_yunohost_format_user_two_users_wrong_answer(): }, } - questions = [{"name": "some_user", "type": "user",}] + questions = [{"name": "some_user", "type": "user", }] answers = {"some_user": "doesnt_exist.pouet"} with patch.object(user, "user_list", return_value={"users": users}): @@ -1002,7 +1002,7 @@ def test_parse_args_in_yunohost_format_app_empty(): } ] - questions = [{"name": "some_app", "type": "app",}] + questions = [{"name": "some_app", "type": "app", }] answers = {} with patch.object(app, "app_list", return_value={"apps": apps}): @@ -1012,7 +1012,7 @@ def test_parse_args_in_yunohost_format_app_empty(): def test_parse_args_in_yunohost_format_app_no_apps(): apps = [] - questions = [{"name": "some_app", "type": "app",}] + questions = [{"name": "some_app", "type": "app", }] answers = {} with patch.object(app, "app_list", return_value={"apps": apps}): @@ -1041,7 +1041,7 @@ def test_parse_args_in_yunohost_format_app(): } ] - questions = [{"name": "some_app", "type": "app",}] + questions = [{"name": "some_app", "type": "app", }] answers = {"some_app": app_name} expected_result = OrderedDict({"some_app": (app_name, "app")}) @@ -1072,7 +1072,7 @@ def test_parse_args_in_yunohost_format_app_two_apps(): }, ] - questions = [{"name": "some_app", "type": "app",}] + questions = [{"name": "some_app", "type": "app", }] answers = {"some_app": other_app} expected_result = OrderedDict({"some_app": (other_app, "app")}) @@ -1112,7 +1112,7 @@ def test_parse_args_in_yunohost_format_app_two_apps_wrong_answer(): }, ] - questions = [{"name": "some_app", "type": "app",}] + questions = [{"name": "some_app", "type": "app", }] answers = {"some_app": "doesnt_exist"} with pytest.raises(YunohostError): diff --git a/src/yunohost/tests/test_appscatalog.py b/src/yunohost/tests/test_appscatalog.py index d9f0c14e5..a173501d3 100644 --- a/src/yunohost/tests/test_appscatalog.py +++ b/src/yunohost/tests/test_appscatalog.py @@ -37,10 +37,12 @@ DUMMY_APP_CATALOG = """{ } """ + class AnyStringWith(str): def __eq__(self, other): return self in other + def setup_function(function): # Clear apps catalog cache @@ -165,6 +167,7 @@ def test_apps_catalog_update_404(mocker): _update_apps_catalog() m18n.n.assert_any_call("apps_catalog_failed_to_download") + def test_apps_catalog_update_timeout(mocker): # Initialize ... @@ -237,7 +240,6 @@ def test_apps_catalog_load_with_empty_cache(mocker): m18n.n.assert_any_call("apps_catalog_obsolete_cache") m18n.n.assert_any_call("apps_catalog_update_success") - # Cache shouldn't be empty anymore empty assert glob.glob(APPS_CATALOG_CACHE + "/*") diff --git a/src/yunohost/tests/test_backuprestore.py b/src/yunohost/tests/test_backuprestore.py index 35a3e23f1..d07ebff01 100644 --- a/src/yunohost/tests/test_backuprestore.py +++ b/src/yunohost/tests/test_backuprestore.py @@ -16,6 +16,7 @@ from yunohost.hook import CUSTOM_HOOK_FOLDER # Get main domain maindomain = "" + def setup_function(function): global maindomain @@ -32,7 +33,7 @@ def setup_function(function): assert len(backup_list()["archives"]) == 0 - markers = [m.name for m in function.__dict__.get("pytestmark",[])] + markers = [m.name for m in function.__dict__.get("pytestmark", [])] if "with_wordpress_archive_from_2p4" in markers: add_archive_wordpress_from_2p4() @@ -75,7 +76,7 @@ def teardown_function(function): delete_all_backups() uninstall_test_apps_if_needed() - markers = [m.name for m in function.__dict__.get("pytestmark",[])] + markers = [m.name for m in function.__dict__.get("pytestmark", [])] if "clean_opt_dir" in markers: shutil.rmtree("/opt/test_backup_output_directory") @@ -90,6 +91,7 @@ def check_LDAP_db_integrity_call(): yield check_LDAP_db_integrity() + @pytest.fixture(autouse=True) def check_permission_for_apps_call(): check_permission_for_apps() @@ -100,6 +102,7 @@ def check_permission_for_apps_call(): # Helpers # # + def app_is_installed(app): if app == "permissions_app": @@ -184,22 +187,22 @@ def add_archive_wordpress_from_2p4(): os.system("mkdir -p /home/yunohost.backup/archives") - os.system("cp " + os.path.join(get_test_apps_dir(), "backup_wordpress_from_2p4/backup.info.json") + \ - " /home/yunohost.backup/archives/backup_wordpress_from_2p4.info.json") + os.system("cp " + os.path.join(get_test_apps_dir(), "backup_wordpress_from_2p4/backup.info.json") + + " /home/yunohost.backup/archives/backup_wordpress_from_2p4.info.json") - os.system("cp " + os.path.join(get_test_apps_dir(), "backup_wordpress_from_2p4/backup.tar.gz") + \ - " /home/yunohost.backup/archives/backup_wordpress_from_2p4.tar.gz") + os.system("cp " + os.path.join(get_test_apps_dir(), "backup_wordpress_from_2p4/backup.tar.gz") + + " /home/yunohost.backup/archives/backup_wordpress_from_2p4.tar.gz") def add_archive_system_from_2p4(): os.system("mkdir -p /home/yunohost.backup/archives") - os.system("cp " + os.path.join(get_test_apps_dir(), "backup_system_from_2p4/backup.info.json") + \ - " /home/yunohost.backup/archives/backup_system_from_2p4.info.json") + os.system("cp " + os.path.join(get_test_apps_dir(), "backup_system_from_2p4/backup.info.json") + + " /home/yunohost.backup/archives/backup_system_from_2p4.info.json") - os.system("cp " + os.path.join(get_test_apps_dir(), "backup_system_from_2p4/backup.tar.gz") + \ - " /home/yunohost.backup/archives/backup_system_from_2p4.tar.gz") + os.system("cp " + os.path.join(get_test_apps_dir(), "backup_system_from_2p4/backup.tar.gz") + + " /home/yunohost.backup/archives/backup_system_from_2p4.tar.gz") # # System backup # @@ -309,7 +312,7 @@ def test_backup_script_failure_handling(monkeypatch, mocker): # with the expected error message key monkeypatch.setattr("yunohost.backup.hook_exec", custom_hook_exec) - with message(mocker, 'backup_app_failed', app='backup_recommended_app'): + with message(mocker, 'backup_app_failed', app='backup_recommended_app'): with raiseYunohostError(mocker, 'backup_nothings_done'): backup_create(system=None, apps=["backup_recommended_app"]) @@ -499,6 +502,7 @@ def test_backup_and_restore_with_ynh_restore(mocker): _test_backup_and_restore_app(mocker, "backup_recommended_app") + @pytest.mark.with_permission_app_installed def test_backup_and_restore_permission_app(mocker): @@ -548,7 +552,7 @@ def _test_backup_and_restore_app(mocker, app): # Uninstall the app app_remove(app) assert not app_is_installed(app) - assert app+".main" not in user_permission_list()['permissions'] + assert app + ".main" not in user_permission_list()['permissions'] # Restore the app with message(mocker, "restore_complete"): @@ -559,7 +563,7 @@ def _test_backup_and_restore_app(mocker, app): # Check permission per_list = user_permission_list()['permissions'] - assert app+".main" in per_list + assert app + ".main" in per_list # # Some edge cases # @@ -577,6 +581,7 @@ def test_restore_archive_with_no_json(mocker): with raiseYunohostError(mocker, 'backup_archive_cant_retrieve_info_json'): backup_restore(name="badbackup", force=True) + @pytest.mark.with_wordpress_archive_from_2p4 def test_restore_archive_with_bad_archive(mocker): @@ -605,9 +610,9 @@ def test_restore_archive_with_custom_hook(mocker): # Restore system with custom hook with message(mocker, "restore_complete"): backup_restore(name=backup_list()["archives"][0], - system=[], - apps=None, - force=True) + system=[], + apps=None, + force=True) os.system("rm %s/99-yolo" % custom_restore_hook_folder) diff --git a/src/yunohost/tests/test_changeurl.py b/src/yunohost/tests/test_changeurl.py index b1bedc7eb..ecd926a2e 100644 --- a/src/yunohost/tests/test_changeurl.py +++ b/src/yunohost/tests/test_changeurl.py @@ -13,6 +13,7 @@ from yunohost.utils.error import YunohostError # Get main domain maindomain = "" + def setup_function(function): global maindomain maindomain = _get_maindomain() diff --git a/src/yunohost/tests/test_permission.py b/src/yunohost/tests/test_permission.py index 4dfc1ce6b..abb289fad 100644 --- a/src/yunohost/tests/test_permission.py +++ b/src/yunohost/tests/test_permission.py @@ -1,3 +1,4 @@ +import socket import requests import pytest import os @@ -6,9 +7,9 @@ from conftest import message, raiseYunohostError, get_test_apps_dir from yunohost.app import app_install, app_remove, app_change_url, app_map, _installed_apps from yunohost.user import user_list, user_create, user_delete, \ - user_group_list, user_group_delete + user_group_list, user_group_delete from yunohost.permission import user_permission_update, user_permission_list, user_permission_reset, \ - permission_create, permission_delete, permission_url + permission_create, permission_delete, permission_url from yunohost.domain import _get_maindomain # Get main domain @@ -17,10 +18,10 @@ dummy_password = "test123Ynh" # Dirty patch of DNS resolution. Force the DNS to 127.0.0.1 address even if dnsmasq have the public address. # Mainly used for 'can_access_webpage' function -import socket prv_getaddrinfo = socket.getaddrinfo + def clean_user_groups_permission(): for u in user_list()['users']: user_delete(u) @@ -44,6 +45,7 @@ def setup_function(function): # Dirty patch of DNS resolution. Force the DNS to 127.0.0.1 address even if dnsmasq have the public address. # Mainly used for 'can_access_webpage' function dns_cache = {(maindomain, 443, 0, 1): [(2, 1, 6, '', ('127.0.0.1', 443))]} + def new_getaddrinfo(*args): try: return dns_cache[args] @@ -55,7 +57,7 @@ def setup_function(function): user_create("alice", "Alice", "White", "alice@" + maindomain, dummy_password) user_create("bob", "Bob", "Snow", "bob@" + maindomain, dummy_password) - permission_create("wiki.main", url="/", allowed=["all_users"] , sync_perm=False) + permission_create("wiki.main", url="/", allowed=["all_users"], sync_perm=False) permission_create("blog.main", allowed=["all_users"], sync_perm=False) user_permission_update("blog.main", remove="all_users", add="alice") @@ -397,6 +399,7 @@ def test_permission_redefine_url(): res = user_permission_list(full=True)['permissions'] assert res["blog.main"]["url"] == "/pwet" + def test_permission_remove_url(): permission_url("blog.main", url=None) @@ -489,9 +492,9 @@ def test_permission_app_propagation_on_ssowat(): # alice gotta be allowed on the main permission to access the admin tho user_permission_update("permissions_app.main", remove="bob", add="all_users") - assert not can_access_webpage(app_webroot+"/admin", logged_as=None) - assert can_access_webpage(app_webroot+"/admin", logged_as="alice") - assert not can_access_webpage(app_webroot+"/admin", logged_as="bob") + assert not can_access_webpage(app_webroot + "/admin", logged_as=None) + assert can_access_webpage(app_webroot + "/admin", logged_as="alice") + assert not can_access_webpage(app_webroot + "/admin", logged_as="bob") def test_permission_legacy_app_propagation_on_ssowat(): diff --git a/src/yunohost/tests/test_regenconf.py b/src/yunohost/tests/test_regenconf.py index 426f62da4..4e1ae679b 100644 --- a/src/yunohost/tests/test_regenconf.py +++ b/src/yunohost/tests/test_regenconf.py @@ -9,6 +9,7 @@ TEST_DOMAIN_NGINX_CONFIG = "/etc/nginx/conf.d/%s.conf" % TEST_DOMAIN TEST_DOMAIN_DNSMASQ_CONFIG = "/etc/dnsmasq.d/%s" % TEST_DOMAIN SSHD_CONFIG = "/etc/ssh/sshd_config" + def setup_function(function): _force_clear_hashes([TEST_DOMAIN_NGINX_CONFIG]) @@ -169,7 +170,7 @@ def test_stale_hashes_if_file_manually_deleted(): # ... Anyway, the proper way to write these tests would be to use a dummy # regen-conf hook just for tests but meh I'm lazy # -#def test_stale_hashes_if_file_manually_modified(): +# def test_stale_hashes_if_file_manually_modified(): # """ # Same as other test, but manually delete the file in between and check # behavior diff --git a/src/yunohost/tests/test_service.py b/src/yunohost/tests/test_service.py index f91a601c4..d0a3d4fc2 100644 --- a/src/yunohost/tests/test_service.py +++ b/src/yunohost/tests/test_service.py @@ -64,11 +64,13 @@ def test_service_add(): service_add("dummyservice", description="A dummy service to run tests") assert "dummyservice" in service_status().keys() + def test_service_add_real_service(): service_add("networking") assert "networking" in service_status().keys() + def test_service_remove(): service_add("dummyservice", description="A dummy service to run tests") diff --git a/src/yunohost/tests/test_settings.py b/src/yunohost/tests/test_settings.py index c7105fd1b..0a717192c 100644 --- a/src/yunohost/tests/test_settings.py +++ b/src/yunohost/tests/test_settings.py @@ -13,6 +13,7 @@ DEFAULTS["example.int"] = {"type": "int", "default": 42} DEFAULTS["example.string"] = {"type": "string", "default": "yolo swag"} DEFAULTS["example.enum"] = {"type": "enum", "default": "a", "choices": ["a", "b", "c"]} + def setup_function(function): os.system("mv /etc/yunohost/settings.json /etc/yunohost/settings.json.saved") @@ -69,6 +70,7 @@ def test_settings_set(): settings_set("example.bool", "on") assert settings_get("example.bool") is True + def test_settings_set_int(): settings_set("example.int", 21) assert settings_get("example.int") == 21 diff --git a/src/yunohost/tests/test_user-group.py b/src/yunohost/tests/test_user-group.py index f1eae9c4e..21ece3ed5 100644 --- a/src/yunohost/tests/test_user-group.py +++ b/src/yunohost/tests/test_user-group.py @@ -3,7 +3,7 @@ import pytest from conftest import message, raiseYunohostError from yunohost.user import user_list, user_info, user_create, user_delete, user_update, \ - user_group_list, user_group_create, user_group_delete, user_group_update + user_group_list, user_group_create, user_group_delete, user_group_update from yunohost.domain import _get_maindomain from yunohost.tests.test_permission import check_LDAP_db_integrity @@ -25,7 +25,7 @@ def setup_function(function): global maindomain maindomain = _get_maindomain() - + user_create("alice", "Alice", "White", "alice@" + maindomain, "test123Ynh") user_create("bob", "Bob", "Snow", "bob@" + maindomain, "test123Ynh") user_create("jack", "Jack", "Black", "jack@" + maindomain, "test123Ynh") diff --git a/src/yunohost/utils/error.py b/src/yunohost/utils/error.py index 75cf35093..f2486473b 100644 --- a/src/yunohost/utils/error.py +++ b/src/yunohost/utils/error.py @@ -33,8 +33,8 @@ class YunohostError(MoulinetteError): """ def __init__(self, key, raw_msg=False, *args, **kwargs): - self.key = key # Saving the key is useful for unit testing - self.kwargs = kwargs # Saving the key is useful for unit testing + self.key = key # Saving the key is useful for unit testing + self.kwargs = kwargs # Saving the key is useful for unit testing if raw_msg: msg = key else: diff --git a/src/yunohost/utils/ldap.py b/src/yunohost/utils/ldap.py index b1f49e287..f16472e28 100644 --- a/src/yunohost/utils/ldap.py +++ b/src/yunohost/utils/ldap.py @@ -29,19 +29,20 @@ from yunohost.utils.error import YunohostError # to avoid re-authenticating in case we call _get_ldap_authenticator multiple times _ldap_interface = None + def _get_ldap_interface(): global _ldap_interface if _ldap_interface is None: - conf = { "vendor": "ldap", - "name": "as-root", - "parameters": { 'uri': 'ldapi://%2Fvar%2Frun%2Fslapd%2Fldapi', - 'base_dn': 'dc=yunohost,dc=org', - 'user_rdn': 'gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth' }, - "extra": {} - } + conf = {"vendor": "ldap", + "name": "as-root", + "parameters": {'uri': 'ldapi://%2Fvar%2Frun%2Fslapd%2Fldapi', + 'base_dn': 'dc=yunohost,dc=org', + 'user_rdn': 'gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth'}, + "extra": {} + } try: _ldap_interface = ldap.Authenticator(**conf) @@ -82,4 +83,5 @@ def _destroy_ldap_interface(): if _ldap_interface is not None: del _ldap_interface + atexit.register(_destroy_ldap_interface) diff --git a/src/yunohost/utils/network.py b/src/yunohost/utils/network.py index 4bb0b288a..909e14784 100644 --- a/src/yunohost/utils/network.py +++ b/src/yunohost/utils/network.py @@ -58,6 +58,7 @@ def get_public_ip_from_remote_server(protocol=4): # If we are indeed connected in ipv4 or ipv6, we should find a default route routes = check_output("ip -%s route show table all" % protocol).split("\n") + def is_default_route(r): # Typically the default route starts with "default" # But of course IPv6 is more complex ... e.g. on internet cube there's diff --git a/src/yunohost/utils/yunopaste.py b/src/yunohost/utils/yunopaste.py index dc8b6fb8d..9a406a580 100644 --- a/src/yunohost/utils/yunopaste.py +++ b/src/yunohost/utils/yunopaste.py @@ -10,6 +10,7 @@ from yunohost.utils.error import YunohostError logger = logging.getLogger('yunohost.utils.yunopaste') + def yunopaste(data): paste_server = "https://paste.yunohost.org" @@ -44,7 +45,6 @@ def anonymize(data): data = data.replace(domain.replace(".", "%2e"), redact.replace(".", "%2e")) return data - # First, let's replace every occurence of the main domain by "domain.tld" # This should cover a good fraction of the info leaked main_domain = _get_maindomain() diff --git a/tests/remove_stale_translated_strings.py b/tests/remove_stale_translated_strings.py index 4e39f131e..cfecea348 100644 --- a/tests/remove_stale_translated_strings.py +++ b/tests/remove_stale_translated_strings.py @@ -13,6 +13,6 @@ for locale_file in locale_files: print(locale_file) this_locale = json.loads(open(locale_folder + locale_file).read(), object_pairs_hook=OrderedDict) - this_locale_fixed = {k:v for k, v in this_locale.items() if k in reference} + this_locale_fixed = {k: v for k, v in this_locale.items() if k in reference} json.dump(this_locale_fixed, open(locale_folder + locale_file, "w"), indent=4, ensure_ascii=False) diff --git a/tests/test_actionmap.py b/tests/test_actionmap.py index 08b868839..bf6755979 100644 --- a/tests/test_actionmap.py +++ b/tests/test_actionmap.py @@ -1,4 +1,5 @@ import yaml + def test_yaml_syntax(): yaml.load(open("data/actionsmap/yunohost.yml")) From 49f63942337a5953b6b6345d553b697820045225 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 3 Sep 2020 17:31:52 +0200 Subject: [PATCH 3/4] autopep8 --in-place -a -a -a --ignore E402,E501,E722 -r src/yunohost/{__init__.py,certificate.py,diagnosis.py,domain.py,dyndns.py,firewall.py,hook.py,log.py,regenconf.py,service.py,settings.py,ssh.py,tools.py} --- src/yunohost/__init__.py | 2 +- src/yunohost/diagnosis.py | 9 +++++---- src/yunohost/domain.py | 16 ++++++++-------- src/yunohost/hook.py | 20 ++++++++++---------- src/yunohost/log.py | 2 +- src/yunohost/regenconf.py | 2 +- src/yunohost/service.py | 1 - src/yunohost/settings.py | 10 +++++++--- src/yunohost/tools.py | 13 +++++++------ 9 files changed, 40 insertions(+), 35 deletions(-) diff --git a/src/yunohost/__init__.py b/src/yunohost/__init__.py index ce505ffd9..d909ad9e2 100644 --- a/src/yunohost/__init__.py +++ b/src/yunohost/__init__.py @@ -91,7 +91,7 @@ def init_logging(interface="cli", logfile = os.path.join(logdir, "yunohost-%s.log" % interface) if not os.path.isdir(logdir): - os.makedirs(logdir, 0750) + os.makedirs(logdir, 0o750) # ####################################################################### # # Logging configuration for CLI (or any other interface than api...) # diff --git a/src/yunohost/diagnosis.py b/src/yunohost/diagnosis.py index 23884a53d..e4dd84f6d 100644 --- a/src/yunohost/diagnosis.py +++ b/src/yunohost/diagnosis.py @@ -176,7 +176,7 @@ def diagnosis_run(categories=[], force=False, except_if_never_ran_yet=False, ema code, report = hook_exec(path, args={"force": force}, env=None) except Exception: import traceback - logger.error(m18n.n("diagnosis_failed_for_category", category=category, error='\n'+traceback.format_exc())) + logger.error(m18n.n("diagnosis_failed_for_category", category=category, error='\n' + traceback.format_exc())) else: diagnosed_categories.append(category) if report != {}: @@ -403,11 +403,11 @@ class Diagnoser(): Diagnoser.i18n(new_report) add_ignore_flag_to_issues(new_report) - errors = [item for item in new_report["items"] if item["status"] == "ERROR" and not item["ignored"]] + errors = [item for item in new_report["items"] if item["status"] == "ERROR" and not item["ignored"]] warnings = [item for item in new_report["items"] if item["status"] == "WARNING" and not item["ignored"]] errors_ignored = [item for item in new_report["items"] if item["status"] == "ERROR" and item["ignored"]] warning_ignored = [item for item in new_report["items"] if item["status"] == "WARNING" and item["ignored"]] - ignored_msg = " " + m18n.n("diagnosis_ignored_issues", nb_ignored=len(errors_ignored+warning_ignored)) if errors_ignored or warning_ignored else "" + ignored_msg = " " + m18n.n("diagnosis_ignored_issues", nb_ignored=len(errors_ignored + warning_ignored)) if errors_ignored or warning_ignored else "" if errors and warnings: logger.error(m18n.n("diagnosis_found_errors_and_warnings", errors=len(errors), warnings=len(warnings), category=new_report["description"]) + ignored_msg) @@ -477,6 +477,7 @@ class Diagnoser(): meta_data.update(item.get("data", {})) html_tags = re.compile(r'<[^>]+>') + def m18n_(info): if not isinstance(info, tuple) and not isinstance(info, list): info = (info, {}) @@ -485,7 +486,7 @@ class Diagnoser(): # In cli, we remove the html tags if msettings.get("interface") != "api" or force_remove_html_tags: s = s.replace("", "'").replace("", "'") - s = html_tags.sub('', s.replace("
","\n")) + s = html_tags.sub('', s.replace("
", "\n")) else: s = s.replace("", "").replace("", "") # Make it so that links open in new tabs diff --git a/src/yunohost/domain.py b/src/yunohost/domain.py index e1d2b1649..160c8f622 100644 --- a/src/yunohost/domain.py +++ b/src/yunohost/domain.py @@ -89,7 +89,7 @@ def domain_add(operation_logger, domain, dyndns=False): raise YunohostError('domain_exists') operation_logger.start() - + # Lower domain to avoid some edge cases issues # See: https://forum.yunohost.org/t/invalid-domain-causes-diagnosis-web-to-fail-fr-on-demand/11765 domain = domain.lower() @@ -614,17 +614,17 @@ def _get_DKIM(domain): if is_legacy_format: dkim = re.match(( r'^(?P[a-z_\-\.]+)[\s]+([0-9]+[\s]+)?IN[\s]+TXT[\s]+' - '[^"]*"v=(?P[^";]+);' - '[\s"]*k=(?P[^";]+);' - '[\s"]*p=(?P

[^";]+)'), dkim_content, re.M | re.S + '[^"]*"v=(?P[^";]+);' + r'[\s"]*k=(?P[^";]+);' + '[\s"]*p=(?P

[^";]+)'), dkim_content, re.M | re.S ) else: dkim = re.match(( r'^(?P[a-z_\-\.]+)[\s]+([0-9]+[\s]+)?IN[\s]+TXT[\s]+' - '[^"]*"v=(?P[^";]+);' - '[\s"]*h=(?P[^";]+);' - '[\s"]*k=(?P[^";]+);' - '[\s"]*p=(?P

[^";]+)'), dkim_content, re.M | re.S + '[^"]*"v=(?P[^";]+);' + r'[\s"]*h=(?P[^";]+);' + r'[\s"]*k=(?P[^";]+);' + '[\s"]*p=(?P

[^";]+)'), dkim_content, re.M | re.S ) if not dkim: diff --git a/src/yunohost/hook.py b/src/yunohost/hook.py index b57300f54..f939f2c99 100644 --- a/src/yunohost/hook.py +++ b/src/yunohost/hook.py @@ -270,9 +270,9 @@ def hook_callback(action, hooks=[], args=None, no_trace=False, chdir=None, # Validate callbacks if not callable(pre_callback): - pre_callback = lambda name, priority, path, args: args + def pre_callback(name, priority, path, args): return args if not callable(post_callback): - post_callback = lambda name, priority, path, succeed: None + def post_callback(name, priority, path, succeed): return None # Iterate over hooks and execute them for priority in sorted(hooks_dict): @@ -283,7 +283,7 @@ def hook_callback(action, hooks=[], args=None, no_trace=False, chdir=None, hook_args = pre_callback(name=name, priority=priority, path=path, args=args) hook_return = hook_exec(path, args=hook_args, chdir=chdir, env=env, - no_trace=no_trace, raise_on_error=True)[1] + no_trace=no_trace, raise_on_error=True)[1] except YunohostError as e: state = 'failed' hook_return = {} @@ -293,9 +293,9 @@ def hook_callback(action, hooks=[], args=None, no_trace=False, chdir=None, else: post_callback(name=name, priority=priority, path=path, succeed=True) - if not name in result: + if name not in result: result[name] = {} - result[name][path] = {'state' : state, 'stdreturn' : hook_return } + result[name][path] = {'state': state, 'stdreturn': hook_return} return result @@ -446,17 +446,17 @@ def _hook_exec_python(path, args, env, loggers): dir_ = os.path.dirname(path) name = os.path.splitext(os.path.basename(path))[0] - if not dir_ in sys.path: + if dir_ not in sys.path: sys.path = [dir_] + sys.path module = import_module(name) ret = module.main(args, env, loggers) # # Assert that the return is a (int, dict) tuple assert isinstance(ret, tuple) \ - and len(ret) == 2 \ - and isinstance(ret[0],int) \ - and isinstance(ret[1],dict), \ - "Module %s did not return a (int, dict) tuple !" % module + and len(ret) == 2 \ + and isinstance(ret[0], int) \ + and isinstance(ret[1], dict), \ + "Module %s did not return a (int, dict) tuple !" % module return ret diff --git a/src/yunohost/log.py b/src/yunohost/log.py index 892105c6b..88da1ebf0 100644 --- a/src/yunohost/log.py +++ b/src/yunohost/log.py @@ -270,7 +270,7 @@ def log_display(path, number=None, share=False, filter_irrelevant=False, with_su if os.path.exists(log_path): from yunohost.service import _tail if number and filters: - logs = _tail(log_path, int(number*4)) + logs = _tail(log_path, int(number * 4)) elif number: logs = _tail(log_path, int(number)) else: diff --git a/src/yunohost/regenconf.py b/src/yunohost/regenconf.py index 7f4f73247..6b369fc8c 100644 --- a/src/yunohost/regenconf.py +++ b/src/yunohost/regenconf.py @@ -47,7 +47,7 @@ logger = log.getActionLogger('yunohost.regenconf') # FIXME : check for all reference of 'service' close to operation_logger stuff @is_unit_operation([('names', 'configuration')]) def regen_conf(operation_logger, names=[], with_diff=False, force=False, dry_run=False, - list_pending=False): + list_pending=False): """ Regenerate the configuration file(s) diff --git a/src/yunohost/service.py b/src/yunohost/service.py index 522395718..084df471d 100644 --- a/src/yunohost/service.py +++ b/src/yunohost/service.py @@ -654,7 +654,6 @@ def _tail(file, n): avg_line_length = 74 to_read = n - try: if file.endswith(".gz"): import gzip diff --git a/src/yunohost/settings.py b/src/yunohost/settings.py index 9b8589d35..0f8860529 100644 --- a/src/yunohost/settings.py +++ b/src/yunohost/settings.py @@ -15,6 +15,7 @@ logger = getActionLogger('yunohost.settings') SETTINGS_PATH = "/etc/yunohost/settings.json" SETTINGS_PATH_OTHER_LOCATION = "/etc/yunohost/settings-%s.json" + def is_boolean(value): """ Ensure a string value is intended as a boolean @@ -60,11 +61,11 @@ DEFAULTS = OrderedDict([ ("service.ssh.allow_deprecated_dsa_hostkey", {"type": "bool", "default": False}), ("security.ssh.compatibility", {"type": "enum", "default": "modern", - "choices": ["intermediate", "modern"]}), + "choices": ["intermediate", "modern"]}), ("security.nginx.compatibility", {"type": "enum", "default": "intermediate", - "choices": ["intermediate", "modern"]}), + "choices": ["intermediate", "modern"]}), ("security.postfix.compatibility", {"type": "enum", "default": "intermediate", - "choices": ["intermediate", "modern"]}), + "choices": ["intermediate", "modern"]}), ("pop3.enabled", {"type": "bool", "default": False}), ("smtp.allow_ipv6", {"type": "bool", "default": True}), @@ -321,17 +322,20 @@ def reconfigure_nginx(setting_name, old_value, new_value): if old_value != new_value: service_regen_conf(names=['nginx']) + @post_change_hook("security.ssh.compatibility") def reconfigure_ssh(setting_name, old_value, new_value): if old_value != new_value: service_regen_conf(names=['ssh']) + @post_change_hook("smtp.allow_ipv6") @post_change_hook("security.postfix.compatibility") def reconfigure_postfix(setting_name, old_value, new_value): if old_value != new_value: service_regen_conf(names=['postfix']) + @post_change_hook("pop3.enabled") def reconfigure_dovecot(setting_name, old_value, new_value): dovecot_package = 'dovecot-pop3d' diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index 2e90b38ee..fcc2810d6 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -51,9 +51,11 @@ MIGRATIONS_STATE_PATH = "/etc/yunohost/migrations.yaml" logger = getActionLogger('yunohost.tools') + def tools_versions(): return ynh_packages_version() + def tools_ldapinit(): """ YunoHost LDAP initialization @@ -146,7 +148,7 @@ def tools_adminpw(new_password, check_strength=True): ldap = _get_ldap_interface() try: - ldap.update("cn=admin", {"userPassword": [ new_hash ], }) + ldap.update("cn=admin", {"userPassword": [new_hash], }) except: logger.exception('unable to change admin password') raise YunohostError('admin_password_change_failed') @@ -599,7 +601,6 @@ def tools_upgrade(operation_logger, apps=None, system=False, allow_yunohost_upgr logger.debug("Running apt command :\n{}".format(dist_upgrade)) - def is_relevant(l): irrelevants = [ "service sudo-ldap already provided", @@ -936,7 +937,7 @@ def _migrate_legacy_migration_json(): # Extract the list of migration ids from . import data_migrations migrations_path = data_migrations.__path__[0] - migration_files = filter(lambda x: re.match("^\d+_[a-zA-Z0-9_]+\.py$", x), os.listdir(migrations_path)) + migration_files = filter(lambda x: re.match(r"^\d+_[a-zA-Z0-9_]+\.py$", x), os.listdir(migrations_path)) # (here we remove the .py extension and make sure the ids are sorted) migration_ids = sorted([f.rsplit(".", 1)[0] for f in migration_files]) @@ -985,7 +986,7 @@ def _get_migrations_list(): # (in particular, pending migrations / not already ran are not listed states = tools_migrations_state()["migrations"] - for migration_file in filter(lambda x: re.match("^\d+_[a-zA-Z0-9_]+\.py$", x), os.listdir(migrations_path)): + for migration_file in filter(lambda x: re.match(r"^\d+_[a-zA-Z0-9_]+\.py$", x), os.listdir(migrations_path)): m = _load_migration(migration_file) m.state = states.get(m.id, "pending") migrations.append(m) @@ -1004,7 +1005,7 @@ def _get_migration_by_name(migration_name): raise AssertionError("Unable to find migration with name %s" % migration_name) migrations_path = data_migrations.__path__[0] - migrations_found = filter(lambda x: re.match("^\d+_%s\.py$" % migration_name, x), os.listdir(migrations_path)) + migrations_found = filter(lambda x: re.match(r"^\d+_%s\.py$" % migration_name, x), os.listdir(migrations_path)) assert len(migrations_found) == 1, "Unable to find migration with name %s" % migration_name @@ -1048,7 +1049,7 @@ class Migration(object): # Those are to be implemented by daughter classes mode = "auto" - dependencies = [] # List of migration ids required before running this migration + dependencies = [] # List of migration ids required before running this migration @property def disclaimer(self): From a1807d1f88868f46a22dce627001ef8f9fdc6cfb Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 3 Sep 2020 17:41:33 +0200 Subject: [PATCH 4/4] Update flake8 lint test policy --- tox.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tox.ini b/tox.ini index 0c0b01a5e..6c1139d52 100644 --- a/tox.ini +++ b/tox.ini @@ -7,6 +7,6 @@ deps = py{27,37}-{lint,invalidcode}: flake8 py37-black: black commands = - py{27,37}-lint: flake8 src doc data tests - py{27,37}-invalidcode: flake8 src data --exclude src/yunohost/tests --select F --ignore F401,F841 - py37-black: black --check --diff src doc data tests \ No newline at end of file + py{27,37}-lint: flake8 src doc data tests --ignore E402,E501 --exclude src/yunohost/vendor + py{27,37}-invalidcode: flake8 src data --exclude src/yunohost/tests,src/yunohost/vendor --select F + py37-black: black --check --diff src doc data tests